[PATCH v2 0/3] riscv: misaligned: fix misaligned accesses handling in put/get_user()
Clément Léger
cleger at rivosinc.com
Mon Jun 2 12:39:13 PDT 2025
While debugging a few problems with the misaligned access kselftest,
Alexandre discovered some crash with the current code. Indeed, some
misaligned access was done by the kernel using put_user(). This
was resulting in trap and a kernel crash since. The path was the
following:
user -> kernel -> access to user memory -> misaligned trap -> trap ->
kernel -> misaligned handling -> memcpy -> crash due to failed page fault
while in interrupt disabled section.
Last discussion about kernel misaligned handling and interrupt reenabling
were actually not to reenable interrupt when handling misaligned access
being done by kernel. The best solution being not to do any misaligned
accesses to userspace memory, we considered a few options:
- Remove any call to put/get_user() potentially doing misaligned
accesses
- Do not do any misaligned accesses in put/get_user() itself
The second solution was the one chosen as there are too many callsites to
put/get_user() that could potentially do misaligned accesses. We tried
two approaches for that, either split access in two aligned accesses
(and do RMW for put_user()) or call copy_from/to_user() which does not
do any misaligned accesses. The later one was the simpler to implement
(although the performances are probably lower than split aligned
accesses but still way better than doing misaligned access emulation)
and allows to support what we wanted.
These commits are based on top of Alex dev/alex/get_user_misaligned_v1
branch.
---
v2:
- Use __inttype instead of unsigned long for pointer cast
- Add Alex patch to make unsafe func use existing assembly.
- Add missing EXPORT_SYMBOL(__asm_copy_to_user_sum_enabled)
Alexandre Ghiti (1):
riscv: make unsafe user copy routines use existing assembly routines
Clément Léger (2):
riscv: process: use unsigned int instead of unsigned long for
put_user()
riscv: uaccess: do not do misaligned accesses in get/put_user()
arch/riscv/include/asm/asm-prototypes.h | 2 +-
arch/riscv/include/asm/uaccess.h | 48 +++++++++++-------------
arch/riscv/kernel/process.c | 2 +-
arch/riscv/lib/riscv_v_helpers.c | 11 ++++--
arch/riscv/lib/uaccess.S | 50 +++++++++++++++++--------
arch/riscv/lib/uaccess_vector.S | 15 ++++++--
6 files changed, 78 insertions(+), 50 deletions(-)
--
2.49.0
More information about the linux-riscv
mailing list