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