< prev index next >

src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp

Print this page




 238   ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
 239   return frame(sp, fp, epc.pc());
 240 }
 241 
 242 frame os::fetch_frame_from_ucontext(Thread* thread, void* ucVoid) {
 243   intptr_t* sp;
 244   intptr_t* fp;
 245   ExtendedPC epc = os::Solaris::fetch_frame_from_ucontext(thread, (ucontext_t*)ucVoid, &sp, &fp);
 246   return frame(sp, fp, epc.pc());
 247 }
 248 
 249 bool os::Solaris::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
 250  address pc = (address) os::Solaris::ucontext_get_pc(uc);
 251   if (Interpreter::contains(pc)) {
 252     // interpreter performs stack banging after the fixed frame header has
 253     // been generated while the compilers perform it before. To maintain
 254     // semantic consistency between interpreted and compiled frames, the
 255     // method returns the Java sender of the current frame.
 256     *fr = os::fetch_frame_from_ucontext(thread, uc);
 257     if (!fr->is_first_java_frame()) {
 258       assert(fr->safe_for_sender(thread), "Safety check");
 259       *fr = fr->java_sender();
 260     }
 261   } else {
 262     // more complex code with compiled code
 263     assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
 264     CodeBlob* cb = CodeCache::find_blob(pc);
 265     if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
 266       // Not sure where the pc points to, fallback to default
 267       // stack overflow handling
 268       return false;
 269     } else {
 270       // in compiled code, the stack banging is performed just after the return pc
 271       // has been pushed on the stack
 272       intptr_t* fp = os::Solaris::ucontext_get_fp(uc);
 273       intptr_t* sp = os::Solaris::ucontext_get_sp(uc);
 274       *fr = frame(sp + 1, fp, (address)*sp);
 275       if (!fr->is_java_frame()) {
 276         assert(fr->safe_for_sender(thread), "Safety check");
 277         *fr = fr->java_sender();
 278       }
 279     }
 280   }
 281   assert(fr->is_java_frame(), "Safety check");
 282   return true;
 283 }
 284 
 285 frame os::get_sender_for_C_frame(frame* fr) {
 286   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 287 }
 288 
 289 extern "C" intptr_t *_get_current_sp();  // in .il file
 290 
 291 address os::current_stack_pointer() {
 292   return (address)_get_current_sp();
 293 }
 294 
 295 extern "C" intptr_t *_get_current_fp();  // in .il file
 296 




 238   ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
 239   return frame(sp, fp, epc.pc());
 240 }
 241 
 242 frame os::fetch_frame_from_ucontext(Thread* thread, void* ucVoid) {
 243   intptr_t* sp;
 244   intptr_t* fp;
 245   ExtendedPC epc = os::Solaris::fetch_frame_from_ucontext(thread, (ucontext_t*)ucVoid, &sp, &fp);
 246   return frame(sp, fp, epc.pc());
 247 }
 248 
 249 bool os::Solaris::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
 250  address pc = (address) os::Solaris::ucontext_get_pc(uc);
 251   if (Interpreter::contains(pc)) {
 252     // interpreter performs stack banging after the fixed frame header has
 253     // been generated while the compilers perform it before. To maintain
 254     // semantic consistency between interpreted and compiled frames, the
 255     // method returns the Java sender of the current frame.
 256     *fr = os::fetch_frame_from_ucontext(thread, uc);
 257     if (!fr->is_first_java_frame()) {

 258       *fr = fr->java_sender();
 259     }
 260   } else {
 261     // more complex code with compiled code
 262     assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
 263     CodeBlob* cb = CodeCache::find_blob(pc);
 264     if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
 265       // Not sure where the pc points to, fallback to default
 266       // stack overflow handling
 267       return false;
 268     } else {
 269       // in compiled code, the stack banging is performed just after the return pc
 270       // has been pushed on the stack
 271       intptr_t* fp = os::Solaris::ucontext_get_fp(uc);
 272       intptr_t* sp = os::Solaris::ucontext_get_sp(uc);
 273       *fr = frame(sp + 1, fp, (address)*sp);
 274       if (!fr->is_java_frame()) {

 275         *fr = fr->java_sender();
 276       }
 277     }
 278   }
 279   assert(fr->is_java_frame(), "Safety check");
 280   return true;
 281 }
 282 
 283 frame os::get_sender_for_C_frame(frame* fr) {
 284   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 285 }
 286 
 287 extern "C" intptr_t *_get_current_sp();  // in .il file
 288 
 289 address os::current_stack_pointer() {
 290   return (address)_get_current_sp();
 291 }
 292 
 293 extern "C" intptr_t *_get_current_fp();  // in .il file
 294 


< prev index next >