Unverified Commit 265d6aba authored by Cyril Bur's avatar Cyril Bur Committed by Palmer Dabbelt
Browse files

riscv: uaccess: Only restore the CSR_STATUS SUM bit



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: default avatarCyril Bur <cyrilbur@tenstorrent.com>
Link: https://lore.kernel.org/r/20250522160954.429333-1-cyrilbur@tenstorrent.com


Co-developed-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Fixes: 788aa64c ("riscv: save the SR_SUM status over switches")
Link: https://lore.kernel.org/r/20250602121543.1544278-1-alexghiti@rivosinc.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@dabbelt.com>
parent 2670a39b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+3 −3
Original line number Diff line number Diff line
@@ -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)
	);

+5 −4
Original line number Diff line number Diff line
@@ -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)