|
@@ -31,21 +31,25 @@
|
|
|
|
|
|
static unsigned long cpu_boot_addr;
|
|
|
|
|
|
-static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2)
|
|
|
+static void tf_generic_smc(u32 type, u32 arg1, u32 arg2)
|
|
|
{
|
|
|
+ register u32 r0 asm("r0") = type;
|
|
|
+ register u32 r1 asm("r1") = arg1;
|
|
|
+ register u32 r2 asm("r2") = arg2;
|
|
|
+
|
|
|
asm volatile(
|
|
|
".arch_extension sec\n\t"
|
|
|
- "stmfd sp!, {r4 - r11, lr}\n\t"
|
|
|
+ "stmfd sp!, {r4 - r11}\n\t"
|
|
|
__asmeq("%0", "r0")
|
|
|
__asmeq("%1", "r1")
|
|
|
__asmeq("%2", "r2")
|
|
|
"mov r3, #0\n\t"
|
|
|
"mov r4, #0\n\t"
|
|
|
"smc #0\n\t"
|
|
|
- "ldmfd sp!, {r4 - r11, pc}"
|
|
|
+ "ldmfd sp!, {r4 - r11}\n\t"
|
|
|
:
|
|
|
- : "r" (type), "r" (arg1), "r" (arg2)
|
|
|
- : "memory");
|
|
|
+ : "r" (r0), "r" (r1), "r" (r2)
|
|
|
+ : "memory", "r3", "r12", "lr");
|
|
|
}
|
|
|
|
|
|
static int tf_set_cpu_boot_addr(int cpu, unsigned long boot_addr)
|