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