[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 06/22] xen/arm: traps: Check the P2M before injecting a data/instruction abort
On Thu, 28 Jul 2016, Julien Grall wrote: > A data/instruction abort may have occurred if another CPU was playing > with the stage-2 page table when following the break-before-make > sequence (see D4.7.1 in ARM DDI 0487A.j). Rather than injecting directly > the fault to the guest, we need to check whether the mapping exists. If > it exists, return to the guest to replay the instruction. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > --- > xen/arch/arm/traps.c | 40 ++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 38 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index b46284c..da56cc0 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -2404,6 +2404,7 @@ static void do_trap_instr_abort_guest(struct > cpu_user_regs *regs, > register_t gva = READ_SYSREG(FAR_EL2); > uint8_t fsc = hsr.iabt.ifsc & ~FSC_LL_MASK; > paddr_t gpa; > + mfn_t mfn; > > if ( hpfar_is_valid(hsr.iabt.s1ptw, fsc) ) > gpa = get_faulting_ipa(gva); > @@ -2417,6 +2418,11 @@ static void do_trap_instr_abort_guest(struct > cpu_user_regs *regs, > */ > flush_tlb_local(); > > + /* > + * We may not be able to translate because someone is > + * playing with the Stage-2 page table of the domain. > + * Return to the guest. > + */ > rc = gva_to_ipa(gva, &gpa, GV2M_READ); > if ( rc == -EFAULT ) > return; /* Try again */ > @@ -2437,8 +2443,17 @@ static void do_trap_instr_abort_guest(struct > cpu_user_regs *regs, > /* Trap was triggered by mem_access, work here is done */ > if ( !rc ) > return; > + break; > } > - break; > + case FSC_FLT_TRANS: Please add brackets under the case statement for code style > + /* > + * The PT walk may have failed because someone was playing > + * with the Stage-2 page table. Walk the Stage-2 PT to check > + * if the entry exists. If it's the case, return to the guest > + */ > + mfn = p2m_lookup(current->domain, _gfn(paddr_to_pfn(gpa)), NULL); > + if ( !mfn_eq(mfn, INVALID_MFN) ) > + return; Just checking, but isn't it possible to get a genuine translation abort with an mfn != invalid_mfn? > } > > inject_iabt_exception(regs, gva, hsr.len); > @@ -2455,7 +2470,7 @@ static bool_t try_handle_mmio(struct cpu_user_regs > *regs, > return 0; > > /* All the instructions used on emulated MMIO region should be valid */ > - if ( !dabt.valid ) > + if ( !info->dabt.valid ) > return 0; Spurious change? > /* > @@ -2483,6 +2498,7 @@ static void do_trap_data_abort_guest(struct > cpu_user_regs *regs, > int rc; > mmio_info_t info; > uint8_t fsc = hsr.dabt.dfsc & ~FSC_LL_MASK; > + mfn_t mfn; > > info.dabt = dabt; > #ifdef CONFIG_ARM_32 > @@ -2496,6 +2512,11 @@ static void do_trap_data_abort_guest(struct > cpu_user_regs *regs, > else > { > rc = gva_to_ipa(info.gva, &info.gpa, GV2M_READ); > + /* > + * We may not be able to translate because someone is > + * playing with the Stage-2 page table of the domain. > + * Return to the guest. > + */ > if ( rc == -EFAULT ) > return; /* Try again */ > } > @@ -2519,11 +2540,26 @@ static void do_trap_data_abort_guest(struct > cpu_user_regs *regs, > break; > } > case FSC_FLT_TRANS: > + /* > + * Attempt first to emulate the MMIO has the data abort will ^ as > + * likely happen an emulated region. ^ on/in > + */ > if ( try_handle_mmio(regs, &info) ) > { > advance_pc(regs, hsr); > return; > } > + > + /* > + * The PT walk may have failed because someone was playing > + * with the Stage-2 page table. Walk the Stage-2 PT to check > + * if the entry exists. If it's the case, return to the guest > + */ > + mfn = p2m_lookup(current->domain, _gfn(paddr_to_pfn(info.gpa)), > NULL); > + if ( !mfn_eq(mfn, INVALID_MFN) ) > + return; > + > + break; > default: > gprintk(XENLOG_WARNING, "Unsupported DFSC: HSR=%#x DFSC=%#x\n", > hsr.bits, dabt.dfsc); > -- > 1.9.1 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |