git: 4bf624d7cfac - stable/13 - riscv: Conditionally modify the ELF64 sysentvec for SV48
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 14 Mar 2022 14:46:10 UTC
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=4bf624d7cfacb9500924d84675abec5af97cc862
commit 4bf624d7cfacb9500924d84675abec5af97cc862
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-03-01 14:05:02 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-03-14 14:45:36 +0000
riscv: Conditionally modify the ELF64 sysentvec for SV48
A sysinit determines whether the pmap has enabled SV48 mode and modifies
the corresponding fields which describe the user memory map.
Reviewed by: kib, jhb
Sponsored by: The FreeBSD Foundation
(cherry picked from commit ecaf115434cf5b427339d27860bcbee3e9f48e39)
---
sys/riscv/riscv/elf_machdep.c | 35 +++++++++++++++++++++++++++++------
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/sys/riscv/riscv/elf_machdep.c b/sys/riscv/riscv/elf_machdep.c
index 1e24cbf51004..f9b4098c4fca 100644
--- a/sys/riscv/riscv/elf_machdep.c
+++ b/sys/riscv/riscv/elf_machdep.c
@@ -62,7 +62,7 @@ static const char *riscv_machine_arch(struct proc *p);
u_long elf_hwcap;
-struct sysentvec elf64_freebsd_sysvec = {
+static struct sysentvec elf64_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
.sv_transtrap = NULL,
@@ -75,9 +75,9 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_imgact_try = NULL,
.sv_minsigstksz = MINSIGSTKSZ,
.sv_minuser = VM_MIN_ADDRESS,
- .sv_maxuser = VM_MAXUSER_ADDRESS,
- .sv_usrstack = USRSTACK,
- .sv_psstrings = PS_STRINGS,
+ .sv_maxuser = 0, /* Filled in during boot. */
+ .sv_usrstack = 0, /* Filled in during boot. */
+ .sv_psstrings = 0, /* Filled in during boot. */
.sv_psstringssz = sizeof(struct ps_strings),
.sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
.sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs),
@@ -90,7 +90,7 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
- .sv_shared_page_base = SHAREDPAGE,
+ .sv_shared_page_base = 0, /* Filled in during boot. */
.sv_shared_page_len = PAGE_SIZE,
.sv_schedtail = NULL,
.sv_thread_detach = NULL,
@@ -123,10 +123,33 @@ static Elf64_Brandinfo freebsd_brand_info = {
.brand_note = &elf64_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
};
-
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST,
(sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_info);
+static void
+elf64_register_sysvec(void *arg)
+{
+ struct sysentvec *sv;
+
+ sv = arg;
+ switch (pmap_mode) {
+ case PMAP_MODE_SV48:
+ sv->sv_maxuser = VM_MAX_USER_ADDRESS_SV48;
+ sv->sv_usrstack = USRSTACK_SV48;
+ sv->sv_psstrings = PS_STRINGS_SV48;
+ sv->sv_shared_page_base = SHAREDPAGE_SV48;
+ break;
+ case PMAP_MODE_SV39:
+ sv->sv_maxuser = VM_MAX_USER_ADDRESS_SV39;
+ sv->sv_usrstack = USRSTACK_SV39;
+ sv->sv_psstrings = PS_STRINGS_SV39;
+ sv->sv_shared_page_base = SHAREDPAGE_SV39;
+ break;
+ }
+}
+SYSINIT(elf64_register_sysvec, SI_SUB_VM, SI_ORDER_ANY, elf64_register_sysvec,
+ &elf64_freebsd_sysvec);
+
static bool debug_kld;
SYSCTL_BOOL(_debug, OID_AUTO, kld_reloc, CTLFLAG_RW, &debug_kld, 0,
"Activate debug prints in elf_reloc_internal()");