firmware: remove copy-base relocation

Remove copy-base relocations that are no longer needed.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
Tested-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Xiang W 2024-03-12 16:24:59 +08:00 committed by Anup Patel
parent 5186da687d
commit 76d7e9b8ee
5 changed files with 11 additions and 115 deletions

View file

@ -179,6 +179,10 @@ CC_SUPPORT_STRICT_ALIGN := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib
# Check whether the assembler and the compiler support the Zicsr and Zifencei extensions # Check whether the assembler and the compiler support the Zicsr and Zifencei extensions
CC_SUPPORT_ZICSR_ZIFENCEI := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -march=rv$(OPENSBI_CC_XLEN)imafd_zicsr_zifencei -x c /dev/null -o /dev/null 2>&1 | grep "zicsr\|zifencei" > /dev/null && echo n || echo y) CC_SUPPORT_ZICSR_ZIFENCEI := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -march=rv$(OPENSBI_CC_XLEN)imafd_zicsr_zifencei -x c /dev/null -o /dev/null 2>&1 | grep "zicsr\|zifencei" > /dev/null && echo n || echo y)
ifneq ($(OPENSBI_LD_PIE),y)
$(error Your linker does not support creating PIEs, opensbi requires this.)
endif
# Build Info: # Build Info:
# OPENSBI_BUILD_TIME_STAMP -- the compilation time stamp # OPENSBI_BUILD_TIME_STAMP -- the compilation time stamp
# OPENSBI_BUILD_COMPILER_VERSION -- the compiler version info # OPENSBI_BUILD_COMPILER_VERSION -- the compiler version info
@ -356,7 +360,7 @@ CFLAGS += -mcmodel=$(PLATFORM_RISCV_CODE_MODEL)
CFLAGS += $(RELAX_FLAG) CFLAGS += $(RELAX_FLAG)
CFLAGS += $(GENFLAGS) CFLAGS += $(GENFLAGS)
CFLAGS += $(platform-cflags-y) CFLAGS += $(platform-cflags-y)
CFLAGS += -fno-pie -no-pie CFLAGS += -fPIE -pie
CFLAGS += $(firmware-cflags-y) CFLAGS += $(firmware-cflags-y)
CPPFLAGS += $(GENFLAGS) CPPFLAGS += $(GENFLAGS)
@ -365,6 +369,7 @@ CPPFLAGS += $(firmware-cppflags-y)
ASFLAGS = -g -Wall -nostdlib ASFLAGS = -g -Wall -nostdlib
ASFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls ASFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
ASFLAGS += -fPIE
# Optionally supported flags # Optionally supported flags
ifeq ($(CC_SUPPORT_SAVE_RESTORE),y) ifeq ($(CC_SUPPORT_SAVE_RESTORE),y)
ASFLAGS += -mno-save-restore ASFLAGS += -mno-save-restore
@ -391,6 +396,7 @@ ifeq ($(OPENSBI_LD_EXCLUDE_LIBS),y)
ELFFLAGS += -Wl,--exclude-libs,ALL ELFFLAGS += -Wl,--exclude-libs,ALL
endif endif
ELFFLAGS += -Wl,--build-id=none ELFFLAGS += -Wl,--build-id=none
ELFFLAGS += -Wl,--no-dynamic-linker -Wl,-pie
ELFFLAGS += $(platform-ldflags-y) ELFFLAGS += $(platform-ldflags-y)
ELFFLAGS += $(firmware-ldflags-y) ELFFLAGS += $(firmware-ldflags-y)

View file

@ -276,8 +276,7 @@ document.
NOTE: Using Clang with a `riscv*-linux-gnu` GNU binutils linker has been seen NOTE: Using Clang with a `riscv*-linux-gnu` GNU binutils linker has been seen
to produce broken binaries with missing relocations; it is therefore currently to produce broken binaries with missing relocations; it is therefore currently
recommended that this combination be avoided or *FW_PIC=n* be used to disable recommended that this combination be avoided.
building OpenSBI as a position-independent binary.
Building with timestamp and compiler info Building with timestamp and compiler info
----------------------------------------- -----------------------------------------

View file

@ -69,12 +69,6 @@ parameters:
argument by the prior booting stage. argument by the prior booting stage.
* **FW_FDT_PADDING** - Optional zero bytes padding to the embedded flattened * **FW_FDT_PADDING** - Optional zero bytes padding to the embedded flattened
device tree binary file specified by **FW_FDT_PATH** option. device tree binary file specified by **FW_FDT_PATH** option.
* **FW_PIC** - "FW_PIC=y" generates position independent executable firmware
images. OpenSBI can run at arbitrary address with appropriate alignment.
Therefore, the original relocation mechanism ("FW_PIC=n") will be skipped.
In other words, OpenSBI will directly run at the load address without any
code movement. This option requires a toolchain with PIE support, and it
is on by default.
Additionally, each firmware type as a set of type specific configuration Additionally, each firmware type as a set of type specific configuration
parameters. Detailed information for each firmware type can be found in the parameters. Detailed information for each firmware type can be found in the

View file

@ -15,8 +15,7 @@
#include <sbi/sbi_trap.h> #include <sbi/sbi_trap.h>
#define BOOT_STATUS_LOTTERY_DONE 1 #define BOOT_STATUS_LOTTERY_DONE 1
#define BOOT_STATUS_RELOCATE_DONE 2 #define BOOT_STATUS_BOOT_HART_DONE 2
#define BOOT_STATUS_BOOT_HART_DONE 3
.macro MOV_3R __d0, __s0, __d1, __s1, __d2, __s2 .macro MOV_3R __d0, __s0, __d1, __s1, __d2, __s2
add \__d0, \__s0, zero add \__d0, \__s0, zero
@ -32,17 +31,6 @@
add \__d4, \__s4, zero add \__d4, \__s4, zero
.endm .endm
/*
* If __start_reg <= __check_reg and __check_reg < __end_reg then
* jump to __pass
*/
.macro BRANGE __start_reg, __end_reg, __check_reg, __jump_lable
blt \__check_reg, \__start_reg, 999f
bge \__check_reg, \__end_reg, 999f
j \__jump_lable
999:
.endm
.section .entry, "ax", %progbits .section .entry, "ax", %progbits
.align 3 .align 3
.globl _start .globl _start
@ -56,15 +44,14 @@ _start:
li a7, -1 li a7, -1
beq a6, a7, _try_lottery beq a6, a7, _try_lottery
/* Jump to relocation wait loop if we are not boot hart */ /* Jump to relocation wait loop if we are not boot hart */
bne a0, a6, _wait_relocate_copy_done bne a0, a6, _wait_for_boot_hart
_try_lottery: _try_lottery:
/* Jump to relocation wait loop if we don't get relocation lottery */ /* Jump to relocation wait loop if we don't get relocation lottery */
lla a6, _boot_status lla a6, _boot_status
li a7, BOOT_STATUS_LOTTERY_DONE li a7, BOOT_STATUS_LOTTERY_DONE
amoswap.w a6, a7, (a6) amoswap.w a6, a7, (a6)
bnez a6, _wait_relocate_copy_done bnez a6, _wait_for_boot_hart
#ifdef FW_PIC
/* relocate the global table content */ /* relocate the global table content */
li t0, FW_TEXT_START /* link start */ li t0, FW_TEXT_START /* link start */
lla t1, _fw_start /* load start */ lla t1, _fw_start /* load start */
@ -85,86 +72,7 @@ _try_lottery:
3: 3:
addi t0, t0, (REGBYTES * 3) addi t0, t0, (REGBYTES * 3)
blt t0, t1, 2b blt t0, t1, 2b
j _relocate_done
_wait_relocate_copy_done:
j _wait_for_boot_hart
#else
/* Relocate if load address != link address */
_relocate:
li t0, FW_TEXT_START /* link start */
lla t2, _fw_start /* load start */
lla t3, _fw_reloc_end /* load end */
sub t6, t2, t0 /* load offset */
sub t1, t3, t6 /* link end */
beq t0, t2, _relocate_done
lla t4, _relocate_done
sub t4, t4, t6
blt t2, t0, _relocate_copy_to_upper
_relocate_copy_to_lower:
ble t1, t2, _relocate_copy_to_lower_loop
lla t3, _boot_status
BRANGE t2, t1, t3, _start_hang
lla t3, _relocate
lla t5, _relocate_done
BRANGE t2, t1, t3, _start_hang
BRANGE t2, t1, t5, _start_hang
BRANGE t3, t5, t2, _start_hang
_relocate_copy_to_lower_loop:
REG_L t3, 0(t2)
REG_S t3, 0(t0)
add t0, t0, __SIZEOF_POINTER__
add t2, t2, __SIZEOF_POINTER__
blt t0, t1, _relocate_copy_to_lower_loop
jr t4
_relocate_copy_to_upper:
ble t3, t0, _relocate_copy_to_upper_loop
lla t2, _boot_status
BRANGE t0, t3, t2, _start_hang
lla t2, _relocate
lla t5, _relocate_done
BRANGE t0, t3, t2, _start_hang
BRANGE t0, t3, t5, _start_hang
BRANGE t2, t5, t0, _start_hang
_relocate_copy_to_upper_loop:
add t3, t3, -__SIZEOF_POINTER__
add t1, t1, -__SIZEOF_POINTER__
REG_L t2, 0(t3)
REG_S t2, 0(t1)
blt t0, t1, _relocate_copy_to_upper_loop
jr t4
_wait_relocate_copy_done:
lla t0, _fw_start
li t1, FW_TEXT_START
beq t0, t1, _wait_for_boot_hart
lla t2, _boot_status
lla t3, _wait_for_boot_hart
sub t3, t3, t0
add t3, t3, t1
1:
/* waitting for relocate copy done (_boot_status == 1) */
li t4, BOOT_STATUS_RELOCATE_DONE
REG_L t5, 0(t2)
/* Reduce the bus traffic so that boot hart may proceed faster */
nop
nop
nop
bgt t4, t5, 1b
jr t3
#endif
_relocate_done: _relocate_done:
/*
* Mark relocate copy done
* Use _boot_status copy relative to the load address
*/
lla t0, _boot_status
#ifndef FW_PIC
add t0, t0, t6
#endif
li t1, BOOT_STATUS_RELOCATE_DONE
REG_S t1, 0(t0)
fence rw, rw
/* At this point we are running from link address */ /* At this point we are running from link address */
/* Reset all registers except ra, a0, a1, a2, a3 and a4 for boot HART */ /* Reset all registers except ra, a0, a1, a2, a3 and a4 for boot HART */

View file

@ -13,17 +13,6 @@ firmware-cflags-y +=
firmware-asflags-y += firmware-asflags-y +=
firmware-ldflags-y += firmware-ldflags-y +=
ifndef FW_PIC
FW_PIC := $(OPENSBI_LD_PIE)
endif
ifeq ($(FW_PIC),y)
firmware-genflags-y += -DFW_PIC
firmware-asflags-y += -fpic
firmware-cflags-y += -fPIE -pie
firmware-ldflags-y += -Wl,--no-dynamic-linker -Wl,-pie
endif
ifdef FW_TEXT_START ifdef FW_TEXT_START
firmware-genflags-y += -DFW_TEXT_START=$(FW_TEXT_START) firmware-genflags-y += -DFW_TEXT_START=$(FW_TEXT_START)
endif endif