350 return addr != NULL; |
350 return addr != NULL; |
351 #endif // AMD64 |
351 #endif // AMD64 |
352 |
352 |
353 } |
353 } |
354 |
354 |
355 extern "C" void Fetch32PFI () ; |
|
356 extern "C" void Fetch32Resume () ; |
|
357 #ifdef AMD64 |
|
358 extern "C" void FetchNPFI () ; |
|
359 extern "C" void FetchNResume () ; |
|
360 #endif // AMD64 |
|
361 |
|
362 extern "C" JNIEXPORT int |
355 extern "C" JNIEXPORT int |
363 JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid, |
356 JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid, |
364 int abort_if_unrecognized) { |
357 int abort_if_unrecognized) { |
365 ucontext_t* uc = (ucontext_t*) ucVoid; |
358 ucontext_t* uc = (ucontext_t*) ucVoid; |
366 |
359 |
438 //%note os_trap_1 |
431 //%note os_trap_1 |
439 if (info != NULL && uc != NULL && thread != NULL) { |
432 if (info != NULL && uc != NULL && thread != NULL) { |
440 // factor me: getPCfromContext |
433 // factor me: getPCfromContext |
441 pc = (address) uc->uc_mcontext.gregs[REG_PC]; |
434 pc = (address) uc->uc_mcontext.gregs[REG_PC]; |
442 |
435 |
443 // SafeFetch32() support |
436 if (StubRoutines::is_safefetch_fault(pc)) { |
444 if (pc == (address) Fetch32PFI) { |
437 uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc)); |
445 uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ; |
438 return true; |
446 return true ; |
439 } |
447 } |
|
448 #ifdef AMD64 |
|
449 if (pc == (address) FetchNPFI) { |
|
450 uc->uc_mcontext.gregs [REG_PC] = intptr_t(FetchNResume) ; |
|
451 return true ; |
|
452 } |
|
453 #endif // AMD64 |
|
454 |
440 |
455 // Handle ALL stack overflow variations here |
441 // Handle ALL stack overflow variations here |
456 if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) { |
442 if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) { |
457 address addr = (address) info->si_addr; |
443 address addr = (address) info->si_addr; |
458 if (thread->in_stack_yellow_zone(addr)) { |
444 if (thread->in_stack_yellow_zone(addr)) { |