git: ecaf115434cf - main - riscv: Conditionally modify the ELF64 sysentvec for SV48
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 01 Mar 2022 14:40:02 UTC
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=ecaf115434cf5b427339d27860bcbee3e9f48e39 commit ecaf115434cf5b427339d27860bcbee3e9f48e39 Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2022-03-01 14:05:02 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2022-03-01 14:39:43 +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 MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D34274 --- 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 117f28c941d3..c218fc76af5e 100644 --- a/sys/riscv/riscv/elf_machdep.c +++ b/sys/riscv/riscv/elf_machdep.c @@ -63,7 +63,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, @@ -79,9 +79,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), @@ -94,7 +94,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, @@ -129,10 +129,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()");