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, &param);
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, &param);
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 }