[U-Boot] [PATCH v5 3/8] ARMv7: PSCI: update the place of saving target PC
Chen-Yu Tsai
wens at csie.org
Tue Jun 28 05:24:17 CEST 2016
On Tue, Jun 14, 2016 at 3:01 PM, <macro.wave.z at gmail.com> wrote:
> From: Hongbo Zhang <hongbo.zhang at nxp.com>
>
> The legacy code saves target PC at stack top, this patch changes it to stack
> bottom, because we will save more contents for PSCI v1.0, by this way we don't
> need to adjust the stack pointer when more contents are saved.
>
> Signed-off-by: Hongbo Zhang <hongbo.zhang at nxp.com>
> Signed-off-by: Wang Dongsheng <dongsheng.wang at nxp.com>
> ---
> arch/arm/cpu/armv7/psci.S | 9 +++++----
> arch/arm/include/asm/psci.h | 4 ++++
> 2 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/psci.S b/arch/arm/cpu/armv7/psci.S
> index 3b92f1d..5b235df 100644
> --- a/arch/arm/cpu/armv7/psci.S
> +++ b/arch/arm/cpu/armv7/psci.S
> @@ -259,7 +259,8 @@ ENTRY(psci_cpu_on_common)
>
> mov r0, r1
> bl psci_get_cpu_stack_top @ get stack top of target CPU
> - str r2, [r0] @ store target PC at stack top
> + sub r5, r0, #PSCI_TARGET_PC_OFFSET
> + str r2, [r5] @ store target PC
IMO having a separate function for this would be better.
It would be clearer, and easier to reuse or replace.
Also you should save and restore r5 across this function.
> dsb
>
> pop {pc}
> @@ -286,14 +287,13 @@ 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
> + mov r5, #PSCI_PERCPU_STACK_SIZE @ 1kB of stack per CPU
> mul r0, r0, r5
>
> 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!
This does not apply. r5 was changed to r3.
>
> bx lr
> @@ -306,7 +306,8 @@ ENTRY(psci_cpu_entry)
>
> bl psci_get_cpu_id @ CPU ID => r0
> bl psci_get_cpu_stack_top @ stack top => r0
> - ldr r0, [r0] @ target PC at stack top
> + sub r0, r0, #PSCI_TARGET_PC_OFFSET
> + ldr r0, [r0] @ get target PC
> b _do_nonsec_entry
> ENDPROC(psci_cpu_entry)
>
> diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h
> index 2367ec0..cb08544 100644
> --- a/arch/arm/include/asm/psci.h
> +++ b/arch/arm/include/asm/psci.h
> @@ -63,6 +63,10 @@
> #define ARM_PSCI_1_0_FN_STAT_RESIDENCY ARM_PSCI_0_2_FN(16)
> #define ARM_PSCI_1_0_FN_STAT_COUNT ARM_PSCI_0_2_FN(17)
>
> +/* size of percpu stack, 1kB */
> +#define PSCI_PERCPU_STACK_SIZE 0x400
> +#define PSCI_TARGET_PC_OFFSET (PSCI_PERCPU_STACK_SIZE - 4)
I think you want PSCI_PERCPU_STACK_SIZE?
A stack starts at 0x400 and goes down to 0x0. You want to store
the target PC at 0x0, not 0x4.
Regards
ChenYu
> +
> #ifndef __ASSEMBLY__
> int psci_update_dt(void *fdt);
> void psci_board_init(void);
> --
> 2.1.4
>
More information about the U-Boot
mailing list