< prev index next >

src/os_cpu/linux_sparc/vm/os_linux_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


 334   st->print("L6="); print_location(st, sp[L6->sp_offset_in_saved_window()]);
 335   st->print("L7="); print_location(st, sp[L7->sp_offset_in_saved_window()]);
 336   st->cr();
 337 
 338   st->print("I0="); print_location(st, sp[I0->sp_offset_in_saved_window()]);
 339   st->print("I1="); print_location(st, sp[I1->sp_offset_in_saved_window()]);
 340   st->print("I2="); print_location(st, sp[I2->sp_offset_in_saved_window()]);
 341   st->print("I3="); print_location(st, sp[I3->sp_offset_in_saved_window()]);
 342   st->print("I4="); print_location(st, sp[I4->sp_offset_in_saved_window()]);
 343   st->print("I5="); print_location(st, sp[I5->sp_offset_in_saved_window()]);
 344   st->print("I6="); print_location(st, sp[I6->sp_offset_in_saved_window()]);
 345   st->print("I7="); print_location(st, sp[I7->sp_offset_in_saved_window()]);
 346   st->cr();
 347 }
 348 
 349 
 350 address os::Linux::ucontext_get_pc(ucontext_t* uc) {
 351   return (address) SIG_PC((sigcontext*)uc);
 352 }
 353 




 354 intptr_t* os::Linux::ucontext_get_sp(ucontext_t *uc) {
 355   return (intptr_t*)
 356     ((intptr_t)SIG_REGS((sigcontext*)uc).u_regs[CON_O6] + STACK_BIAS);
 357 }
 358 
 359 // not used on Sparc
 360 intptr_t* os::Linux::ucontext_get_fp(ucontext_t *uc) {
 361   ShouldNotReachHere();
 362   return NULL;
 363 }
 364 
 365 // Utility functions
 366 
 367 inline static bool checkPrefetch(sigcontext* uc, address pc) {
 368   if (StubRoutines::is_safefetch_fault(pc)) {
 369     set_cont_address(uc, address(StubRoutines::continuation_for_safefetch_fault(pc)));
 370     return true;
 371   }
 372   return false;
 373 }




 334   st->print("L6="); print_location(st, sp[L6->sp_offset_in_saved_window()]);
 335   st->print("L7="); print_location(st, sp[L7->sp_offset_in_saved_window()]);
 336   st->cr();
 337 
 338   st->print("I0="); print_location(st, sp[I0->sp_offset_in_saved_window()]);
 339   st->print("I1="); print_location(st, sp[I1->sp_offset_in_saved_window()]);
 340   st->print("I2="); print_location(st, sp[I2->sp_offset_in_saved_window()]);
 341   st->print("I3="); print_location(st, sp[I3->sp_offset_in_saved_window()]);
 342   st->print("I4="); print_location(st, sp[I4->sp_offset_in_saved_window()]);
 343   st->print("I5="); print_location(st, sp[I5->sp_offset_in_saved_window()]);
 344   st->print("I6="); print_location(st, sp[I6->sp_offset_in_saved_window()]);
 345   st->print("I7="); print_location(st, sp[I7->sp_offset_in_saved_window()]);
 346   st->cr();
 347 }
 348 
 349 
 350 address os::Linux::ucontext_get_pc(ucontext_t* uc) {
 351   return (address) SIG_PC((sigcontext*)uc);
 352 }
 353 
 354 void os::Linux::ucontext_set_pc(ucontext_t* uc, address pc) {
 355   set_cont_address((sigcontext_t*) uc, pc);
 356 }
 357 
 358 intptr_t* os::Linux::ucontext_get_sp(ucontext_t *uc) {
 359   return (intptr_t*)
 360     ((intptr_t)SIG_REGS((sigcontext*)uc).u_regs[CON_O6] + STACK_BIAS);
 361 }
 362 
 363 // not used on Sparc
 364 intptr_t* os::Linux::ucontext_get_fp(ucontext_t *uc) {
 365   ShouldNotReachHere();
 366   return NULL;
 367 }
 368 
 369 // Utility functions
 370 
 371 inline static bool checkPrefetch(sigcontext* uc, address pc) {
 372   if (StubRoutines::is_safefetch_fault(pc)) {
 373     set_cont_address(uc, address(StubRoutines::continuation_for_safefetch_fault(pc)));
 374     return true;
 375   }
 376   return false;
 377 }


< prev index next >