60 #define SPELL_REG_SP "esp" |
60 #define SPELL_REG_SP "esp" |
61 #define SPELL_REG_FP "ebp" |
61 #define SPELL_REG_FP "ebp" |
62 #endif // AMD64 |
62 #endif // AMD64 |
63 |
63 |
64 address os::current_stack_pointer() { |
64 address os::current_stack_pointer() { |
|
65 #ifdef SPARC_WORKS |
|
66 register void *esp; |
|
67 __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp)); |
|
68 return (address) ((char*)esp + sizeof(long)*2); |
|
69 #else |
65 register void *esp __asm__ (SPELL_REG_SP); |
70 register void *esp __asm__ (SPELL_REG_SP); |
66 return (address) esp; |
71 return (address) esp; |
|
72 #endif |
67 } |
73 } |
68 |
74 |
69 char* os::non_memory_address_word() { |
75 char* os::non_memory_address_word() { |
70 // Must never look like an address returned by reserve_memory, |
76 // Must never look like an address returned by reserve_memory, |
71 // even in its subfields (as defined by the CPU immediate fields, |
77 // even in its subfields (as defined by the CPU immediate fields, |
137 frame os::get_sender_for_C_frame(frame* fr) { |
143 frame os::get_sender_for_C_frame(frame* fr) { |
138 return frame(fr->sender_sp(), fr->link(), fr->sender_pc()); |
144 return frame(fr->sender_sp(), fr->link(), fr->sender_pc()); |
139 } |
145 } |
140 |
146 |
141 intptr_t* _get_previous_fp() { |
147 intptr_t* _get_previous_fp() { |
|
148 #ifdef SPARC_WORKS |
|
149 register intptr_t **ebp; |
|
150 __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp)); |
|
151 #else |
142 register intptr_t **ebp __asm__ (SPELL_REG_FP); |
152 register intptr_t **ebp __asm__ (SPELL_REG_FP); |
|
153 #endif |
143 return (intptr_t*) *ebp; // we want what it points to. |
154 return (intptr_t*) *ebp; // we want what it points to. |
144 } |
155 } |
145 |
156 |
146 |
157 |
147 frame os::current_frame() { |
158 frame os::current_frame() { |
558 // amd64: pthread on amd64 is always in floating stack mode |
569 // amd64: pthread on amd64 is always in floating stack mode |
559 bool os::Linux::supports_variable_stack_size() { return true; } |
570 bool os::Linux::supports_variable_stack_size() { return true; } |
560 #else |
571 #else |
561 size_t os::Linux::min_stack_allowed = (48 DEBUG_ONLY(+4))*K; |
572 size_t os::Linux::min_stack_allowed = (48 DEBUG_ONLY(+4))*K; |
562 |
573 |
|
574 #ifdef __GNUC__ |
563 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;}) |
575 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;}) |
|
576 #endif |
564 |
577 |
565 // Test if pthread library can support variable thread stack size. LinuxThreads |
578 // Test if pthread library can support variable thread stack size. LinuxThreads |
566 // in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads |
579 // in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads |
567 // in floating stack mode and NPTL support variable stack size. |
580 // in floating stack mode and NPTL support variable stack size. |
568 bool os::Linux::supports_variable_stack_size() { |
581 bool os::Linux::supports_variable_stack_size() { |
589 // a native application that plays with %gs, we might see non-zero %gs |
602 // a native application that plays with %gs, we might see non-zero %gs |
590 // even LinuxThreads is running in fixed stack mode. As the result, we'll |
603 // even LinuxThreads is running in fixed stack mode. As the result, we'll |
591 // return true and skip _thread_safety_check(), so we may not be able to |
604 // return true and skip _thread_safety_check(), so we may not be able to |
592 // detect stack-heap collisions. But otherwise it's harmless. |
605 // detect stack-heap collisions. But otherwise it's harmless. |
593 // |
606 // |
|
607 #ifdef __GNUC__ |
594 return (GET_GS() != 0); |
608 return (GET_GS() != 0); |
|
609 #else |
|
610 return false; |
|
611 #endif |
595 } |
612 } |
596 } |
613 } |
597 #endif // AMD64 |
614 #endif // AMD64 |
598 |
615 |
599 // return default stack size for thr_type |
616 // return default stack size for thr_type |