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