freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define __enable_execute_stack function.
authorDavid O'Brien <obrien@FreeBSD.org>
Thu, 31 Oct 2002 09:08:11 +0000 (09:08 +0000)
committerDavid O'Brien <obrien@gcc.gnu.org>
Thu, 31 Oct 2002 09:08:11 +0000 (09:08 +0000)
2002-10-31  David O'Brien  <obrien@FreeBSD.org>
* config/sparc/freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define
__enable_execute_stack function.

Approved by:  David S. Miller <davem@redhat.com>
              Message-Id: <20021031.005015.22856738.davem@redhat.com>

From-SVN: r58674

gcc/ChangeLog
gcc/config/sparc/freebsd.h

index 69c735e..15eaa39 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-31  David O'Brien  <obrien@FreeBSD.org>
+
+       * config/sparc/freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define
+       __enable_execute_stack function.
+
 2002-10-30  Aldy Hernandez  <aldyh@redhat.com>
 
         * c-common.c: Add GTY to vector_type_node_list.
index 8149923..73155ae 100644 (file)
@@ -96,6 +96,37 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #undef  SPARC_DEFAULT_CMODEL
 #define SPARC_DEFAULT_CMODEL   CM_MEDLOW
 
+#define TRANSFER_FROM_TRAMPOLINE                                       \
+static int need_enable_exec_stack;                                     \
+                                                                       \
+static void check_enabling(void) __attribute__ ((constructor));                \
+static void check_enabling(void)                                       \
+{                                                                      \
+  extern int sysctlbyname(const char *, void *, size_t *, void *, size_t);\
+  size_t len;                                                          \
+  int prot;                                                            \
+                                                                       \
+  prot = 0;                                                            \
+  len = sizeof(prot);                                                  \
+  sysctlbyname ("kern.stackprot", &prot, &len, NULL, 0);               \
+  if (prot != 7)                                                       \
+    need_enable_exec_stack = 1;                                                \
+}                                                                      \
+                                                                       \
+extern void __enable_execute_stack (void *);                           \
+void                                                                   \
+__enable_execute_stack (addr)                                          \
+     void *addr;                                                       \
+{                                                                      \
+  if (!need_enable_exec_stack)                                         \
+    return;                                                            \
+  else {                                                               \
+    /* 7 is PROT_READ | PROT_WRITE | PROT_EXEC */                      \
+    if (mprotect (addr, TRAMPOLINE_SIZE, 7) < 0)                       \
+      perror ("mprotect of trampoline code");                          \
+  }                                                                    \
+}
+
 
 /************************[  Assembler stuff  ]********************************/