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