From 57e7172bb92888c300c19b51a5bb8a838f45f41e Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Mon, 12 Sep 2016 16:04:08 +0200 Subject: [PATCH] hvm/fep: Allow testing of instructions crossing the -1 -> 0 virtual boundary The Force Emulation Prefix is named to follow its PV counterpart for cpuid or rdtsc, but isn't really an instruction prefix. It behaves as a break-out into Xen, with the purpose of emulating the next instruction in the current state. It is important to be able to test legal situations which occur in real hardware, including instruction which cross certain boundaries, and instructions starting at 0. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich master commit: 7b5cee79dad24e7006059667b02bd7de685d8ee5 master date: 2016-09-08 16:39:46 +0100 --- xen/arch/x86/hvm/svm/svm.c | 4 ++++ xen/arch/x86/hvm/vmx/vmx.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index cc128b4442..d8ab74dfd0 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2136,6 +2136,10 @@ static void svm_vmexit_ud_intercept(struct cpu_user_regs *regs) { regs->eip += sizeof(sig); regs->eflags &= ~X86_EFLAGS_RF; + + /* Zero the upper 32 bits of %rip if not in long mode. */ + if ( svm_guest_x86_mode(current) != 8 ) + regs->eip = regs->_eip; } } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 9181258268..072ac6c0f1 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2554,6 +2554,10 @@ static void vmx_vmexit_ud_intercept(struct cpu_user_regs *regs) { regs->eip += sizeof(sig); regs->eflags &= ~X86_EFLAGS_RF; + + /* Zero the upper 32 bits of %rip if not in long mode. */ + if ( vmx_guest_x86_mode(current) != 8 ) + regs->eip = regs->_eip; } }