netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define __enable_execute_stack function.
authorJason Thorpe <thorpej@wasabisystems.com>
Fri, 18 Oct 2002 23:10:35 +0000 (23:10 +0000)
committerJason Thorpe <thorpej@gcc.gnu.org>
Fri, 18 Oct 2002 23:10:35 +0000 (23:10 +0000)
* 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

gcc/ChangeLog
gcc/config/alpha/netbsd.h
gcc/config/i386/netbsd-elf.h
gcc/config/i386/netbsd.h
gcc/config/i386/netbsd64.h
gcc/config/netbsd.h
gcc/config/sparc/netbsd-elf.h
gcc/config/sparc/netbsd.h

index 53bbe9a713c3aa83f9e479e927f9a19bdde60f68..5ca6ddd6bf0eb299303426743d62000da93095b2 100644 (file)
@@ -1,3 +1,15 @@
+2002-10-18  Jason Thorpe  <thorpej@wasabisystems.com>
+
+       * 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.
+
 2002-10-18  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * config/i386/i386.c (x86_initialize_trampoline): Emit a call
index 4769af887451515d08821ce6419014443f5461a2..4dc713ba537acac945c8176626c92d17aaabdf90 100644 (file)
@@ -75,5 +75,10 @@ Boston, MA 02111-1307, USA.  */
    %{!shared:crtend%O%s} %{shared:crtendS%O%s}"
 
 
+/* Attempt to enable execute permissions on the stack.  */
+
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
+
 #undef TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/alpha ELF)");
index a1591f732f137c7fc75ecab0a44a788f5143de1e..4f49bd3e84fca424b6354618236ccea61347a274 100644 (file)
@@ -121,4 +121,7 @@ Boston, MA 02111-1307, USA.  */
    we don't care about compatibility with older gcc versions.  */
 #define DEFAULT_PCC_STRUCT_RETURN 1
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/i386 ELF)");
index ab0af773bd176a3353bc2b2402a4792b27d4beee..45ae893595e66e73d4aa21e09f613923a688b967 100644 (file)
@@ -67,3 +67,6 @@
    prefix is added.  */
 #undef GOT_SYMBOL_NAME
 #define GOT_SYMBOL_NAME "GLOBAL_OFFSET_TABLE_"
+
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
index 89050bc540b61e4b547af479186aabae389aff74..341b6d1189b91da8ab080d7b1a803c6eb6b1f892 100644 (file)
@@ -69,5 +69,7 @@ Boston, MA 02111-1307, USA.  */
     fprintf (FILE, "\tcall __mcount\n");                               \
 }
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
 
 #define TARGET_VERSION fprintf (stderr, " (NetBSD/x86_64 ELF)");
index 19df77ffcd8d1750ee30fccc5d9ca1a6b57d1d09..c83ff0f545ebdb95200c88d0be146494fa023b50 100644 (file)
@@ -161,3 +161,51 @@ Boston, MA 02111-1307, USA.  */
 
 #undef WINT_TYPE
 #define WINT_TYPE "int"
+\f
+
+/* 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);                               \
+}
index eaa801cf59856225f97538c83347f4fac91b7b50..10788f2ae3b0e7ee840d34b7dce3775673b241ca 100644 (file)
@@ -102,6 +102,9 @@ Boston, MA 02111-1307, USA.  */
 
 #undef STDC_0_IN_SYSTEM_HEADERS
 
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK
+
 #undef TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
 
index f6a5244333a7100e42fc84c3c5f4fcfeb87cde58..284e288d5e41935e9e1fffd0782068e2d77525f6 100644 (file)
@@ -44,3 +44,6 @@
 /* Until they use ELF or something that handles dwarf2 unwinds
    and initialization stuff better.  */
 #define DWARF2_UNWIND_INFO 0
+
+/* Attempt to enable execute permissions on the stack.  */
+#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK