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