Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/elf_machdep.c
Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | |||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <vm/vm_param.h> | #include <vm/vm_param.h> | ||||
#include <machine/elf.h> | #include <machine/elf.h> | ||||
#include <machine/fpu.h> | #include <machine/fpu.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
struct sysentvec elf64_freebsd_sysvec = { | struct sysentvec elf64_freebsd_sysvec_la48 = { | ||||
.sv_size = SYS_MAXSYSCALL, | .sv_size = SYS_MAXSYSCALL, | ||||
.sv_table = sysent, | .sv_table = sysent, | ||||
.sv_errsize = 0, | .sv_errsize = 0, | ||||
.sv_errtbl = NULL, | .sv_errtbl = NULL, | ||||
.sv_transtrap = NULL, | .sv_transtrap = NULL, | ||||
.sv_fixup = __elfN(freebsd_fixup), | .sv_fixup = __elfN(freebsd_fixup), | ||||
.sv_sendsig = sendsig, | .sv_sendsig = sendsig, | ||||
.sv_sigcode = sigcode, | .sv_sigcode = sigcode, | ||||
.sv_szsigcode = &szsigcode, | .sv_szsigcode = &szsigcode, | ||||
.sv_name = "FreeBSD ELF64", | .sv_name = "FreeBSD ELF64", | ||||
.sv_coredump = __elfN(coredump), | .sv_coredump = __elfN(coredump), | ||||
.sv_imgact_try = NULL, | .sv_imgact_try = NULL, | ||||
.sv_minsigstksz = MINSIGSTKSZ, | .sv_minsigstksz = MINSIGSTKSZ, | ||||
.sv_minuser = VM_MIN_ADDRESS, | .sv_minuser = VM_MIN_ADDRESS, | ||||
.sv_maxuser = VM_MAXUSER_ADDRESS, | .sv_maxuser = VM_MAXUSER_ADDRESS_LA48, | ||||
.sv_usrstack = USRSTACK, | .sv_usrstack = USRSTACK_LA48, | ||||
.sv_psstrings = PS_STRINGS, | .sv_psstrings = PS_STRINGS_LA48, | ||||
.sv_stackprot = VM_PROT_ALL, | .sv_stackprot = VM_PROT_ALL, | ||||
.sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs), | .sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs), | ||||
.sv_copyout_strings = exec_copyout_strings, | .sv_copyout_strings = exec_copyout_strings, | ||||
.sv_setregs = exec_setregs, | .sv_setregs = exec_setregs, | ||||
.sv_fixlimit = NULL, | .sv_fixlimit = NULL, | ||||
.sv_maxssiz = NULL, | .sv_maxssiz = NULL, | ||||
.sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_LP64 | SV_SHP | | .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_LP64 | SV_SHP | | ||||
SV_TIMEKEEP, | SV_TIMEKEEP, | ||||
.sv_set_syscall_retval = cpu_set_syscall_retval, | .sv_set_syscall_retval = cpu_set_syscall_retval, | ||||
.sv_fetch_syscall_args = cpu_fetch_syscall_args, | .sv_fetch_syscall_args = cpu_fetch_syscall_args, | ||||
.sv_syscallnames = syscallnames, | .sv_syscallnames = syscallnames, | ||||
.sv_shared_page_base = SHAREDPAGE, | .sv_shared_page_base = SHAREDPAGE_LA48, | ||||
.sv_shared_page_len = PAGE_SIZE, | .sv_shared_page_len = PAGE_SIZE, | ||||
.sv_schedtail = NULL, | .sv_schedtail = NULL, | ||||
.sv_thread_detach = NULL, | .sv_thread_detach = NULL, | ||||
.sv_trap = NULL, | .sv_trap = NULL, | ||||
.sv_stackgap = elf64_stackgap, | .sv_stackgap = elf64_stackgap, | ||||
}; | }; | ||||
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec); | |||||
struct sysentvec elf64_freebsd_sysvec_la57 = { | |||||
.sv_size = SYS_MAXSYSCALL, | |||||
.sv_table = sysent, | |||||
.sv_errsize = 0, | |||||
.sv_errtbl = NULL, | |||||
.sv_transtrap = NULL, | |||||
.sv_fixup = __elfN(freebsd_fixup), | |||||
.sv_sendsig = sendsig, | |||||
.sv_sigcode = sigcode, | |||||
.sv_szsigcode = &szsigcode, | |||||
.sv_name = "FreeBSD ELF64", | |||||
.sv_coredump = __elfN(coredump), | |||||
.sv_imgact_try = NULL, | |||||
.sv_minsigstksz = MINSIGSTKSZ, | |||||
.sv_minuser = VM_MIN_ADDRESS, | |||||
.sv_maxuser = VM_MAXUSER_ADDRESS_LA57, | |||||
.sv_usrstack = USRSTACK_LA57, | |||||
.sv_psstrings = PS_STRINGS_LA57, | |||||
.sv_stackprot = VM_PROT_ALL, | |||||
.sv_copyout_auxargs = __elfN(freebsd_copyout_auxargs), | |||||
.sv_copyout_strings = exec_copyout_strings, | |||||
.sv_setregs = exec_setregs, | |||||
.sv_fixlimit = NULL, | |||||
.sv_maxssiz = NULL, | |||||
.sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_LP64 | SV_SHP | | |||||
SV_TIMEKEEP, | |||||
.sv_set_syscall_retval = cpu_set_syscall_retval, | |||||
.sv_fetch_syscall_args = cpu_fetch_syscall_args, | |||||
.sv_syscallnames = syscallnames, | |||||
.sv_shared_page_base = SHAREDPAGE_LA57, | |||||
.sv_shared_page_len = PAGE_SIZE, | |||||
.sv_schedtail = NULL, | |||||
.sv_thread_detach = NULL, | |||||
.sv_trap = NULL, | |||||
.sv_stackgap = elf64_stackgap, | |||||
}; | |||||
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec_la57); | |||||
void | void | ||||
amd64_lower_shared_page(struct sysentvec *sv) | amd64_lower_shared_page(struct sysentvec *sv) | ||||
{ | { | ||||
if (hw_lower_amd64_sharedpage != 0) { | if (hw_lower_amd64_sharedpage != 0) { | ||||
sv->sv_maxuser -= PAGE_SIZE; | sv->sv_maxuser -= PAGE_SIZE; | ||||
sv->sv_shared_page_base -= PAGE_SIZE; | sv->sv_shared_page_base -= PAGE_SIZE; | ||||
sv->sv_usrstack -= PAGE_SIZE; | sv->sv_usrstack -= PAGE_SIZE; | ||||
sv->sv_psstrings -= PAGE_SIZE; | sv->sv_psstrings -= PAGE_SIZE; | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Do this fixup before INIT_SYSENTVEC (SI_ORDER_ANY) because the latter | * Do this fixup before INIT_SYSENTVEC (SI_ORDER_ANY) because the latter | ||||
* uses the value of sv_shared_page_base. | * uses the value of sv_shared_page_base. | ||||
*/ | */ | ||||
SYSINIT(elf64_sysvec_fixup, SI_SUB_EXEC, SI_ORDER_FIRST, | SYSINIT(elf64_sysvec_fixup, SI_SUB_EXEC, SI_ORDER_FIRST, | ||||
(sysinit_cfunc_t) amd64_lower_shared_page, | (sysinit_cfunc_t) amd64_lower_shared_page, &elf64_freebsd_sysvec_la48); | ||||
&elf64_freebsd_sysvec); | |||||
static Elf64_Brandinfo freebsd_brand_info = { | static boolean_t | ||||
freebsd_brand_info_la57_img_compat(struct image_params *imgp, | |||||
emaste: to me `_checker` seems a bit unclear. IMO boolean functions should answer a question, e.g. | |||||
Done Inline Actionsfreebsd_brand_info_la57_img_compat ? kib: freebsd_brand_info_la57_img_compat ? | |||||
Done Inline Actionssounds good emaste: sounds good | |||||
int32_t *osrel __unused, uint32_t *fctl0) | |||||
{ | |||||
if ((imgp->proc->p_md.md_flags & P_MD_LA57) != 0) | |||||
return (TRUE); | |||||
if (fctl0 == NULL || (*fctl0 & NT_FREEBSD_FCTL_LA48) != 0) | |||||
return (FALSE); | |||||
if ((imgp->proc->p_md.md_flags & P_MD_LA48) != 0) | |||||
return (FALSE); | |||||
return (TRUE); | |||||
} | |||||
static Elf64_Brandinfo freebsd_brand_info_la48 = { | |||||
.brand = ELFOSABI_FREEBSD, | .brand = ELFOSABI_FREEBSD, | ||||
.machine = EM_X86_64, | .machine = EM_X86_64, | ||||
.compat_3_brand = "FreeBSD", | .compat_3_brand = "FreeBSD", | ||||
.emul_path = NULL, | .emul_path = NULL, | ||||
.interp_path = "/libexec/ld-elf.so.1", | .interp_path = "/libexec/ld-elf.so.1", | ||||
.sysvec = &elf64_freebsd_sysvec, | .sysvec = &elf64_freebsd_sysvec_la48, | ||||
.interp_newpath = NULL, | .interp_newpath = NULL, | ||||
.brand_note = &elf64_freebsd_brandnote, | .brand_note = &elf64_freebsd_brandnote, | ||||
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE, | ||||
}; | }; | ||||
static Elf64_Brandinfo freebsd_brand_info_la57 = { | |||||
.brand = ELFOSABI_FREEBSD, | |||||
.machine = EM_X86_64, | |||||
.compat_3_brand = "FreeBSD", | |||||
.emul_path = NULL, | |||||
.interp_path = "/libexec/ld-elf.so.1", | |||||
.sysvec = &elf64_freebsd_sysvec_la57, | |||||
.interp_newpath = NULL, | |||||
.brand_note = &elf64_freebsd_brandnote, | |||||
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE, | |||||
.header_supported = freebsd_brand_info_la57_img_compat, | |||||
}; | |||||
static void | |||||
sysinit_register_elf64_brand_entries(void *arg __unused) | |||||
{ | |||||
/* | |||||
* _57 must go first so it can either claim the image, or hand | |||||
Done Inline ActionsDrop the comma. alc: Drop the comma. | |||||
* it to _48. | |||||
*/ | |||||
if (la57) | |||||
elf64_insert_brand_entry(&freebsd_brand_info_la57); | |||||
elf64_insert_brand_entry(&freebsd_brand_info_la48); | |||||
} | |||||
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, | SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, | ||||
(sysinit_cfunc_t) elf64_insert_brand_entry, | sysinit_register_elf64_brand_entries, NULL); | ||||
&freebsd_brand_info); | |||||
static Elf64_Brandinfo freebsd_brand_oinfo = { | static Elf64_Brandinfo freebsd_brand_oinfo = { | ||||
.brand = ELFOSABI_FREEBSD, | .brand = ELFOSABI_FREEBSD, | ||||
.machine = EM_X86_64, | .machine = EM_X86_64, | ||||
.compat_3_brand = "FreeBSD", | .compat_3_brand = "FreeBSD", | ||||
.emul_path = NULL, | .emul_path = NULL, | ||||
.interp_path = "/usr/libexec/ld-elf.so.1", | .interp_path = "/usr/libexec/ld-elf.so.1", | ||||
.sysvec = &elf64_freebsd_sysvec, | .sysvec = &elf64_freebsd_sysvec_la48, | ||||
.interp_newpath = NULL, | .interp_newpath = NULL, | ||||
.brand_note = &elf64_freebsd_brandnote, | .brand_note = &elf64_freebsd_brandnote, | ||||
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE | ||||
}; | }; | ||||
SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY, | SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY, | ||||
(sysinit_cfunc_t) elf64_insert_brand_entry, | (sysinit_cfunc_t) elf64_insert_brand_entry, &freebsd_brand_oinfo); | ||||
Done Inline ActionsDrop the space after the cast. alc: Drop the space after the cast. | |||||
&freebsd_brand_oinfo); | |||||
static Elf64_Brandinfo kfreebsd_brand_info = { | static Elf64_Brandinfo kfreebsd_brand_info = { | ||||
.brand = ELFOSABI_FREEBSD, | .brand = ELFOSABI_FREEBSD, | ||||
.machine = EM_X86_64, | .machine = EM_X86_64, | ||||
.compat_3_brand = "FreeBSD", | .compat_3_brand = "FreeBSD", | ||||
.emul_path = NULL, | .emul_path = NULL, | ||||
.interp_path = "/lib/ld-kfreebsd-x86-64.so.1", | .interp_path = "/lib/ld-kfreebsd-x86-64.so.1", | ||||
.sysvec = &elf64_freebsd_sysvec, | .sysvec = &elf64_freebsd_sysvec_la48, | ||||
.interp_newpath = NULL, | .interp_newpath = NULL, | ||||
.brand_note = &elf64_kfreebsd_brandnote, | .brand_note = &elf64_kfreebsd_brandnote, | ||||
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE_MANDATORY | .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE_MANDATORY | ||||
}; | }; | ||||
SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY, | SYSINIT(kelf64, SI_SUB_EXEC, SI_ORDER_ANY, | ||||
(sysinit_cfunc_t) elf64_insert_brand_entry, | (sysinit_cfunc_t) elf64_insert_brand_entry, &kfreebsd_brand_info); | ||||
Done Inline ActionsDrop the space after the cast. alc: Drop the space after the cast. | |||||
&kfreebsd_brand_info); | |||||
void | void | ||||
elf64_dump_thread(struct thread *td, void *dst, size_t *off) | elf64_dump_thread(struct thread *td, void *dst, size_t *off) | ||||
{ | { | ||||
void *buf; | void *buf; | ||||
size_t len; | size_t len; | ||||
len = 0; | len = 0; | ||||
▲ Show 20 Lines • Show All 175 Lines • Show Last 20 Lines |
to me _checker seems a bit unclear. IMO boolean functions should answer a question, e.g. _is_la57 or _la57_supported or _la57_wanted or such as appropriate