riscv: uaccess: Only restore the CSR_STATUS SUM bit
authorCyril Bur <cyrilbur@tenstorrent.com>
Mon, 2 Jun 2025 12:15:43 +0000 (12:15 +0000)
committerPalmer Dabbelt <palmer@dabbelt.com>
Thu, 5 Jun 2025 21:03:17 +0000 (14:03 -0700)
During switch to csrs will OR the value of the register into the
corresponding csr. In this case we're only interested in restoring the
SUM bit not the entire register.

Signed-off-by: Cyril Bur <cyrilbur@tenstorrent.com>
Link: https://lore.kernel.org/r/20250522160954.429333-1-cyrilbur@tenstorrent.com
Co-developed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Fixes: 788aa64c01f1 ("riscv: save the SR_SUM status over switches")
Link: https://lore.kernel.org/r/20250602121543.1544278-1-alexghiti@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@dabbelt.com>
arch/riscv/include/asm/processor.h
arch/riscv/kernel/asm-offsets.c
arch/riscv/kernel/entry.S

index 8111250f3c1b6ba7e137473e37818711f1a9a13b..24d3af4d3807e37396744ef26533ac4661abcb4f 100644 (file)
@@ -110,7 +110,7 @@ struct thread_struct {
        struct __riscv_d_ext_state fstate;
        unsigned long bad_cause;
        unsigned long envcfg;
-       unsigned long status;
+       unsigned long sum;
        u32 riscv_v_flags;
        u32 vstate_ctrl;
        struct __riscv_v_ext_state vstate;
index 9420ec6a50fd0fe27836aeb646aee7d121141dad..6e8c0d6feae9e9b79e529fc86e3dd42467fea6ad 100644 (file)
@@ -34,7 +34,7 @@ void asm_offsets(void)
        OFFSET(TASK_THREAD_S9, task_struct, thread.s[9]);
        OFFSET(TASK_THREAD_S10, task_struct, thread.s[10]);
        OFFSET(TASK_THREAD_S11, task_struct, thread.s[11]);
-       OFFSET(TASK_THREAD_STATUS, task_struct, thread.status);
+       OFFSET(TASK_THREAD_SUM, task_struct, thread.sum);
 
        OFFSET(TASK_TI_CPU, task_struct, thread_info.cpu);
        OFFSET(TASK_TI_PREEMPT_COUNT, task_struct, thread_info.preempt_count);
@@ -347,8 +347,8 @@ void asm_offsets(void)
                  offsetof(struct task_struct, thread.s[11])
                - offsetof(struct task_struct, thread.ra)
        );
-       DEFINE(TASK_THREAD_STATUS_RA,
-                 offsetof(struct task_struct, thread.status)
+       DEFINE(TASK_THREAD_SUM_RA,
+                 offsetof(struct task_struct, thread.sum)
                - offsetof(struct task_struct, thread.ra)
        );
 
index 00bd0de9faa28b20e0e12ec76e8f2a9d1e17785c..a49e19ce3a975ec8c441774b5914475a33adf54e 100644 (file)
@@ -399,14 +399,15 @@ SYM_FUNC_START(__switch_to)
        REG_S s11, TASK_THREAD_S11_RA(a3)
 
        /* save the user space access flag */
-       li    s0, SR_SUM
-       csrr  s1, CSR_STATUS
-       REG_S s1, TASK_THREAD_STATUS_RA(a3)
+       csrr  s0, CSR_STATUS
+       REG_S s0, TASK_THREAD_SUM_RA(a3)
 
        /* Save the kernel shadow call stack pointer */
        scs_save_current
        /* Restore context from next->thread */
-       REG_L s0,  TASK_THREAD_STATUS_RA(a4)
+       REG_L s0,  TASK_THREAD_SUM_RA(a4)
+       li    s1,  SR_SUM
+       and   s0,  s0, s1
        csrs  CSR_STATUS, s0
        REG_L ra,  TASK_THREAD_RA_RA(a4)
        REG_L sp,  TASK_THREAD_SP_RA(a4)