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