static unsigned long svm_rip2pointer(struct vcpu *v) { struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; unsigned long p = vmcb->cs.base + guest_cpu_user_regs()->eip; if ( !(vmcb->cs.attr.fields.l && hvm_long_mode_enabled(v)) ) return (u32)p; /* mask to 32 bits */ return p; }
int32_t XenDriver::guestX86Mode( const Registers ®s ) { if ( !( regs.cr0 & X86_CR0_PE ) ) return 0; if ( regs.rflags & X86_EFLAGS_VM ) return 1; if ( hvm_long_mode_enabled( regs ) && ( regs.cs_arbytes & CS_AR_BYTES_L ) ) return 8; return ( ( regs.cs_arbytes & CS_AR_BYTES_D ) ? 4 : 2 ); }