1 #ifndef __ARM_REGS_H__ 2 #define __ARM_REGS_H__ 3 4 #define PSR_MODE_MASK 0x1f 5 6 #ifndef __ASSEMBLY__ 7 8 #include <xen/types.h> 9 #include <public/xen.h> 10 #include <asm/processor.h> 11 12 #define psr_mode(psr,m) (((psr) & PSR_MODE_MASK) == m) 13 14 #define psr_mode_is_32bit(psr) !!((psr) & PSR_MODE_BIT) 15 16 #define usr_mode(r) psr_mode((r)->cpsr,PSR_MODE_USR) 17 #define fiq_mode(r) psr_mode((r)->cpsr,PSR_MODE_FIQ) 18 #define irq_mode(r) psr_mode((r)->cpsr,PSR_MODE_IRQ) 19 #define svc_mode(r) psr_mode((r)->cpsr,PSR_MODE_SVC) 20 #define mon_mode(r) psr_mode((r)->cpsr,PSR_MODE_MON) 21 #define abt_mode(r) psr_mode((r)->cpsr,PSR_MODE_ABT) 22 #define und_mode(r) psr_mode((r)->cpsr,PSR_MODE_UND) 23 #define sys_mode(r) psr_mode((r)->cpsr,PSR_MODE_SYS) 24 25 #ifdef CONFIG_ARM_32 26 #define hyp_mode(r) psr_mode((r)->cpsr,PSR_MODE_HYP) 27 #define psr_mode_is_user(r) usr_mode(r) 28 #else 29 #define hyp_mode(r) (psr_mode((r)->cpsr,PSR_MODE_EL2h) || \ 30 psr_mode((r)->cpsr,PSR_MODE_EL2t)) 31 32 /* 33 * Trap may have been taken from EL0, which might be in AArch32 usr 34 * mode, or in AArch64 mode (PSR_MODE_EL0t). 35 */ 36 #define psr_mode_is_user(r) \ 37 (psr_mode((r)->cpsr,PSR_MODE_EL0t) || usr_mode(r)) 38 #endif 39 40 #define guest_mode(r) \ 41 ({ \ 42 unsigned long diff = (char *)guest_cpu_user_regs() - (char *)(r); \ 43 /* Frame pointer must point into current CPU stack. */ \ 44 ASSERT(diff < STACK_SIZE); \ 45 /* If not a guest frame, it must be a hypervisor frame. */ \ 46 ASSERT((diff == 0) || hyp_mode(r)); \ 47 /* Return TRUE if it's a guest frame. */ \ 48 (diff == 0); \ 49 }) 50 51 #define return_reg(v) ((v)->arch.cpu_info->guest_cpu_user_regs.r0) 52 53 register_t get_user_reg(struct cpu_user_regs *regs, int reg); 54 void set_user_reg(struct cpu_user_regs *regs, int reg, register_t val); 55 56 #endif 57 58 #endif /* __ARM_REGS_H__ */ 59 /* 60 * Local variables: 61 * mode: C 62 * c-file-style: "BSD" 63 * c-basic-offset: 4 64 * indent-tabs-mode: nil 65 * End: 66 */ 67