1 
2 #ifndef __X86_REGS_H__
3 #define __X86_REGS_H__
4 
5 #include <xen/types.h>
6 #include <public/xen.h>
7 
8 #define ring_0(r)    (((r)->cs & 3) == 0)
9 #define ring_1(r)    (((r)->cs & 3) == 1)
10 #define ring_2(r)    (((r)->cs & 3) == 2)
11 #define ring_3(r)    (((r)->cs & 3) == 3)
12 
13 #define guest_kernel_mode(v, r)                                 \
14     (!is_pv_32bit_vcpu(v) ?                                     \
15      (ring_3(r) && ((v)->arch.flags & TF_kernel_mode)) :        \
16      (ring_1(r)))
17 
18 #define permit_softint(dpl, v, r) \
19     ((dpl) >= (guest_kernel_mode(v, r) ? 1 : 3))
20 
21 /* Check for null trap callback handler: Is the EIP null? */
22 #define null_trap_bounce(v, tb) \
23     (!is_pv_32bit_vcpu(v) ? ((tb)->eip == 0) : (((tb)->cs & ~3) == 0))
24 
25 /* Number of bytes of on-stack execution state to be context-switched. */
26 #define CTXT_SWITCH_STACK_BYTES sizeof(struct cpu_user_regs)
27 
28 #define guest_mode(r)                                                         \
29 ({                                                                            \
30     unsigned long diff = (uintptr_t)guest_cpu_user_regs() - (uintptr_t)(r);   \
31     /* Frame pointer must point into current CPU stack. */                    \
32     ASSERT(diff < STACK_SIZE);                                                \
33     /* If not a guest frame, it must be a hypervisor frame. */                \
34     if ( diff < PRIMARY_STACK_SIZE )                                          \
35         ASSERT(!diff || ((r)->cs == __HYPERVISOR_CS));                        \
36     /* Return TRUE if it's a guest frame. */                                  \
37     !diff || ((r)->cs != __HYPERVISOR_CS);                                    \
38 })
39 
40 #define read_sreg(name) ({                           \
41     unsigned int __sel;                              \
42     asm ( "mov %%" STR(name) ",%0" : "=r" (__sel) ); \
43     __sel;                                           \
44 })
45 
46 #endif /* __X86_REGS_H__ */
47