src/os_cpu/linux_x86/vm/os_linux_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8015252 Sdiff src/os_cpu/linux_x86/vm

src/os_cpu/linux_x86/vm/os_linux_x86.cpp

Print this page




  76 
  77 #ifdef AMD64
  78 #define REG_SP REG_RSP
  79 #define REG_PC REG_RIP
  80 #define REG_FP REG_RBP
  81 #define SPELL_REG_SP "rsp"
  82 #define SPELL_REG_FP "rbp"
  83 #else
  84 #define REG_SP REG_UESP
  85 #define REG_PC REG_EIP
  86 #define REG_FP REG_EBP
  87 #define SPELL_REG_SP "esp"
  88 #define SPELL_REG_FP "ebp"
  89 #endif // AMD64
  90 
  91 address os::current_stack_pointer() {
  92 #ifdef SPARC_WORKS
  93   register void *esp;
  94   __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
  95   return (address) ((char*)esp + sizeof(long)*2);




  96 #else
  97   register void *esp __asm__ (SPELL_REG_SP);
  98   return (address) esp;
  99 #endif
 100 }
 101 
 102 char* os::non_memory_address_word() {
 103   // Must never look like an address returned by reserve_memory,
 104   // even in its subfields (as defined by the CPU immediate fields,
 105   // if the CPU splits constants across multiple instructions).
 106 
 107   return (char*) -1;
 108 }
 109 
 110 void os::initialize_thread(Thread* thr) {
 111 // Nothing to do.
 112 }
 113 
 114 address os::Linux::ucontext_get_pc(ucontext_t * uc) {
 115   return (address)uc->uc_mcontext.gregs[REG_PC];


 158   return epc;
 159 }
 160 
 161 frame os::fetch_frame_from_context(void* ucVoid) {
 162   intptr_t* sp;
 163   intptr_t* fp;
 164   ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
 165   return frame(sp, fp, epc.pc());
 166 }
 167 
 168 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 169 // turned off by -fomit-frame-pointer,
 170 frame os::get_sender_for_C_frame(frame* fr) {
 171   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 172 }
 173 
 174 intptr_t* _get_previous_fp() {
 175 #ifdef SPARC_WORKS
 176   register intptr_t **ebp;
 177   __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));



 178 #else
 179   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 180 #endif
 181   return (intptr_t*) *ebp;   // we want what it points to.
 182 }
 183 
 184 
 185 frame os::current_frame() {
 186   intptr_t* fp = _get_previous_fp();
 187   frame myframe((intptr_t*)os::current_stack_pointer(),
 188                 (intptr_t*)fp,
 189                 CAST_FROM_FN_PTR(address, os::current_frame));
 190   if (os::is_first_C_frame(&myframe)) {
 191     // stack is not walkable
 192     return frame();
 193   } else {
 194     return os::get_sender_for_C_frame(&myframe);
 195   }
 196 }
 197 




  76 
  77 #ifdef AMD64
  78 #define REG_SP REG_RSP
  79 #define REG_PC REG_RIP
  80 #define REG_FP REG_RBP
  81 #define SPELL_REG_SP "rsp"
  82 #define SPELL_REG_FP "rbp"
  83 #else
  84 #define REG_SP REG_UESP
  85 #define REG_PC REG_EIP
  86 #define REG_FP REG_EBP
  87 #define SPELL_REG_SP "esp"
  88 #define SPELL_REG_FP "ebp"
  89 #endif // AMD64
  90 
  91 address os::current_stack_pointer() {
  92 #ifdef SPARC_WORKS
  93   register void *esp;
  94   __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
  95   return (address) ((char*)esp + sizeof(long)*2);
  96 #elif defined(__clang__)
  97   intptr_t* esp;
  98   __asm__ __volatile__ ("mov %%"SPELL_REG_SP", %0":"=r"(esp):);
  99   return (address) esp;
 100 #else
 101   register void *esp __asm__ (SPELL_REG_SP);
 102   return (address) esp;
 103 #endif
 104 }
 105 
 106 char* os::non_memory_address_word() {
 107   // Must never look like an address returned by reserve_memory,
 108   // even in its subfields (as defined by the CPU immediate fields,
 109   // if the CPU splits constants across multiple instructions).
 110 
 111   return (char*) -1;
 112 }
 113 
 114 void os::initialize_thread(Thread* thr) {
 115 // Nothing to do.
 116 }
 117 
 118 address os::Linux::ucontext_get_pc(ucontext_t * uc) {
 119   return (address)uc->uc_mcontext.gregs[REG_PC];


 162   return epc;
 163 }
 164 
 165 frame os::fetch_frame_from_context(void* ucVoid) {
 166   intptr_t* sp;
 167   intptr_t* fp;
 168   ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
 169   return frame(sp, fp, epc.pc());
 170 }
 171 
 172 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
 173 // turned off by -fomit-frame-pointer,
 174 frame os::get_sender_for_C_frame(frame* fr) {
 175   return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
 176 }
 177 
 178 intptr_t* _get_previous_fp() {
 179 #ifdef SPARC_WORKS
 180   register intptr_t **ebp;
 181   __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
 182 #elif defined(__clang__)
 183   intptr_t **ebp;
 184   __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
 185 #else
 186   register intptr_t **ebp __asm__ (SPELL_REG_FP);
 187 #endif
 188   return (intptr_t*) *ebp;   // we want what it points to.
 189 }
 190 
 191 
 192 frame os::current_frame() {
 193   intptr_t* fp = _get_previous_fp();
 194   frame myframe((intptr_t*)os::current_stack_pointer(),
 195                 (intptr_t*)fp,
 196                 CAST_FROM_FN_PTR(address, os::current_frame));
 197   if (os::is_first_C_frame(&myframe)) {
 198     // stack is not walkable
 199     return frame();
 200   } else {
 201     return os::get_sender_for_C_frame(&myframe);
 202   }
 203 }
 204 


src/os_cpu/linux_x86/vm/os_linux_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File