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