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