79 # include <fpu_control.h>
80 #endif
81
82 #ifdef AMD64
83 #define REG_SP REG_RSP
84 #define REG_PC REG_RIP
85 #define REG_FP REG_RBP
86 #define SPELL_REG_SP "rsp"
87 #define SPELL_REG_FP "rbp"
88 #else
89 #define REG_SP REG_UESP
90 #define REG_PC REG_EIP
91 #define REG_FP REG_EBP
92 #define SPELL_REG_SP "esp"
93 #define SPELL_REG_FP "ebp"
94 #endif // AMD64
95
96 address os::current_stack_pointer() {
97 #ifdef SPARC_WORKS
98 register void *esp;
99 __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
100 return (address) ((char*)esp + sizeof(long)*2);
101 #elif defined(__clang__)
102 intptr_t* esp;
103 __asm__ __volatile__ ("mov %%"SPELL_REG_SP", %0":"=r"(esp):);
104 return (address) esp;
105 #else
106 register void *esp __asm__ (SPELL_REG_SP);
107 return (address) esp;
108 #endif
109 }
110
111 char* os::non_memory_address_word() {
112 // Must never look like an address returned by reserve_memory,
113 // even in its subfields (as defined by the CPU immediate fields,
114 // if the CPU splits constants across multiple instructions).
115
116 return (char*) -1;
117 }
118
119 void os::initialize_thread(Thread* thr) {
120 // Nothing to do.
121 }
122
123 address os::Linux::ucontext_get_pc(const ucontext_t * uc) {
217 if (!fr->is_java_frame()) {
218 assert(!fr->is_first_frame(), "Safety check");
219 // See java_sender() comment above.
220 *fr = fr->java_sender();
221 }
222 }
223 }
224 assert(fr->is_java_frame(), "Safety check");
225 return true;
226 }
227
228 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
229 // turned off by -fomit-frame-pointer,
230 frame os::get_sender_for_C_frame(frame* fr) {
231 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
232 }
233
234 intptr_t* _get_previous_fp() {
235 #ifdef SPARC_WORKS
236 register intptr_t **ebp;
237 __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
238 #elif defined(__clang__)
239 intptr_t **ebp;
240 __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
241 #else
242 register intptr_t **ebp __asm__ (SPELL_REG_FP);
243 #endif
244 // ebp is for this frame (_get_previous_fp). We want the ebp for the
245 // caller of os::current_frame*(), so go up two frames. However, for
246 // optimized builds, _get_previous_fp() will be inlined, so only go
247 // up 1 frame in that case.
248 #ifdef _NMT_NOINLINE_
249 return **(intptr_t***)ebp;
250 #else
251 return *ebp;
252 #endif
253 }
254
255
256 frame os::current_frame() {
257 intptr_t* fp = _get_previous_fp();
258 frame myframe((intptr_t*)os::current_stack_pointer(),
259 (intptr_t*)fp,
260 CAST_FROM_FN_PTR(address, os::current_frame));
|
79 # include <fpu_control.h>
80 #endif
81
82 #ifdef AMD64
83 #define REG_SP REG_RSP
84 #define REG_PC REG_RIP
85 #define REG_FP REG_RBP
86 #define SPELL_REG_SP "rsp"
87 #define SPELL_REG_FP "rbp"
88 #else
89 #define REG_SP REG_UESP
90 #define REG_PC REG_EIP
91 #define REG_FP REG_EBP
92 #define SPELL_REG_SP "esp"
93 #define SPELL_REG_FP "ebp"
94 #endif // AMD64
95
96 address os::current_stack_pointer() {
97 #ifdef SPARC_WORKS
98 register void *esp;
99 __asm__("mov %%" SPELL_REG_SP ", %0":"=r"(esp));
100 return (address) ((char*)esp + sizeof(long)*2);
101 #elif defined(__clang__)
102 intptr_t* esp;
103 __asm__ __volatile__ ("mov %%" SPELL_REG_SP ", %0":"=r"(esp):);
104 return (address) esp;
105 #else
106 register void *esp __asm__ (SPELL_REG_SP);
107 return (address) esp;
108 #endif
109 }
110
111 char* os::non_memory_address_word() {
112 // Must never look like an address returned by reserve_memory,
113 // even in its subfields (as defined by the CPU immediate fields,
114 // if the CPU splits constants across multiple instructions).
115
116 return (char*) -1;
117 }
118
119 void os::initialize_thread(Thread* thr) {
120 // Nothing to do.
121 }
122
123 address os::Linux::ucontext_get_pc(const ucontext_t * uc) {
217 if (!fr->is_java_frame()) {
218 assert(!fr->is_first_frame(), "Safety check");
219 // See java_sender() comment above.
220 *fr = fr->java_sender();
221 }
222 }
223 }
224 assert(fr->is_java_frame(), "Safety check");
225 return true;
226 }
227
228 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
229 // turned off by -fomit-frame-pointer,
230 frame os::get_sender_for_C_frame(frame* fr) {
231 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
232 }
233
234 intptr_t* _get_previous_fp() {
235 #ifdef SPARC_WORKS
236 register intptr_t **ebp;
237 __asm__("mov %%" SPELL_REG_FP ", %0":"=r"(ebp));
238 #elif defined(__clang__)
239 intptr_t **ebp;
240 __asm__ __volatile__ ("mov %%" SPELL_REG_FP ", %0":"=r"(ebp):);
241 #else
242 register intptr_t **ebp __asm__ (SPELL_REG_FP);
243 #endif
244 // ebp is for this frame (_get_previous_fp). We want the ebp for the
245 // caller of os::current_frame*(), so go up two frames. However, for
246 // optimized builds, _get_previous_fp() will be inlined, so only go
247 // up 1 frame in that case.
248 #ifdef _NMT_NOINLINE_
249 return **(intptr_t***)ebp;
250 #else
251 return *ebp;
252 #endif
253 }
254
255
256 frame os::current_frame() {
257 intptr_t* fp = _get_previous_fp();
258 frame myframe((intptr_t*)os::current_stack_pointer(),
259 (intptr_t*)fp,
260 CAST_FROM_FN_PTR(address, os::current_frame));
|