40 lines
1.4 KiB
Diff
40 lines
1.4 KiB
Diff
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
|
|
index 379ee152..10d3fda8 100644
|
|
--- a/arch/arm64/kernel/psci.c
|
|
+++ b/arch/arm64/kernel/psci.c
|
|
@@ -100,9 +100,14 @@ static u32 psci_power_state_pack(struct psci_power_state 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")
|
|
@@ -115,9 +120,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")
|