From: Michael Brown Date: Thu, 1 May 2025 13:24:33 +0000 (+0100) Subject: [riscv] Allow for a non-zero link-time address X-Git-Tag: rolling/bin~331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dad20602609438e72f2fe8d9dd49b9a92b8490fa;p=thirdparty%2Fipxe.git [riscv] Allow for a non-zero link-time address Using paging (rather than relocation records) will be easier on 64-bit RISC-V if we place iPXE within the negative (kernel) virtual address space. Allow the link-time address to be non-zero and to vary between 32-bit and 64-bit builds. Choose addresses that are expected to be amenable to the use of paging. There is no particular need to use a non-zero address in the 32-bit builds, but doing so allows us to validate that the relocation code is handling this case correctly. Signed-off-by: Michael Brown --- diff --git a/src/arch/riscv/scripts/sbi.lds b/src/arch/riscv/scripts/sbi.lds index afb1902e1..f882f235e 100644 --- a/src/arch/riscv/scripts/sbi.lds +++ b/src/arch/riscv/scripts/sbi.lds @@ -5,10 +5,8 @@ SECTIONS { - /* Start at virtual address zero */ - . = 0; - /* Weak symbols that need zero values if not otherwise defined */ + saved_pos = .; .weak 0x0 : { _weak = .; *(.weak) @@ -16,6 +14,7 @@ SECTIONS { _eweak = .; } _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" ); + _assert = ASSERT ( ( . == saved_pos ), ".weak altered current position" ); /* Prefix code */ .prefix : { @@ -105,7 +104,7 @@ SECTIONS { _ereloc = ( _reloc + __load_stop_reladyn - __load_start_reladyn ); /* Length of initialised data */ - _sbi_filesz = ABSOLUTE ( _ereloc ); + _sbi_filesz = ( ABSOLUTE ( _ereloc ) - ABSOLUTE ( _prefix ) ); /* Unwanted sections */ /DISCARD/ : { diff --git a/src/arch/riscv32/Makefile.sbi b/src/arch/riscv32/Makefile.sbi index d62287770..5841dd4b5 100644 --- a/src/arch/riscv32/Makefile.sbi +++ b/src/arch/riscv32/Makefile.sbi @@ -1,5 +1,13 @@ # -*- makefile -*- : Force emacs to use Makefile mode +# Set base virtual address to 0xeb000000 +# +# This is aligned to a 4MB boundary and so allows 4MB megapages to be +# used to map the iPXE binary. The address pattern is also easily +# recognisable if leaked to unexpected contexts. +# +LDFLAGS += --section-start=.prefix=0xeb000000 + # Include generic SBI Makefile # MAKEDEPS += arch/riscv/Makefile.sbi diff --git a/src/arch/riscv64/Makefile.sbi b/src/arch/riscv64/Makefile.sbi index d62287770..0f7e1c373 100644 --- a/src/arch/riscv64/Makefile.sbi +++ b/src/arch/riscv64/Makefile.sbi @@ -1,5 +1,13 @@ # -*- makefile -*- : Force emacs to use Makefile mode +# Set base virtual address to 0xffffffffeb000000 +# +# This is aligned to a 2MB boundary and so allows 2MB megapages to be +# used to map the iPXE binary. The address pattern is also easily +# recognisable if leaked to unexpected contexts. +# +LDFLAGS += --section-start=.prefix=0xffffffffeb000000 + # Include generic SBI Makefile # MAKEDEPS += arch/riscv/Makefile.sbi