@samitouri / QOSamiQemu / commits / 1c88ab9e77

target/riscv: Use the tb->cs_base as the extend tb flags

We have more than 32-bits worth of state per TB, so use the tb->cs_base, which is otherwise unused for RISC-V, as the extend flag. Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com> Signed-off-by: Max Chou <max.chou@sifive.com> Message-ID: <20260402125234.1371897-6-max.chou@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Max Chou committed Apr 2, 2026 at 20:52 UTC 1c88ab9e77bdddc87a3ea0f1f2d3c1e0cd787e76
3 files changed +10 -1
include/exec/translation-block.h
+1
@@ -65,6 +65,7 @@ struct TranslationBlock {
65 * arm: an extension of tb->flags,
66 * s390x: instruction data for EXECUTE,
67 * sparc: the next pc of the instruction queue (for delay slots).
68 + * riscv: an extension of tb->flags,
69 */
70 uint64_t cs_base;
71
target/riscv/cpu.h
+3
@@ -703,6 +703,9 @@ FIELD(TB_FLAGS, BCFI_ENABLED, 28, 1)
703 FIELD(TB_FLAGS, PM_PMM, 29, 2)
704 FIELD(TB_FLAGS, PM_SIGNEXTEND, 31, 1)
705
706 +FIELD(EXT_TB_FLAGS, MISA_EXT, 0, 32)
707 +FIELD(EXT_TB_FLAGS, ALTFMT, 32, 1)
708 +
709 #ifdef TARGET_RISCV32
710 #define riscv_cpu_mxl(env) ((void)(env), MXL_RV32)
711 #else
target/riscv/tcg/tcg-cpu.c
+6 -1
@@ -104,6 +104,7 @@ static TCGTBCPUState riscv_get_tb_cpu_state(CPUState *cs)
104 RISCVCPU *cpu = env_archcpu(env);
105 RISCVExtStatus fs, vs;
106 uint32_t flags = 0;
107 + uint64_t ext_flags = 0;
108 bool pm_signext = riscv_cpu_virt_mem_enabled(env);
109
110 if (cpu->cfg.ext_zve32x) {
@@ -118,6 +119,7 @@ static TCGTBCPUState riscv_get_tb_cpu_state(CPUState *cs)
119
120 /* lmul encoded as in DisasContext::lmul */
121 int8_t lmul = sextract32(FIELD_EX64(env->vtype, VTYPE, VLMUL), 0, 3);
122 + uint8_t altfmt = FIELD_EX64(env->vtype, VTYPE, ALTFMT);
123 uint32_t vsew = FIELD_EX64(env->vtype, VTYPE, VSEW);
124 uint32_t vlmax = vext_get_vlmax(cpu->cfg.vlenb, vsew, lmul);
125 uint32_t maxsz = vlmax << vsew;
@@ -133,6 +135,7 @@ static TCGTBCPUState riscv_get_tb_cpu_state(CPUState *cs)
135 flags = FIELD_DP32(flags, TB_FLAGS, VMA,
136 FIELD_EX64(env->vtype, VTYPE, VMA));
137 flags = FIELD_DP32(flags, TB_FLAGS, VSTART_EQ_ZERO, env->vstart == 0);
138 + ext_flags = FIELD_DP64(ext_flags, EXT_TB_FLAGS, ALTFMT, altfmt);
139 } else {
140 flags = FIELD_DP32(flags, TB_FLAGS, VILL, 1);
141 }
@@ -189,10 +192,12 @@ static TCGTBCPUState riscv_get_tb_cpu_state(CPUState *cs)
192 flags = FIELD_DP32(flags, TB_FLAGS, PM_PMM, riscv_pm_get_pmm(env));
193 flags = FIELD_DP32(flags, TB_FLAGS, PM_SIGNEXTEND, pm_signext);
194
195 + ext_flags = FIELD_DP64(ext_flags, EXT_TB_FLAGS, MISA_EXT, env->misa_ext);
196 +
197 return (TCGTBCPUState){
198 .pc = env->xl == MXL_RV32 ? env->pc & UINT32_MAX : env->pc,
199 .flags = flags,
195 - .cs_base = env->misa_ext,
200 + .cs_base = ext_flags,
201 };
202 }
203