[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] xen: handle paged gfn in wrmsr_hypervisor_regs
>>> On 03.05.13 at 17:17, Olaf Hering <olaf@xxxxxxxxx> wrote: > --- a/xen/arch/x86/hvm/svm/svm.c > +++ b/xen/arch/x86/hvm/svm/svm.c > @@ -1569,7 +1569,7 @@ static int svm_msr_read_intercept(unsign > > static int svm_msr_write_intercept(unsigned int msr, uint64_t msr_content) > { > - int ret; > + int ret, result = X86EMUL_OKAY; > struct vcpu *v = current; > struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb; > int sync = 0; > @@ -1682,14 +1682,24 @@ static int svm_msr_write_intercept(unsig > if ( wrmsr_viridian_regs(msr, msr_content) ) > break; > > - wrmsr_hypervisor_regs(msr, msr_content); > + switch ( wrmsr_hypervisor_regs(msr, msr_content) ) > + { > + case -EAGAIN: > + result = X86EMUL_RETRY; > + break; > + case 0: > + case 1: > + break; > + default: > + goto gpf; > + } > break; > } > > if ( sync ) > svm_vmload(vmcb); > > - return X86EMUL_OKAY; > + return result; > > gpf: > hvm_inject_hw_exception(TRAP_gp_fault, 0); > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -2088,7 +2088,16 @@ static int vmx_msr_write_intercept(unsig > case HNDL_unhandled: > if ( (vmx_write_guest_msr(msr, msr_content) != 0) && > !is_last_branch_msr(msr) ) > - wrmsr_hypervisor_regs(msr, msr_content); > + switch ( wrmsr_hypervisor_regs(msr, msr_content) ) > + { > + case -EAGAIN: > + return X86EMUL_RETRY; > + case 0: > + case 1: > + break; > + default: > + goto gp_fault; > + } > break; > case HNDL_exception_raised: > return X86EMUL_EXCEPTION; Apart from formatting things look okay up to here. > --- a/xen/arch/x86/traps.c > +++ b/xen/arch/x86/traps.c > @@ -634,25 +634,33 @@ int wrmsr_hypervisor_regs(uint32_t idx, > unsigned long gmfn = val >> 12; > unsigned int idx = val & 0xfff; > struct page_info *page; > + p2m_type_t t; > > if ( idx > 0 ) > { > gdprintk(XENLOG_WARNING, > "Out of range index %u to MSR %08x\n", > idx, 0x40000000); > - return 0; > + return -EINVAL; But I'd stay away from converting to actual errors both here ... > } > > - page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC); > + page = get_page_from_gfn(d, gmfn, &t, P2M_ALLOC); > > if ( !page || !get_page_type(page, PGT_writable_page) ) > { > if ( page ) > put_page(page); > + > + if ( p2m_is_paging(t) ) > + { > + p2m_mem_paging_populate(d, gmfn); > + return -EAGAIN; > + } > + > gdprintk(XENLOG_WARNING, > "Bad GMFN %lx (MFN %lx) to MSR %08x\n", > - gmfn, page_to_mfn(page), base + idx); > - return 0; > + gmfn, page ? page_to_mfn(page) : -1UL, base); > + return -EINVAL; ... and here. If at all these ought to go into a separate patch (which we'd likely postpone until after 4.3). Jan > } > > hypercall_page = __map_domain_page(page); > @@ -2490,7 +2498,7 @@ static int emulate_privileged_op(struct > goto fail; > break; > default: > - if ( wrmsr_hypervisor_regs(regs->ecx, msr_content) ) > + if ( wrmsr_hypervisor_regs(regs->ecx, msr_content) == 1 ) > break; > > rc = vmce_wrmsr(regs->ecx, msr_content); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |