@samitouri / QOSamiQemu / commits / f1d78a5eae

target/arm: add MTX to MTEDESC and DisasContext

Add fields for MTX to DisasContext and MTEDESC. With MTE4, the fields will be needed in future patches that alter tag check, tag load and tag store behavior. Signed-off-by: Gabriel Brookman <brookmangabriel@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260529-feat-mte4-v7-6-ccbd3c14eb3c@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Gabriel Brookman committed May 29, 2026 at 12:52 UTC f1d78a5eae0d1dc984e1e9adce81b89f7ab8dc78
4 files changed +11
target/arm/cpu.h
+1
@@ -2536,6 +2536,7 @@ FIELD(TBFLAG_A64, GCSSTR_EL, 43, 2)
2536 FIELD(TBFLAG_A64, FPMR_EL, 45, 2)
2537 FIELD(TBFLAG_A64, MTE_STORE_ONLY, 47, 1)
2538 FIELD(TBFLAG_A64, MTE0_STORE_ONLY, 48, 1)
2539 +FIELD(TBFLAG_A64, MTX, 49, 2)
2540
2541 /*
2542 * Helpers for using the above. Note that only the A64 accessors use
target/arm/tcg/hflags.c
+2
@@ -500,6 +500,8 @@ static CPUARMTBFlags rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
500 }
501 /* Cache TCMA as well as TBI. */
502 DP_TBFLAG_A64(flags, TCMA, aa64_va_parameter_tcma(tcr, mmu_idx));
503 + /* Cache MTX. */
504 + DP_TBFLAG_A64(flags, MTX, mtx);
505 }
506
507 if (cpu_isar_feature(aa64_gcs, env_archcpu(env))) {
target/arm/tcg/translate-a64.c
+7
@@ -312,6 +312,7 @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr,
312 desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
313 desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
314 desc = FIELD_DP32(desc, MTEDESC, ALIGN, memop_alignment_bits(memop));
315 + desc = FIELD_DP32(desc, MTEDESC, MTX, s->mtx);
316 desc = FIELD_DP32(desc, MTEDESC, SIZEM1, memop_size(memop) - 1);
317
318 ret = tcg_temp_new_i64();
@@ -345,6 +346,7 @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write,
346 desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
347 desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
348 desc = FIELD_DP32(desc, MTEDESC, ALIGN, memop_alignment_bits(single_mop));
349 + desc = FIELD_DP32(desc, MTEDESC, MTX, s->mtx);
350 desc = FIELD_DP32(desc, MTEDESC, SIZEM1, total_size - 1);
351
352 ret = tcg_temp_new_i64();
@@ -3093,6 +3095,7 @@ static void handle_sys(DisasContext *s, bool isread,
3095 desc = FIELD_DP32(desc, MTEDESC, MIDX, get_mem_index(s));
3096 desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid);
3097 desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
3098 + desc = FIELD_DP32(desc, MTEDESC, MTX, s->mtx);
3099
3100 tcg_rt = tcg_temp_new_i64();
3101 gen_helper_mte_check_zva(tcg_rt, tcg_env,
@@ -4960,6 +4963,7 @@ static bool do_SET(DisasContext *s, arg_set *a, bool is_epilogue,
4963 desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid);
4964 desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
4965 desc = FIELD_DP32(desc, MTEDESC, WRITE, true);
4966 + desc = FIELD_DP32(desc, MTEDESC, MTX, s->mtx);
4967 /* SIZEM1 and ALIGN we leave 0 (byte write) */
4968 }
4969 /* The helper function always needs the memidx even with MTE disabled */
@@ -5014,11 +5018,13 @@ static bool do_CPY(DisasContext *s, arg_cpy *a, bool is_epilogue, CpyFn fn)
5018 if (s->mte_active[runpriv]) {
5019 rdesc = FIELD_DP32(rdesc, MTEDESC, TBI, s->tbid);
5020 rdesc = FIELD_DP32(rdesc, MTEDESC, TCMA, s->tcma);
5021 + rdesc = FIELD_DP32(rdesc, MTEDESC, MTX, s->mtx);
5022 }
5023 if (s->mte_active[wunpriv]) {
5024 wdesc = FIELD_DP32(wdesc, MTEDESC, TBI, s->tbid);
5025 wdesc = FIELD_DP32(wdesc, MTEDESC, TCMA, s->tcma);
5026 wdesc = FIELD_DP32(wdesc, MTEDESC, WRITE, true);
5027 + wdesc = FIELD_DP32(wdesc, MTEDESC, MTX, s->mtx);
5028 }
5029 /* The helper function needs these parts of the descriptor regardless */
5030 rdesc = FIELD_DP32(rdesc, MTEDESC, MIDX, rmemidx);
@@ -10809,6 +10815,7 @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase,
10815 dc->mte_active[1] = EX_TBFLAG_A64(tb_flags, MTE0_ACTIVE);
10816 dc->mte_store_only[0] = EX_TBFLAG_A64(tb_flags, MTE_STORE_ONLY);
10817 dc->mte_store_only[1] = EX_TBFLAG_A64(tb_flags, MTE0_STORE_ONLY);
10818 + dc->mtx = EX_TBFLAG_A64(tb_flags, MTX);
10819 dc->pstate_sm = EX_TBFLAG_A64(tb_flags, PSTATE_SM);
10820 dc->pstate_za = EX_TBFLAG_A64(tb_flags, PSTATE_ZA);
10821 dc->sme_trap_nonstreaming = EX_TBFLAG_A64(tb_flags, SME_TRAP_NONSTREAMING);
target/arm/tcg/translate.h
+1
@@ -82,6 +82,7 @@ typedef struct DisasContext {
82 uint8_t tbii; /* TBI1|TBI0 for insns */
83 uint8_t tbid; /* TBI1|TBI0 for data */
84 uint8_t tcma; /* TCMA1|TCMA0 for MTE */
85 + uint8_t mtx; /* MTX1|MTX0 for MTE */
86 bool ns; /* Use non-secure CPREG bank on access */
87 int fp_excp_el; /* FP exception EL or 0 if enabled */
88 int sve_excp_el; /* SVE exception EL or 0 if enabled */