|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN v9 4/4] xen/arm64: io: Handle data abort due to cache maintenance instructions
On Tue, 1 Mar 2022, Ayan Kumar Halder wrote:
> When the data abort is caused due to cache maintenance for an address,
> there are two scenarios:-
>
> 1. Address belonging to a non emulated region - For this, Xen should
> set the corresponding bit in the translation table entry to valid and
> return to the guest to retry the instruction. This can happen sometimes
> as Xen need to set the translation table entry to invalid. (for eg
> 'Break-Before-Make' sequence).
>
> 2. Address belongs to an emulated region - Xen should ignore the
> instruction (ie increment the PC) and return to the guest.
>
> We try to deal with scenario#1, by invoking check_p2m(). If this is
> unsuccessful, then we assume scenario#2.
>
> Signed-off-by: Ayan Kumar Halder <ayankuma@xxxxxxxxxx>
Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
>
> Changelog:-
>
> v1...v8 - NA
>
> v9 - Extracted this change from "[XEN v7 2/2] xen/arm64: io: Support
> instructions (for which ISS is not ..." into a separate patch of its
> own. The reason being this addresses an existing bug in the codebase.
>
> xen/arch/arm/include/asm/mmio.h | 3 ++-
> xen/arch/arm/io.c | 11 +++++++++++
> xen/arch/arm/traps.c | 6 ++++++
> 3 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/xen/arch/arm/include/asm/mmio.h b/xen/arch/arm/include/asm/mmio.h
> index ef2c57a2d5..75d362d5f5 100644
> --- a/xen/arch/arm/include/asm/mmio.h
> +++ b/xen/arch/arm/include/asm/mmio.h
> @@ -34,7 +34,8 @@ enum instr_decode_state
> * Instruction is decoded successfully. It is a ldr/str post indexing
> * instruction.
> */
> - INSTR_LDR_STR_POSTINDEXING
> + INSTR_LDR_STR_POSTINDEXING,
> + INSTR_IGNORE /* Instruction is ignored */
> };
>
> typedef struct
> diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c
> index ebcb8ed548..7e9dd4bb08 100644
> --- a/xen/arch/arm/io.c
> +++ b/xen/arch/arm/io.c
> @@ -139,6 +139,17 @@ void try_decode_instruction(const struct cpu_user_regs
> *regs,
> return;
> }
>
> + /*
> + * When the data abort is caused due to cache maintenance, Xen should
> ignore
> + * this instruction as the cache maintenance was caused on an address
> belonging
> + * to the emulated region.
> + */
> + if ( info->dabt.cache )
> + {
> + info->dabt_instr.state = INSTR_IGNORE;
> + 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 e491ca15d7..5879640b73 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -2011,6 +2011,12 @@ static void do_trap_stage2_abort_guest(struct
> cpu_user_regs *regs,
>
> try_decode_instruction(regs, &info);
>
> + if ( info.dabt_instr.state == INSTR_IGNORE )
> + {
> + advance_pc(regs, hsr);
> + return;
> + }
> +
> /*
> * If Xen could not decode the instruction or encountered an error
> * while decoding, then it should forward the abort to the guest.
> --
> 2.17.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |