diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 80bb700..cf43261 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -115,7 +115,12 @@ static int elf_legacy_coredump = 0; SYSCTL_INT(_debug, OID_AUTO, __elfN(legacy_coredump), CTLFLAG_RW, &elf_legacy_coredump, 0, ""); -static int __elfN(nxstack) = 0; +static int __elfN(nxstack) = +#if defined(__amd64__) || defined(__powerpc__) /* both 64 and 32 bit */ + 1; +#else + 0; +#endif SYSCTL_INT(__CONCAT(_kern_elf, __ELF_WORD_SIZE), OID_AUTO, nxstack, CTLFLAG_RW, &__elfN(nxstack), 0, __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) ": enable non-executable stack"); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index c51cc39..2704bf1 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1486,63 +1486,53 @@ exec_unregister(execsw_arg) return (0); } -static vm_object_t shared_page_obj; -static int shared_page_free; - int -shared_page_fill(int size, int align, const char *data) +shared_page_fill(struct sysentvec *sv, int size, int align, const char *data) { + vm_object_t obj; vm_page_t m; struct sf_buf *s; vm_offset_t sk; int res; - VM_OBJECT_LOCK(shared_page_obj); - m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY); - res = roundup(shared_page_free, align); - if (res + size >= IDX_TO_OFF(shared_page_obj->size)) + obj = sv->sv_shared_page_obj; + VM_OBJECT_LOCK(obj); + m = vm_page_grab(obj, 0, VM_ALLOC_RETRY); + res = roundup(sv->sv_shared_page_free, align); + if (res + size >= IDX_TO_OFF(obj->size)) res = -1; else { - VM_OBJECT_UNLOCK(shared_page_obj); + VM_OBJECT_UNLOCK(obj); s = sf_buf_alloc(m, SFB_DEFAULT); sk = sf_buf_kva(s); bcopy(data, (void *)(sk + res), size); - shared_page_free = res + size; + sv->sv_shared_page_free = res + size; sf_buf_free(s); - VM_OBJECT_LOCK(shared_page_obj); + VM_OBJECT_LOCK(obj); } vm_page_wakeup(m); - VM_OBJECT_UNLOCK(shared_page_obj); + VM_OBJECT_UNLOCK(obj); return (res); } -static void -shared_page_init(void *dummy __unused) -{ - vm_page_t m; - - shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, PAGE_SIZE, - VM_PROT_DEFAULT, 0, NULL); - VM_OBJECT_LOCK(shared_page_obj); - m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY | VM_ALLOC_NOBUSY | - VM_ALLOC_ZERO); - m->valid = VM_PAGE_BITS_ALL; - VM_OBJECT_UNLOCK(shared_page_obj); -} - -SYSINIT(shp, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t)shared_page_init, - NULL); - void exec_sysvec_init(void *param) { + vm_object_t obj; + vm_page_t m; struct sysentvec *sv; sv = (struct sysentvec *)param; - - if ((sv->sv_flags & SV_SHP) == 0) + if ((sv->sv_flags & SV_SHP) == 0 || sv->sv_shared_page_obj != NULL) return; - sv->sv_shared_page_obj = shared_page_obj; + + obj = sv->sv_shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, + PAGE_SIZE, VM_PROT_DEFAULT, 0, NULL); + VM_OBJECT_LOCK(obj); + m = vm_page_grab(obj, 0, VM_ALLOC_RETRY | VM_ALLOC_NOBUSY | + VM_ALLOC_ZERO); + m->valid = VM_PAGE_BITS_ALL; + VM_OBJECT_UNLOCK(obj); sv->sv_sigcode_base = sv->sv_shared_page_base + - shared_page_fill(*(sv->sv_szsigcode), 16, sv->sv_sigcode); + shared_page_fill(sv, *(sv->sv_szsigcode), 16, sv->sv_sigcode); } diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index 90bce21..99afd13 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -125,6 +125,7 @@ struct sysentvec { vm_offset_t sv_shared_page_len; vm_offset_t sv_sigcode_base; void *sv_shared_page_obj; + int sv_shared_page_free; void (*sv_schedtail)(struct thread *); }; @@ -235,7 +236,8 @@ int lkmressys(struct thread *, struct nosys_args *); int syscall_thread_enter(struct thread *td, struct sysent *se); void syscall_thread_exit(struct thread *td, struct sysent *se); -int shared_page_fill(int size, int align, const char *data); +int shared_page_fill(struct sysentvec *sv, int size, int align, + const char *data); void exec_sysvec_init(void *param); #define INIT_SYSENTVEC(name, sv) \