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