[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] SVM patch to reverse the logic of the general1 intercepts for easier
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 3d85f350a66a006fd5df2c228cfd8b75e3240984 # Parent 632ad28f2fd7a6602b08a9d054dc1b44efaf93f3 SVM patch to reverse the logic of the general1 intercepts for easier reading, also add the INVD intercept with print/eip increment only. Signed-off-by: Tom Woller <thomas.woller@xxxxxxx> Signed-off-by: Mats Petersson <mats.petersson@xxxxxxx> --- xen/arch/x86/hvm/svm/svm.c | 32 +++++++++++++++++++++++++++----- xen/arch/x86/hvm/svm/vmcb.c | 16 ++++++---------- 2 files changed, 33 insertions(+), 15 deletions(-) diff -r 632ad28f2fd7 -r 3d85f350a66a xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Wed May 17 23:50:23 2006 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Wed May 17 23:51:39 2006 +0100 @@ -1852,7 +1852,8 @@ static int svm_cr_access(struct vcpu *v, break; case INSTR_SMSW: - svm_dump_inst(svm_rip2pointer(vmcb)); + if (svm_dbg_on) + svm_dump_inst(svm_rip2pointer(vmcb)); value = v->arch.hvm_svm.cpu_shadow_cr0; gpreg = decode_src_reg(prefix, buffer[index+2]); set_reg(gpreg, value, regs, vmcb); @@ -1989,9 +1990,25 @@ static inline void svm_vmexit_do_hlt(str } -static inline void svm_vmexit_do_mwait(void) -{ -} +static void svm_vmexit_do_invd(struct vmcb_struct *vmcb) +{ + int inst_len; + + /* Invalidate the cache - we can't really do that safely - maybe we should + * WBINVD, but I think it's just fine to completely ignore it - we should + * have cache-snooping that solves it anyways. -- Mats P. + */ + + /* Tell the user that we did this - just in case someone runs some really weird + * operating system and wants to know why it's not working as it should... + */ + printk("INVD instruction intercepted - ignored\n"); + + inst_len = __get_instruction_length(vmcb, INSTR_INVD, NULL); + __update_guest_eip(vmcb, inst_len); +} + + #ifdef XEN_DEBUGGER @@ -2053,7 +2070,7 @@ void svm_handle_invlpg(const short invlp __update_guest_eip(vmcb, inst_len); /* - * The address is implicit on this instruction At the moment, we don't + * The address is implicit on this instruction. At the moment, we don't * use ecx (ASID) to identify individual guests pages */ g_vaddr = regs->eax; @@ -2703,6 +2720,11 @@ asmlinkage void svm_vmexit_handler(struc raise_softirq(SCHEDULE_SOFTIRQ); break; + + case VMEXIT_INVD: + svm_vmexit_do_invd(vmcb); + break; + case VMEXIT_GDTR_WRITE: printk("WRITE to GDTR\n"); break; diff -r 632ad28f2fd7 -r 3d85f350a66a xen/arch/x86/hvm/svm/vmcb.c --- a/xen/arch/x86/hvm/svm/vmcb.c Wed May 17 23:50:23 2006 +0100 +++ b/xen/arch/x86/hvm/svm/vmcb.c Wed May 17 23:51:39 2006 +0100 @@ -117,16 +117,12 @@ static int construct_vmcb_controls(struc /* mask off all general 1 intercepts except those listed here */ vmcb->general1_intercepts = - ~(GENERAL1_INTERCEPT_CR0_SEL_WRITE | GENERAL1_INTERCEPT_VINTR | - GENERAL1_INTERCEPT_IDTR_READ | GENERAL1_INTERCEPT_IDTR_WRITE | - GENERAL1_INTERCEPT_GDTR_READ | GENERAL1_INTERCEPT_GDTR_WRITE | - GENERAL1_INTERCEPT_LDTR_READ | GENERAL1_INTERCEPT_LDTR_WRITE | - GENERAL1_INTERCEPT_TR_READ | GENERAL1_INTERCEPT_TR_WRITE | - GENERAL1_INTERCEPT_RDTSC | GENERAL1_INTERCEPT_PUSHF | - GENERAL1_INTERCEPT_SWINT | GENERAL1_INTERCEPT_POPF | - GENERAL1_INTERCEPT_IRET | GENERAL1_INTERCEPT_PAUSE | - GENERAL1_INTERCEPT_TASK_SWITCH - ); + GENERAL1_INTERCEPT_INTR | GENERAL1_INTERCEPT_NMI | + GENERAL1_INTERCEPT_SMI | GENERAL1_INTERCEPT_INIT | + GENERAL1_INTERCEPT_CPUID | GENERAL1_INTERCEPT_INVD | + GENERAL1_INTERCEPT_HLT | GENERAL1_INTERCEPT_INVLPG | + GENERAL1_INTERCEPT_INVLPGA | GENERAL1_INTERCEPT_IOIO_PROT | + GENERAL1_INTERCEPT_MSR_PROT | GENERAL1_INTERCEPT_SHUTDOWN_EVT; /* turn on the general 2 intercepts */ vmcb->general2_intercepts = _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |