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