[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN v9 3/4] xen/arm64: io: Handle the abort due to access to stage1 translation table
On Tue, 1 Mar 2022, Ayan Kumar Halder wrote: > If the abort was caused due to access to stage1 translation table, Xen > will assume that the stage1 translation table is in the non MMIO region. > It will try to resolve the translation fault. If it succeeds, it will > return to the guest to retry the instruction. If not, then it means > that the table is in MMIO region which is not expected by Xen. Thus, > Xen will forward the abort to the guest. > > Signed-off-by: Ayan Kumar Halder <ayankuma@xxxxxxxxxx> > --- > > Changelog :- > > v1..v8 - NA > > v9 - 1. Extracted this change from "[XEN v8 2/2] xen/arm64: io: Support > instructions (for which ISS is not..." into a separate patch of its own. > The reason being this is an existing bug in the codebase. > > xen/arch/arm/io.c | 11 +++++++++++ > xen/arch/arm/traps.c | 12 +++++++++++- > 2 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c > index bea69ffb08..ebcb8ed548 100644 > --- a/xen/arch/arm/io.c > +++ b/xen/arch/arm/io.c > @@ -128,6 +128,17 @@ void try_decode_instruction(const struct cpu_user_regs > *regs, > return; > } > > + /* > + * At this point, we know that the stage1 translation table is in the > MMIO > + * region. This is not expected by Xen and thus it forwards the abort to > the > + * guest. > + */ > + if ( info->dabt.s1ptw ) > + { > + info->dabt_instr.state = INSTR_ERROR; > + return; > + } > + > /* > * Armv8 processor does not provide a valid syndrome for decoding some > * instructions. So in order to process these instructions, Xen must > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index 120c971b0f..e491ca15d7 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -1923,6 +1923,7 @@ static void do_trap_stage2_abort_guest(struct > cpu_user_regs *regs, > bool is_data = (hsr.ec == HSR_EC_DATA_ABORT_LOWER_EL); > mmio_info_t info; > enum io_state state; > + bool check_mmio_region = true; > > /* > * If this bit has been set, it means that this stage-2 abort is caused > @@ -1987,7 +1988,16 @@ static void do_trap_stage2_abort_guest(struct > cpu_user_regs *regs, > */ > if ( !is_data || !info.dabt.valid ) > { > - if ( check_p2m(is_data, gpa) ) > + /* > + * If the translation fault was caused due to access to stage 1 > + * translation table, then we try to set the translation table > entry > + * for page1 translation table (assuming that it is in the non > mmio ^ stage1 Do you mean to say maybe: If the translation fault was caused by an access to stage 1 translation table, then no need to change the stage 2 p2m. ? > + * region). > + */ > + if ( xabt.s1ptw ) > + check_mmio_region = false; > + > + if ( check_p2m((is_data && check_mmio_region), gpa) ) > return; > > /* > -- > 2.17.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |