[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] SVM patch to cleanup guest event injection logic, remove unnecessary
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID b4361ae1aabc2a6bbc65c9d9bdc9843915b2eb09 # Parent 3d85f350a66a006fd5df2c228cfd8b75e3240984 SVM patch to cleanup guest event injection logic, remove unnecessary event_injecting variable. Signed-off-by: Tom Woller <thomas.woller@xxxxxxx> --- xen/arch/x86/hvm/svm/intr.c | 17 +++-------------- xen/arch/x86/hvm/svm/svm.c | 34 ++++++++++++++++------------------ xen/arch/x86/hvm/svm/vmcb.c | 1 - xen/include/asm-x86/hvm/svm/vmcb.h | 1 - 4 files changed, 19 insertions(+), 34 deletions(-) diff -r 3d85f350a66a -r b4361ae1aabc xen/arch/x86/hvm/svm/intr.c --- a/xen/arch/x86/hvm/svm/intr.c Wed May 17 23:51:39 2006 +0100 +++ b/xen/arch/x86/hvm/svm/intr.c Wed May 17 23:53:01 2006 +0100 @@ -132,17 +132,13 @@ asmlinkage void svm_intr_assist(void) ASSERT(vmcb); /* Check if an Injection is active */ - if (v->arch.hvm_svm.injecting_event) { /* Previous Interrupt delivery caused this Intercept? */ if (vmcb->exitintinfo.fields.v && (vmcb->exitintinfo.fields.type == 0)) { v->arch.hvm_svm.saved_irq_vector = vmcb->exitintinfo.fields.vector; // printk("Injecting PF#: saving IRQ from ExitInfo\n"); vmcb->exitintinfo.bytes = 0; - - /* bail out, we won't be injecting an interrupt this time */ - return; + re_injecting = 1; } - } /* Guest's interrputs masked? */ rflags = vmcb->rflags; @@ -151,16 +147,9 @@ asmlinkage void svm_intr_assist(void) /* bail out, we won't be injecting an interrupt this time */ return; } - - /* Interrupt delivery caused an Intercept? */ - if (vmcb->exitintinfo.fields.v && (vmcb->exitintinfo.fields.type == 0)) { -// printk("Re-injecting IRQ from ExitInfo\n"); - intr_vector = vmcb->exitintinfo.fields.vector; - vmcb->exitintinfo.bytes = 0; - re_injecting = 1; - } + /* Previous interrupt still pending? */ - else if (vmcb->vintr.fields.irq) { + if (vmcb->vintr.fields.irq) { // printk("Re-injecting IRQ from Vintr\n"); intr_vector = vmcb->vintr.fields.vector; vmcb->vintr.bytes = 0; diff -r 3d85f350a66a -r b4361ae1aabc xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Wed May 17 23:51:39 2006 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Wed May 17 23:53:01 2006 +0100 @@ -170,10 +170,10 @@ void asidpool_retire( struct vmcb_struct spin_unlock(&ASIDpool[core].asid_lock); } -static inline void svm_inject_exception(struct vmcb_struct *vmcb, - int trap, int ev, int error_code) +static inline void svm_inject_exception(struct vcpu *v, int trap, int ev, int error_code) { eventinj_t event; + struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; event.bytes = 0; event.fields.v = 1; @@ -329,7 +329,7 @@ static inline int long_mode_do_msr_write if ( msr_content & ~(EFER_LME | EFER_LMA | EFER_NX | EFER_SCE) ) { printk("trying to set reserved bit in EFER\n"); - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(vc, TRAP_gp_fault, 1, 0); return 0; } @@ -343,7 +343,7 @@ static inline int long_mode_do_msr_write { printk("trying to set LME bit when " "in paging mode or PAE bit is not set\n"); - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(vc, TRAP_gp_fault, 1, 0); return 0; } set_bit(SVM_CPU_STATE_LME_ENABLED, &vc->arch.hvm_svm.cpu_state); @@ -367,7 +367,7 @@ static inline int long_mode_do_msr_write if (!IS_CANO_ADDRESS(msr_content)) { HVM_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n"); - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(vc, TRAP_gp_fault, 1, 0); } if (regs->ecx == MSR_FS_BASE) @@ -900,7 +900,7 @@ static void svm_do_general_protection_fa /* Reflect it back into the guest */ - svm_inject_exception(vmcb, TRAP_gp_fault, 1, error_code); + svm_inject_exception(v, TRAP_gp_fault, 1, error_code); } /* Reserved bits: [31:14], [12:1] */ @@ -1191,7 +1191,7 @@ static void svm_get_prefix_info(struct v /* Get the address of INS/OUTS instruction */ -static inline int svm_get_io_address(struct vmcb_struct *vmcb, +static inline int svm_get_io_address(struct vcpu *v, struct cpu_user_regs *regs, unsigned int dir, unsigned long *count, unsigned long *addr) { @@ -1201,6 +1201,7 @@ static inline int svm_get_io_address(str int long_mode; ioio_info_t info; segment_selector_t *seg = NULL; + struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; info.bytes = vmcb->exitinfo1; @@ -1244,7 +1245,7 @@ static inline int svm_get_io_address(str /* If the segment isn't present, give GP fault! */ if (!long_mode && !seg->attributes.fields.p) { - svm_inject_exception(vmcb, TRAP_gp_fault, 1, seg->sel); + svm_inject_exception(v, TRAP_gp_fault, 1, seg->sel); return 0; } @@ -1262,7 +1263,7 @@ static inline int svm_get_io_address(str if (!long_mode) { if (*addr > seg->limit) { - svm_inject_exception(vmcb, TRAP_gp_fault, 1, seg->sel); + svm_inject_exception(v, TRAP_gp_fault, 1, seg->sel); return 0; } else @@ -1310,7 +1311,7 @@ static void svm_io_instruction(struct vc unsigned long addr, count; int sign = regs->eflags & EF_DF ? -1 : 1; - if (!svm_get_io_address(vmcb, regs, dir, &count, &addr)) + if (!svm_get_io_address(v, regs, dir, &count, &addr)) { /* We failed to get a valid address, so don't do the IO operation - * it would just get worse if we do! Hopefully the guest is handing @@ -1415,7 +1416,7 @@ static int svm_set_cr0(unsigned long val &v->arch.hvm_svm.cpu_state)) { HVM_DBG_LOG(DBG_LEVEL_1, "Enable paging before PAE enable\n"); - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(v, TRAP_gp_fault, 1, 0); } if (test_bit(SVM_CPU_STATE_LME_ENABLED, &v->arch.hvm_svm.cpu_state)) @@ -1489,7 +1490,7 @@ static int svm_set_cr0(unsigned long val */ if ((value & X86_CR0_PE) == 0) { if (value & X86_CR0_PG) { - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(v, TRAP_gp_fault, 1, 0); return 0; } @@ -1736,7 +1737,7 @@ static int mov_to_cr(int gpreg, int cr, } else { if (test_bit(SVM_CPU_STATE_LMA_ENABLED, &v->arch.hvm_svm.cpu_state)) { - svm_inject_exception(vmcb, TRAP_gp_fault, 1, 0); + svm_inject_exception(v, TRAP_gp_fault, 1, 0); } clear_bit(SVM_CPU_STATE_PAE_ENABLED, &v->arch.hvm_svm.cpu_state); } @@ -2504,7 +2505,6 @@ asmlinkage void svm_vmexit_handler(struc exit_reason = vmcb->exitcode; save_svm_cpu_user_regs(v, ®s); - v->arch.hvm_svm.injecting_event = 0; vmcb->tlb_control = 1; @@ -2668,7 +2668,7 @@ asmlinkage void svm_vmexit_handler(struc if ( test_bit(_DOMF_debugging, &v->domain->domain_flags) ) domain_pause_for_debugger(); else - svm_inject_exception(vmcb, TRAP_int3, 0, 0); + svm_inject_exception(v, TRAP_int3, 0, 0); #endif break; @@ -2679,7 +2679,6 @@ asmlinkage void svm_vmexit_handler(struc case VMEXIT_EXCEPTION_GP: /* This should probably not be trapped in the future */ regs.error_code = vmcb->exitinfo1; - v->arch.hvm_svm.injecting_event = 1; svm_do_general_protection_fault(v, ®s); break; @@ -2699,9 +2698,8 @@ asmlinkage void svm_vmexit_handler(struc //printk("PF1\n"); if (!(error = svm_do_page_fault(va, ®s))) { - v->arch.hvm_svm.injecting_event = 1; /* Inject #PG using Interruption-Information Fields */ - svm_inject_exception(vmcb, TRAP_page_fault, 1, regs.error_code); + svm_inject_exception(v, TRAP_page_fault, 1, regs.error_code); v->arch.hvm_svm.cpu_cr2 = va; vmcb->cr2 = va; diff -r 3d85f350a66a -r b4361ae1aabc xen/arch/x86/hvm/svm/vmcb.c --- a/xen/arch/x86/hvm/svm/vmcb.c Wed May 17 23:51:39 2006 +0100 +++ b/xen/arch/x86/hvm/svm/vmcb.c Wed May 17 23:53:01 2006 +0100 @@ -417,7 +417,6 @@ void svm_do_launch(struct vcpu *v) v->arch.schedule_tail = arch_svm_do_resume; - v->arch.hvm_svm.injecting_event = 0; v->arch.hvm_svm.saved_irq_vector = -1; svm_set_guest_time(v, 0); diff -r 3d85f350a66a -r b4361ae1aabc xen/include/asm-x86/hvm/svm/vmcb.h --- a/xen/include/asm-x86/hvm/svm/vmcb.h Wed May 17 23:51:39 2006 +0100 +++ b/xen/include/asm-x86/hvm/svm/vmcb.h Wed May 17 23:53:01 2006 +0100 @@ -440,7 +440,6 @@ struct arch_svm_struct { u32 *iopm; u32 *msrpm; u64 vmexit_tsc; /* tsc read at #VMEXIT. for TSC_OFFSET */ - int injecting_event; int saved_irq_vector; u32 launch_core; u32 asid_core; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |