summaryrefslogtreecommitdiff
path: root/gcc/config/netbsd.h
diff options
context:
space:
mode:
authorthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-18 23:10:35 +0000
committerthorpej <thorpej@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-18 23:10:35 +0000
commitf54087fb1442ddc57cc531f96a4b3c06896ea8b9 (patch)
treec90e88bc94e69040ae166ca3c496a688057eb58c /gcc/config/netbsd.h
parent54113cf5f2279484cda6ad3cae6ae5e3e340c0ea (diff)
downloadgcc-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.h48
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); \
+}