[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