diff options
| author | chs <chs@NetBSD.org> | 2003-08-24 17:52:28 +0000 |
|---|---|---|
| committer | chs <chs@NetBSD.org> | 2003-08-24 17:52:28 +0000 |
| commit | 939df36e552ea9012b7b0d0d15080f894ebaaaff (patch) | |
| tree | 2c4be187b10b4d03eedeccd43a6ba2359fa195e0 /sys/kern/exec_subr.c | |
| parent | 4b28d28d7028d98186f61c78a41660eb73edde00 (diff) | |
add support for non-executable mappings (where the hardware allows this)
and make the stack and heap non-executable by default. the changes
fall into two basic catagories:
- pmap and trap-handler changes. these are all MD:
= alpha: we already track per-page execute permission with the (software)
PG_EXEC bit, so just have the trap handler pay attention to it.
= i386: use a new GDT segment for %cs for processes that have no
executable mappings above a certain threshold (currently the
bottom of the stack). track per-page execute permission with
the last unused PTE bit.
= powerpc/ibm4xx: just use the hardware exec bit.
= powerpc/oea: we already track per-page exec bits, but the hardware only
implements non-exec mappings at the segment level. so track the
number of executable mappings in each segment and turn on the no-exec
segment bit iff the count is 0. adjust the trap handler to deal.
= sparc (sun4m): fix our use of the hardware protection bits.
fix the trap handler to recognize text faults.
= sparc64: split the existing unified TSB into data and instruction TSBs,
and only load TTEs into the appropriate TSB(s) for the permissions.
fix the trap handler to check for execute permission.
= not yet implemented: amd64, hppa, sh5
- changes in all the emulations that put a signal trampoline on the stack.
instead, we now put the trampoline into a uvm_aobj and map that into
the process separately.
originally from openbsd, adapted for netbsd by me.
Diffstat (limited to 'sys/kern/exec_subr.c')
| -rw-r--r-- | sys/kern/exec_subr.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/sys/kern/exec_subr.c b/sys/kern/exec_subr.c index 0c66a790564..e74eeab987a 100644 --- a/sys/kern/exec_subr.c +++ b/sys/kern/exec_subr.c @@ -1,4 +1,4 @@ -/* $NetBSD: exec_subr.c,v 1.39 2003/08/21 15:17:03 yamt Exp $ */ +/* $NetBSD: exec_subr.c,v 1.40 2003/08/24 17:52:47 chs Exp $ */ /* * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.39 2003/08/21 15:17:03 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.40 2003/08/24 17:52:47 chs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -121,7 +121,7 @@ kill_vmcmds(struct exec_vmcmd_set *evsp) for (i = 0; i < evsp->evs_used; i++) { vcp = &evsp->evs_cmds[i]; - if (vcp->ev_vp != NULLVP) + if (vcp->ev_vp != NULL) vrele(vcp->ev_vp); } evsp->evs_used = evsp->evs_cnt = 0; @@ -344,12 +344,11 @@ exec_setup_stack(struct proc *p, struct exec_package *epp) access_size), noaccess_size); if (noaccess_size > 0) { NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size, - noaccess_linear_min, NULLVP, 0, VM_PROT_NONE); + noaccess_linear_min, NULL, 0, VM_PROT_NONE); } KASSERT(access_size > 0); NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size, - access_linear_min, NULLVP, 0, - VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE); + access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE); return 0; } |
