comparison src/os/bsd/vm/os_bsd.cpp @ 11173:6b0fd0964b87

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Wed, 31 Jul 2013 11:00:54 +0200
parents 836a62f43af9 59b052799158
children cefad50507d8
comparison
equal deleted inserted replaced
10912:4ea54634f03e 11173:6b0fd0964b87
1232 bool os::address_is_in_vm(address addr) { 1232 bool os::address_is_in_vm(address addr) {
1233 static address libjvm_base_addr; 1233 static address libjvm_base_addr;
1234 Dl_info dlinfo; 1234 Dl_info dlinfo;
1235 1235
1236 if (libjvm_base_addr == NULL) { 1236 if (libjvm_base_addr == NULL) {
1237 dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo); 1237 if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
1238 libjvm_base_addr = (address)dlinfo.dli_fbase; 1238 libjvm_base_addr = (address)dlinfo.dli_fbase;
1239 }
1239 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm"); 1240 assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
1240 } 1241 }
1241 1242
1242 if (dladdr((void *)addr, &dlinfo)) { 1243 if (dladdr((void *)addr, &dlinfo) != 0) {
1243 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true; 1244 if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1244 } 1245 }
1245 1246
1246 return false; 1247 return false;
1247 } 1248 }
1249 1250
1250 #define MACH_MAXSYMLEN 256 1251 #define MACH_MAXSYMLEN 256
1251 1252
1252 bool os::dll_address_to_function_name(address addr, char *buf, 1253 bool os::dll_address_to_function_name(address addr, char *buf,
1253 int buflen, int *offset) { 1254 int buflen, int *offset) {
1255 // buf is not optional, but offset is optional
1256 assert(buf != NULL, "sanity check");
1257
1254 Dl_info dlinfo; 1258 Dl_info dlinfo;
1255 char localbuf[MACH_MAXSYMLEN]; 1259 char localbuf[MACH_MAXSYMLEN];
1256 1260
1257 // dladdr will find names of dynamic functions only, but does 1261 if (dladdr((void*)addr, &dlinfo) != 0) {
1258 // it set dli_fbase with mach_header address when it "fails" ? 1262 // see if we have a matching symbol
1259 if (dladdr((void*)addr, &dlinfo) && dlinfo.dli_sname != NULL) { 1263 if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
1260 if (buf != NULL) { 1264 if (!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
1261 if(!Decoder::demangle(dlinfo.dli_sname, buf, buflen)) {
1262 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname); 1265 jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1263 } 1266 }
1264 } 1267 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1265 if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr; 1268 return true;
1266 return true; 1269 }
1267 } else if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != 0) { 1270 // no matching symbol so try for just file info
1268 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase), 1271 if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
1269 buf, buflen, offset, dlinfo.dli_fname)) { 1272 if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1270 return true; 1273 buf, buflen, offset, dlinfo.dli_fname)) {
1271 } 1274 return true;
1272 } 1275 }
1273 1276 }
1274 // Handle non-dymanic manually: 1277
1275 if (dlinfo.dli_fbase != NULL && 1278 // Handle non-dynamic manually:
1276 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset, dlinfo.dli_fbase)) { 1279 if (dlinfo.dli_fbase != NULL &&
1277 if(!Decoder::demangle(localbuf, buf, buflen)) { 1280 Decoder::decode(addr, localbuf, MACH_MAXSYMLEN, offset,
1278 jio_snprintf(buf, buflen, "%s", localbuf); 1281 dlinfo.dli_fbase)) {
1279 } 1282 if (!Decoder::demangle(localbuf, buf, buflen)) {
1280 return true; 1283 jio_snprintf(buf, buflen, "%s", localbuf);
1281 } 1284 }
1282 if (buf != NULL) buf[0] = '\0'; 1285 return true;
1286 }
1287 }
1288 buf[0] = '\0';
1283 if (offset != NULL) *offset = -1; 1289 if (offset != NULL) *offset = -1;
1284 return false; 1290 return false;
1285 } 1291 }
1286 1292
1287 // ported from solaris version 1293 // ported from solaris version
1288 bool os::dll_address_to_library_name(address addr, char* buf, 1294 bool os::dll_address_to_library_name(address addr, char* buf,
1289 int buflen, int* offset) { 1295 int buflen, int* offset) {
1296 // buf is not optional, but offset is optional
1297 assert(buf != NULL, "sanity check");
1298
1290 Dl_info dlinfo; 1299 Dl_info dlinfo;
1291 1300
1292 if (dladdr((void*)addr, &dlinfo)){ 1301 if (dladdr((void*)addr, &dlinfo) != 0) {
1293 if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname); 1302 if (dlinfo.dli_fname != NULL) {
1294 if (offset) *offset = addr - (address)dlinfo.dli_fbase; 1303 jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
1295 return true; 1304 }
1296 } else { 1305 if (dlinfo.dli_fbase != NULL && offset != NULL) {
1297 if (buf) buf[0] = '\0'; 1306 *offset = addr - (address)dlinfo.dli_fbase;
1298 if (offset) *offset = -1; 1307 }
1299 return false; 1308 return true;
1300 } 1309 }
1310
1311 buf[0] = '\0';
1312 if (offset) *offset = -1;
1313 return false;
1301 } 1314 }
1302 1315
1303 // Loads .dll/.so and 1316 // Loads .dll/.so and
1304 // in case of error it checks if .dll/.so was built for the 1317 // in case of error it checks if .dll/.so was built for the
1305 // same architecture as Hotspot is running on 1318 // same architecture as Hotspot is running on
1518 1531
1519 return true; 1532 return true;
1520 } 1533 }
1521 1534
1522 void os::print_dll_info(outputStream *st) { 1535 void os::print_dll_info(outputStream *st) {
1523 st->print_cr("Dynamic libraries:"); 1536 st->print_cr("Dynamic libraries:");
1524 #ifdef RTLD_DI_LINKMAP 1537 #ifdef RTLD_DI_LINKMAP
1525 Dl_info dli; 1538 Dl_info dli;
1526 void *handle; 1539 void *handle;
1527 Link_map *map; 1540 Link_map *map;
1528 Link_map *p; 1541 Link_map *p;
1529 1542
1530 if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) { 1543 if (dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli) == 0 ||
1531 st->print_cr("Error: Cannot print dynamic libraries."); 1544 dli.dli_fname == NULL) {
1532 return; 1545 st->print_cr("Error: Cannot print dynamic libraries.");
1533 } 1546 return;
1534 handle = dlopen(dli.dli_fname, RTLD_LAZY); 1547 }
1535 if (handle == NULL) { 1548 handle = dlopen(dli.dli_fname, RTLD_LAZY);
1536 st->print_cr("Error: Cannot print dynamic libraries."); 1549 if (handle == NULL) {
1537 return; 1550 st->print_cr("Error: Cannot print dynamic libraries.");
1538 } 1551 return;
1539 dlinfo(handle, RTLD_DI_LINKMAP, &map); 1552 }
1540 if (map == NULL) { 1553 dlinfo(handle, RTLD_DI_LINKMAP, &map);
1541 st->print_cr("Error: Cannot print dynamic libraries."); 1554 if (map == NULL) {
1542 return; 1555 st->print_cr("Error: Cannot print dynamic libraries.");
1543 } 1556 return;
1544 1557 }
1545 while (map->l_prev != NULL) 1558
1546 map = map->l_prev; 1559 while (map->l_prev != NULL)
1547 1560 map = map->l_prev;
1548 while (map != NULL) { 1561
1549 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name); 1562 while (map != NULL) {
1550 map = map->l_next; 1563 st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
1551 } 1564 map = map->l_next;
1552 1565 }
1553 dlclose(handle); 1566
1567 dlclose(handle);
1554 #elif defined(__APPLE__) 1568 #elif defined(__APPLE__)
1555 uint32_t count; 1569 uint32_t count;
1556 uint32_t i; 1570 uint32_t i;
1557 1571
1558 count = _dyld_image_count(); 1572 count = _dyld_image_count();
1559 for (i = 1; i < count; i++) { 1573 for (i = 1; i < count; i++) {
1560 const char *name = _dyld_get_image_name(i); 1574 const char *name = _dyld_get_image_name(i);
1561 intptr_t slide = _dyld_get_image_vmaddr_slide(i); 1575 intptr_t slide = _dyld_get_image_vmaddr_slide(i);
1562 st->print_cr(PTR_FORMAT " \t%s", slide, name); 1576 st->print_cr(PTR_FORMAT " \t%s", slide, name);
1563 } 1577 }
1564 #else 1578 #else
1565 st->print_cr("Error: Cannot print dynamic libraries."); 1579 st->print_cr("Error: Cannot print dynamic libraries.");
1566 #endif 1580 #endif
1567 } 1581 }
1568 1582
1569 void os::print_os_info_brief(outputStream* st) { 1583 void os::print_os_info_brief(outputStream* st) {
1570 st->print("Bsd"); 1584 st->print("Bsd");
1705 1719
1706 char dli_fname[MAXPATHLEN]; 1720 char dli_fname[MAXPATHLEN];
1707 bool ret = dll_address_to_library_name( 1721 bool ret = dll_address_to_library_name(
1708 CAST_FROM_FN_PTR(address, os::jvm_path), 1722 CAST_FROM_FN_PTR(address, os::jvm_path),
1709 dli_fname, sizeof(dli_fname), NULL); 1723 dli_fname, sizeof(dli_fname), NULL);
1710 assert(ret != 0, "cannot locate libjvm"); 1724 assert(ret, "cannot locate libjvm");
1711 char *rp = realpath(dli_fname, buf); 1725 char *rp = NULL;
1726 if (ret && dli_fname[0] != '\0') {
1727 rp = realpath(dli_fname, buf);
1728 }
1712 if (rp == NULL) 1729 if (rp == NULL)
1713 return; 1730 return;
1714 1731
1715 if (Arguments::created_by_gamma_launcher()) { 1732 if (Arguments::created_by_gamma_launcher()) {
1716 // Support for the gamma launcher. Typical value for buf is 1733 // Support for the gamma launcher. Typical value for buf is
2072 ::close(fd); 2089 ::close(fd);
2073 unlink(buf); 2090 unlink(buf);
2074 } 2091 }
2075 } 2092 }
2076 2093
2094 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
2095 int err) {
2096 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2097 ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
2098 strerror(err), err);
2099 }
2100
2077 // NOTE: Bsd kernel does not really reserve the pages for us. 2101 // NOTE: Bsd kernel does not really reserve the pages for us.
2078 // All it does is to check if there are enough free pages 2102 // All it does is to check if there are enough free pages
2079 // left at the time of mmap(). This could be a potential 2103 // left at the time of mmap(). This could be a potential
2080 // problem. 2104 // problem.
2081 bool os::pd_commit_memory(char* addr, size_t size, bool exec) { 2105 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2082 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; 2106 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
2083 #ifdef __OpenBSD__ 2107 #ifdef __OpenBSD__
2084 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD 2108 // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
2085 return ::mprotect(addr, size, prot) == 0; 2109 if (::mprotect(addr, size, prot) == 0) {
2110 return true;
2111 }
2086 #else 2112 #else
2087 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, 2113 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
2088 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); 2114 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
2089 return res != (uintptr_t) MAP_FAILED; 2115 if (res != (uintptr_t) MAP_FAILED) {
2090 #endif 2116 return true;
2091 } 2117 }
2092 2118 #endif
2119
2120 // Warn about any commit errors we see in non-product builds just
2121 // in case mmap() doesn't work as described on the man page.
2122 NOT_PRODUCT(warn_fail_commit_memory(addr, size, exec, errno);)
2123
2124 return false;
2125 }
2093 2126
2094 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, 2127 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
2095 bool exec) { 2128 bool exec) {
2096 return commit_memory(addr, size, exec); 2129 // alignment_hint is ignored on this OS
2130 return pd_commit_memory(addr, size, exec);
2131 }
2132
2133 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2134 const char* mesg) {
2135 assert(mesg != NULL, "mesg must be specified");
2136 if (!pd_commit_memory(addr, size, exec)) {
2137 // add extra info in product mode for vm_exit_out_of_memory():
2138 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
2139 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
2140 }
2141 }
2142
2143 void os::pd_commit_memory_or_exit(char* addr, size_t size,
2144 size_t alignment_hint, bool exec,
2145 const char* mesg) {
2146 // alignment_hint is ignored on this OS
2147 pd_commit_memory_or_exit(addr, size, exec, mesg);
2097 } 2148 }
2098 2149
2099 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { 2150 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2100 } 2151 }
2101 2152
2146 return res != (uintptr_t) MAP_FAILED; 2197 return res != (uintptr_t) MAP_FAILED;
2147 #endif 2198 #endif
2148 } 2199 }
2149 2200
2150 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 2201 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
2151 return os::commit_memory(addr, size); 2202 return os::commit_memory(addr, size, !ExecMem);
2152 } 2203 }
2153 2204
2154 // If this is a growable mapping, remove the guard pages entirely by 2205 // If this is a growable mapping, remove the guard pages entirely by
2155 // munmap()ping them. If not, just call uncommit_memory(). 2206 // munmap()ping them. If not, just call uncommit_memory().
2156 bool os::remove_stack_guard_pages(char* addr, size_t size) { 2207 bool os::remove_stack_guard_pages(char* addr, size_t size) {
2318 } 2369 }
2319 return NULL; 2370 return NULL;
2320 } 2371 }
2321 2372
2322 // The memory is committed 2373 // The memory is committed
2323 address pc = CALLER_PC; 2374 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
2324 MemTracker::record_virtual_memory_reserve((address)addr, bytes, pc);
2325 MemTracker::record_virtual_memory_commit((address)addr, bytes, pc);
2326 2375
2327 return addr; 2376 return addr;
2328 } 2377 }
2329 2378
2330 bool os::release_memory_special(char* base, size_t bytes) { 2379 bool os::release_memory_special(char* base, size_t bytes) {
2380 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
2331 // detaching the SHM segment will also delete it, see reserve_memory_special() 2381 // detaching the SHM segment will also delete it, see reserve_memory_special()
2332 int rslt = shmdt(base); 2382 int rslt = shmdt(base);
2333 if (rslt == 0) { 2383 if (rslt == 0) {
2334 MemTracker::record_virtual_memory_uncommit((address)base, bytes); 2384 tkr.record((address)base, bytes);
2335 MemTracker::record_virtual_memory_release((address)base, bytes);
2336 return true; 2385 return true;
2337 } else { 2386 } else {
2387 tkr.discard();
2338 return false; 2388 return false;
2339 } 2389 }
2340 2390
2341 } 2391 }
2342 2392
3510 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page); 3560 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3511 #endif 3561 #endif
3512 3562
3513 if (!UseMembar) { 3563 if (!UseMembar) {
3514 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 3564 address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
3515 guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page"); 3565 guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
3516 os::set_memory_serialize_page( mem_serialize_page ); 3566 os::set_memory_serialize_page( mem_serialize_page );
3517 3567
3518 #ifndef PRODUCT 3568 #ifndef PRODUCT
3519 if(Verbose && PrintMiscellaneous) 3569 if(Verbose && PrintMiscellaneous)
3520 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); 3570 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3712 // debug support 3762 // debug support
3713 3763
3714 bool os::find(address addr, outputStream* st) { 3764 bool os::find(address addr, outputStream* st) {
3715 Dl_info dlinfo; 3765 Dl_info dlinfo;
3716 memset(&dlinfo, 0, sizeof(dlinfo)); 3766 memset(&dlinfo, 0, sizeof(dlinfo));
3717 if (dladdr(addr, &dlinfo)) { 3767 if (dladdr(addr, &dlinfo) != 0) {
3718 st->print(PTR_FORMAT ": ", addr); 3768 st->print(PTR_FORMAT ": ", addr);
3719 if (dlinfo.dli_sname != NULL) { 3769 if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
3720 st->print("%s+%#x", dlinfo.dli_sname, 3770 st->print("%s+%#x", dlinfo.dli_sname,
3721 addr - (intptr_t)dlinfo.dli_saddr); 3771 addr - (intptr_t)dlinfo.dli_saddr);
3722 } else if (dlinfo.dli_fname) { 3772 } else if (dlinfo.dli_fbase != NULL) {
3723 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase); 3773 st->print("<offset %#x>", addr - (intptr_t)dlinfo.dli_fbase);
3724 } else { 3774 } else {
3725 st->print("<absolute address>"); 3775 st->print("<absolute address>");
3726 } 3776 }
3727 if (dlinfo.dli_fname) { 3777 if (dlinfo.dli_fname != NULL) {
3728 st->print(" in %s", dlinfo.dli_fname); 3778 st->print(" in %s", dlinfo.dli_fname);
3729 } 3779 }
3730 if (dlinfo.dli_fbase) { 3780 if (dlinfo.dli_fbase != NULL) {
3731 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase); 3781 st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
3732 } 3782 }
3733 st->cr(); 3783 st->cr();
3734 3784
3735 if (Verbose) { 3785 if (Verbose) {
3738 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); 3788 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
3739 address lowest = (address) dlinfo.dli_sname; 3789 address lowest = (address) dlinfo.dli_sname;
3740 if (!lowest) lowest = (address) dlinfo.dli_fbase; 3790 if (!lowest) lowest = (address) dlinfo.dli_fbase;
3741 if (begin < lowest) begin = lowest; 3791 if (begin < lowest) begin = lowest;
3742 Dl_info dlinfo2; 3792 Dl_info dlinfo2;
3743 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr 3793 if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
3744 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) 3794 && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
3745 end = (address) dlinfo2.dli_saddr; 3795 end = (address) dlinfo2.dli_saddr;
3746 Disassembler::decode(begin, end, st); 3796 Disassembler::decode(begin, end, st);
3747 } 3797 }
3748 return true; 3798 return true;