From d4d2582eef7aac442076f955e4024403f8ff3d96 Mon Sep 17 00:00:00 2001 From: Xiang W Date: Mon, 8 Apr 2024 23:27:42 +0800 Subject: [PATCH] firmware: remove FW_TEXT_START Now opensbi can run at any address via dynamic relocation. We can remove FW_TEXT_START. Signed-off-by: Xiang W Reviewed-by: Anup Patel Tested-by: Anup Patel --- docs/firmware/fw.md | 2 -- docs/firmware/fw_jump.md | 4 ++-- docs/firmware/fw_payload.md | 6 +++--- docs/platform/generic.md | 11 +++-------- firmware/fw_base.S | 4 +--- firmware/fw_base.ldS | 3 +-- firmware/fw_payload.elf.ldS | 2 +- firmware/objects.mk | 4 ---- firmware/payloads/test.elf.ldS | 2 +- platform/fpga/ariane/objects.mk | 1 - platform/fpga/openpiton/objects.mk | 1 - platform/generic/objects.mk | 3 +-- platform/kendryte/k210/objects.mk | 1 - platform/nuclei/ux600/objects.mk | 1 - platform/template/objects.mk | 9 ++------- 15 files changed, 15 insertions(+), 39 deletions(-) diff --git a/docs/firmware/fw.md b/docs/firmware/fw.md index 2f4deb55..3cc0262a 100644 --- a/docs/firmware/fw.md +++ b/docs/firmware/fw.md @@ -61,8 +61,6 @@ Firmware Configuration and Compilation All firmware types support the following common compile time configuration parameters: -* **FW_TEXT_START** - Defines the execution address of the OpenSBI firmware. - This configuration parameter is mandatory. * **FW_FDT_PATH** - Path to an external flattened device tree binary file to be embedded in the *.rodata* section of the final firmware. If this option is not provided then the firmware will expect the FDT to be passed as an diff --git a/docs/firmware/fw_jump.md b/docs/firmware/fw_jump.md index 2ee6b291..66be0169 100644 --- a/docs/firmware/fw_jump.md +++ b/docs/firmware/fw_jump.md @@ -35,7 +35,7 @@ follows: At least one of *FW_JUMP_ADDR* and *FW_JUMP_OFFSET* (see below) should be defined. Compilation errors will result from not defining one of them. -* **FW_JUMP_OFFSET** - Address offset from the *FW_TEXT_START* where the +* **FW_JUMP_OFFSET** - Address offset from the opensbi load address where the entry point of the next booting stage is located. This offset is used as relocatable address of the next booting stage entry point. If *FW_JUMP_ADDR* is also defined, the firmware will prefer *FW_JUMP_ADDR*. @@ -62,7 +62,7 @@ follows: echo fdt overlaps kernel, increase FW_JUMP_FDT_ADDR ``` -* **FW_JUMP_FDT_OFFSET** - Address offset from the *FW_TEXT_START* where +* **FW_JUMP_FDT_OFFSET** - Address offset from the opensbi load address where the FDT will be passed to the next booting stage. This offset is used as relocatable address of the FDT passed to the next booting stage. If *FW_JUMP_FDT_ADDR* is also defined, the firmware will prefer diff --git a/docs/firmware/fw_payload.md b/docs/firmware/fw_payload.md index a67fc50b..d25be600 100644 --- a/docs/firmware/fw_payload.md +++ b/docs/firmware/fw_payload.md @@ -36,8 +36,8 @@ options. These configuration parameters can be defined using either the top level `make` command line or the target platform *objects.mk* configuration file. The parameters currently defined are as follows: -* **FW_PAYLOAD_OFFSET** - Offset from *FW_TEXT_START* where the payload binary - will be linked in the final *FW_PAYLOAD* firmware binary image. This +* **FW_PAYLOAD_OFFSET** - Offset from the opensbi load address where the payload + binary will be linked in the final *FW_PAYLOAD* firmware binary image. This configuration parameter is mandatory if *FW_PAYLOAD_ALIGN* is not defined. Compilation errors will result from an incorrect definition of *FW_PAYLOAD_OFFSET* or of *FW_PAYLOAD_ALIGN*, or if neither of these @@ -62,7 +62,7 @@ file. The parameters currently defined are as follows: firmware will pass the FDT address passed by the previous booting stage to the next booting stage. -* **FW_PAYLOAD_FDT_OFFSET** - Address offset from the *FW_TEXT_START* where +* **FW_PAYLOAD_FDT_OFFSET** - Address offset from the opensbi load address where the FDT will be passed to the next booting stage. This offset is used as relocatable address of the FDT passed to the next booting stage. If *FW_PAYLOAD_FDT_ADDR* is also defined, the firmware will prefer *FW_PAYLOAD_FDT_ADDR*. diff --git a/docs/platform/generic.md b/docs/platform/generic.md index c29eb047..709b436e 100644 --- a/docs/platform/generic.md +++ b/docs/platform/generic.md @@ -9,10 +9,9 @@ boards. By default, the generic FDT platform makes following assumptions: -1. platform FW_TEXT_START is 0x80000000 -2. platform features are default -3. platform stack size is default -4. platform has no quirks or work-arounds +1. platform features are default +2. platform stack size is default +3. platform has no quirks or work-arounds The above assumptions (except 1) can be overridden by adding special platform callbacks which will be called based on FDT root node compatible string. @@ -33,10 +32,6 @@ Users of the generic FDT platform will have to ensure that: To build the platform-specific library and firmware images, provide the *PLATFORM=generic* parameter to the top level `make` command. -For custom FW_TEXT_START, we can build the platform-specific library and -firmware images by passing *PLATFORM=generic FW_TEXT_START=* -parameter to the top level `make` command. - Platform Options ---------------- diff --git a/firmware/fw_base.S b/firmware/fw_base.S index b950c0b8..9f995a22 100644 --- a/firmware/fw_base.S +++ b/firmware/fw_base.S @@ -53,9 +53,7 @@ _try_lottery: bnez a6, _wait_for_boot_hart /* relocate the global table content */ - li t0, FW_TEXT_START /* link start */ - lla t1, _fw_start /* load start */ - sub t2, t1, t0 /* load offset */ + lla t2, _fw_start lla t0, __rel_dyn_start lla t1, __rel_dyn_end beq t0, t1, _relocate_done diff --git a/firmware/fw_base.ldS b/firmware/fw_base.ldS index fb479848..9d11db56 100644 --- a/firmware/fw_base.ldS +++ b/firmware/fw_base.ldS @@ -7,8 +7,7 @@ * Anup Patel */ - . = FW_TEXT_START; - /* Don't add any section between FW_TEXT_START and _fw_start */ + /* Don't add any section before _fw_start */ PROVIDE(_fw_start = .); . = ALIGN(0x1000); /* Need this to create proper sections */ diff --git a/firmware/fw_payload.elf.ldS b/firmware/fw_payload.elf.ldS index f1a544b8..94e1ac69 100644 --- a/firmware/fw_payload.elf.ldS +++ b/firmware/fw_payload.elf.ldS @@ -15,7 +15,7 @@ SECTIONS #include "fw_base.ldS" #ifdef FW_PAYLOAD_OFFSET - . = FW_TEXT_START + FW_PAYLOAD_OFFSET; + . = FW_PAYLOAD_OFFSET; #else . = ALIGN(FW_PAYLOAD_ALIGN); #endif diff --git a/firmware/objects.mk b/firmware/objects.mk index e6b364b8..a51ff657 100644 --- a/firmware/objects.mk +++ b/firmware/objects.mk @@ -13,10 +13,6 @@ firmware-cflags-y += firmware-asflags-y += firmware-ldflags-y += -ifdef FW_TEXT_START -firmware-genflags-y += -DFW_TEXT_START=$(FW_TEXT_START) -endif - ifdef FW_FDT_PATH firmware-genflags-y += -DFW_FDT_PATH=\"$(FW_FDT_PATH)\" ifdef FW_FDT_PADDING diff --git a/firmware/payloads/test.elf.ldS b/firmware/payloads/test.elf.ldS index 2328a1b7..08e008f4 100644 --- a/firmware/payloads/test.elf.ldS +++ b/firmware/payloads/test.elf.ldS @@ -13,7 +13,7 @@ ENTRY(_start) SECTIONS { #ifdef FW_PAYLOAD_OFFSET - . = FW_TEXT_START + FW_PAYLOAD_OFFSET; + . = FW_PAYLOAD_OFFSET; #else . = ALIGN(FW_PAYLOAD_ALIGN); #endif diff --git a/platform/fpga/ariane/objects.mk b/platform/fpga/ariane/objects.mk index 83581ac9..d1177f41 100644 --- a/platform/fpga/ariane/objects.mk +++ b/platform/fpga/ariane/objects.mk @@ -17,7 +17,6 @@ platform-objs-y += platform.o PLATFORM_RISCV_XLEN = 64 # Blobs to build -FW_TEXT_START=0x80000000 FW_JUMP=n ifeq ($(PLATFORM_RISCV_XLEN), 32) diff --git a/platform/fpga/openpiton/objects.mk b/platform/fpga/openpiton/objects.mk index c8c345ab..1a0ce0c7 100644 --- a/platform/fpga/openpiton/objects.mk +++ b/platform/fpga/openpiton/objects.mk @@ -16,7 +16,6 @@ platform-objs-y += platform.o PLATFORM_RISCV_XLEN = 64 # Blobs to build -FW_TEXT_START=0x80000000 FW_JUMP=n ifeq ($(PLATFORM_RISCV_XLEN), 32) diff --git a/platform/generic/objects.mk b/platform/generic/objects.mk index 85aa723a..c215935e 100644 --- a/platform/generic/objects.mk +++ b/platform/generic/objects.mk @@ -15,14 +15,13 @@ platform-ldflags-y = # Command for platform specific "make run" platform-runcmd = qemu-system-riscv$(PLATFORM_RISCV_XLEN) -M virt -m 256M \ - -nographic -bios $(build_dir)/platform/generic/firmware/fw_payload.elf + -nographic -bios $(build_dir)/platform/generic/firmware/fw_payload.bin # Objects to build platform-objs-y += platform.o platform-objs-y += platform_override_modules.o # Blobs to build -FW_TEXT_START=0x80000000 FW_DYNAMIC=y FW_JUMP=y ifeq ($(PLATFORM_RISCV_XLEN), 32) diff --git a/platform/kendryte/k210/objects.mk b/platform/kendryte/k210/objects.mk index 1bfb8986..efac3d2f 100644 --- a/platform/kendryte/k210/objects.mk +++ b/platform/kendryte/k210/objects.mk @@ -21,6 +21,5 @@ platform-varprefix-k210.o = dt_k210 platform-padding-k210.o = 2048 # Blobs to build -FW_TEXT_START=0x80000000 FW_PAYLOAD=y FW_PAYLOAD_ALIGN=0x1000 diff --git a/platform/nuclei/ux600/objects.mk b/platform/nuclei/ux600/objects.mk index 7c429e0b..2753a7f9 100644 --- a/platform/nuclei/ux600/objects.mk +++ b/platform/nuclei/ux600/objects.mk @@ -22,7 +22,6 @@ platform-runcmd = xl_spike \ platform-objs-y += platform.o # Blobs to build -FW_TEXT_START=0xA0000000 FW_DYNAMIC=y FW_JUMP=y diff --git a/platform/template/objects.mk b/platform/template/objects.mk index b143cbc4..f240a557 100644 --- a/platform/template/objects.mk +++ b/platform/template/objects.mk @@ -41,9 +41,6 @@ platform-objs-y += platform.o # # platform-objs-y +=
.o -# Firmware load address configuration. This is mandatory. -FW_TEXT_START=0x80000000 - # Optional parameter for path to external FDT # FW_FDT_PATH="path to platform flattened device tree file" @@ -69,8 +66,7 @@ FW_JUMP= # endif # FW_JUMP_FDT_OFFSET=0x2200000 # -# You can use fixed address for jump firmware as an alternative option, -# but this may fail when setting wrong FW_TEXT_START. Use with caution. +# You can use fixed address for jump firmware as an alternative option. # SBI will prefer "_ADDR" if both "_ADDR" and "_OFFSET" are # defined # ifeq ($(PLATFORM_RISCV_XLEN), 32) @@ -97,8 +93,7 @@ endif # FW_PAYLOAD_PATH="path to next boot stage binary image file" # FW_PAYLOAD_FDT_OFFSET=0x2200000 # -# You can use fixed address for payload firmware as an alternative option, -# but this may fail when setting wrong FW_TEXT_START. Use with caution. +# You can use fixed address for payload firmware as an alternative option. # SBI will prefer "FW_PAYLOAD_FDT_ADDR" if both "FW_PAYLOAD_FDT_OFFSET" # and "FW_PAYLOAD_FDT_ADDR" are defined. # FW_PAYLOAD_FDT_ADDR=0x82200000