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