@samitouri / QOSamiQemu / commits / 8d8cb66366

target/loongarch: Use sys_state in cpu_helper.c when accessing CSR registers

When accessing CSR register in file cpu_helper.c, use sys_state rather than env. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com> Tested-by: Song Gao <gaosong@loongson.cn> Message-ID: <20260605082552.175336-4-maobibo@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn>

Bibo Mao committed Jun 5, 2026 at 16:25 UTC 8d8cb6636634cf12bd9d46d4c7787b8e6ef6d2f3
1 file changed +22 -19
target/loongarch/cpu_helper.c
+22 -19
@@ -20,27 +20,29 @@
20 void get_dir_base_width(CPULoongArchState *env, uint64_t *dir_base,
21 uint64_t *dir_width, unsigned int level)
22 {
23 + CPUSysState *sys = env_sys(env);
24 +
25 switch (level) {
26 case 1:
25 - *dir_base = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, DIR1_BASE);
26 - *dir_width = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, DIR1_WIDTH);
27 + *dir_base = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, DIR1_BASE);
28 + *dir_width = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, DIR1_WIDTH);
29 break;
30 case 2:
29 - *dir_base = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, DIR2_BASE);
30 - *dir_width = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, DIR2_WIDTH);
31 + *dir_base = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, DIR2_BASE);
32 + *dir_width = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, DIR2_WIDTH);
33 break;
34 case 3:
33 - *dir_base = FIELD_EX64(env->CSR_PWCH, CSR_PWCH, DIR3_BASE);
34 - *dir_width = FIELD_EX64(env->CSR_PWCH, CSR_PWCH, DIR3_WIDTH);
35 + *dir_base = FIELD_EX64(sys->CSR_PWCH, CSR_PWCH, DIR3_BASE);
36 + *dir_width = FIELD_EX64(sys->CSR_PWCH, CSR_PWCH, DIR3_WIDTH);
37 break;
38 case 4:
37 - *dir_base = FIELD_EX64(env->CSR_PWCH, CSR_PWCH, DIR4_BASE);
38 - *dir_width = FIELD_EX64(env->CSR_PWCH, CSR_PWCH, DIR4_WIDTH);
39 + *dir_base = FIELD_EX64(sys->CSR_PWCH, CSR_PWCH, DIR4_BASE);
40 + *dir_width = FIELD_EX64(sys->CSR_PWCH, CSR_PWCH, DIR4_WIDTH);
41 break;
42 default:
43 /* level may be zero for ldpte */
42 - *dir_base = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, PTBASE);
43 - *dir_width = FIELD_EX64(env->CSR_PWCL, CSR_PWCL, PTWIDTH);
44 + *dir_base = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, PTBASE);
45 + *dir_width = FIELD_EX64(sys->CSR_PWCL, CSR_PWCL, PTWIDTH);
46 break;
47 }
48 }
@@ -156,13 +158,13 @@ TLBRet loongarch_ptw(CPULoongArchState *env, MMUContext *context,
158 vaddr address;
159 TLBRet ret;
160 MemTxResult ret1;
159 -
161 + CPUSysState *sys = env_sys(env);
162
163 address = context->addr;
164 if ((address >> 63) & 0x1) {
163 - base = env->CSR_PGDH;
165 + base = sys->CSR_PGDH;
166 } else {
165 - base = env->CSR_PGDL;
167 + base = sys->CSR_PGDL;
168 }
169 base &= palen_mask;
170
@@ -315,8 +317,9 @@ TLBRet get_physical_address(CPULoongArchState *env, MMUContext *context,
317 int kernel_mode = mmu_idx == MMU_KERNEL_IDX;
318 uint32_t plv, base_c, base_v;
319 int64_t addr_high;
318 - uint8_t da = FIELD_EX64(env->CSR_CRMD, CSR_CRMD, DA);
319 - uint8_t pg = FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PG);
320 + CPUSysState *sys = env_sys(env);
321 + uint8_t da = FIELD_EX64(sys->CSR_CRMD, CSR_CRMD, DA);
322 + uint8_t pg = FIELD_EX64(sys->CSR_CRMD, CSR_CRMD, PG);
323 vaddr address;
324
325 /* Check PG and DA */
@@ -337,12 +340,12 @@ TLBRet get_physical_address(CPULoongArchState *env, MMUContext *context,
340 /* Check direct map window */
341 for (int i = 0; i < 4; i++) {
342 if (is_la64(env)) {
340 - base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW_64, VSEG);
343 + base_c = FIELD_EX64(sys->CSR_DMW[i], CSR_DMW_64, VSEG);
344 } else {
342 - base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW_32, VSEG);
345 + base_c = FIELD_EX64(sys->CSR_DMW[i], CSR_DMW_32, VSEG);
346 }
344 - if ((plv & env->CSR_DMW[i]) && (base_c == base_v)) {
345 - context->physical = dmw_va2pa(env, address, env->CSR_DMW[i]);
347 + if ((plv & sys->CSR_DMW[i]) && (base_c == base_v)) {
348 + context->physical = dmw_va2pa(env, address, sys->CSR_DMW[i]);
349 context->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
350 context->mmu_index = MMU_DA_IDX;
351 return TLBRET_MATCH;