[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/7] xen/x86: merge 2 hvm_event_... functions into 1
This patch merges almost identical functions hvm_event_int3 and hvm_event_single_step into a single function called hvm_event_breakpoint. Signed-off-by: Corneliu ZUZU <czuzu@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/event.c | 76 +++++++++++++++++++---------------------- xen/arch/x86/hvm/vmx/vmx.c | 15 ++++---- xen/include/asm-x86/hvm/event.h | 11 ++++-- 3 files changed, 52 insertions(+), 50 deletions(-) diff --git a/xen/arch/x86/hvm/event.c b/xen/arch/x86/hvm/event.c index a3d4892..e3444db 100644 --- a/xen/arch/x86/hvm/event.c +++ b/xen/arch/x86/hvm/event.c @@ -1,9 +1,12 @@ /* -* event.c: Common hardware virtual machine event abstractions. +* arch/x86/hvm/event.c +* +* Arch-specific hardware virtual machine event abstractions. * * Copyright (c) 2004, Intel Corporation. * Copyright (c) 2005, International Business Machines Corporation. * Copyright (c) 2008, Citrix Systems, Inc. +* Copyright (c) 2016, Bitdefender S.R.L. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -151,61 +154,52 @@ void hvm_event_guest_request(void) } } -int hvm_event_int3(unsigned long rip) +static inline +uint64_t gfn_of_rip(unsigned long rip) { - int rc = 0; struct vcpu *curr = current; + struct segment_register sreg; + uint32_t pfec = PFEC_page_present | PFEC_insn_fetch; - if ( curr->domain->arch.monitor.software_breakpoint_enabled ) - { - struct segment_register sreg; - uint32_t pfec = PFEC_page_present | PFEC_insn_fetch; - vm_event_request_t req = { - .reason = VM_EVENT_REASON_SOFTWARE_BREAKPOINT, - .vcpu_id = curr->vcpu_id, - }; - - hvm_get_segment_register(curr, x86_seg_ss, &sreg); - if ( sreg.attr.fields.dpl == 3 ) - pfec |= PFEC_user_mode; + hvm_get_segment_register(curr, x86_seg_ss, &sreg); + if ( sreg.attr.fields.dpl == 3 ) + pfec |= PFEC_user_mode; - hvm_get_segment_register(curr, x86_seg_cs, &sreg); - req.u.software_breakpoint.gfn = paging_gva_to_gfn(curr, - sreg.base + rip, - &pfec); - - rc = hvm_event_traps(1, &req); - } + hvm_get_segment_register(curr, x86_seg_cs, &sreg); - return rc; + return (uint64_t) paging_gva_to_gfn(curr, sreg.base + rip, &pfec); } -int hvm_event_single_step(unsigned long rip) +int hvm_event_breakpoint(unsigned long rip, + enum hvm_event_breakpoint_type type) { - int rc = 0; struct vcpu *curr = current; + struct arch_domain *ad = &curr->domain->arch; + vm_event_request_t req; - if ( curr->domain->arch.monitor.singlestep_enabled ) + switch ( type ) { - struct segment_register sreg; - uint32_t pfec = PFEC_page_present | PFEC_insn_fetch; - vm_event_request_t req = { - .reason = VM_EVENT_REASON_SINGLESTEP, - .vcpu_id = curr->vcpu_id, - }; - - hvm_get_segment_register(curr, x86_seg_ss, &sreg); - if ( sreg.attr.fields.dpl == 3 ) - pfec |= PFEC_user_mode; + case HVM_EVENT_SOFTWARE_BREAKPOINT: + if ( !ad->monitor.software_breakpoint_enabled ) + return 0; + req.reason = VM_EVENT_REASON_SOFTWARE_BREAKPOINT; + req.u.software_breakpoint.gfn = gfn_of_rip(rip); + break; - hvm_get_segment_register(curr, x86_seg_cs, &sreg); - req.u.singlestep.gfn = paging_gva_to_gfn(curr, sreg.base + rip, - &pfec); + case HVM_EVENT_SINGLESTEP_BREAKPOINT: + if ( !ad->monitor.singlestep_enabled ) + return 0; + req.reason = VM_EVENT_REASON_SINGLESTEP; + req.u.singlestep.gfn = gfn_of_rip(rip); + break; - rc = hvm_event_traps(1, &req); + default: + return -EOPNOTSUPP; } - return rc; + req.vcpu_id = curr->vcpu_id; + + return hvm_event_traps(1, &req); } /* diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index b9f340c..cf0e642 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -3192,8 +3192,10 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) break; } else { - int handled = hvm_event_int3(regs->eip); - + int handled = + hvm_event_breakpoint(regs->eip, + HVM_EVENT_SOFTWARE_BREAKPOINT); + if ( handled < 0 ) { struct hvm_trap trap = { @@ -3517,10 +3519,11 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) case EXIT_REASON_MONITOR_TRAP_FLAG: v->arch.hvm_vmx.exec_control &= ~CPU_BASED_MONITOR_TRAP_FLAG; vmx_update_cpu_exec_control(v); - if ( v->arch.hvm_vcpu.single_step ) { - hvm_event_single_step(regs->eip); - if ( v->domain->debugger_attached ) - domain_pause_for_debugger(); + if ( v->arch.hvm_vcpu.single_step ) + { + hvm_event_breakpoint(regs->eip, HVM_EVENT_SINGLESTEP_BREAKPOINT); + if ( v->domain->debugger_attached ) + domain_pause_for_debugger(); } break; diff --git a/xen/include/asm-x86/hvm/event.h b/xen/include/asm-x86/hvm/event.h index 11eb1fe..7a83b45 100644 --- a/xen/include/asm-x86/hvm/event.h +++ b/xen/include/asm-x86/hvm/event.h @@ -17,6 +17,12 @@ #ifndef __ASM_X86_HVM_EVENT_H__ #define __ASM_X86_HVM_EVENT_H__ +enum hvm_event_breakpoint_type +{ + HVM_EVENT_SOFTWARE_BREAKPOINT, + HVM_EVENT_SINGLESTEP_BREAKPOINT, +}; + /* * Called for current VCPU on crX/MSR changes by guest. * The event might not fire if the client has subscribed to it in onchangeonly @@ -27,9 +33,8 @@ bool_t hvm_event_cr(unsigned int index, unsigned long value, #define hvm_event_crX(what, new, old) \ hvm_event_cr(VM_EVENT_X86_##what, new, old) void hvm_event_msr(unsigned int msr, uint64_t value); -/* Called for current VCPU: returns -1 if no listener */ -int hvm_event_int3(unsigned long rip); -int hvm_event_single_step(unsigned long rip); +int hvm_event_breakpoint(unsigned long rip, + enum hvm_event_breakpoint_type type); void hvm_event_guest_request(void); #endif /* __ASM_X86_HVM_EVENT_H__ */ -- 2.5.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |