[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86 vmx: Ensure debug-mode intercept for int3 and debug exceptions are
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1242207584 -3600 # Node ID 7d552e56d105786838ac027f3625486c9c2ea449 # Parent 07fbc48553e8024032a9f4764fd26afdafc4ce28 x86 vmx: Ensure debug-mode intercept for int3 and debug exceptions are reinstated when resetting EXCEPTION_BIRTMAP entry in VMCS after exiting real mode. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmcs.c | 12 +----------- xen/arch/x86/hvm/vmx/vmx.c | 19 +++++++++++++++++++ xen/include/asm-x86/hvm/vmx/vmx.h | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff -r 07fbc48553e8 -r 7d552e56d105 xen/arch/x86/hvm/vmx/vmcs.c --- a/xen/arch/x86/hvm/vmx/vmcs.c Wed May 13 10:28:35 2009 +0100 +++ b/xen/arch/x86/hvm/vmx/vmcs.c Wed May 13 10:39:44 2009 +0100 @@ -912,18 +912,8 @@ void vmx_do_resume(struct vcpu *v) debug_state = v->domain->debugger_attached; if ( unlikely(v->arch.hvm_vcpu.debug_state_latch != debug_state) ) { - unsigned long intercepts = __vmread(EXCEPTION_BITMAP); - unsigned long mask = 1u << TRAP_int3; - - if ( !cpu_has_monitor_trap_flag ) - mask |= 1u << TRAP_debug; - v->arch.hvm_vcpu.debug_state_latch = debug_state; - if ( debug_state ) - intercepts |= mask; - else - intercepts &= ~mask; - __vmwrite(EXCEPTION_BITMAP, intercepts); + vmx_update_debug_state(v); } hvm_do_resume(v); diff -r 07fbc48553e8 -r 7d552e56d105 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Wed May 13 10:28:35 2009 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed May 13 10:39:44 2009 +0100 @@ -1035,6 +1035,24 @@ static void vmx_update_host_cr3(struct v vmx_vmcs_exit(v); } +void vmx_update_debug_state(struct vcpu *v) +{ + unsigned long intercepts, mask; + + ASSERT(v == current); + + mask = 1u << TRAP_int3; + if ( !cpu_has_monitor_trap_flag ) + mask |= 1u << TRAP_debug; + + intercepts = __vmread(EXCEPTION_BITMAP); + if ( v->arch.hvm_vcpu.debug_state_latch ) + intercepts |= mask; + else + intercepts &= ~mask; + __vmwrite(EXCEPTION_BITMAP, intercepts); +} + static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) { vmx_vmcs_enter(v); @@ -1107,6 +1125,7 @@ static void vmx_update_guest_cr(struct v | (paging_mode_hap(v->domain) ? 0 : (1U << TRAP_page_fault)) | (1U << TRAP_no_device)); + vmx_update_debug_state(v); } } diff -r 07fbc48553e8 -r 7d552e56d105 xen/include/asm-x86/hvm/vmx/vmx.h --- a/xen/include/asm-x86/hvm/vmx/vmx.h Wed May 13 10:28:35 2009 +0100 +++ b/xen/include/asm-x86/hvm/vmx/vmx.h Wed May 13 10:39:44 2009 +0100 @@ -60,6 +60,7 @@ void vmx_do_resume(struct vcpu *); void vmx_do_resume(struct vcpu *); void vmx_vlapic_msr_changed(struct vcpu *v); void vmx_realmode(struct cpu_user_regs *regs); +void vmx_update_debug_state(struct vcpu *v); /* * Exit Reasons _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |