< prev index next >

src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp

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

*** 182,191 **** --- 182,196 ---- address pc = (address)uc->uc_mcontext.gregs[REG_PC]; // set npc to zero to avoid using it for safepoint, good for profiling only return ExtendedPC(pc); } + void os::Solaris::ucontext_set_pc(ucontext_t* uc, address pc) { + uc->uc_mcontext.gregs [REG_PC] = (greg_t) pc; + uc->uc_mcontext.gregs [REG_nPC] = (greg_t) (pc + 4); + } + // Assumes ucontext is valid intptr_t* os::Solaris::ucontext_get_sp(ucontext_t *uc) { return (intptr_t*)((intptr_t)uc->uc_mcontext.gregs[REG_SP] + STACK_BIAS); }
*** 353,364 **** pc = (address) uc->uc_mcontext.gregs[REG_PC]; npc = (address) uc->uc_mcontext.gregs[REG_nPC]; // SafeFetch() support if (StubRoutines::is_safefetch_fault(pc)) { ! uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc)); ! uc->uc_mcontext.gregs[REG_nPC] = uc->uc_mcontext.gregs[REG_PC] + 4; return 1; } // Handle ALL stack overflow variations here if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) { --- 358,368 ---- pc = (address) uc->uc_mcontext.gregs[REG_PC]; npc = (address) uc->uc_mcontext.gregs[REG_nPC]; // SafeFetch() support if (StubRoutines::is_safefetch_fault(pc)) { ! os::Solaris::ucontext_set_pc(uc, StubRoutines::continuation_for_safefetch_fault(pc)); return 1; } // Handle ALL stack overflow variations here if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) {
*** 492,503 **** thread->set_saved_exception_pc(pc); thread->set_saved_exception_npc(npc); // simulate a branch to the stub (a "call" in the safepoint stub case) // factor me: setPC ! uc->uc_mcontext.gregs[REG_PC ] = (greg_t)stub; ! uc->uc_mcontext.gregs[REG_nPC] = (greg_t)(stub + 4); #ifndef PRODUCT if (TraceJumps) thread->record_jump(stub, NULL, __FILE__, __LINE__); #endif /* PRODUCT */ --- 496,506 ---- thread->set_saved_exception_pc(pc); thread->set_saved_exception_npc(npc); // simulate a branch to the stub (a "call" in the safepoint stub case) // factor me: setPC ! os::Solaris::ucontext_set_pc(uc, stub); #ifndef PRODUCT if (TraceJumps) thread->record_jump(stub, NULL, __FILE__, __LINE__); #endif /* PRODUCT */
< prev index next >