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/bug.h>
9 #include <xen/types.h>
10 #include <public/xen.h>
11 #include <asm/current.h>
12 #include <asm/processor.h>
13
14 #define psr_mode(psr,m) (((psr) & PSR_MODE_MASK) == (m))
15
regs_mode_is_32bit(const struct cpu_user_regs * regs)16 static inline bool regs_mode_is_32bit(const struct cpu_user_regs *regs)
17 {
18 #ifdef CONFIG_ARM_32
19 return true;
20 #else
21 return !!(regs->cpsr & PSR_MODE_BIT);
22 #endif
23 }
24
25 #define usr_mode(r) psr_mode((r)->cpsr,PSR_MODE_USR)
26 #define fiq_mode(r) psr_mode((r)->cpsr,PSR_MODE_FIQ)
27 #define irq_mode(r) psr_mode((r)->cpsr,PSR_MODE_IRQ)
28 #define svc_mode(r) psr_mode((r)->cpsr,PSR_MODE_SVC)
29 #define mon_mode(r) psr_mode((r)->cpsr,PSR_MODE_MON)
30 #define abt_mode(r) psr_mode((r)->cpsr,PSR_MODE_ABT)
31 #define und_mode(r) psr_mode((r)->cpsr,PSR_MODE_UND)
32 #define sys_mode(r) psr_mode((r)->cpsr,PSR_MODE_SYS)
33
34 #ifdef CONFIG_ARM_32
35 #define hyp_mode(r) psr_mode((r)->cpsr,PSR_MODE_HYP)
36 #define regs_mode_is_user(r) usr_mode(r)
37 #else
38 #define hyp_mode(r) (psr_mode((r)->cpsr,PSR_MODE_EL2h) || \
39 psr_mode((r)->cpsr,PSR_MODE_EL2t))
40
41 /*
42 * Trap may have been taken from EL0, which might be in AArch32 usr
43 * mode, or in AArch64 mode (PSR_MODE_EL0t).
44 */
45 #define regs_mode_is_user(r) \
46 (psr_mode((r)->cpsr,PSR_MODE_EL0t) || usr_mode(r))
47 #endif
48
guest_mode(const struct cpu_user_regs * r)49 static inline bool guest_mode(const struct cpu_user_regs *r)
50 {
51 unsigned long diff = (uintptr_t)guest_cpu_user_regs() - (uintptr_t)(r);
52 /* Frame pointer must point into current CPU stack. */
53 ASSERT(diff < STACK_SIZE);
54 /* If not a guest frame, it must be a hypervisor frame. */
55 ASSERT((diff == 0) || hyp_mode(r));
56 /* Return TRUE if it's a guest frame. */
57 return (diff == 0);
58 }
59
60 register_t get_user_reg(struct cpu_user_regs *regs, int reg);
61 void set_user_reg(struct cpu_user_regs *regs, int reg, register_t value);
62
regpair_to_uint64(register_t reg0,register_t reg1)63 static inline uint64_t regpair_to_uint64(register_t reg0, register_t reg1)
64 {
65 return ((uint64_t)reg0 << 32) | (uint32_t)reg1;
66 }
67
uint64_to_regpair(register_t * reg0,register_t * reg1,uint64_t val)68 static inline void uint64_to_regpair(register_t *reg0, register_t *reg1,
69 uint64_t val)
70 {
71 *reg0 = val >> 32;
72 *reg1 = (uint32_t)val;
73 }
74
75 #endif
76
77 #endif /* __ARM_REGS_H__ */
78 /*
79 * Local variables:
80 * mode: C
81 * c-file-style: "BSD"
82 * c-basic-offset: 4
83 * indent-tabs-mode: nil
84 * End:
85 */
86