diff mbox series

[1/2] lib: sbi: Introduce early hart initialization scheme

Message ID 20210923022839.17777-1-ycliang@andestech.com
State Rejected
Headers show
Series [1/2] lib: sbi: Introduce early hart initialization scheme | expand

Commit Message

Leo Liang Sept. 23, 2021, 2:28 a.m. UTC
Referencing U-Boot (edd9ad81 riscv: cpu: Add callback to init each core)
Introduce a callback function for each hart to do its own initialization
as early as possible.

Signed-off-by: Leo Yu-Chi Liang <ycliang@andestech.com>
---
 firmware/fw_base.S | 6 ++++++
 lib/sbi/sbi_init.c | 4 ++++
 2 files changed, 10 insertions(+)

Comments

Xiang W Sept. 25, 2021, 7:46 a.m. UTC | #1
在 2021-09-23星期四的 10:28 +0800,Leo Yu-Chi Liang写道:
> Referencing U-Boot (edd9ad81 riscv: cpu: Add callback to init each
> core)
> Introduce a callback function for each hart to do its own
> initialization
> as early as possible.
> 
> Signed-off-by: Leo Yu-Chi Liang <ycliang@andestech.com>
> ---
>  firmware/fw_base.S | 6 ++++++
>  lib/sbi/sbi_init.c | 4 ++++
>  2 files changed, 10 insertions(+)
> 
> diff --git a/firmware/fw_base.S b/firmware/fw_base.S
> index 1569e60..dfbe7d7 100644
> --- a/firmware/fw_base.S
> +++ b/firmware/fw_base.S
> @@ -47,6 +47,12 @@
>         .globl _start
>         .globl _start_warm
>  _start:
> +       /* Setup temporary stack */
> +       lla     s4, _fw_end
> +       li      s5, (SBI_SCRATCH_SIZE * 2)
> +       add     sp, s4, s5
> +       /* call harts_early_init */
> +       call harts_early_init
This will destroy the parameters (a0/a1/a2) that the firmware passed to
opensbi in the previous stage. And here, the stack pointers of multiple
cores are set to the same memory address, which may cause  memory
conflicts. 

Regards,
Xiang W
>         /* Find preferred boot HART id */
>         MOV_3R  s0, a0, s1, a1, s2, a2
>         call    fw_boot_hart
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index 6ef8742..02acac0 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -536,3 +536,7 @@ void __noreturn sbi_exit(struct sbi_scratch
> *scratch)
>  
>         sbi_hsm_exit(scratch);
>  }
> +
> +__attribute__((weak)) void harts_early_init(void)
> +{
> +}
> -- 
> 2.17.0
> 
>
diff mbox series

Patch

diff --git a/firmware/fw_base.S b/firmware/fw_base.S
index 1569e60..dfbe7d7 100644
--- a/firmware/fw_base.S
+++ b/firmware/fw_base.S
@@ -47,6 +47,12 @@ 
 	.globl _start
 	.globl _start_warm
 _start:
+	/* Setup temporary stack */
+	lla	s4, _fw_end
+	li	s5, (SBI_SCRATCH_SIZE * 2)
+	add	sp, s4, s5
+	/* call harts_early_init */
+	call harts_early_init
 	/* Find preferred boot HART id */
 	MOV_3R	s0, a0, s1, a1, s2, a2
 	call	fw_boot_hart
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 6ef8742..02acac0 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -536,3 +536,7 @@  void __noreturn sbi_exit(struct sbi_scratch *scratch)
 
 	sbi_hsm_exit(scratch);
 }
+
+__attribute__((weak)) void harts_early_init(void)
+{
+}