diff options
author | Jason Thorpe <thorpej@wasabisystems.com> | 2002-10-18 23:10:35 +0000 |
---|---|---|
committer | Jason Thorpe <thorpej@gcc.gnu.org> | 2002-10-18 23:10:35 +0000 |
commit | 90e021a061203481abb6d80e59e3b83ac26fb05d (patch) | |
tree | c90e88bc94e69040ae166ca3c496a688057eb58c /gcc/config/netbsd.h | |
parent | 5791cc29703f503573795fb2ddfad79fb99e8be3 (diff) | |
download | gcc-90e021a061203481abb6d80e59e3b83ac26fb05d.zip gcc-90e021a061203481abb6d80e59e3b83ac26fb05d.tar.gz gcc-90e021a061203481abb6d80e59e3b83ac26fb05d.tar.bz2 |
netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define __enable_execute_stack function.
* 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.
From-SVN: r58292
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 19df77f..c83ff0f 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); \ +} |