mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
target/arm: Report VNCR_EL2 based faults correctly
If FEAT_NV2 redirects a system register access to a memory offset from VNCR_EL2, that access might fault. In this case we need to report the correct syndrome information: * Data Abort, from same-EL * no ISS information * the VNCR bit (bit 13) is set and the exception must be taken to EL2. Save an appropriate syndrome template when generating code; we can then use that to: * select the right target EL * reconstitute a correct final syndrome for the data abort * report the right syndrome if we take a FEAT_RME granule protection fault on the VNCR-based write Note that because VNCR is bit 13, we must start keeping bit 13 in template syndromes, by adjusting ARM_INSN_START_WORD2_SHIFT. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Miguel Luis <miguel.luis@oracle.com>
This commit is contained in:
parent
daf9b4a00f
commit
674e534527
4 changed files with 47 additions and 8 deletions
|
@ -2294,6 +2294,7 @@ static void handle_sys(DisasContext *s, bool isread,
|
|||
MemOp mop = MO_64 | MO_ALIGN | MO_ATOM_IFALIGN;
|
||||
ARMMMUIdx armmemidx = s->nv2_mem_e20 ? ARMMMUIdx_E20_2 : ARMMMUIdx_E2;
|
||||
int memidx = arm_to_core_mmu_idx(armmemidx);
|
||||
uint32_t syn;
|
||||
|
||||
mop |= (s->nv2_mem_be ? MO_BE : MO_LE);
|
||||
|
||||
|
@ -2301,6 +2302,9 @@ static void handle_sys(DisasContext *s, bool isread,
|
|||
tcg_gen_addi_i64(ptr, ptr,
|
||||
(ri->nv2_redirect_offset & ~NV2_REDIR_FLAG_MASK));
|
||||
tcg_rt = cpu_reg(s, rt);
|
||||
|
||||
syn = syn_data_abort_vncr(0, !isread, 0);
|
||||
disas_set_insn_syndrome(s, syn);
|
||||
if (isread) {
|
||||
tcg_gen_qemu_ld_i64(tcg_rt, ptr, memidx, mop);
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue