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