[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/vvmx: Improvements to INVEPT instruction handling
>>> On 06.02.17 at 17:55, <andrew.cooper3@xxxxxxxxxx> wrote: > * Latch current once at the start. > * Avoid the memory operand read for INVEPT_ALL_CONTEXT. Experimentally, this > is how hardware behaves, and avoids an unnecessary pagewalk. Hmm, so you say #GP is being raised for all possible reasons, but #PF can't result here? That would be pretty unusual instruction semantics. But if it's that way (to be confirmed by Intel), and ... > * Reject Reg/Reg encodings of the instruction. ... if this is possible to occur at all (I'd expect #UD to result instead of a VM exit), then ... > * Audit eptp against maxphysaddr. > * Introduce and use VMX_INSN_INVALID_INV_OPERAND to correct the vmfail > semantics. > * Add extra newlines for clarity > > Also, introduce some TODOs for further checks which should be performed. > These checks are hard to perform at the moment, as there is no easy way to see > which MSR values where given to the guest. > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> with one minor adjustment request: > --- a/xen/arch/x86/hvm/vmx/vvmx.c > +++ b/xen/arch/x86/hvm/vmx/vvmx.c > @@ -1770,33 +1770,64 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs) > > int nvmx_handle_invept(struct cpu_user_regs *regs) > { > + struct vcpu *curr = current; > + struct domain *currd = curr->domain; > struct vmx_inst_decoded decode; > - unsigned long eptp; > int ret; > > - if ( (ret = decode_vmx_inst(regs, &decode, &eptp, 0)) != X86EMUL_OKAY ) > + if ( (ret = decode_vmx_inst(regs, &decode, NULL, 0)) != X86EMUL_OKAY ) > return ret; > > + /* TODO - reject instruction completely if not configured. */ > + > + /* Instruction must have a memory operand. */ > + if ( decode.type != VMX_INST_MEMREG_TYPE_MEMORY ) > + { > + hvm_inject_hw_exception(TRAP_invalid_op, 0); > + return X86EMUL_EXCEPTION; > + } > + > switch ( reg_read(regs, decode.reg2) ) > { > case INVEPT_SINGLE_CONTEXT: > { > - struct p2m_domain *p2m = p2m_get_nestedp2m(current, eptp); > + struct p2m_domain *p2m; > + pagefault_info_t pfinfo; > + unsigned long eptp; > + > + /* TODO - reject SINGLE_CONTEXT if not configured. */ > + > + ret = hvm_copy_from_guest_linear(&eptp, decode.mem, 8, 0, &pfinfo); Please use sizeof(eptp) here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |