aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKresten Krab Thorup <krab@gcc.gnu.org>1993-09-22 17:44:56 +0000
committerKresten Krab Thorup <krab@gcc.gnu.org>1993-09-22 17:44:56 +0000
commitc1381fd35793cbfdac84f74fe09179db5581c256 (patch)
treef3091e6c7bf7a7ba02ea63aa03db96c357eb8a1d /gcc
parent9aefc7b6f47fd5068f15a677fcd055bd446af7a3 (diff)
downloadgcc-c1381fd35793cbfdac84f74fe09179db5581c256.zip
gcc-c1381fd35793cbfdac84f74fe09179db5581c256.tar.gz
gcc-c1381fd35793cbfdac84f74fe09179db5581c256.tar.bz2
(__enable_execute_stack): Add case for NeXT/__MACH__.
From-SVN: r5394
Diffstat (limited to 'gcc')
-rw-r--r--gcc/libgcc2.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 0acbe80..d1383bb 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -1712,6 +1712,40 @@ __clear_cache (beg, end)
TRANSFER_FROM_TRAMPOLINE
#endif
+#if defined (NeXT) && defined (__MACH__)
+
+/* Make stack executable so we can call trampolines on stack.
+ This is called from INITIALIZE_TRAMPOLINE in next.h. */
+
+#include <mach/mach.h>
+
+void
+__enable_execute_stack (addr)
+ char *addr;
+{
+ kern_return_t r;
+ char *eaddr = addr + TRAMPOLINE_SIZE;
+ vm_address_t a = (vm_address_t) addr;
+
+ /* turn on execute access on stack */
+ r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL);
+ if (r != KERN_SUCCESS)
+ {
+ mach_error("vm_protect VM_PROT_ALL", r);
+ exit(1);
+ }
+
+ /* We inline the i-cache invalidation for speed */
+
+#ifdef CLEAR_INSN_CACHE
+ CLEAR_INSN_CACHE (addr, eaddr);
+#else
+ __clear_cache ((int) addr, (int) eaddr);
+#endif
+}
+
+#endif /* defined (NeXT) && defined (__MACH__) */
+
#ifdef __convex__
/* Make stack executable so we can call trampolines on stack.