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