Commit b69bcb13 authored by Vivian Wang's avatar Vivian Wang Committed by Paul Walmsley
Browse files

riscv: misaligned: Make enabling delegation depend on NONPORTABLE

The unaligned access emulation code in Linux has various deficiencies.
For example, it doesn't emulate vector instructions [1] [2], and doesn't
emulate KVM guest accesses. Therefore, requesting misaligned exception
delegation with SBI FWFT actually regresses vector instructions' and KVM
guests' behavior.

Until Linux can handle it properly, guard these sbi_fwft_set() calls
behind RISCV_SBI_FWFT_DELEGATE_MISALIGNED, which in turn depends on
NONPORTABLE. Those who are sure that this wouldn't be a problem can
enable this option, perhaps getting better performance.

The rest of the existing code proceeds as before, except as if
SBI_FWFT_MISALIGNED_EXC_DELEG is not available, to handle any remaining
address misaligned exceptions on a best-effort basis. The KVM SBI FWFT
implementation is also not touched, but it is disabled if the firmware
emulates unaligned accesses.

Cc: stable@vger.kernel.org
Fixes: cf5a8abc ("riscv: misaligned: request misaligned exception from SBI")
Reported-by: Songsong Zhang <U2FsdGVkX1@gmail.com> # KVM
Link: https://lore.kernel.org/linux-riscv/38ce44c1-08cf-4e3f-8ade-20da224f529c@iscas.ac.cn/ [1]
Link: https://lore.kernel.org/linux-riscv/b3cfcdac-0337-4db0-a611-258f2868855f@iscas.ac.cn/

 [2]
Signed-off-by: default avatarVivian Wang <wangruikang@iscas.ac.cn>
Acked-by: default avatarConor Dooley <conor.dooley@microchip.com>
Link: https://patch.msgid.link/20260401-riscv-misaligned-dont-delegate-v2-1-5014a288c097@iscas.ac.cn


Signed-off-by: default avatarPaul Walmsley <pjw@kernel.org>
parent 50da1c9c
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -937,6 +937,28 @@ config RISCV_VECTOR_MISALIGNED
	help
	  Enable detecting support for vector misaligned loads and stores.

config RISCV_SBI_FWFT_DELEGATE_MISALIGNED
	bool "Request firmware delegation of unaligned access exceptions"
	depends on RISCV_SBI
	depends on NONPORTABLE
	help
	  Use SBI FWFT to request delegation of load address misaligned and
	  store address misaligned exceptions, if possible, and prefer Linux
	  kernel emulation of these accesses to firmware emulation.

	  Unfortunately, Linux's emulation is still incomplete. Namely, it
	  currently does not handle vector instructions and KVM guest accesses.
	  On platforms where these accesses would have been handled by firmware,
	  enabling this causes unexpected kernel oopses, userspaces crashes and
	  KVM guest crashes. If you are sure that these are not a problem for
	  your platform, you can say Y here, which may improve performance.

	  Saying N here will not worsen emulation support for unaligned accesses
	  even in the case where the firmware also has incomplete support. It
	  simply keeps the firmware's emulation enabled.

	  If you don't know what to do here, say N.

choice
	prompt "Unaligned Accesses Support"
	default RISCV_PROBE_UNALIGNED_ACCESS
+1 −1
Original line number Diff line number Diff line
@@ -584,7 +584,7 @@ static int cpu_online_check_unaligned_access_emulated(unsigned int cpu)

static bool misaligned_traps_delegated;

#ifdef CONFIG_RISCV_SBI
#if defined(CONFIG_RISCV_SBI_FWFT_DELEGATE_MISALIGNED)

static int cpu_online_sbi_unaligned_setup(unsigned int cpu)
{