mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-03-15 19:31:32 +00:00
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:
parent
5186da687d
commit
76d7e9b8ee
5 changed files with 11 additions and 115 deletions
8
Makefile
8
Makefile
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue