@@ -196,16 +196,15 @@ ENDPROC(psci_cpu_off_common)
@ expects CPU ID in r0 and returns stack top in r0
ENTRY(psci_get_cpu_stack_top)
- mov r5, #0x400 @ 1kB of stack per CPU
- mul r0, r0, r5
+ mov r5, #PSCI_PERCPU_STACK_SIZE @ 1kB of stack per CPU
+ add r0, r0, #1
+ mul r0, r0, r5 @ offset of each stack
ldr r5, =psci_text_end @ end of monitor text
- add r5, r5, #0x2000 @ Skip two pages
- lsr r5, r5, #12 @ Align to start of page
- lsl r5, r5, #12
- sub r5, r5, #4 @ reserve 1 word for target PC
- sub r0, r5, r0 @ here's our stack!
+ orr r5, r5, #0xff0 @ align to end of page
+ orr r5, r5, #0x00c
+ add r0, r5, r0 @ here's our stack!
bx lr
ENDPROC(psci_get_cpu_stack_top)
@@ -124,9 +124,14 @@ int psci_update_dt(void *fdt)
return 0;
#endif
#ifndef CONFIG_ARMV7_SECURE_BASE
+ size_t sz = __secure_end - __secure_start;
+#ifdef CONFIG_ARMV7_PSCI
+ sz += CONFIG_MAX_CPUS * PSCI_PERCPU_STACK_SIZE;
+ /* margin to align psci_text_end to page end*/
+ sz += 0x1000;
+#endif
/* secure code lives in RAM, keep it alive */
- fdt_add_mem_rsv(fdt, (unsigned long)__secure_start,
- __secure_end - __secure_start);
+ fdt_add_mem_rsv(fdt, (unsigned long)__secure_start, sz);
#endif
return fdt_psci(fdt);
@@ -18,6 +18,8 @@
#ifndef __ARM_PSCI_H__
#define __ARM_PSCI_H__
+/* size of percpu stack, 1kB */
+#define PSCI_PERCPU_STACK_SIZE 0x400
/* PSCI interfaces */
#define PSCI_FN_BASE 0x84000000