Merge
authordcubed
Fri, 15 Jul 2016 17:05:10 -0700
changeset 39975 44f83dd02bd5
parent 39971 fbf0d737352e (current diff)
parent 39974 f76ca6458acb (diff)
child 39976 b86bebb34220
Merge
hotspot/test/runtime/7107135/Test.java
hotspot/test/runtime/7107135/Test7107135.sh
hotspot/test/runtime/7107135/TestMT.java
hotspot/test/runtime/7107135/test.c
hotspot/test/runtime/StackGuardPages/invoke.c
hotspot/test/runtime/jsig/Test8017498.sh
hotspot/test/runtime/jsig/TestJNI.c
--- a/hotspot/make/test/JtregNative.gmk	Fri Jul 15 18:09:33 2016 +0000
+++ b/hotspot/make/test/JtregNative.gmk	Fri Jul 15 17:05:10 2016 -0700
@@ -62,12 +62,26 @@
     $(HOTSPOT_TOPDIR)/test/runtime/ThreadSignalMask
 endif
 
+ifeq ($(OPENJDK_TARGET_OS), linux)
+BUILD_HOTSPOT_JTREG_NATIVE_SRC += \
+    $(HOTSPOT_TOPDIR)/test/runtime/execstack \
+    $(HOTSPOT_TOPDIR)/test/runtime/jsig \
+    $(HOTSPOT_TOPDIR)/test/runtime/StackGuardPages
+endif
+
 ifeq ($(TOOLCHAIN_TYPE), solstudio)
     BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_liboverflow := -lc
     BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libSimpleClassFileLoadHook := -lc
     BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libGetNamedModuleTest := -lc
 endif
 
+ifeq ($(OPENJDK_TARGET_OS), linux)
+    BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libtest-rw := -z noexecstack
+    BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libtest-rwx := -z execstack
+    BUILD_HOTSPOT_JTREG_EXECUTABLES_LDFLAGS_exeinvoke := -ljvm -lpthread
+    BUILD_TEST_invoke_exeinvoke.c_OPTIMIZATION := NONE
+endif
+
 BUILD_HOTSPOT_JTREG_OUTPUT_DIR := $(BUILD_OUTPUT)/support/test/hotspot/jtreg/native
 
 BUILD_HOTSPOT_JTREG_IMAGE_DIR := $(TEST_IMAGE_DIR)/hotspot/jtreg
--- a/hotspot/test/runtime/7107135/Test.java	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 SAP SE. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-class Test {
-
-    static boolean loadLib(String libName){
-        try {
-            System.loadLibrary(libName);
-            System.out.println("Loaded library "+ libName + ".");
-            return true;
-        } catch (SecurityException e) {
-            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
-        } catch (UnsatisfiedLinkError e) {
-            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
-        }
-        return false;
-    }
-
-    public static int counter = 1;
-
-    static int Runner() {
-        counter = counter * -1;
-        int i = counter;
-        if(counter < 2) counter += Runner();
-        return i;
-    }
-
-    public static int run() {
-        try{
-            Runner();
-        } catch (StackOverflowError e) {
-            System.out.println("Caught stack overflow error.");
-            return 0;
-        } catch (OutOfMemoryError e) {
-            return 0;
-        }
-        return 2;
-    }
-
-    public static void main(String argv[]) {
-        loadLib(argv[0]);
-        System.exit(run());
-    }
-}
--- a/hotspot/test/runtime/7107135/Test7107135.sh	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-#!/bin/sh
-
-#
-#  Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
-#  Copyright (c) 2011 SAP SE. All rights reserved.
-#  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-#  This code is free software; you can redistribute it and/or modify it
-#  under the terms of the GNU General Public License version 2 only, as
-#  published by the Free Software Foundation.
-#
-#  This code is distributed in the hope that it will be useful, but WITHOUT
-#  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-#  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-#  version 2 for more details (a copy is included in the LICENSE file that
-#  accompanied this code).
-#
-#  You should have received a copy of the GNU General Public License version
-#  2 along with this work; if not, write to the Free Software Foundation,
-#  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#  Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-#  or visit www.oracle.com if you need additional information or have any
-#  questions.
-#
-
-##
-## @test Test7107135.sh
-## @bug 7107135
-## @bug 8021296
-## @bug 8025519
-## @summary Stack guard pages lost after loading library with executable stack.
-## @run shell Test7107135.sh
-##
-
-if [ "${TESTSRC}" = "" ]
-then
-  TESTSRC=${PWD}
-  echo "TESTSRC not set.  Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../test_env.sh
-
-# set platform-dependent variables
-OS=`uname -s`
-case "$OS" in
-  Linux)
-    echo "Testing on Linux"
-    gcc_cmd=`which gcc`
-    if [ "x$gcc_cmd" == "x" ]; then
-        echo "WARNING: gcc not found. Cannot execute test." 2>&1
-        exit 0;
-    fi
-    ;;
-  *)
-    echo "Test passed; only valid for Linux"
-    exit 0;
-    ;;
-esac
-
-ARCH=`uname -m`
-
-THIS_DIR=.
-
-cp ${TESTSRC}${FS}*.java ${THIS_DIR}
-${COMPILEJAVA}${FS}bin${FS}javac *.java
-
-$gcc_cmd -fPIC -shared -c -o test.o \
-    -I${COMPILEJAVA}${FS}include -I${COMPILEJAVA}${FS}include${FS}linux \
-    ${TESTSRC}${FS}test.c
-
-ld -shared -z   execstack -o libtest-rwx.so test.o
-ld -shared -z noexecstack -o libtest-rw.so  test.o
-
-
-LD_LIBRARY_PATH=${THIS_DIR}
-echo   LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}
-export LD_LIBRARY_PATH
-
-# This should not fail.
-echo Check testprogram. Expected to pass:
-echo ${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} Test test-rw
-${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} Test test-rw
-
-echo
-echo Test changing of stack protection:
-echo ${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} Test test-rwx
-${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} Test test-rwx
-JAVA_RETVAL=$?
-
-if [ "$JAVA_RETVAL" == "0" ]
-then
-  echo
-  echo ${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} TestMT test-rwx
-  ${TESTJAVA}${FS}bin${FS}java -cp ${THIS_DIR} TestMT test-rwx
-  JAVA_RETVAL=$?
-fi
-
-exit $JAVA_RETVAL
--- a/hotspot/test/runtime/7107135/TestMT.java	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 SAP SE. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-class TestMT {
-
-    static boolean loadLib(String libName) {
-        try {
-            System.loadLibrary(libName);
-            System.out.println("Loaded library "+ libName + ".");
-            return true;
-        } catch (SecurityException e) {
-            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
-        } catch (UnsatisfiedLinkError e) {
-            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
-        }
-        return false;
-    }
-
-    public static int counter        = 1;
-    static int Runner() {
-        counter = counter * -1;
-        int i = counter;
-        if (counter < 2) counter += Runner();
-        return i;
-    }
-
-    public static int run(String msg) {
-        try {
-            Runner();
-        } catch (StackOverflowError e) {
-            System.out.println(msg + " caught stack overflow error.");
-            return 0;
-        } catch (OutOfMemoryError e) {
-            return 0;
-        }
-        return 2;
-    }
-
-    public static void main(String argv[]) {
-        try {
-            for (int i = 0; i < 20; i++) {
-                Thread t = new DoStackOverflow("SpawnedThread " + i);
-                t.start();
-            }
-            run("Main thread");
-            loadLib("test-rwx");
-            run("Main thread");
-        } catch (Exception e) {
-            System.out.println(e);
-        }
-    }
-
-    static class DoStackOverflow extends Thread {
-        public DoStackOverflow(String name) {
-            super(name);
-        }
-        public void run() {
-            for (int i = 0; i < 10; ++i) {
-                TestMT.run(getName());
-                yield();
-            }
-        }
-    }
-}
--- a/hotspot/test/runtime/7107135/test.c	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 SAP SE. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include "jni.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jint JNICALL Java_Test_someMethod(JNIEnv *env, jobject mainObject) {
-  return 3;
-}
-
-#ifdef __cplusplus
-}
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/StackGuardPages/exeinvoke.c	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,289 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/* This code tests the fact that we actually remove stack guard page when calling
+ * JavaThread::exit() i.e. when detaching from current thread.
+ * We overflow the stack and check that we get access error because of a guard page.
+ * Than we detach from vm thread and overflow stack once again. This time we shouldn't
+ * get access error because stack guard page is removed
+ *
+ * Notice: due a complicated interaction of signal handlers, the test may crash.
+ * It's OK - don't file a bug.
+ */
+
+#include <assert.h>
+#include <jni.h>
+#include <alloca.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <sys/ucontext.h>
+#include <setjmp.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+#include <pthread.h>
+
+#define CLASS_PATH_OPT "-Djava.class.path="
+
+JavaVM* _jvm;
+
+static jmp_buf  context;
+
+static int _last_si_code = -1;
+static int _failures = 0;
+static int _rec_count = 0;
+static int _kp_rec_count = 0;
+
+pid_t gettid() {
+  return (pid_t) syscall(SYS_gettid);
+}
+
+static void handler(int sig, siginfo_t *si, void *unused) {
+  _last_si_code = si->si_code;
+  printf("Got SIGSEGV(%d) at address: 0x%lx\n",si->si_code, (long) si->si_addr);
+  longjmp(context, 1);
+}
+
+void set_signal_handler() {
+  static char altstack[SIGSTKSZ];
+
+  stack_t ss = {
+    .ss_size = SIGSTKSZ,
+    .ss_flags = 0,
+    .ss_sp = altstack
+  };
+
+  struct sigaction sa = {
+    .sa_sigaction = handler,
+    .sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESETHAND
+  };
+
+  _last_si_code = -1;
+
+  sigaltstack(&ss, 0);
+  sigemptyset(&sa.sa_mask);
+  if (sigaction(SIGSEGV, &sa, NULL) == -1) {
+    fprintf(stderr, "Test ERROR. Can't set sigaction (%d)\n", errno);
+    exit(7);
+  }
+}
+
+void *run_java_overflow (void *p) {
+  JNIEnv *env;
+  jclass class_id;
+  jmethodID method_id;
+  int res;
+
+  res = (*_jvm)->AttachCurrentThread(_jvm, (void**)&env, NULL);
+  if (res != JNI_OK) {
+    fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
+    exit(7);
+  }
+
+  class_id = (*env)->FindClass (env, "DoOverflow");
+  if (class_id == NULL) {
+    fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
+    exit(7);
+  }
+
+  method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
+  if (method_id == NULL) {
+    fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printIt\n");
+    exit(7);
+  }
+
+  (*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
+
+  res = (*_jvm)->DetachCurrentThread(_jvm);
+  if (res != JNI_OK) {
+    fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
+    exit(7);
+  }
+  return NULL;
+}
+
+void do_overflow(){
+  int *p = alloca(sizeof(int));
+  if (_kp_rec_count == 0 || _rec_count < _kp_rec_count) {
+      _rec_count ++;
+      do_overflow();
+  }
+}
+
+void *run_native_overflow(void *p) {
+  // Test that stack guard page is correctly set for initial and non initial thread
+  // and correctly removed for the initial thread
+  JNIEnv *env;
+  jclass class_id;
+  jmethodID method_id;
+  int res;
+
+  printf("run_native_overflow %ld\n", (long) gettid());
+
+  res = (*_jvm)->AttachCurrentThread(_jvm, (void **)&env, NULL);
+  if (res != JNI_OK) {
+    fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
+    exit(7);
+  }
+
+  class_id = (*env)->FindClass (env, "DoOverflow");
+  if (class_id == NULL) {
+    fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
+    exit(7);
+  }
+
+  method_id = (*env)->GetStaticMethodID (env, class_id, "printAlive", "()V");
+  if (method_id == NULL) {
+    fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printAlive\n");
+    exit(7);
+  }
+
+  (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
+
+  set_signal_handler();
+  if (! setjmp(context)) {
+    do_overflow();
+  }
+
+  if (_last_si_code == SEGV_ACCERR) {
+    printf("Test PASSED. Got access violation accessing guard page at %d\n", _rec_count);
+  }
+
+  res = (*_jvm)->DetachCurrentThread(_jvm);
+  if (res != JNI_OK) {
+    fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
+    exit(7);
+  }
+
+  if (getpid() != gettid()) {
+    // For non-initial thread we don't unmap the region but call os::uncommit_memory and keep PROT_NONE
+    // so if host has enough swap space we will get the same SEGV with code SEGV_ACCERR(2) trying
+    // to access it as if the guard page is present.
+    // We have no way to check this, so bail out, marking test as succeeded
+    printf("Test PASSED. Not initial thread\n");
+    return NULL;
+  }
+
+  // Limit depth of recursion for second run. It can't exceed one for first run.
+  _kp_rec_count = _rec_count;
+  _rec_count = 0;
+
+  set_signal_handler();
+  if (! setjmp(context)) {
+    do_overflow();
+  }
+
+  if (_last_si_code == SEGV_ACCERR) {
+      ++ _failures;
+      fprintf(stderr,"Test FAILED. Stack guard page is still there at %d\n", _rec_count);
+  } else if (_last_si_code == -1) {
+      printf("Test PASSED. No stack guard page is present. Maximum recursion level reached at %d\n", _rec_count);
+  }
+  else{
+      printf("Test PASSED. No stack guard page is present. SIGSEGV(%d) at %d\n", _last_si_code, _rec_count);
+  }
+
+  return NULL;
+}
+
+void usage() {
+  fprintf(stderr, "Usage: invoke test_java_overflow\n");
+  fprintf(stderr, "       invoke test_native_overflow\n");
+}
+
+
+int main (int argc, const char** argv) {
+  JavaVMInitArgs vm_args;
+  JavaVMOption options[3];
+  JNIEnv* env;
+  int optlen;
+  char *javaclasspath = NULL;
+  char javaclasspathopt[4096];
+
+  printf("Test started with pid: %ld\n", (long) getpid());
+
+  /* set the java class path so the DoOverflow class can be found */
+  javaclasspath = getenv("CLASSPATH");
+
+  if (javaclasspath == NULL) {
+    fprintf(stderr, "Test ERROR. CLASSPATH is not set\n");
+    exit(7);
+  }
+  optlen = strlen(CLASS_PATH_OPT) + strlen(javaclasspath) + 1;
+  if (optlen > 4096) {
+    fprintf(stderr, "Test ERROR. CLASSPATH is too long\n");
+    exit(7);
+  }
+  snprintf(javaclasspathopt, sizeof(javaclasspathopt), "%s%s",
+      CLASS_PATH_OPT, javaclasspath);
+
+  options[0].optionString = "-Xint";
+  options[1].optionString = "-Xss328k";
+  options[2].optionString = javaclasspathopt;
+
+  vm_args.version = JNI_VERSION_1_2;
+  vm_args.ignoreUnrecognized = JNI_TRUE;
+  vm_args.options = options;
+  vm_args.nOptions = 3;
+
+  if (JNI_CreateJavaVM (&_jvm, (void **)&env, &vm_args) < 0 ) {
+    fprintf(stderr, "Test ERROR. Can't create JavaVM\n");
+    exit(7);
+  }
+
+  pthread_t thr;
+
+  if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) {
+    printf("\nTesting JAVA_OVERFLOW\n");
+
+    printf("Testing stack guard page behaviour for other thread\n");
+    pthread_create (&thr, NULL, run_java_overflow, NULL);
+    pthread_join (thr, NULL);
+
+    printf("Testing stack guard page behaviour for initial thread\n");
+    run_java_overflow(NULL);
+    // This test crash on error
+    exit(0);
+  }
+
+  if (argc > 1 && strcmp(argv[1], "test_native_overflow") == 0) {
+    printf("\nTesting NATIVE_OVERFLOW\n");
+
+    printf("Testing stack guard page behaviour for other thread\n");
+    pthread_create (&thr, NULL, run_native_overflow, NULL);
+    pthread_join (thr, NULL);
+
+    printf("Testing stack guard page behaviour for initial thread\n");
+    run_native_overflow(NULL);
+
+    exit((_failures > 0) ? 1 : 0);
+  }
+
+  fprintf(stderr, "Test ERROR. Unknown parameter %s\n", ((argc > 1) ? argv[1] : "none"));
+  usage();
+  exit(7);
+}
--- a/hotspot/test/runtime/StackGuardPages/invoke.c	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,266 +0,0 @@
-/*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-/* This code tests the fact that we actually remove stack guard page when calling
- * JavaThread::exit() i.e. when detaching from current thread.
- * We overflow the stack and check that we get access error because of a guard page.
- * Than we detach from vm thread and overflow stack once again. This time we shouldn't
- * get access error because stack guard page is removed
- *
- * Notice: due a complicated interaction of signal handlers, the test may crash.
- * It's OK - don't file a bug.
- */
-
-#include <assert.h>
-#include <jni.h>
-#include <alloca.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <stdlib.h>
-#include <sys/ucontext.h>
-#include <setjmp.h>
-#include <unistd.h>
-#include <sys/syscall.h>
-#include <errno.h>
-
-#include <pthread.h>
-
-JavaVM* _jvm;
-
-static jmp_buf  context;
-
-static int _last_si_code = -1;
-static int _failures = 0;
-static int _rec_count = 0;
-static int _kp_rec_count = 0;
-
-pid_t gettid() {
-  return (pid_t) syscall(SYS_gettid);
-}
-
-static void handler(int sig, siginfo_t *si, void *unused) {
-  _last_si_code = si->si_code;
-  printf("Got SIGSEGV(%d) at address: 0x%lx\n",si->si_code, (long) si->si_addr);
-  longjmp(context, 1);
-}
-
-void set_signal_handler() {
-  static char altstack[SIGSTKSZ];
-
-  stack_t ss = {
-    .ss_size = SIGSTKSZ,
-    .ss_flags = 0,
-    .ss_sp = altstack
-  };
-
-  struct sigaction sa = {
-    .sa_sigaction = handler,
-    .sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESETHAND
-  };
-
-  _last_si_code = -1;
-
-  sigaltstack(&ss, 0);
-  sigemptyset(&sa.sa_mask);
-  if (sigaction(SIGSEGV, &sa, NULL) == -1) {
-    fprintf(stderr, "Test ERROR. Can't set sigaction (%d)\n", errno);
-    exit(7);
-  }
-}
-
-void *run_java_overflow (void *p) {
-  JNIEnv *env;
-  jclass class_id;
-  jmethodID method_id;
-  int res;
-
-  res = (*_jvm)->AttachCurrentThread(_jvm, (void**)&env, NULL);
-  if (res != JNI_OK) {
-    fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
-    exit(7);
-  }
-
-  class_id = (*env)->FindClass (env, "DoOverflow");
-  if (class_id == NULL) {
-    fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
-    exit(7);
-  }
-
-  method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
-  if (method_id == NULL) {
-    fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printIt\n");
-    exit(7);
-  }
-
-  (*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
-
-  res = (*_jvm)->DetachCurrentThread(_jvm);
-  if (res != JNI_OK) {
-    fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
-    exit(7);
-  }
-}
-
-void do_overflow(){
-  int *p = alloca(sizeof(int));
-  if (_kp_rec_count == 0 || _rec_count < _kp_rec_count) {
-      _rec_count ++;
-      do_overflow();
-  }
-}
-
-void *run_native_overflow(void *p) {
-  // Test that stack guard page is correctly set for initial and non initial thread
-  // and correctly removed for the initial thread
-  JNIEnv *env;
-  jclass class_id;
-  jmethodID method_id;
-  int res;
-
-  printf("run_native_overflow %ld\n", (long) gettid());
-
-  res = (*_jvm)->AttachCurrentThread(_jvm, (void **)&env, NULL);
-  if (res != JNI_OK) {
-    fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
-    exit(7);
-  }
-
-  class_id = (*env)->FindClass (env, "DoOverflow");
-  if (class_id == NULL) {
-    fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
-    exit(7);
-  }
-
-  method_id = (*env)->GetStaticMethodID (env, class_id, "printAlive", "()V");
-  if (method_id == NULL) {
-    fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printAlive\n");
-    exit(7);
-  }
-
-  (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
-
-  set_signal_handler();
-  if (! setjmp(context)) {
-    do_overflow();
-  }
-
-  if (_last_si_code == SEGV_ACCERR) {
-    printf("Test PASSED. Got access violation accessing guard page at %d\n", _rec_count);
-  }
-
-  res = (*_jvm)->DetachCurrentThread(_jvm);
-  if (res != JNI_OK) {
-    fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
-    exit(7);
-  }
-
-  if (getpid() != gettid()) {
-    // For non-initial thread we don't unmap the region but call os::uncommit_memory and keep PROT_NONE
-    // so if host has enough swap space we will get the same SEGV with code SEGV_ACCERR(2) trying
-    // to access it as if the guard page is present.
-    // We have no way to check this, so bail out, marking test as succeeded
-    printf("Test PASSED. Not initial thread\n");
-    return NULL;
-  }
-
-  // Limit depth of recursion for second run. It can't exceed one for first run.
-  _kp_rec_count = _rec_count;
-  _rec_count = 0;
-
-  set_signal_handler();
-  if (! setjmp(context)) {
-    do_overflow();
-  }
-
-  if (_last_si_code == SEGV_ACCERR) {
-      ++ _failures;
-      fprintf(stderr,"Test FAILED. Stack guard page is still there at %d\n", _rec_count);
-  } else if (_last_si_code == -1) {
-      printf("Test PASSED. No stack guard page is present. Maximum recursion level reached at %d\n", _rec_count);
-  }
-  else{
-      printf("Test PASSED. No stack guard page is present. SIGSEGV(%d) at %d\n", _last_si_code, _rec_count);
-  }
-
-  return NULL;
-}
-
-void usage() {
-  fprintf(stderr, "Usage: invoke test_java_overflow\n");
-  fprintf(stderr, "       invoke test_native_overflow\n");
-  exit(7);
-}
-
-
-int main (int argc, const char** argv) {
-  JavaVMInitArgs vm_args;
-  JavaVMOption options[2];
-  JNIEnv* env;
-
-  printf("Test started with pid: %ld\n", (long) getpid());
-
-  options[0].optionString = "-Xint";
-  options[1].optionString = "-Xss512k";
-
-  vm_args.version = JNI_VERSION_1_2;
-  vm_args.ignoreUnrecognized = JNI_TRUE;
-  vm_args.options = options;
-  vm_args.nOptions = 2;
-
-  if (JNI_CreateJavaVM (&_jvm, (void **)&env, &vm_args) < 0 ) {
-    fprintf(stderr, "Test ERROR. Can't create JavaVM\n");
-    exit(7);
-  }
-
-  pthread_t thr;
-
-  if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) {
-    printf("\nTesting JAVA_OVERFLOW\n");
-
-    printf("Testing stack guard page behaviour for other thread\n");
-    pthread_create (&thr, NULL, run_java_overflow, NULL);
-    pthread_join (thr, NULL);
-
-    printf("Testing stack guard page behaviour for initial thread\n");
-    run_java_overflow(NULL);
-    // This test crash on error
-    exit(0);
-  }
-
-  if (argc > 1 && strcmp(argv[1], "test_native_overflow") == 0) {
-    printf("\nTesting NATIVE_OVERFLOW\n");
-
-    printf("Testing stack guard page behaviour for other thread\n");
-    pthread_create (&thr, NULL, run_native_overflow, NULL);
-    pthread_join (thr, NULL);
-
-    printf("Testing stack guard page behaviour for initial thread\n");
-    run_native_overflow(NULL);
-
-    exit((_failures > 0) ? 1 : 0);
-  }
-
-  fprintf(stderr, "Test ERROR. Unknown parameter %s\n", ((argc > 1) ? argv[1] : "none"));
-  usage();
-}
--- a/hotspot/test/runtime/StackGuardPages/testme.sh	Fri Jul 15 18:09:33 2016 +0000
+++ b/hotspot/test/runtime/StackGuardPages/testme.sh	Fri Jul 15 17:05:10 2016 -0700
@@ -1,8 +1,29 @@
+# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
 #!/bin/sh
 
 #
 # @test testme.sh
 # @summary Stack guard pages should be installed correctly and removed when thread is detached
+# @compile DoOverflow.java
 # @run shell testme.sh
 #
 
@@ -21,40 +42,10 @@
   exit 0
 fi
 
-gcc_cmd=`which gcc`
-if [ "x$gcc_cmd" = "x" ]; then
-  echo "WARNING: gcc not found. Cannot execute test." 2>&1
-  exit 0;
-fi
-
-CFLAGS=-m${VM_BITS}
-
 LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
 export LD_LIBRARY_PATH
 
-echo "Architecture: ${VM_CPU}"
-echo "Compilation flag: ${CFLAGS}"
-echo "VM type: ${VM_TYPE}"
-echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}"
-
-# Note pthread may not be found thus invoke creation will fail to be created.
-# Check to ensure you have a /usr/lib/libpthread.so if you don't please look
-# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation.
-
-cp ${TESTSRC}/DoOverflow.java .
-${COMPILEJAVA}/bin/javac DoOverflow.java
-
-$gcc_cmd -DLINUX -g3 ${CFLAGS} -o invoke \
-    -I${TESTJAVA}/include -I${TESTJAVA}/include/linux \
-    -L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \
-    -L${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE} \
-     ${TESTSRC}/invoke.c -ljvm -lpthread
-
-if [ $? -ne 0 ] ; then
-    echo "Compile failed, Ignoring failed compilation and forcing the test to pass"
-    exit 0
-fi
-
-./invoke test_java_overflow
-./invoke test_native_overflow
+# Run the test for a java and native overflow
+${TESTNATIVEPATH}/invoke test_java_overflow
+${TESTNATIVEPATH}/invoke test_native_overflow
 exit $?
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/execstack/Test.java	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2002-2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 SAP AG.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+class Test {
+
+    static boolean loadLib(String libName){
+        try {
+            System.loadLibrary(libName);
+            System.out.println("Loaded library "+ libName + ".");
+            return true;
+        } catch (SecurityException e) {
+            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
+        } catch (UnsatisfiedLinkError e) {
+            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
+        }
+        return false;
+    }
+
+    public static int counter = 1;
+
+    static int Runner() {
+        counter = counter * -1;
+        int i = counter;
+        if (counter < 2) counter += Runner();
+        return i;
+    }
+
+    public static int run() {
+        try{
+            Runner();
+        } catch (StackOverflowError e) {
+            System.out.println("Caught stack overflow error.");
+            return 0;
+        } catch (OutOfMemoryError e) {
+            return 0;
+        }
+        return 2;
+    }
+
+    public static void main(String argv[]) {
+        loadLib(argv[0]);
+        System.exit(run());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/execstack/TestMT.java	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2002-2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 SAP AG.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+class TestMT {
+
+    static boolean loadLib(String libName) {
+        try {
+            System.loadLibrary(libName);
+            System.out.println("Loaded library "+ libName + ".");
+            return true;
+        } catch (SecurityException e) {
+            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
+        } catch (UnsatisfiedLinkError e) {
+            System.out.println("loadLibrary(\"" + libName + "\") throws: " + e + "\n");
+        }
+        return false;
+    }
+
+    public static int counter = 1;
+    static int Runner() {
+        counter = counter * -1;
+        int i = counter;
+        if (counter < 2) counter += Runner();
+        return i;
+    }
+
+    public static int run(String msg) {
+        try {
+            Runner();
+        } catch (StackOverflowError e) {
+            System.out.println(msg + " caught stack overflow error.");
+            return 0;
+        } catch (OutOfMemoryError e) {
+            return 0;
+        }
+        return 2;
+    }
+
+    public static void main(String argv[]) {
+        try {
+            for (int i = 0; i < 20; i++) {
+                Thread t = new DoStackOverflow("SpawnedThread " + i);
+                t.start();
+            }
+            run("Main thread");
+            loadLib("test-rwx");
+            run("Main thread");
+        } catch (Exception e) {
+            System.out.println(e);
+        }
+    }
+
+    static class DoStackOverflow extends Thread {
+        public DoStackOverflow(String name) {
+            super(name);
+        }
+        public void run() {
+            for (int i = 0; i < 10; ++i) {
+                TestMT.run(getName());
+                yield();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/execstack/Testexecstack.java	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test Testexecstack.java
+ * @bug 7107135
+ * @bug 8021296
+ * @bug 8025519
+ * @summary Stack guard pages lost after loading library with executable stack.
+ * @requires (os.family == "linux")
+ * @library /testlibrary
+ * @build jdk.test.lib.*
+ * @compile Test.java
+ * @compile TestMT.java
+ * @run driver Testexecstack
+ */
+
+import jdk.test.lib.*;
+
+public class Testexecstack {
+
+    public static void main(String[] args) throws Throwable {
+
+        // Get the library path property
+        String libpath = System.getProperty("java.library.path");
+
+        // Create a new java process for the Test Java/JNI test without
+        // an executeable stack
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+            "-Djava.library.path=" + libpath + ":.", "Test", "test-rw");
+
+        // Start the process and check the output
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+        output.shouldHaveExitValue(0);
+
+        // Create a new java process for the Test Java/JNI test with an
+        // executable stack
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-Djava.library.path=" + libpath + ":.", "Test", "test-rwx");
+
+        // Start the process and check the output
+        output = new OutputAnalyzer(pb.start());
+        output.shouldHaveExitValue(0);
+
+        // Create a new java process for the TestMT Java/JNI test with an
+        // executable stack
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-Djava.library.path=" + libpath + ":.", "TestMT", "test-rwx");
+
+        // Start the process and check the output
+        output = new OutputAnalyzer(pb.start());
+        output.shouldHaveExitValue(0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/execstack/libtest-rw.c	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2002-2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 SAP AG.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This source file is the same as libtest-rwx.c and needs to be a separate
+ * file so it can be built with "-z noexecstack" by the build process.
+ * If any changes are made they probably also need to be made to libtest-rwx.c.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "jni.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jint JNICALL Java_Test_someMethod(JNIEnv *env, jobject mainObject) {
+  return 3;
+}
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/execstack/libtest-rwx.c	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2002-2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 SAP AG.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This source file is the same as libtest-rw.c and needs to be a separate
+ * file so it can be built with "-z execstack" by the build process.
+ * If any changes are made they probably also need to be made to libtest-rwx.c.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "jni.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jint JNICALL Java_Test_someMethod(JNIEnv *env, jobject mainObject) {
+  return 3;
+}
+
+#ifdef __cplusplus
+}
+#endif
--- a/hotspot/test/runtime/jsig/Test8017498.sh	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-#!/bin/sh
-
-#
-#  Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
-#  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-#  This code is free software; you can redistribute it and/or modify it
-#  under the terms of the GNU General Public License version 2 only, as
-#  published by the Free Software Foundation.
-#
-#  This code is distributed in the hope that it will be useful, but WITHOUT
-#  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-#  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-#  version 2 for more details (a copy is included in the LICENSE file that
-#  accompanied this code).
-#
-#  You should have received a copy of the GNU General Public License version
-#  2 along with this work; if not, write to the Free Software Foundation,
-#  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-#  Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-#  or visit www.oracle.com if you need additional information or have any
-#  questions.
-#
-
-##
-## @test Test8017498.sh
-## @bug 8017498
-## @bug 8020791
-## @bug 8021296
-## @bug 8022301
-## @bug 8025519
-## @summary sigaction(sig) results in process hang/timed-out if sig is much greater than SIGRTMAX
-## @run shell/timeout=60 Test8017498.sh
-##
-
-if [ -z "${TESTSRC}" ]; then
-  TESTSRC="${PWD}"
-  echo "TESTSRC not set.  Using "${TESTSRC}" as default"
-fi
-
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../test_env.sh
-
-EXTRA_CFLAG=
-
-# set platform-dependent variables
-OS=`uname -s`
-case "$OS" in
-  Linux)
-    echo "Testing on Linux"
-    gcc_cmd=`which gcc`
-    if [ -z "$gcc_cmd" ]; then
-        echo "WARNING: gcc not found. Cannot execute test." 2>&1
-        exit 0;
-    fi
-    MY_LD_PRELOAD=${TESTJAVA}${FS}jre${FS}lib${FS}${VM_CPU}${FS}libjsig.so
-    if [ "$VM_BITS" = "32" ] && [ "$VM_CPU" != "arm" ] && [ "$VM_CPU" != "ppc" ]; then
-        EXTRA_CFLAG=-m32
-    fi
-    echo MY_LD_PRELOAD = ${MY_LD_PRELOAD}
-    ;;
-  *)
-    echo "Test passed; only valid for Linux"
-    exit 0;
-    ;;
-esac
-
-THIS_DIR=.
-
-cp "${TESTSRC}${FS}"*.java "${THIS_DIR}"
-${COMPILEJAVA}${FS}bin${FS}javac *.java
-
-$gcc_cmd -DLINUX -fPIC -shared \
-    ${EXTRA_CFLAG} -z noexecstack \
-    -o libTestJNI.so \
-    -I${COMPILEJAVA}${FS}include \
-    -I${COMPILEJAVA}${FS}include${FS}linux \
-    ${TESTSRC}${FS}TestJNI.c
-
-if [ $? -ne 0 ] ; then
-    echo "Compile failed, Ignoring failed compilation and forcing the test to pass"
-    exit 0
-fi
-
-# run the java test in the background
-cmd="LD_PRELOAD=$MY_LD_PRELOAD \
-    ${TESTJAVA}${FS}bin${FS}java \
-    -Djava.library.path=. -server TestJNI 100"
-echo "$cmd > test.out"
-eval $cmd > test.out
-
-if grep "old handler" test.out > ${NULL}; then
-    echo "Test Passed"
-    exit 0
-fi
-
-echo "Test Failed"
-exit 1
--- a/hotspot/test/runtime/jsig/TestJNI.c	Fri Jul 15 18:09:33 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include <stdio.h>
-#include <jni.h>
-#include <signal.h>
-#include <sys/ucontext.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void sig_handler(int sig, siginfo_t *info, ucontext_t *context) {
-
-    printf( " HANDLER (1) " );
-}
-
-JNIEXPORT void JNICALL Java_TestJNI_doSomething(JNIEnv *env, jclass klass, jint val) {
-    struct sigaction act;
-    struct sigaction oact;
-
-    act.sa_flags = SA_ONSTACK|SA_RESTART|SA_SIGINFO;
-    sigfillset(&act.sa_mask);
-    act.sa_handler = SIG_DFL;
-    act.sa_sigaction = (void (*)())sig_handler;
-    sigaction(0x20+val, &act, &oact);
-
-    printf( " doSomething(%d) " , val);
-    printf( " old handler = %p " , oact.sa_handler);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jsig/libTestJNI.c	Fri Jul 15 17:05:10 2016 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <jni.h>
+#include <signal.h>
+#include <sys/ucontext.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void sig_handler(int sig, siginfo_t *info, ucontext_t *context) {
+
+    printf( " HANDLER (1) " );
+}
+
+JNIEXPORT void JNICALL Java_TestJNI_doSomething(JNIEnv *env, jclass klass, jint val) {
+    struct sigaction act;
+    struct sigaction oact;
+
+    act.sa_flags = SA_ONSTACK|SA_RESTART|SA_SIGINFO;
+    sigfillset(&act.sa_mask);
+    act.sa_handler = SIG_DFL;
+    act.sa_sigaction = (void (*)())sig_handler;
+    sigaction(0x20+val, &act, &oact);
+
+    printf( " doSomething(%d) " , val);
+    printf( " old handler = %p " , oact.sa_handler);
+}
+
+#ifdef __cplusplus
+}
+#endif
+