comparison src/os/solaris/vm/os_solaris.cpp @ 1681:126ea7725993

6953477: Increase portability and flexibility of building Hotspot Summary: A collection of portability improvements including shared code support for PPC, ARM platforms, software floating point, cross compilation support and improvements in error crash detail. Reviewed-by: phh, never, coleenp, dholmes
author bobv
date Tue, 03 Aug 2010 08:13:38 -0400
parents 0e7d2a08b605
children 1c352af0135d
comparison
equal deleted inserted replaced
1680:a64438a2b7e8 1681:126ea7725993
1837 // Copied from libhpi 1837 // Copied from libhpi
1838 const size_t pnamelen = pname ? strlen(pname) : 0; 1838 const size_t pnamelen = pname ? strlen(pname) : 0;
1839 1839
1840 // Quietly truncate on buffer overflow. Should be an error. 1840 // Quietly truncate on buffer overflow. Should be an error.
1841 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1841 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1842 *buffer = '\0'; 1842 *buffer = '\0';
1843 return; 1843 return;
1844 } 1844 }
1845 1845
1846 if (pnamelen == 0) { 1846 if (pnamelen == 0) {
1847 snprintf(buffer, buflen, "lib%s.so", fname); 1847 snprintf(buffer, buflen, "lib%s.so", fname);
1848 } else if (strchr(pname, *os::path_separator()) != NULL) { 1848 } else if (strchr(pname, *os::path_separator()) != NULL) {
2049 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"}, 2049 {EM_X86_64, EM_X86_64, ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
2050 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 2050 {EM_SPARC, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
2051 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, 2051 {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
2052 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, 2052 {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
2053 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, 2053 {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
2054 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"} 2054 {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
2055 {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM 32"}
2055 }; 2056 };
2056 2057
2057 #if (defined IA32) 2058 #if (defined IA32)
2058 static Elf32_Half running_arch_code=EM_386; 2059 static Elf32_Half running_arch_code=EM_386;
2059 #elif (defined AMD64) 2060 #elif (defined AMD64)
2066 static Elf32_Half running_arch_code=EM_SPARC; 2067 static Elf32_Half running_arch_code=EM_SPARC;
2067 #elif (defined __powerpc64__) 2068 #elif (defined __powerpc64__)
2068 static Elf32_Half running_arch_code=EM_PPC64; 2069 static Elf32_Half running_arch_code=EM_PPC64;
2069 #elif (defined __powerpc__) 2070 #elif (defined __powerpc__)
2070 static Elf32_Half running_arch_code=EM_PPC; 2071 static Elf32_Half running_arch_code=EM_PPC;
2072 #elif (defined ARM)
2073 static Elf32_Half running_arch_code=EM_ARM;
2071 #else 2074 #else
2072 #error Method os::dll_load requires that one of following is defined:\ 2075 #error Method os::dll_load requires that one of following is defined:\
2073 IA32, AMD64, IA64, __sparc, __powerpc__ 2076 IA32, AMD64, IA64, __sparc, __powerpc__, ARM, ARM
2074 #endif 2077 #endif
2075 2078
2076 // Identify compatability class for VM's architecture and library's architecture 2079 // Identify compatability class for VM's architecture and library's architecture
2077 // Obtain string descriptions for architectures 2080 // Obtain string descriptions for architectures
2078 2081
3147 3150
3148 // Don't bother to probe page size because getpagesizes() comes with MPSS. 3151 // Don't bother to probe page size because getpagesizes() comes with MPSS.
3149 // ISM is only recommended on old Solaris where there is no MPSS support. 3152 // ISM is only recommended on old Solaris where there is no MPSS support.
3150 // Simply choose a conservative value as default. 3153 // Simply choose a conservative value as default.
3151 *page_size = LargePageSizeInBytes ? LargePageSizeInBytes : 3154 *page_size = LargePageSizeInBytes ? LargePageSizeInBytes :
3152 SPARC_ONLY(4 * M) IA32_ONLY(4 * M) AMD64_ONLY(2 * M); 3155 SPARC_ONLY(4 * M) IA32_ONLY(4 * M) AMD64_ONLY(2 * M)
3156 ARM_ONLY(2 * M);
3153 3157
3154 // ISM is available on all supported Solaris versions 3158 // ISM is available on all supported Solaris versions
3155 return true; 3159 return true;
3156 } 3160 }
3157 3161
5005 init_pset_getloadavg_ptr(); 5009 init_pset_getloadavg_ptr();
5006 5010
5007 return JNI_OK; 5011 return JNI_OK;
5008 } 5012 }
5009 5013
5014 void os::init_3(void) {
5015 return;
5016 }
5010 5017
5011 // Mark the polling page as unreadable 5018 // Mark the polling page as unreadable
5012 void os::make_polling_page_unreadable(void) { 5019 void os::make_polling_page_unreadable(void) {
5013 if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 ) 5020 if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
5014 fatal("Could not disable polling page"); 5021 fatal("Could not disable polling page");
5410 return ::getloadavg(loadavg, nelem); 5417 return ::getloadavg(loadavg, nelem);
5411 } 5418 }
5412 } 5419 }
5413 5420
5414 //--------------------------------------------------------------------------------- 5421 //---------------------------------------------------------------------------------
5415 #ifndef PRODUCT
5416 5422
5417 static address same_page(address x, address y) { 5423 static address same_page(address x, address y) {
5418 intptr_t page_bits = -os::vm_page_size(); 5424 intptr_t page_bits = -os::vm_page_size();
5419 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) 5425 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
5420 return x; 5426 return x;
5422 return (address)(intptr_t(y) | ~page_bits) + 1; 5428 return (address)(intptr_t(y) | ~page_bits) + 1;
5423 else 5429 else
5424 return (address)(intptr_t(y) & page_bits); 5430 return (address)(intptr_t(y) & page_bits);
5425 } 5431 }
5426 5432
5427 bool os::find(address addr) { 5433 bool os::find(address addr, outputStream* st) {
5428 Dl_info dlinfo; 5434 Dl_info dlinfo;
5429 memset(&dlinfo, 0, sizeof(dlinfo)); 5435 memset(&dlinfo, 0, sizeof(dlinfo));
5430 if (dladdr(addr, &dlinfo)) { 5436 if (dladdr(addr, &dlinfo)) {
5431 #ifdef _LP64 5437 #ifdef _LP64
5432 tty->print("0x%016lx: ", addr); 5438 st->print("0x%016lx: ", addr);
5433 #else 5439 #else
5434 tty->print("0x%08x: ", addr); 5440 st->print("0x%08x: ", addr);
5435 #endif 5441 #endif
5436 if (dlinfo.dli_sname != NULL) 5442 if (dlinfo.dli_sname != NULL)
5437 tty->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr); 5443 st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
5438 else if (dlinfo.dli_fname) 5444 else if (dlinfo.dli_fname)
5439 tty->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase); 5445 st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
5440 else 5446 else
5441 tty->print("<absolute address>"); 5447 st->print("<absolute address>");
5442 if (dlinfo.dli_fname) tty->print(" in %s", dlinfo.dli_fname); 5448 if (dlinfo.dli_fname) st->print(" in %s", dlinfo.dli_fname);
5443 #ifdef _LP64 5449 #ifdef _LP64
5444 if (dlinfo.dli_fbase) tty->print(" at 0x%016lx", dlinfo.dli_fbase); 5450 if (dlinfo.dli_fbase) st->print(" at 0x%016lx", dlinfo.dli_fbase);
5445 #else 5451 #else
5446 if (dlinfo.dli_fbase) tty->print(" at 0x%08x", dlinfo.dli_fbase); 5452 if (dlinfo.dli_fbase) st->print(" at 0x%08x", dlinfo.dli_fbase);
5447 #endif 5453 #endif
5448 tty->cr(); 5454 st->cr();
5449 5455
5450 if (Verbose) { 5456 if (Verbose) {
5451 // decode some bytes around the PC 5457 // decode some bytes around the PC
5452 address begin = same_page(addr-40, addr); 5458 address begin = same_page(addr-40, addr);
5453 address end = same_page(addr+40, addr); 5459 address end = same_page(addr+40, addr);
5456 if (begin < lowest) begin = lowest; 5462 if (begin < lowest) begin = lowest;
5457 Dl_info dlinfo2; 5463 Dl_info dlinfo2;
5458 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr 5464 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
5459 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) 5465 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
5460 end = (address) dlinfo2.dli_saddr; 5466 end = (address) dlinfo2.dli_saddr;
5461 Disassembler::decode(begin, end); 5467 Disassembler::decode(begin, end, st);
5462 } 5468 }
5463 return true; 5469 return true;
5464 } 5470 }
5465 return false; 5471 return false;
5466 } 5472 }
5467
5468 #endif
5469
5470 5473
5471 // Following function has been added to support HotSparc's libjvm.so running 5474 // Following function has been added to support HotSparc's libjvm.so running
5472 // under Solaris production JDK 1.2.2 / 1.3.0. These came from 5475 // under Solaris production JDK 1.2.2 / 1.3.0. These came from
5473 // src/solaris/hpi/native_threads in the EVM codebase. 5476 // src/solaris/hpi/native_threads in the EVM codebase.
5474 // 5477 //
5908 5911
5909 // If externally suspended while waiting, re-suspend 5912 // If externally suspended while waiting, re-suspend
5910 if (jt->handle_special_suspend_equivalent_condition()) { 5913 if (jt->handle_special_suspend_equivalent_condition()) {
5911 jt->java_suspend_self(); 5914 jt->java_suspend_self();
5912 } 5915 }
5913
5914 OrderAccess::fence(); 5916 OrderAccess::fence();
5915 } 5917 }
5916 5918
5917 void Parker::unpark() { 5919 void Parker::unpark() {
5918 int s, status ; 5920 int s, status ;
5995 // Unknown exit code; pass it through 5997 // Unknown exit code; pass it through
5996 return status; 5998 return status;
5997 } 5999 }
5998 } 6000 }
5999 } 6001 }
6002
6003 // is_headless_jre()
6004 //
6005 // Test for the existence of libmawt in motif21 or xawt directories
6006 // in order to report if we are running in a headless jre
6007 //
6008 bool os::is_headless_jre() {
6009 struct stat statbuf;
6010 char buf[MAXPATHLEN];
6011 char libmawtpath[MAXPATHLEN];
6012 const char *xawtstr = "/xawt/libmawt.so";
6013 const char *motifstr = "/motif21/libmawt.so";
6014 char *p;
6015
6016 // Get path to libjvm.so
6017 os::jvm_path(buf, sizeof(buf));
6018
6019 // Get rid of libjvm.so
6020 p = strrchr(buf, '/');
6021 if (p == NULL) return false;
6022 else *p = '\0';
6023
6024 // Get rid of client or server
6025 p = strrchr(buf, '/');
6026 if (p == NULL) return false;
6027 else *p = '\0';
6028
6029 // check xawt/libmawt.so
6030 strcpy(libmawtpath, buf);
6031 strcat(libmawtpath, xawtstr);
6032 if (::stat(libmawtpath, &statbuf) == 0) return false;
6033
6034 // check motif21/libmawt.so
6035 strcpy(libmawtpath, buf);
6036 strcat(libmawtpath, motifstr);
6037 if (::stat(libmawtpath, &statbuf) == 0) return false;
6038
6039 return true;
6040 }
6041
6042