< prev index next >

src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp

Print this page
rev 59383 : [mq]: final


 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(),


< prev index next >