src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp

changeset 5426
af21010d1062
parent 5424
5e3b6f79d280
parent 5400
980532a806a5
child 6349
7d28f4e15b61
equal deleted inserted replaced
5424:5e3b6f79d280 5426:af21010d1062
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)) {

mercurial