mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
riscv: disable SUM in the exception handler
The SUM bit is enabled at the beginning of the copy_{to,from}_user and {get,put}_user routines, and cleared before they return. But these user copy helper can be interrupted by exceptions, in which case the SUM bit will remain set, which leads to elevated privileges for the code running in exception context, as that can now access userspace address space unconditionally. This frequently happens when the user copy routines access freshly allocated user memory that hasn't been faulted in, and a pagefault needs to be taken before the user copy routines can continue. Fix this by unconditionally clearing SUM when the exception handler is called - the restore code will automatically restore it based on the saved value. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
This commit is contained in:
parent
509009ccfa
commit
fe9b842f72
1 changed files with 6 additions and 3 deletions
|
@ -78,10 +78,13 @@ _save_context:
|
||||||
REG_S x31, PT_T6(sp)
|
REG_S x31, PT_T6(sp)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable FPU to detect illegal usage of
|
* Disable user-mode memory access as it should only be set in the
|
||||||
* floating point in kernel space
|
* actual user copy routines.
|
||||||
|
*
|
||||||
|
* Disable the FPU to detect illegal usage of floating point in kernel
|
||||||
|
* space.
|
||||||
*/
|
*/
|
||||||
li t0, SR_FS
|
li t0, SR_SUM | SR_FS
|
||||||
|
|
||||||
REG_L s0, TASK_TI_USER_SP(tp)
|
REG_L s0, TASK_TI_USER_SP(tp)
|
||||||
csrrc s1, sstatus, t0
|
csrrc s1, sstatus, t0
|
||||||
|
|
Loading…
Reference in a new issue