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 |