6464
6565namespace {
6666
67- // SafeAccess::isReadableRange()/isReadable() rely on a SIGSEGV handler
68- // registered via OS::replaceSigsegvHandler() to catch the fault at a known
69- // trampoline address and turn it into a safe return value (see
70- // safefetch_ut.cpp for the same pattern). Without it, a fault inside the
71- // safefetch trampoline is an ordinary unhandled SIGSEGV.
67+ // SafeAccess::isReadableRange()/isReadable() rely on SIGSEGV/SIGBUS handlers
68+ // registered via OS::replaceSigsegvHandler()/replaceSigbusHandler() to catch
69+ // the fault at a known trampoline address and turn it into a safe return
70+ // value (see safefetch_ut.cpp for the same pattern). The safefetch trampoline
71+ // can fault with either signal depending on platform, so both must be
72+ // installed; otherwise a fault delivered as the other signal is an ordinary
73+ // unhandled fault.
7274void (*orig_segvHandler)(int signo, siginfo_t *siginfo, void *ucontext);
75+ void (*orig_busHandler)(int signo, siginfo_t *siginfo, void *ucontext);
7376
7477void lineNumberTableSegvHandler (int signo, siginfo_t *siginfo, void *context) {
7578 if (!SafeAccess::handle_safefetch (signo, context)) {
76- if (orig_segvHandler != nullptr ) {
79+ if (signo == SIGBUS ) {
80+ if (orig_busHandler != nullptr ) {
81+ orig_busHandler (signo, siginfo, context);
82+ }
83+ } else if (orig_segvHandler != nullptr ) {
7784 orig_segvHandler (signo, siginfo, context);
7885 }
7986 }
@@ -83,9 +90,13 @@ class LineNumberTableCopyTest : public ::testing::Test {
8390protected:
8491 void SetUp () override {
8592 orig_segvHandler = OS::replaceSigsegvHandler (lineNumberTableSegvHandler);
93+ orig_busHandler = OS::replaceSigbusHandler (lineNumberTableSegvHandler);
8694 }
8795
88- void TearDown () override { OS::replaceSigsegvHandler (orig_segvHandler); }
96+ void TearDown () override {
97+ OS::replaceSigsegvHandler (orig_segvHandler);
98+ OS::replaceSigbusHandler (orig_busHandler);
99+ }
89100};
90101
91102// Allocates a page-sized region seeded with `count` jvmtiLineNumberEntry
0 commit comments