#if !defined(_MACHINE_ARMREG_H_) && \
!defined(_MACHINE_CPU_H_) && \
!defined(_MACHINE_HYPERVISOR_H_)
#error Do not include this file directly
#endif
#ifndef _MACHINE__ARMREG_H_
#define _MACHINE__ARMREG_H_
#define __MRS_REG_ALT_NAME(op0, op1, crn, crm, op2) \
S##op0##_##op1##_C##crn##_C##crm##_##op2
#define _MRS_REG_ALT_NAME(op0, op1, crn, crm, op2) \
__MRS_REG_ALT_NAME(op0, op1, crn, crm, op2)
#define MRS_REG_ALT_NAME(reg) \
_MRS_REG_ALT_NAME(reg##_op0, reg##_op1, reg##_CRn, reg##_CRm, reg##_op2)
#define READ_SPECIALREG(reg) \
({ uint64_t _val; \
__asm __volatile("mrs %0, " __STRING(reg) : "=&r" (_val)); \
_val; \
})
#define WRITE_SPECIALREG(reg, _val) \
__asm __volatile("msr " __STRING(reg) ", %0" : : "r"((uint64_t)_val))
#define __SYS_ALT_NAME(op1, crn, crm, op2) \
"#" #op1 ", C" #crn ", C" #crm ", #" #op2
#define _SYS_ALT_NAME(op1, crn, crm, op2) \
__SYS_ALT_NAME(op1, crn, crm, op2)
#define SYS_ALT_NAME(insn) \
_SYS_ALT_NAME(insn##_op1, insn##_CRn, insn##_CRm, insn##_op2)
#define SYS(insn) do { \
_Static_assert(insn##_op0 == 1, "Invalid SYS instruction"); \
__asm __volatile("sys " SYS_ALT_NAME(insn)); \
} while (0)
#define SYS_ARG(insn, _val) do { \
_Static_assert(insn##_op0 == 1, "Invalid SYS instruction"); \
__asm __volatile("sys " SYS_ALT_NAME(insn) ", %0" \
: : "r"((uint64_t)_val)); \
} while (0)
#define SYSL(insn) \
({ \
uint64_t _val; \
_Static_assert(insn##_op0 == 1, "Invalid SYS instruction"); \
__asm __volatile("sysl %0, " SYS_ALT_NAME(insn) \
: "=&r"(_val)); \
_val; \
})
#define UL(x) UINT64_C(x)
#endif