< prev index next >

src/hotspot/os_cpu/solaris_x86/os_solaris_x86.cpp


561         // Note that we take the exception at the NEXT floating point instruction.                                                   
562         if (pc[0] == 0xDB) {                                                                                                         
563             assert(pc[0] == 0xDB, "not a FIST opcode");                                                                              
564             assert(pc[1] == 0x14, "not a FIST opcode");                                                                              
565             assert(pc[2] == 0x24, "not a FIST opcode");                                                                              
566             return true;                                                                                                             
567         } else {                                                                                                                     
568             assert(pc[-3] == 0xDB, "not an flt invalid opcode");                                                                     
569             assert(pc[-2] == 0x14, "not an flt invalid opcode");                                                                     
570             assert(pc[-1] == 0x24, "not an flt invalid opcode");                                                                     
571         }                                                                                                                            
572       }                                                                                                                              
573       else if (sig == SIGFPE ) {                                                                                                     
574         tty->print_cr("caught SIGFPE, info 0x%x.", info->si_code);                                                                   
575       }                                                                                                                              
576 #endif // !AMD64                                                                                                                     
577 
578         // QQQ It doesn't seem that we need to do this on x86 because we should be able                                              
579         // to return properly from the handler without this extra stuff on the back side.                                            
580 
581       else if (sig == SIGSEGV && info->si_code > 0 && !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {         
                                                                                                                                     
582         // Determination of interpreter/vtable stub/compiled code null exception                                                     
583         stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);                         
584       }                                                                                                                              
585     }                                                                                                                                
586 
587     // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in                                                        
588     // and the heap gets shrunk before the field access.                                                                             
589     if ((sig == SIGSEGV) || (sig == SIGBUS)) {                                                                                       
590       address addr = JNI_FastGetField::find_slowcase_pc(pc);                                                                         
591       if (addr != (address)-1) {                                                                                                     
592         stub = addr;                                                                                                                 
593       }                                                                                                                              
594     }                                                                                                                                
595 
596     // Check to see if we caught the safepoint code in the                                                                           
597     // process of write protecting the memory serialization page.                                                                    
598     // It write enables the page immediately after protecting it                                                                     
599     // so we can just return to retry the write.                                                                                     
600     if ((sig == SIGSEGV) &&                                                                                                          

561         // Note that we take the exception at the NEXT floating point instruction.
562         if (pc[0] == 0xDB) {
563             assert(pc[0] == 0xDB, "not a FIST opcode");
564             assert(pc[1] == 0x14, "not a FIST opcode");
565             assert(pc[2] == 0x24, "not a FIST opcode");
566             return true;
567         } else {
568             assert(pc[-3] == 0xDB, "not an flt invalid opcode");
569             assert(pc[-2] == 0x14, "not an flt invalid opcode");
570             assert(pc[-1] == 0x24, "not an flt invalid opcode");
571         }
572       }
573       else if (sig == SIGFPE ) {
574         tty->print_cr("caught SIGFPE, info 0x%x.", info->si_code);
575       }
576 #endif // !AMD64
577 
578         // QQQ It doesn't seem that we need to do this on x86 because we should be able
579         // to return properly from the handler without this extra stuff on the back side.
580 
581       else if (sig == SIGSEGV && info->si_code > 0 &&
582                MacroAssembler::uses_implicit_null_check(info->si_addr)) {
583         // Determination of interpreter/vtable stub/compiled code null exception
584         stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
585       }
586     }
587 
588     // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
589     // and the heap gets shrunk before the field access.
590     if ((sig == SIGSEGV) || (sig == SIGBUS)) {
591       address addr = JNI_FastGetField::find_slowcase_pc(pc);
592       if (addr != (address)-1) {
593         stub = addr;
594       }
595     }
596 
597     // Check to see if we caught the safepoint code in the
598     // process of write protecting the memory serialization page.
599     // It write enables the page immediately after protecting it
600     // so we can just return to retry the write.
601     if ((sig == SIGSEGV) &&
< prev index next >