Port-amd64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Make kernel self-relocatable [PATCH]
On Tue, May 02, 2023 at 12:39:44AM +0000, Emmanuel Dreyfus wrote:
> Here is an additional change to add a SELFRELOC kernel option, enabled
> by defaut, for the sake of documentation clarity.
>
> Instead of telling that x86/boot(8) reloc command needs a kernel able
> to self relocate, we can tell it needs a kernel built with the
> SELFRELOC option. This keeps the reader from wondering what could
> make a kernel able to self relocate.
And here is the missing patch
Index: share/man/man4/options.4
===================================================================
RCS file: /cvsroot/src/share/man/man4/options.4,v
retrieving revision 1.523
diff -U4 -r1.523 options.4
--- share/man/man4/options.4 28 Aug 2022 14:29:05 -0000 1.523
+++ share/man/man4/options.4 2 May 2023 00:24:48 -0000
@@ -1306,8 +1306,16 @@
.Xr vnd 4
and
.Xr vnconfig 8
for more information.
+.It Cd options SELFRELOC
+Make the kernel able to self relocate at bootstrap, so that it can
+run whatever its load address is.
+This is intented to be used withe the
+.Ic reloc
+boostrap command documented in
+.Xr x86/boot 8 ,
+to workaround UEFI bugs, and is only available on amd64.
.It Cd options SPLDEBUG
Help the kernel programmer find bugs related to the interrupt priority
level.
When
Index: sys/arch/amd64/amd64/locore.S
===================================================================
RCS file: /cvsroot/src/sys/arch/amd64/amd64/locore.S,v
retrieving revision 1.219
diff -U4 -r1.219 locore.S
--- sys/arch/amd64/amd64/locore.S 20 Apr 2023 00:42:23 -0000 1.219
+++ sys/arch/amd64/amd64/locore.S 2 May 2023 00:24:48 -0000
@@ -155,8 +155,9 @@
#include "opt_ddb.h"
#include "opt_ddbparam.h"
#include "opt_modular.h"
#include "opt_realmem.h"
+#include "opt_selfreloc.h"
#include "opt_compat_netbsd.h"
#include "opt_compat_netbsd32.h"
#include "opt_xen.h"
@@ -455,15 +456,17 @@
ENTRY(start)
#ifndef XENPV
.code32
+#ifdef SELFRELOC
call next
next: pop %edi
sub $(next - kernel_text), %edi
/* If not KERNBASE, reloc ourselves to KERNBASE */
cmpl $(KERNTEXTOFF_LO - KERNBASE_LO), %edi
jne selfreloc_start
+#endif /* SELFRELOC */
/* Warm boot */
movw $0x1234,0x472
@@ -1765,8 +1768,9 @@
LABEL(nomds_leave)
NOMDS_LEAVE
LABEL(nomds_leave_end)
+#ifdef SELFRELOC
/*
* selfreloc(loadddr edi)
* This is adapted from sys/arch/i386/i386/locore.S
*/
@@ -1899,4 +1903,5 @@
.word gdtr - gdt
gdtrr:
.quad
END(selfreloc_start)
+#endif /* SELFRELOC */
Index: sys/arch/amd64/conf/files.amd64
===================================================================
RCS file: /cvsroot/src/sys/arch/amd64/conf/files.amd64,v
retrieving revision 1.120
diff -U4 -r1.120 files.amd64
--- sys/arch/amd64/conf/files.amd64 21 Oct 2020 13:31:51 -0000 1.120
+++ sys/arch/amd64/conf/files.amd64 2 May 2023 00:24:48 -0000
@@ -19,8 +19,11 @@
# Enable GCC spectre V2 mitigation options
defflag opt_spectre.h SPECTRE_V2_GCC_MITIGATION
+# Enable kernel self-relocation at bootstrap
+defflag opt_selfreloc.h SELFRELOC
+
#
# XXX these are just here at the moment so that we can share files
# with the i386 (they include the opt_*.h for these)
#
Index: sys/arch/amd64/conf/std.amd64
===================================================================
RCS file: /cvsroot/src/sys/arch/amd64/conf/std.amd64,v
retrieving revision 1.12
diff -U4 -r1.12 std.amd64
--- sys/arch/amd64/conf/std.amd64 25 Apr 2020 15:26:16 -0000 1.12
+++ sys/arch/amd64/conf/std.amd64 2 May 2023 00:24:48 -0000
@@ -14,8 +14,10 @@
options CHILD_MAX=1024 # 160 is too few
options OPEN_MAX=1024 # 128 is too few
+options SELFRELOC
+
mainbus0 at root
cpu* at mainbus?
ioapic* at mainbus? apid ?
Index: share/man/man8/man8.x86/boot.8
===================================================================
RCS file: /cvsroot/src/share/man/man8/man8.x86/boot.8,v
retrieving revision 1.27
diff -U4 -r1.27 boot.8
--- share/man/man8/man8.x86/boot.8 24 Apr 2023 13:55:45 -0000 1.27
+++ share/man/man8/man8.x86/boot.8 2 May 2023 00:24:48 -0000
@@ -654,10 +654,12 @@
Reboot the system.
.It Ic reloc Op Va default No \(or Va none No \(or Va address
[Only UEFI boot] Sets where the kernel is copied by bootstrap
before it is started. Values other than default require a kernel
-that can relocate itself at the right address, otherwise a crash
-occurs at boot time.
+built with the
+.Cd SELFRELOC
+option, so that can relocate itself at the right address,
+otherwise a crash occurs at boot time.
.Bl -tag -width default
.It Va default
Copy the kernel at ELF header load address, this is the historical
behavior.
--
Emmanuel Dreyfus
manu%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index