[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/5] x86: Handle the Xen MSRs via the new guest_{rd, wr}msr() infrastructure
>>> On 07.03.18 at 19:58, <andrew.cooper3@xxxxxxxxxx> wrote: > --- a/xen/arch/x86/msr.c > +++ b/xen/arch/x86/msr.c > @@ -185,6 +185,10 @@ int guest_rdmsr(const struct vcpu *v, uint32_t msr, > uint64_t *val) > } > > /* Fallthrough. */ > + case MSR_XEN_ALT_START ... MSR_XEN_ALT_START + NR_XEN_MSRS - 1: To account for what I've said on patch 1, perhaps this better would be case MSR_HYPERVISOR_START + NR_VIRIDIAN_MSRS - 1 ... MSR_XEN_ALT_START + NR_XEN_MSRS - 1: to produce consistent results regardless of the value of NR_VIRIDIAN_MSRS (which I suppose is somewhere specified)? > --- a/xen/arch/x86/traps.c > +++ b/xen/arch/x86/traps.c > @@ -777,31 +777,29 @@ static void do_trap(struct cpu_user_regs *regs) > trapnr, trapstr(trapnr), regs->error_code); > } > > -/* Returns 0 if not handled, and non-0 for success. */ > -int rdmsr_hypervisor_regs(uint32_t idx, uint64_t *val) > +int guest_rdmsr_xen(const struct vcpu *v, uint32_t idx, uint64_t *val) > { > - struct domain *d = current->domain; > + const struct domain *d = v->domain; > /* Optionally shift out of the way of Viridian architectural MSRs. */ > - uint32_t base = is_viridian_domain(d) ? 0x40000200 : 0x40000000; > + uint32_t base = (is_viridian_domain(d) > + ? MSR_XEN_ALT_START : MSR_HYPERVISOR_START); Places like this is where it is really helpful to have the constants. > switch ( idx - base ) > { > case 0: /* Write hypercall page MSR. Read as zero. */ > - { > *val = 0; > - return 1; > - } > + return X86EMUL_OKAY; > } > > - return 0; > + return X86EMUL_EXCEPTION; > } > > -/* Returns 1 if handled, 0 if not and -Exx for error. */ > -int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val) > +int guest_wrmsr_xen(struct vcpu *v, uint32_t idx, uint64_t val) > { > - struct domain *d = current->domain; > + struct domain *d = v->domain; > /* Optionally shift out of the way of Viridian architectural MSRs. */ > - uint32_t base = is_viridian_domain(d) ? 0x40000200 : 0x40000000; > + uint32_t base = (is_viridian_domain(d) > + ? MSR_XEN_ALT_START : MSR_HYPERVISOR_START); > > switch ( idx - base ) > { > @@ -818,7 +816,7 @@ int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val) > gdprintk(XENLOG_WARNING, > "wrmsr hypercall page index %#x unsupported\n", > page_index); > - return 0; > + goto gp_fault; > } > > page = get_page_from_gfn(d, gmfn, &t, P2M_ALLOC); > @@ -831,13 +829,13 @@ int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val) > if ( p2m_is_paging(t) ) > { > p2m_mem_paging_populate(d, gmfn); > - return -ERESTART; > + return X86EMUL_RETRY; > } > > gdprintk(XENLOG_WARNING, > "Bad GMFN %lx (MFN %lx) to MSR %08x\n", > gmfn, page ? page_to_mfn(page) : -1UL, base); > - return 0; > + goto gp_fault; > } > > hypercall_page = __map_domain_page(page); > @@ -845,11 +843,12 @@ int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val) > unmap_domain_page(hypercall_page); > > put_page_and_type(page); > - return 1; > + return X86EMUL_OKAY; > } > } > > - return 0; > + gp_fault: > + return X86EMUL_EXCEPTION; > } I'll make one more attempt here: Can I talk you into avoiding goto-s in cases like this? > --- a/xen/include/asm-x86/msr-index.h > +++ b/xen/include/asm-x86/msr-index.h > @@ -543,5 +543,7 @@ > /* Hypervisor leaves in the 0x4xxxxxxx range. */ > #define MSR_HYPERVISOR_START 0x40000000 > #define NR_VIRIDIAN_MSRS 0x00000200 > +#define MSR_XEN_ALT_START 0x40000200 > +#define NR_XEN_MSRS 0x00000100 Where is this count coming from? I don't think it's part of the public interface, but if there was such an upper bound I think it should be. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |