Re: [PATCH v3 11/17] psci: use __pa_function for cpu_resume
From: Mark Rutland <mark.rutland@arm.com>
Date: 2021-03-25 10:24:45
Also in:
bpf, linux-arch, linux-hardening, linux-kbuild, linux-pci, lkml
On Tue, Mar 23, 2021 at 01:39:40PM -0700, Sami Tolvanen wrote:
quoted hunk ↗ jump to hunk
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 __pa_function instead to get the address to cpu_resume. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Kees Cook <redacted> --- drivers/firmware/psci/psci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index f5fc429cae3f..facd3cce3244 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c@@ -326,7 +326,7 @@ static int psci_suspend_finisher(unsigned long state) { u32 power_state = state; - return psci_ops.cpu_suspend(power_state, __pa_symbol(cpu_resume)); + return psci_ops.cpu_suspend(power_state, __pa_function(cpu_resume));
As mentioned on the patch adding __pa_function(), I'd prefer to keep the whatever->phys conversion separate from the CFI removal, since we have a number of distinct virtual address ranges with differing conversions to phys, and I don't think it's clear that __pa_function() only works for kernel symbols (rather than module addresses, linear map addresses, etc). Other than that, I'm happy in principle with wrapping this. I suspect that for clarity we should add an intermediate variable, e.g. | phys_addr_t pa_cpu_resume = pa_symbol(function_nocfi(cpu_resume)); | return psci_ops.cpu_suspend(power_state, pa_cpu_resume) Thanks, Mark.
quoted hunk ↗ jump to hunk
} int psci_cpu_suspend_enter(u32 state)@@ -345,7 +345,7 @@ int psci_cpu_suspend_enter(u32 state) static int psci_system_suspend(unsigned long unused) { return invoke_psci_fn(PSCI_FN_NATIVE(1_0, SYSTEM_SUSPEND), - __pa_symbol(cpu_resume), 0, 0); + __pa_function(cpu_resume), 0, 0); } static int psci_system_suspend_enter(suspend_state_t state)-- 2.31.0.291.g576ba9dcdaf-goog
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel