< prev index next >

src/share/vm/runtime/stubRoutines.cpp

Print this page
rev 7905 : 8074552:  SafeFetch32 and SafeFetchN do not work in error handling
Summary: handle SafeFetch faults in secondary signal handlers
Contributed-by: Thomas Stuefe

@@ -208,12 +208,40 @@
   ((arraycopy_fn)func)(buffer + alignment, buffer2, 0);
   for (i = 0; i < sizeof(lbuffer); i++) {
     assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
   }
 }
-#endif
 
+// simple test for SafeFetch32
+static void test_safefetch32() {
+  int dummy = 17;
+  int* const p_invalid = (int*) get_segfault_address();
+  int* const p_valid = &dummy;
+  int result_invalid = SafeFetch32(p_invalid, 0xABC);
+  assert(result_invalid == 0xABC, "SafeFetch32 error");
+  int result_valid = SafeFetch32(p_valid, 0xABC);
+  assert(result_valid == 17, "SafeFetch32 error");
+}
+
+// simple test for SafeFetchN
+static void test_safefetchN() {
+#ifdef _LP64
+  const intptr_t v1 = 0xABCD00000000ABCDULL;
+  const intptr_t v2 = 0xDEFD00000000DEFDULL;
+#else
+  const intptr_t v1 = 0xABCDABCD;
+  const intptr_t v2 = 0xDEFDDEFD;
+#endif
+  intptr_t dummy = v1;
+  intptr_t* const p_invalid = (intptr_t*) get_segfault_address();
+  intptr_t* const p_valid = &dummy;
+  intptr_t result_invalid = SafeFetchN(p_invalid, v2);
+  assert(result_invalid == v2, "SafeFetchN error");
+  intptr_t result_valid = SafeFetchN(p_valid, v2);
+  assert(result_valid == v1, "SafeFetchN error");
+}
+#endif
 
 void StubRoutines::initialize2() {
   if (_code2 == NULL) {
     ResourceMark rm;
     TraceTime timer("StubRoutines generation 2", TraceStartupTime);

@@ -298,10 +326,14 @@
   test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words_atomic), sizeof(HeapWord));
   // Aligned to BytesPerLong
   test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_conjoint_words), sizeof(jlong));
   test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_disjoint_words), sizeof(jlong));
 
+  // test safefetch routines
+  test_safefetch32();
+  test_safefetchN();
+
 #endif
 }
 
 
 void stubRoutines_init1() { StubRoutines::initialize1(); }
< prev index next >