]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
target/loongarch: Fix page size set issue with CSR_STLBPS
authorBibo Mao <maobibo@loongson.cn>
Wed, 3 Sep 2025 03:17:56 +0000 (11:17 +0800)
committerBibo Mao <maobibo@loongson.cn>
Sun, 28 Sep 2025 08:10:34 +0000 (16:10 +0800)
When modify register CSR_STLBPS, the page size should come from
input parameter rather than old value.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
target/loongarch/cpu-csr.h
target/loongarch/tcg/csr_helper.c

index 0834e91f30e3bfcfd894f8e7e1e49e930f7025bb..1a311bf06a5e91dea0c50eee972e9c15ae523df3 100644 (file)
@@ -106,6 +106,7 @@ FIELD(CSR_PWCH, DIR4_WIDTH, 18, 6)
 
 #define LOONGARCH_CSR_STLBPS         0x1e /* Stlb page size */
 FIELD(CSR_STLBPS, PS, 0, 5)
+FIELD(CSR_STLBPS, RESERVE, 5, 27)
 
 #define LOONGARCH_CSR_RVACFG         0x1f /* Reduced virtual address config */
 FIELD(CSR_RVACFG, RBITS, 0, 4)
index 0d99e2c92b63600688228aef8e872b2d3268f2a3..eb60fefa826fc2f492ef0b7b10d1491a92b93a58 100644 (file)
@@ -26,13 +26,14 @@ target_ulong helper_csrwr_stlbps(CPULoongArchState *env, target_ulong val)
      * The real hardware only supports the min tlb_ps is 12
      * tlb_ps=0 may cause undefined-behavior.
      */
-    uint8_t tlb_ps = FIELD_EX64(env->CSR_STLBPS, CSR_STLBPS, PS);
+    uint8_t tlb_ps = FIELD_EX64(val, CSR_STLBPS, PS);
     if (!check_ps(env, tlb_ps)) {
         qemu_log_mask(LOG_GUEST_ERROR,
                       "Attempted set ps %d\n", tlb_ps);
     } else {
         /* Only update PS field, reserved bit keeps zero */
-        env->CSR_STLBPS = FIELD_DP64(old_v, CSR_STLBPS, PS, tlb_ps);
+        val = FIELD_DP64(val, CSR_STLBPS, RESERVE, 0);
+        env->CSR_STLBPS = val;
     }
 
     return old_v;