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