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