riscv: misaligned: add a function to check misalign trap delegability

Checking for the delegability of the misaligned access trap is needed
for the KVM FWFT extension implementation. Add a function to get the
delegability of the misaligned trap exception.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Tested-by: Charlie Jenkins <charlie@rivosinc.com>
Link: https://lore.kernel.org/r/20250523101932.1594077-11-cleger@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@dabbelt.com>
This commit is contained in:
Clément Léger 2025-05-23 12:19:27 +02:00 committed by Palmer Dabbelt
parent 4eaaa65e30
commit 7977448bf3
No known key found for this signature in database
GPG Key ID: 2E1319F35FBB1889
2 changed files with 21 additions and 2 deletions

View File

@ -81,6 +81,12 @@ static inline bool unaligned_ctl_available(void)
#if defined(CONFIG_RISCV_MISALIGNED)
DECLARE_PER_CPU(long, misaligned_access_speed);
bool misaligned_traps_can_delegate(void);
#else
static inline bool misaligned_traps_can_delegate(void)
{
return false;
}
#endif
bool __init check_vector_unaligned_access_emulated_all_cpus(void);

View File

@ -724,10 +724,10 @@ static int cpu_online_check_unaligned_access_emulated(unsigned int cpu)
}
#endif
#ifdef CONFIG_RISCV_SBI
static bool misaligned_traps_delegated;
#ifdef CONFIG_RISCV_SBI
static int cpu_online_sbi_unaligned_setup(unsigned int cpu)
{
if (sbi_fwft_set(SBI_FWFT_MISALIGNED_EXC_DELEG, 1, 0) &&
@ -763,6 +763,7 @@ static int cpu_online_sbi_unaligned_setup(unsigned int cpu __always_unused)
{
return 0;
}
#endif
int cpu_online_unaligned_access_init(unsigned int cpu)
@ -775,3 +776,15 @@ int cpu_online_unaligned_access_init(unsigned int cpu)
return cpu_online_check_unaligned_access_emulated(cpu);
}
bool misaligned_traps_can_delegate(void)
{
/*
* Either we successfully requested misaligned traps delegation for all
* CPUs, or the SBI does not implement the FWFT extension but delegated
* the exception by default.
*/
return misaligned_traps_delegated ||
all_cpus_unaligned_scalar_access_emulated();
}
EXPORT_SYMBOL_GPL(misaligned_traps_can_delegate);