96 lines
3.0 KiB
Diff
96 lines
3.0 KiB
Diff
From b1105e862e8f770fc195bc20e9c64d231dd32f66 Mon Sep 17 00:00:00 2001
|
|
From: Jaxson Han <jaxson.han@arm.com>
|
|
Date: Wed, 29 Dec 2021 15:33:17 +0800
|
|
Subject: [PATCH] boot: Enable firmware node initialization
|
|
|
|
Enable the firmware node initialization, so that the next stage
|
|
(hypervisor) could share the EL2 with firmware (boot-wrapper). The next
|
|
stage (hypervisor) get the smccc entry point, code/data sections, the
|
|
sections attrs and firmware node version and so on.
|
|
It is worth noting that this EL2 sharing mechanism is only for Armv8R
|
|
AArch64, thus add flag_v8r to record if the arch is Armv8R AArch64.
|
|
Enable the firmware node initialization only if it is Armv8R AArch64.
|
|
Also, we increase the stack size to 1024 to fix the stack overflow issue
|
|
when using the libfdt.
|
|
|
|
Add -fno-builtin options to CFLAGS to avoid the issue that the 'memset'
|
|
in common/lib.c conflicts with builtin 'memset' function. GCC version
|
|
>= 10 will have an incorrect compilation without -fno-builtin;
|
|
|
|
Issue-Id: SCM-3816
|
|
Upstream-Status: Inappropriate [other]
|
|
Implementation pending further discussion
|
|
Signed-off-by: Jaxson Han <jaxson.han@arm.com>
|
|
Change-Id: Ib274485a34d26215595fd0cd737be86610289817
|
|
---
|
|
Makefile.am | 4 ++--
|
|
arch/aarch64/boot.S | 6 ++++++
|
|
common/boot.c | 4 ++++
|
|
3 files changed, 12 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/Makefile.am b/Makefile.am
|
|
index cc6504e..fbe6b81 100644
|
|
--- a/Makefile.am
|
|
+++ b/Makefile.am
|
|
@@ -23,7 +23,7 @@ DEFINES += -DCPU_IDS=$(CPU_IDS)
|
|
DEFINES += -DNR_CPUS=$(NR_CPUS)
|
|
DEFINES += $(if $(SYSREGS_BASE), -DSYSREGS_BASE=$(SYSREGS_BASE), )
|
|
DEFINES += -DUART_BASE=$(UART_BASE)
|
|
-DEFINES += -DSTACK_SIZE=256
|
|
+DEFINES += -DSTACK_SIZE=1024
|
|
|
|
if KERNEL_32
|
|
DEFINES += -DKERNEL_32
|
|
@@ -134,7 +134,7 @@ CFLAGS += -I$(top_srcdir)/include/ -I$(top_srcdir)/$(ARCH_SRC)/include/
|
|
CFLAGS += -Wall -fomit-frame-pointer
|
|
CFLAGS += -ffreestanding -nostdlib
|
|
CFLAGS += -fno-stack-protector
|
|
-CFLAGS += -fno-stack-protector
|
|
+CFLAGS += -fno-stack-protector -fno-builtin
|
|
CFLAGS += -ffunction-sections -fdata-sections
|
|
CFLAGS += -fno-pic -fno-pie
|
|
LDFLAGS += --gc-sections
|
|
diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S
|
|
index c079d22..daaa674 100644
|
|
--- a/arch/aarch64/boot.S
|
|
+++ b/arch/aarch64/boot.S
|
|
@@ -261,6 +261,10 @@ el2_init:
|
|
#endif
|
|
ldr x1, =spsr_to_elx
|
|
str w0, [x1]
|
|
+
|
|
+ mov w0, #1
|
|
+ ldr x1, =flag_v8r
|
|
+ str w0, [x1]
|
|
// fall through
|
|
|
|
el_max_init:
|
|
@@ -340,3 +344,5 @@ flag_keep_el:
|
|
.long 0
|
|
ASM_DATA(spsr_to_elx)
|
|
.long 0
|
|
+ASM_DATA(flag_v8r)
|
|
+ .long 0
|
|
diff --git a/common/boot.c b/common/boot.c
|
|
index ee2bea0..38b2dca 100644
|
|
--- a/common/boot.c
|
|
+++ b/common/boot.c
|
|
@@ -11,6 +11,9 @@
|
|
|
|
extern unsigned long entrypoint;
|
|
extern unsigned long dtb;
|
|
+extern unsigned int flag_v8r;
|
|
+
|
|
+extern void dt_fw_node_init(int enable);
|
|
|
|
void init_platform(void);
|
|
|
|
@@ -64,6 +67,7 @@ void __noreturn first_spin(unsigned int cpu, unsigned long *mbox,
|
|
if (cpu == 0) {
|
|
init_platform();
|
|
dt_add_memreserve();
|
|
+ dt_fw_node_init(flag_v8r == 1);
|
|
|
|
*mbox = (unsigned long)&entrypoint;
|
|
sevl();
|