diff options
author | Kresten Krab Thorup <krab@gcc.gnu.org> | 1993-09-22 17:44:56 +0000 |
---|---|---|
committer | Kresten Krab Thorup <krab@gcc.gnu.org> | 1993-09-22 17:44:56 +0000 |
commit | c1381fd35793cbfdac84f74fe09179db5581c256 (patch) | |
tree | f3091e6c7bf7a7ba02ea63aa03db96c357eb8a1d /gcc | |
parent | 9aefc7b6f47fd5068f15a677fcd055bd446af7a3 (diff) | |
download | gcc-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.c | 34 |
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. |