diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c index 0ec0dc5..abd13dc 100644 --- a/arch/arm64/kernel/psci.c +++ b/arch/arm64/kernel/psci.c @@ -115,9 +115,14 @@ static void psci_power_state_unpack(u32 power_state, * The following two functions are invoked via the invoke_psci_fn pointer * and will not be inlined, allowing us to piggyback on the AAPCS. */ -static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, - u64 arg2) +static noinline int __invoke_psci_fn_hvc(u64 _function_id, u64 _arg0, + u64 _arg1, u64 _arg2) { + register u64 function_id asm("x0") = _function_id; + register u64 arg0 asm("x1") = _arg0; + register u64 arg1 asm("x2") = _arg1; + register u64 arg2 asm("x3") = _arg2; + asm volatile( __asmeq("%0", "x0") __asmeq("%1", "x1") @@ -130,9 +135,14 @@ static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, return function_id; } -static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, - u64 arg2) +static noinline int __invoke_psci_fn_smc(u64 _function_id, u64 _arg0, + u64 _arg1, u64 _arg2) { + register u64 function_id asm("x0") = _function_id; + register u64 arg0 asm("x1") = _arg0; + register u64 arg1 asm("x2") = _arg1; + register u64 arg2 asm("x3") = _arg2; + asm volatile( __asmeq("%0", "x0") __asmeq("%1", "x1")