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