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