[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] x86/mce: Translate passed-in GPA to host machine address
On 2015/09/15 10:29, Haozhong Zhang wrote: > This patch adds a new flag MC_MSRINJ_F_GPADDR to > xen_mc_msrinject.mcinj_flags, and makes do_mca() to translate the > guest physical address passed-in through > xen_mc_msrinject.mcinj_msr[i].value to the host machine address if > this flag is present. > > Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> Comments inline. > --- > xen/arch/x86/cpu/mcheck/mce.c | 33 +++++++++++++++++++++++++++++++++ > xen/include/public/arch-x86/xen-mca.h | 5 ++++- > 2 files changed, 37 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c > index 561257d..343d9d2 100644 > --- a/xen/arch/x86/cpu/mcheck/mce.c > +++ b/xen/arch/x86/cpu/mcheck/mce.c > @@ -21,6 +21,7 @@ > #include <asm/processor.h> > #include <asm/system.h> > #include <asm/msr.h> > +#include <asm/p2m.h> > > #include "mce.h" > #include "barrier.h" > @@ -1422,6 +1423,38 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc) > if (mc_msrinject->mcinj_count == 0) > return 0; > > + if (mc_msrinject->mcinj_flags & MC_MSRINJ_F_GPADDR) { > + struct domain *d; > + struct mcinfo_msr *msr; > + int i; > + uint64_t gaddr, gpfn, mfn, haddr; > + p2m_type_t t; > + > + d = get_domain_by_id(mc_msrinject->mcinj_domid); > + if (d == NULL) > + return x86_mcerr("do_mca inject: illegal domain id", > -EINVAL); > + > + for (i = 0, msr = &mc_msrinject->mcinj_msr[0]; > + i < mc_msrinject->mcinj_count; i++, msr++) { > + gaddr = msr->value; > + gpfn = gaddr >> PAGE_SHIFT; > + mfn = mfn_x(get_gfn(d, gpfn, &t)); > + > + if (mfn == INVALID_MFN) { put_gfn(d, gpfn); > + put_domain(d); > + return x86_mcerr("do_mca inject: illegal MSR value", > + -EINVAL); > + } > + > + haddr = (mfn << PAGE_SHIFT) | (gaddr & (PAGE_SIZE - 1)); > + msr->value = haddr; > + > + put_gfn(d, gpfn); > + } > + > + put_domain(d); > + } > + > if (!x86_mc_msrinject_verify(mc_msrinject)) > return x86_mcerr("do_mca inject: illegal MSR", -EINVAL); > > diff --git a/xen/include/public/arch-x86/xen-mca.h > b/xen/include/public/arch-x86/xen-mca.h > index 2422b76..33c1a84 100644 > --- a/xen/include/public/arch-x86/xen-mca.h > +++ b/xen/include/public/arch-x86/xen-mca.h > @@ -392,12 +392,15 @@ struct xen_mc_msrinject { > uint32_t mcinj_cpunr; /* target processor id */ > uint32_t mcinj_flags; /* see MC_MSRINJ_F_* below */ > uint32_t mcinj_count; /* 0 .. count-1 in array are valid */ > - uint32_t _pad0; > + domid_t mcinj_domid; /* valid only if MC_MSRINJ_F_GPADDR > presents > + in mcinj_flags */ wording. I prefer "s/presents/is present/" > + uint16_t _pad0; > struct mcinfo_msr mcinj_msr[MC_MSRINJ_MAXMSRS]; > }; > > /* Flags for mcinj_flags above; bits 16-31 are reserved */ > #define MC_MSRINJ_F_INTERPOSE 0x1 > +#define MC_MSRINJ_F_GPADDR 0x2 > > #define XEN_MC_mceinject 5 > struct xen_mc_mceinject { > Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrer: Dr. Ralf Herbrich, Christian Schlaeger Ust-ID: DE289237879 Eingetragen am Amtsgericht Charlottenburg HRB 149173 B _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |