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