hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
changeset 223 5c3b023117d9
parent 1 489c9b5090e2
child 225 6258c2e3adfd
equal deleted inserted replaced
222:3d1795325749 223:5c3b023117d9
    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() {
   573 // amd64: pthread on amd64 is always in floating stack mode
   584 // amd64: pthread on amd64 is always in floating stack mode
   574 bool os::Linux::supports_variable_stack_size() {  return true; }
   585 bool os::Linux::supports_variable_stack_size() {  return true; }
   575 #else
   586 #else
   576 size_t os::Linux::min_stack_allowed  =  (48 DEBUG_ONLY(+4))*K;
   587 size_t os::Linux::min_stack_allowed  =  (48 DEBUG_ONLY(+4))*K;
   577 
   588 
       
   589 #ifdef __GNUC__
   578 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
   590 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
       
   591 #endif
   579 
   592 
   580 // Test if pthread library can support variable thread stack size. LinuxThreads
   593 // Test if pthread library can support variable thread stack size. LinuxThreads
   581 // in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads
   594 // in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads
   582 // in floating stack mode and NPTL support variable stack size.
   595 // in floating stack mode and NPTL support variable stack size.
   583 bool os::Linux::supports_variable_stack_size() {
   596 bool os::Linux::supports_variable_stack_size() {
   604     // a native application that plays with %gs, we might see non-zero %gs
   617     // a native application that plays with %gs, we might see non-zero %gs
   605     // even LinuxThreads is running in fixed stack mode. As the result, we'll
   618     // even LinuxThreads is running in fixed stack mode. As the result, we'll
   606     // return true and skip _thread_safety_check(), so we may not be able to
   619     // return true and skip _thread_safety_check(), so we may not be able to
   607     // detect stack-heap collisions. But otherwise it's harmless.
   620     // detect stack-heap collisions. But otherwise it's harmless.
   608     //
   621     //
       
   622 #ifdef __GNUC__
   609     return (GET_GS() != 0);
   623     return (GET_GS() != 0);
       
   624 #else
       
   625     return false;
       
   626 #endif
   610   }
   627   }
   611 }
   628 }
   612 #endif // AMD64
   629 #endif // AMD64
   613 
   630 
   614 // return default stack size for thr_type
   631 // return default stack size for thr_type