domid_t domid)
{
return add_msr_bank_intpose(xc_handle, cpu_nr,
- MC_MSRINJ_F_INTERPOSE | MC_MSRINJ_F_GPADDR,
+ MC_MSRINJ_F_INTERPOSE |
+ ((domid >= DOMID_FIRST_RESERVED &&
+ domid != DOMID_SELF) ?
+ 0 : MC_MSRINJ_F_GPADDR),
MCi_type_ADDR, bank, val, domid);
}
if ( mc_msrinject->mcinj_flags & MC_MSRINJ_F_GPADDR )
{
+ domid_t domid;
struct domain *d;
struct mcinfo_msr *msr;
unsigned int i;
unsigned long gfn, mfn;
p2m_type_t t;
- d = get_domain_by_id(mc_msrinject->mcinj_domid);
+ domid = (mc_msrinject->mcinj_domid == DOMID_SELF) ?
+ current->domain->domain_id : mc_msrinject->mcinj_domid;
+ if ( domid >= DOMID_FIRST_RESERVED )
+ return x86_mcerr("do_mca inject: incompatible flag "
+ "MC_MSRINJ_F_GPADDR with domain %d",
+ -EINVAL, domid);
+
+ d = get_domain_by_id(domid);
if ( d == NULL )
return x86_mcerr("do_mca inject: bad domain id %d",
- -EINVAL, mc_msrinject->mcinj_domid);
+ -EINVAL, domid);
for ( i = 0, msr = &mc_msrinject->mcinj_msr[0];
i < mc_msrinject->mcinj_count;
put_gfn(d, gfn);
put_domain(d);
return x86_mcerr("do_mca inject: bad gfn %#lx of domain %d",
- -EINVAL, gfn, mc_msrinject->mcinj_domid);
+ -EINVAL, gfn, domid);
}
msr->value = pfn_to_paddr(mfn) | (gaddr & (PAGE_SIZE - 1));