266 # define context_fp uc_mcontext.__gregs[_REG_EBP]
267 # define context_eip uc_mcontext.__gregs[_REG_EIP]
268 # define context_esp uc_mcontext.__gregs[_REG_UESP]
269 # define context_eax uc_mcontext.__gregs[_REG_EAX]
270 # define context_ebx uc_mcontext.__gregs[_REG_EBX]
271 # define context_ecx uc_mcontext.__gregs[_REG_ECX]
272 # define context_edx uc_mcontext.__gregs[_REG_EDX]
273 # define context_ebp uc_mcontext.__gregs[_REG_EBP]
274 # define context_esi uc_mcontext.__gregs[_REG_ESI]
275 # define context_edi uc_mcontext.__gregs[_REG_EDI]
276 # define context_eflags uc_mcontext.__gregs[_REG_EFL]
277 # define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
278 # endif
279 #endif
280
281 address os::current_stack_pointer() {
282 #if defined(__clang__) || defined(__llvm__)
283 void *esp;
284 __asm__("mov %%" SPELL_REG_SP ", %0":"=r"(esp));
285 return (address) esp;
286 #elif defined(SPARC_WORKS)
287 void *esp;
288 __asm__("mov %%" SPELL_REG_SP ", %0":"=r"(esp));
289 return (address) ((char*)esp + sizeof(long)*2);
290 #else
291 register void *esp __asm__ (SPELL_REG_SP);
292 return (address) esp;
293 #endif
294 }
295
296 char* os::non_memory_address_word() {
297 // Must never look like an address returned by reserve_memory,
298 // even in its subfields (as defined by the CPU immediate fields,
299 // if the CPU splits constants across multiple instructions).
300
301 return (char*) -1;
302 }
303
304 address os::Bsd::ucontext_get_pc(const ucontext_t * uc) {
305 return (address)uc->context_pc;
306 }
307
308 void os::Bsd::ucontext_set_pc(ucontext_t * uc, address pc) {
309 uc->context_pc = (intptr_t)pc ;
394 // in compiled code, the stack banging is performed just after the return pc
395 // has been pushed on the stack
396 *fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
397 if (!fr->is_java_frame()) {
398 // See java_sender() comment above.
399 *fr = fr->java_sender();
400 }
401 }
402 }
403 assert(fr->is_java_frame(), "Safety check");
404 return true;
405 }
406
407 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
408 // turned off by -fomit-frame-pointer,
409 frame os::get_sender_for_C_frame(frame* fr) {
410 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
411 }
412
413 intptr_t* _get_previous_fp() {
414 #if defined(SPARC_WORKS) || defined(__clang__) || defined(__llvm__)
415 intptr_t **ebp;
416 __asm__("mov %%" SPELL_REG_FP ", %0":"=r"(ebp));
417 #else
418 register intptr_t **ebp __asm__ (SPELL_REG_FP);
419 #endif
420 // ebp is for this frame (_get_previous_fp). We want the ebp for the
421 // caller of os::current_frame*(), so go up two frames. However, for
422 // optimized builds, _get_previous_fp() will be inlined, so only go
423 // up 1 frame in that case.
424 #ifdef _NMT_NOINLINE_
425 return **(intptr_t***)ebp;
426 #else
427 return *ebp;
428 #endif
429 }
430
431
432 frame os::current_frame() {
433 intptr_t* fp = _get_previous_fp();
434 frame myframe((intptr_t*)os::current_stack_pointer(),
|
266 # define context_fp uc_mcontext.__gregs[_REG_EBP]
267 # define context_eip uc_mcontext.__gregs[_REG_EIP]
268 # define context_esp uc_mcontext.__gregs[_REG_UESP]
269 # define context_eax uc_mcontext.__gregs[_REG_EAX]
270 # define context_ebx uc_mcontext.__gregs[_REG_EBX]
271 # define context_ecx uc_mcontext.__gregs[_REG_ECX]
272 # define context_edx uc_mcontext.__gregs[_REG_EDX]
273 # define context_ebp uc_mcontext.__gregs[_REG_EBP]
274 # define context_esi uc_mcontext.__gregs[_REG_ESI]
275 # define context_edi uc_mcontext.__gregs[_REG_EDI]
276 # define context_eflags uc_mcontext.__gregs[_REG_EFL]
277 # define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
278 # endif
279 #endif
280
281 address os::current_stack_pointer() {
282 #if defined(__clang__) || defined(__llvm__)
283 void *esp;
284 __asm__("mov %%" SPELL_REG_SP ", %0":"=r"(esp));
285 return (address) esp;
286 #else
287 register void *esp __asm__ (SPELL_REG_SP);
288 return (address) esp;
289 #endif
290 }
291
292 char* os::non_memory_address_word() {
293 // Must never look like an address returned by reserve_memory,
294 // even in its subfields (as defined by the CPU immediate fields,
295 // if the CPU splits constants across multiple instructions).
296
297 return (char*) -1;
298 }
299
300 address os::Bsd::ucontext_get_pc(const ucontext_t * uc) {
301 return (address)uc->context_pc;
302 }
303
304 void os::Bsd::ucontext_set_pc(ucontext_t * uc, address pc) {
305 uc->context_pc = (intptr_t)pc ;
390 // in compiled code, the stack banging is performed just after the return pc
391 // has been pushed on the stack
392 *fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
393 if (!fr->is_java_frame()) {
394 // See java_sender() comment above.
395 *fr = fr->java_sender();
396 }
397 }
398 }
399 assert(fr->is_java_frame(), "Safety check");
400 return true;
401 }
402
403 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
404 // turned off by -fomit-frame-pointer,
405 frame os::get_sender_for_C_frame(frame* fr) {
406 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
407 }
408
409 intptr_t* _get_previous_fp() {
410 #if defined(__clang__) || defined(__llvm__)
411 intptr_t **ebp;
412 __asm__("mov %%" SPELL_REG_FP ", %0":"=r"(ebp));
413 #else
414 register intptr_t **ebp __asm__ (SPELL_REG_FP);
415 #endif
416 // ebp is for this frame (_get_previous_fp). We want the ebp for the
417 // caller of os::current_frame*(), so go up two frames. However, for
418 // optimized builds, _get_previous_fp() will be inlined, so only go
419 // up 1 frame in that case.
420 #ifdef _NMT_NOINLINE_
421 return **(intptr_t***)ebp;
422 #else
423 return *ebp;
424 #endif
425 }
426
427
428 frame os::current_frame() {
429 intptr_t* fp = _get_previous_fp();
430 frame myframe((intptr_t*)os::current_stack_pointer(),
|