[PATCH v2] riscv: misaligned: Restore epc in error path
Andreas Schwab
schwab at suse.de
Mon May 11 00:53:08 PDT 2026
On Mai 09 2026, Zishun Yi wrote:
> diff --git a/arch/riscv/kernel/traps_misaligned.c b/arch/riscv/kernel/traps_misaligned.c
> index 2a27d3ff4ac6..24f898853bba 100644
> --- a/arch/riscv/kernel/traps_misaligned.c
> +++ b/arch/riscv/kernel/traps_misaligned.c
> @@ -307,13 +307,17 @@ static int handle_scalar_misaligned_load(struct pt_regs *regs)
> return -1;
> }
>
> - if (!IS_ENABLED(CONFIG_FPU) && fp)
> + if (!IS_ENABLED(CONFIG_FPU) && fp) {
> + regs->epc = epc;
> return -EOPNOTSUPP;
> + }
>
> val.data_u64 = 0;
> if (user_mode(regs)) {
> - if (copy_from_user(&val, (u8 __user *)addr, len))
> + if (copy_from_user(&val, (u8 __user *)addr, len)) {
> + regs->epc = epc;
> return -1;
> + }
> } else {
> memcpy(&val, (u8 *)addr, len);
> }
> @@ -409,12 +413,16 @@ static int handle_scalar_misaligned_store(struct pt_regs *regs)
> return -1;
> }
>
> - if (!IS_ENABLED(CONFIG_FPU) && fp)
> + if (!IS_ENABLED(CONFIG_FPU) && fp) {
> + regs->epc = epc;
> return -EOPNOTSUPP;
> + }
>
> if (user_mode(regs)) {
> - if (copy_to_user((u8 __user *)addr, &val, len))
> + if (copy_to_user((u8 __user *)addr, &val, len)) {
> + regs->epc = epc;
> return -1;
> + }
I think this is better handled by a common error exit.
--
Andreas Schwab, SUSE Labs, schwab at suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
More information about the linux-riscv
mailing list