1 /* 2 * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2012, 2016 SAP SE. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 // According to the AIX OS doc #pragma alloca must be used 27 // with C++ compiler before referencing the function alloca() 28 #pragma alloca 29 30 // no precompiled headers 31 #include "classfile/classLoader.hpp" 32 #include "classfile/systemDictionary.hpp" 33 #include "classfile/vmSymbols.hpp" 34 #include "code/icBuffer.hpp" 35 #include "code/vtableStubs.hpp" 36 #include "compiler/compileBroker.hpp" 37 #include "interpreter/interpreter.hpp" 38 #include "jvm_aix.h" 39 #include "logging/log.hpp" 40 #include "libo4.hpp" 41 #include "libperfstat_aix.hpp" 42 #include "libodm_aix.hpp" 43 #include "loadlib_aix.hpp" 44 #include "memory/allocation.inline.hpp" 45 #include "memory/filemap.hpp" 46 #include "misc_aix.hpp" 47 #include "oops/oop.inline.hpp" 48 #include "os_aix.inline.hpp" 49 #include "os_share_aix.hpp" 50 #include "porting_aix.hpp" 51 #include "prims/jniFastGetField.hpp" 52 #include "prims/jvm.h" 53 #include "prims/jvm_misc.hpp" 54 #include "runtime/arguments.hpp" 55 #include "runtime/atomic.hpp" 56 #include "runtime/extendedPC.hpp" 57 #include "runtime/globals.hpp" 58 #include "runtime/interfaceSupport.hpp" 59 #include "runtime/java.hpp" 60 #include "runtime/javaCalls.hpp" 61 #include "runtime/mutexLocker.hpp" 62 #include "runtime/objectMonitor.hpp" 63 #include "runtime/orderAccess.inline.hpp" 64 #include "runtime/os.hpp" 65 #include "runtime/osThread.hpp" 66 #include "runtime/perfMemory.hpp" 67 #include "runtime/sharedRuntime.hpp" 68 #include "runtime/statSampler.hpp" 69 #include "runtime/stubRoutines.hpp" 70 #include "runtime/thread.inline.hpp" 71 #include "runtime/threadCritical.hpp" 72 #include "runtime/timer.hpp" 73 #include "runtime/vm_version.hpp" 74 #include "services/attachListener.hpp" 75 #include "services/runtimeService.hpp" 76 #include "utilities/decoder.hpp" 77 #include "utilities/defaultStream.hpp" 78 #include "utilities/events.hpp" 79 #include "utilities/growableArray.hpp" 80 #include "utilities/vmError.hpp" 81 82 // put OS-includes here (sorted alphabetically) 83 #include <errno.h> 84 #include <fcntl.h> 85 #include <inttypes.h> 86 #include <poll.h> 87 #include <procinfo.h> 88 #include <pthread.h> 89 #include <pwd.h> 90 #include <semaphore.h> 91 #include <signal.h> 92 #include <stdint.h> 93 #include <stdio.h> 94 #include <string.h> 95 #include <unistd.h> 96 #include <sys/ioctl.h> 97 #include <sys/ipc.h> 98 #include <sys/mman.h> 99 #include <sys/resource.h> 100 #include <sys/select.h> 101 #include <sys/shm.h> 102 #include <sys/socket.h> 103 #include <sys/stat.h> 104 #include <sys/sysinfo.h> 105 #include <sys/systemcfg.h> 106 #include <sys/time.h> 107 #include <sys/times.h> 108 #include <sys/types.h> 109 #include <sys/utsname.h> 110 #include <sys/vminfo.h> 111 #include <sys/wait.h> 112 113 // Missing prototypes for various system APIs. 114 extern "C" 115 int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t); 116 117 #if !defined(_AIXVERSION_610) 118 extern "C" int getthrds64(pid_t, struct thrdentry64*, int, tid64_t*, int); 119 extern "C" int getprocs64(procentry64*, int, fdsinfo*, int, pid_t*, int); 120 extern "C" int getargs (procsinfo*, int, char*, int); 121 #endif 122 123 #define MAX_PATH (2 * K) 124 125 // for timer info max values which include all bits 126 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 127 // for multipage initialization error analysis (in 'g_multipage_error') 128 #define ERROR_MP_OS_TOO_OLD 100 129 #define ERROR_MP_EXTSHM_ACTIVE 101 130 #define ERROR_MP_VMGETINFO_FAILED 102 131 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103 132 133 // Query dimensions of the stack of the calling thread. 134 static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size); 135 static address resolve_function_descriptor_to_code_pointer(address p); 136 137 static void vmembk_print_on(outputStream* os); 138 139 //////////////////////////////////////////////////////////////////////////////// 140 // global variables (for a description see os_aix.hpp) 141 142 julong os::Aix::_physical_memory = 0; 143 144 pthread_t os::Aix::_main_thread = ((pthread_t)0); 145 int os::Aix::_page_size = -1; 146 147 // -1 = uninitialized, 0 if AIX, 1 if OS/400 pase 148 int os::Aix::_on_pase = -1; 149 150 // 0 = uninitialized, otherwise 32 bit number: 151 // 0xVVRRTTSS 152 // VV - major version 153 // RR - minor version 154 // TT - tech level, if known, 0 otherwise 155 // SS - service pack, if known, 0 otherwise 156 uint32_t os::Aix::_os_version = 0; 157 158 // -1 = uninitialized, 0 - no, 1 - yes 159 int os::Aix::_xpg_sus_mode = -1; 160 161 // -1 = uninitialized, 0 - no, 1 - yes 162 int os::Aix::_extshm = -1; 163 164 //////////////////////////////////////////////////////////////////////////////// 165 // local variables 166 167 static jlong initial_time_count = 0; 168 static int clock_tics_per_sec = 100; 169 static sigset_t check_signal_done; // For diagnostics to print a message once (see run_periodic_checks) 170 static bool check_signals = true; 171 static int SR_signum = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769) 172 static sigset_t SR_sigset; 173 174 // Process break recorded at startup. 175 static address g_brk_at_startup = NULL; 176 177 // This describes the state of multipage support of the underlying 178 // OS. Note that this is of no interest to the outsize world and 179 // therefore should not be defined in AIX class. 180 // 181 // AIX supports four different page sizes - 4K, 64K, 16MB, 16GB. The 182 // latter two (16M "large" resp. 16G "huge" pages) require special 183 // setup and are normally not available. 184 // 185 // AIX supports multiple page sizes per process, for: 186 // - Stack (of the primordial thread, so not relevant for us) 187 // - Data - data, bss, heap, for us also pthread stacks 188 // - Text - text code 189 // - shared memory 190 // 191 // Default page sizes can be set via linker options (-bdatapsize, -bstacksize, ...) 192 // and via environment variable LDR_CNTRL (DATAPSIZE, STACKPSIZE, ...). 193 // 194 // For shared memory, page size can be set dynamically via 195 // shmctl(). Different shared memory regions can have different page 196 // sizes. 197 // 198 // More information can be found at AIBM info center: 199 // http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm 200 // 201 static struct { 202 size_t pagesize; // sysconf _SC_PAGESIZE (4K) 203 size_t datapsize; // default data page size (LDR_CNTRL DATAPSIZE) 204 size_t shmpsize; // default shared memory page size (LDR_CNTRL SHMPSIZE) 205 size_t pthr_stack_pagesize; // stack page size of pthread threads 206 size_t textpsize; // default text page size (LDR_CNTRL STACKPSIZE) 207 bool can_use_64K_pages; // True if we can alloc 64K pages dynamically with Sys V shm. 208 bool can_use_16M_pages; // True if we can alloc 16M pages dynamically with Sys V shm. 209 int error; // Error describing if something went wrong at multipage init. 210 } g_multipage_support = { 211 (size_t) -1, 212 (size_t) -1, 213 (size_t) -1, 214 (size_t) -1, 215 (size_t) -1, 216 false, false, 217 0 218 }; 219 220 // We must not accidentally allocate memory close to the BRK - even if 221 // that would work - because then we prevent the BRK segment from 222 // growing which may result in a malloc OOM even though there is 223 // enough memory. The problem only arises if we shmat() or mmap() at 224 // a specific wish address, e.g. to place the heap in a 225 // compressed-oops-friendly way. 226 static bool is_close_to_brk(address a) { 227 assert0(g_brk_at_startup != NULL); 228 if (a >= g_brk_at_startup && 229 a < (g_brk_at_startup + MaxExpectedDataSegmentSize)) { 230 return true; 231 } 232 return false; 233 } 234 235 julong os::available_memory() { 236 return Aix::available_memory(); 237 } 238 239 julong os::Aix::available_memory() { 240 // Avoid expensive API call here, as returned value will always be null. 241 if (os::Aix::on_pase()) { 242 return 0x0LL; 243 } 244 os::Aix::meminfo_t mi; 245 if (os::Aix::get_meminfo(&mi)) { 246 return mi.real_free; 247 } else { 248 return ULONG_MAX; 249 } 250 } 251 252 julong os::physical_memory() { 253 return Aix::physical_memory(); 254 } 255 256 // Return true if user is running as root. 257 258 bool os::have_special_privileges() { 259 static bool init = false; 260 static bool privileges = false; 261 if (!init) { 262 privileges = (getuid() != geteuid()) || (getgid() != getegid()); 263 init = true; 264 } 265 return privileges; 266 } 267 268 // Helper function, emulates disclaim64 using multiple 32bit disclaims 269 // because we cannot use disclaim64() on AS/400 and old AIX releases. 270 static bool my_disclaim64(char* addr, size_t size) { 271 272 if (size == 0) { 273 return true; 274 } 275 276 // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.) 277 const unsigned int maxDisclaimSize = 0x40000000; 278 279 const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize); 280 const unsigned int lastDisclaimSize = (size % maxDisclaimSize); 281 282 char* p = addr; 283 284 for (int i = 0; i < numFullDisclaimsNeeded; i ++) { 285 if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) { 286 trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno); 287 return false; 288 } 289 p += maxDisclaimSize; 290 } 291 292 if (lastDisclaimSize > 0) { 293 if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) { 294 trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno); 295 return false; 296 } 297 } 298 299 return true; 300 } 301 302 // Cpu architecture string 303 #if defined(PPC32) 304 static char cpu_arch[] = "ppc"; 305 #elif defined(PPC64) 306 static char cpu_arch[] = "ppc64"; 307 #else 308 #error Add appropriate cpu_arch setting 309 #endif 310 311 // Wrap the function "vmgetinfo" which is not available on older OS releases. 312 static int checked_vmgetinfo(void *out, int command, int arg) { 313 if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) { 314 guarantee(false, "cannot call vmgetinfo on AS/400 older than V6R1"); 315 } 316 return ::vmgetinfo(out, command, arg); 317 } 318 319 // Given an address, returns the size of the page backing that address. 320 size_t os::Aix::query_pagesize(void* addr) { 321 322 if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) { 323 // AS/400 older than V6R1: no vmgetinfo here, default to 4K 324 return 4*K; 325 } 326 327 vm_page_info pi; 328 pi.addr = (uint64_t)addr; 329 if (checked_vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) { 330 return pi.pagesize; 331 } else { 332 assert(false, "vmgetinfo failed to retrieve page size"); 333 return 4*K; 334 } 335 } 336 337 void os::Aix::initialize_system_info() { 338 339 // Get the number of online(logical) cpus instead of configured. 340 os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN); 341 assert(_processor_count > 0, "_processor_count must be > 0"); 342 343 // Retrieve total physical storage. 344 os::Aix::meminfo_t mi; 345 if (!os::Aix::get_meminfo(&mi)) { 346 assert(false, "os::Aix::get_meminfo failed."); 347 } 348 _physical_memory = (julong) mi.real_total; 349 } 350 351 // Helper function for tracing page sizes. 352 static const char* describe_pagesize(size_t pagesize) { 353 switch (pagesize) { 354 case 4*K : return "4K"; 355 case 64*K: return "64K"; 356 case 16*M: return "16M"; 357 case 16*G: return "16G"; 358 default: 359 assert(false, "surprise"); 360 return "??"; 361 } 362 } 363 364 // Probe OS for multipage support. 365 // Will fill the global g_multipage_support structure. 366 // Must be called before calling os::large_page_init(). 367 static void query_multipage_support() { 368 369 guarantee(g_multipage_support.pagesize == -1, 370 "do not call twice"); 371 372 g_multipage_support.pagesize = ::sysconf(_SC_PAGESIZE); 373 374 // This really would surprise me. 375 assert(g_multipage_support.pagesize == 4*K, "surprise!"); 376 377 // Query default data page size (default page size for C-Heap, pthread stacks and .bss). 378 // Default data page size is defined either by linker options (-bdatapsize) 379 // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given, 380 // default should be 4K. 381 { 382 void* p = ::malloc(16*M); 383 g_multipage_support.datapsize = os::Aix::query_pagesize(p); 384 ::free(p); 385 } 386 387 // Query default shm page size (LDR_CNTRL SHMPSIZE). 388 // Note that this is pure curiosity. We do not rely on default page size but set 389 // our own page size after allocated. 390 { 391 const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR); 392 guarantee(shmid != -1, "shmget failed"); 393 void* p = ::shmat(shmid, NULL, 0); 394 ::shmctl(shmid, IPC_RMID, NULL); 395 guarantee(p != (void*) -1, "shmat failed"); 396 g_multipage_support.shmpsize = os::Aix::query_pagesize(p); 397 ::shmdt(p); 398 } 399 400 // Before querying the stack page size, make sure we are not running as primordial 401 // thread (because primordial thread's stack may have different page size than 402 // pthread thread stacks). Running a VM on the primordial thread won't work for a 403 // number of reasons so we may just as well guarantee it here. 404 guarantee0(!os::Aix::is_primordial_thread()); 405 406 // Query pthread stack page size. Should be the same as data page size because 407 // pthread stacks are allocated from C-Heap. 408 { 409 int dummy = 0; 410 g_multipage_support.pthr_stack_pagesize = os::Aix::query_pagesize(&dummy); 411 } 412 413 // Query default text page size (LDR_CNTRL TEXTPSIZE). 414 { 415 address any_function = 416 resolve_function_descriptor_to_code_pointer((address)describe_pagesize); 417 g_multipage_support.textpsize = os::Aix::query_pagesize(any_function); 418 } 419 420 // Now probe for support of 64K pages and 16M pages. 421 422 // Before OS/400 V6R1, there is no support for pages other than 4K. 423 if (os::Aix::on_pase_V5R4_or_older()) { 424 trcVerbose("OS/400 < V6R1 - no large page support."); 425 g_multipage_support.error = ERROR_MP_OS_TOO_OLD; 426 goto query_multipage_support_end; 427 } 428 429 // Now check which page sizes the OS claims it supports, and of those, which actually can be used. 430 { 431 const int MAX_PAGE_SIZES = 4; 432 psize_t sizes[MAX_PAGE_SIZES]; 433 const int num_psizes = checked_vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES); 434 if (num_psizes == -1) { 435 trcVerbose("vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)", errno); 436 trcVerbose("disabling multipage support."); 437 g_multipage_support.error = ERROR_MP_VMGETINFO_FAILED; 438 goto query_multipage_support_end; 439 } 440 guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed."); 441 assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?"); 442 trcVerbose("vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes); 443 for (int i = 0; i < num_psizes; i ++) { 444 trcVerbose(" %s ", describe_pagesize(sizes[i])); 445 } 446 447 // Can we use 64K, 16M pages? 448 for (int i = 0; i < num_psizes; i ++) { 449 const size_t pagesize = sizes[i]; 450 if (pagesize != 64*K && pagesize != 16*M) { 451 continue; 452 } 453 bool can_use = false; 454 trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize)); 455 const int shmid = ::shmget(IPC_PRIVATE, pagesize, 456 IPC_CREAT | S_IRUSR | S_IWUSR); 457 guarantee0(shmid != -1); // Should always work. 458 // Try to set pagesize. 459 struct shmid_ds shm_buf = { 0 }; 460 shm_buf.shm_pagesize = pagesize; 461 if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) { 462 const int en = errno; 463 ::shmctl(shmid, IPC_RMID, NULL); // As early as possible! 464 trcVerbose("shmctl(SHM_PAGESIZE) failed with errno=%n", 465 errno); 466 } else { 467 // Attach and double check pageisze. 468 void* p = ::shmat(shmid, NULL, 0); 469 ::shmctl(shmid, IPC_RMID, NULL); // As early as possible! 470 guarantee0(p != (void*) -1); // Should always work. 471 const size_t real_pagesize = os::Aix::query_pagesize(p); 472 if (real_pagesize != pagesize) { 473 trcVerbose("real page size (0x%llX) differs.", real_pagesize); 474 } else { 475 can_use = true; 476 } 477 ::shmdt(p); 478 } 479 trcVerbose("Can use: %s", (can_use ? "yes" : "no")); 480 if (pagesize == 64*K) { 481 g_multipage_support.can_use_64K_pages = can_use; 482 } else if (pagesize == 16*M) { 483 g_multipage_support.can_use_16M_pages = can_use; 484 } 485 } 486 487 } // end: check which pages can be used for shared memory 488 489 query_multipage_support_end: 490 491 trcVerbose("base page size (sysconf _SC_PAGESIZE): %s", 492 describe_pagesize(g_multipage_support.pagesize)); 493 trcVerbose("Data page size (C-Heap, bss, etc): %s", 494 describe_pagesize(g_multipage_support.datapsize)); 495 trcVerbose("Text page size: %s", 496 describe_pagesize(g_multipage_support.textpsize)); 497 trcVerbose("Thread stack page size (pthread): %s", 498 describe_pagesize(g_multipage_support.pthr_stack_pagesize)); 499 trcVerbose("Default shared memory page size: %s", 500 describe_pagesize(g_multipage_support.shmpsize)); 501 trcVerbose("Can use 64K pages dynamically with shared meory: %s", 502 (g_multipage_support.can_use_64K_pages ? "yes" :"no")); 503 trcVerbose("Can use 16M pages dynamically with shared memory: %s", 504 (g_multipage_support.can_use_16M_pages ? "yes" :"no")); 505 trcVerbose("Multipage error details: %d", 506 g_multipage_support.error); 507 508 // sanity checks 509 assert0(g_multipage_support.pagesize == 4*K); 510 assert0(g_multipage_support.datapsize == 4*K || g_multipage_support.datapsize == 64*K); 511 assert0(g_multipage_support.textpsize == 4*K || g_multipage_support.textpsize == 64*K); 512 assert0(g_multipage_support.pthr_stack_pagesize == g_multipage_support.datapsize); 513 assert0(g_multipage_support.shmpsize == 4*K || g_multipage_support.shmpsize == 64*K); 514 515 } 516 517 void os::init_system_properties_values() { 518 519 #define DEFAULT_LIBPATH "/lib:/usr/lib" 520 #define EXTENSIONS_DIR "/lib/ext" 521 522 // Buffer that fits several sprintfs. 523 // Note that the space for the trailing null is provided 524 // by the nulls included by the sizeof operator. 525 const size_t bufsize = 526 MAX2((size_t)MAXPATHLEN, // For dll_dir & friends. 527 (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR)); // extensions dir 528 char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); 529 530 // sysclasspath, java_home, dll_dir 531 { 532 char *pslash; 533 os::jvm_path(buf, bufsize); 534 535 // Found the full path to libjvm.so. 536 // Now cut the path to <java_home>/jre if we can. 537 pslash = strrchr(buf, '/'); 538 if (pslash != NULL) { 539 *pslash = '\0'; // Get rid of /libjvm.so. 540 } 541 pslash = strrchr(buf, '/'); 542 if (pslash != NULL) { 543 *pslash = '\0'; // Get rid of /{client|server|hotspot}. 544 } 545 Arguments::set_dll_dir(buf); 546 547 if (pslash != NULL) { 548 pslash = strrchr(buf, '/'); 549 if (pslash != NULL) { 550 *pslash = '\0'; // Get rid of /lib. 551 } 552 } 553 Arguments::set_java_home(buf); 554 set_boot_path('/', ':'); 555 } 556 557 // Where to look for native libraries. 558 559 // On Aix we get the user setting of LIBPATH. 560 // Eventually, all the library path setting will be done here. 561 // Get the user setting of LIBPATH. 562 const char *v = ::getenv("LIBPATH"); 563 const char *v_colon = ":"; 564 if (v == NULL) { v = ""; v_colon = ""; } 565 566 // Concatenate user and invariant part of ld_library_path. 567 // That's +1 for the colon and +1 for the trailing '\0'. 568 char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal); 569 sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon); 570 Arguments::set_library_path(ld_library_path); 571 FREE_C_HEAP_ARRAY(char, ld_library_path); 572 573 // Extensions directories. 574 sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); 575 Arguments::set_ext_dirs(buf); 576 577 FREE_C_HEAP_ARRAY(char, buf); 578 579 #undef DEFAULT_LIBPATH 580 #undef EXTENSIONS_DIR 581 } 582 583 //////////////////////////////////////////////////////////////////////////////// 584 // breakpoint support 585 586 void os::breakpoint() { 587 BREAKPOINT; 588 } 589 590 extern "C" void breakpoint() { 591 // use debugger to set breakpoint here 592 } 593 594 //////////////////////////////////////////////////////////////////////////////// 595 // signal support 596 597 debug_only(static bool signal_sets_initialized = false); 598 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs; 599 600 bool os::Aix::is_sig_ignored(int sig) { 601 struct sigaction oact; 602 sigaction(sig, (struct sigaction*)NULL, &oact); 603 void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction) 604 : CAST_FROM_FN_PTR(void*, oact.sa_handler); 605 if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) { 606 return true; 607 } else { 608 return false; 609 } 610 } 611 612 void os::Aix::signal_sets_init() { 613 // Should also have an assertion stating we are still single-threaded. 614 assert(!signal_sets_initialized, "Already initialized"); 615 // Fill in signals that are necessarily unblocked for all threads in 616 // the VM. Currently, we unblock the following signals: 617 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden 618 // by -Xrs (=ReduceSignalUsage)); 619 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all 620 // other threads. The "ReduceSignalUsage" boolean tells us not to alter 621 // the dispositions or masks wrt these signals. 622 // Programs embedding the VM that want to use the above signals for their 623 // own purposes must, at this time, use the "-Xrs" option to prevent 624 // interference with shutdown hooks and BREAK_SIGNAL thread dumping. 625 // (See bug 4345157, and other related bugs). 626 // In reality, though, unblocking these signals is really a nop, since 627 // these signals are not blocked by default. 628 sigemptyset(&unblocked_sigs); 629 sigemptyset(&allowdebug_blocked_sigs); 630 sigaddset(&unblocked_sigs, SIGILL); 631 sigaddset(&unblocked_sigs, SIGSEGV); 632 sigaddset(&unblocked_sigs, SIGBUS); 633 sigaddset(&unblocked_sigs, SIGFPE); 634 sigaddset(&unblocked_sigs, SIGTRAP); 635 sigaddset(&unblocked_sigs, SIGDANGER); 636 sigaddset(&unblocked_sigs, SR_signum); 637 638 if (!ReduceSignalUsage) { 639 if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) { 640 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); 641 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL); 642 } 643 if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) { 644 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); 645 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL); 646 } 647 if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) { 648 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); 649 sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL); 650 } 651 } 652 // Fill in signals that are blocked by all but the VM thread. 653 sigemptyset(&vm_sigs); 654 if (!ReduceSignalUsage) 655 sigaddset(&vm_sigs, BREAK_SIGNAL); 656 debug_only(signal_sets_initialized = true); 657 } 658 659 // These are signals that are unblocked while a thread is running Java. 660 // (For some reason, they get blocked by default.) 661 sigset_t* os::Aix::unblocked_signals() { 662 assert(signal_sets_initialized, "Not initialized"); 663 return &unblocked_sigs; 664 } 665 666 // These are the signals that are blocked while a (non-VM) thread is 667 // running Java. Only the VM thread handles these signals. 668 sigset_t* os::Aix::vm_signals() { 669 assert(signal_sets_initialized, "Not initialized"); 670 return &vm_sigs; 671 } 672 673 // These are signals that are blocked during cond_wait to allow debugger in 674 sigset_t* os::Aix::allowdebug_blocked_signals() { 675 assert(signal_sets_initialized, "Not initialized"); 676 return &allowdebug_blocked_sigs; 677 } 678 679 void os::Aix::hotspot_sigmask(Thread* thread) { 680 681 //Save caller's signal mask before setting VM signal mask 682 sigset_t caller_sigmask; 683 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask); 684 685 OSThread* osthread = thread->osthread(); 686 osthread->set_caller_sigmask(caller_sigmask); 687 688 pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL); 689 690 if (!ReduceSignalUsage) { 691 if (thread->is_VM_thread()) { 692 // Only the VM thread handles BREAK_SIGNAL ... 693 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL); 694 } else { 695 // ... all other threads block BREAK_SIGNAL 696 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL); 697 } 698 } 699 } 700 701 // retrieve memory information. 702 // Returns false if something went wrong; 703 // content of pmi undefined in this case. 704 bool os::Aix::get_meminfo(meminfo_t* pmi) { 705 706 assert(pmi, "get_meminfo: invalid parameter"); 707 708 memset(pmi, 0, sizeof(meminfo_t)); 709 710 if (os::Aix::on_pase()) { 711 // On PASE, use the libo4 porting library. 712 713 unsigned long long virt_total = 0; 714 unsigned long long real_total = 0; 715 unsigned long long real_free = 0; 716 unsigned long long pgsp_total = 0; 717 unsigned long long pgsp_free = 0; 718 if (libo4::get_memory_info(&virt_total, &real_total, &real_free, &pgsp_total, &pgsp_free)) { 719 pmi->virt_total = virt_total; 720 pmi->real_total = real_total; 721 pmi->real_free = real_free; 722 pmi->pgsp_total = pgsp_total; 723 pmi->pgsp_free = pgsp_free; 724 return true; 725 } 726 return false; 727 728 } else { 729 730 // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics 731 // See: 732 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 733 // ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm 734 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 735 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm 736 737 perfstat_memory_total_t psmt; 738 memset (&psmt, '\0', sizeof(psmt)); 739 const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1); 740 if (rc == -1) { 741 trcVerbose("perfstat_memory_total() failed (errno=%d)", errno); 742 assert(0, "perfstat_memory_total() failed"); 743 return false; 744 } 745 746 assert(rc == 1, "perfstat_memory_total() - weird return code"); 747 748 // excerpt from 749 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp 750 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm 751 // The fields of perfstat_memory_total_t: 752 // u_longlong_t virt_total Total virtual memory (in 4 KB pages). 753 // u_longlong_t real_total Total real memory (in 4 KB pages). 754 // u_longlong_t real_free Free real memory (in 4 KB pages). 755 // u_longlong_t pgsp_total Total paging space (in 4 KB pages). 756 // u_longlong_t pgsp_free Free paging space (in 4 KB pages). 757 758 pmi->virt_total = psmt.virt_total * 4096; 759 pmi->real_total = psmt.real_total * 4096; 760 pmi->real_free = psmt.real_free * 4096; 761 pmi->pgsp_total = psmt.pgsp_total * 4096; 762 pmi->pgsp_free = psmt.pgsp_free * 4096; 763 764 return true; 765 766 } 767 } // end os::Aix::get_meminfo 768 769 ////////////////////////////////////////////////////////////////////////////// 770 // create new thread 771 772 // Thread start routine for all newly created threads 773 static void *thread_native_entry(Thread *thread) { 774 775 // find out my own stack dimensions 776 { 777 // actually, this should do exactly the same as thread->record_stack_base_and_size... 778 address base = 0; 779 size_t size = 0; 780 query_stack_dimensions(&base, &size); 781 thread->set_stack_base(base); 782 thread->set_stack_size(size); 783 } 784 785 const pthread_t pthread_id = ::pthread_self(); 786 const tid_t kernel_thread_id = ::thread_self(); 787 788 log_info(os, thread)("Thread is alive (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").", 789 os::current_thread_id(), (uintx) kernel_thread_id); 790 791 // Normally, pthread stacks on AIX live in the data segment (are allocated with malloc() 792 // by the pthread library). In rare cases, this may not be the case, e.g. when third-party 793 // tools hook pthread_create(). In this case, we may run into problems establishing 794 // guard pages on those stacks, because the stacks may reside in memory which is not 795 // protectable (shmated). 796 if (thread->stack_base() > ::sbrk(0)) { 797 log_warning(os, thread)("Thread stack not in data segment."); 798 } 799 800 // Try to randomize the cache line index of hot stack frames. 801 // This helps when threads of the same stack traces evict each other's 802 // cache lines. The threads can be either from the same JVM instance, or 803 // from different JVM instances. The benefit is especially true for 804 // processors with hyperthreading technology. 805 806 static int counter = 0; 807 int pid = os::current_process_id(); 808 alloca(((pid ^ counter++) & 7) * 128); 809 810 thread->initialize_thread_current(); 811 812 OSThread* osthread = thread->osthread(); 813 814 // Thread_id is pthread id. 815 osthread->set_thread_id(pthread_id); 816 817 // .. but keep kernel thread id too for diagnostics 818 osthread->set_kernel_thread_id(kernel_thread_id); 819 820 // Initialize signal mask for this thread. 821 os::Aix::hotspot_sigmask(thread); 822 823 // Initialize floating point control register. 824 os::Aix::init_thread_fpu_state(); 825 826 assert(osthread->get_state() == RUNNABLE, "invalid os thread state"); 827 828 // Call one more level start routine. 829 thread->run(); 830 831 log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").", 832 os::current_thread_id(), (uintx) kernel_thread_id); 833 834 // If a thread has not deleted itself ("delete this") as part of its 835 // termination sequence, we have to ensure thread-local-storage is 836 // cleared before we actually terminate. No threads should ever be 837 // deleted asynchronously with respect to their termination. 838 if (Thread::current_or_null_safe() != NULL) { 839 assert(Thread::current_or_null_safe() == thread, "current thread is wrong"); 840 thread->clear_thread_current(); 841 } 842 843 return 0; 844 } 845 846 bool os::create_thread(Thread* thread, ThreadType thr_type, 847 size_t req_stack_size) { 848 849 assert(thread->osthread() == NULL, "caller responsible"); 850 851 // Allocate the OSThread object 852 OSThread* osthread = new OSThread(NULL, NULL); 853 if (osthread == NULL) { 854 return false; 855 } 856 857 // set the correct thread state 858 osthread->set_thread_type(thr_type); 859 860 // Initial state is ALLOCATED but not INITIALIZED 861 osthread->set_state(ALLOCATED); 862 863 thread->set_osthread(osthread); 864 865 // init thread attributes 866 pthread_attr_t attr; 867 pthread_attr_init(&attr); 868 guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???"); 869 870 // Make sure we run in 1:1 kernel-user-thread mode. 871 if (os::Aix::on_aix()) { 872 guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???"); 873 guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???"); 874 } // end: aix 875 876 // Start in suspended state, and in os::thread_start, wake the thread up. 877 guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???"); 878 879 // calculate stack size if it's not specified by caller 880 size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size); 881 pthread_attr_setstacksize(&attr, stack_size); 882 883 pthread_t tid; 884 int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread); 885 886 char buf[64]; 887 if (ret == 0) { 888 log_info(os, thread)("Thread started (pthread id: " UINTX_FORMAT ", attributes: %s). ", 889 (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); 890 } else { 891 log_warning(os, thread)("Failed to start thread - pthread_create failed (%d=%s) for attributes: %s.", 892 ret, os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); 893 } 894 895 pthread_attr_destroy(&attr); 896 897 if (ret != 0) { 898 // Need to clean up stuff we've allocated so far 899 thread->set_osthread(NULL); 900 delete osthread; 901 return false; 902 } 903 904 // OSThread::thread_id is the pthread id. 905 osthread->set_thread_id(tid); 906 907 return true; 908 } 909 910 ///////////////////////////////////////////////////////////////////////////// 911 // attach existing thread 912 913 // bootstrap the main thread 914 bool os::create_main_thread(JavaThread* thread) { 915 assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread"); 916 return create_attached_thread(thread); 917 } 918 919 bool os::create_attached_thread(JavaThread* thread) { 920 #ifdef ASSERT 921 thread->verify_not_published(); 922 #endif 923 924 // Allocate the OSThread object 925 OSThread* osthread = new OSThread(NULL, NULL); 926 927 if (osthread == NULL) { 928 return false; 929 } 930 931 const pthread_t pthread_id = ::pthread_self(); 932 const tid_t kernel_thread_id = ::thread_self(); 933 934 // OSThread::thread_id is the pthread id. 935 osthread->set_thread_id(pthread_id); 936 937 // .. but keep kernel thread id too for diagnostics 938 osthread->set_kernel_thread_id(kernel_thread_id); 939 940 // initialize floating point control register 941 os::Aix::init_thread_fpu_state(); 942 943 // Initial thread state is RUNNABLE 944 osthread->set_state(RUNNABLE); 945 946 thread->set_osthread(osthread); 947 948 if (UseNUMA) { 949 int lgrp_id = os::numa_get_group_id(); 950 if (lgrp_id != -1) { 951 thread->set_lgrp_id(lgrp_id); 952 } 953 } 954 955 // initialize signal mask for this thread 956 // and save the caller's signal mask 957 os::Aix::hotspot_sigmask(thread); 958 959 log_info(os, thread)("Thread attached (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").", 960 os::current_thread_id(), (uintx) kernel_thread_id); 961 962 return true; 963 } 964 965 void os::pd_start_thread(Thread* thread) { 966 int status = pthread_continue_np(thread->osthread()->pthread_id()); 967 assert(status == 0, "thr_continue failed"); 968 } 969 970 // Free OS resources related to the OSThread 971 void os::free_thread(OSThread* osthread) { 972 assert(osthread != NULL, "osthread not set"); 973 974 // We are told to free resources of the argument thread, 975 // but we can only really operate on the current thread. 976 assert(Thread::current()->osthread() == osthread, 977 "os::free_thread but not current thread"); 978 979 // Restore caller's signal mask 980 sigset_t sigmask = osthread->caller_sigmask(); 981 pthread_sigmask(SIG_SETMASK, &sigmask, NULL); 982 983 delete osthread; 984 } 985 986 //////////////////////////////////////////////////////////////////////////////// 987 // time support 988 989 // Time since start-up in seconds to a fine granularity. 990 // Used by VMSelfDestructTimer and the MemProfiler. 991 double os::elapsedTime() { 992 return (double)(os::elapsed_counter()) * 0.000001; 993 } 994 995 jlong os::elapsed_counter() { 996 timeval time; 997 int status = gettimeofday(&time, NULL); 998 return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count; 999 } 1000 1001 jlong os::elapsed_frequency() { 1002 return (1000 * 1000); 1003 } 1004 1005 bool os::supports_vtime() { return true; } 1006 bool os::enable_vtime() { return false; } 1007 bool os::vtime_enabled() { return false; } 1008 1009 double os::elapsedVTime() { 1010 struct rusage usage; 1011 int retval = getrusage(RUSAGE_THREAD, &usage); 1012 if (retval == 0) { 1013 return usage.ru_utime.tv_sec + usage.ru_stime.tv_sec + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / (1000.0 * 1000); 1014 } else { 1015 // better than nothing, but not much 1016 return elapsedTime(); 1017 } 1018 } 1019 1020 jlong os::javaTimeMillis() { 1021 timeval time; 1022 int status = gettimeofday(&time, NULL); 1023 assert(status != -1, "aix error at gettimeofday()"); 1024 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000); 1025 } 1026 1027 void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) { 1028 timeval time; 1029 int status = gettimeofday(&time, NULL); 1030 assert(status != -1, "aix error at gettimeofday()"); 1031 seconds = jlong(time.tv_sec); 1032 nanos = jlong(time.tv_usec) * 1000; 1033 } 1034 1035 jlong os::javaTimeNanos() { 1036 if (os::Aix::on_pase()) { 1037 1038 timeval time; 1039 int status = gettimeofday(&time, NULL); 1040 assert(status != -1, "PASE error at gettimeofday()"); 1041 jlong usecs = jlong((unsigned long long) time.tv_sec * (1000 * 1000) + time.tv_usec); 1042 return 1000 * usecs; 1043 1044 } else { 1045 // On AIX use the precision of processors real time clock 1046 // or time base registers. 1047 timebasestruct_t time; 1048 int rc; 1049 1050 // If the CPU has a time register, it will be used and 1051 // we have to convert to real time first. After convertion we have following data: 1052 // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970] 1053 // time.tb_low [nanoseconds after the last full second above] 1054 // We better use mread_real_time here instead of read_real_time 1055 // to ensure that we will get a monotonic increasing time. 1056 if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) { 1057 rc = time_base_to_time(&time, TIMEBASE_SZ); 1058 assert(rc != -1, "aix error at time_base_to_time()"); 1059 } 1060 return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low); 1061 } 1062 } 1063 1064 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 1065 info_ptr->max_value = ALL_64_BITS; 1066 // mread_real_time() is monotonic (see 'os::javaTimeNanos()') 1067 info_ptr->may_skip_backward = false; 1068 info_ptr->may_skip_forward = false; 1069 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 1070 } 1071 1072 // Return the real, user, and system times in seconds from an 1073 // arbitrary fixed point in the past. 1074 bool os::getTimesSecs(double* process_real_time, 1075 double* process_user_time, 1076 double* process_system_time) { 1077 struct tms ticks; 1078 clock_t real_ticks = times(&ticks); 1079 1080 if (real_ticks == (clock_t) (-1)) { 1081 return false; 1082 } else { 1083 double ticks_per_second = (double) clock_tics_per_sec; 1084 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second; 1085 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second; 1086 *process_real_time = ((double) real_ticks) / ticks_per_second; 1087 1088 return true; 1089 } 1090 } 1091 1092 char * os::local_time_string(char *buf, size_t buflen) { 1093 struct tm t; 1094 time_t long_time; 1095 time(&long_time); 1096 localtime_r(&long_time, &t); 1097 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 1098 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, 1099 t.tm_hour, t.tm_min, t.tm_sec); 1100 return buf; 1101 } 1102 1103 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 1104 return localtime_r(clock, res); 1105 } 1106 1107 //////////////////////////////////////////////////////////////////////////////// 1108 // runtime exit support 1109 1110 // Note: os::shutdown() might be called very early during initialization, or 1111 // called from signal handler. Before adding something to os::shutdown(), make 1112 // sure it is async-safe and can handle partially initialized VM. 1113 void os::shutdown() { 1114 1115 // allow PerfMemory to attempt cleanup of any persistent resources 1116 perfMemory_exit(); 1117 1118 // needs to remove object in file system 1119 AttachListener::abort(); 1120 1121 // flush buffered output, finish log files 1122 ostream_abort(); 1123 1124 // Check for abort hook 1125 abort_hook_t abort_hook = Arguments::abort_hook(); 1126 if (abort_hook != NULL) { 1127 abort_hook(); 1128 } 1129 } 1130 1131 // Note: os::abort() might be called very early during initialization, or 1132 // called from signal handler. Before adding something to os::abort(), make 1133 // sure it is async-safe and can handle partially initialized VM. 1134 void os::abort(bool dump_core, void* siginfo, const void* context) { 1135 os::shutdown(); 1136 if (dump_core) { 1137 #ifndef PRODUCT 1138 fdStream out(defaultStream::output_fd()); 1139 out.print_raw("Current thread is "); 1140 char buf[16]; 1141 jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id()); 1142 out.print_raw_cr(buf); 1143 out.print_raw_cr("Dumping core ..."); 1144 #endif 1145 ::abort(); // dump core 1146 } 1147 1148 ::exit(1); 1149 } 1150 1151 // Die immediately, no exit hook, no abort hook, no cleanup. 1152 void os::die() { 1153 ::abort(); 1154 } 1155 1156 // This method is a copy of JDK's sysGetLastErrorString 1157 // from src/solaris/hpi/src/system_md.c 1158 1159 size_t os::lasterror(char *buf, size_t len) { 1160 if (errno == 0) return 0; 1161 1162 const char *s = os::strerror(errno); 1163 size_t n = ::strlen(s); 1164 if (n >= len) { 1165 n = len - 1; 1166 } 1167 ::strncpy(buf, s, n); 1168 buf[n] = '\0'; 1169 return n; 1170 } 1171 1172 intx os::current_thread_id() { 1173 return (intx)pthread_self(); 1174 } 1175 1176 int os::current_process_id() { 1177 return getpid(); 1178 } 1179 1180 // DLL functions 1181 1182 const char* os::dll_file_extension() { return ".so"; } 1183 1184 // This must be hard coded because it's the system's temporary 1185 // directory not the java application's temp directory, ala java.io.tmpdir. 1186 const char* os::get_temp_directory() { return "/tmp"; } 1187 1188 static bool file_exists(const char* filename) { 1189 struct stat statbuf; 1190 if (filename == NULL || strlen(filename) == 0) { 1191 return false; 1192 } 1193 return os::stat(filename, &statbuf) == 0; 1194 } 1195 1196 bool os::dll_build_name(char* buffer, size_t buflen, 1197 const char* pname, const char* fname) { 1198 bool retval = false; 1199 // Copied from libhpi 1200 const size_t pnamelen = pname ? strlen(pname) : 0; 1201 1202 // Return error on buffer overflow. 1203 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1204 *buffer = '\0'; 1205 return retval; 1206 } 1207 1208 if (pnamelen == 0) { 1209 snprintf(buffer, buflen, "lib%s.so", fname); 1210 retval = true; 1211 } else if (strchr(pname, *os::path_separator()) != NULL) { 1212 int n; 1213 char** pelements = split_path(pname, &n); 1214 if (pelements == NULL) { 1215 return false; 1216 } 1217 for (int i = 0; i < n; i++) { 1218 // Really shouldn't be NULL, but check can't hurt 1219 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { 1220 continue; // skip the empty path values 1221 } 1222 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); 1223 if (file_exists(buffer)) { 1224 retval = true; 1225 break; 1226 } 1227 } 1228 // release the storage 1229 for (int i = 0; i < n; i++) { 1230 if (pelements[i] != NULL) { 1231 FREE_C_HEAP_ARRAY(char, pelements[i]); 1232 } 1233 } 1234 if (pelements != NULL) { 1235 FREE_C_HEAP_ARRAY(char*, pelements); 1236 } 1237 } else { 1238 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); 1239 retval = true; 1240 } 1241 return retval; 1242 } 1243 1244 // Check if addr is inside libjvm.so. 1245 bool os::address_is_in_vm(address addr) { 1246 1247 // Input could be a real pc or a function pointer literal. The latter 1248 // would be a function descriptor residing in the data segment of a module. 1249 loaded_module_t lm; 1250 if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL) { 1251 return lm.is_in_vm; 1252 } else if (LoadedLibraries::find_for_data_address(addr, &lm) != NULL) { 1253 return lm.is_in_vm; 1254 } else { 1255 return false; 1256 } 1257 1258 } 1259 1260 // Resolve an AIX function descriptor literal to a code pointer. 1261 // If the input is a valid code pointer to a text segment of a loaded module, 1262 // it is returned unchanged. 1263 // If the input is a valid AIX function descriptor, it is resolved to the 1264 // code entry point. 1265 // If the input is neither a valid function descriptor nor a valid code pointer, 1266 // NULL is returned. 1267 static address resolve_function_descriptor_to_code_pointer(address p) { 1268 1269 if (LoadedLibraries::find_for_text_address(p, NULL) != NULL) { 1270 // It is a real code pointer. 1271 return p; 1272 } else if (LoadedLibraries::find_for_data_address(p, NULL) != NULL) { 1273 // Pointer to data segment, potential function descriptor. 1274 address code_entry = (address)(((FunctionDescriptor*)p)->entry()); 1275 if (LoadedLibraries::find_for_text_address(code_entry, NULL) != NULL) { 1276 // It is a function descriptor. 1277 return code_entry; 1278 } 1279 } 1280 1281 return NULL; 1282 } 1283 1284 bool os::dll_address_to_function_name(address addr, char *buf, 1285 int buflen, int *offset, 1286 bool demangle) { 1287 if (offset) { 1288 *offset = -1; 1289 } 1290 // Buf is not optional, but offset is optional. 1291 assert(buf != NULL, "sanity check"); 1292 buf[0] = '\0'; 1293 1294 // Resolve function ptr literals first. 1295 addr = resolve_function_descriptor_to_code_pointer(addr); 1296 if (!addr) { 1297 return false; 1298 } 1299 1300 return AixSymbols::get_function_name(addr, buf, buflen, offset, NULL, demangle); 1301 } 1302 1303 bool os::dll_address_to_library_name(address addr, char* buf, 1304 int buflen, int* offset) { 1305 if (offset) { 1306 *offset = -1; 1307 } 1308 // Buf is not optional, but offset is optional. 1309 assert(buf != NULL, "sanity check"); 1310 buf[0] = '\0'; 1311 1312 // Resolve function ptr literals first. 1313 addr = resolve_function_descriptor_to_code_pointer(addr); 1314 if (!addr) { 1315 return false; 1316 } 1317 1318 return AixSymbols::get_module_name(addr, buf, buflen); 1319 } 1320 1321 // Loads .dll/.so and in case of error it checks if .dll/.so was built 1322 // for the same architecture as Hotspot is running on. 1323 void *os::dll_load(const char *filename, char *ebuf, int ebuflen) { 1324 1325 if (ebuf && ebuflen > 0) { 1326 ebuf[0] = '\0'; 1327 ebuf[ebuflen - 1] = '\0'; 1328 } 1329 1330 if (!filename || strlen(filename) == 0) { 1331 ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1); 1332 return NULL; 1333 } 1334 1335 // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants. 1336 void * result= ::dlopen(filename, RTLD_LAZY); 1337 if (result != NULL) { 1338 // Reload dll cache. Don't do this in signal handling. 1339 LoadedLibraries::reload(); 1340 return result; 1341 } else { 1342 // error analysis when dlopen fails 1343 const char* const error_report = ::dlerror(); 1344 if (error_report && ebuf && ebuflen > 0) { 1345 snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s", 1346 filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report); 1347 } 1348 } 1349 return NULL; 1350 } 1351 1352 void* os::dll_lookup(void* handle, const char* name) { 1353 void* res = dlsym(handle, name); 1354 return res; 1355 } 1356 1357 void* os::get_default_process_handle() { 1358 return (void*)::dlopen(NULL, RTLD_LAZY); 1359 } 1360 1361 void os::print_dll_info(outputStream *st) { 1362 st->print_cr("Dynamic libraries:"); 1363 LoadedLibraries::print(st); 1364 } 1365 1366 void os::get_summary_os_info(char* buf, size_t buflen) { 1367 // There might be something more readable than uname results for AIX. 1368 struct utsname name; 1369 uname(&name); 1370 snprintf(buf, buflen, "%s %s", name.release, name.version); 1371 } 1372 1373 void os::print_os_info(outputStream* st) { 1374 st->print("OS:"); 1375 1376 st->print("uname:"); 1377 struct utsname name; 1378 uname(&name); 1379 st->print(name.sysname); st->print(" "); 1380 st->print(name.nodename); st->print(" "); 1381 st->print(name.release); st->print(" "); 1382 st->print(name.version); st->print(" "); 1383 st->print(name.machine); 1384 st->cr(); 1385 1386 uint32_t ver = os::Aix::os_version(); 1387 st->print_cr("AIX kernel version %u.%u.%u.%u", 1388 (ver >> 24) & 0xFF, (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF); 1389 1390 // rlimit 1391 st->print("rlimit:"); 1392 struct rlimit rlim; 1393 1394 st->print(" STACK "); 1395 getrlimit(RLIMIT_STACK, &rlim); 1396 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1397 else st->print("%uk", rlim.rlim_cur >> 10); 1398 1399 st->print(", CORE "); 1400 getrlimit(RLIMIT_CORE, &rlim); 1401 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1402 else st->print("%uk", rlim.rlim_cur >> 10); 1403 1404 st->print(", NPROC "); 1405 st->print("%d", sysconf(_SC_CHILD_MAX)); 1406 1407 st->print(", NOFILE "); 1408 getrlimit(RLIMIT_NOFILE, &rlim); 1409 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1410 else st->print("%d", rlim.rlim_cur); 1411 1412 st->print(", AS "); 1413 getrlimit(RLIMIT_AS, &rlim); 1414 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1415 else st->print("%uk", rlim.rlim_cur >> 10); 1416 1417 // Print limits on DATA, because it limits the C-heap. 1418 st->print(", DATA "); 1419 getrlimit(RLIMIT_DATA, &rlim); 1420 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 1421 else st->print("%uk", rlim.rlim_cur >> 10); 1422 st->cr(); 1423 1424 // load average 1425 st->print("load average:"); 1426 double loadavg[3] = {-1.L, -1.L, -1.L}; 1427 os::loadavg(loadavg, 3); 1428 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); 1429 st->cr(); 1430 1431 // print wpar info 1432 libperfstat::wparinfo_t wi; 1433 if (libperfstat::get_wparinfo(&wi)) { 1434 st->print_cr("wpar info"); 1435 st->print_cr("name: %s", wi.name); 1436 st->print_cr("id: %d", wi.wpar_id); 1437 st->print_cr("type: %s", (wi.app_wpar ? "application" : "system")); 1438 } 1439 1440 // print partition info 1441 libperfstat::partitioninfo_t pi; 1442 if (libperfstat::get_partitioninfo(&pi)) { 1443 st->print_cr("partition info"); 1444 st->print_cr(" name: %s", pi.name); 1445 } 1446 1447 } 1448 1449 void os::print_memory_info(outputStream* st) { 1450 1451 st->print_cr("Memory:"); 1452 1453 st->print_cr(" Base page size (sysconf _SC_PAGESIZE): %s", 1454 describe_pagesize(g_multipage_support.pagesize)); 1455 st->print_cr(" Data page size (C-Heap, bss, etc): %s", 1456 describe_pagesize(g_multipage_support.datapsize)); 1457 st->print_cr(" Text page size: %s", 1458 describe_pagesize(g_multipage_support.textpsize)); 1459 st->print_cr(" Thread stack page size (pthread): %s", 1460 describe_pagesize(g_multipage_support.pthr_stack_pagesize)); 1461 st->print_cr(" Default shared memory page size: %s", 1462 describe_pagesize(g_multipage_support.shmpsize)); 1463 st->print_cr(" Can use 64K pages dynamically with shared meory: %s", 1464 (g_multipage_support.can_use_64K_pages ? "yes" :"no")); 1465 st->print_cr(" Can use 16M pages dynamically with shared memory: %s", 1466 (g_multipage_support.can_use_16M_pages ? "yes" :"no")); 1467 st->print_cr(" Multipage error: %d", 1468 g_multipage_support.error); 1469 st->cr(); 1470 st->print_cr(" os::vm_page_size: %s", describe_pagesize(os::vm_page_size())); 1471 1472 // print out LDR_CNTRL because it affects the default page sizes 1473 const char* const ldr_cntrl = ::getenv("LDR_CNTRL"); 1474 st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>"); 1475 1476 // Print out EXTSHM because it is an unsupported setting. 1477 const char* const extshm = ::getenv("EXTSHM"); 1478 st->print_cr(" EXTSHM=%s.", extshm ? extshm : "<unset>"); 1479 if ( (strcmp(extshm, "on") == 0) || (strcmp(extshm, "ON") == 0) ) { 1480 st->print_cr(" *** Unsupported! Please remove EXTSHM from your environment! ***"); 1481 } 1482 1483 // Print out AIXTHREAD_GUARDPAGES because it affects the size of pthread stacks. 1484 const char* const aixthread_guardpages = ::getenv("AIXTHREAD_GUARDPAGES"); 1485 st->print_cr(" AIXTHREAD_GUARDPAGES=%s.", 1486 aixthread_guardpages ? aixthread_guardpages : "<unset>"); 1487 1488 os::Aix::meminfo_t mi; 1489 if (os::Aix::get_meminfo(&mi)) { 1490 char buffer[256]; 1491 if (os::Aix::on_aix()) { 1492 st->print_cr("physical total : " SIZE_FORMAT, mi.real_total); 1493 st->print_cr("physical free : " SIZE_FORMAT, mi.real_free); 1494 st->print_cr("swap total : " SIZE_FORMAT, mi.pgsp_total); 1495 st->print_cr("swap free : " SIZE_FORMAT, mi.pgsp_free); 1496 } else { 1497 // PASE - Numbers are result of QWCRSSTS; they mean: 1498 // real_total: Sum of all system pools 1499 // real_free: always 0 1500 // pgsp_total: we take the size of the system ASP 1501 // pgsp_free: size of system ASP times percentage of system ASP unused 1502 st->print_cr("physical total : " SIZE_FORMAT, mi.real_total); 1503 st->print_cr("system asp total : " SIZE_FORMAT, mi.pgsp_total); 1504 st->print_cr("%% system asp used : " SIZE_FORMAT, 1505 mi.pgsp_total ? (100.0f * (mi.pgsp_total - mi.pgsp_free) / mi.pgsp_total) : -1.0f); 1506 } 1507 st->print_raw(buffer); 1508 } 1509 st->cr(); 1510 1511 // Print segments allocated with os::reserve_memory. 1512 st->print_cr("internal virtual memory regions used by vm:"); 1513 vmembk_print_on(st); 1514 } 1515 1516 // Get a string for the cpuinfo that is a summary of the cpu type 1517 void os::get_summary_cpu_info(char* buf, size_t buflen) { 1518 // This looks good 1519 libperfstat::cpuinfo_t ci; 1520 if (libperfstat::get_cpuinfo(&ci)) { 1521 strncpy(buf, ci.version, buflen); 1522 } else { 1523 strncpy(buf, "AIX", buflen); 1524 } 1525 } 1526 1527 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) { 1528 st->print("CPU:"); 1529 st->print("total %d", os::processor_count()); 1530 // It's not safe to query number of active processors after crash. 1531 // st->print("(active %d)", os::active_processor_count()); 1532 st->print(" %s", VM_Version::features()); 1533 st->cr(); 1534 } 1535 1536 static void print_signal_handler(outputStream* st, int sig, 1537 char* buf, size_t buflen); 1538 1539 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1540 st->print_cr("Signal Handlers:"); 1541 print_signal_handler(st, SIGSEGV, buf, buflen); 1542 print_signal_handler(st, SIGBUS , buf, buflen); 1543 print_signal_handler(st, SIGFPE , buf, buflen); 1544 print_signal_handler(st, SIGPIPE, buf, buflen); 1545 print_signal_handler(st, SIGXFSZ, buf, buflen); 1546 print_signal_handler(st, SIGILL , buf, buflen); 1547 print_signal_handler(st, SR_signum, buf, buflen); 1548 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen); 1549 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); 1550 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen); 1551 print_signal_handler(st, BREAK_SIGNAL, buf, buflen); 1552 print_signal_handler(st, SIGTRAP, buf, buflen); 1553 print_signal_handler(st, SIGDANGER, buf, buflen); 1554 } 1555 1556 static char saved_jvm_path[MAXPATHLEN] = {0}; 1557 1558 // Find the full path to the current module, libjvm.so. 1559 void os::jvm_path(char *buf, jint buflen) { 1560 // Error checking. 1561 if (buflen < MAXPATHLEN) { 1562 assert(false, "must use a large-enough buffer"); 1563 buf[0] = '\0'; 1564 return; 1565 } 1566 // Lazy resolve the path to current module. 1567 if (saved_jvm_path[0] != 0) { 1568 strcpy(buf, saved_jvm_path); 1569 return; 1570 } 1571 1572 Dl_info dlinfo; 1573 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo); 1574 assert(ret != 0, "cannot locate libjvm"); 1575 char* rp = realpath((char *)dlinfo.dli_fname, buf); 1576 assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?"); 1577 1578 strncpy(saved_jvm_path, buf, sizeof(saved_jvm_path)); 1579 saved_jvm_path[sizeof(saved_jvm_path) - 1] = '\0'; 1580 } 1581 1582 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1583 // no prefix required, not even "_" 1584 } 1585 1586 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 1587 // no suffix required 1588 } 1589 1590 //////////////////////////////////////////////////////////////////////////////// 1591 // sun.misc.Signal support 1592 1593 static volatile jint sigint_count = 0; 1594 1595 static void 1596 UserHandler(int sig, void *siginfo, void *context) { 1597 // 4511530 - sem_post is serialized and handled by the manager thread. When 1598 // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We 1599 // don't want to flood the manager thread with sem_post requests. 1600 if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1) 1601 return; 1602 1603 // Ctrl-C is pressed during error reporting, likely because the error 1604 // handler fails to abort. Let VM die immediately. 1605 if (sig == SIGINT && is_error_reported()) { 1606 os::die(); 1607 } 1608 1609 os::signal_notify(sig); 1610 } 1611 1612 void* os::user_handler() { 1613 return CAST_FROM_FN_PTR(void*, UserHandler); 1614 } 1615 1616 extern "C" { 1617 typedef void (*sa_handler_t)(int); 1618 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); 1619 } 1620 1621 void* os::signal(int signal_number, void* handler) { 1622 struct sigaction sigAct, oldSigAct; 1623 1624 sigfillset(&(sigAct.sa_mask)); 1625 1626 // Do not block out synchronous signals in the signal handler. 1627 // Blocking synchronous signals only makes sense if you can really 1628 // be sure that those signals won't happen during signal handling, 1629 // when the blocking applies. Normal signal handlers are lean and 1630 // do not cause signals. But our signal handlers tend to be "risky" 1631 // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen. 1632 // On AIX, PASE there was a case where a SIGSEGV happened, followed 1633 // by a SIGILL, which was blocked due to the signal mask. The process 1634 // just hung forever. Better to crash from a secondary signal than to hang. 1635 sigdelset(&(sigAct.sa_mask), SIGSEGV); 1636 sigdelset(&(sigAct.sa_mask), SIGBUS); 1637 sigdelset(&(sigAct.sa_mask), SIGILL); 1638 sigdelset(&(sigAct.sa_mask), SIGFPE); 1639 sigdelset(&(sigAct.sa_mask), SIGTRAP); 1640 1641 sigAct.sa_flags = SA_RESTART|SA_SIGINFO; 1642 1643 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler); 1644 1645 if (sigaction(signal_number, &sigAct, &oldSigAct)) { 1646 // -1 means registration failed 1647 return (void *)-1; 1648 } 1649 1650 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); 1651 } 1652 1653 void os::signal_raise(int signal_number) { 1654 ::raise(signal_number); 1655 } 1656 1657 // 1658 // The following code is moved from os.cpp for making this 1659 // code platform specific, which it is by its very nature. 1660 // 1661 1662 // Will be modified when max signal is changed to be dynamic 1663 int os::sigexitnum_pd() { 1664 return NSIG; 1665 } 1666 1667 // a counter for each possible signal value 1668 static volatile jint pending_signals[NSIG+1] = { 0 }; 1669 1670 // Wrapper functions for: sem_init(), sem_post(), sem_wait() 1671 // On AIX, we use sem_init(), sem_post(), sem_wait() 1672 // On Pase, we need to use msem_lock() and msem_unlock(), because Posix Semaphores 1673 // do not seem to work at all on PASE (unimplemented, will cause SIGILL). 1674 // Note that just using msem_.. APIs for both PASE and AIX is not an option either, as 1675 // on AIX, msem_..() calls are suspected of causing problems. 1676 static sem_t sig_sem; 1677 static msemaphore* p_sig_msem = 0; 1678 1679 static void local_sem_init() { 1680 if (os::Aix::on_aix()) { 1681 int rc = ::sem_init(&sig_sem, 0, 0); 1682 guarantee(rc != -1, "sem_init failed"); 1683 } else { 1684 // Memory semaphores must live in shared mem. 1685 guarantee0(p_sig_msem == NULL); 1686 p_sig_msem = (msemaphore*)os::reserve_memory(sizeof(msemaphore), NULL); 1687 guarantee(p_sig_msem, "Cannot allocate memory for memory semaphore"); 1688 guarantee(::msem_init(p_sig_msem, 0) == p_sig_msem, "msem_init failed"); 1689 } 1690 } 1691 1692 static void local_sem_post() { 1693 static bool warn_only_once = false; 1694 if (os::Aix::on_aix()) { 1695 int rc = ::sem_post(&sig_sem); 1696 if (rc == -1 && !warn_only_once) { 1697 trcVerbose("sem_post failed (errno = %d, %s)", errno, os::errno_name(errno)); 1698 warn_only_once = true; 1699 } 1700 } else { 1701 guarantee0(p_sig_msem != NULL); 1702 int rc = ::msem_unlock(p_sig_msem, 0); 1703 if (rc == -1 && !warn_only_once) { 1704 trcVerbose("msem_unlock failed (errno = %d, %s)", errno, os::errno_name(errno)); 1705 warn_only_once = true; 1706 } 1707 } 1708 } 1709 1710 static void local_sem_wait() { 1711 static bool warn_only_once = false; 1712 if (os::Aix::on_aix()) { 1713 int rc = ::sem_wait(&sig_sem); 1714 if (rc == -1 && !warn_only_once) { 1715 trcVerbose("sem_wait failed (errno = %d, %s)", errno, os::errno_name(errno)); 1716 warn_only_once = true; 1717 } 1718 } else { 1719 guarantee0(p_sig_msem != NULL); // must init before use 1720 int rc = ::msem_lock(p_sig_msem, 0); 1721 if (rc == -1 && !warn_only_once) { 1722 trcVerbose("msem_lock failed (errno = %d, %s)", errno, os::errno_name(errno)); 1723 warn_only_once = true; 1724 } 1725 } 1726 } 1727 1728 void os::signal_init_pd() { 1729 // Initialize signal structures 1730 ::memset((void*)pending_signals, 0, sizeof(pending_signals)); 1731 1732 // Initialize signal semaphore 1733 local_sem_init(); 1734 } 1735 1736 void os::signal_notify(int sig) { 1737 Atomic::inc(&pending_signals[sig]); 1738 local_sem_post(); 1739 } 1740 1741 static int check_pending_signals(bool wait) { 1742 Atomic::store(0, &sigint_count); 1743 for (;;) { 1744 for (int i = 0; i < NSIG + 1; i++) { 1745 jint n = pending_signals[i]; 1746 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 1747 return i; 1748 } 1749 } 1750 if (!wait) { 1751 return -1; 1752 } 1753 JavaThread *thread = JavaThread::current(); 1754 ThreadBlockInVM tbivm(thread); 1755 1756 bool threadIsSuspended; 1757 do { 1758 thread->set_suspend_equivalent(); 1759 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 1760 1761 local_sem_wait(); 1762 1763 // were we externally suspended while we were waiting? 1764 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 1765 if (threadIsSuspended) { 1766 // 1767 // The semaphore has been incremented, but while we were waiting 1768 // another thread suspended us. We don't want to continue running 1769 // while suspended because that would surprise the thread that 1770 // suspended us. 1771 // 1772 1773 local_sem_post(); 1774 1775 thread->java_suspend_self(); 1776 } 1777 } while (threadIsSuspended); 1778 } 1779 } 1780 1781 int os::signal_lookup() { 1782 return check_pending_signals(false); 1783 } 1784 1785 int os::signal_wait() { 1786 return check_pending_signals(true); 1787 } 1788 1789 //////////////////////////////////////////////////////////////////////////////// 1790 // Virtual Memory 1791 1792 // We need to keep small simple bookkeeping for os::reserve_memory and friends. 1793 1794 #define VMEM_MAPPED 1 1795 #define VMEM_SHMATED 2 1796 1797 struct vmembk_t { 1798 int type; // 1 - mmap, 2 - shmat 1799 char* addr; 1800 size_t size; // Real size, may be larger than usersize. 1801 size_t pagesize; // page size of area 1802 vmembk_t* next; 1803 1804 bool contains_addr(char* p) const { 1805 return p >= addr && p < (addr + size); 1806 } 1807 1808 bool contains_range(char* p, size_t s) const { 1809 return contains_addr(p) && contains_addr(p + s - 1); 1810 } 1811 1812 void print_on(outputStream* os) const { 1813 os->print("[" PTR_FORMAT " - " PTR_FORMAT "] (" UINTX_FORMAT 1814 " bytes, %d %s pages), %s", 1815 addr, addr + size - 1, size, size / pagesize, describe_pagesize(pagesize), 1816 (type == VMEM_SHMATED ? "shmat" : "mmap") 1817 ); 1818 } 1819 1820 // Check that range is a sub range of memory block (or equal to memory block); 1821 // also check that range is fully page aligned to the page size if the block. 1822 void assert_is_valid_subrange(char* p, size_t s) const { 1823 if (!contains_range(p, s)) { 1824 trcVerbose("[" PTR_FORMAT " - " PTR_FORMAT "] is not a sub " 1825 "range of [" PTR_FORMAT " - " PTR_FORMAT "].", 1826 p, p + s, addr, addr + size); 1827 guarantee0(false); 1828 } 1829 if (!is_aligned_to(p, pagesize) || !is_aligned_to(p + s, pagesize)) { 1830 trcVerbose("range [" PTR_FORMAT " - " PTR_FORMAT "] is not" 1831 " aligned to pagesize (%lu)", p, p + s, (unsigned long) pagesize); 1832 guarantee0(false); 1833 } 1834 } 1835 }; 1836 1837 static struct { 1838 vmembk_t* first; 1839 MiscUtils::CritSect cs; 1840 } vmem; 1841 1842 static void vmembk_add(char* addr, size_t size, size_t pagesize, int type) { 1843 vmembk_t* p = (vmembk_t*) ::malloc(sizeof(vmembk_t)); 1844 assert0(p); 1845 if (p) { 1846 MiscUtils::AutoCritSect lck(&vmem.cs); 1847 p->addr = addr; p->size = size; 1848 p->pagesize = pagesize; 1849 p->type = type; 1850 p->next = vmem.first; 1851 vmem.first = p; 1852 } 1853 } 1854 1855 static vmembk_t* vmembk_find(char* addr) { 1856 MiscUtils::AutoCritSect lck(&vmem.cs); 1857 for (vmembk_t* p = vmem.first; p; p = p->next) { 1858 if (p->addr <= addr && (p->addr + p->size) > addr) { 1859 return p; 1860 } 1861 } 1862 return NULL; 1863 } 1864 1865 static void vmembk_remove(vmembk_t* p0) { 1866 MiscUtils::AutoCritSect lck(&vmem.cs); 1867 assert0(p0); 1868 assert0(vmem.first); // List should not be empty. 1869 for (vmembk_t** pp = &(vmem.first); *pp; pp = &((*pp)->next)) { 1870 if (*pp == p0) { 1871 *pp = p0->next; 1872 ::free(p0); 1873 return; 1874 } 1875 } 1876 assert0(false); // Not found? 1877 } 1878 1879 static void vmembk_print_on(outputStream* os) { 1880 MiscUtils::AutoCritSect lck(&vmem.cs); 1881 for (vmembk_t* vmi = vmem.first; vmi; vmi = vmi->next) { 1882 vmi->print_on(os); 1883 os->cr(); 1884 } 1885 } 1886 1887 // Reserve and attach a section of System V memory. 1888 // If <requested_addr> is not NULL, function will attempt to attach the memory at the given 1889 // address. Failing that, it will attach the memory anywhere. 1890 // If <requested_addr> is NULL, function will attach the memory anywhere. 1891 // 1892 // <alignment_hint> is being ignored by this function. It is very probable however that the 1893 // alignment requirements are met anyway, because shmat() attaches at 256M boundaries. 1894 // Should this be not enogh, we can put more work into it. 1895 static char* reserve_shmated_memory ( 1896 size_t bytes, 1897 char* requested_addr, 1898 size_t alignment_hint) { 1899 1900 trcVerbose("reserve_shmated_memory " UINTX_FORMAT " bytes, wishaddress " 1901 PTR_FORMAT ", alignment_hint " UINTX_FORMAT "...", 1902 bytes, requested_addr, alignment_hint); 1903 1904 // Either give me wish address or wish alignment but not both. 1905 assert0(!(requested_addr != NULL && alignment_hint != 0)); 1906 1907 // We must prevent anyone from attaching too close to the 1908 // BRK because that may cause malloc OOM. 1909 if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) { 1910 trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. " 1911 "Will attach anywhere.", requested_addr); 1912 // Act like the OS refused to attach there. 1913 requested_addr = NULL; 1914 } 1915 1916 // For old AS/400's (V5R4 and older) we should not even be here - System V shared memory is not 1917 // really supported (max size 4GB), so reserve_mmapped_memory should have been used instead. 1918 if (os::Aix::on_pase_V5R4_or_older()) { 1919 ShouldNotReachHere(); 1920 } 1921 1922 // Align size of shm up to 64K to avoid errors if we later try to change the page size. 1923 const size_t size = align_size_up(bytes, 64*K); 1924 1925 // Reserve the shared segment. 1926 int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR); 1927 if (shmid == -1) { 1928 trcVerbose("shmget(.., " UINTX_FORMAT ", ..) failed (errno: %d).", size, errno); 1929 return NULL; 1930 } 1931 1932 // Important note: 1933 // It is very important that we, upon leaving this function, do not leave a shm segment alive. 1934 // We must right after attaching it remove it from the system. System V shm segments are global and 1935 // survive the process. 1936 // So, from here on: Do not assert, do not return, until we have called shmctl(IPC_RMID) (A). 1937 1938 struct shmid_ds shmbuf; 1939 memset(&shmbuf, 0, sizeof(shmbuf)); 1940 shmbuf.shm_pagesize = 64*K; 1941 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) != 0) { 1942 trcVerbose("Failed to set page size (need " UINTX_FORMAT " 64K pages) - shmctl failed with %d.", 1943 size / (64*K), errno); 1944 // I want to know if this ever happens. 1945 assert(false, "failed to set page size for shmat"); 1946 } 1947 1948 // Now attach the shared segment. 1949 // Note that I attach with SHM_RND - which means that the requested address is rounded down, if 1950 // needed, to the next lowest segment boundary. Otherwise the attach would fail if the address 1951 // were not a segment boundary. 1952 char* const addr = (char*) shmat(shmid, requested_addr, SHM_RND); 1953 const int errno_shmat = errno; 1954 1955 // (A) Right after shmat and before handing shmat errors delete the shm segment. 1956 if (::shmctl(shmid, IPC_RMID, NULL) == -1) { 1957 trcVerbose("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno); 1958 assert(false, "failed to remove shared memory segment!"); 1959 } 1960 1961 // Handle shmat error. If we failed to attach, just return. 1962 if (addr == (char*)-1) { 1963 trcVerbose("Failed to attach segment at " PTR_FORMAT " (%d).", requested_addr, errno_shmat); 1964 return NULL; 1965 } 1966 1967 // Just for info: query the real page size. In case setting the page size did not 1968 // work (see above), the system may have given us something other then 4K (LDR_CNTRL). 1969 const size_t real_pagesize = os::Aix::query_pagesize(addr); 1970 if (real_pagesize != shmbuf.shm_pagesize) { 1971 trcVerbose("pagesize is, surprisingly, %h.", real_pagesize); 1972 } 1973 1974 if (addr) { 1975 trcVerbose("shm-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes, " UINTX_FORMAT " %s pages)", 1976 addr, addr + size - 1, size, size/real_pagesize, describe_pagesize(real_pagesize)); 1977 } else { 1978 if (requested_addr != NULL) { 1979 trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at with address " PTR_FORMAT ".", size, requested_addr); 1980 } else { 1981 trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at any address.", size); 1982 } 1983 } 1984 1985 // book-keeping 1986 vmembk_add(addr, size, real_pagesize, VMEM_SHMATED); 1987 assert0(is_aligned_to(addr, os::vm_page_size())); 1988 1989 return addr; 1990 } 1991 1992 static bool release_shmated_memory(char* addr, size_t size) { 1993 1994 trcVerbose("release_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].", 1995 addr, addr + size - 1); 1996 1997 bool rc = false; 1998 1999 // TODO: is there a way to verify shm size without doing bookkeeping? 2000 if (::shmdt(addr) != 0) { 2001 trcVerbose("error (%d).", errno); 2002 } else { 2003 trcVerbose("ok."); 2004 rc = true; 2005 } 2006 return rc; 2007 } 2008 2009 static bool uncommit_shmated_memory(char* addr, size_t size) { 2010 trcVerbose("uncommit_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].", 2011 addr, addr + size - 1); 2012 2013 const bool rc = my_disclaim64(addr, size); 2014 2015 if (!rc) { 2016 trcVerbose("my_disclaim64(" PTR_FORMAT ", " UINTX_FORMAT ") failed.\n", addr, size); 2017 return false; 2018 } 2019 return true; 2020 } 2021 2022 //////////////////////////////// mmap-based routines ///////////////////////////////// 2023 2024 // Reserve memory via mmap. 2025 // If <requested_addr> is given, an attempt is made to attach at the given address. 2026 // Failing that, memory is allocated at any address. 2027 // If <alignment_hint> is given and <requested_addr> is NULL, an attempt is made to 2028 // allocate at an address aligned with the given alignment. Failing that, memory 2029 // is aligned anywhere. 2030 static char* reserve_mmaped_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { 2031 trcVerbose("reserve_mmaped_memory " UINTX_FORMAT " bytes, wishaddress " PTR_FORMAT ", " 2032 "alignment_hint " UINTX_FORMAT "...", 2033 bytes, requested_addr, alignment_hint); 2034 2035 // If a wish address is given, but not aligned to 4K page boundary, mmap will fail. 2036 if (requested_addr && !is_aligned_to(requested_addr, os::vm_page_size()) != 0) { 2037 trcVerbose("Wish address " PTR_FORMAT " not aligned to page boundary.", requested_addr); 2038 return NULL; 2039 } 2040 2041 // We must prevent anyone from attaching too close to the 2042 // BRK because that may cause malloc OOM. 2043 if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) { 2044 trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. " 2045 "Will attach anywhere.", requested_addr); 2046 // Act like the OS refused to attach there. 2047 requested_addr = NULL; 2048 } 2049 2050 // Specify one or the other but not both. 2051 assert0(!(requested_addr != NULL && alignment_hint > 0)); 2052 2053 // In 64K mode, we claim the global page size (os::vm_page_size()) 2054 // is 64K. This is one of the few points where that illusion may 2055 // break, because mmap() will always return memory aligned to 4K. So 2056 // we must ensure we only ever return memory aligned to 64k. 2057 if (alignment_hint) { 2058 alignment_hint = lcm(alignment_hint, os::vm_page_size()); 2059 } else { 2060 alignment_hint = os::vm_page_size(); 2061 } 2062 2063 // Size shall always be a multiple of os::vm_page_size (esp. in 64K mode). 2064 const size_t size = align_size_up(bytes, os::vm_page_size()); 2065 2066 // alignment: Allocate memory large enough to include an aligned range of the right size and 2067 // cut off the leading and trailing waste pages. 2068 assert0(alignment_hint != 0 && is_aligned_to(alignment_hint, os::vm_page_size())); // see above 2069 const size_t extra_size = size + alignment_hint; 2070 2071 // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to 2072 // later use msync(MS_INVALIDATE) (see os::uncommit_memory). 2073 int flags = MAP_ANONYMOUS | MAP_SHARED; 2074 2075 // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what 2076 // it means if wishaddress is given but MAP_FIXED is not set. 2077 // 2078 // Important! Behaviour differs depending on whether SPEC1170 mode is active or not. 2079 // SPEC1170 mode active: behaviour like POSIX, MAP_FIXED will clobber existing mappings. 2080 // SPEC1170 mode not active: behaviour, unlike POSIX, is that no existing mappings will 2081 // get clobbered. 2082 if (requested_addr != NULL) { 2083 if (!os::Aix::xpg_sus_mode()) { // not SPEC1170 Behaviour 2084 flags |= MAP_FIXED; 2085 } 2086 } 2087 2088 char* addr = (char*)::mmap(requested_addr, extra_size, 2089 PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0); 2090 2091 if (addr == MAP_FAILED) { 2092 trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) failed (%d)", requested_addr, size, errno); 2093 return NULL; 2094 } 2095 2096 // Handle alignment. 2097 char* const addr_aligned = (char *)align_ptr_up(addr, alignment_hint); 2098 const size_t waste_pre = addr_aligned - addr; 2099 char* const addr_aligned_end = addr_aligned + size; 2100 const size_t waste_post = extra_size - waste_pre - size; 2101 if (waste_pre > 0) { 2102 ::munmap(addr, waste_pre); 2103 } 2104 if (waste_post > 0) { 2105 ::munmap(addr_aligned_end, waste_post); 2106 } 2107 addr = addr_aligned; 2108 2109 if (addr) { 2110 trcVerbose("mmap-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes)", 2111 addr, addr + bytes, bytes); 2112 } else { 2113 if (requested_addr != NULL) { 2114 trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at wish address " PTR_FORMAT ".", bytes, requested_addr); 2115 } else { 2116 trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at any address.", bytes); 2117 } 2118 } 2119 2120 // bookkeeping 2121 vmembk_add(addr, size, 4*K, VMEM_MAPPED); 2122 2123 // Test alignment, see above. 2124 assert0(is_aligned_to(addr, os::vm_page_size())); 2125 2126 return addr; 2127 } 2128 2129 static bool release_mmaped_memory(char* addr, size_t size) { 2130 assert0(is_aligned_to(addr, os::vm_page_size())); 2131 assert0(is_aligned_to(size, os::vm_page_size())); 2132 2133 trcVerbose("release_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].", 2134 addr, addr + size - 1); 2135 bool rc = false; 2136 2137 if (::munmap(addr, size) != 0) { 2138 trcVerbose("failed (%d)\n", errno); 2139 rc = false; 2140 } else { 2141 trcVerbose("ok."); 2142 rc = true; 2143 } 2144 2145 return rc; 2146 } 2147 2148 static bool uncommit_mmaped_memory(char* addr, size_t size) { 2149 2150 assert0(is_aligned_to(addr, os::vm_page_size())); 2151 assert0(is_aligned_to(size, os::vm_page_size())); 2152 2153 trcVerbose("uncommit_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].", 2154 addr, addr + size - 1); 2155 bool rc = false; 2156 2157 // Uncommit mmap memory with msync MS_INVALIDATE. 2158 if (::msync(addr, size, MS_INVALIDATE) != 0) { 2159 trcVerbose("failed (%d)\n", errno); 2160 rc = false; 2161 } else { 2162 trcVerbose("ok."); 2163 rc = true; 2164 } 2165 2166 return rc; 2167 } 2168 2169 int os::vm_page_size() { 2170 // Seems redundant as all get out. 2171 assert(os::Aix::page_size() != -1, "must call os::init"); 2172 return os::Aix::page_size(); 2173 } 2174 2175 // Aix allocates memory by pages. 2176 int os::vm_allocation_granularity() { 2177 assert(os::Aix::page_size() != -1, "must call os::init"); 2178 return os::Aix::page_size(); 2179 } 2180 2181 #ifdef PRODUCT 2182 static void warn_fail_commit_memory(char* addr, size_t size, bool exec, 2183 int err) { 2184 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 2185 ", %d) failed; error='%s' (errno=%d)", addr, size, exec, 2186 os::errno_name(err), err); 2187 } 2188 #endif 2189 2190 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, 2191 const char* mesg) { 2192 assert(mesg != NULL, "mesg must be specified"); 2193 if (!pd_commit_memory(addr, size, exec)) { 2194 // Add extra info in product mode for vm_exit_out_of_memory(): 2195 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);) 2196 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg); 2197 } 2198 } 2199 2200 bool os::pd_commit_memory(char* addr, size_t size, bool exec) { 2201 2202 assert(is_aligned_to(addr, os::vm_page_size()), 2203 "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")", 2204 p2i(addr), os::vm_page_size()); 2205 assert(is_aligned_to(size, os::vm_page_size()), 2206 "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")", 2207 size, os::vm_page_size()); 2208 2209 vmembk_t* const vmi = vmembk_find(addr); 2210 guarantee0(vmi); 2211 vmi->assert_is_valid_subrange(addr, size); 2212 2213 trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", addr, addr + size - 1); 2214 2215 if (UseExplicitCommit) { 2216 // AIX commits memory on touch. So, touch all pages to be committed. 2217 for (char* p = addr; p < (addr + size); p += 4*K) { 2218 *p = '\0'; 2219 } 2220 } 2221 2222 return true; 2223 } 2224 2225 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) { 2226 return pd_commit_memory(addr, size, exec); 2227 } 2228 2229 void os::pd_commit_memory_or_exit(char* addr, size_t size, 2230 size_t alignment_hint, bool exec, 2231 const char* mesg) { 2232 // Alignment_hint is ignored on this OS. 2233 pd_commit_memory_or_exit(addr, size, exec, mesg); 2234 } 2235 2236 bool os::pd_uncommit_memory(char* addr, size_t size) { 2237 assert(is_aligned_to(addr, os::vm_page_size()), 2238 "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")", 2239 p2i(addr), os::vm_page_size()); 2240 assert(is_aligned_to(size, os::vm_page_size()), 2241 "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")", 2242 size, os::vm_page_size()); 2243 2244 // Dynamically do different things for mmap/shmat. 2245 const vmembk_t* const vmi = vmembk_find(addr); 2246 guarantee0(vmi); 2247 vmi->assert_is_valid_subrange(addr, size); 2248 2249 if (vmi->type == VMEM_SHMATED) { 2250 return uncommit_shmated_memory(addr, size); 2251 } else { 2252 return uncommit_mmaped_memory(addr, size); 2253 } 2254 } 2255 2256 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 2257 // Do not call this; no need to commit stack pages on AIX. 2258 ShouldNotReachHere(); 2259 return true; 2260 } 2261 2262 bool os::remove_stack_guard_pages(char* addr, size_t size) { 2263 // Do not call this; no need to commit stack pages on AIX. 2264 ShouldNotReachHere(); 2265 return true; 2266 } 2267 2268 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { 2269 } 2270 2271 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { 2272 } 2273 2274 void os::numa_make_global(char *addr, size_t bytes) { 2275 } 2276 2277 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { 2278 } 2279 2280 bool os::numa_topology_changed() { 2281 return false; 2282 } 2283 2284 size_t os::numa_get_groups_num() { 2285 return 1; 2286 } 2287 2288 int os::numa_get_group_id() { 2289 return 0; 2290 } 2291 2292 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 2293 if (size > 0) { 2294 ids[0] = 0; 2295 return 1; 2296 } 2297 return 0; 2298 } 2299 2300 bool os::get_page_info(char *start, page_info* info) { 2301 return false; 2302 } 2303 2304 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { 2305 return end; 2306 } 2307 2308 // Reserves and attaches a shared memory segment. 2309 // Will assert if a wish address is given and could not be obtained. 2310 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { 2311 2312 // All other Unices do a mmap(MAP_FIXED) if the addr is given, 2313 // thereby clobbering old mappings at that place. That is probably 2314 // not intended, never used and almost certainly an error were it 2315 // ever be used this way (to try attaching at a specified address 2316 // without clobbering old mappings an alternate API exists, 2317 // os::attempt_reserve_memory_at()). 2318 // Instead of mimicking the dangerous coding of the other platforms, here I 2319 // just ignore the request address (release) or assert(debug). 2320 assert0(requested_addr == NULL); 2321 2322 // Always round to os::vm_page_size(), which may be larger than 4K. 2323 bytes = align_size_up(bytes, os::vm_page_size()); 2324 const size_t alignment_hint0 = 2325 alignment_hint ? align_size_up(alignment_hint, os::vm_page_size()) : 0; 2326 2327 // In 4K mode always use mmap. 2328 // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted. 2329 if (os::vm_page_size() == 4*K) { 2330 return reserve_mmaped_memory(bytes, requested_addr, alignment_hint); 2331 } else { 2332 if (bytes >= Use64KPagesThreshold) { 2333 return reserve_shmated_memory(bytes, requested_addr, alignment_hint); 2334 } else { 2335 return reserve_mmaped_memory(bytes, requested_addr, alignment_hint); 2336 } 2337 } 2338 } 2339 2340 bool os::pd_release_memory(char* addr, size_t size) { 2341 2342 // Dynamically do different things for mmap/shmat. 2343 vmembk_t* const vmi = vmembk_find(addr); 2344 guarantee0(vmi); 2345 2346 // Always round to os::vm_page_size(), which may be larger than 4K. 2347 size = align_size_up(size, os::vm_page_size()); 2348 addr = (char *)align_ptr_up(addr, os::vm_page_size()); 2349 2350 bool rc = false; 2351 bool remove_bookkeeping = false; 2352 if (vmi->type == VMEM_SHMATED) { 2353 // For shmatted memory, we do: 2354 // - If user wants to release the whole range, release the memory (shmdt). 2355 // - If user only wants to release a partial range, uncommit (disclaim) that 2356 // range. That way, at least, we do not use memory anymore (bust still page 2357 // table space). 2358 vmi->assert_is_valid_subrange(addr, size); 2359 if (addr == vmi->addr && size == vmi->size) { 2360 rc = release_shmated_memory(addr, size); 2361 remove_bookkeeping = true; 2362 } else { 2363 rc = uncommit_shmated_memory(addr, size); 2364 } 2365 } else { 2366 // User may unmap partial regions but region has to be fully contained. 2367 #ifdef ASSERT 2368 vmi->assert_is_valid_subrange(addr, size); 2369 #endif 2370 rc = release_mmaped_memory(addr, size); 2371 remove_bookkeeping = true; 2372 } 2373 2374 // update bookkeeping 2375 if (rc && remove_bookkeeping) { 2376 vmembk_remove(vmi); 2377 } 2378 2379 return rc; 2380 } 2381 2382 static bool checked_mprotect(char* addr, size_t size, int prot) { 2383 2384 // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will 2385 // not tell me if protection failed when trying to protect an un-protectable range. 2386 // 2387 // This means if the memory was allocated using shmget/shmat, protection wont work 2388 // but mprotect will still return 0: 2389 // 2390 // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm 2391 2392 bool rc = ::mprotect(addr, size, prot) == 0 ? true : false; 2393 2394 if (!rc) { 2395 const char* const s_errno = os::errno_name(errno); 2396 warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno); 2397 return false; 2398 } 2399 2400 // mprotect success check 2401 // 2402 // Mprotect said it changed the protection but can I believe it? 2403 // 2404 // To be sure I need to check the protection afterwards. Try to 2405 // read from protected memory and check whether that causes a segfault. 2406 // 2407 if (!os::Aix::xpg_sus_mode()) { 2408 2409 if (CanUseSafeFetch32()) { 2410 2411 const bool read_protected = 2412 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 && 2413 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false; 2414 2415 if (prot & PROT_READ) { 2416 rc = !read_protected; 2417 } else { 2418 rc = read_protected; 2419 } 2420 2421 if (!rc) { 2422 if (os::Aix::on_pase()) { 2423 // There is an issue on older PASE systems where mprotect() will return success but the 2424 // memory will not be protected. 2425 // This has nothing to do with the problem of using mproect() on SPEC1170 incompatible 2426 // machines; we only see it rarely, when using mprotect() to protect the guard page of 2427 // a stack. It is an OS error. 2428 // 2429 // A valid strategy is just to try again. This usually works. :-/ 2430 2431 ::usleep(1000); 2432 if (::mprotect(addr, size, prot) == 0) { 2433 const bool read_protected_2 = 2434 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 && 2435 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false; 2436 rc = true; 2437 } 2438 } 2439 } 2440 } 2441 } 2442 2443 assert(rc == true, "mprotect failed."); 2444 2445 return rc; 2446 } 2447 2448 // Set protections specified 2449 bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) { 2450 unsigned int p = 0; 2451 switch (prot) { 2452 case MEM_PROT_NONE: p = PROT_NONE; break; 2453 case MEM_PROT_READ: p = PROT_READ; break; 2454 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; 2455 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; 2456 default: 2457 ShouldNotReachHere(); 2458 } 2459 // is_committed is unused. 2460 return checked_mprotect(addr, size, p); 2461 } 2462 2463 bool os::guard_memory(char* addr, size_t size) { 2464 return checked_mprotect(addr, size, PROT_NONE); 2465 } 2466 2467 bool os::unguard_memory(char* addr, size_t size) { 2468 return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC); 2469 } 2470 2471 // Large page support 2472 2473 static size_t _large_page_size = 0; 2474 2475 // Enable large page support if OS allows that. 2476 void os::large_page_init() { 2477 return; // Nothing to do. See query_multipage_support and friends. 2478 } 2479 2480 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) { 2481 // reserve_memory_special() is used to allocate large paged memory. On AIX, we implement 2482 // 64k paged memory reservation using the normal memory allocation paths (os::reserve_memory()), 2483 // so this is not needed. 2484 assert(false, "should not be called on AIX"); 2485 return NULL; 2486 } 2487 2488 bool os::release_memory_special(char* base, size_t bytes) { 2489 // Detaching the SHM segment will also delete it, see reserve_memory_special(). 2490 Unimplemented(); 2491 return false; 2492 } 2493 2494 size_t os::large_page_size() { 2495 return _large_page_size; 2496 } 2497 2498 bool os::can_commit_large_page_memory() { 2499 // Does not matter, we do not support huge pages. 2500 return false; 2501 } 2502 2503 bool os::can_execute_large_page_memory() { 2504 // Does not matter, we do not support huge pages. 2505 return false; 2506 } 2507 2508 // Reserve memory at an arbitrary address, only if that area is 2509 // available (and not reserved for something else). 2510 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 2511 char* addr = NULL; 2512 2513 // Always round to os::vm_page_size(), which may be larger than 4K. 2514 bytes = align_size_up(bytes, os::vm_page_size()); 2515 2516 // In 4K mode always use mmap. 2517 // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted. 2518 if (os::vm_page_size() == 4*K) { 2519 return reserve_mmaped_memory(bytes, requested_addr, 0); 2520 } else { 2521 if (bytes >= Use64KPagesThreshold) { 2522 return reserve_shmated_memory(bytes, requested_addr, 0); 2523 } else { 2524 return reserve_mmaped_memory(bytes, requested_addr, 0); 2525 } 2526 } 2527 2528 return addr; 2529 } 2530 2531 size_t os::read(int fd, void *buf, unsigned int nBytes) { 2532 return ::read(fd, buf, nBytes); 2533 } 2534 2535 size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) { 2536 return ::pread(fd, buf, nBytes, offset); 2537 } 2538 2539 void os::naked_short_sleep(jlong ms) { 2540 struct timespec req; 2541 2542 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 2543 req.tv_sec = 0; 2544 if (ms > 0) { 2545 req.tv_nsec = (ms % 1000) * 1000000; 2546 } 2547 else { 2548 req.tv_nsec = 1; 2549 } 2550 2551 nanosleep(&req, NULL); 2552 2553 return; 2554 } 2555 2556 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 2557 void os::infinite_sleep() { 2558 while (true) { // sleep forever ... 2559 ::sleep(100); // ... 100 seconds at a time 2560 } 2561 } 2562 2563 // Used to convert frequent JVM_Yield() to nops 2564 bool os::dont_yield() { 2565 return DontYieldALot; 2566 } 2567 2568 void os::naked_yield() { 2569 sched_yield(); 2570 } 2571 2572 //////////////////////////////////////////////////////////////////////////////// 2573 // thread priority support 2574 2575 // From AIX manpage to pthread_setschedparam 2576 // (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp? 2577 // topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm): 2578 // 2579 // "If schedpolicy is SCHED_OTHER, then sched_priority must be in the 2580 // range from 40 to 80, where 40 is the least favored priority and 80 2581 // is the most favored." 2582 // 2583 // (Actually, I doubt this even has an impact on AIX, as we do kernel 2584 // scheduling there; however, this still leaves iSeries.) 2585 // 2586 // We use the same values for AIX and PASE. 2587 int os::java_to_os_priority[CriticalPriority + 1] = { 2588 54, // 0 Entry should never be used 2589 2590 55, // 1 MinPriority 2591 55, // 2 2592 56, // 3 2593 2594 56, // 4 2595 57, // 5 NormPriority 2596 57, // 6 2597 2598 58, // 7 2599 58, // 8 2600 59, // 9 NearMaxPriority 2601 2602 60, // 10 MaxPriority 2603 2604 60 // 11 CriticalPriority 2605 }; 2606 2607 OSReturn os::set_native_priority(Thread* thread, int newpri) { 2608 if (!UseThreadPriorities) return OS_OK; 2609 pthread_t thr = thread->osthread()->pthread_id(); 2610 int policy = SCHED_OTHER; 2611 struct sched_param param; 2612 param.sched_priority = newpri; 2613 int ret = pthread_setschedparam(thr, policy, ¶m); 2614 2615 if (ret != 0) { 2616 trcVerbose("Could not change priority for thread %d to %d (error %d, %s)", 2617 (int)thr, newpri, ret, os::errno_name(ret)); 2618 } 2619 return (ret == 0) ? OS_OK : OS_ERR; 2620 } 2621 2622 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { 2623 if (!UseThreadPriorities) { 2624 *priority_ptr = java_to_os_priority[NormPriority]; 2625 return OS_OK; 2626 } 2627 pthread_t thr = thread->osthread()->pthread_id(); 2628 int policy = SCHED_OTHER; 2629 struct sched_param param; 2630 int ret = pthread_getschedparam(thr, &policy, ¶m); 2631 *priority_ptr = param.sched_priority; 2632 2633 return (ret == 0) ? OS_OK : OS_ERR; 2634 } 2635 2636 // Hint to the underlying OS that a task switch would not be good. 2637 // Void return because it's a hint and can fail. 2638 void os::hint_no_preempt() {} 2639 2640 //////////////////////////////////////////////////////////////////////////////// 2641 // suspend/resume support 2642 2643 // the low-level signal-based suspend/resume support is a remnant from the 2644 // old VM-suspension that used to be for java-suspension, safepoints etc, 2645 // within hotspot. Now there is a single use-case for this: 2646 // - calling get_thread_pc() on the VMThread by the flat-profiler task 2647 // that runs in the watcher thread. 2648 // The remaining code is greatly simplified from the more general suspension 2649 // code that used to be used. 2650 // 2651 // The protocol is quite simple: 2652 // - suspend: 2653 // - sends a signal to the target thread 2654 // - polls the suspend state of the osthread using a yield loop 2655 // - target thread signal handler (SR_handler) sets suspend state 2656 // and blocks in sigsuspend until continued 2657 // - resume: 2658 // - sets target osthread state to continue 2659 // - sends signal to end the sigsuspend loop in the SR_handler 2660 // 2661 // Note that the SR_lock plays no role in this suspend/resume protocol, 2662 // but is checked for NULL in SR_handler as a thread termination indicator. 2663 // 2664 2665 static void resume_clear_context(OSThread *osthread) { 2666 osthread->set_ucontext(NULL); 2667 osthread->set_siginfo(NULL); 2668 } 2669 2670 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) { 2671 osthread->set_ucontext(context); 2672 osthread->set_siginfo(siginfo); 2673 } 2674 2675 // 2676 // Handler function invoked when a thread's execution is suspended or 2677 // resumed. We have to be careful that only async-safe functions are 2678 // called here (Note: most pthread functions are not async safe and 2679 // should be avoided.) 2680 // 2681 // Note: sigwait() is a more natural fit than sigsuspend() from an 2682 // interface point of view, but sigwait() prevents the signal hander 2683 // from being run. libpthread would get very confused by not having 2684 // its signal handlers run and prevents sigwait()'s use with the 2685 // mutex granting granting signal. 2686 // 2687 // Currently only ever called on the VMThread and JavaThreads (PC sampling). 2688 // 2689 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) { 2690 // Save and restore errno to avoid confusing native code with EINTR 2691 // after sigsuspend. 2692 int old_errno = errno; 2693 2694 Thread* thread = Thread::current_or_null_safe(); 2695 assert(thread != NULL, "Missing current thread in SR_handler"); 2696 2697 // On some systems we have seen signal delivery get "stuck" until the signal 2698 // mask is changed as part of thread termination. Check that the current thread 2699 // has not already terminated (via SR_lock()) - else the following assertion 2700 // will fail because the thread is no longer a JavaThread as the ~JavaThread 2701 // destructor has completed. 2702 2703 if (thread->SR_lock() == NULL) { 2704 return; 2705 } 2706 2707 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread"); 2708 2709 OSThread* osthread = thread->osthread(); 2710 2711 os::SuspendResume::State current = osthread->sr.state(); 2712 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) { 2713 suspend_save_context(osthread, siginfo, context); 2714 2715 // attempt to switch the state, we assume we had a SUSPEND_REQUEST 2716 os::SuspendResume::State state = osthread->sr.suspended(); 2717 if (state == os::SuspendResume::SR_SUSPENDED) { 2718 sigset_t suspend_set; // signals for sigsuspend() 2719 2720 // get current set of blocked signals and unblock resume signal 2721 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set); 2722 sigdelset(&suspend_set, SR_signum); 2723 2724 // wait here until we are resumed 2725 while (1) { 2726 sigsuspend(&suspend_set); 2727 2728 os::SuspendResume::State result = osthread->sr.running(); 2729 if (result == os::SuspendResume::SR_RUNNING) { 2730 break; 2731 } 2732 } 2733 2734 } else if (state == os::SuspendResume::SR_RUNNING) { 2735 // request was cancelled, continue 2736 } else { 2737 ShouldNotReachHere(); 2738 } 2739 2740 resume_clear_context(osthread); 2741 } else if (current == os::SuspendResume::SR_RUNNING) { 2742 // request was cancelled, continue 2743 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) { 2744 // ignore 2745 } else { 2746 ShouldNotReachHere(); 2747 } 2748 2749 errno = old_errno; 2750 } 2751 2752 static int SR_initialize() { 2753 struct sigaction act; 2754 char *s; 2755 // Get signal number to use for suspend/resume 2756 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) { 2757 int sig = ::strtol(s, 0, 10); 2758 if (sig > MAX2(SIGSEGV, SIGBUS) && // See 4355769. 2759 sig < NSIG) { // Must be legal signal and fit into sigflags[]. 2760 SR_signum = sig; 2761 } else { 2762 warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.", 2763 sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum); 2764 } 2765 } 2766 2767 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS, 2768 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769"); 2769 2770 sigemptyset(&SR_sigset); 2771 sigaddset(&SR_sigset, SR_signum); 2772 2773 // Set up signal handler for suspend/resume. 2774 act.sa_flags = SA_RESTART|SA_SIGINFO; 2775 act.sa_handler = (void (*)(int)) SR_handler; 2776 2777 // SR_signum is blocked by default. 2778 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask); 2779 2780 if (sigaction(SR_signum, &act, 0) == -1) { 2781 return -1; 2782 } 2783 2784 // Save signal flag 2785 os::Aix::set_our_sigflags(SR_signum, act.sa_flags); 2786 return 0; 2787 } 2788 2789 static int SR_finalize() { 2790 return 0; 2791 } 2792 2793 static int sr_notify(OSThread* osthread) { 2794 int status = pthread_kill(osthread->pthread_id(), SR_signum); 2795 assert_status(status == 0, status, "pthread_kill"); 2796 return status; 2797 } 2798 2799 // "Randomly" selected value for how long we want to spin 2800 // before bailing out on suspending a thread, also how often 2801 // we send a signal to a thread we want to resume 2802 static const int RANDOMLY_LARGE_INTEGER = 1000000; 2803 static const int RANDOMLY_LARGE_INTEGER2 = 100; 2804 2805 // returns true on success and false on error - really an error is fatal 2806 // but this seems the normal response to library errors 2807 static bool do_suspend(OSThread* osthread) { 2808 assert(osthread->sr.is_running(), "thread should be running"); 2809 // mark as suspended and send signal 2810 2811 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) { 2812 // failed to switch, state wasn't running? 2813 ShouldNotReachHere(); 2814 return false; 2815 } 2816 2817 if (sr_notify(osthread) != 0) { 2818 // try to cancel, switch to running 2819 2820 os::SuspendResume::State result = osthread->sr.cancel_suspend(); 2821 if (result == os::SuspendResume::SR_RUNNING) { 2822 // cancelled 2823 return false; 2824 } else if (result == os::SuspendResume::SR_SUSPENDED) { 2825 // somehow managed to suspend 2826 return true; 2827 } else { 2828 ShouldNotReachHere(); 2829 return false; 2830 } 2831 } 2832 2833 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED 2834 2835 for (int n = 0; !osthread->sr.is_suspended(); n++) { 2836 for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) { 2837 os::naked_yield(); 2838 } 2839 2840 // timeout, try to cancel the request 2841 if (n >= RANDOMLY_LARGE_INTEGER) { 2842 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend(); 2843 if (cancelled == os::SuspendResume::SR_RUNNING) { 2844 return false; 2845 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) { 2846 return true; 2847 } else { 2848 ShouldNotReachHere(); 2849 return false; 2850 } 2851 } 2852 } 2853 2854 guarantee(osthread->sr.is_suspended(), "Must be suspended"); 2855 return true; 2856 } 2857 2858 static void do_resume(OSThread* osthread) { 2859 //assert(osthread->sr.is_suspended(), "thread should be suspended"); 2860 2861 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) { 2862 // failed to switch to WAKEUP_REQUEST 2863 ShouldNotReachHere(); 2864 return; 2865 } 2866 2867 while (!osthread->sr.is_running()) { 2868 if (sr_notify(osthread) == 0) { 2869 for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) { 2870 for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) { 2871 os::naked_yield(); 2872 } 2873 } 2874 } else { 2875 ShouldNotReachHere(); 2876 } 2877 } 2878 2879 guarantee(osthread->sr.is_running(), "Must be running!"); 2880 } 2881 2882 /////////////////////////////////////////////////////////////////////////////////// 2883 // signal handling (except suspend/resume) 2884 2885 // This routine may be used by user applications as a "hook" to catch signals. 2886 // The user-defined signal handler must pass unrecognized signals to this 2887 // routine, and if it returns true (non-zero), then the signal handler must 2888 // return immediately. If the flag "abort_if_unrecognized" is true, then this 2889 // routine will never retun false (zero), but instead will execute a VM panic 2890 // routine kill the process. 2891 // 2892 // If this routine returns false, it is OK to call it again. This allows 2893 // the user-defined signal handler to perform checks either before or after 2894 // the VM performs its own checks. Naturally, the user code would be making 2895 // a serious error if it tried to handle an exception (such as a null check 2896 // or breakpoint) that the VM was generating for its own correct operation. 2897 // 2898 // This routine may recognize any of the following kinds of signals: 2899 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1. 2900 // It should be consulted by handlers for any of those signals. 2901 // 2902 // The caller of this routine must pass in the three arguments supplied 2903 // to the function referred to in the "sa_sigaction" (not the "sa_handler") 2904 // field of the structure passed to sigaction(). This routine assumes that 2905 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART. 2906 // 2907 // Note that the VM will print warnings if it detects conflicting signal 2908 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". 2909 // 2910 extern "C" JNIEXPORT int 2911 JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized); 2912 2913 // Set thread signal mask (for some reason on AIX sigthreadmask() seems 2914 // to be the thing to call; documentation is not terribly clear about whether 2915 // pthread_sigmask also works, and if it does, whether it does the same. 2916 bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) { 2917 const int rc = ::pthread_sigmask(how, set, oset); 2918 // return value semantics differ slightly for error case: 2919 // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno 2920 // (so, pthread_sigmask is more theadsafe for error handling) 2921 // But success is always 0. 2922 return rc == 0 ? true : false; 2923 } 2924 2925 // Function to unblock all signals which are, according 2926 // to POSIX, typical program error signals. If they happen while being blocked, 2927 // they typically will bring down the process immediately. 2928 bool unblock_program_error_signals() { 2929 sigset_t set; 2930 ::sigemptyset(&set); 2931 ::sigaddset(&set, SIGILL); 2932 ::sigaddset(&set, SIGBUS); 2933 ::sigaddset(&set, SIGFPE); 2934 ::sigaddset(&set, SIGSEGV); 2935 return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL); 2936 } 2937 2938 // Renamed from 'signalHandler' to avoid collision with other shared libs. 2939 void javaSignalHandler(int sig, siginfo_t* info, void* uc) { 2940 assert(info != NULL && uc != NULL, "it must be old kernel"); 2941 2942 // Never leave program error signals blocked; 2943 // on all our platforms they would bring down the process immediately when 2944 // getting raised while being blocked. 2945 unblock_program_error_signals(); 2946 2947 int orig_errno = errno; // Preserve errno value over signal handler. 2948 JVM_handle_aix_signal(sig, info, uc, true); 2949 errno = orig_errno; 2950 } 2951 2952 // This boolean allows users to forward their own non-matching signals 2953 // to JVM_handle_aix_signal, harmlessly. 2954 bool os::Aix::signal_handlers_are_installed = false; 2955 2956 // For signal-chaining 2957 struct sigaction sigact[NSIG]; 2958 sigset_t sigs; 2959 bool os::Aix::libjsig_is_loaded = false; 2960 typedef struct sigaction *(*get_signal_t)(int); 2961 get_signal_t os::Aix::get_signal_action = NULL; 2962 2963 struct sigaction* os::Aix::get_chained_signal_action(int sig) { 2964 struct sigaction *actp = NULL; 2965 2966 if (libjsig_is_loaded) { 2967 // Retrieve the old signal handler from libjsig 2968 actp = (*get_signal_action)(sig); 2969 } 2970 if (actp == NULL) { 2971 // Retrieve the preinstalled signal handler from jvm 2972 actp = get_preinstalled_handler(sig); 2973 } 2974 2975 return actp; 2976 } 2977 2978 static bool call_chained_handler(struct sigaction *actp, int sig, 2979 siginfo_t *siginfo, void *context) { 2980 // Call the old signal handler 2981 if (actp->sa_handler == SIG_DFL) { 2982 // It's more reasonable to let jvm treat it as an unexpected exception 2983 // instead of taking the default action. 2984 return false; 2985 } else if (actp->sa_handler != SIG_IGN) { 2986 if ((actp->sa_flags & SA_NODEFER) == 0) { 2987 // automaticlly block the signal 2988 sigaddset(&(actp->sa_mask), sig); 2989 } 2990 2991 sa_handler_t hand = NULL; 2992 sa_sigaction_t sa = NULL; 2993 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; 2994 // retrieve the chained handler 2995 if (siginfo_flag_set) { 2996 sa = actp->sa_sigaction; 2997 } else { 2998 hand = actp->sa_handler; 2999 } 3000 3001 if ((actp->sa_flags & SA_RESETHAND) != 0) { 3002 actp->sa_handler = SIG_DFL; 3003 } 3004 3005 // try to honor the signal mask 3006 sigset_t oset; 3007 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset); 3008 3009 // call into the chained handler 3010 if (siginfo_flag_set) { 3011 (*sa)(sig, siginfo, context); 3012 } else { 3013 (*hand)(sig); 3014 } 3015 3016 // restore the signal mask 3017 pthread_sigmask(SIG_SETMASK, &oset, 0); 3018 } 3019 // Tell jvm's signal handler the signal is taken care of. 3020 return true; 3021 } 3022 3023 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { 3024 bool chained = false; 3025 // signal-chaining 3026 if (UseSignalChaining) { 3027 struct sigaction *actp = get_chained_signal_action(sig); 3028 if (actp != NULL) { 3029 chained = call_chained_handler(actp, sig, siginfo, context); 3030 } 3031 } 3032 return chained; 3033 } 3034 3035 struct sigaction* os::Aix::get_preinstalled_handler(int sig) { 3036 if (sigismember(&sigs, sig)) { 3037 return &sigact[sig]; 3038 } 3039 return NULL; 3040 } 3041 3042 void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) { 3043 assert(sig > 0 && sig < NSIG, "vm signal out of expected range"); 3044 sigact[sig] = oldAct; 3045 sigaddset(&sigs, sig); 3046 } 3047 3048 // for diagnostic 3049 int sigflags[NSIG]; 3050 3051 int os::Aix::get_our_sigflags(int sig) { 3052 assert(sig > 0 && sig < NSIG, "vm signal out of expected range"); 3053 return sigflags[sig]; 3054 } 3055 3056 void os::Aix::set_our_sigflags(int sig, int flags) { 3057 assert(sig > 0 && sig < NSIG, "vm signal out of expected range"); 3058 if (sig > 0 && sig < NSIG) { 3059 sigflags[sig] = flags; 3060 } 3061 } 3062 3063 void os::Aix::set_signal_handler(int sig, bool set_installed) { 3064 // Check for overwrite. 3065 struct sigaction oldAct; 3066 sigaction(sig, (struct sigaction*)NULL, &oldAct); 3067 3068 void* oldhand = oldAct.sa_sigaction 3069 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 3070 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 3071 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) && 3072 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) && 3073 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) { 3074 if (AllowUserSignalHandlers || !set_installed) { 3075 // Do not overwrite; user takes responsibility to forward to us. 3076 return; 3077 } else if (UseSignalChaining) { 3078 // save the old handler in jvm 3079 save_preinstalled_handler(sig, oldAct); 3080 // libjsig also interposes the sigaction() call below and saves the 3081 // old sigaction on it own. 3082 } else { 3083 fatal("Encountered unexpected pre-existing sigaction handler " 3084 "%#lx for signal %d.", (long)oldhand, sig); 3085 } 3086 } 3087 3088 struct sigaction sigAct; 3089 sigfillset(&(sigAct.sa_mask)); 3090 if (!set_installed) { 3091 sigAct.sa_handler = SIG_DFL; 3092 sigAct.sa_flags = SA_RESTART; 3093 } else { 3094 sigAct.sa_sigaction = javaSignalHandler; 3095 sigAct.sa_flags = SA_SIGINFO|SA_RESTART; 3096 } 3097 // Save flags, which are set by ours 3098 assert(sig > 0 && sig < NSIG, "vm signal out of expected range"); 3099 sigflags[sig] = sigAct.sa_flags; 3100 3101 int ret = sigaction(sig, &sigAct, &oldAct); 3102 assert(ret == 0, "check"); 3103 3104 void* oldhand2 = oldAct.sa_sigaction 3105 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) 3106 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); 3107 assert(oldhand2 == oldhand, "no concurrent signal handler installation"); 3108 } 3109 3110 // install signal handlers for signals that HotSpot needs to 3111 // handle in order to support Java-level exception handling. 3112 void os::Aix::install_signal_handlers() { 3113 if (!signal_handlers_are_installed) { 3114 signal_handlers_are_installed = true; 3115 3116 // signal-chaining 3117 typedef void (*signal_setting_t)(); 3118 signal_setting_t begin_signal_setting = NULL; 3119 signal_setting_t end_signal_setting = NULL; 3120 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3121 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); 3122 if (begin_signal_setting != NULL) { 3123 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, 3124 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); 3125 get_signal_action = CAST_TO_FN_PTR(get_signal_t, 3126 dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); 3127 libjsig_is_loaded = true; 3128 assert(UseSignalChaining, "should enable signal-chaining"); 3129 } 3130 if (libjsig_is_loaded) { 3131 // Tell libjsig jvm is setting signal handlers. 3132 (*begin_signal_setting)(); 3133 } 3134 3135 ::sigemptyset(&sigs); 3136 set_signal_handler(SIGSEGV, true); 3137 set_signal_handler(SIGPIPE, true); 3138 set_signal_handler(SIGBUS, true); 3139 set_signal_handler(SIGILL, true); 3140 set_signal_handler(SIGFPE, true); 3141 set_signal_handler(SIGTRAP, true); 3142 set_signal_handler(SIGXFSZ, true); 3143 set_signal_handler(SIGDANGER, true); 3144 3145 if (libjsig_is_loaded) { 3146 // Tell libjsig jvm finishes setting signal handlers. 3147 (*end_signal_setting)(); 3148 } 3149 3150 // We don't activate signal checker if libjsig is in place, we trust ourselves 3151 // and if UserSignalHandler is installed all bets are off. 3152 // Log that signal checking is off only if -verbose:jni is specified. 3153 if (CheckJNICalls) { 3154 if (libjsig_is_loaded) { 3155 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); 3156 check_signals = false; 3157 } 3158 if (AllowUserSignalHandlers) { 3159 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); 3160 check_signals = false; 3161 } 3162 // Need to initialize check_signal_done. 3163 ::sigemptyset(&check_signal_done); 3164 } 3165 } 3166 } 3167 3168 static const char* get_signal_handler_name(address handler, 3169 char* buf, int buflen) { 3170 int offset; 3171 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset); 3172 if (found) { 3173 // skip directory names 3174 const char *p1, *p2; 3175 p1 = buf; 3176 size_t len = strlen(os::file_separator()); 3177 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; 3178 // The way os::dll_address_to_library_name is implemented on Aix 3179 // right now, it always returns -1 for the offset which is not 3180 // terribly informative. 3181 // Will fix that. For now, omit the offset. 3182 jio_snprintf(buf, buflen, "%s", p1); 3183 } else { 3184 jio_snprintf(buf, buflen, PTR_FORMAT, handler); 3185 } 3186 return buf; 3187 } 3188 3189 static void print_signal_handler(outputStream* st, int sig, 3190 char* buf, size_t buflen) { 3191 struct sigaction sa; 3192 sigaction(sig, NULL, &sa); 3193 3194 st->print("%s: ", os::exception_name(sig, buf, buflen)); 3195 3196 address handler = (sa.sa_flags & SA_SIGINFO) 3197 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) 3198 : CAST_FROM_FN_PTR(address, sa.sa_handler); 3199 3200 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) { 3201 st->print("SIG_DFL"); 3202 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) { 3203 st->print("SIG_IGN"); 3204 } else { 3205 st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); 3206 } 3207 3208 // Print readable mask. 3209 st->print(", sa_mask[0]="); 3210 os::Posix::print_signal_set_short(st, &sa.sa_mask); 3211 3212 address rh = VMError::get_resetted_sighandler(sig); 3213 // May be, handler was resetted by VMError? 3214 if (rh != NULL) { 3215 handler = rh; 3216 sa.sa_flags = VMError::get_resetted_sigflags(sig); 3217 } 3218 3219 // Print textual representation of sa_flags. 3220 st->print(", sa_flags="); 3221 os::Posix::print_sa_flags(st, sa.sa_flags); 3222 3223 // Check: is it our handler? 3224 if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) || 3225 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) { 3226 // It is our signal handler. 3227 // Check for flags, reset system-used one! 3228 if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) { 3229 st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library", 3230 os::Aix::get_our_sigflags(sig)); 3231 } 3232 } 3233 st->cr(); 3234 } 3235 3236 #define DO_SIGNAL_CHECK(sig) \ 3237 if (!sigismember(&check_signal_done, sig)) \ 3238 os::Aix::check_signal_handler(sig) 3239 3240 // This method is a periodic task to check for misbehaving JNI applications 3241 // under CheckJNI, we can add any periodic checks here 3242 3243 void os::run_periodic_checks() { 3244 3245 if (check_signals == false) return; 3246 3247 // SEGV and BUS if overridden could potentially prevent 3248 // generation of hs*.log in the event of a crash, debugging 3249 // such a case can be very challenging, so we absolutely 3250 // check the following for a good measure: 3251 DO_SIGNAL_CHECK(SIGSEGV); 3252 DO_SIGNAL_CHECK(SIGILL); 3253 DO_SIGNAL_CHECK(SIGFPE); 3254 DO_SIGNAL_CHECK(SIGBUS); 3255 DO_SIGNAL_CHECK(SIGPIPE); 3256 DO_SIGNAL_CHECK(SIGXFSZ); 3257 if (UseSIGTRAP) { 3258 DO_SIGNAL_CHECK(SIGTRAP); 3259 } 3260 DO_SIGNAL_CHECK(SIGDANGER); 3261 3262 // ReduceSignalUsage allows the user to override these handlers 3263 // see comments at the very top and jvm_solaris.h 3264 if (!ReduceSignalUsage) { 3265 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL); 3266 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL); 3267 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL); 3268 DO_SIGNAL_CHECK(BREAK_SIGNAL); 3269 } 3270 3271 DO_SIGNAL_CHECK(SR_signum); 3272 } 3273 3274 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *); 3275 3276 static os_sigaction_t os_sigaction = NULL; 3277 3278 void os::Aix::check_signal_handler(int sig) { 3279 char buf[O_BUFLEN]; 3280 address jvmHandler = NULL; 3281 3282 struct sigaction act; 3283 if (os_sigaction == NULL) { 3284 // only trust the default sigaction, in case it has been interposed 3285 os_sigaction = CAST_TO_FN_PTR(os_sigaction_t, dlsym(RTLD_DEFAULT, "sigaction")); 3286 if (os_sigaction == NULL) return; 3287 } 3288 3289 os_sigaction(sig, (struct sigaction*)NULL, &act); 3290 3291 address thisHandler = (act.sa_flags & SA_SIGINFO) 3292 ? CAST_FROM_FN_PTR(address, act.sa_sigaction) 3293 : CAST_FROM_FN_PTR(address, act.sa_handler); 3294 3295 switch(sig) { 3296 case SIGSEGV: 3297 case SIGBUS: 3298 case SIGFPE: 3299 case SIGPIPE: 3300 case SIGILL: 3301 case SIGXFSZ: 3302 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler); 3303 break; 3304 3305 case SHUTDOWN1_SIGNAL: 3306 case SHUTDOWN2_SIGNAL: 3307 case SHUTDOWN3_SIGNAL: 3308 case BREAK_SIGNAL: 3309 jvmHandler = (address)user_handler(); 3310 break; 3311 3312 default: 3313 if (sig == SR_signum) { 3314 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler); 3315 } else { 3316 return; 3317 } 3318 break; 3319 } 3320 3321 if (thisHandler != jvmHandler) { 3322 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN)); 3323 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN)); 3324 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN)); 3325 // No need to check this sig any longer 3326 sigaddset(&check_signal_done, sig); 3327 // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN 3328 if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) { 3329 tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell", 3330 exception_name(sig, buf, O_BUFLEN)); 3331 } 3332 } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) { 3333 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN)); 3334 tty->print("expected:"); 3335 os::Posix::print_sa_flags(tty, os::Aix::get_our_sigflags(sig)); 3336 tty->cr(); 3337 tty->print(" found:"); 3338 os::Posix::print_sa_flags(tty, act.sa_flags); 3339 tty->cr(); 3340 // No need to check this sig any longer 3341 sigaddset(&check_signal_done, sig); 3342 } 3343 3344 // Dump all the signal 3345 if (sigismember(&check_signal_done, sig)) { 3346 print_signal_handlers(tty, buf, O_BUFLEN); 3347 } 3348 } 3349 3350 // To install functions for atexit system call 3351 extern "C" { 3352 static void perfMemory_exit_helper() { 3353 perfMemory_exit(); 3354 } 3355 } 3356 3357 // This is called _before_ the most of global arguments have been parsed. 3358 void os::init(void) { 3359 // This is basic, we want to know if that ever changes. 3360 // (Shared memory boundary is supposed to be a 256M aligned.) 3361 assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected"); 3362 3363 // Record process break at startup. 3364 g_brk_at_startup = (address) ::sbrk(0); 3365 assert(g_brk_at_startup != (address) -1, "sbrk failed"); 3366 3367 // First off, we need to know whether we run on AIX or PASE, and 3368 // the OS level we run on. 3369 os::Aix::initialize_os_info(); 3370 3371 // Scan environment (SPEC1170 behaviour, etc). 3372 os::Aix::scan_environment(); 3373 3374 // Probe multipage support. 3375 query_multipage_support(); 3376 3377 // Act like we only have one page size by eliminating corner cases which 3378 // we did not support very well anyway. 3379 // We have two input conditions: 3380 // 1) Data segment page size. This is controlled by linker setting (datapsize) on the 3381 // launcher, and/or by LDR_CNTRL environment variable. The latter overrules the linker 3382 // setting. 3383 // Data segment page size is important for us because it defines the thread stack page 3384 // size, which is needed for guard page handling, stack banging etc. 3385 // 2) The ability to allocate 64k pages dynamically. If this is a given, java heap can 3386 // and should be allocated with 64k pages. 3387 // 3388 // So, we do the following: 3389 // LDR_CNTRL can_use_64K_pages_dynamically what we do remarks 3390 // 4K no 4K old systems (aix 5.2, as/400 v5r4) or new systems with AME activated 3391 // 4k yes 64k (treat 4k stacks as 64k) different loader than java and standard settings 3392 // 64k no --- AIX 5.2 ? --- 3393 // 64k yes 64k new systems and standard java loader (we set datapsize=64k when linking) 3394 3395 // We explicitly leave no option to change page size, because only upgrading would work, 3396 // not downgrading (if stack page size is 64k you cannot pretend its 4k). 3397 3398 if (g_multipage_support.datapsize == 4*K) { 3399 // datapsize = 4K. Data segment, thread stacks are 4K paged. 3400 if (g_multipage_support.can_use_64K_pages) { 3401 // .. but we are able to use 64K pages dynamically. 3402 // This would be typical for java launchers which are not linked 3403 // with datapsize=64K (like, any other launcher but our own). 3404 // 3405 // In this case it would be smart to allocate the java heap with 64K 3406 // to get the performance benefit, and to fake 64k pages for the 3407 // data segment (when dealing with thread stacks). 3408 // 3409 // However, leave a possibility to downgrade to 4K, using 3410 // -XX:-Use64KPages. 3411 if (Use64KPages) { 3412 trcVerbose("64K page mode (faked for data segment)"); 3413 Aix::_page_size = 64*K; 3414 } else { 3415 trcVerbose("4K page mode (Use64KPages=off)"); 3416 Aix::_page_size = 4*K; 3417 } 3418 } else { 3419 // .. and not able to allocate 64k pages dynamically. Here, just 3420 // fall back to 4K paged mode and use mmap for everything. 3421 trcVerbose("4K page mode"); 3422 Aix::_page_size = 4*K; 3423 FLAG_SET_ERGO(bool, Use64KPages, false); 3424 } 3425 } else { 3426 // datapsize = 64k. Data segment, thread stacks are 64k paged. 3427 // This normally means that we can allocate 64k pages dynamically. 3428 // (There is one special case where this may be false: EXTSHM=on. 3429 // but we decided to not support that mode). 3430 assert0(g_multipage_support.can_use_64K_pages); 3431 Aix::_page_size = 64*K; 3432 trcVerbose("64K page mode"); 3433 FLAG_SET_ERGO(bool, Use64KPages, true); 3434 } 3435 3436 // For now UseLargePages is just ignored. 3437 FLAG_SET_ERGO(bool, UseLargePages, false); 3438 _page_sizes[0] = 0; 3439 3440 // debug trace 3441 trcVerbose("os::vm_page_size %s", describe_pagesize(os::vm_page_size())); 3442 3443 // Next, we need to initialize libo4 and libperfstat libraries. 3444 if (os::Aix::on_pase()) { 3445 os::Aix::initialize_libo4(); 3446 } else { 3447 os::Aix::initialize_libperfstat(); 3448 } 3449 3450 // Reset the perfstat information provided by ODM. 3451 if (os::Aix::on_aix()) { 3452 libperfstat::perfstat_reset(); 3453 } 3454 3455 // Now initialze basic system properties. Note that for some of the values we 3456 // need libperfstat etc. 3457 os::Aix::initialize_system_info(); 3458 3459 clock_tics_per_sec = sysconf(_SC_CLK_TCK); 3460 3461 init_random(1234567); 3462 3463 ThreadCritical::initialize(); 3464 3465 // Main_thread points to the aboriginal thread. 3466 Aix::_main_thread = pthread_self(); 3467 3468 initial_time_count = os::elapsed_counter(); 3469 } 3470 3471 // This is called _after_ the global arguments have been parsed. 3472 jint os::init_2(void) { 3473 3474 if (os::Aix::on_pase()) { 3475 trcVerbose("Running on PASE."); 3476 } else { 3477 trcVerbose("Running on AIX (not PASE)."); 3478 } 3479 3480 trcVerbose("processor count: %d", os::_processor_count); 3481 trcVerbose("physical memory: %lu", Aix::_physical_memory); 3482 3483 // Initially build up the loaded dll map. 3484 LoadedLibraries::reload(); 3485 if (Verbose) { 3486 trcVerbose("Loaded Libraries: "); 3487 LoadedLibraries::print(tty); 3488 } 3489 3490 const int page_size = Aix::page_size(); 3491 const int map_size = page_size; 3492 3493 address map_address = (address) MAP_FAILED; 3494 const int prot = PROT_READ; 3495 const int flags = MAP_PRIVATE|MAP_ANONYMOUS; 3496 3497 // Use optimized addresses for the polling page, 3498 // e.g. map it to a special 32-bit address. 3499 if (OptimizePollingPageLocation) { 3500 // architecture-specific list of address wishes: 3501 address address_wishes[] = { 3502 // AIX: addresses lower than 0x30000000 don't seem to work on AIX. 3503 // PPC64: all address wishes are non-negative 32 bit values where 3504 // the lower 16 bits are all zero. we can load these addresses 3505 // with a single ppc_lis instruction. 3506 (address) 0x30000000, (address) 0x31000000, 3507 (address) 0x32000000, (address) 0x33000000, 3508 (address) 0x40000000, (address) 0x41000000, 3509 (address) 0x42000000, (address) 0x43000000, 3510 (address) 0x50000000, (address) 0x51000000, 3511 (address) 0x52000000, (address) 0x53000000, 3512 (address) 0x60000000, (address) 0x61000000, 3513 (address) 0x62000000, (address) 0x63000000 3514 }; 3515 int address_wishes_length = sizeof(address_wishes)/sizeof(address); 3516 3517 // iterate over the list of address wishes: 3518 for (int i=0; i<address_wishes_length; i++) { 3519 // Try to map with current address wish. 3520 // AIX: AIX needs MAP_FIXED if we provide an address and mmap will 3521 // fail if the address is already mapped. 3522 map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size, 3523 map_size, prot, 3524 flags | MAP_FIXED, 3525 -1, 0); 3526 trcVerbose("SafePoint Polling Page address: %p (wish) => %p", 3527 address_wishes[i], map_address + (ssize_t)page_size); 3528 3529 if (map_address + (ssize_t)page_size == address_wishes[i]) { 3530 // Map succeeded and map_address is at wished address, exit loop. 3531 break; 3532 } 3533 3534 if (map_address != (address) MAP_FAILED) { 3535 // Map succeeded, but polling_page is not at wished address, unmap and continue. 3536 ::munmap(map_address, map_size); 3537 map_address = (address) MAP_FAILED; 3538 } 3539 // Map failed, continue loop. 3540 } 3541 } // end OptimizePollingPageLocation 3542 3543 if (map_address == (address) MAP_FAILED) { 3544 map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0); 3545 } 3546 guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page"); 3547 os::set_polling_page(map_address); 3548 3549 if (!UseMembar) { 3550 address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 3551 guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page"); 3552 os::set_memory_serialize_page(mem_serialize_page); 3553 3554 trcVerbose("Memory Serialize Page address: %p - %p, size %IX (%IB)", 3555 mem_serialize_page, mem_serialize_page + Aix::page_size(), 3556 Aix::page_size(), Aix::page_size()); 3557 } 3558 3559 // initialize suspend/resume support - must do this before signal_sets_init() 3560 if (SR_initialize() != 0) { 3561 perror("SR_initialize failed"); 3562 return JNI_ERR; 3563 } 3564 3565 Aix::signal_sets_init(); 3566 Aix::install_signal_handlers(); 3567 3568 // Check and sets minimum stack sizes against command line options 3569 if (Posix::set_minimum_stack_sizes() == JNI_ERR) { 3570 return JNI_ERR; 3571 } 3572 3573 if (UseNUMA) { 3574 UseNUMA = false; 3575 warning("NUMA optimizations are not available on this OS."); 3576 } 3577 3578 if (MaxFDLimit) { 3579 // Set the number of file descriptors to max. print out error 3580 // if getrlimit/setrlimit fails but continue regardless. 3581 struct rlimit nbr_files; 3582 int status = getrlimit(RLIMIT_NOFILE, &nbr_files); 3583 if (status != 0) { 3584 log_info(os)("os::init_2 getrlimit failed: %s", os::strerror(errno)); 3585 } else { 3586 nbr_files.rlim_cur = nbr_files.rlim_max; 3587 status = setrlimit(RLIMIT_NOFILE, &nbr_files); 3588 if (status != 0) { 3589 log_info(os)("os::init_2 setrlimit failed: %s", os::strerror(errno)); 3590 } 3591 } 3592 } 3593 3594 if (PerfAllowAtExitRegistration) { 3595 // Only register atexit functions if PerfAllowAtExitRegistration is set. 3596 // At exit functions can be delayed until process exit time, which 3597 // can be problematic for embedded VM situations. Embedded VMs should 3598 // call DestroyJavaVM() to assure that VM resources are released. 3599 3600 // Note: perfMemory_exit_helper atexit function may be removed in 3601 // the future if the appropriate cleanup code can be added to the 3602 // VM_Exit VMOperation's doit method. 3603 if (atexit(perfMemory_exit_helper) != 0) { 3604 warning("os::init_2 atexit(perfMemory_exit_helper) failed"); 3605 } 3606 } 3607 3608 return JNI_OK; 3609 } 3610 3611 // Mark the polling page as unreadable 3612 void os::make_polling_page_unreadable(void) { 3613 if (!guard_memory((char*)_polling_page, Aix::page_size())) { 3614 fatal("Could not disable polling page"); 3615 } 3616 }; 3617 3618 // Mark the polling page as readable 3619 void os::make_polling_page_readable(void) { 3620 // Changed according to os_linux.cpp. 3621 if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) { 3622 fatal("Could not enable polling page at " PTR_FORMAT, _polling_page); 3623 } 3624 }; 3625 3626 int os::active_processor_count() { 3627 int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN); 3628 assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check"); 3629 return online_cpus; 3630 } 3631 3632 void os::set_native_thread_name(const char *name) { 3633 // Not yet implemented. 3634 return; 3635 } 3636 3637 bool os::distribute_processes(uint length, uint* distribution) { 3638 // Not yet implemented. 3639 return false; 3640 } 3641 3642 bool os::bind_to_processor(uint processor_id) { 3643 // Not yet implemented. 3644 return false; 3645 } 3646 3647 void os::SuspendedThreadTask::internal_do_task() { 3648 if (do_suspend(_thread->osthread())) { 3649 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext()); 3650 do_task(context); 3651 do_resume(_thread->osthread()); 3652 } 3653 } 3654 3655 class PcFetcher : public os::SuspendedThreadTask { 3656 public: 3657 PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {} 3658 ExtendedPC result(); 3659 protected: 3660 void do_task(const os::SuspendedThreadTaskContext& context); 3661 private: 3662 ExtendedPC _epc; 3663 }; 3664 3665 ExtendedPC PcFetcher::result() { 3666 guarantee(is_done(), "task is not done yet."); 3667 return _epc; 3668 } 3669 3670 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) { 3671 Thread* thread = context.thread(); 3672 OSThread* osthread = thread->osthread(); 3673 if (osthread->ucontext() != NULL) { 3674 _epc = os::Aix::ucontext_get_pc((const ucontext_t *) context.ucontext()); 3675 } else { 3676 // NULL context is unexpected, double-check this is the VMThread. 3677 guarantee(thread->is_VM_thread(), "can only be called for VMThread"); 3678 } 3679 } 3680 3681 // Suspends the target using the signal mechanism and then grabs the PC before 3682 // resuming the target. Used by the flat-profiler only 3683 ExtendedPC os::get_thread_pc(Thread* thread) { 3684 // Make sure that it is called by the watcher for the VMThread. 3685 assert(Thread::current()->is_Watcher_thread(), "Must be watcher"); 3686 assert(thread->is_VM_thread(), "Can only be called for VMThread"); 3687 3688 PcFetcher fetcher(thread); 3689 fetcher.run(); 3690 return fetcher.result(); 3691 } 3692 3693 //////////////////////////////////////////////////////////////////////////////// 3694 // debug support 3695 3696 bool os::find(address addr, outputStream* st) { 3697 3698 st->print(PTR_FORMAT ": ", addr); 3699 3700 loaded_module_t lm; 3701 if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL || 3702 LoadedLibraries::find_for_data_address(addr, &lm) != NULL) { 3703 st->print_cr("%s", lm.path); 3704 return true; 3705 } 3706 3707 return false; 3708 } 3709 3710 //////////////////////////////////////////////////////////////////////////////// 3711 // misc 3712 3713 // This does not do anything on Aix. This is basically a hook for being 3714 // able to use structured exception handling (thread-local exception filters) 3715 // on, e.g., Win32. 3716 void 3717 os::os_exception_wrapper(java_call_t f, JavaValue* value, const methodHandle& method, 3718 JavaCallArguments* args, Thread* thread) { 3719 f(value, method, args, thread); 3720 } 3721 3722 void os::print_statistics() { 3723 } 3724 3725 bool os::message_box(const char* title, const char* message) { 3726 int i; 3727 fdStream err(defaultStream::error_fd()); 3728 for (i = 0; i < 78; i++) err.print_raw("="); 3729 err.cr(); 3730 err.print_raw_cr(title); 3731 for (i = 0; i < 78; i++) err.print_raw("-"); 3732 err.cr(); 3733 err.print_raw_cr(message); 3734 for (i = 0; i < 78; i++) err.print_raw("="); 3735 err.cr(); 3736 3737 char buf[16]; 3738 // Prevent process from exiting upon "read error" without consuming all CPU 3739 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); } 3740 3741 return buf[0] == 'y' || buf[0] == 'Y'; 3742 } 3743 3744 int os::stat(const char *path, struct stat *sbuf) { 3745 char pathbuf[MAX_PATH]; 3746 if (strlen(path) > MAX_PATH - 1) { 3747 errno = ENAMETOOLONG; 3748 return -1; 3749 } 3750 os::native_path(strcpy(pathbuf, path)); 3751 return ::stat(pathbuf, sbuf); 3752 } 3753 3754 // Is a (classpath) directory empty? 3755 bool os::dir_is_empty(const char* path) { 3756 DIR *dir = NULL; 3757 struct dirent *ptr; 3758 3759 dir = opendir(path); 3760 if (dir == NULL) return true; 3761 3762 /* Scan the directory */ 3763 bool result = true; 3764 char buf[sizeof(struct dirent) + MAX_PATH]; 3765 while (result && (ptr = ::readdir(dir)) != NULL) { 3766 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { 3767 result = false; 3768 } 3769 } 3770 closedir(dir); 3771 return result; 3772 } 3773 3774 // This code originates from JDK's sysOpen and open64_w 3775 // from src/solaris/hpi/src/system_md.c 3776 3777 int os::open(const char *path, int oflag, int mode) { 3778 3779 if (strlen(path) > MAX_PATH - 1) { 3780 errno = ENAMETOOLONG; 3781 return -1; 3782 } 3783 int fd; 3784 3785 fd = ::open64(path, oflag, mode); 3786 if (fd == -1) return -1; 3787 3788 // If the open succeeded, the file might still be a directory. 3789 { 3790 struct stat64 buf64; 3791 int ret = ::fstat64(fd, &buf64); 3792 int st_mode = buf64.st_mode; 3793 3794 if (ret != -1) { 3795 if ((st_mode & S_IFMT) == S_IFDIR) { 3796 errno = EISDIR; 3797 ::close(fd); 3798 return -1; 3799 } 3800 } else { 3801 ::close(fd); 3802 return -1; 3803 } 3804 } 3805 3806 // All file descriptors that are opened in the JVM and not 3807 // specifically destined for a subprocess should have the 3808 // close-on-exec flag set. If we don't set it, then careless 3rd 3809 // party native code might fork and exec without closing all 3810 // appropriate file descriptors (e.g. as we do in closeDescriptors in 3811 // UNIXProcess.c), and this in turn might: 3812 // 3813 // - cause end-of-file to fail to be detected on some file 3814 // descriptors, resulting in mysterious hangs, or 3815 // 3816 // - might cause an fopen in the subprocess to fail on a system 3817 // suffering from bug 1085341. 3818 // 3819 // (Yes, the default setting of the close-on-exec flag is a Unix 3820 // design flaw.) 3821 // 3822 // See: 3823 // 1085341: 32-bit stdio routines should support file descriptors >255 3824 // 4843136: (process) pipe file descriptor from Runtime.exec not being closed 3825 // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 3826 #ifdef FD_CLOEXEC 3827 { 3828 int flags = ::fcntl(fd, F_GETFD); 3829 if (flags != -1) 3830 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); 3831 } 3832 #endif 3833 3834 return fd; 3835 } 3836 3837 // create binary file, rewriting existing file if required 3838 int os::create_binary_file(const char* path, bool rewrite_existing) { 3839 int oflags = O_WRONLY | O_CREAT; 3840 if (!rewrite_existing) { 3841 oflags |= O_EXCL; 3842 } 3843 return ::open64(path, oflags, S_IREAD | S_IWRITE); 3844 } 3845 3846 // return current position of file pointer 3847 jlong os::current_file_offset(int fd) { 3848 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); 3849 } 3850 3851 // move file pointer to the specified offset 3852 jlong os::seek_to_file_offset(int fd, jlong offset) { 3853 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET); 3854 } 3855 3856 // This code originates from JDK's sysAvailable 3857 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c 3858 3859 int os::available(int fd, jlong *bytes) { 3860 jlong cur, end; 3861 int mode; 3862 struct stat64 buf64; 3863 3864 if (::fstat64(fd, &buf64) >= 0) { 3865 mode = buf64.st_mode; 3866 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { 3867 int n; 3868 if (::ioctl(fd, FIONREAD, &n) >= 0) { 3869 *bytes = n; 3870 return 1; 3871 } 3872 } 3873 } 3874 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) { 3875 return 0; 3876 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) { 3877 return 0; 3878 } else if (::lseek64(fd, cur, SEEK_SET) == -1) { 3879 return 0; 3880 } 3881 *bytes = end - cur; 3882 return 1; 3883 } 3884 3885 // Map a block of memory. 3886 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 3887 char *addr, size_t bytes, bool read_only, 3888 bool allow_exec) { 3889 int prot; 3890 int flags = MAP_PRIVATE; 3891 3892 if (read_only) { 3893 prot = PROT_READ; 3894 flags = MAP_SHARED; 3895 } else { 3896 prot = PROT_READ | PROT_WRITE; 3897 flags = MAP_PRIVATE; 3898 } 3899 3900 if (allow_exec) { 3901 prot |= PROT_EXEC; 3902 } 3903 3904 if (addr != NULL) { 3905 flags |= MAP_FIXED; 3906 } 3907 3908 // Allow anonymous mappings if 'fd' is -1. 3909 if (fd == -1) { 3910 flags |= MAP_ANONYMOUS; 3911 } 3912 3913 char* mapped_address = (char*)::mmap(addr, (size_t)bytes, prot, flags, 3914 fd, file_offset); 3915 if (mapped_address == MAP_FAILED) { 3916 return NULL; 3917 } 3918 return mapped_address; 3919 } 3920 3921 // Remap a block of memory. 3922 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 3923 char *addr, size_t bytes, bool read_only, 3924 bool allow_exec) { 3925 // same as map_memory() on this OS 3926 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, 3927 allow_exec); 3928 } 3929 3930 // Unmap a block of memory. 3931 bool os::pd_unmap_memory(char* addr, size_t bytes) { 3932 return munmap(addr, bytes) == 0; 3933 } 3934 3935 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 3936 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 3937 // of a thread. 3938 // 3939 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns 3940 // the fast estimate available on the platform. 3941 3942 jlong os::current_thread_cpu_time() { 3943 // return user + sys since the cost is the same 3944 const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */); 3945 assert(n >= 0, "negative CPU time"); 3946 return n; 3947 } 3948 3949 jlong os::thread_cpu_time(Thread* thread) { 3950 // consistent with what current_thread_cpu_time() returns 3951 const jlong n = os::thread_cpu_time(thread, true /* user + sys */); 3952 assert(n >= 0, "negative CPU time"); 3953 return n; 3954 } 3955 3956 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 3957 const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 3958 assert(n >= 0, "negative CPU time"); 3959 return n; 3960 } 3961 3962 static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) { 3963 bool error = false; 3964 3965 jlong sys_time = 0; 3966 jlong user_time = 0; 3967 3968 // Reimplemented using getthrds64(). 3969 // 3970 // Works like this: 3971 // For the thread in question, get the kernel thread id. Then get the 3972 // kernel thread statistics using that id. 3973 // 3974 // This only works of course when no pthread scheduling is used, 3975 // i.e. there is a 1:1 relationship to kernel threads. 3976 // On AIX, see AIXTHREAD_SCOPE variable. 3977 3978 pthread_t pthtid = thread->osthread()->pthread_id(); 3979 3980 // retrieve kernel thread id for the pthread: 3981 tid64_t tid = 0; 3982 struct __pthrdsinfo pinfo; 3983 // I just love those otherworldly IBM APIs which force me to hand down 3984 // dummy buffers for stuff I dont care for... 3985 char dummy[1]; 3986 int dummy_size = sizeof(dummy); 3987 if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo), 3988 dummy, &dummy_size) == 0) { 3989 tid = pinfo.__pi_tid; 3990 } else { 3991 tty->print_cr("pthread_getthrds_np failed."); 3992 error = true; 3993 } 3994 3995 // retrieve kernel timing info for that kernel thread 3996 if (!error) { 3997 struct thrdentry64 thrdentry; 3998 if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) { 3999 sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL; 4000 user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL; 4001 } else { 4002 tty->print_cr("pthread_getthrds_np failed."); 4003 error = true; 4004 } 4005 } 4006 4007 if (p_sys_time) { 4008 *p_sys_time = sys_time; 4009 } 4010 4011 if (p_user_time) { 4012 *p_user_time = user_time; 4013 } 4014 4015 if (error) { 4016 return false; 4017 } 4018 4019 return true; 4020 } 4021 4022 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { 4023 jlong sys_time; 4024 jlong user_time; 4025 4026 if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) { 4027 return -1; 4028 } 4029 4030 return user_sys_cpu_time ? sys_time + user_time : user_time; 4031 } 4032 4033 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4034 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 4035 info_ptr->may_skip_backward = false; // elapsed time not wall time 4036 info_ptr->may_skip_forward = false; // elapsed time not wall time 4037 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4038 } 4039 4040 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4041 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits 4042 info_ptr->may_skip_backward = false; // elapsed time not wall time 4043 info_ptr->may_skip_forward = false; // elapsed time not wall time 4044 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4045 } 4046 4047 bool os::is_thread_cpu_time_supported() { 4048 return true; 4049 } 4050 4051 // System loadavg support. Returns -1 if load average cannot be obtained. 4052 // For now just return the system wide load average (no processor sets). 4053 int os::loadavg(double values[], int nelem) { 4054 4055 guarantee(nelem >= 0 && nelem <= 3, "argument error"); 4056 guarantee(values, "argument error"); 4057 4058 if (os::Aix::on_pase()) { 4059 4060 // AS/400 PASE: use libo4 porting library 4061 double v[3] = { 0.0, 0.0, 0.0 }; 4062 4063 if (libo4::get_load_avg(v, v + 1, v + 2)) { 4064 for (int i = 0; i < nelem; i ++) { 4065 values[i] = v[i]; 4066 } 4067 return nelem; 4068 } else { 4069 return -1; 4070 } 4071 4072 } else { 4073 4074 // AIX: use libperfstat 4075 libperfstat::cpuinfo_t ci; 4076 if (libperfstat::get_cpuinfo(&ci)) { 4077 for (int i = 0; i < nelem; i++) { 4078 values[i] = ci.loadavg[i]; 4079 } 4080 } else { 4081 return -1; 4082 } 4083 return nelem; 4084 } 4085 } 4086 4087 void os::pause() { 4088 char filename[MAX_PATH]; 4089 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4090 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4091 } else { 4092 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4093 } 4094 4095 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4096 if (fd != -1) { 4097 struct stat buf; 4098 ::close(fd); 4099 while (::stat(filename, &buf) == 0) { 4100 (void)::poll(NULL, 0, 100); 4101 } 4102 } else { 4103 trcVerbose("Could not open pause file '%s', continuing immediately.", filename); 4104 } 4105 } 4106 4107 bool os::Aix::is_primordial_thread() { 4108 if (pthread_self() == (pthread_t)1) { 4109 return true; 4110 } else { 4111 return false; 4112 } 4113 } 4114 4115 // OS recognitions (PASE/AIX, OS level) call this before calling any 4116 // one of Aix::on_pase(), Aix::os_version() static 4117 void os::Aix::initialize_os_info() { 4118 4119 assert(_on_pase == -1 && _os_version == 0, "already called."); 4120 4121 struct utsname uts; 4122 memset(&uts, 0, sizeof(uts)); 4123 strcpy(uts.sysname, "?"); 4124 if (::uname(&uts) == -1) { 4125 trcVerbose("uname failed (%d)", errno); 4126 guarantee(0, "Could not determine whether we run on AIX or PASE"); 4127 } else { 4128 trcVerbose("uname says: sysname \"%s\" version \"%s\" release \"%s\" " 4129 "node \"%s\" machine \"%s\"\n", 4130 uts.sysname, uts.version, uts.release, uts.nodename, uts.machine); 4131 const int major = atoi(uts.version); 4132 assert(major > 0, "invalid OS version"); 4133 const int minor = atoi(uts.release); 4134 assert(minor > 0, "invalid OS release"); 4135 _os_version = (major << 24) | (minor << 16); 4136 char ver_str[20] = {0}; 4137 char *name_str = "unknown OS"; 4138 if (strcmp(uts.sysname, "OS400") == 0) { 4139 // We run on AS/400 PASE. We do not support versions older than V5R4M0. 4140 _on_pase = 1; 4141 if (os_version_short() < 0x0504) { 4142 trcVerbose("OS/400 releases older than V5R4M0 not supported."); 4143 assert(false, "OS/400 release too old."); 4144 } 4145 name_str = "OS/400 (pase)"; 4146 jio_snprintf(ver_str, sizeof(ver_str), "%u.%u", major, minor); 4147 } else if (strcmp(uts.sysname, "AIX") == 0) { 4148 // We run on AIX. We do not support versions older than AIX 5.3. 4149 _on_pase = 0; 4150 // Determine detailed AIX version: Version, Release, Modification, Fix Level. 4151 odmWrapper::determine_os_kernel_version(&_os_version); 4152 if (os_version_short() < 0x0503) { 4153 trcVerbose("AIX release older than AIX 5.3 not supported."); 4154 assert(false, "AIX release too old."); 4155 } 4156 name_str = "AIX"; 4157 jio_snprintf(ver_str, sizeof(ver_str), "%u.%u.%u.%u", 4158 major, minor, (_os_version >> 8) & 0xFF, _os_version & 0xFF); 4159 } else { 4160 assert(false, name_str); 4161 } 4162 trcVerbose("We run on %s %s", name_str, ver_str); 4163 } 4164 4165 guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release"); 4166 } // end: os::Aix::initialize_os_info() 4167 4168 // Scan environment for important settings which might effect the VM. 4169 // Trace out settings. Warn about invalid settings and/or correct them. 4170 // 4171 // Must run after os::Aix::initialue_os_info(). 4172 void os::Aix::scan_environment() { 4173 4174 char* p; 4175 int rc; 4176 4177 // Warn explicity if EXTSHM=ON is used. That switch changes how 4178 // System V shared memory behaves. One effect is that page size of 4179 // shared memory cannot be change dynamically, effectivly preventing 4180 // large pages from working. 4181 // This switch was needed on AIX 32bit, but on AIX 64bit the general 4182 // recommendation is (in OSS notes) to switch it off. 4183 p = ::getenv("EXTSHM"); 4184 trcVerbose("EXTSHM=%s.", p ? p : "<unset>"); 4185 if (p && strcasecmp(p, "ON") == 0) { 4186 _extshm = 1; 4187 trcVerbose("*** Unsupported mode! Please remove EXTSHM from your environment! ***"); 4188 if (!AllowExtshm) { 4189 // We allow under certain conditions the user to continue. However, we want this 4190 // to be a fatal error by default. On certain AIX systems, leaving EXTSHM=ON means 4191 // that the VM is not able to allocate 64k pages for the heap. 4192 // We do not want to run with reduced performance. 4193 vm_exit_during_initialization("EXTSHM is ON. Please remove EXTSHM from your environment."); 4194 } 4195 } else { 4196 _extshm = 0; 4197 } 4198 4199 // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs. 4200 // Not tested, not supported. 4201 // 4202 // Note that it might be worth the trouble to test and to require it, if only to 4203 // get useful return codes for mprotect. 4204 // 4205 // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before 4206 // exec() ? before loading the libjvm ? ....) 4207 p = ::getenv("XPG_SUS_ENV"); 4208 trcVerbose("XPG_SUS_ENV=%s.", p ? p : "<unset>"); 4209 if (p && strcmp(p, "ON") == 0) { 4210 _xpg_sus_mode = 1; 4211 trcVerbose("Unsupported setting: XPG_SUS_ENV=ON"); 4212 // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to 4213 // clobber address ranges. If we ever want to support that, we have to do some 4214 // testing first. 4215 guarantee(false, "XPG_SUS_ENV=ON not supported"); 4216 } else { 4217 _xpg_sus_mode = 0; 4218 } 4219 4220 if (os::Aix::on_pase()) { 4221 p = ::getenv("QIBM_MULTI_THREADED"); 4222 trcVerbose("QIBM_MULTI_THREADED=%s.", p ? p : "<unset>"); 4223 } 4224 4225 p = ::getenv("LDR_CNTRL"); 4226 trcVerbose("LDR_CNTRL=%s.", p ? p : "<unset>"); 4227 if (os::Aix::on_pase() && os::Aix::os_version_short() == 0x0701) { 4228 if (p && ::strstr(p, "TEXTPSIZE")) { 4229 trcVerbose("*** WARNING - LDR_CNTRL contains TEXTPSIZE. " 4230 "you may experience hangs or crashes on OS/400 V7R1."); 4231 } 4232 } 4233 4234 p = ::getenv("AIXTHREAD_GUARDPAGES"); 4235 trcVerbose("AIXTHREAD_GUARDPAGES=%s.", p ? p : "<unset>"); 4236 4237 } // end: os::Aix::scan_environment() 4238 4239 // PASE: initialize the libo4 library (PASE porting library). 4240 void os::Aix::initialize_libo4() { 4241 guarantee(os::Aix::on_pase(), "OS/400 only."); 4242 if (!libo4::init()) { 4243 trcVerbose("libo4 initialization failed."); 4244 assert(false, "libo4 initialization failed"); 4245 } else { 4246 trcVerbose("libo4 initialized."); 4247 } 4248 } 4249 4250 // AIX: initialize the libperfstat library. 4251 void os::Aix::initialize_libperfstat() { 4252 assert(os::Aix::on_aix(), "AIX only"); 4253 if (!libperfstat::init()) { 4254 trcVerbose("libperfstat initialization failed."); 4255 assert(false, "libperfstat initialization failed"); 4256 } else { 4257 trcVerbose("libperfstat initialized."); 4258 } 4259 } 4260 4261 ///////////////////////////////////////////////////////////////////////////// 4262 // thread stack 4263 4264 // Function to query the current stack size using pthread_getthrds_np. 4265 static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) { 4266 // This only works when invoked on a pthread. As we agreed not to use 4267 // primordial threads anyway, I assert here. 4268 guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread"); 4269 4270 // Information about this api can be found (a) in the pthread.h header and 4271 // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm 4272 // 4273 // The use of this API to find out the current stack is kind of undefined. 4274 // But after a lot of tries and asking IBM about it, I concluded that it is safe 4275 // enough for cases where I let the pthread library create its stacks. For cases 4276 // where I create an own stack and pass this to pthread_create, it seems not to 4277 // work (the returned stack size in that case is 0). 4278 4279 pthread_t tid = pthread_self(); 4280 struct __pthrdsinfo pinfo; 4281 char dummy[1]; // Just needed to satisfy pthread_getthrds_np. 4282 int dummy_size = sizeof(dummy); 4283 4284 memset(&pinfo, 0, sizeof(pinfo)); 4285 4286 const int rc = pthread_getthrds_np(&tid, PTHRDSINFO_QUERY_ALL, &pinfo, 4287 sizeof(pinfo), dummy, &dummy_size); 4288 4289 if (rc != 0) { 4290 assert0(false); 4291 trcVerbose("pthread_getthrds_np failed (%d)", rc); 4292 return false; 4293 } 4294 guarantee0(pinfo.__pi_stackend); 4295 4296 // The following may happen when invoking pthread_getthrds_np on a pthread 4297 // running on a user provided stack (when handing down a stack to pthread 4298 // create, see pthread_attr_setstackaddr). 4299 // Not sure what to do then. 4300 4301 guarantee0(pinfo.__pi_stacksize); 4302 4303 // Note: we get three values from pthread_getthrds_np: 4304 // __pi_stackaddr, __pi_stacksize, __pi_stackend 4305 // 4306 // high addr --------------------- 4307 // 4308 // | pthread internal data, like ~2K 4309 // | 4310 // | --------------------- __pi_stackend (usually not page aligned, (xxxxF890)) 4311 // | 4312 // | 4313 // | 4314 // | 4315 // | 4316 // | 4317 // | --------------------- (__pi_stackend - __pi_stacksize) 4318 // | 4319 // | padding to align the following AIX guard pages, if enabled. 4320 // | 4321 // V --------------------- __pi_stackaddr 4322 // 4323 // low addr AIX guard pages, if enabled (AIXTHREAD_GUARDPAGES > 0) 4324 // 4325 4326 address stack_base = (address)(pinfo.__pi_stackend); 4327 address stack_low_addr = (address)align_ptr_up(pinfo.__pi_stackaddr, 4328 os::vm_page_size()); 4329 size_t stack_size = stack_base - stack_low_addr; 4330 4331 if (p_stack_base) { 4332 *p_stack_base = stack_base; 4333 } 4334 4335 if (p_stack_size) { 4336 *p_stack_size = stack_size; 4337 } 4338 4339 return true; 4340 } 4341 4342 // Get the current stack base from the OS (actually, the pthread library). 4343 address os::current_stack_base() { 4344 address p; 4345 query_stack_dimensions(&p, 0); 4346 return p; 4347 } 4348 4349 // Get the current stack size from the OS (actually, the pthread library). 4350 size_t os::current_stack_size() { 4351 size_t s; 4352 query_stack_dimensions(0, &s); 4353 return s; 4354 } 4355 4356 // Refer to the comments in os_solaris.cpp park-unpark. 4357 4358 // utility to compute the abstime argument to timedwait: 4359 // millis is the relative timeout time 4360 // abstime will be the absolute timeout time 4361 // TODO: replace compute_abstime() with unpackTime() 4362 4363 static struct timespec* compute_abstime(timespec* abstime, jlong millis) { 4364 if (millis < 0) millis = 0; 4365 struct timeval now; 4366 int status = gettimeofday(&now, NULL); 4367 assert(status == 0, "gettimeofday"); 4368 jlong seconds = millis / 1000; 4369 millis %= 1000; 4370 if (seconds > 50000000) { // see man cond_timedwait(3T) 4371 seconds = 50000000; 4372 } 4373 abstime->tv_sec = now.tv_sec + seconds; 4374 long usec = now.tv_usec + millis * 1000; 4375 if (usec >= 1000000) { 4376 abstime->tv_sec += 1; 4377 usec -= 1000000; 4378 } 4379 abstime->tv_nsec = usec * 1000; 4380 return abstime; 4381 } 4382 4383 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately. 4384 // Conceptually TryPark() should be equivalent to park(0). 4385 4386 int os::PlatformEvent::TryPark() { 4387 for (;;) { 4388 const int v = _Event; 4389 guarantee ((v == 0) || (v == 1), "invariant"); 4390 if (Atomic::cmpxchg (0, &_Event, v) == v) return v; 4391 } 4392 } 4393 4394 void os::PlatformEvent::park() { // AKA "down()" 4395 // Invariant: Only the thread associated with the Event/PlatformEvent 4396 // may call park(). 4397 // TODO: assert that _Assoc != NULL or _Assoc == Self 4398 int v; 4399 for (;;) { 4400 v = _Event; 4401 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; 4402 } 4403 guarantee (v >= 0, "invariant"); 4404 if (v == 0) { 4405 // Do this the hard way by blocking ... 4406 int status = pthread_mutex_lock(_mutex); 4407 assert_status(status == 0, status, "mutex_lock"); 4408 guarantee (_nParked == 0, "invariant"); 4409 ++ _nParked; 4410 while (_Event < 0) { 4411 status = pthread_cond_wait(_cond, _mutex); 4412 assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait"); 4413 } 4414 -- _nParked; 4415 4416 // In theory we could move the ST of 0 into _Event past the unlock(), 4417 // but then we'd need a MEMBAR after the ST. 4418 _Event = 0; 4419 status = pthread_mutex_unlock(_mutex); 4420 assert_status(status == 0, status, "mutex_unlock"); 4421 } 4422 guarantee (_Event >= 0, "invariant"); 4423 } 4424 4425 int os::PlatformEvent::park(jlong millis) { 4426 guarantee (_nParked == 0, "invariant"); 4427 4428 int v; 4429 for (;;) { 4430 v = _Event; 4431 if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; 4432 } 4433 guarantee (v >= 0, "invariant"); 4434 if (v != 0) return OS_OK; 4435 4436 // We do this the hard way, by blocking the thread. 4437 // Consider enforcing a minimum timeout value. 4438 struct timespec abst; 4439 compute_abstime(&abst, millis); 4440 4441 int ret = OS_TIMEOUT; 4442 int status = pthread_mutex_lock(_mutex); 4443 assert_status(status == 0, status, "mutex_lock"); 4444 guarantee (_nParked == 0, "invariant"); 4445 ++_nParked; 4446 4447 // Object.wait(timo) will return because of 4448 // (a) notification 4449 // (b) timeout 4450 // (c) thread.interrupt 4451 // 4452 // Thread.interrupt and object.notify{All} both call Event::set. 4453 // That is, we treat thread.interrupt as a special case of notification. 4454 // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false. 4455 // We assume all ETIME returns are valid. 4456 // 4457 // TODO: properly differentiate simultaneous notify+interrupt. 4458 // In that case, we should propagate the notify to another waiter. 4459 4460 while (_Event < 0) { 4461 status = pthread_cond_timedwait(_cond, _mutex, &abst); 4462 assert_status(status == 0 || status == ETIMEDOUT, 4463 status, "cond_timedwait"); 4464 if (!FilterSpuriousWakeups) break; // previous semantics 4465 if (status == ETIMEDOUT) break; 4466 // We consume and ignore EINTR and spurious wakeups. 4467 } 4468 --_nParked; 4469 if (_Event >= 0) { 4470 ret = OS_OK; 4471 } 4472 _Event = 0; 4473 status = pthread_mutex_unlock(_mutex); 4474 assert_status(status == 0, status, "mutex_unlock"); 4475 assert (_nParked == 0, "invariant"); 4476 return ret; 4477 } 4478 4479 void os::PlatformEvent::unpark() { 4480 int v, AnyWaiters; 4481 for (;;) { 4482 v = _Event; 4483 if (v > 0) { 4484 // The LD of _Event could have reordered or be satisfied 4485 // by a read-aside from this processor's write buffer. 4486 // To avoid problems execute a barrier and then 4487 // ratify the value. 4488 OrderAccess::fence(); 4489 if (_Event == v) return; 4490 continue; 4491 } 4492 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break; 4493 } 4494 if (v < 0) { 4495 // Wait for the thread associated with the event to vacate 4496 int status = pthread_mutex_lock(_mutex); 4497 assert_status(status == 0, status, "mutex_lock"); 4498 AnyWaiters = _nParked; 4499 4500 if (AnyWaiters != 0) { 4501 // We intentional signal *after* dropping the lock 4502 // to avoid a common class of futile wakeups. 4503 status = pthread_cond_signal(_cond); 4504 assert_status(status == 0, status, "cond_signal"); 4505 } 4506 // Mutex should be locked for pthread_cond_signal(_cond). 4507 status = pthread_mutex_unlock(_mutex); 4508 assert_status(status == 0, status, "mutex_unlock"); 4509 } 4510 4511 // Note that we signal() _after dropping the lock for "immortal" Events. 4512 // This is safe and avoids a common class of futile wakeups. In rare 4513 // circumstances this can cause a thread to return prematurely from 4514 // cond_{timed}wait() but the spurious wakeup is benign and the victim will 4515 // simply re-test the condition and re-park itself. 4516 } 4517 4518 4519 // JSR166 4520 // ------------------------------------------------------- 4521 4522 // 4523 // The solaris and linux implementations of park/unpark are fairly 4524 // conservative for now, but can be improved. They currently use a 4525 // mutex/condvar pair, plus a a count. 4526 // Park decrements count if > 0, else does a condvar wait. Unpark 4527 // sets count to 1 and signals condvar. Only one thread ever waits 4528 // on the condvar. Contention seen when trying to park implies that someone 4529 // is unparking you, so don't wait. And spurious returns are fine, so there 4530 // is no need to track notifications. 4531 // 4532 4533 #define MAX_SECS 100000000 4534 // 4535 // This code is common to linux and solaris and will be moved to a 4536 // common place in dolphin. 4537 // 4538 // The passed in time value is either a relative time in nanoseconds 4539 // or an absolute time in milliseconds. Either way it has to be unpacked 4540 // into suitable seconds and nanoseconds components and stored in the 4541 // given timespec structure. 4542 // Given time is a 64-bit value and the time_t used in the timespec is only 4543 // a signed-32-bit value (except on 64-bit Linux) we have to watch for 4544 // overflow if times way in the future are given. Further on Solaris versions 4545 // prior to 10 there is a restriction (see cond_timedwait) that the specified 4546 // number of seconds, in abstime, is less than current_time + 100,000,000. 4547 // As it will be 28 years before "now + 100000000" will overflow we can 4548 // ignore overflow and just impose a hard-limit on seconds using the value 4549 // of "now + 100,000,000". This places a limit on the timeout of about 3.17 4550 // years from "now". 4551 // 4552 4553 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) { 4554 assert (time > 0, "convertTime"); 4555 4556 struct timeval now; 4557 int status = gettimeofday(&now, NULL); 4558 assert(status == 0, "gettimeofday"); 4559 4560 time_t max_secs = now.tv_sec + MAX_SECS; 4561 4562 if (isAbsolute) { 4563 jlong secs = time / 1000; 4564 if (secs > max_secs) { 4565 absTime->tv_sec = max_secs; 4566 } 4567 else { 4568 absTime->tv_sec = secs; 4569 } 4570 absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC; 4571 } 4572 else { 4573 jlong secs = time / NANOSECS_PER_SEC; 4574 if (secs >= MAX_SECS) { 4575 absTime->tv_sec = max_secs; 4576 absTime->tv_nsec = 0; 4577 } 4578 else { 4579 absTime->tv_sec = now.tv_sec + secs; 4580 absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000; 4581 if (absTime->tv_nsec >= NANOSECS_PER_SEC) { 4582 absTime->tv_nsec -= NANOSECS_PER_SEC; 4583 ++absTime->tv_sec; // note: this must be <= max_secs 4584 } 4585 } 4586 } 4587 assert(absTime->tv_sec >= 0, "tv_sec < 0"); 4588 assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs"); 4589 assert(absTime->tv_nsec >= 0, "tv_nsec < 0"); 4590 assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec"); 4591 } 4592 4593 void Parker::park(bool isAbsolute, jlong time) { 4594 // Optional fast-path check: 4595 // Return immediately if a permit is available. 4596 if (_counter > 0) { 4597 _counter = 0; 4598 OrderAccess::fence(); 4599 return; 4600 } 4601 4602 Thread* thread = Thread::current(); 4603 assert(thread->is_Java_thread(), "Must be JavaThread"); 4604 JavaThread *jt = (JavaThread *)thread; 4605 4606 // Optional optimization -- avoid state transitions if there's an interrupt pending. 4607 // Check interrupt before trying to wait 4608 if (Thread::is_interrupted(thread, false)) { 4609 return; 4610 } 4611 4612 // Next, demultiplex/decode time arguments 4613 timespec absTime; 4614 if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all 4615 return; 4616 } 4617 if (time > 0) { 4618 unpackTime(&absTime, isAbsolute, time); 4619 } 4620 4621 // Enter safepoint region 4622 // Beware of deadlocks such as 6317397. 4623 // The per-thread Parker:: mutex is a classic leaf-lock. 4624 // In particular a thread must never block on the Threads_lock while 4625 // holding the Parker:: mutex. If safepoints are pending both the 4626 // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock. 4627 ThreadBlockInVM tbivm(jt); 4628 4629 // Don't wait if cannot get lock since interference arises from 4630 // unblocking. Also. check interrupt before trying wait 4631 if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) { 4632 return; 4633 } 4634 4635 int status; 4636 if (_counter > 0) { // no wait needed 4637 _counter = 0; 4638 status = pthread_mutex_unlock(_mutex); 4639 assert (status == 0, "invariant"); 4640 OrderAccess::fence(); 4641 return; 4642 } 4643 4644 #ifdef ASSERT 4645 // Don't catch signals while blocked; let the running threads have the signals. 4646 // (This allows a debugger to break into the running thread.) 4647 sigset_t oldsigs; 4648 sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals(); 4649 pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs); 4650 #endif 4651 4652 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 4653 jt->set_suspend_equivalent(); 4654 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 4655 4656 if (time == 0) { 4657 status = pthread_cond_wait (_cond, _mutex); 4658 } else { 4659 status = pthread_cond_timedwait (_cond, _mutex, &absTime); 4660 } 4661 assert_status(status == 0 || status == EINTR || 4662 status == ETIME || status == ETIMEDOUT, 4663 status, "cond_timedwait"); 4664 4665 #ifdef ASSERT 4666 pthread_sigmask(SIG_SETMASK, &oldsigs, NULL); 4667 #endif 4668 4669 _counter = 0; 4670 status = pthread_mutex_unlock(_mutex); 4671 assert_status(status == 0, status, "invariant"); 4672 // If externally suspended while waiting, re-suspend 4673 if (jt->handle_special_suspend_equivalent_condition()) { 4674 jt->java_suspend_self(); 4675 } 4676 4677 OrderAccess::fence(); 4678 } 4679 4680 void Parker::unpark() { 4681 int s, status; 4682 status = pthread_mutex_lock(_mutex); 4683 assert (status == 0, "invariant"); 4684 s = _counter; 4685 _counter = 1; 4686 if (s < 1) { 4687 status = pthread_mutex_unlock(_mutex); 4688 assert (status == 0, "invariant"); 4689 status = pthread_cond_signal (_cond); 4690 assert (status == 0, "invariant"); 4691 } else { 4692 pthread_mutex_unlock(_mutex); 4693 assert (status == 0, "invariant"); 4694 } 4695 } 4696 4697 extern char** environ; 4698 4699 // Run the specified command in a separate process. Return its exit value, 4700 // or -1 on failure (e.g. can't fork a new process). 4701 // Unlike system(), this function can be called from signal handler. It 4702 // doesn't block SIGINT et al. 4703 int os::fork_and_exec(char* cmd) { 4704 char * argv[4] = {"sh", "-c", cmd, NULL}; 4705 4706 pid_t pid = fork(); 4707 4708 if (pid < 0) { 4709 // fork failed 4710 return -1; 4711 4712 } else if (pid == 0) { 4713 // child process 4714 4715 // Try to be consistent with system(), which uses "/usr/bin/sh" on AIX. 4716 execve("/usr/bin/sh", argv, environ); 4717 4718 // execve failed 4719 _exit(-1); 4720 4721 } else { 4722 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't 4723 // care about the actual exit code, for now. 4724 4725 int status; 4726 4727 // Wait for the child process to exit. This returns immediately if 4728 // the child has already exited. */ 4729 while (waitpid(pid, &status, 0) < 0) { 4730 switch (errno) { 4731 case ECHILD: return 0; 4732 case EINTR: break; 4733 default: return -1; 4734 } 4735 } 4736 4737 if (WIFEXITED(status)) { 4738 // The child exited normally; get its exit code. 4739 return WEXITSTATUS(status); 4740 } else if (WIFSIGNALED(status)) { 4741 // The child exited because of a signal. 4742 // The best value to return is 0x80 + signal number, 4743 // because that is what all Unix shells do, and because 4744 // it allows callers to distinguish between process exit and 4745 // process death by signal. 4746 return 0x80 + WTERMSIG(status); 4747 } else { 4748 // Unknown exit code; pass it through. 4749 return status; 4750 } 4751 } 4752 return -1; 4753 } 4754 4755 // is_headless_jre() 4756 // 4757 // Test for the existence of xawt/libmawt.so or libawt_xawt.so 4758 // in order to report if we are running in a headless jre. 4759 // 4760 // Since JDK8 xawt/libmawt.so is moved into the same directory 4761 // as libawt.so, and renamed libawt_xawt.so 4762 bool os::is_headless_jre() { 4763 struct stat statbuf; 4764 char buf[MAXPATHLEN]; 4765 char libmawtpath[MAXPATHLEN]; 4766 const char *xawtstr = "/xawt/libmawt.so"; 4767 const char *new_xawtstr = "/libawt_xawt.so"; 4768 4769 char *p; 4770 4771 // Get path to libjvm.so 4772 os::jvm_path(buf, sizeof(buf)); 4773 4774 // Get rid of libjvm.so 4775 p = strrchr(buf, '/'); 4776 if (p == NULL) return false; 4777 else *p = '\0'; 4778 4779 // Get rid of client or server 4780 p = strrchr(buf, '/'); 4781 if (p == NULL) return false; 4782 else *p = '\0'; 4783 4784 // check xawt/libmawt.so 4785 strcpy(libmawtpath, buf); 4786 strcat(libmawtpath, xawtstr); 4787 if (::stat(libmawtpath, &statbuf) == 0) return false; 4788 4789 // check libawt_xawt.so 4790 strcpy(libmawtpath, buf); 4791 strcat(libmawtpath, new_xawtstr); 4792 if (::stat(libmawtpath, &statbuf) == 0) return false; 4793 4794 return true; 4795 } 4796 4797 // Get the default path to the core file 4798 // Returns the length of the string 4799 int os::get_core_path(char* buffer, size_t bufferSize) { 4800 const char* p = get_current_directory(buffer, bufferSize); 4801 4802 if (p == NULL) { 4803 assert(p != NULL, "failed to get current directory"); 4804 return 0; 4805 } 4806 4807 jio_snprintf(buffer, bufferSize, "%s/core or core.%d", 4808 p, current_process_id()); 4809 4810 return strlen(buffer); 4811 } 4812 4813 #ifndef PRODUCT 4814 void TestReserveMemorySpecial_test() { 4815 // No tests available for this platform 4816 } 4817 #endif 4818 4819 bool os::start_debugging(char *buf, int buflen) { 4820 int len = (int)strlen(buf); 4821 char *p = &buf[len]; 4822 4823 jio_snprintf(p, buflen -len, 4824 "\n\n" 4825 "Do you want to debug the problem?\n\n" 4826 "To debug, run 'dbx -a %d'; then switch to thread tid " INTX_FORMAT ", k-tid " INTX_FORMAT "\n" 4827 "Enter 'yes' to launch dbx automatically (PATH must include dbx)\n" 4828 "Otherwise, press RETURN to abort...", 4829 os::current_process_id(), 4830 os::current_thread_id(), thread_self()); 4831 4832 bool yes = os::message_box("Unexpected Error", buf); 4833 4834 if (yes) { 4835 // yes, user asked VM to launch debugger 4836 jio_snprintf(buf, buflen, "dbx -a %d", os::current_process_id()); 4837 4838 os::fork_and_exec(buf); 4839 yes = false; 4840 } 4841 return yes; 4842 } 4843 4844 static inline time_t get_mtime(const char* filename) { 4845 struct stat st; 4846 int ret = os::stat(filename, &st); 4847 assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno)); 4848 return st.st_mtime; 4849 } 4850 4851 int os::compare_file_modified_times(const char* file1, const char* file2) { 4852 time_t t1 = get_mtime(file1); 4853 time_t t2 = get_mtime(file2); 4854 return t1 - t2; 4855 }