src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File webrev Sdiff src/os_cpu/bsd_x86/vm

src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp

Print this page




 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));


src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File