[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 10/16]: PVH xen: introduce vmx_pvh.c
At 18:01 -0800 on 11 Jan (1357927270), Mukesh Rathor wrote: > The heart of this patch is vmx exit handler for PVH guest. It is nicely > isolated in a separate module. A call to it is added to > vmx_pvh_vmexit_handler(). Not looking at this in fine detail yet (considering the various 'fixme's still around in it), but one or two things: > +static noinline int vmxit_exception(struct cpu_user_regs *regs) > +{ > + unsigned int vector = (__vmread(VM_EXIT_INTR_INFO)) & > INTR_INFO_VECTOR_MASK; > + int rc=1; > + struct vcpu *vp = current; > + > + dbgp2(" EXCPT: vec:%d cs:%lx r.IP:%lx\n", vector, > vmr(GUEST_CS_SELECTOR), > + regs->eip); > + > + if (vector == TRAP_debug) { > + unsigned long exit_qualification = __vmread(EXIT_QUALIFICATION); > + write_debugreg(6, exit_qualification | 0xffff0ff0); > + regs->rip = vmr(GUEST_RIP); > + regs->rsp = vmr(GUEST_RSP); > + rc = 0; > + > + /* gdbsx or another debugger */ This is a hard tab. Actually, the whitespace in this file needs attention generally. > +void vmx_pvh_vmexit_handler(struct cpu_user_regs *regs) > +{ > + unsigned long exit_qualification; > + unsigned int vector, exit_reason = __vmread(VM_EXIT_REASON); > + int rc=0, ccpu = smp_processor_id(); > + struct vcpu *vp = current; > + > + dbgp1("PVH:[%d]left VMCS exitreas:%d RIP:%lx RSP:%lx EFLAGS:%lx > CR0:%lx\n", > + ccpu, exit_reason, vmr(GUEST_RIP), vmr(GUEST_RSP), regs->rflags, > + vmr(GUEST_CR0)); > + > + /* for guest_kernel_mode() */ > + regs->cs = vmr(GUEST_CS_SELECTOR); > + > + switch ( (uint16_t)exit_reason ) > + { > + case EXIT_REASON_EXCEPTION_NMI: > + case EXIT_REASON_EXTERNAL_INTERRUPT: > + case EXIT_REASON_MCE_DURING_VMENTRY: > + break; > + default: > + local_irq_enable(); > + } That's a bit risky: EXIT_REASON_EXCEPTION_NMI includes a lot of cases that might not be safe to handle with interrupts disabled. Also I think it means there are paths through this function that don't enable irqs at all. I think it'd be better to do it the way vmx_vmexit_handler() does: explicitly sort out the things that _must_ be done with irqs disabled first, so it's clear which code runs with irqs enabled and which doesn't. > + switch ( (uint16_t)exit_reason ) > + { > + case EXIT_REASON_EXCEPTION_NMI: /* 0 */ > + rc = vmxit_exception(regs); > + break; > + > + case EXIT_REASON_EXTERNAL_INTERRUPT: /* 1 */ > + { > + vector = __vmread(VM_EXIT_INTR_INFO); > + vector &= INTR_INFO_VECTOR_MASK; > + vmx_do_extint(regs); > + break; > + } > + > + case EXIT_REASON_TRIPLE_FAULT: /* 2 */ > + { > + dbgp0("PVH:Triple Flt:[%d]exitreas:%d RIP:%lx RSP:%lx EFLAGS:%lx > CR3:%lx\n", > + ccpu, exit_reason, vmr(GUEST_RIP), vmr(GUEST_RSP), > + regs->rflags, vmr(GUEST_CR3)); > + > + vp->arch.hvm_vcpu.guest_cr[3] = vp->arch.hvm_vcpu.hw_cr[3] = > + > __vmread(GUEST_CR3); > + rc = 1; > + break; > + } > + case EXIT_REASON_PENDING_VIRT_INTR: /* 7 */ > + { > + struct vcpu *v = current; > + /* Disable the interrupt window. */ > + v->arch.hvm_vmx.exec_control &= ~CPU_BASED_VIRTUAL_INTR_PENDING; > + __vmwrite(CPU_BASED_VM_EXEC_CONTROL, > v->arch.hvm_vmx.exec_control); > + break; > + } > + > + case EXIT_REASON_CPUID: /* 10 */ > + { > + if ( guest_kernel_mode(vp, regs) ) { > + pv_cpuid(regs); > + > + /* Because we are setting CR4.OSFXSR to 0, we need to disable > + * this because, during boot, user process "init" (which > doesn't > + * do cpuid), will do 'pxor xmm0,xmm0' and cause #UD. For > now > + * disable this. HVM doesn't allow setting of CR4.OSFXSR. > + * fixme: this and also look at CR4.OSXSAVE */ > + > + __clear_bit(X86_FEATURE_FXSR, ®s->edx); Shouldn't this be gated on which leaf the guest asked for? Tim. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |