diff options
author | thorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-18 23:10:35 +0000 |
---|---|---|
committer | thorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-18 23:10:35 +0000 |
commit | f54087fb1442ddc57cc531f96a4b3c06896ea8b9 (patch) | |
tree | c90e88bc94e69040ae166ca3c496a688057eb58c /gcc/config/netbsd.h | |
parent | 54113cf5f2279484cda6ad3cae6ae5e3e340c0ea (diff) | |
download | gcc-f54087fb1442ddc57cc531f96a4b3c06896ea8b9.tar.gz |
* config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define
__enable_execute_stack function.
* config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define
as NETBSD_ENABLE_EXECUTE_STACK.
* config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
* config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58292 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/netbsd.h')
-rw-r--r-- | gcc/config/netbsd.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/gcc/config/netbsd.h b/gcc/config/netbsd.h index 19df77ffcd8..c83ff0f545e 100644 --- a/gcc/config/netbsd.h +++ b/gcc/config/netbsd.h @@ -161,3 +161,51 @@ Boston, MA 02111-1307, USA. */ #undef WINT_TYPE #define WINT_TYPE "int" + + +/* Attempt to turn on execute permission for the stack. This may be + used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is, + if the target machine can change execute permissions on a page). + + There is no way to query the execute permission of the stack, so + we always issue the mprotect() call. + + Note that we go out of our way to use namespace-non-invasive calls + here. Unfortunately, there is no libc-internal name for mprotect(). + + Also note that no errors should be emitted by this code; it is considered + dangerous for library calls to send messages to stdout/stderr. */ + +#define NETBSD_ENABLE_EXECUTE_STACK \ +extern void __enable_execute_stack (void *); \ +void \ +__enable_execute_stack (addr) \ + void *addr; \ +{ \ + extern int mprotect (void *, size_t, int); \ + extern int __sysctl (int *, unsigned int, void *, size_t *, \ + void *, size_t); \ + \ + static int size; \ + static long mask; \ + \ + char *page, *end; \ + \ + if (size == 0) \ + { \ + int mib[2]; \ + size_t len; \ + \ + mib[0] = 6; /* CTL_HW */ \ + mib[1] = 7; /* HW_PAGESIZE */ \ + len = sizeof (size); \ + (void) __sysctl (mib, 2, &size, &len, NULL, 0); \ + mask = ~((long) size - 1); \ + } \ + \ + page = (char *) (((long) addr) & mask); \ + end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \ + \ + /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \ + (void) mprotect (page, end - page, 7); \ +} |