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