Skip to content

Commit 167d0da

Browse files
samitolvanenkees
authored andcommitted
psci: use function_nocfi for cpu_resume
With CONFIG_CFI_CLANG, the compiler replaces function pointers with jump table addresses, which results in __pa_symbol returning the physical address of the jump table entry. As the jump table contains an immediate jump to an EL1 virtual address, this typically won't work as intended. Use function_nocfi to get the actual address of cpu_resume. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20210408182843.1754385-12-samitolvanen@google.com
1 parent 6c4df54 commit 167d0da

1 file changed

Lines changed: 5 additions & 2 deletions

File tree

drivers/firmware/psci/psci.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,9 @@ static int __init psci_features(u32 psci_func_id)
325325
static int psci_suspend_finisher(unsigned long state)
326326
{
327327
u32 power_state = state;
328+
phys_addr_t pa_cpu_resume = __pa_symbol(function_nocfi(cpu_resume));
328329

329-
return psci_ops.cpu_suspend(power_state, __pa_symbol(cpu_resume));
330+
return psci_ops.cpu_suspend(power_state, pa_cpu_resume);
330331
}
331332

332333
int psci_cpu_suspend_enter(u32 state)
@@ -344,8 +345,10 @@ int psci_cpu_suspend_enter(u32 state)
344345

345346
static int psci_system_suspend(unsigned long unused)
346347
{
348+
phys_addr_t pa_cpu_resume = __pa_symbol(function_nocfi(cpu_resume));
349+
347350
return invoke_psci_fn(PSCI_FN_NATIVE(1_0, SYSTEM_SUSPEND),
348-
__pa_symbol(cpu_resume), 0, 0);
351+
pa_cpu_resume, 0, 0);
349352
}
350353

351354
static int psci_system_suspend_enter(suspend_state_t state)

0 commit comments

Comments
 (0)