8074552: SafeFetch32 and SafeFetchN do not work in error handling

Reviewed-by: dholmes, goetz
This commit is contained in:
Thomas Stufe 2015-03-12 19:34:50 -04:00 committed by David Holmes
parent cc658928be
commit 33690bd090
21 changed files with 255 additions and 32 deletions

View file

@ -210,8 +210,36 @@ static void test_arraycopy_func(address func, int alignment) {
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 = UCONST64(0xABCD00000000ABCD);
const intptr_t v2 = UCONST64(0xDEFD00000000DEFD);
#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) {
@ -300,6 +328,13 @@ void StubRoutines::initialize2() {
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
// Not on Windows 32bit until 8074860 is fixed
#if ! (defined(_WIN32) && defined(_M_IX86))
test_safefetch32();
test_safefetchN();
#endif
#endif
}