[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 Tue, Sep 15, 2015 at 11:14:26AM +0200, Egger, Christoph wrote: > 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); Oh, I forgot it in this path and will add in next version. > > > + 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/" > I will fix it in the next version. > > + 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 |