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