1.1 --- a/src/os/solaris/vm/os_solaris.cpp Wed Mar 18 11:37:48 2009 -0400 1.2 +++ b/src/os/solaris/vm/os_solaris.cpp Thu Mar 19 09:13:24 2009 -0700 1.3 @@ -3220,7 +3220,7 @@ 1.4 return true; 1.5 } 1.6 1.7 -char* os::reserve_memory_special(size_t bytes) { 1.8 +char* os::reserve_memory_special(size_t bytes, char* addr) { 1.9 assert(UseLargePages && UseISM, "only for ISM large pages"); 1.10 1.11 size_t size = bytes; 1.12 @@ -4451,6 +4451,9 @@ 1.13 int_fnP_thread_t os::Solaris::_thr_suspend_mutator; 1.14 int_fnP_thread_t os::Solaris::_thr_continue_mutator; 1.15 1.16 +// (Static) wrapper for getisax(2) call. 1.17 +os::Solaris::getisax_func_t os::Solaris::_getisax = 0; 1.18 + 1.19 // (Static) wrappers for the liblgrp API 1.20 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home; 1.21 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init; 1.22 @@ -4465,16 +4468,19 @@ 1.23 // (Static) wrapper for meminfo() call. 1.24 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0; 1.25 1.26 -static address resolve_symbol(const char *name) { 1.27 - address addr; 1.28 - 1.29 - addr = (address) dlsym(RTLD_DEFAULT, name); 1.30 +static address resolve_symbol_lazy(const char* name) { 1.31 + address addr = (address) dlsym(RTLD_DEFAULT, name); 1.32 if(addr == NULL) { 1.33 // RTLD_DEFAULT was not defined on some early versions of 2.5.1 1.34 addr = (address) dlsym(RTLD_NEXT, name); 1.35 - if(addr == NULL) { 1.36 - fatal(dlerror()); 1.37 - } 1.38 + } 1.39 + return addr; 1.40 +} 1.41 + 1.42 +static address resolve_symbol(const char* name) { 1.43 + address addr = resolve_symbol_lazy(name); 1.44 + if(addr == NULL) { 1.45 + fatal(dlerror()); 1.46 } 1.47 return addr; 1.48 } 1.49 @@ -4673,15 +4679,26 @@ 1.50 } 1.51 1.52 void os::Solaris::misc_sym_init() { 1.53 - address func = (address)dlsym(RTLD_DEFAULT, "meminfo"); 1.54 - if(func == NULL) { 1.55 - func = (address) dlsym(RTLD_NEXT, "meminfo"); 1.56 - } 1.57 + address func; 1.58 + 1.59 + // getisax 1.60 + func = resolve_symbol_lazy("getisax"); 1.61 + if (func != NULL) { 1.62 + os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func); 1.63 + } 1.64 + 1.65 + // meminfo 1.66 + func = resolve_symbol_lazy("meminfo"); 1.67 if (func != NULL) { 1.68 os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func)); 1.69 } 1.70 } 1.71 1.72 +uint_t os::Solaris::getisax(uint32_t* array, uint_t n) { 1.73 + assert(_getisax != NULL, "_getisax not set"); 1.74 + return _getisax(array, n); 1.75 +} 1.76 + 1.77 // Symbol doesn't exist in Solaris 8 pset.h 1.78 #ifndef PS_MYID 1.79 #define PS_MYID -3 1.80 @@ -4716,6 +4733,10 @@ 1.81 1.82 Solaris::initialize_system_info(); 1.83 1.84 + // Initialize misc. symbols as soon as possible, so we can use them 1.85 + // if we need them. 1.86 + Solaris::misc_sym_init(); 1.87 + 1.88 int fd = open("/dev/zero", O_RDWR); 1.89 if (fd < 0) { 1.90 fatal1("os::init: cannot open /dev/zero (%s)", strerror(errno)); 1.91 @@ -4857,7 +4878,6 @@ 1.92 } 1.93 } 1.94 1.95 - Solaris::misc_sym_init(); 1.96 Solaris::signal_sets_init(); 1.97 Solaris::init_signal_mem(); 1.98 Solaris::install_signal_handlers();