1 /*
   2  * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 // no precompiled headers
  26 #include "classfile/classLoader.hpp"
  27 #include "classfile/systemDictionary.hpp"
  28 #include "classfile/vmSymbols.hpp"
  29 #include "code/icBuffer.hpp"
  30 #include "code/vtableStubs.hpp"
  31 #include "compiler/compileBroker.hpp"
  32 #include "compiler/disassembler.hpp"
  33 #include "interpreter/interpreter.hpp"
  34 #include "jvm_solaris.h"
  35 #include "memory/allocation.inline.hpp"
  36 #include "memory/filemap.hpp"
  37 #include "mutex_solaris.inline.hpp"
  38 #include "oops/oop.inline.hpp"
  39 #include "os_share_solaris.hpp"
  40 #include "os_solaris.inline.hpp"
  41 #include "prims/jniFastGetField.hpp"
  42 #include "prims/jvm.h"
  43 #include "prims/jvm_misc.hpp"
  44 #include "runtime/arguments.hpp"
  45 #include "runtime/atomic.inline.hpp"
  46 #include "runtime/extendedPC.hpp"
  47 #include "runtime/globals.hpp"
  48 #include "runtime/interfaceSupport.hpp"
  49 #include "runtime/java.hpp"
  50 #include "runtime/javaCalls.hpp"
  51 #include "runtime/mutexLocker.hpp"
  52 #include "runtime/objectMonitor.hpp"
  53 #include "runtime/orderAccess.inline.hpp"
  54 #include "runtime/osThread.hpp"
  55 #include "runtime/perfMemory.hpp"
  56 #include "runtime/sharedRuntime.hpp"
  57 #include "runtime/statSampler.hpp"
  58 #include "runtime/stubRoutines.hpp"
  59 #include "runtime/thread.inline.hpp"
  60 #include "runtime/threadCritical.hpp"
  61 #include "runtime/timer.hpp"
  62 #include "runtime/vm_version.hpp"
  63 #include "semaphore_posix.hpp"
  64 #include "services/attachListener.hpp"
  65 #include "services/memTracker.hpp"
  66 #include "services/runtimeService.hpp"
  67 #include "utilities/decoder.hpp"
  68 #include "utilities/defaultStream.hpp"
  69 #include "utilities/events.hpp"
  70 #include "utilities/growableArray.hpp"
  71 #include "utilities/vmError.hpp"
  72 
  73 // put OS-includes here
  74 # include <dlfcn.h>
  75 # include <errno.h>
  76 # include <exception>
  77 # include <link.h>
  78 # include <poll.h>
  79 # include <pthread.h>
  80 # include <pwd.h>
  81 # include <schedctl.h>
  82 # include <setjmp.h>
  83 # include <signal.h>
  84 # include <stdio.h>
  85 # include <alloca.h>
  86 # include <sys/filio.h>
  87 # include <sys/ipc.h>
  88 # include <sys/lwp.h>
  89 # include <sys/machelf.h>     // for elf Sym structure used by dladdr1
  90 # include <sys/mman.h>
  91 # include <sys/processor.h>
  92 # include <sys/procset.h>
  93 # include <sys/pset.h>
  94 # include <sys/resource.h>
  95 # include <sys/shm.h>
  96 # include <sys/socket.h>
  97 # include <sys/stat.h>
  98 # include <sys/systeminfo.h>
  99 # include <sys/time.h>
 100 # include <sys/times.h>
 101 # include <sys/types.h>
 102 # include <sys/wait.h>
 103 # include <sys/utsname.h>
 104 # include <thread.h>
 105 # include <unistd.h>
 106 # include <sys/priocntl.h>
 107 # include <sys/rtpriocntl.h>
 108 # include <sys/tspriocntl.h>
 109 # include <sys/iapriocntl.h>
 110 # include <sys/fxpriocntl.h>
 111 # include <sys/loadavg.h>
 112 # include <string.h>
 113 # include <stdio.h>
 114 
 115 # define _STRUCTURED_PROC 1  //  this gets us the new structured proc interfaces of 5.6 & later
 116 # include <sys/procfs.h>     //  see comment in <sys/procfs.h>
 117 
 118 #define MAX_PATH (2 * K)
 119 
 120 // for timer info max values which include all bits
 121 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
 122 
 123 
 124 // Here are some liblgrp types from sys/lgrp_user.h to be able to
 125 // compile on older systems without this header file.
 126 
 127 #ifndef MADV_ACCESS_LWP
 128   #define  MADV_ACCESS_LWP   7       /* next LWP to access heavily */
 129 #endif
 130 #ifndef MADV_ACCESS_MANY
 131   #define  MADV_ACCESS_MANY  8       /* many processes to access heavily */
 132 #endif
 133 
 134 #ifndef LGRP_RSRC_CPU
 135   #define LGRP_RSRC_CPU      0       /* CPU resources */
 136 #endif
 137 #ifndef LGRP_RSRC_MEM
 138   #define LGRP_RSRC_MEM      1       /* memory resources */
 139 #endif
 140 
 141 // Values for ThreadPriorityPolicy == 1
 142 int prio_policy1[CriticalPriority+1] = {
 143   -99999,  0, 16,  32,  48,  64,
 144           80, 96, 112, 124, 127, 127 };
 145 
 146 // System parameters used internally
 147 static clock_t clock_tics_per_sec = 100;
 148 
 149 // Track if we have called enable_extended_FILE_stdio (on Solaris 10u4+)
 150 static bool enabled_extended_FILE_stdio = false;
 151 
 152 // For diagnostics to print a message once. see run_periodic_checks
 153 static bool check_addr0_done = false;
 154 static sigset_t check_signal_done;
 155 static bool check_signals = true;
 156 
 157 address os::Solaris::handler_start;  // start pc of thr_sighndlrinfo
 158 address os::Solaris::handler_end;    // end pc of thr_sighndlrinfo
 159 
 160 address os::Solaris::_main_stack_base = NULL;  // 4352906 workaround
 161 
 162 
 163 // "default" initializers for missing libc APIs
 164 extern "C" {
 165   static int lwp_mutex_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; }
 166   static int lwp_mutex_destroy(mutex_t *mx)                 { return 0; }
 167 
 168   static int lwp_cond_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; }
 169   static int lwp_cond_destroy(cond_t *cv)                   { return 0; }
 170 }
 171 
 172 // "default" initializers for pthread-based synchronization
 173 extern "C" {
 174   static int pthread_mutex_default_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; }
 175   static int pthread_cond_default_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; }
 176 }
 177 
 178 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time);
 179 
 180 static inline size_t adjust_stack_size(address base, size_t size) {
 181   if ((ssize_t)size < 0) {
 182     // 4759953: Compensate for ridiculous stack size.
 183     size = max_intx;
 184   }
 185   if (size > (size_t)base) {
 186     // 4812466: Make sure size doesn't allow the stack to wrap the address space.
 187     size = (size_t)base;
 188   }
 189   return size;
 190 }
 191 
 192 static inline stack_t get_stack_info() {
 193   stack_t st;
 194   int retval = thr_stksegment(&st);
 195   st.ss_size = adjust_stack_size((address)st.ss_sp, st.ss_size);
 196   assert(retval == 0, "incorrect return value from thr_stksegment");
 197   assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
 198   assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
 199   return st;
 200 }
 201 
 202 address os::current_stack_base() {
 203   int r = thr_main();
 204   guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
 205   bool is_primordial_thread = r;
 206 
 207   // Workaround 4352906, avoid calls to thr_stksegment by
 208   // thr_main after the first one (it looks like we trash
 209   // some data, causing the value for ss_sp to be incorrect).
 210   if (!is_primordial_thread || os::Solaris::_main_stack_base == NULL) {
 211     stack_t st = get_stack_info();
 212     if (is_primordial_thread) {
 213       // cache initial value of stack base
 214       os::Solaris::_main_stack_base = (address)st.ss_sp;
 215     }
 216     return (address)st.ss_sp;
 217   } else {
 218     guarantee(os::Solaris::_main_stack_base != NULL, "Attempt to use null cached stack base");
 219     return os::Solaris::_main_stack_base;
 220   }
 221 }
 222 
 223 size_t os::current_stack_size() {
 224   size_t size;
 225 
 226   int r = thr_main();
 227   guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
 228   if (!r) {
 229     size = get_stack_info().ss_size;
 230   } else {
 231     struct rlimit limits;
 232     getrlimit(RLIMIT_STACK, &limits);
 233     size = adjust_stack_size(os::Solaris::_main_stack_base, (size_t)limits.rlim_cur);
 234   }
 235   // base may not be page aligned
 236   address base = current_stack_base();
 237   address bottom = (address)align_size_up((intptr_t)(base - size), os::vm_page_size());;
 238   return (size_t)(base - bottom);
 239 }
 240 
 241 struct tm* os::localtime_pd(const time_t* clock, struct tm*  res) {
 242   return localtime_r(clock, res);
 243 }
 244 
 245 void os::Solaris::try_enable_extended_io() {
 246   typedef int (*enable_extended_FILE_stdio_t)(int, int);
 247 
 248   if (!UseExtendedFileIO) {
 249     return;
 250   }
 251 
 252   enable_extended_FILE_stdio_t enabler =
 253     (enable_extended_FILE_stdio_t) dlsym(RTLD_DEFAULT,
 254                                          "enable_extended_FILE_stdio");
 255   if (enabler) {
 256     enabler(-1, -1);
 257   }
 258 }
 259 
 260 static int _processors_online = 0;
 261 
 262 jint os::Solaris::_os_thread_limit = 0;
 263 volatile jint os::Solaris::_os_thread_count = 0;
 264 
 265 julong os::available_memory() {
 266   return Solaris::available_memory();
 267 }
 268 
 269 julong os::Solaris::available_memory() {
 270   return (julong)sysconf(_SC_AVPHYS_PAGES) * os::vm_page_size();
 271 }
 272 
 273 julong os::Solaris::_physical_memory = 0;
 274 
 275 julong os::physical_memory() {
 276   return Solaris::physical_memory();
 277 }
 278 
 279 static hrtime_t first_hrtime = 0;
 280 static const hrtime_t hrtime_hz = 1000*1000*1000;
 281 static volatile hrtime_t max_hrtime = 0;
 282 
 283 
 284 void os::Solaris::initialize_system_info() {
 285   set_processor_count(sysconf(_SC_NPROCESSORS_CONF));
 286   _processors_online = sysconf(_SC_NPROCESSORS_ONLN);
 287   _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) *
 288                                      (julong)sysconf(_SC_PAGESIZE);
 289 }
 290 
 291 int os::active_processor_count() {
 292   int online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
 293   pid_t pid = getpid();
 294   psetid_t pset = PS_NONE;
 295   // Are we running in a processor set or is there any processor set around?
 296   if (pset_bind(PS_QUERY, P_PID, pid, &pset) == 0) {
 297     uint_t pset_cpus;
 298     // Query the number of cpus available to us.
 299     if (pset_info(pset, NULL, &pset_cpus, NULL) == 0) {
 300       assert(pset_cpus > 0 && pset_cpus <= online_cpus, "sanity check");
 301       _processors_online = pset_cpus;
 302       return pset_cpus;
 303     }
 304   }
 305   // Otherwise return number of online cpus
 306   return online_cpus;
 307 }
 308 
 309 static bool find_processors_in_pset(psetid_t        pset,
 310                                     processorid_t** id_array,
 311                                     uint_t*         id_length) {
 312   bool result = false;
 313   // Find the number of processors in the processor set.
 314   if (pset_info(pset, NULL, id_length, NULL) == 0) {
 315     // Make up an array to hold their ids.
 316     *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal);
 317     // Fill in the array with their processor ids.
 318     if (pset_info(pset, NULL, id_length, *id_array) == 0) {
 319       result = true;
 320     }
 321   }
 322   return result;
 323 }
 324 
 325 // Callers of find_processors_online() must tolerate imprecise results --
 326 // the system configuration can change asynchronously because of DR
 327 // or explicit psradm operations.
 328 //
 329 // We also need to take care that the loop (below) terminates as the
 330 // number of processors online can change between the _SC_NPROCESSORS_ONLN
 331 // request and the loop that builds the list of processor ids.   Unfortunately
 332 // there's no reliable way to determine the maximum valid processor id,
 333 // so we use a manifest constant, MAX_PROCESSOR_ID, instead.  See p_online
 334 // man pages, which claim the processor id set is "sparse, but
 335 // not too sparse".  MAX_PROCESSOR_ID is used to ensure that we eventually
 336 // exit the loop.
 337 //
 338 // In the future we'll be able to use sysconf(_SC_CPUID_MAX), but that's
 339 // not available on S8.0.
 340 
 341 static bool find_processors_online(processorid_t** id_array,
 342                                    uint*           id_length) {
 343   const processorid_t MAX_PROCESSOR_ID = 100000;
 344   // Find the number of processors online.
 345   *id_length = sysconf(_SC_NPROCESSORS_ONLN);
 346   // Make up an array to hold their ids.
 347   *id_array = NEW_C_HEAP_ARRAY(processorid_t, *id_length, mtInternal);
 348   // Processors need not be numbered consecutively.
 349   long found = 0;
 350   processorid_t next = 0;
 351   while (found < *id_length && next < MAX_PROCESSOR_ID) {
 352     processor_info_t info;
 353     if (processor_info(next, &info) == 0) {
 354       // NB, PI_NOINTR processors are effectively online ...
 355       if (info.pi_state == P_ONLINE || info.pi_state == P_NOINTR) {
 356         (*id_array)[found] = next;
 357         found += 1;
 358       }
 359     }
 360     next += 1;
 361   }
 362   if (found < *id_length) {
 363     // The loop above didn't identify the expected number of processors.
 364     // We could always retry the operation, calling sysconf(_SC_NPROCESSORS_ONLN)
 365     // and re-running the loop, above, but there's no guarantee of progress
 366     // if the system configuration is in flux.  Instead, we just return what
 367     // we've got.  Note that in the worst case find_processors_online() could
 368     // return an empty set.  (As a fall-back in the case of the empty set we
 369     // could just return the ID of the current processor).
 370     *id_length = found;
 371   }
 372 
 373   return true;
 374 }
 375 
 376 static bool assign_distribution(processorid_t* id_array,
 377                                 uint           id_length,
 378                                 uint*          distribution,
 379                                 uint           distribution_length) {
 380   // We assume we can assign processorid_t's to uint's.
 381   assert(sizeof(processorid_t) == sizeof(uint),
 382          "can't convert processorid_t to uint");
 383   // Quick check to see if we won't succeed.
 384   if (id_length < distribution_length) {
 385     return false;
 386   }
 387   // Assign processor ids to the distribution.
 388   // Try to shuffle processors to distribute work across boards,
 389   // assuming 4 processors per board.
 390   const uint processors_per_board = ProcessDistributionStride;
 391   // Find the maximum processor id.
 392   processorid_t max_id = 0;
 393   for (uint m = 0; m < id_length; m += 1) {
 394     max_id = MAX2(max_id, id_array[m]);
 395   }
 396   // The next id, to limit loops.
 397   const processorid_t limit_id = max_id + 1;
 398   // Make up markers for available processors.
 399   bool* available_id = NEW_C_HEAP_ARRAY(bool, limit_id, mtInternal);
 400   for (uint c = 0; c < limit_id; c += 1) {
 401     available_id[c] = false;
 402   }
 403   for (uint a = 0; a < id_length; a += 1) {
 404     available_id[id_array[a]] = true;
 405   }
 406   // Step by "boards", then by "slot", copying to "assigned".
 407   // NEEDS_CLEANUP: The assignment of processors should be stateful,
 408   //                remembering which processors have been assigned by
 409   //                previous calls, etc., so as to distribute several
 410   //                independent calls of this method.  What we'd like is
 411   //                It would be nice to have an API that let us ask
 412   //                how many processes are bound to a processor,
 413   //                but we don't have that, either.
 414   //                In the short term, "board" is static so that
 415   //                subsequent distributions don't all start at board 0.
 416   static uint board = 0;
 417   uint assigned = 0;
 418   // Until we've found enough processors ....
 419   while (assigned < distribution_length) {
 420     // ... find the next available processor in the board.
 421     for (uint slot = 0; slot < processors_per_board; slot += 1) {
 422       uint try_id = board * processors_per_board + slot;
 423       if ((try_id < limit_id) && (available_id[try_id] == true)) {
 424         distribution[assigned] = try_id;
 425         available_id[try_id] = false;
 426         assigned += 1;
 427         break;
 428       }
 429     }
 430     board += 1;
 431     if (board * processors_per_board + 0 >= limit_id) {
 432       board = 0;
 433     }
 434   }
 435   if (available_id != NULL) {
 436     FREE_C_HEAP_ARRAY(bool, available_id);
 437   }
 438   return true;
 439 }
 440 
 441 void os::set_native_thread_name(const char *name) {
 442   // Not yet implemented.
 443   return;
 444 }
 445 
 446 bool os::distribute_processes(uint length, uint* distribution) {
 447   bool result = false;
 448   // Find the processor id's of all the available CPUs.
 449   processorid_t* id_array  = NULL;
 450   uint           id_length = 0;
 451   // There are some races between querying information and using it,
 452   // since processor sets can change dynamically.
 453   psetid_t pset = PS_NONE;
 454   // Are we running in a processor set?
 455   if ((pset_bind(PS_QUERY, P_PID, P_MYID, &pset) == 0) && pset != PS_NONE) {
 456     result = find_processors_in_pset(pset, &id_array, &id_length);
 457   } else {
 458     result = find_processors_online(&id_array, &id_length);
 459   }
 460   if (result == true) {
 461     if (id_length >= length) {
 462       result = assign_distribution(id_array, id_length, distribution, length);
 463     } else {
 464       result = false;
 465     }
 466   }
 467   if (id_array != NULL) {
 468     FREE_C_HEAP_ARRAY(processorid_t, id_array);
 469   }
 470   return result;
 471 }
 472 
 473 bool os::bind_to_processor(uint processor_id) {
 474   // We assume that a processorid_t can be stored in a uint.
 475   assert(sizeof(uint) == sizeof(processorid_t),
 476          "can't convert uint to processorid_t");
 477   int bind_result =
 478     processor_bind(P_LWPID,                       // bind LWP.
 479                    P_MYID,                        // bind current LWP.
 480                    (processorid_t) processor_id,  // id.
 481                    NULL);                         // don't return old binding.
 482   return (bind_result == 0);
 483 }
 484 
 485 // Return true if user is running as root.
 486 
 487 bool os::have_special_privileges() {
 488   static bool init = false;
 489   static bool privileges = false;
 490   if (!init) {
 491     privileges = (getuid() != geteuid()) || (getgid() != getegid());
 492     init = true;
 493   }
 494   return privileges;
 495 }
 496 
 497 
 498 void os::init_system_properties_values() {
 499   // The next steps are taken in the product version:
 500   //
 501   // Obtain the JAVA_HOME value from the location of libjvm.so.
 502   // This library should be located at:
 503   // <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
 504   //
 505   // If "/jre/lib/" appears at the right place in the path, then we
 506   // assume libjvm.so is installed in a JDK and we use this path.
 507   //
 508   // Otherwise exit with message: "Could not create the Java virtual machine."
 509   //
 510   // The following extra steps are taken in the debugging version:
 511   //
 512   // If "/jre/lib/" does NOT appear at the right place in the path
 513   // instead of exit check for $JAVA_HOME environment variable.
 514   //
 515   // If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
 516   // then we append a fake suffix "hotspot/libjvm.so" to this path so
 517   // it looks like libjvm.so is installed there
 518   // <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
 519   //
 520   // Otherwise exit.
 521   //
 522   // Important note: if the location of libjvm.so changes this
 523   // code needs to be changed accordingly.
 524 
 525 // Base path of extensions installed on the system.
 526 #define SYS_EXT_DIR     "/usr/jdk/packages"
 527 #define EXTENSIONS_DIR  "/lib/ext"
 528 
 529   char cpu_arch[12];
 530   // Buffer that fits several sprintfs.
 531   // Note that the space for the colon and the trailing null are provided
 532   // by the nulls included by the sizeof operator.
 533   const size_t bufsize =
 534     MAX3((size_t)MAXPATHLEN,  // For dll_dir & friends.
 535          sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch), // invariant ld_library_path
 536          (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir
 537   char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
 538 
 539   // sysclasspath, java_home, dll_dir
 540   {
 541     char *pslash;
 542     os::jvm_path(buf, bufsize);
 543 
 544     // Found the full path to libjvm.so.
 545     // Now cut the path to <java_home>/jre if we can.
 546     *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so.
 547     pslash = strrchr(buf, '/');
 548     if (pslash != NULL) {
 549       *pslash = '\0';            // Get rid of /{client|server|hotspot}.
 550     }
 551     Arguments::set_dll_dir(buf);
 552 
 553     if (pslash != NULL) {
 554       pslash = strrchr(buf, '/');
 555       if (pslash != NULL) {
 556         *pslash = '\0';          // Get rid of /<arch>.
 557         pslash = strrchr(buf, '/');
 558         if (pslash != NULL) {
 559           *pslash = '\0';        // Get rid of /lib.
 560         }
 561       }
 562     }
 563     Arguments::set_java_home(buf);
 564     set_boot_path('/', ':');
 565   }
 566 
 567   // Where to look for native libraries.
 568   {
 569     // Use dlinfo() to determine the correct java.library.path.
 570     //
 571     // If we're launched by the Java launcher, and the user
 572     // does not set java.library.path explicitly on the commandline,
 573     // the Java launcher sets LD_LIBRARY_PATH for us and unsets
 574     // LD_LIBRARY_PATH_32 and LD_LIBRARY_PATH_64.  In this case
 575     // dlinfo returns LD_LIBRARY_PATH + crle settings (including
 576     // /usr/lib), which is exactly what we want.
 577     //
 578     // If the user does set java.library.path, it completely
 579     // overwrites this setting, and always has.
 580     //
 581     // If we're not launched by the Java launcher, we may
 582     // get here with any/all of the LD_LIBRARY_PATH[_32|64]
 583     // settings.  Again, dlinfo does exactly what we want.
 584 
 585     Dl_serinfo     info_sz, *info = &info_sz;
 586     Dl_serpath     *path;
 587     char           *library_path;
 588     char           *common_path = buf;
 589 
 590     // Determine search path count and required buffer size.
 591     if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) {
 592       FREE_C_HEAP_ARRAY(char, buf);
 593       vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror());
 594     }
 595 
 596     // Allocate new buffer and initialize.
 597     info = (Dl_serinfo*)NEW_C_HEAP_ARRAY(char, info_sz.dls_size, mtInternal);
 598     info->dls_size = info_sz.dls_size;
 599     info->dls_cnt = info_sz.dls_cnt;
 600 
 601     // Obtain search path information.
 602     if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) {
 603       FREE_C_HEAP_ARRAY(char, buf);
 604       FREE_C_HEAP_ARRAY(char, info);
 605       vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
 606     }
 607 
 608     path = &info->dls_serpath[0];
 609 
 610     // Note: Due to a legacy implementation, most of the library path
 611     // is set in the launcher. This was to accomodate linking restrictions
 612     // on legacy Solaris implementations (which are no longer supported).
 613     // Eventually, all the library path setting will be done here.
 614     //
 615     // However, to prevent the proliferation of improperly built native
 616     // libraries, the new path component /usr/jdk/packages is added here.
 617 
 618     // Determine the actual CPU architecture.
 619     sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
 620 #ifdef _LP64
 621     // If we are a 64-bit vm, perform the following translations:
 622     //   sparc   -> sparcv9
 623     //   i386    -> amd64
 624     if (strcmp(cpu_arch, "sparc") == 0) {
 625       strcat(cpu_arch, "v9");
 626     } else if (strcmp(cpu_arch, "i386") == 0) {
 627       strcpy(cpu_arch, "amd64");
 628     }
 629 #endif
 630 
 631     // Construct the invariant part of ld_library_path.
 632     sprintf(common_path, SYS_EXT_DIR "/lib/%s", cpu_arch);
 633 
 634     // Struct size is more than sufficient for the path components obtained
 635     // through the dlinfo() call, so only add additional space for the path
 636     // components explicitly added here.
 637     size_t library_path_size = info->dls_size + strlen(common_path);
 638     library_path = (char *)NEW_C_HEAP_ARRAY(char, library_path_size, mtInternal);
 639     library_path[0] = '\0';
 640 
 641     // Construct the desired Java library path from the linker's library
 642     // search path.
 643     //
 644     // For compatibility, it is optimal that we insert the additional path
 645     // components specific to the Java VM after those components specified
 646     // in LD_LIBRARY_PATH (if any) but before those added by the ld.so
 647     // infrastructure.
 648     if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it.
 649       strcpy(library_path, common_path);
 650     } else {
 651       int inserted = 0;
 652       int i;
 653       for (i = 0; i < info->dls_cnt; i++, path++) {
 654         uint_t flags = path->dls_flags & LA_SER_MASK;
 655         if (((flags & LA_SER_LIBPATH) == 0) && !inserted) {
 656           strcat(library_path, common_path);
 657           strcat(library_path, os::path_separator());
 658           inserted = 1;
 659         }
 660         strcat(library_path, path->dls_name);
 661         strcat(library_path, os::path_separator());
 662       }
 663       // Eliminate trailing path separator.
 664       library_path[strlen(library_path)-1] = '\0';
 665     }
 666 
 667     // happens before argument parsing - can't use a trace flag
 668     // tty->print_raw("init_system_properties_values: native lib path: ");
 669     // tty->print_raw_cr(library_path);
 670 
 671     // Callee copies into its own buffer.
 672     Arguments::set_library_path(library_path);
 673 
 674     FREE_C_HEAP_ARRAY(char, library_path);
 675     FREE_C_HEAP_ARRAY(char, info);
 676   }
 677 
 678   // Extensions directories.
 679   sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
 680   Arguments::set_ext_dirs(buf);
 681 
 682   FREE_C_HEAP_ARRAY(char, buf);
 683 
 684 #undef SYS_EXT_DIR
 685 #undef EXTENSIONS_DIR
 686 }
 687 
 688 void os::breakpoint() {
 689   BREAKPOINT;
 690 }
 691 
 692 bool os::obsolete_option(const JavaVMOption *option) {
 693   if (!strncmp(option->optionString, "-Xt", 3)) {
 694     return true;
 695   } else if (!strncmp(option->optionString, "-Xtm", 4)) {
 696     return true;
 697   } else if (!strncmp(option->optionString, "-Xverifyheap", 12)) {
 698     return true;
 699   } else if (!strncmp(option->optionString, "-Xmaxjitcodesize", 16)) {
 700     return true;
 701   }
 702   return false;
 703 }
 704 
 705 bool os::Solaris::valid_stack_address(Thread* thread, address sp) {
 706   address  stackStart  = (address)thread->stack_base();
 707   address  stackEnd    = (address)(stackStart - (address)thread->stack_size());
 708   if (sp < stackStart && sp >= stackEnd) return true;
 709   return false;
 710 }
 711 
 712 extern "C" void breakpoint() {
 713   // use debugger to set breakpoint here
 714 }
 715 
 716 static thread_t main_thread;
 717 
 718 // Thread start routine for all new Java threads
 719 extern "C" void* java_start(void* thread_addr) {
 720   // Try to randomize the cache line index of hot stack frames.
 721   // This helps when threads of the same stack traces evict each other's
 722   // cache lines. The threads can be either from the same JVM instance, or
 723   // from different JVM instances. The benefit is especially true for
 724   // processors with hyperthreading technology.
 725   static int counter = 0;
 726   int pid = os::current_process_id();
 727   alloca(((pid ^ counter++) & 7) * 128);
 728 
 729   int prio;
 730   Thread* thread = (Thread*)thread_addr;
 731 
 732   thread->initialize_thread_current();
 733 
 734   OSThread* osthr = thread->osthread();
 735 
 736   osthr->set_lwp_id(_lwp_self());  // Store lwp in case we are bound
 737   thread->_schedctl = (void *) schedctl_init();
 738 
 739   if (UseNUMA) {
 740     int lgrp_id = os::numa_get_group_id();
 741     if (lgrp_id != -1) {
 742       thread->set_lgrp_id(lgrp_id);
 743     }
 744   }
 745 
 746   // If the creator called set priority before we started,
 747   // we need to call set_native_priority now that we have an lwp.
 748   // We used to get the priority from thr_getprio (we called
 749   // thr_setprio way back in create_thread) and pass it to
 750   // set_native_priority, but Solaris scales the priority
 751   // in java_to_os_priority, so when we read it back here,
 752   // we pass trash to set_native_priority instead of what's
 753   // in java_to_os_priority. So we save the native priority
 754   // in the osThread and recall it here.
 755 
 756   if (osthr->thread_id() != -1) {
 757     if (UseThreadPriorities) {
 758       int prio = osthr->native_priority();
 759       if (ThreadPriorityVerbose) {
 760         tty->print_cr("Starting Thread " INTPTR_FORMAT ", LWP is "
 761                       INTPTR_FORMAT ", setting priority: %d\n",
 762                       osthr->thread_id(), osthr->lwp_id(), prio);
 763       }
 764       os::set_native_priority(thread, prio);
 765     }
 766   } else if (ThreadPriorityVerbose) {
 767     warning("Can't set priority in _start routine, thread id hasn't been set\n");
 768   }
 769 
 770   assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
 771 
 772   // initialize signal mask for this thread
 773   os::Solaris::hotspot_sigmask(thread);
 774 
 775   thread->run();
 776 
 777   // One less thread is executing
 778   // When the VMThread gets here, the main thread may have already exited
 779   // which frees the CodeHeap containing the Atomic::dec code
 780   if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
 781     Atomic::dec(&os::Solaris::_os_thread_count);
 782   }
 783 
 784   if (UseDetachedThreads) {
 785     thr_exit(NULL);
 786     ShouldNotReachHere();
 787   }
 788   return NULL;
 789 }
 790 
 791 static OSThread* create_os_thread(Thread* thread, thread_t thread_id) {
 792   // Allocate the OSThread object
 793   OSThread* osthread = new OSThread(NULL, NULL);
 794   if (osthread == NULL) return NULL;
 795 
 796   // Store info on the Solaris thread into the OSThread
 797   osthread->set_thread_id(thread_id);
 798   osthread->set_lwp_id(_lwp_self());
 799   thread->_schedctl = (void *) schedctl_init();
 800 
 801   if (UseNUMA) {
 802     int lgrp_id = os::numa_get_group_id();
 803     if (lgrp_id != -1) {
 804       thread->set_lgrp_id(lgrp_id);
 805     }
 806   }
 807 
 808   if (ThreadPriorityVerbose) {
 809     tty->print_cr("In create_os_thread, Thread " INTPTR_FORMAT ", LWP is " INTPTR_FORMAT "\n",
 810                   osthread->thread_id(), osthread->lwp_id());
 811   }
 812 
 813   // Initial thread state is INITIALIZED, not SUSPENDED
 814   osthread->set_state(INITIALIZED);
 815 
 816   return osthread;
 817 }
 818 
 819 void os::Solaris::hotspot_sigmask(Thread* thread) {
 820   //Save caller's signal mask
 821   sigset_t sigmask;
 822   thr_sigsetmask(SIG_SETMASK, NULL, &sigmask);
 823   OSThread *osthread = thread->osthread();
 824   osthread->set_caller_sigmask(sigmask);
 825 
 826   thr_sigsetmask(SIG_UNBLOCK, os::Solaris::unblocked_signals(), NULL);
 827   if (!ReduceSignalUsage) {
 828     if (thread->is_VM_thread()) {
 829       // Only the VM thread handles BREAK_SIGNAL ...
 830       thr_sigsetmask(SIG_UNBLOCK, vm_signals(), NULL);
 831     } else {
 832       // ... all other threads block BREAK_SIGNAL
 833       assert(!sigismember(vm_signals(), SIGINT), "SIGINT should not be blocked");
 834       thr_sigsetmask(SIG_BLOCK, vm_signals(), NULL);
 835     }
 836   }
 837 }
 838 
 839 bool os::create_attached_thread(JavaThread* thread) {
 840 #ifdef ASSERT
 841   thread->verify_not_published();
 842 #endif
 843   OSThread* osthread = create_os_thread(thread, thr_self());
 844   if (osthread == NULL) {
 845     return false;
 846   }
 847 
 848   // Initial thread state is RUNNABLE
 849   osthread->set_state(RUNNABLE);
 850   thread->set_osthread(osthread);
 851 
 852   // initialize signal mask for this thread
 853   // and save the caller's signal mask
 854   os::Solaris::hotspot_sigmask(thread);
 855 
 856   return true;
 857 }
 858 
 859 bool os::create_main_thread(JavaThread* thread) {
 860 #ifdef ASSERT
 861   thread->verify_not_published();
 862 #endif
 863   if (_starting_thread == NULL) {
 864     _starting_thread = create_os_thread(thread, main_thread);
 865     if (_starting_thread == NULL) {
 866       return false;
 867     }
 868   }
 869 
 870   // The primodial thread is runnable from the start
 871   _starting_thread->set_state(RUNNABLE);
 872 
 873   thread->set_osthread(_starting_thread);
 874 
 875   // initialize signal mask for this thread
 876   // and save the caller's signal mask
 877   os::Solaris::hotspot_sigmask(thread);
 878 
 879   return true;
 880 }
 881 
 882 
 883 bool os::create_thread(Thread* thread, ThreadType thr_type,
 884                        size_t stack_size) {
 885   // Allocate the OSThread object
 886   OSThread* osthread = new OSThread(NULL, NULL);
 887   if (osthread == NULL) {
 888     return false;
 889   }
 890 
 891   if (ThreadPriorityVerbose) {
 892     char *thrtyp;
 893     switch (thr_type) {
 894     case vm_thread:
 895       thrtyp = (char *)"vm";
 896       break;
 897     case cgc_thread:
 898       thrtyp = (char *)"cgc";
 899       break;
 900     case pgc_thread:
 901       thrtyp = (char *)"pgc";
 902       break;
 903     case java_thread:
 904       thrtyp = (char *)"java";
 905       break;
 906     case compiler_thread:
 907       thrtyp = (char *)"compiler";
 908       break;
 909     case watcher_thread:
 910       thrtyp = (char *)"watcher";
 911       break;
 912     default:
 913       thrtyp = (char *)"unknown";
 914       break;
 915     }
 916     tty->print_cr("In create_thread, creating a %s thread\n", thrtyp);
 917   }
 918 
 919   // Calculate stack size if it's not specified by caller.
 920   if (stack_size == 0) {
 921     // The default stack size 1M (2M for LP64).
 922     stack_size = (BytesPerWord >> 2) * K * K;
 923 
 924     switch (thr_type) {
 925     case os::java_thread:
 926       // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
 927       if (JavaThread::stack_size_at_create() > 0) stack_size = JavaThread::stack_size_at_create();
 928       break;
 929     case os::compiler_thread:
 930       if (CompilerThreadStackSize > 0) {
 931         stack_size = (size_t)(CompilerThreadStackSize * K);
 932         break;
 933       } // else fall through:
 934         // use VMThreadStackSize if CompilerThreadStackSize is not defined
 935     case os::vm_thread:
 936     case os::pgc_thread:
 937     case os::cgc_thread:
 938     case os::watcher_thread:
 939       if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
 940       break;
 941     }
 942   }
 943   stack_size = MAX2(stack_size, os::Solaris::min_stack_allowed);
 944 
 945   // Initial state is ALLOCATED but not INITIALIZED
 946   osthread->set_state(ALLOCATED);
 947 
 948   if (os::Solaris::_os_thread_count > os::Solaris::_os_thread_limit) {
 949     // We got lots of threads. Check if we still have some address space left.
 950     // Need to be at least 5Mb of unreserved address space. We do check by
 951     // trying to reserve some.
 952     const size_t VirtualMemoryBangSize = 20*K*K;
 953     char* mem = os::reserve_memory(VirtualMemoryBangSize);
 954     if (mem == NULL) {
 955       delete osthread;
 956       return false;
 957     } else {
 958       // Release the memory again
 959       os::release_memory(mem, VirtualMemoryBangSize);
 960     }
 961   }
 962 
 963   // Setup osthread because the child thread may need it.
 964   thread->set_osthread(osthread);
 965 
 966   // Create the Solaris thread
 967   thread_t tid = 0;
 968   long     flags = (UseDetachedThreads ? THR_DETACHED : 0) | THR_SUSPENDED;
 969   int      status;
 970 
 971   // Mark that we don't have an lwp or thread id yet.
 972   // In case we attempt to set the priority before the thread starts.
 973   osthread->set_lwp_id(-1);
 974   osthread->set_thread_id(-1);
 975 
 976   status = thr_create(NULL, stack_size, java_start, thread, flags, &tid);
 977   if (status != 0) {
 978     if (PrintMiscellaneous && (Verbose || WizardMode)) {
 979       perror("os::create_thread");
 980     }
 981     thread->set_osthread(NULL);
 982     // Need to clean up stuff we've allocated so far
 983     delete osthread;
 984     return false;
 985   }
 986 
 987   Atomic::inc(&os::Solaris::_os_thread_count);
 988 
 989   // Store info on the Solaris thread into the OSThread
 990   osthread->set_thread_id(tid);
 991 
 992   // Remember that we created this thread so we can set priority on it
 993   osthread->set_vm_created();
 994 
 995   // Initial thread state is INITIALIZED, not SUSPENDED
 996   osthread->set_state(INITIALIZED);
 997 
 998   // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
 999   return true;
1000 }
1001 
1002 // defined for >= Solaris 10. This allows builds on earlier versions
1003 // of Solaris to take advantage of the newly reserved Solaris JVM signals.
1004 // With SIGJVM1, SIGJVM2, ASYNC_SIGNAL is SIGJVM2. Previously INTERRUPT_SIGNAL
1005 // was SIGJVM1.
1006 //
1007 #if !defined(SIGJVM1)
1008   #define SIGJVM1 39
1009   #define SIGJVM2 40
1010 #endif
1011 
1012 debug_only(static bool signal_sets_initialized = false);
1013 static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
1014 
1015 int os::Solaris::_SIGasync = ASYNC_SIGNAL;
1016 
1017 bool os::Solaris::is_sig_ignored(int sig) {
1018   struct sigaction oact;
1019   sigaction(sig, (struct sigaction*)NULL, &oact);
1020   void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oact.sa_sigaction)
1021                                  : CAST_FROM_FN_PTR(void*,  oact.sa_handler);
1022   if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
1023     return true;
1024   } else {
1025     return false;
1026   }
1027 }
1028 
1029 // Note: SIGRTMIN is a macro that calls sysconf() so it will
1030 // dynamically detect SIGRTMIN value for the system at runtime, not buildtime
1031 static bool isJVM1available() {
1032   return SIGJVM1 < SIGRTMIN;
1033 }
1034 
1035 void os::Solaris::signal_sets_init() {
1036   // Should also have an assertion stating we are still single-threaded.
1037   assert(!signal_sets_initialized, "Already initialized");
1038   // Fill in signals that are necessarily unblocked for all threads in
1039   // the VM. Currently, we unblock the following signals:
1040   // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
1041   //                         by -Xrs (=ReduceSignalUsage));
1042   // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
1043   // other threads. The "ReduceSignalUsage" boolean tells us not to alter
1044   // the dispositions or masks wrt these signals.
1045   // Programs embedding the VM that want to use the above signals for their
1046   // own purposes must, at this time, use the "-Xrs" option to prevent
1047   // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
1048   // (See bug 4345157, and other related bugs).
1049   // In reality, though, unblocking these signals is really a nop, since
1050   // these signals are not blocked by default.
1051   sigemptyset(&unblocked_sigs);
1052   sigemptyset(&allowdebug_blocked_sigs);
1053   sigaddset(&unblocked_sigs, SIGILL);
1054   sigaddset(&unblocked_sigs, SIGSEGV);
1055   sigaddset(&unblocked_sigs, SIGBUS);
1056   sigaddset(&unblocked_sigs, SIGFPE);
1057 
1058   // Always true on Solaris 10+
1059   guarantee(isJVM1available(), "SIGJVM1/2 missing!");
1060   os::Solaris::set_SIGasync(SIGJVM2);
1061 
1062   sigaddset(&unblocked_sigs, os::Solaris::SIGasync());
1063 
1064   if (!ReduceSignalUsage) {
1065     if (!os::Solaris::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
1066       sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
1067       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
1068     }
1069     if (!os::Solaris::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
1070       sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
1071       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
1072     }
1073     if (!os::Solaris::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
1074       sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
1075       sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
1076     }
1077   }
1078   // Fill in signals that are blocked by all but the VM thread.
1079   sigemptyset(&vm_sigs);
1080   if (!ReduceSignalUsage) {
1081     sigaddset(&vm_sigs, BREAK_SIGNAL);
1082   }
1083   debug_only(signal_sets_initialized = true);
1084 
1085   // For diagnostics only used in run_periodic_checks
1086   sigemptyset(&check_signal_done);
1087 }
1088 
1089 // These are signals that are unblocked while a thread is running Java.
1090 // (For some reason, they get blocked by default.)
1091 sigset_t* os::Solaris::unblocked_signals() {
1092   assert(signal_sets_initialized, "Not initialized");
1093   return &unblocked_sigs;
1094 }
1095 
1096 // These are the signals that are blocked while a (non-VM) thread is
1097 // running Java. Only the VM thread handles these signals.
1098 sigset_t* os::Solaris::vm_signals() {
1099   assert(signal_sets_initialized, "Not initialized");
1100   return &vm_sigs;
1101 }
1102 
1103 // These are signals that are blocked during cond_wait to allow debugger in
1104 sigset_t* os::Solaris::allowdebug_blocked_signals() {
1105   assert(signal_sets_initialized, "Not initialized");
1106   return &allowdebug_blocked_sigs;
1107 }
1108 
1109 
1110 void _handle_uncaught_cxx_exception() {
1111   VMError::report_and_die("An uncaught C++ exception");
1112 }
1113 
1114 
1115 // First crack at OS-specific initialization, from inside the new thread.
1116 void os::initialize_thread(Thread* thr) {
1117   int r = thr_main();
1118   guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
1119   if (r) {
1120     JavaThread* jt = (JavaThread *)thr;
1121     assert(jt != NULL, "Sanity check");
1122     size_t stack_size;
1123     address base = jt->stack_base();
1124     if (Arguments::created_by_java_launcher()) {
1125       // Use 2MB to allow for Solaris 7 64 bit mode.
1126       stack_size = JavaThread::stack_size_at_create() == 0
1127         ? 2048*K : JavaThread::stack_size_at_create();
1128 
1129       // There are rare cases when we may have already used more than
1130       // the basic stack size allotment before this method is invoked.
1131       // Attempt to allow for a normally sized java_stack.
1132       size_t current_stack_offset = (size_t)(base - (address)&stack_size);
1133       stack_size += ReservedSpace::page_align_size_down(current_stack_offset);
1134     } else {
1135       // 6269555: If we were not created by a Java launcher, i.e. if we are
1136       // running embedded in a native application, treat the primordial thread
1137       // as much like a native attached thread as possible.  This means using
1138       // the current stack size from thr_stksegment(), unless it is too large
1139       // to reliably setup guard pages.  A reasonable max size is 8MB.
1140       size_t current_size = current_stack_size();
1141       // This should never happen, but just in case....
1142       if (current_size == 0) current_size = 2 * K * K;
1143       stack_size = current_size > (8 * K * K) ? (8 * K * K) : current_size;
1144     }
1145     address bottom = (address)align_size_up((intptr_t)(base - stack_size), os::vm_page_size());;
1146     stack_size = (size_t)(base - bottom);
1147 
1148     assert(stack_size > 0, "Stack size calculation problem");
1149 
1150     if (stack_size > jt->stack_size()) {
1151 #ifndef PRODUCT
1152       struct rlimit limits;
1153       getrlimit(RLIMIT_STACK, &limits);
1154       size_t size = adjust_stack_size(base, (size_t)limits.rlim_cur);
1155       assert(size >= jt->stack_size(), "Stack size problem in main thread");
1156 #endif
1157       tty->print_cr("Stack size of %d Kb exceeds current limit of %d Kb.\n"
1158                     "(Stack sizes are rounded up to a multiple of the system page size.)\n"
1159                     "See limit(1) to increase the stack size limit.",
1160                     stack_size / K, jt->stack_size() / K);
1161       vm_exit(1);
1162     }
1163     assert(jt->stack_size() >= stack_size,
1164            "Attempt to map more stack than was allocated");
1165     jt->set_stack_size(stack_size);
1166   }
1167 
1168   // With the T2 libthread (T1 is no longer supported) threads are always bound
1169   // and we use stackbanging in all cases.
1170 
1171   os::Solaris::init_thread_fpu_state();
1172   std::set_terminate(_handle_uncaught_cxx_exception);
1173 }
1174 
1175 
1176 
1177 // Free Solaris resources related to the OSThread
1178 void os::free_thread(OSThread* osthread) {
1179   assert(osthread != NULL, "os::free_thread but osthread not set");
1180 
1181 
1182   // We are told to free resources of the argument thread,
1183   // but we can only really operate on the current thread.
1184   // The main thread must take the VMThread down synchronously
1185   // before the main thread exits and frees up CodeHeap
1186   guarantee((Thread::current()->osthread() == osthread
1187              || (osthread == VMThread::vm_thread()->osthread())), "os::free_thread but not current thread");
1188   if (Thread::current()->osthread() == osthread) {
1189     // Restore caller's signal mask
1190     sigset_t sigmask = osthread->caller_sigmask();
1191     thr_sigsetmask(SIG_SETMASK, &sigmask, NULL);
1192   }
1193   delete osthread;
1194 }
1195 
1196 void os::pd_start_thread(Thread* thread) {
1197   int status = thr_continue(thread->osthread()->thread_id());
1198   assert_status(status == 0, status, "thr_continue failed");
1199 }
1200 
1201 
1202 intx os::current_thread_id() {
1203   return (intx)thr_self();
1204 }
1205 
1206 static pid_t _initial_pid = 0;
1207 
1208 int os::current_process_id() {
1209   return (int)(_initial_pid ? _initial_pid : getpid());
1210 }
1211 
1212 // gethrtime() should be monotonic according to the documentation,
1213 // but some virtualized platforms are known to break this guarantee.
1214 // getTimeNanos() must be guaranteed not to move backwards, so we
1215 // are forced to add a check here.
1216 inline hrtime_t getTimeNanos() {
1217   const hrtime_t now = gethrtime();
1218   const hrtime_t prev = max_hrtime;
1219   if (now <= prev) {
1220     return prev;   // same or retrograde time;
1221   }
1222   const hrtime_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&max_hrtime, prev);
1223   assert(obsv >= prev, "invariant");   // Monotonicity
1224   // If the CAS succeeded then we're done and return "now".
1225   // If the CAS failed and the observed value "obsv" is >= now then
1226   // we should return "obsv".  If the CAS failed and now > obsv > prv then
1227   // some other thread raced this thread and installed a new value, in which case
1228   // we could either (a) retry the entire operation, (b) retry trying to install now
1229   // or (c) just return obsv.  We use (c).   No loop is required although in some cases
1230   // we might discard a higher "now" value in deference to a slightly lower but freshly
1231   // installed obsv value.   That's entirely benign -- it admits no new orderings compared
1232   // to (a) or (b) -- and greatly reduces coherence traffic.
1233   // We might also condition (c) on the magnitude of the delta between obsv and now.
1234   // Avoiding excessive CAS operations to hot RW locations is critical.
1235   // See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
1236   return (prev == obsv) ? now : obsv;
1237 }
1238 
1239 // Time since start-up in seconds to a fine granularity.
1240 // Used by VMSelfDestructTimer and the MemProfiler.
1241 double os::elapsedTime() {
1242   return (double)(getTimeNanos() - first_hrtime) / (double)hrtime_hz;
1243 }
1244 
1245 jlong os::elapsed_counter() {
1246   return (jlong)(getTimeNanos() - first_hrtime);
1247 }
1248 
1249 jlong os::elapsed_frequency() {
1250   return hrtime_hz;
1251 }
1252 
1253 // Return the real, user, and system times in seconds from an
1254 // arbitrary fixed point in the past.
1255 bool os::getTimesSecs(double* process_real_time,
1256                       double* process_user_time,
1257                       double* process_system_time) {
1258   struct tms ticks;
1259   clock_t real_ticks = times(&ticks);
1260 
1261   if (real_ticks == (clock_t) (-1)) {
1262     return false;
1263   } else {
1264     double ticks_per_second = (double) clock_tics_per_sec;
1265     *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
1266     *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
1267     // For consistency return the real time from getTimeNanos()
1268     // converted to seconds.
1269     *process_real_time = ((double) getTimeNanos()) / ((double) NANOUNITS);
1270 
1271     return true;
1272   }
1273 }
1274 
1275 bool os::supports_vtime() { return true; }
1276 
1277 bool os::enable_vtime() {
1278   int fd = ::open("/proc/self/ctl", O_WRONLY);
1279   if (fd == -1) {
1280     return false;
1281   }
1282 
1283   long cmd[] = { PCSET, PR_MSACCT };
1284   int res = ::write(fd, cmd, sizeof(long) * 2);
1285   ::close(fd);
1286   if (res != sizeof(long) * 2) {
1287     return false;
1288   }
1289   return true;
1290 }
1291 
1292 bool os::vtime_enabled() {
1293   int fd = ::open("/proc/self/status", O_RDONLY);
1294   if (fd == -1) {
1295     return false;
1296   }
1297 
1298   pstatus_t status;
1299   int res = os::read(fd, (void*) &status, sizeof(pstatus_t));
1300   ::close(fd);
1301   if (res != sizeof(pstatus_t)) {
1302     return false;
1303   }
1304   return status.pr_flags & PR_MSACCT;
1305 }
1306 
1307 double os::elapsedVTime() {
1308   return (double)gethrvtime() / (double)hrtime_hz;
1309 }
1310 
1311 // Used internally for comparisons only
1312 // getTimeMillis guaranteed to not move backwards on Solaris
1313 jlong getTimeMillis() {
1314   jlong nanotime = getTimeNanos();
1315   return (jlong)(nanotime / NANOSECS_PER_MILLISEC);
1316 }
1317 
1318 // Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
1319 jlong os::javaTimeMillis() {
1320   timeval t;
1321   if (gettimeofday(&t, NULL) == -1) {
1322     fatal("os::javaTimeMillis: gettimeofday (%s)", strerror(errno));
1323   }
1324   return jlong(t.tv_sec) * 1000  +  jlong(t.tv_usec) / 1000;
1325 }
1326 
1327 void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
1328   timeval t;
1329   if (gettimeofday(&t, NULL) == -1) {
1330     fatal("os::javaTimeSystemUTC: gettimeofday (%s)", strerror(errno));
1331   }
1332   seconds = jlong(t.tv_sec);
1333   nanos = jlong(t.tv_usec) * 1000;
1334 }
1335 
1336 
1337 jlong os::javaTimeNanos() {
1338   return (jlong)getTimeNanos();
1339 }
1340 
1341 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
1342   info_ptr->max_value = ALL_64_BITS;      // gethrtime() uses all 64 bits
1343   info_ptr->may_skip_backward = false;    // not subject to resetting or drifting
1344   info_ptr->may_skip_forward = false;     // not subject to resetting or drifting
1345   info_ptr->kind = JVMTI_TIMER_ELAPSED;   // elapsed not CPU time
1346 }
1347 
1348 char * os::local_time_string(char *buf, size_t buflen) {
1349   struct tm t;
1350   time_t long_time;
1351   time(&long_time);
1352   localtime_r(&long_time, &t);
1353   jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1354                t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1355                t.tm_hour, t.tm_min, t.tm_sec);
1356   return buf;
1357 }
1358 
1359 // Note: os::shutdown() might be called very early during initialization, or
1360 // called from signal handler. Before adding something to os::shutdown(), make
1361 // sure it is async-safe and can handle partially initialized VM.
1362 void os::shutdown() {
1363 
1364   // allow PerfMemory to attempt cleanup of any persistent resources
1365   perfMemory_exit();
1366 
1367   // needs to remove object in file system
1368   AttachListener::abort();
1369 
1370   // flush buffered output, finish log files
1371   ostream_abort();
1372 
1373   // Check for abort hook
1374   abort_hook_t abort_hook = Arguments::abort_hook();
1375   if (abort_hook != NULL) {
1376     abort_hook();
1377   }
1378 }
1379 
1380 // Note: os::abort() might be called very early during initialization, or
1381 // called from signal handler. Before adding something to os::abort(), make
1382 // sure it is async-safe and can handle partially initialized VM.
1383 void os::abort(bool dump_core, void* siginfo, void* context) {
1384   os::shutdown();
1385   if (dump_core) {
1386 #ifndef PRODUCT
1387     fdStream out(defaultStream::output_fd());
1388     out.print_raw("Current thread is ");
1389     char buf[16];
1390     jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
1391     out.print_raw_cr(buf);
1392     out.print_raw_cr("Dumping core ...");
1393 #endif
1394     ::abort(); // dump core (for debugging)
1395   }
1396 
1397   ::exit(1);
1398 }
1399 
1400 // Die immediately, no exit hook, no abort hook, no cleanup.
1401 void os::die() {
1402   ::abort(); // dump core (for debugging)
1403 }
1404 
1405 // DLL functions
1406 
1407 const char* os::dll_file_extension() { return ".so"; }
1408 
1409 // This must be hard coded because it's the system's temporary
1410 // directory not the java application's temp directory, ala java.io.tmpdir.
1411 const char* os::get_temp_directory() { return "/tmp"; }
1412 
1413 static bool file_exists(const char* filename) {
1414   struct stat statbuf;
1415   if (filename == NULL || strlen(filename) == 0) {
1416     return false;
1417   }
1418   return os::stat(filename, &statbuf) == 0;
1419 }
1420 
1421 bool os::dll_build_name(char* buffer, size_t buflen,
1422                         const char* pname, const char* fname) {
1423   bool retval = false;
1424   const size_t pnamelen = pname ? strlen(pname) : 0;
1425 
1426   // Return error on buffer overflow.
1427   if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1428     return retval;
1429   }
1430 
1431   if (pnamelen == 0) {
1432     snprintf(buffer, buflen, "lib%s.so", fname);
1433     retval = true;
1434   } else if (strchr(pname, *os::path_separator()) != NULL) {
1435     int n;
1436     char** pelements = split_path(pname, &n);
1437     if (pelements == NULL) {
1438       return false;
1439     }
1440     for (int i = 0; i < n; i++) {
1441       // really shouldn't be NULL but what the heck, check can't hurt
1442       if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1443         continue; // skip the empty path values
1444       }
1445       snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1446       if (file_exists(buffer)) {
1447         retval = true;
1448         break;
1449       }
1450     }
1451     // release the storage
1452     for (int i = 0; i < n; i++) {
1453       if (pelements[i] != NULL) {
1454         FREE_C_HEAP_ARRAY(char, pelements[i]);
1455       }
1456     }
1457     if (pelements != NULL) {
1458       FREE_C_HEAP_ARRAY(char*, pelements);
1459     }
1460   } else {
1461     snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1462     retval = true;
1463   }
1464   return retval;
1465 }
1466 
1467 // check if addr is inside libjvm.so
1468 bool os::address_is_in_vm(address addr) {
1469   static address libjvm_base_addr;
1470   Dl_info dlinfo;
1471 
1472   if (libjvm_base_addr == NULL) {
1473     if (dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo) != 0) {
1474       libjvm_base_addr = (address)dlinfo.dli_fbase;
1475     }
1476     assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
1477   }
1478 
1479   if (dladdr((void *)addr, &dlinfo) != 0) {
1480     if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1481   }
1482 
1483   return false;
1484 }
1485 
1486 typedef int (*dladdr1_func_type)(void *, Dl_info *, void **, int);
1487 static dladdr1_func_type dladdr1_func = NULL;
1488 
1489 bool os::dll_address_to_function_name(address addr, char *buf,
1490                                       int buflen, int * offset,
1491                                       bool demangle) {
1492   // buf is not optional, but offset is optional
1493   assert(buf != NULL, "sanity check");
1494 
1495   Dl_info dlinfo;
1496 
1497   // dladdr1_func was initialized in os::init()
1498   if (dladdr1_func != NULL) {
1499     // yes, we have dladdr1
1500 
1501     // Support for dladdr1 is checked at runtime; it may be
1502     // available even if the vm is built on a machine that does
1503     // not have dladdr1 support.  Make sure there is a value for
1504     // RTLD_DL_SYMENT.
1505 #ifndef RTLD_DL_SYMENT
1506   #define RTLD_DL_SYMENT 1
1507 #endif
1508 #ifdef _LP64
1509     Elf64_Sym * info;
1510 #else
1511     Elf32_Sym * info;
1512 #endif
1513     if (dladdr1_func((void *)addr, &dlinfo, (void **)&info,
1514                      RTLD_DL_SYMENT) != 0) {
1515       // see if we have a matching symbol that covers our address
1516       if (dlinfo.dli_saddr != NULL &&
1517           (char *)dlinfo.dli_saddr + info->st_size > (char *)addr) {
1518         if (dlinfo.dli_sname != NULL) {
1519           if (!(demangle && Decoder::demangle(dlinfo.dli_sname, buf, buflen))) {
1520             jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1521           }
1522           if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1523           return true;
1524         }
1525       }
1526       // no matching symbol so try for just file info
1527       if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
1528         if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1529                             buf, buflen, offset, dlinfo.dli_fname, demangle)) {
1530           return true;
1531         }
1532       }
1533     }
1534     buf[0] = '\0';
1535     if (offset != NULL) *offset  = -1;
1536     return false;
1537   }
1538 
1539   // no, only dladdr is available
1540   if (dladdr((void *)addr, &dlinfo) != 0) {
1541     // see if we have a matching symbol
1542     if (dlinfo.dli_saddr != NULL && dlinfo.dli_sname != NULL) {
1543       if (!(demangle && Decoder::demangle(dlinfo.dli_sname, buf, buflen))) {
1544         jio_snprintf(buf, buflen, dlinfo.dli_sname);
1545       }
1546       if (offset != NULL) *offset = addr - (address)dlinfo.dli_saddr;
1547       return true;
1548     }
1549     // no matching symbol so try for just file info
1550     if (dlinfo.dli_fname != NULL && dlinfo.dli_fbase != NULL) {
1551       if (Decoder::decode((address)(addr - (address)dlinfo.dli_fbase),
1552                           buf, buflen, offset, dlinfo.dli_fname, demangle)) {
1553         return true;
1554       }
1555     }
1556   }
1557   buf[0] = '\0';
1558   if (offset != NULL) *offset  = -1;
1559   return false;
1560 }
1561 
1562 bool os::dll_address_to_library_name(address addr, char* buf,
1563                                      int buflen, int* offset) {
1564   // buf is not optional, but offset is optional
1565   assert(buf != NULL, "sanity check");
1566 
1567   Dl_info dlinfo;
1568 
1569   if (dladdr((void*)addr, &dlinfo) != 0) {
1570     if (dlinfo.dli_fname != NULL) {
1571       jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
1572     }
1573     if (dlinfo.dli_fbase != NULL && offset != NULL) {
1574       *offset = addr - (address)dlinfo.dli_fbase;
1575     }
1576     return true;
1577   }
1578 
1579   buf[0] = '\0';
1580   if (offset) *offset = -1;
1581   return false;
1582 }
1583 
1584 int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *param) {
1585   Dl_info dli;
1586   // Sanity check?
1587   if (dladdr(CAST_FROM_FN_PTR(void *, os::get_loaded_modules_info), &dli) == 0 ||
1588       dli.dli_fname == NULL) {
1589     return 1;
1590   }
1591 
1592   void * handle = dlopen(dli.dli_fname, RTLD_LAZY);
1593   if (handle == NULL) {
1594     return 1;
1595   }
1596 
1597   Link_map *map;
1598   dlinfo(handle, RTLD_DI_LINKMAP, &map);
1599   if (map == NULL) {
1600     dlclose(handle);
1601     return 1;
1602   }
1603 
1604   while (map->l_prev != NULL) {
1605     map = map->l_prev;
1606   }
1607 
1608   while (map != NULL) {
1609     // Iterate through all map entries and call callback with fields of interest
1610     if(callback(map->l_name, (address)map->l_addr, (address)0, param)) {
1611       dlclose(handle);
1612       return 1;
1613     }
1614     map = map->l_next;
1615   }
1616 
1617   dlclose(handle);
1618   return 0;
1619 }
1620 
1621 int _print_dll_info_cb(const char * name, address base_address, address top_address, void * param) {
1622   outputStream * out = (outputStream *) param;
1623   out->print_cr(PTR_FORMAT " \t%s", base_address, name);
1624   return 0;
1625 }
1626 
1627 void os::print_dll_info(outputStream * st) {
1628   st->print_cr("Dynamic libraries:"); st->flush();
1629   if (get_loaded_modules_info(_print_dll_info_cb, (void *)st)) {
1630     st->print_cr("Error: Cannot print dynamic libraries.");
1631   }
1632 }
1633 
1634 // Loads .dll/.so and
1635 // in case of error it checks if .dll/.so was built for the
1636 // same architecture as Hotspot is running on
1637 
1638 void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
1639   void * result= ::dlopen(filename, RTLD_LAZY);
1640   if (result != NULL) {
1641     // Successful loading
1642     return result;
1643   }
1644 
1645   Elf32_Ehdr elf_head;
1646 
1647   // Read system error message into ebuf
1648   // It may or may not be overwritten below
1649   ::strncpy(ebuf, ::dlerror(), ebuflen-1);
1650   ebuf[ebuflen-1]='\0';
1651   int diag_msg_max_length=ebuflen-strlen(ebuf);
1652   char* diag_msg_buf=ebuf+strlen(ebuf);
1653 
1654   if (diag_msg_max_length==0) {
1655     // No more space in ebuf for additional diagnostics message
1656     return NULL;
1657   }
1658 
1659 
1660   int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
1661 
1662   if (file_descriptor < 0) {
1663     // Can't open library, report dlerror() message
1664     return NULL;
1665   }
1666 
1667   bool failed_to_read_elf_head=
1668     (sizeof(elf_head)!=
1669      (::read(file_descriptor, &elf_head,sizeof(elf_head))));
1670 
1671   ::close(file_descriptor);
1672   if (failed_to_read_elf_head) {
1673     // file i/o error - report dlerror() msg
1674     return NULL;
1675   }
1676 
1677   typedef struct {
1678     Elf32_Half  code;         // Actual value as defined in elf.h
1679     Elf32_Half  compat_class; // Compatibility of archs at VM's sense
1680     char        elf_class;    // 32 or 64 bit
1681     char        endianess;    // MSB or LSB
1682     char*       name;         // String representation
1683   } arch_t;
1684 
1685   static const arch_t arch_array[]={
1686     {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1687     {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1688     {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
1689     {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
1690     {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1691     {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1692     {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
1693     {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
1694     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
1695     {EM_ARM,         EM_ARM,     ELFCLASS32, ELFDATA2LSB, (char*)"ARM 32"}
1696   };
1697 
1698 #if  (defined IA32)
1699   static  Elf32_Half running_arch_code=EM_386;
1700 #elif   (defined AMD64)
1701   static  Elf32_Half running_arch_code=EM_X86_64;
1702 #elif  (defined IA64)
1703   static  Elf32_Half running_arch_code=EM_IA_64;
1704 #elif  (defined __sparc) && (defined _LP64)
1705   static  Elf32_Half running_arch_code=EM_SPARCV9;
1706 #elif  (defined __sparc) && (!defined _LP64)
1707   static  Elf32_Half running_arch_code=EM_SPARC;
1708 #elif  (defined __powerpc64__)
1709   static  Elf32_Half running_arch_code=EM_PPC64;
1710 #elif  (defined __powerpc__)
1711   static  Elf32_Half running_arch_code=EM_PPC;
1712 #elif (defined ARM)
1713   static  Elf32_Half running_arch_code=EM_ARM;
1714 #else
1715   #error Method os::dll_load requires that one of following is defined:\
1716        IA32, AMD64, IA64, __sparc, __powerpc__, ARM, ARM
1717 #endif
1718 
1719   // Identify compatability class for VM's architecture and library's architecture
1720   // Obtain string descriptions for architectures
1721 
1722   arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
1723   int running_arch_index=-1;
1724 
1725   for (unsigned int i=0; i < ARRAY_SIZE(arch_array); i++) {
1726     if (running_arch_code == arch_array[i].code) {
1727       running_arch_index    = i;
1728     }
1729     if (lib_arch.code == arch_array[i].code) {
1730       lib_arch.compat_class = arch_array[i].compat_class;
1731       lib_arch.name         = arch_array[i].name;
1732     }
1733   }
1734 
1735   assert(running_arch_index != -1,
1736          "Didn't find running architecture code (running_arch_code) in arch_array");
1737   if (running_arch_index == -1) {
1738     // Even though running architecture detection failed
1739     // we may still continue with reporting dlerror() message
1740     return NULL;
1741   }
1742 
1743   if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
1744     ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
1745     return NULL;
1746   }
1747 
1748   if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
1749     ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
1750     return NULL;
1751   }
1752 
1753   if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
1754     if (lib_arch.name!=NULL) {
1755       ::snprintf(diag_msg_buf, diag_msg_max_length-1,
1756                  " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
1757                  lib_arch.name, arch_array[running_arch_index].name);
1758     } else {
1759       ::snprintf(diag_msg_buf, diag_msg_max_length-1,
1760                  " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
1761                  lib_arch.code,
1762                  arch_array[running_arch_index].name);
1763     }
1764   }
1765 
1766   return NULL;
1767 }
1768 
1769 void* os::dll_lookup(void* handle, const char* name) {
1770   return dlsym(handle, name);
1771 }
1772 
1773 void* os::get_default_process_handle() {
1774   return (void*)::dlopen(NULL, RTLD_LAZY);
1775 }
1776 
1777 int os::stat(const char *path, struct stat *sbuf) {
1778   char pathbuf[MAX_PATH];
1779   if (strlen(path) > MAX_PATH - 1) {
1780     errno = ENAMETOOLONG;
1781     return -1;
1782   }
1783   os::native_path(strcpy(pathbuf, path));
1784   return ::stat(pathbuf, sbuf);
1785 }
1786 
1787 static bool _print_ascii_file(const char* filename, outputStream* st) {
1788   int fd = ::open(filename, O_RDONLY);
1789   if (fd == -1) {
1790     return false;
1791   }
1792 
1793   char buf[32];
1794   int bytes;
1795   while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) {
1796     st->print_raw(buf, bytes);
1797   }
1798 
1799   ::close(fd);
1800 
1801   return true;
1802 }
1803 
1804 void os::print_os_info_brief(outputStream* st) {
1805   os::Solaris::print_distro_info(st);
1806 
1807   os::Posix::print_uname_info(st);
1808 
1809   os::Solaris::print_libversion_info(st);
1810 }
1811 
1812 void os::print_os_info(outputStream* st) {
1813   st->print("OS:");
1814 
1815   os::Solaris::print_distro_info(st);
1816 
1817   os::Posix::print_uname_info(st);
1818 
1819   os::Solaris::print_libversion_info(st);
1820 
1821   os::Posix::print_rlimit_info(st);
1822 
1823   os::Posix::print_load_average(st);
1824 }
1825 
1826 void os::Solaris::print_distro_info(outputStream* st) {
1827   if (!_print_ascii_file("/etc/release", st)) {
1828     st->print("Solaris");
1829   }
1830   st->cr();
1831 }
1832 
1833 void os::get_summary_os_info(char* buf, size_t buflen) {
1834   strncpy(buf, "Solaris", buflen);  // default to plain solaris
1835   FILE* fp = fopen("/etc/release", "r");
1836   if (fp != NULL) {
1837     char tmp[256];
1838     // Only get the first line and chop out everything but the os name.
1839     if (fgets(tmp, sizeof(tmp), fp)) {
1840       char* ptr = tmp;
1841       // skip past whitespace characters
1842       while (*ptr != '\0' && (*ptr == ' ' || *ptr == '\t' || *ptr == '\n')) ptr++;
1843       if (*ptr != '\0') {
1844         char* nl = strchr(ptr, '\n');
1845         if (nl != NULL) *nl = '\0';
1846         strncpy(buf, ptr, buflen);
1847       }
1848     }
1849     fclose(fp);
1850   }
1851 }
1852 
1853 void os::Solaris::print_libversion_info(outputStream* st) {
1854   st->print("  (T2 libthread)");
1855   st->cr();
1856 }
1857 
1858 static bool check_addr0(outputStream* st) {
1859   jboolean status = false;
1860   int fd = ::open("/proc/self/map",O_RDONLY);
1861   if (fd >= 0) {
1862     prmap_t p;
1863     while (::read(fd, &p, sizeof(p)) > 0) {
1864       if (p.pr_vaddr == 0x0) {
1865         st->print("Warning: Address: 0x%x, Size: %dK, ",p.pr_vaddr, p.pr_size/1024, p.pr_mapname);
1866         st->print("Mapped file: %s, ", p.pr_mapname[0] == '\0' ? "None" : p.pr_mapname);
1867         st->print("Access:");
1868         st->print("%s",(p.pr_mflags & MA_READ)  ? "r" : "-");
1869         st->print("%s",(p.pr_mflags & MA_WRITE) ? "w" : "-");
1870         st->print("%s",(p.pr_mflags & MA_EXEC)  ? "x" : "-");
1871         st->cr();
1872         status = true;
1873       }
1874     }
1875     ::close(fd);
1876   }
1877   return status;
1878 }
1879 
1880 void os::get_summary_cpu_info(char* buf, size_t buflen) {
1881   // Get MHz with system call. We don't seem to already have this.
1882   processor_info_t stats;
1883   processorid_t id = getcpuid();
1884   int clock = 0;
1885   if (processor_info(id, &stats) != -1) {
1886     clock = stats.pi_clock;  // pi_processor_type isn't more informative than below
1887   }
1888 #ifdef AMD64
1889   snprintf(buf, buflen, "x86 64 bit %d MHz", clock);
1890 #else
1891   // must be sparc
1892   snprintf(buf, buflen, "Sparcv9 64 bit %d MHz", clock);
1893 #endif
1894 }
1895 
1896 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
1897   // Nothing to do for now.
1898 }
1899 
1900 void os::print_memory_info(outputStream* st) {
1901   st->print("Memory:");
1902   st->print(" %dk page", os::vm_page_size()>>10);
1903   st->print(", physical " UINT64_FORMAT "k", os::physical_memory()>>10);
1904   st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10);
1905   st->cr();
1906   (void) check_addr0(st);
1907 }
1908 
1909 void os::print_siginfo(outputStream* st, void* siginfo) {
1910   const siginfo_t* si = (const siginfo_t*)siginfo;
1911 
1912   os::Posix::print_siginfo_brief(st, si);
1913 
1914   if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
1915       UseSharedSpaces) {
1916     FileMapInfo* mapinfo = FileMapInfo::current_info();
1917     if (mapinfo->is_in_shared_space(si->si_addr)) {
1918       st->print("\n\nError accessing class data sharing archive."   \
1919                 " Mapped file inaccessible during execution, "      \
1920                 " possible disk/network problem.");
1921     }
1922   }
1923   st->cr();
1924 }
1925 
1926 // Moved from whole group, because we need them here for diagnostic
1927 // prints.
1928 #define OLDMAXSIGNUM 32
1929 static int Maxsignum = 0;
1930 static int *ourSigFlags = NULL;
1931 
1932 int os::Solaris::get_our_sigflags(int sig) {
1933   assert(ourSigFlags!=NULL, "signal data structure not initialized");
1934   assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
1935   return ourSigFlags[sig];
1936 }
1937 
1938 void os::Solaris::set_our_sigflags(int sig, int flags) {
1939   assert(ourSigFlags!=NULL, "signal data structure not initialized");
1940   assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
1941   ourSigFlags[sig] = flags;
1942 }
1943 
1944 
1945 static const char* get_signal_handler_name(address handler,
1946                                            char* buf, int buflen) {
1947   int offset;
1948   bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
1949   if (found) {
1950     // skip directory names
1951     const char *p1, *p2;
1952     p1 = buf;
1953     size_t len = strlen(os::file_separator());
1954     while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
1955     jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
1956   } else {
1957     jio_snprintf(buf, buflen, PTR_FORMAT, handler);
1958   }
1959   return buf;
1960 }
1961 
1962 static void print_signal_handler(outputStream* st, int sig,
1963                                  char* buf, size_t buflen) {
1964   struct sigaction sa;
1965 
1966   sigaction(sig, NULL, &sa);
1967 
1968   st->print("%s: ", os::exception_name(sig, buf, buflen));
1969 
1970   address handler = (sa.sa_flags & SA_SIGINFO)
1971                   ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
1972                   : CAST_FROM_FN_PTR(address, sa.sa_handler);
1973 
1974   if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
1975     st->print("SIG_DFL");
1976   } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
1977     st->print("SIG_IGN");
1978   } else {
1979     st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
1980   }
1981 
1982   st->print(", sa_mask[0]=");
1983   os::Posix::print_signal_set_short(st, &sa.sa_mask);
1984 
1985   address rh = VMError::get_resetted_sighandler(sig);
1986   // May be, handler was resetted by VMError?
1987   if (rh != NULL) {
1988     handler = rh;
1989     sa.sa_flags = VMError::get_resetted_sigflags(sig);
1990   }
1991 
1992   st->print(", sa_flags=");
1993   os::Posix::print_sa_flags(st, sa.sa_flags);
1994 
1995   // Check: is it our handler?
1996   if (handler == CAST_FROM_FN_PTR(address, signalHandler)) {
1997     // It is our signal handler
1998     // check for flags
1999     if (sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
2000       st->print(
2001                 ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
2002                 os::Solaris::get_our_sigflags(sig));
2003     }
2004   }
2005   st->cr();
2006 }
2007 
2008 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
2009   st->print_cr("Signal Handlers:");
2010   print_signal_handler(st, SIGSEGV, buf, buflen);
2011   print_signal_handler(st, SIGBUS , buf, buflen);
2012   print_signal_handler(st, SIGFPE , buf, buflen);
2013   print_signal_handler(st, SIGPIPE, buf, buflen);
2014   print_signal_handler(st, SIGXFSZ, buf, buflen);
2015   print_signal_handler(st, SIGILL , buf, buflen);
2016   print_signal_handler(st, ASYNC_SIGNAL, buf, buflen);
2017   print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
2018   print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen);
2019   print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
2020   print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen);
2021   print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen);
2022 }
2023 
2024 static char saved_jvm_path[MAXPATHLEN] = { 0 };
2025 
2026 // Find the full path to the current module, libjvm.so
2027 void os::jvm_path(char *buf, jint buflen) {
2028   // Error checking.
2029   if (buflen < MAXPATHLEN) {
2030     assert(false, "must use a large-enough buffer");
2031     buf[0] = '\0';
2032     return;
2033   }
2034   // Lazy resolve the path to current module.
2035   if (saved_jvm_path[0] != 0) {
2036     strcpy(buf, saved_jvm_path);
2037     return;
2038   }
2039 
2040   Dl_info dlinfo;
2041   int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
2042   assert(ret != 0, "cannot locate libjvm");
2043   if (ret != 0 && dlinfo.dli_fname != NULL) {
2044     realpath((char *)dlinfo.dli_fname, buf);
2045   } else {
2046     buf[0] = '\0';
2047     return;
2048   }
2049 
2050   if (Arguments::sun_java_launcher_is_altjvm()) {
2051     // Support for the java launcher's '-XXaltjvm=<path>' option. Typical
2052     // value for buf is "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".
2053     // If "/jre/lib/" appears at the right place in the string, then
2054     // assume we are installed in a JDK and we're done.  Otherwise, check
2055     // for a JAVA_HOME environment variable and fix up the path so it
2056     // looks like libjvm.so is installed there (append a fake suffix
2057     // hotspot/libjvm.so).
2058     const char *p = buf + strlen(buf) - 1;
2059     for (int count = 0; p > buf && count < 5; ++count) {
2060       for (--p; p > buf && *p != '/'; --p)
2061         /* empty */ ;
2062     }
2063 
2064     if (strncmp(p, "/jre/lib/", 9) != 0) {
2065       // Look for JAVA_HOME in the environment.
2066       char* java_home_var = ::getenv("JAVA_HOME");
2067       if (java_home_var != NULL && java_home_var[0] != 0) {
2068         char cpu_arch[12];
2069         char* jrelib_p;
2070         int   len;
2071         sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
2072 #ifdef _LP64
2073         // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9.
2074         if (strcmp(cpu_arch, "sparc") == 0) {
2075           strcat(cpu_arch, "v9");
2076         } else if (strcmp(cpu_arch, "i386") == 0) {
2077           strcpy(cpu_arch, "amd64");
2078         }
2079 #endif
2080         // Check the current module name "libjvm.so".
2081         p = strrchr(buf, '/');
2082         assert(strstr(p, "/libjvm") == p, "invalid library name");
2083 
2084         realpath(java_home_var, buf);
2085         // determine if this is a legacy image or modules image
2086         // modules image doesn't have "jre" subdirectory
2087         len = strlen(buf);
2088         assert(len < buflen, "Ran out of buffer space");
2089         jrelib_p = buf + len;
2090         snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
2091         if (0 != access(buf, F_OK)) {
2092           snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch);
2093         }
2094 
2095         if (0 == access(buf, F_OK)) {
2096           // Use current module name "libjvm.so"
2097           len = strlen(buf);
2098           snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
2099         } else {
2100           // Go back to path of .so
2101           realpath((char *)dlinfo.dli_fname, buf);
2102         }
2103       }
2104     }
2105   }
2106 
2107   strncpy(saved_jvm_path, buf, MAXPATHLEN);
2108   saved_jvm_path[MAXPATHLEN - 1] = '\0';
2109 }
2110 
2111 
2112 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
2113   // no prefix required, not even "_"
2114 }
2115 
2116 
2117 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
2118   // no suffix required
2119 }
2120 
2121 // This method is a copy of JDK's sysGetLastErrorString
2122 // from src/solaris/hpi/src/system_md.c
2123 
2124 size_t os::lasterror(char *buf, size_t len) {
2125   if (errno == 0)  return 0;
2126 
2127   const char *s = ::strerror(errno);
2128   size_t n = ::strlen(s);
2129   if (n >= len) {
2130     n = len - 1;
2131   }
2132   ::strncpy(buf, s, n);
2133   buf[n] = '\0';
2134   return n;
2135 }
2136 
2137 
2138 // sun.misc.Signal
2139 
2140 extern "C" {
2141   static void UserHandler(int sig, void *siginfo, void *context) {
2142     // Ctrl-C is pressed during error reporting, likely because the error
2143     // handler fails to abort. Let VM die immediately.
2144     if (sig == SIGINT && is_error_reported()) {
2145       os::die();
2146     }
2147 
2148     os::signal_notify(sig);
2149     // We do not need to reinstate the signal handler each time...
2150   }
2151 }
2152 
2153 void* os::user_handler() {
2154   return CAST_FROM_FN_PTR(void*, UserHandler);
2155 }
2156 
2157 struct timespec PosixSemaphore::create_timespec(unsigned int sec, int nsec) {
2158   struct timespec ts;
2159   unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
2160 
2161   return ts;
2162 }
2163 
2164 extern "C" {
2165   typedef void (*sa_handler_t)(int);
2166   typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
2167 }
2168 
2169 void* os::signal(int signal_number, void* handler) {
2170   struct sigaction sigAct, oldSigAct;
2171   sigfillset(&(sigAct.sa_mask));
2172   sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND;
2173   sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
2174 
2175   if (sigaction(signal_number, &sigAct, &oldSigAct)) {
2176     // -1 means registration failed
2177     return (void *)-1;
2178   }
2179 
2180   return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
2181 }
2182 
2183 void os::signal_raise(int signal_number) {
2184   raise(signal_number);
2185 }
2186 
2187 // The following code is moved from os.cpp for making this
2188 // code platform specific, which it is by its very nature.
2189 
2190 // a counter for each possible signal value
2191 static int Sigexit = 0;
2192 static int Maxlibjsigsigs;
2193 static jint *pending_signals = NULL;
2194 static int *preinstalled_sigs = NULL;
2195 static struct sigaction *chainedsigactions = NULL;
2196 static sema_t sig_sem;
2197 typedef int (*version_getting_t)();
2198 version_getting_t os::Solaris::get_libjsig_version = NULL;
2199 static int libjsigversion = NULL;
2200 
2201 int os::sigexitnum_pd() {
2202   assert(Sigexit > 0, "signal memory not yet initialized");
2203   return Sigexit;
2204 }
2205 
2206 void os::Solaris::init_signal_mem() {
2207   // Initialize signal structures
2208   Maxsignum = SIGRTMAX;
2209   Sigexit = Maxsignum+1;
2210   assert(Maxsignum >0, "Unable to obtain max signal number");
2211 
2212   Maxlibjsigsigs = Maxsignum;
2213 
2214   // pending_signals has one int per signal
2215   // The additional signal is for SIGEXIT - exit signal to signal_thread
2216   pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal);
2217   memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
2218 
2219   if (UseSignalChaining) {
2220     chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction)
2221                                                    * (Maxsignum + 1), mtInternal);
2222     memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1)));
2223     preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
2224     memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1)));
2225   }
2226   ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
2227   memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
2228 }
2229 
2230 void os::signal_init_pd() {
2231   int ret;
2232 
2233   ret = ::sema_init(&sig_sem, 0, NULL, NULL);
2234   assert(ret == 0, "sema_init() failed");
2235 }
2236 
2237 void os::signal_notify(int signal_number) {
2238   int ret;
2239 
2240   Atomic::inc(&pending_signals[signal_number]);
2241   ret = ::sema_post(&sig_sem);
2242   assert(ret == 0, "sema_post() failed");
2243 }
2244 
2245 static int check_pending_signals(bool wait_for_signal) {
2246   int ret;
2247   while (true) {
2248     for (int i = 0; i < Sigexit + 1; i++) {
2249       jint n = pending_signals[i];
2250       if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
2251         return i;
2252       }
2253     }
2254     if (!wait_for_signal) {
2255       return -1;
2256     }
2257     JavaThread *thread = JavaThread::current();
2258     ThreadBlockInVM tbivm(thread);
2259 
2260     bool threadIsSuspended;
2261     do {
2262       thread->set_suspend_equivalent();
2263       // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
2264       while ((ret = ::sema_wait(&sig_sem)) == EINTR)
2265         ;
2266       assert(ret == 0, "sema_wait() failed");
2267 
2268       // were we externally suspended while we were waiting?
2269       threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
2270       if (threadIsSuspended) {
2271         // The semaphore has been incremented, but while we were waiting
2272         // another thread suspended us. We don't want to continue running
2273         // while suspended because that would surprise the thread that
2274         // suspended us.
2275         ret = ::sema_post(&sig_sem);
2276         assert(ret == 0, "sema_post() failed");
2277 
2278         thread->java_suspend_self();
2279       }
2280     } while (threadIsSuspended);
2281   }
2282 }
2283 
2284 int os::signal_lookup() {
2285   return check_pending_signals(false);
2286 }
2287 
2288 int os::signal_wait() {
2289   return check_pending_signals(true);
2290 }
2291 
2292 ////////////////////////////////////////////////////////////////////////////////
2293 // Virtual Memory
2294 
2295 static int page_size = -1;
2296 
2297 // The mmap MAP_ALIGN flag is supported on Solaris 9 and later.  init_2() will
2298 // clear this var if support is not available.
2299 static bool has_map_align = true;
2300 
2301 int os::vm_page_size() {
2302   assert(page_size != -1, "must call os::init");
2303   return page_size;
2304 }
2305 
2306 // Solaris allocates memory by pages.
2307 int os::vm_allocation_granularity() {
2308   assert(page_size != -1, "must call os::init");
2309   return page_size;
2310 }
2311 
2312 static bool recoverable_mmap_error(int err) {
2313   // See if the error is one we can let the caller handle. This
2314   // list of errno values comes from the Solaris mmap(2) man page.
2315   switch (err) {
2316   case EBADF:
2317   case EINVAL:
2318   case ENOTSUP:
2319     // let the caller deal with these errors
2320     return true;
2321 
2322   default:
2323     // Any remaining errors on this OS can cause our reserved mapping
2324     // to be lost. That can cause confusion where different data
2325     // structures think they have the same memory mapped. The worst
2326     // scenario is if both the VM and a library think they have the
2327     // same memory mapped.
2328     return false;
2329   }
2330 }
2331 
2332 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec,
2333                                     int err) {
2334   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2335           ", %d) failed; error='%s' (errno=%d)", addr, bytes, exec,
2336           strerror(err), err);
2337 }
2338 
2339 static void warn_fail_commit_memory(char* addr, size_t bytes,
2340                                     size_t alignment_hint, bool exec,
2341                                     int err) {
2342   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2343           ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, bytes,
2344           alignment_hint, exec, strerror(err), err);
2345 }
2346 
2347 int os::Solaris::commit_memory_impl(char* addr, size_t bytes, bool exec) {
2348   int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
2349   size_t size = bytes;
2350   char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot);
2351   if (res != NULL) {
2352     if (UseNUMAInterleaving) {
2353       numa_make_global(addr, bytes);
2354     }
2355     return 0;
2356   }
2357 
2358   int err = errno;  // save errno from mmap() call in mmap_chunk()
2359 
2360   if (!recoverable_mmap_error(err)) {
2361     warn_fail_commit_memory(addr, bytes, exec, err);
2362     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, "committing reserved memory.");
2363   }
2364 
2365   return err;
2366 }
2367 
2368 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
2369   return Solaris::commit_memory_impl(addr, bytes, exec) == 0;
2370 }
2371 
2372 void os::pd_commit_memory_or_exit(char* addr, size_t bytes, bool exec,
2373                                   const char* mesg) {
2374   assert(mesg != NULL, "mesg must be specified");
2375   int err = os::Solaris::commit_memory_impl(addr, bytes, exec);
2376   if (err != 0) {
2377     // the caller wants all commit errors to exit with the specified mesg:
2378     warn_fail_commit_memory(addr, bytes, exec, err);
2379     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, "%s", mesg);
2380   }
2381 }
2382 
2383 size_t os::Solaris::page_size_for_alignment(size_t alignment) {
2384   assert(is_size_aligned(alignment, (size_t) vm_page_size()),
2385          SIZE_FORMAT " is not aligned to " SIZE_FORMAT,
2386          alignment, (size_t) vm_page_size());
2387 
2388   for (int i = 0; _page_sizes[i] != 0; i++) {
2389     if (is_size_aligned(alignment, _page_sizes[i])) {
2390       return _page_sizes[i];
2391     }
2392   }
2393 
2394   return (size_t) vm_page_size();
2395 }
2396 
2397 int os::Solaris::commit_memory_impl(char* addr, size_t bytes,
2398                                     size_t alignment_hint, bool exec) {
2399   int err = Solaris::commit_memory_impl(addr, bytes, exec);
2400   if (err == 0 && UseLargePages && alignment_hint > 0) {
2401     assert(is_size_aligned(bytes, alignment_hint),
2402            SIZE_FORMAT " is not aligned to " SIZE_FORMAT, bytes, alignment_hint);
2403 
2404     // The syscall memcntl requires an exact page size (see man memcntl for details).
2405     size_t page_size = page_size_for_alignment(alignment_hint);
2406     if (page_size > (size_t) vm_page_size()) {
2407       (void)Solaris::setup_large_pages(addr, bytes, page_size);
2408     }
2409   }
2410   return err;
2411 }
2412 
2413 bool os::pd_commit_memory(char* addr, size_t bytes, size_t alignment_hint,
2414                           bool exec) {
2415   return Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec) == 0;
2416 }
2417 
2418 void os::pd_commit_memory_or_exit(char* addr, size_t bytes,
2419                                   size_t alignment_hint, bool exec,
2420                                   const char* mesg) {
2421   assert(mesg != NULL, "mesg must be specified");
2422   int err = os::Solaris::commit_memory_impl(addr, bytes, alignment_hint, exec);
2423   if (err != 0) {
2424     // the caller wants all commit errors to exit with the specified mesg:
2425     warn_fail_commit_memory(addr, bytes, alignment_hint, exec, err);
2426     vm_exit_out_of_memory(bytes, OOM_MMAP_ERROR, "%s", mesg);
2427   }
2428 }
2429 
2430 // Uncommit the pages in a specified region.
2431 void os::pd_free_memory(char* addr, size_t bytes, size_t alignment_hint) {
2432   if (madvise(addr, bytes, MADV_FREE) < 0) {
2433     debug_only(warning("MADV_FREE failed."));
2434     return;
2435   }
2436 }
2437 
2438 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
2439   return os::commit_memory(addr, size, !ExecMem);
2440 }
2441 
2442 bool os::remove_stack_guard_pages(char* addr, size_t size) {
2443   return os::uncommit_memory(addr, size);
2444 }
2445 
2446 // Change the page size in a given range.
2447 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2448   assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned.");
2449   assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned.");
2450   if (UseLargePages) {
2451     size_t page_size = Solaris::page_size_for_alignment(alignment_hint);
2452     if (page_size > (size_t) vm_page_size()) {
2453       Solaris::setup_large_pages(addr, bytes, page_size);
2454     }
2455   }
2456 }
2457 
2458 // Tell the OS to make the range local to the first-touching LWP
2459 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2460   assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2461   if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) {
2462     debug_only(warning("MADV_ACCESS_LWP failed."));
2463   }
2464 }
2465 
2466 // Tell the OS that this range would be accessed from different LWPs.
2467 void os::numa_make_global(char *addr, size_t bytes) {
2468   assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2469   if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) {
2470     debug_only(warning("MADV_ACCESS_MANY failed."));
2471   }
2472 }
2473 
2474 // Get the number of the locality groups.
2475 size_t os::numa_get_groups_num() {
2476   size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie());
2477   return n != -1 ? n : 1;
2478 }
2479 
2480 // Get a list of leaf locality groups. A leaf lgroup is group that
2481 // doesn't have any children. Typical leaf group is a CPU or a CPU/memory
2482 // board. An LWP is assigned to one of these groups upon creation.
2483 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2484   if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) {
2485     ids[0] = 0;
2486     return 1;
2487   }
2488   int result_size = 0, top = 1, bottom = 0, cur = 0;
2489   for (int k = 0; k < size; k++) {
2490     int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur],
2491                                    (Solaris::lgrp_id_t*)&ids[top], size - top);
2492     if (r == -1) {
2493       ids[0] = 0;
2494       return 1;
2495     }
2496     if (!r) {
2497       // That's a leaf node.
2498       assert(bottom <= cur, "Sanity check");
2499       // Check if the node has memory
2500       if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur],
2501                                   NULL, 0, LGRP_RSRC_MEM) > 0) {
2502         ids[bottom++] = ids[cur];
2503       }
2504     }
2505     top += r;
2506     cur++;
2507   }
2508   if (bottom == 0) {
2509     // Handle a situation, when the OS reports no memory available.
2510     // Assume UMA architecture.
2511     ids[0] = 0;
2512     return 1;
2513   }
2514   return bottom;
2515 }
2516 
2517 // Detect the topology change. Typically happens during CPU plugging-unplugging.
2518 bool os::numa_topology_changed() {
2519   int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie());
2520   if (is_stale != -1 && is_stale) {
2521     Solaris::lgrp_fini(Solaris::lgrp_cookie());
2522     Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER);
2523     assert(c != 0, "Failure to initialize LGRP API");
2524     Solaris::set_lgrp_cookie(c);
2525     return true;
2526   }
2527   return false;
2528 }
2529 
2530 // Get the group id of the current LWP.
2531 int os::numa_get_group_id() {
2532   int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID);
2533   if (lgrp_id == -1) {
2534     return 0;
2535   }
2536   const int size = os::numa_get_groups_num();
2537   int *ids = (int*)alloca(size * sizeof(int));
2538 
2539   // Get the ids of all lgroups with memory; r is the count.
2540   int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id,
2541                                   (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM);
2542   if (r <= 0) {
2543     return 0;
2544   }
2545   return ids[os::random() % r];
2546 }
2547 
2548 // Request information about the page.
2549 bool os::get_page_info(char *start, page_info* info) {
2550   const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2551   uint64_t addr = (uintptr_t)start;
2552   uint64_t outdata[2];
2553   uint_t validity = 0;
2554 
2555   if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
2556     return false;
2557   }
2558 
2559   info->size = 0;
2560   info->lgrp_id = -1;
2561 
2562   if ((validity & 1) != 0) {
2563     if ((validity & 2) != 0) {
2564       info->lgrp_id = outdata[0];
2565     }
2566     if ((validity & 4) != 0) {
2567       info->size = outdata[1];
2568     }
2569     return true;
2570   }
2571   return false;
2572 }
2573 
2574 // Scan the pages from start to end until a page different than
2575 // the one described in the info parameter is encountered.
2576 char *os::scan_pages(char *start, char* end, page_info* page_expected,
2577                      page_info* page_found) {
2578   const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2579   const size_t types = sizeof(info_types) / sizeof(info_types[0]);
2580   uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT + 1];
2581   uint_t validity[MAX_MEMINFO_CNT];
2582 
2583   size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
2584   uint64_t p = (uint64_t)start;
2585   while (p < (uint64_t)end) {
2586     addrs[0] = p;
2587     size_t addrs_count = 1;
2588     while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] + page_size < (uint64_t)end) {
2589       addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
2590       addrs_count++;
2591     }
2592 
2593     if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
2594       return NULL;
2595     }
2596 
2597     size_t i = 0;
2598     for (; i < addrs_count; i++) {
2599       if ((validity[i] & 1) != 0) {
2600         if ((validity[i] & 4) != 0) {
2601           if (outdata[types * i + 1] != page_expected->size) {
2602             break;
2603           }
2604         } else if (page_expected->size != 0) {
2605           break;
2606         }
2607 
2608         if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) {
2609           if (outdata[types * i] != page_expected->lgrp_id) {
2610             break;
2611           }
2612         }
2613       } else {
2614         return NULL;
2615       }
2616     }
2617 
2618     if (i < addrs_count) {
2619       if ((validity[i] & 2) != 0) {
2620         page_found->lgrp_id = outdata[types * i];
2621       } else {
2622         page_found->lgrp_id = -1;
2623       }
2624       if ((validity[i] & 4) != 0) {
2625         page_found->size = outdata[types * i + 1];
2626       } else {
2627         page_found->size = 0;
2628       }
2629       return (char*)addrs[i];
2630     }
2631 
2632     p = addrs[addrs_count - 1] + page_size;
2633   }
2634   return end;
2635 }
2636 
2637 bool os::pd_uncommit_memory(char* addr, size_t bytes) {
2638   size_t size = bytes;
2639   // Map uncommitted pages PROT_NONE so we fail early if we touch an
2640   // uncommitted page. Otherwise, the read/write might succeed if we
2641   // have enough swap space to back the physical page.
2642   return
2643     NULL != Solaris::mmap_chunk(addr, size,
2644                                 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE,
2645                                 PROT_NONE);
2646 }
2647 
2648 char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) {
2649   char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0);
2650 
2651   if (b == MAP_FAILED) {
2652     return NULL;
2653   }
2654   return b;
2655 }
2656 
2657 char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes,
2658                              size_t alignment_hint, bool fixed) {
2659   char* addr = requested_addr;
2660   int flags = MAP_PRIVATE | MAP_NORESERVE;
2661 
2662   assert(!(fixed && (alignment_hint > 0)),
2663          "alignment hint meaningless with fixed mmap");
2664 
2665   if (fixed) {
2666     flags |= MAP_FIXED;
2667   } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) {
2668     flags |= MAP_ALIGN;
2669     addr = (char*) alignment_hint;
2670   }
2671 
2672   // Map uncommitted pages PROT_NONE so we fail early if we touch an
2673   // uncommitted page. Otherwise, the read/write might succeed if we
2674   // have enough swap space to back the physical page.
2675   return mmap_chunk(addr, bytes, flags, PROT_NONE);
2676 }
2677 
2678 char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
2679                             size_t alignment_hint) {
2680   char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint,
2681                                   (requested_addr != NULL));
2682 
2683   guarantee(requested_addr == NULL || requested_addr == addr,
2684             "OS failed to return requested mmap address.");
2685   return addr;
2686 }
2687 
2688 // Reserve memory at an arbitrary address, only if that area is
2689 // available (and not reserved for something else).
2690 
2691 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2692   const int max_tries = 10;
2693   char* base[max_tries];
2694   size_t size[max_tries];
2695 
2696   // Solaris adds a gap between mmap'ed regions.  The size of the gap
2697   // is dependent on the requested size and the MMU.  Our initial gap
2698   // value here is just a guess and will be corrected later.
2699   bool had_top_overlap = false;
2700   bool have_adjusted_gap = false;
2701   size_t gap = 0x400000;
2702 
2703   // Assert only that the size is a multiple of the page size, since
2704   // that's all that mmap requires, and since that's all we really know
2705   // about at this low abstraction level.  If we need higher alignment,
2706   // we can either pass an alignment to this method or verify alignment
2707   // in one of the methods further up the call chain.  See bug 5044738.
2708   assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
2709 
2710   // Since snv_84, Solaris attempts to honor the address hint - see 5003415.
2711   // Give it a try, if the kernel honors the hint we can return immediately.
2712   char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
2713 
2714   volatile int err = errno;
2715   if (addr == requested_addr) {
2716     return addr;
2717   } else if (addr != NULL) {
2718     pd_unmap_memory(addr, bytes);
2719   }
2720 
2721   if (PrintMiscellaneous && Verbose) {
2722     char buf[256];
2723     buf[0] = '\0';
2724     if (addr == NULL) {
2725       jio_snprintf(buf, sizeof(buf), ": %s", strerror(err));
2726     }
2727     warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at "
2728             PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
2729             "%s", bytes, requested_addr, addr, buf);
2730   }
2731 
2732   // Address hint method didn't work.  Fall back to the old method.
2733   // In theory, once SNV becomes our oldest supported platform, this
2734   // code will no longer be needed.
2735   //
2736   // Repeatedly allocate blocks until the block is allocated at the
2737   // right spot. Give up after max_tries.
2738   int i;
2739   for (i = 0; i < max_tries; ++i) {
2740     base[i] = reserve_memory(bytes);
2741 
2742     if (base[i] != NULL) {
2743       // Is this the block we wanted?
2744       if (base[i] == requested_addr) {
2745         size[i] = bytes;
2746         break;
2747       }
2748 
2749       // check that the gap value is right
2750       if (had_top_overlap && !have_adjusted_gap) {
2751         size_t actual_gap = base[i-1] - base[i] - bytes;
2752         if (gap != actual_gap) {
2753           // adjust the gap value and retry the last 2 allocations
2754           assert(i > 0, "gap adjustment code problem");
2755           have_adjusted_gap = true;  // adjust the gap only once, just in case
2756           gap = actual_gap;
2757           if (PrintMiscellaneous && Verbose) {
2758             warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap);
2759           }
2760           unmap_memory(base[i], bytes);
2761           unmap_memory(base[i-1], size[i-1]);
2762           i-=2;
2763           continue;
2764         }
2765       }
2766 
2767       // Does this overlap the block we wanted? Give back the overlapped
2768       // parts and try again.
2769       //
2770       // There is still a bug in this code: if top_overlap == bytes,
2771       // the overlap is offset from requested region by the value of gap.
2772       // In this case giving back the overlapped part will not work,
2773       // because we'll give back the entire block at base[i] and
2774       // therefore the subsequent allocation will not generate a new gap.
2775       // This could be fixed with a new algorithm that used larger
2776       // or variable size chunks to find the requested region -
2777       // but such a change would introduce additional complications.
2778       // It's rare enough that the planets align for this bug,
2779       // so we'll just wait for a fix for 6204603/5003415 which
2780       // will provide a mmap flag to allow us to avoid this business.
2781 
2782       size_t top_overlap = requested_addr + (bytes + gap) - base[i];
2783       if (top_overlap >= 0 && top_overlap < bytes) {
2784         had_top_overlap = true;
2785         unmap_memory(base[i], top_overlap);
2786         base[i] += top_overlap;
2787         size[i] = bytes - top_overlap;
2788       } else {
2789         size_t bottom_overlap = base[i] + bytes - requested_addr;
2790         if (bottom_overlap >= 0 && bottom_overlap < bytes) {
2791           if (PrintMiscellaneous && Verbose && bottom_overlap == 0) {
2792             warning("attempt_reserve_memory_at: possible alignment bug");
2793           }
2794           unmap_memory(requested_addr, bottom_overlap);
2795           size[i] = bytes - bottom_overlap;
2796         } else {
2797           size[i] = bytes;
2798         }
2799       }
2800     }
2801   }
2802 
2803   // Give back the unused reserved pieces.
2804 
2805   for (int j = 0; j < i; ++j) {
2806     if (base[j] != NULL) {
2807       unmap_memory(base[j], size[j]);
2808     }
2809   }
2810 
2811   return (i < max_tries) ? requested_addr : NULL;
2812 }
2813 
2814 bool os::pd_release_memory(char* addr, size_t bytes) {
2815   size_t size = bytes;
2816   return munmap(addr, size) == 0;
2817 }
2818 
2819 static bool solaris_mprotect(char* addr, size_t bytes, int prot) {
2820   assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()),
2821          "addr must be page aligned");
2822   int retVal = mprotect(addr, bytes, prot);
2823   return retVal == 0;
2824 }
2825 
2826 // Protect memory (Used to pass readonly pages through
2827 // JNI GetArray<type>Elements with empty arrays.)
2828 // Also, used for serialization page and for compressed oops null pointer
2829 // checking.
2830 bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
2831                         bool is_committed) {
2832   unsigned int p = 0;
2833   switch (prot) {
2834   case MEM_PROT_NONE: p = PROT_NONE; break;
2835   case MEM_PROT_READ: p = PROT_READ; break;
2836   case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
2837   case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
2838   default:
2839     ShouldNotReachHere();
2840   }
2841   // is_committed is unused.
2842   return solaris_mprotect(addr, bytes, p);
2843 }
2844 
2845 // guard_memory and unguard_memory only happens within stack guard pages.
2846 // Since ISM pertains only to the heap, guard and unguard memory should not
2847 /// happen with an ISM region.
2848 bool os::guard_memory(char* addr, size_t bytes) {
2849   return solaris_mprotect(addr, bytes, PROT_NONE);
2850 }
2851 
2852 bool os::unguard_memory(char* addr, size_t bytes) {
2853   return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE);
2854 }
2855 
2856 // Large page support
2857 static size_t _large_page_size = 0;
2858 
2859 // Insertion sort for small arrays (descending order).
2860 static void insertion_sort_descending(size_t* array, int len) {
2861   for (int i = 0; i < len; i++) {
2862     size_t val = array[i];
2863     for (size_t key = i; key > 0 && array[key - 1] < val; --key) {
2864       size_t tmp = array[key];
2865       array[key] = array[key - 1];
2866       array[key - 1] = tmp;
2867     }
2868   }
2869 }
2870 
2871 bool os::Solaris::mpss_sanity_check(bool warn, size_t* page_size) {
2872   const unsigned int usable_count = VM_Version::page_size_count();
2873   if (usable_count == 1) {
2874     return false;
2875   }
2876 
2877   // Find the right getpagesizes interface.  When solaris 11 is the minimum
2878   // build platform, getpagesizes() (without the '2') can be called directly.
2879   typedef int (*gps_t)(size_t[], int);
2880   gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2"));
2881   if (gps_func == NULL) {
2882     gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes"));
2883     if (gps_func == NULL) {
2884       if (warn) {
2885         warning("MPSS is not supported by the operating system.");
2886       }
2887       return false;
2888     }
2889   }
2890 
2891   // Fill the array of page sizes.
2892   int n = (*gps_func)(_page_sizes, page_sizes_max);
2893   assert(n > 0, "Solaris bug?");
2894 
2895   if (n == page_sizes_max) {
2896     // Add a sentinel value (necessary only if the array was completely filled
2897     // since it is static (zeroed at initialization)).
2898     _page_sizes[--n] = 0;
2899     DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");)
2900   }
2901   assert(_page_sizes[n] == 0, "missing sentinel");
2902   trace_page_sizes("available page sizes", _page_sizes, n);
2903 
2904   if (n == 1) return false;     // Only one page size available.
2905 
2906   // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and
2907   // select up to usable_count elements.  First sort the array, find the first
2908   // acceptable value, then copy the usable sizes to the top of the array and
2909   // trim the rest.  Make sure to include the default page size :-).
2910   //
2911   // A better policy could get rid of the 4M limit by taking the sizes of the
2912   // important VM memory regions (java heap and possibly the code cache) into
2913   // account.
2914   insertion_sort_descending(_page_sizes, n);
2915   const size_t size_limit =
2916     FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes;
2917   int beg;
2918   for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */;
2919   const int end = MIN2((int)usable_count, n) - 1;
2920   for (int cur = 0; cur < end; ++cur, ++beg) {
2921     _page_sizes[cur] = _page_sizes[beg];
2922   }
2923   _page_sizes[end] = vm_page_size();
2924   _page_sizes[end + 1] = 0;
2925 
2926   if (_page_sizes[end] > _page_sizes[end - 1]) {
2927     // Default page size is not the smallest; sort again.
2928     insertion_sort_descending(_page_sizes, end + 1);
2929   }
2930   *page_size = _page_sizes[0];
2931 
2932   trace_page_sizes("usable page sizes", _page_sizes, end + 1);
2933   return true;
2934 }
2935 
2936 void os::large_page_init() {
2937   if (UseLargePages) {
2938     // print a warning if any large page related flag is specified on command line
2939     bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages)        ||
2940                            !FLAG_IS_DEFAULT(LargePageSizeInBytes);
2941 
2942     UseLargePages = Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size);
2943   }
2944 }
2945 
2946 bool os::Solaris::is_valid_page_size(size_t bytes) {
2947   for (int i = 0; _page_sizes[i] != 0; i++) {
2948     if (_page_sizes[i] == bytes) {
2949       return true;
2950     }
2951   }
2952   return false;
2953 }
2954 
2955 bool os::Solaris::setup_large_pages(caddr_t start, size_t bytes, size_t align) {
2956   assert(is_valid_page_size(align), SIZE_FORMAT " is not a valid page size", align);
2957   assert(is_ptr_aligned((void*) start, align),
2958          PTR_FORMAT " is not aligned to " SIZE_FORMAT, p2i((void*) start), align);
2959   assert(is_size_aligned(bytes, align),
2960          SIZE_FORMAT " is not aligned to " SIZE_FORMAT, bytes, align);
2961 
2962   // Signal to OS that we want large pages for addresses
2963   // from addr, addr + bytes
2964   struct memcntl_mha mpss_struct;
2965   mpss_struct.mha_cmd = MHA_MAPSIZE_VA;
2966   mpss_struct.mha_pagesize = align;
2967   mpss_struct.mha_flags = 0;
2968   // Upon successful completion, memcntl() returns 0
2969   if (memcntl(start, bytes, MC_HAT_ADVISE, (caddr_t) &mpss_struct, 0, 0)) {
2970     debug_only(warning("Attempt to use MPSS failed."));
2971     return false;
2972   }
2973   return true;
2974 }
2975 
2976 char* os::reserve_memory_special(size_t size, size_t alignment, char* addr, bool exec) {
2977   fatal("os::reserve_memory_special should not be called on Solaris.");
2978   return NULL;
2979 }
2980 
2981 bool os::release_memory_special(char* base, size_t bytes) {
2982   fatal("os::release_memory_special should not be called on Solaris.");
2983   return false;
2984 }
2985 
2986 size_t os::large_page_size() {
2987   return _large_page_size;
2988 }
2989 
2990 // MPSS allows application to commit large page memory on demand; with ISM
2991 // the entire memory region must be allocated as shared memory.
2992 bool os::can_commit_large_page_memory() {
2993   return true;
2994 }
2995 
2996 bool os::can_execute_large_page_memory() {
2997   return true;
2998 }
2999 
3000 // Read calls from inside the vm need to perform state transitions
3001 size_t os::read(int fd, void *buf, unsigned int nBytes) {
3002   size_t res;
3003   JavaThread* thread = (JavaThread*)Thread::current();
3004   assert(thread->thread_state() == _thread_in_vm, "Assumed _thread_in_vm");
3005   ThreadBlockInVM tbiv(thread);
3006   RESTARTABLE(::read(fd, buf, (size_t) nBytes), res);
3007   return res;
3008 }
3009 
3010 size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
3011   size_t res;
3012   JavaThread* thread = (JavaThread*)Thread::current();
3013   assert(thread->thread_state() == _thread_in_vm, "Assumed _thread_in_vm");
3014   ThreadBlockInVM tbiv(thread);
3015   RESTARTABLE(::pread(fd, buf, (size_t) nBytes, offset), res);
3016   return res;
3017 }
3018 
3019 size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
3020   size_t res;
3021   assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
3022          "Assumed _thread_in_native");
3023   RESTARTABLE(::read(fd, buf, (size_t) nBytes), res);
3024   return res;
3025 }
3026 
3027 void os::naked_short_sleep(jlong ms) {
3028   assert(ms < 1000, "Un-interruptable sleep, short time use only");
3029 
3030   // usleep is deprecated and removed from POSIX, in favour of nanosleep, but
3031   // Solaris requires -lrt for this.
3032   usleep((ms * 1000));
3033 
3034   return;
3035 }
3036 
3037 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
3038 void os::infinite_sleep() {
3039   while (true) {    // sleep forever ...
3040     ::sleep(100);   // ... 100 seconds at a time
3041   }
3042 }
3043 
3044 // Used to convert frequent JVM_Yield() to nops
3045 bool os::dont_yield() {
3046   if (DontYieldALot) {
3047     static hrtime_t last_time = 0;
3048     hrtime_t diff = getTimeNanos() - last_time;
3049 
3050     if (diff < DontYieldALotInterval * 1000000) {
3051       return true;
3052     }
3053 
3054     last_time += diff;
3055 
3056     return false;
3057   } else {
3058     return false;
3059   }
3060 }
3061 
3062 // Note that yield semantics are defined by the scheduling class to which
3063 // the thread currently belongs.  Typically, yield will _not yield to
3064 // other equal or higher priority threads that reside on the dispatch queues
3065 // of other CPUs.
3066 
3067 void os::naked_yield() {
3068   thr_yield();
3069 }
3070 
3071 // Interface for setting lwp priorities.  If we are using T2 libthread,
3072 // which forces the use of BoundThreads or we manually set UseBoundThreads,
3073 // all of our threads will be assigned to real lwp's.  Using the thr_setprio
3074 // function is meaningless in this mode so we must adjust the real lwp's priority
3075 // The routines below implement the getting and setting of lwp priorities.
3076 //
3077 // Note: T2 is now the only supported libthread. UseBoundThreads flag is
3078 //       being deprecated and all threads are now BoundThreads
3079 //
3080 // Note: There are three priority scales used on Solaris.  Java priotities
3081 //       which range from 1 to 10, libthread "thr_setprio" scale which range
3082 //       from 0 to 127, and the current scheduling class of the process we
3083 //       are running in.  This is typically from -60 to +60.
3084 //       The setting of the lwp priorities in done after a call to thr_setprio
3085 //       so Java priorities are mapped to libthread priorities and we map from
3086 //       the latter to lwp priorities.  We don't keep priorities stored in
3087 //       Java priorities since some of our worker threads want to set priorities
3088 //       higher than all Java threads.
3089 //
3090 // For related information:
3091 // (1)  man -s 2 priocntl
3092 // (2)  man -s 4 priocntl
3093 // (3)  man dispadmin
3094 // =    librt.so
3095 // =    libthread/common/rtsched.c - thrp_setlwpprio().
3096 // =    ps -cL <pid> ... to validate priority.
3097 // =    sched_get_priority_min and _max
3098 //              pthread_create
3099 //              sched_setparam
3100 //              pthread_setschedparam
3101 //
3102 // Assumptions:
3103 // +    We assume that all threads in the process belong to the same
3104 //              scheduling class.   IE. an homogenous process.
3105 // +    Must be root or in IA group to change change "interactive" attribute.
3106 //              Priocntl() will fail silently.  The only indication of failure is when
3107 //              we read-back the value and notice that it hasn't changed.
3108 // +    Interactive threads enter the runq at the head, non-interactive at the tail.
3109 // +    For RT, change timeslice as well.  Invariant:
3110 //              constant "priority integral"
3111 //              Konst == TimeSlice * (60-Priority)
3112 //              Given a priority, compute appropriate timeslice.
3113 // +    Higher numerical values have higher priority.
3114 
3115 // sched class attributes
3116 typedef struct {
3117   int   schedPolicy;              // classID
3118   int   maxPrio;
3119   int   minPrio;
3120 } SchedInfo;
3121 
3122 
3123 static SchedInfo tsLimits, iaLimits, rtLimits, fxLimits;
3124 
3125 #ifdef ASSERT
3126 static int  ReadBackValidate = 1;
3127 #endif
3128 static int  myClass     = 0;
3129 static int  myMin       = 0;
3130 static int  myMax       = 0;
3131 static int  myCur       = 0;
3132 static bool priocntl_enable = false;
3133 
3134 static const int criticalPrio = FXCriticalPriority;
3135 static int java_MaxPriority_to_os_priority = 0; // Saved mapping
3136 
3137 
3138 // lwp_priocntl_init
3139 //
3140 // Try to determine the priority scale for our process.
3141 //
3142 // Return errno or 0 if OK.
3143 //
3144 static int lwp_priocntl_init() {
3145   int rslt;
3146   pcinfo_t ClassInfo;
3147   pcparms_t ParmInfo;
3148   int i;
3149 
3150   if (!UseThreadPriorities) return 0;
3151 
3152   // If ThreadPriorityPolicy is 1, switch tables
3153   if (ThreadPriorityPolicy == 1) {
3154     for (i = 0; i < CriticalPriority+1; i++)
3155       os::java_to_os_priority[i] = prio_policy1[i];
3156   }
3157   if (UseCriticalJavaThreadPriority) {
3158     // MaxPriority always maps to the FX scheduling class and criticalPrio.
3159     // See set_native_priority() and set_lwp_class_and_priority().
3160     // Save original MaxPriority mapping in case attempt to
3161     // use critical priority fails.
3162     java_MaxPriority_to_os_priority = os::java_to_os_priority[MaxPriority];
3163     // Set negative to distinguish from other priorities
3164     os::java_to_os_priority[MaxPriority] = -criticalPrio;
3165   }
3166 
3167   // Get IDs for a set of well-known scheduling classes.
3168   // TODO-FIXME: GETCLINFO returns the current # of classes in the
3169   // the system.  We should have a loop that iterates over the
3170   // classID values, which are known to be "small" integers.
3171 
3172   strcpy(ClassInfo.pc_clname, "TS");
3173   ClassInfo.pc_cid = -1;
3174   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3175   if (rslt < 0) return errno;
3176   assert(ClassInfo.pc_cid != -1, "cid for TS class is -1");
3177   tsLimits.schedPolicy = ClassInfo.pc_cid;
3178   tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri;
3179   tsLimits.minPrio = -tsLimits.maxPrio;
3180 
3181   strcpy(ClassInfo.pc_clname, "IA");
3182   ClassInfo.pc_cid = -1;
3183   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3184   if (rslt < 0) return errno;
3185   assert(ClassInfo.pc_cid != -1, "cid for IA class is -1");
3186   iaLimits.schedPolicy = ClassInfo.pc_cid;
3187   iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri;
3188   iaLimits.minPrio = -iaLimits.maxPrio;
3189 
3190   strcpy(ClassInfo.pc_clname, "RT");
3191   ClassInfo.pc_cid = -1;
3192   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3193   if (rslt < 0) return errno;
3194   assert(ClassInfo.pc_cid != -1, "cid for RT class is -1");
3195   rtLimits.schedPolicy = ClassInfo.pc_cid;
3196   rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri;
3197   rtLimits.minPrio = 0;
3198 
3199   strcpy(ClassInfo.pc_clname, "FX");
3200   ClassInfo.pc_cid = -1;
3201   rslt = priocntl(P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3202   if (rslt < 0) return errno;
3203   assert(ClassInfo.pc_cid != -1, "cid for FX class is -1");
3204   fxLimits.schedPolicy = ClassInfo.pc_cid;
3205   fxLimits.maxPrio = ((fxinfo_t*)ClassInfo.pc_clinfo)->fx_maxupri;
3206   fxLimits.minPrio = 0;
3207 
3208   // Query our "current" scheduling class.
3209   // This will normally be IA, TS or, rarely, FX or RT.
3210   memset(&ParmInfo, 0, sizeof(ParmInfo));
3211   ParmInfo.pc_cid = PC_CLNULL;
3212   rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
3213   if (rslt < 0) return errno;
3214   myClass = ParmInfo.pc_cid;
3215 
3216   // We now know our scheduling classId, get specific information
3217   // about the class.
3218   ClassInfo.pc_cid = myClass;
3219   ClassInfo.pc_clname[0] = 0;
3220   rslt = priocntl((idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo);
3221   if (rslt < 0) return errno;
3222 
3223   if (ThreadPriorityVerbose) {
3224     tty->print_cr("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname);
3225   }
3226 
3227   memset(&ParmInfo, 0, sizeof(pcparms_t));
3228   ParmInfo.pc_cid = PC_CLNULL;
3229   rslt = priocntl(P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
3230   if (rslt < 0) return errno;
3231 
3232   if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3233     myMin = rtLimits.minPrio;
3234     myMax = rtLimits.maxPrio;
3235   } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3236     iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3237     myMin = iaLimits.minPrio;
3238     myMax = iaLimits.maxPrio;
3239     myMax = MIN2(myMax, (int)iaInfo->ia_uprilim);       // clamp - restrict
3240   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3241     tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3242     myMin = tsLimits.minPrio;
3243     myMax = tsLimits.maxPrio;
3244     myMax = MIN2(myMax, (int)tsInfo->ts_uprilim);       // clamp - restrict
3245   } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) {
3246     fxparms_t *fxInfo = (fxparms_t*)ParmInfo.pc_clparms;
3247     myMin = fxLimits.minPrio;
3248     myMax = fxLimits.maxPrio;
3249     myMax = MIN2(myMax, (int)fxInfo->fx_uprilim);       // clamp - restrict
3250   } else {
3251     // No clue - punt
3252     if (ThreadPriorityVerbose) {
3253       tty->print_cr("Unknown scheduling class: %s ... \n",
3254                     ClassInfo.pc_clname);
3255     }
3256     return EINVAL;      // no clue, punt
3257   }
3258 
3259   if (ThreadPriorityVerbose) {
3260     tty->print_cr("Thread priority Range: [%d..%d]\n", myMin, myMax);
3261   }
3262 
3263   priocntl_enable = true;  // Enable changing priorities
3264   return 0;
3265 }
3266 
3267 #define IAPRI(x)        ((iaparms_t *)((x).pc_clparms))
3268 #define RTPRI(x)        ((rtparms_t *)((x).pc_clparms))
3269 #define TSPRI(x)        ((tsparms_t *)((x).pc_clparms))
3270 #define FXPRI(x)        ((fxparms_t *)((x).pc_clparms))
3271 
3272 
3273 // scale_to_lwp_priority
3274 //
3275 // Convert from the libthread "thr_setprio" scale to our current
3276 // lwp scheduling class scale.
3277 //
3278 static int scale_to_lwp_priority(int rMin, int rMax, int x) {
3279   int v;
3280 
3281   if (x == 127) return rMax;            // avoid round-down
3282   v = (((x*(rMax-rMin)))/128)+rMin;
3283   return v;
3284 }
3285 
3286 
3287 // set_lwp_class_and_priority
3288 int set_lwp_class_and_priority(int ThreadID, int lwpid,
3289                                int newPrio, int new_class, bool scale) {
3290   int rslt;
3291   int Actual, Expected, prv;
3292   pcparms_t ParmInfo;                   // for GET-SET
3293 #ifdef ASSERT
3294   pcparms_t ReadBack;                   // for readback
3295 #endif
3296 
3297   // Set priority via PC_GETPARMS, update, PC_SETPARMS
3298   // Query current values.
3299   // TODO: accelerate this by eliminating the PC_GETPARMS call.
3300   // Cache "pcparms_t" in global ParmCache.
3301   // TODO: elide set-to-same-value
3302 
3303   // If something went wrong on init, don't change priorities.
3304   if (!priocntl_enable) {
3305     if (ThreadPriorityVerbose) {
3306       tty->print_cr("Trying to set priority but init failed, ignoring");
3307     }
3308     return EINVAL;
3309   }
3310 
3311   // If lwp hasn't started yet, just return
3312   // the _start routine will call us again.
3313   if (lwpid <= 0) {
3314     if (ThreadPriorityVerbose) {
3315       tty->print_cr("deferring the set_lwp_class_and_priority of thread "
3316                     INTPTR_FORMAT " to %d, lwpid not set",
3317                     ThreadID, newPrio);
3318     }
3319     return 0;
3320   }
3321 
3322   if (ThreadPriorityVerbose) {
3323     tty->print_cr ("set_lwp_class_and_priority("
3324                    INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ",
3325                    ThreadID, lwpid, newPrio);
3326   }
3327 
3328   memset(&ParmInfo, 0, sizeof(pcparms_t));
3329   ParmInfo.pc_cid = PC_CLNULL;
3330   rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo);
3331   if (rslt < 0) return errno;
3332 
3333   int cur_class = ParmInfo.pc_cid;
3334   ParmInfo.pc_cid = (id_t)new_class;
3335 
3336   if (new_class == rtLimits.schedPolicy) {
3337     rtparms_t *rtInfo  = (rtparms_t*)ParmInfo.pc_clparms;
3338     rtInfo->rt_pri     = scale ? scale_to_lwp_priority(rtLimits.minPrio,
3339                                                        rtLimits.maxPrio, newPrio)
3340                                : newPrio;
3341     rtInfo->rt_tqsecs  = RT_NOCHANGE;
3342     rtInfo->rt_tqnsecs = RT_NOCHANGE;
3343     if (ThreadPriorityVerbose) {
3344       tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri);
3345     }
3346   } else if (new_class == iaLimits.schedPolicy) {
3347     iaparms_t* iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3348     int maxClamped     = MIN2(iaLimits.maxPrio,
3349                               cur_class == new_class
3350                               ? (int)iaInfo->ia_uprilim : iaLimits.maxPrio);
3351     iaInfo->ia_upri    = scale ? scale_to_lwp_priority(iaLimits.minPrio,
3352                                                        maxClamped, newPrio)
3353                                : newPrio;
3354     iaInfo->ia_uprilim = cur_class == new_class
3355                            ? IA_NOCHANGE : (pri_t)iaLimits.maxPrio;
3356     iaInfo->ia_mode    = IA_NOCHANGE;
3357     if (ThreadPriorityVerbose) {
3358       tty->print_cr("IA: [%d...%d] %d->%d\n",
3359                     iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri);
3360     }
3361   } else if (new_class == tsLimits.schedPolicy) {
3362     tsparms_t* tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3363     int maxClamped     = MIN2(tsLimits.maxPrio,
3364                               cur_class == new_class
3365                               ? (int)tsInfo->ts_uprilim : tsLimits.maxPrio);
3366     tsInfo->ts_upri    = scale ? scale_to_lwp_priority(tsLimits.minPrio,
3367                                                        maxClamped, newPrio)
3368                                : newPrio;
3369     tsInfo->ts_uprilim = cur_class == new_class
3370                            ? TS_NOCHANGE : (pri_t)tsLimits.maxPrio;
3371     if (ThreadPriorityVerbose) {
3372       tty->print_cr("TS: [%d...%d] %d->%d\n",
3373                     tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri);
3374     }
3375   } else if (new_class == fxLimits.schedPolicy) {
3376     fxparms_t* fxInfo  = (fxparms_t*)ParmInfo.pc_clparms;
3377     int maxClamped     = MIN2(fxLimits.maxPrio,
3378                               cur_class == new_class
3379                               ? (int)fxInfo->fx_uprilim : fxLimits.maxPrio);
3380     fxInfo->fx_upri    = scale ? scale_to_lwp_priority(fxLimits.minPrio,
3381                                                        maxClamped, newPrio)
3382                                : newPrio;
3383     fxInfo->fx_uprilim = cur_class == new_class
3384                            ? FX_NOCHANGE : (pri_t)fxLimits.maxPrio;
3385     fxInfo->fx_tqsecs  = FX_NOCHANGE;
3386     fxInfo->fx_tqnsecs = FX_NOCHANGE;
3387     if (ThreadPriorityVerbose) {
3388       tty->print_cr("FX: [%d...%d] %d->%d\n",
3389                     fxLimits.minPrio, maxClamped, newPrio, fxInfo->fx_upri);
3390     }
3391   } else {
3392     if (ThreadPriorityVerbose) {
3393       tty->print_cr("Unknown new scheduling class %d\n", new_class);
3394     }
3395     return EINVAL;    // no clue, punt
3396   }
3397 
3398   rslt = priocntl(P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo);
3399   if (ThreadPriorityVerbose && rslt) {
3400     tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno);
3401   }
3402   if (rslt < 0) return errno;
3403 
3404 #ifdef ASSERT
3405   // Sanity check: read back what we just attempted to set.
3406   // In theory it could have changed in the interim ...
3407   //
3408   // The priocntl system call is tricky.
3409   // Sometimes it'll validate the priority value argument and
3410   // return EINVAL if unhappy.  At other times it fails silently.
3411   // Readbacks are prudent.
3412 
3413   if (!ReadBackValidate) return 0;
3414 
3415   memset(&ReadBack, 0, sizeof(pcparms_t));
3416   ReadBack.pc_cid = PC_CLNULL;
3417   rslt = priocntl(P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack);
3418   assert(rslt >= 0, "priocntl failed");
3419   Actual = Expected = 0xBAD;
3420   assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match");
3421   if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3422     Actual   = RTPRI(ReadBack)->rt_pri;
3423     Expected = RTPRI(ParmInfo)->rt_pri;
3424   } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3425     Actual   = IAPRI(ReadBack)->ia_upri;
3426     Expected = IAPRI(ParmInfo)->ia_upri;
3427   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3428     Actual   = TSPRI(ReadBack)->ts_upri;
3429     Expected = TSPRI(ParmInfo)->ts_upri;
3430   } else if (ParmInfo.pc_cid == fxLimits.schedPolicy) {
3431     Actual   = FXPRI(ReadBack)->fx_upri;
3432     Expected = FXPRI(ParmInfo)->fx_upri;
3433   } else {
3434     if (ThreadPriorityVerbose) {
3435       tty->print_cr("set_lwp_class_and_priority: unexpected class in readback: %d\n",
3436                     ParmInfo.pc_cid);
3437     }
3438   }
3439 
3440   if (Actual != Expected) {
3441     if (ThreadPriorityVerbose) {
3442       tty->print_cr ("set_lwp_class_and_priority(%d %d) Class=%d: actual=%d vs expected=%d\n",
3443                      lwpid, newPrio, ReadBack.pc_cid, Actual, Expected);
3444     }
3445   }
3446 #endif
3447 
3448   return 0;
3449 }
3450 
3451 // Solaris only gives access to 128 real priorities at a time,
3452 // so we expand Java's ten to fill this range.  This would be better
3453 // if we dynamically adjusted relative priorities.
3454 //
3455 // The ThreadPriorityPolicy option allows us to select 2 different
3456 // priority scales.
3457 //
3458 // ThreadPriorityPolicy=0
3459 // Since the Solaris' default priority is MaximumPriority, we do not
3460 // set a priority lower than Max unless a priority lower than
3461 // NormPriority is requested.
3462 //
3463 // ThreadPriorityPolicy=1
3464 // This mode causes the priority table to get filled with
3465 // linear values.  NormPriority get's mapped to 50% of the
3466 // Maximum priority an so on.  This will cause VM threads
3467 // to get unfair treatment against other Solaris processes
3468 // which do not explicitly alter their thread priorities.
3469 
3470 int os::java_to_os_priority[CriticalPriority + 1] = {
3471   -99999,         // 0 Entry should never be used
3472 
3473   0,              // 1 MinPriority
3474   32,             // 2
3475   64,             // 3
3476 
3477   96,             // 4
3478   127,            // 5 NormPriority
3479   127,            // 6
3480 
3481   127,            // 7
3482   127,            // 8
3483   127,            // 9 NearMaxPriority
3484 
3485   127,            // 10 MaxPriority
3486 
3487   -criticalPrio   // 11 CriticalPriority
3488 };
3489 
3490 OSReturn os::set_native_priority(Thread* thread, int newpri) {
3491   OSThread* osthread = thread->osthread();
3492 
3493   // Save requested priority in case the thread hasn't been started
3494   osthread->set_native_priority(newpri);
3495 
3496   // Check for critical priority request
3497   bool fxcritical = false;
3498   if (newpri == -criticalPrio) {
3499     fxcritical = true;
3500     newpri = criticalPrio;
3501   }
3502 
3503   assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping");
3504   if (!UseThreadPriorities) return OS_OK;
3505 
3506   int status = 0;
3507 
3508   if (!fxcritical) {
3509     // Use thr_setprio only if we have a priority that thr_setprio understands
3510     status = thr_setprio(thread->osthread()->thread_id(), newpri);
3511   }
3512 
3513   int lwp_status =
3514           set_lwp_class_and_priority(osthread->thread_id(),
3515                                      osthread->lwp_id(),
3516                                      newpri,
3517                                      fxcritical ? fxLimits.schedPolicy : myClass,
3518                                      !fxcritical);
3519   if (lwp_status != 0 && fxcritical) {
3520     // Try again, this time without changing the scheduling class
3521     newpri = java_MaxPriority_to_os_priority;
3522     lwp_status = set_lwp_class_and_priority(osthread->thread_id(),
3523                                             osthread->lwp_id(),
3524                                             newpri, myClass, false);
3525   }
3526   status |= lwp_status;
3527   return (status == 0) ? OS_OK : OS_ERR;
3528 }
3529 
3530 
3531 OSReturn os::get_native_priority(const Thread* const thread,
3532                                  int *priority_ptr) {
3533   int p;
3534   if (!UseThreadPriorities) {
3535     *priority_ptr = NormalPriority;
3536     return OS_OK;
3537   }
3538   int status = thr_getprio(thread->osthread()->thread_id(), &p);
3539   if (status != 0) {
3540     return OS_ERR;
3541   }
3542   *priority_ptr = p;
3543   return OS_OK;
3544 }
3545 
3546 
3547 // Hint to the underlying OS that a task switch would not be good.
3548 // Void return because it's a hint and can fail.
3549 void os::hint_no_preempt() {
3550   schedctl_start(schedctl_init());
3551 }
3552 
3553 static void resume_clear_context(OSThread *osthread) {
3554   osthread->set_ucontext(NULL);
3555 }
3556 
3557 static void suspend_save_context(OSThread *osthread, ucontext_t* context) {
3558   osthread->set_ucontext(context);
3559 }
3560 
3561 static PosixSemaphore sr_semaphore;
3562 
3563 void os::Solaris::SR_handler(Thread* thread, ucontext_t* uc) {
3564   // Save and restore errno to avoid confusing native code with EINTR
3565   // after sigsuspend.
3566   int old_errno = errno;
3567 
3568   OSThread* osthread = thread->osthread();
3569   assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
3570 
3571   os::SuspendResume::State current = osthread->sr.state();
3572   if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
3573     suspend_save_context(osthread, uc);
3574 
3575     // attempt to switch the state, we assume we had a SUSPEND_REQUEST
3576     os::SuspendResume::State state = osthread->sr.suspended();
3577     if (state == os::SuspendResume::SR_SUSPENDED) {
3578       sigset_t suspend_set;  // signals for sigsuspend()
3579 
3580       // get current set of blocked signals and unblock resume signal
3581       thr_sigsetmask(SIG_BLOCK, NULL, &suspend_set);
3582       sigdelset(&suspend_set, os::Solaris::SIGasync());
3583 
3584       sr_semaphore.signal();
3585       // wait here until we are resumed
3586       while (1) {
3587         sigsuspend(&suspend_set);
3588 
3589         os::SuspendResume::State result = osthread->sr.running();
3590         if (result == os::SuspendResume::SR_RUNNING) {
3591           sr_semaphore.signal();
3592           break;
3593         }
3594       }
3595 
3596     } else if (state == os::SuspendResume::SR_RUNNING) {
3597       // request was cancelled, continue
3598     } else {
3599       ShouldNotReachHere();
3600     }
3601 
3602     resume_clear_context(osthread);
3603   } else if (current == os::SuspendResume::SR_RUNNING) {
3604     // request was cancelled, continue
3605   } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
3606     // ignore
3607   } else {
3608     // ignore
3609   }
3610 
3611   errno = old_errno;
3612 }
3613 
3614 void os::print_statistics() {
3615 }
3616 
3617 int os::message_box(const char* title, const char* message) {
3618   int i;
3619   fdStream err(defaultStream::error_fd());
3620   for (i = 0; i < 78; i++) err.print_raw("=");
3621   err.cr();
3622   err.print_raw_cr(title);
3623   for (i = 0; i < 78; i++) err.print_raw("-");
3624   err.cr();
3625   err.print_raw_cr(message);
3626   for (i = 0; i < 78; i++) err.print_raw("=");
3627   err.cr();
3628 
3629   char buf[16];
3630   // Prevent process from exiting upon "read error" without consuming all CPU
3631   while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
3632 
3633   return buf[0] == 'y' || buf[0] == 'Y';
3634 }
3635 
3636 static int sr_notify(OSThread* osthread) {
3637   int status = thr_kill(osthread->thread_id(), os::Solaris::SIGasync());
3638   assert_status(status == 0, status, "thr_kill");
3639   return status;
3640 }
3641 
3642 // "Randomly" selected value for how long we want to spin
3643 // before bailing out on suspending a thread, also how often
3644 // we send a signal to a thread we want to resume
3645 static const int RANDOMLY_LARGE_INTEGER = 1000000;
3646 static const int RANDOMLY_LARGE_INTEGER2 = 100;
3647 
3648 static bool do_suspend(OSThread* osthread) {
3649   assert(osthread->sr.is_running(), "thread should be running");
3650   assert(!sr_semaphore.trywait(), "semaphore has invalid state");
3651 
3652   // mark as suspended and send signal
3653   if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
3654     // failed to switch, state wasn't running?
3655     ShouldNotReachHere();
3656     return false;
3657   }
3658 
3659   if (sr_notify(osthread) != 0) {
3660     ShouldNotReachHere();
3661   }
3662 
3663   // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
3664   while (true) {
3665     if (sr_semaphore.timedwait(0, 2000 * NANOSECS_PER_MILLISEC)) {
3666       break;
3667     } else {
3668       // timeout
3669       os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
3670       if (cancelled == os::SuspendResume::SR_RUNNING) {
3671         return false;
3672       } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
3673         // make sure that we consume the signal on the semaphore as well
3674         sr_semaphore.wait();
3675         break;
3676       } else {
3677         ShouldNotReachHere();
3678         return false;
3679       }
3680     }
3681   }
3682 
3683   guarantee(osthread->sr.is_suspended(), "Must be suspended");
3684   return true;
3685 }
3686 
3687 static void do_resume(OSThread* osthread) {
3688   assert(osthread->sr.is_suspended(), "thread should be suspended");
3689   assert(!sr_semaphore.trywait(), "invalid semaphore state");
3690 
3691   if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
3692     // failed to switch to WAKEUP_REQUEST
3693     ShouldNotReachHere();
3694     return;
3695   }
3696 
3697   while (true) {
3698     if (sr_notify(osthread) == 0) {
3699       if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
3700         if (osthread->sr.is_running()) {
3701           return;
3702         }
3703       }
3704     } else {
3705       ShouldNotReachHere();
3706     }
3707   }
3708 
3709   guarantee(osthread->sr.is_running(), "Must be running!");
3710 }
3711 
3712 void os::SuspendedThreadTask::internal_do_task() {
3713   if (do_suspend(_thread->osthread())) {
3714     SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
3715     do_task(context);
3716     do_resume(_thread->osthread());
3717   }
3718 }
3719 
3720 class PcFetcher : public os::SuspendedThreadTask {
3721  public:
3722   PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
3723   ExtendedPC result();
3724  protected:
3725   void do_task(const os::SuspendedThreadTaskContext& context);
3726  private:
3727   ExtendedPC _epc;
3728 };
3729 
3730 ExtendedPC PcFetcher::result() {
3731   guarantee(is_done(), "task is not done yet.");
3732   return _epc;
3733 }
3734 
3735 void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
3736   Thread* thread = context.thread();
3737   OSThread* osthread = thread->osthread();
3738   if (osthread->ucontext() != NULL) {
3739     _epc = os::Solaris::ucontext_get_pc((ucontext_t *) context.ucontext());
3740   } else {
3741     // NULL context is unexpected, double-check this is the VMThread
3742     guarantee(thread->is_VM_thread(), "can only be called for VMThread");
3743   }
3744 }
3745 
3746 // A lightweight implementation that does not suspend the target thread and
3747 // thus returns only a hint. Used for profiling only!
3748 ExtendedPC os::get_thread_pc(Thread* thread) {
3749   // Make sure that it is called by the watcher and the Threads lock is owned.
3750   assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock");
3751   // For now, is only used to profile the VM Thread
3752   assert(thread->is_VM_thread(), "Can only be called for VMThread");
3753   PcFetcher fetcher(thread);
3754   fetcher.run();
3755   return fetcher.result();
3756 }
3757 
3758 
3759 // This does not do anything on Solaris. This is basically a hook for being
3760 // able to use structured exception handling (thread-local exception filters) on, e.g., Win32.
3761 void os::os_exception_wrapper(java_call_t f, JavaValue* value,
3762                               const methodHandle& method, JavaCallArguments* args,
3763                               Thread* thread) {
3764   f(value, method, args, thread);
3765 }
3766 
3767 // This routine may be used by user applications as a "hook" to catch signals.
3768 // The user-defined signal handler must pass unrecognized signals to this
3769 // routine, and if it returns true (non-zero), then the signal handler must
3770 // return immediately.  If the flag "abort_if_unrecognized" is true, then this
3771 // routine will never retun false (zero), but instead will execute a VM panic
3772 // routine kill the process.
3773 //
3774 // If this routine returns false, it is OK to call it again.  This allows
3775 // the user-defined signal handler to perform checks either before or after
3776 // the VM performs its own checks.  Naturally, the user code would be making
3777 // a serious error if it tried to handle an exception (such as a null check
3778 // or breakpoint) that the VM was generating for its own correct operation.
3779 //
3780 // This routine may recognize any of the following kinds of signals:
3781 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ,
3782 // os::Solaris::SIGasync
3783 // It should be consulted by handlers for any of those signals.
3784 //
3785 // The caller of this routine must pass in the three arguments supplied
3786 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
3787 // field of the structure passed to sigaction().  This routine assumes that
3788 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
3789 //
3790 // Note that the VM will print warnings if it detects conflicting signal
3791 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
3792 //
3793 extern "C" JNIEXPORT int JVM_handle_solaris_signal(int signo,
3794                                                    siginfo_t* siginfo,
3795                                                    void* ucontext,
3796                                                    int abort_if_unrecognized);
3797 
3798 
3799 void signalHandler(int sig, siginfo_t* info, void* ucVoid) {
3800   int orig_errno = errno;  // Preserve errno value over signal handler.
3801   JVM_handle_solaris_signal(sig, info, ucVoid, true);
3802   errno = orig_errno;
3803 }
3804 
3805 // This boolean allows users to forward their own non-matching signals
3806 // to JVM_handle_solaris_signal, harmlessly.
3807 bool os::Solaris::signal_handlers_are_installed = false;
3808 
3809 // For signal-chaining
3810 bool os::Solaris::libjsig_is_loaded = false;
3811 typedef struct sigaction *(*get_signal_t)(int);
3812 get_signal_t os::Solaris::get_signal_action = NULL;
3813 
3814 struct sigaction* os::Solaris::get_chained_signal_action(int sig) {
3815   struct sigaction *actp = NULL;
3816 
3817   if ((libjsig_is_loaded)  && (sig <= Maxlibjsigsigs)) {
3818     // Retrieve the old signal handler from libjsig
3819     actp = (*get_signal_action)(sig);
3820   }
3821   if (actp == NULL) {
3822     // Retrieve the preinstalled signal handler from jvm
3823     actp = get_preinstalled_handler(sig);
3824   }
3825 
3826   return actp;
3827 }
3828 
3829 static bool call_chained_handler(struct sigaction *actp, int sig,
3830                                  siginfo_t *siginfo, void *context) {
3831   // Call the old signal handler
3832   if (actp->sa_handler == SIG_DFL) {
3833     // It's more reasonable to let jvm treat it as an unexpected exception
3834     // instead of taking the default action.
3835     return false;
3836   } else if (actp->sa_handler != SIG_IGN) {
3837     if ((actp->sa_flags & SA_NODEFER) == 0) {
3838       // automaticlly block the signal
3839       sigaddset(&(actp->sa_mask), sig);
3840     }
3841 
3842     sa_handler_t hand;
3843     sa_sigaction_t sa;
3844     bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
3845     // retrieve the chained handler
3846     if (siginfo_flag_set) {
3847       sa = actp->sa_sigaction;
3848     } else {
3849       hand = actp->sa_handler;
3850     }
3851 
3852     if ((actp->sa_flags & SA_RESETHAND) != 0) {
3853       actp->sa_handler = SIG_DFL;
3854     }
3855 
3856     // try to honor the signal mask
3857     sigset_t oset;
3858     thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset);
3859 
3860     // call into the chained handler
3861     if (siginfo_flag_set) {
3862       (*sa)(sig, siginfo, context);
3863     } else {
3864       (*hand)(sig);
3865     }
3866 
3867     // restore the signal mask
3868     thr_sigsetmask(SIG_SETMASK, &oset, 0);
3869   }
3870   // Tell jvm's signal handler the signal is taken care of.
3871   return true;
3872 }
3873 
3874 bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) {
3875   bool chained = false;
3876   // signal-chaining
3877   if (UseSignalChaining) {
3878     struct sigaction *actp = get_chained_signal_action(sig);
3879     if (actp != NULL) {
3880       chained = call_chained_handler(actp, sig, siginfo, context);
3881     }
3882   }
3883   return chained;
3884 }
3885 
3886 struct sigaction* os::Solaris::get_preinstalled_handler(int sig) {
3887   assert((chainedsigactions != (struct sigaction *)NULL) &&
3888          (preinstalled_sigs != (int *)NULL), "signals not yet initialized");
3889   if (preinstalled_sigs[sig] != 0) {
3890     return &chainedsigactions[sig];
3891   }
3892   return NULL;
3893 }
3894 
3895 void os::Solaris::save_preinstalled_handler(int sig,
3896                                             struct sigaction& oldAct) {
3897   assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range");
3898   assert((chainedsigactions != (struct sigaction *)NULL) &&
3899          (preinstalled_sigs != (int *)NULL), "signals not yet initialized");
3900   chainedsigactions[sig] = oldAct;
3901   preinstalled_sigs[sig] = 1;
3902 }
3903 
3904 void os::Solaris::set_signal_handler(int sig, bool set_installed,
3905                                      bool oktochain) {
3906   // Check for overwrite.
3907   struct sigaction oldAct;
3908   sigaction(sig, (struct sigaction*)NULL, &oldAct);
3909   void* oldhand =
3910       oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
3911                           : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
3912   if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3913       oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3914       oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) {
3915     if (AllowUserSignalHandlers || !set_installed) {
3916       // Do not overwrite; user takes responsibility to forward to us.
3917       return;
3918     } else if (UseSignalChaining) {
3919       if (oktochain) {
3920         // save the old handler in jvm
3921         save_preinstalled_handler(sig, oldAct);
3922       } else {
3923         vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal.");
3924       }
3925       // libjsig also interposes the sigaction() call below and saves the
3926       // old sigaction on it own.
3927     } else {
3928       fatal("Encountered unexpected pre-existing sigaction handler "
3929             "%#lx for signal %d.", (long)oldhand, sig);
3930     }
3931   }
3932 
3933   struct sigaction sigAct;
3934   sigfillset(&(sigAct.sa_mask));
3935   sigAct.sa_handler = SIG_DFL;
3936 
3937   sigAct.sa_sigaction = signalHandler;
3938   // Handle SIGSEGV on alternate signal stack if
3939   // not using stack banging
3940   if (!UseStackBanging && sig == SIGSEGV) {
3941     sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
3942   } else {
3943     sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
3944   }
3945   os::Solaris::set_our_sigflags(sig, sigAct.sa_flags);
3946 
3947   sigaction(sig, &sigAct, &oldAct);
3948 
3949   void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3950                                        : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3951   assert(oldhand2 == oldhand, "no concurrent signal handler installation");
3952 }
3953 
3954 
3955 #define DO_SIGNAL_CHECK(sig)                      \
3956   do {                                            \
3957     if (!sigismember(&check_signal_done, sig)) {  \
3958       os::Solaris::check_signal_handler(sig);     \
3959     }                                             \
3960   } while (0)
3961 
3962 // This method is a periodic task to check for misbehaving JNI applications
3963 // under CheckJNI, we can add any periodic checks here
3964 
3965 void os::run_periodic_checks() {
3966   // A big source of grief is hijacking virt. addr 0x0 on Solaris,
3967   // thereby preventing a NULL checks.
3968   if (!check_addr0_done) check_addr0_done = check_addr0(tty);
3969 
3970   if (check_signals == false) return;
3971 
3972   // SEGV and BUS if overridden could potentially prevent
3973   // generation of hs*.log in the event of a crash, debugging
3974   // such a case can be very challenging, so we absolutely
3975   // check for the following for a good measure:
3976   DO_SIGNAL_CHECK(SIGSEGV);
3977   DO_SIGNAL_CHECK(SIGILL);
3978   DO_SIGNAL_CHECK(SIGFPE);
3979   DO_SIGNAL_CHECK(SIGBUS);
3980   DO_SIGNAL_CHECK(SIGPIPE);
3981   DO_SIGNAL_CHECK(SIGXFSZ);
3982 
3983   // ReduceSignalUsage allows the user to override these handlers
3984   // see comments at the very top and jvm_solaris.h
3985   if (!ReduceSignalUsage) {
3986     DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
3987     DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
3988     DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
3989     DO_SIGNAL_CHECK(BREAK_SIGNAL);
3990   }
3991 
3992   // See comments above for using JVM1/JVM2
3993   DO_SIGNAL_CHECK(os::Solaris::SIGasync());
3994 
3995 }
3996 
3997 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
3998 
3999 static os_sigaction_t os_sigaction = NULL;
4000 
4001 void os::Solaris::check_signal_handler(int sig) {
4002   char buf[O_BUFLEN];
4003   address jvmHandler = NULL;
4004 
4005   struct sigaction act;
4006   if (os_sigaction == NULL) {
4007     // only trust the default sigaction, in case it has been interposed
4008     os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
4009     if (os_sigaction == NULL) return;
4010   }
4011 
4012   os_sigaction(sig, (struct sigaction*)NULL, &act);
4013 
4014   address thisHandler = (act.sa_flags & SA_SIGINFO)
4015     ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
4016     : CAST_FROM_FN_PTR(address, act.sa_handler);
4017 
4018 
4019   switch (sig) {
4020   case SIGSEGV:
4021   case SIGBUS:
4022   case SIGFPE:
4023   case SIGPIPE:
4024   case SIGXFSZ:
4025   case SIGILL:
4026     jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4027     break;
4028 
4029   case SHUTDOWN1_SIGNAL:
4030   case SHUTDOWN2_SIGNAL:
4031   case SHUTDOWN3_SIGNAL:
4032   case BREAK_SIGNAL:
4033     jvmHandler = (address)user_handler();
4034     break;
4035 
4036   default:
4037     int asynsig = os::Solaris::SIGasync();
4038 
4039     if (sig == asynsig) {
4040       jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4041     } else {
4042       return;
4043     }
4044     break;
4045   }
4046 
4047 
4048   if (thisHandler != jvmHandler) {
4049     tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
4050     tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
4051     tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
4052     // No need to check this sig any longer
4053     sigaddset(&check_signal_done, sig);
4054     // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
4055     if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
4056       tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
4057                     exception_name(sig, buf, O_BUFLEN));
4058     }
4059   } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) {
4060     tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
4061     tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig));
4062     tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
4063     // No need to check this sig any longer
4064     sigaddset(&check_signal_done, sig);
4065   }
4066 
4067   // Print all the signal handler state
4068   if (sigismember(&check_signal_done, sig)) {
4069     print_signal_handlers(tty, buf, O_BUFLEN);
4070   }
4071 
4072 }
4073 
4074 void os::Solaris::install_signal_handlers() {
4075   bool libjsigdone = false;
4076   signal_handlers_are_installed = true;
4077 
4078   // signal-chaining
4079   typedef void (*signal_setting_t)();
4080   signal_setting_t begin_signal_setting = NULL;
4081   signal_setting_t end_signal_setting = NULL;
4082   begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4083                                         dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
4084   if (begin_signal_setting != NULL) {
4085     end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4086                                         dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
4087     get_signal_action = CAST_TO_FN_PTR(get_signal_t,
4088                                        dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
4089     get_libjsig_version = CAST_TO_FN_PTR(version_getting_t,
4090                                          dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version"));
4091     libjsig_is_loaded = true;
4092     if (os::Solaris::get_libjsig_version != NULL) {
4093       libjsigversion =  (*os::Solaris::get_libjsig_version)();
4094     }
4095     assert(UseSignalChaining, "should enable signal-chaining");
4096   }
4097   if (libjsig_is_loaded) {
4098     // Tell libjsig jvm is setting signal handlers
4099     (*begin_signal_setting)();
4100   }
4101 
4102   set_signal_handler(SIGSEGV, true, true);
4103   set_signal_handler(SIGPIPE, true, true);
4104   set_signal_handler(SIGXFSZ, true, true);
4105   set_signal_handler(SIGBUS, true, true);
4106   set_signal_handler(SIGILL, true, true);
4107   set_signal_handler(SIGFPE, true, true);
4108 
4109 
4110   if (os::Solaris::SIGasync() > OLDMAXSIGNUM) {
4111     // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so
4112     // can not register overridable signals which might be > 32
4113     if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) {
4114       // Tell libjsig jvm has finished setting signal handlers
4115       (*end_signal_setting)();
4116       libjsigdone = true;
4117     }
4118   }
4119 
4120   set_signal_handler(os::Solaris::SIGasync(), true, true);
4121 
4122   if (libjsig_is_loaded && !libjsigdone) {
4123     // Tell libjsig jvm finishes setting signal handlers
4124     (*end_signal_setting)();
4125   }
4126 
4127   // We don't activate signal checker if libjsig is in place, we trust ourselves
4128   // and if UserSignalHandler is installed all bets are off.
4129   // Log that signal checking is off only if -verbose:jni is specified.
4130   if (CheckJNICalls) {
4131     if (libjsig_is_loaded) {
4132       if (PrintJNIResolving) {
4133         tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
4134       }
4135       check_signals = false;
4136     }
4137     if (AllowUserSignalHandlers) {
4138       if (PrintJNIResolving) {
4139         tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
4140       }
4141       check_signals = false;
4142     }
4143   }
4144 }
4145 
4146 
4147 void report_error(const char* file_name, int line_no, const char* title,
4148                   const char* format, ...);
4149 
4150 const char * signames[] = {
4151   "SIG0",
4152   "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
4153   "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
4154   "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
4155   "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
4156   "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
4157   "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
4158   "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
4159   "SIGCANCEL", "SIGLOST"
4160 };
4161 
4162 const char* os::exception_name(int exception_code, char* buf, size_t size) {
4163   if (0 < exception_code && exception_code <= SIGRTMAX) {
4164     // signal
4165     if (exception_code < sizeof(signames)/sizeof(const char*)) {
4166       jio_snprintf(buf, size, "%s", signames[exception_code]);
4167     } else {
4168       jio_snprintf(buf, size, "SIG%d", exception_code);
4169     }
4170     return buf;
4171   } else {
4172     return NULL;
4173   }
4174 }
4175 
4176 // (Static) wrapper for getisax(2) call.
4177 os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
4178 
4179 // (Static) wrappers for the liblgrp API
4180 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
4181 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
4182 os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini;
4183 os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root;
4184 os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children;
4185 os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources;
4186 os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
4187 os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
4188 os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
4189 
4190 // (Static) wrapper for meminfo() call.
4191 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
4192 
4193 static address resolve_symbol_lazy(const char* name) {
4194   address addr = (address) dlsym(RTLD_DEFAULT, name);
4195   if (addr == NULL) {
4196     // RTLD_DEFAULT was not defined on some early versions of 2.5.1
4197     addr = (address) dlsym(RTLD_NEXT, name);
4198   }
4199   return addr;
4200 }
4201 
4202 static address resolve_symbol(const char* name) {
4203   address addr = resolve_symbol_lazy(name);
4204   if (addr == NULL) {
4205     fatal(dlerror());
4206   }
4207   return addr;
4208 }
4209 
4210 void os::Solaris::libthread_init() {
4211   address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators");
4212 
4213   lwp_priocntl_init();
4214 
4215   // RTLD_DEFAULT was not defined on some early versions of 5.5.1
4216   if (func == NULL) {
4217     func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
4218     // Guarantee that this VM is running on an new enough OS (5.6 or
4219     // later) that it will have a new enough libthread.so.
4220     guarantee(func != NULL, "libthread.so is too old.");
4221   }
4222 
4223   int size;
4224   void (*handler_info_func)(address *, int *);
4225   handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo"));
4226   handler_info_func(&handler_start, &size);
4227   handler_end = handler_start + size;
4228 }
4229 
4230 
4231 int_fnP_mutex_tP os::Solaris::_mutex_lock;
4232 int_fnP_mutex_tP os::Solaris::_mutex_trylock;
4233 int_fnP_mutex_tP os::Solaris::_mutex_unlock;
4234 int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init;
4235 int_fnP_mutex_tP os::Solaris::_mutex_destroy;
4236 int os::Solaris::_mutex_scope = USYNC_THREAD;
4237 
4238 int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait;
4239 int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait;
4240 int_fnP_cond_tP os::Solaris::_cond_signal;
4241 int_fnP_cond_tP os::Solaris::_cond_broadcast;
4242 int_fnP_cond_tP_i_vP os::Solaris::_cond_init;
4243 int_fnP_cond_tP os::Solaris::_cond_destroy;
4244 int os::Solaris::_cond_scope = USYNC_THREAD;
4245 
4246 void os::Solaris::synchronization_init() {
4247   if (UseLWPSynchronization) {
4248     os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
4249     os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
4250     os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
4251     os::Solaris::set_mutex_init(lwp_mutex_init);
4252     os::Solaris::set_mutex_destroy(lwp_mutex_destroy);
4253     os::Solaris::set_mutex_scope(USYNC_THREAD);
4254 
4255     os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait")));
4256     os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait")));
4257     os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal")));
4258     os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast")));
4259     os::Solaris::set_cond_init(lwp_cond_init);
4260     os::Solaris::set_cond_destroy(lwp_cond_destroy);
4261     os::Solaris::set_cond_scope(USYNC_THREAD);
4262   } else {
4263     os::Solaris::set_mutex_scope(USYNC_THREAD);
4264     os::Solaris::set_cond_scope(USYNC_THREAD);
4265 
4266     if (UsePthreads) {
4267       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
4268       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
4269       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
4270       os::Solaris::set_mutex_init(pthread_mutex_default_init);
4271       os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy")));
4272 
4273       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait")));
4274       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait")));
4275       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal")));
4276       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast")));
4277       os::Solaris::set_cond_init(pthread_cond_default_init);
4278       os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy")));
4279     } else {
4280       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock")));
4281       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock")));
4282       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock")));
4283       os::Solaris::set_mutex_init(::mutex_init);
4284       os::Solaris::set_mutex_destroy(::mutex_destroy);
4285 
4286       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait")));
4287       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait")));
4288       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal")));
4289       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast")));
4290       os::Solaris::set_cond_init(::cond_init);
4291       os::Solaris::set_cond_destroy(::cond_destroy);
4292     }
4293   }
4294 }
4295 
4296 bool os::Solaris::liblgrp_init() {
4297   void *handle = dlopen("liblgrp.so.1", RTLD_LAZY);
4298   if (handle != NULL) {
4299     os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home")));
4300     os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init")));
4301     os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini")));
4302     os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root")));
4303     os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children")));
4304     os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources")));
4305     os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps")));
4306     os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t,
4307                                                       dlsym(handle, "lgrp_cookie_stale")));
4308 
4309     lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER);
4310     set_lgrp_cookie(c);
4311     return true;
4312   }
4313   return false;
4314 }
4315 
4316 void os::Solaris::misc_sym_init() {
4317   address func;
4318 
4319   // getisax
4320   func = resolve_symbol_lazy("getisax");
4321   if (func != NULL) {
4322     os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
4323   }
4324 
4325   // meminfo
4326   func = resolve_symbol_lazy("meminfo");
4327   if (func != NULL) {
4328     os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
4329   }
4330 }
4331 
4332 uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
4333   assert(_getisax != NULL, "_getisax not set");
4334   return _getisax(array, n);
4335 }
4336 
4337 // int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
4338 typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
4339 static pset_getloadavg_type pset_getloadavg_ptr = NULL;
4340 
4341 void init_pset_getloadavg_ptr(void) {
4342   pset_getloadavg_ptr =
4343     (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg");
4344   if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) {
4345     warning("pset_getloadavg function not found");
4346   }
4347 }
4348 
4349 int os::Solaris::_dev_zero_fd = -1;
4350 
4351 // this is called _before_ the global arguments have been parsed
4352 void os::init(void) {
4353   _initial_pid = getpid();
4354 
4355   max_hrtime = first_hrtime = gethrtime();
4356 
4357   init_random(1234567);
4358 
4359   page_size = sysconf(_SC_PAGESIZE);
4360   if (page_size == -1) {
4361     fatal("os_solaris.cpp: os::init: sysconf failed (%s)", strerror(errno));
4362   }
4363   init_page_sizes((size_t) page_size);
4364 
4365   Solaris::initialize_system_info();
4366 
4367   // Initialize misc. symbols as soon as possible, so we can use them
4368   // if we need them.
4369   Solaris::misc_sym_init();
4370 
4371   int fd = ::open("/dev/zero", O_RDWR);
4372   if (fd < 0) {
4373     fatal("os::init: cannot open /dev/zero (%s)", strerror(errno));
4374   } else {
4375     Solaris::set_dev_zero_fd(fd);
4376 
4377     // Close on exec, child won't inherit.
4378     fcntl(fd, F_SETFD, FD_CLOEXEC);
4379   }
4380 
4381   clock_tics_per_sec = CLK_TCK;
4382 
4383   // check if dladdr1() exists; dladdr1 can provide more information than
4384   // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9
4385   // and is available on linker patches for 5.7 and 5.8.
4386   // libdl.so must have been loaded, this call is just an entry lookup
4387   void * hdl = dlopen("libdl.so", RTLD_NOW);
4388   if (hdl) {
4389     dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1"));
4390   }
4391 
4392   // (Solaris only) this switches to calls that actually do locking.
4393   ThreadCritical::initialize();
4394 
4395   main_thread = thr_self();
4396 
4397   // Constant minimum stack size allowed. It must be at least
4398   // the minimum of what the OS supports (thr_min_stack()), and
4399   // enough to allow the thread to get to user bytecode execution.
4400   Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
4401   // If the pagesize of the VM is greater than 8K determine the appropriate
4402   // number of initial guard pages.  The user can change this with the
4403   // command line arguments, if needed.
4404   if (vm_page_size() > 8*K) {
4405     StackYellowPages = 1;
4406     StackRedPages = 1;
4407     StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size();
4408   }
4409 }
4410 
4411 // To install functions for atexit system call
4412 extern "C" {
4413   static void perfMemory_exit_helper() {
4414     perfMemory_exit();
4415   }
4416 }
4417 
4418 // this is called _after_ the global arguments have been parsed
4419 jint os::init_2(void) {
4420   // try to enable extended file IO ASAP, see 6431278
4421   os::Solaris::try_enable_extended_io();
4422 
4423   // Allocate a single page and mark it as readable for safepoint polling.  Also
4424   // use this first mmap call to check support for MAP_ALIGN.
4425   address polling_page = (address)Solaris::mmap_chunk((char*)page_size,
4426                                                       page_size,
4427                                                       MAP_PRIVATE | MAP_ALIGN,
4428                                                       PROT_READ);
4429   if (polling_page == NULL) {
4430     has_map_align = false;
4431     polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE,
4432                                                 PROT_READ);
4433   }
4434 
4435   os::set_polling_page(polling_page);
4436 
4437 #ifndef PRODUCT
4438   if (Verbose && PrintMiscellaneous) {
4439     tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n",
4440                (intptr_t)polling_page);
4441   }
4442 #endif
4443 
4444   if (!UseMembar) {
4445     address mem_serialize_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE);
4446     guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
4447     os::set_memory_serialize_page(mem_serialize_page);
4448 
4449 #ifndef PRODUCT
4450     if (Verbose && PrintMiscellaneous) {
4451       tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n",
4452                  (intptr_t)mem_serialize_page);
4453     }
4454 #endif
4455   }
4456 
4457   // Check minimum allowable stack size for thread creation and to initialize
4458   // the java system classes, including StackOverflowError - depends on page
4459   // size.  Add a page for compiler2 recursion in main thread.
4460   // Add in 2*BytesPerWord times page size to account for VM stack during
4461   // class initialization depending on 32 or 64 bit VM.
4462   os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed,
4463                                         (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
4464                                         2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size);
4465 
4466   size_t threadStackSizeInBytes = ThreadStackSize * K;
4467   if (threadStackSizeInBytes != 0 &&
4468       threadStackSizeInBytes < os::Solaris::min_stack_allowed) {
4469     tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
4470                   os::Solaris::min_stack_allowed/K);
4471     return JNI_ERR;
4472   }
4473 
4474   // For 64kbps there will be a 64kb page size, which makes
4475   // the usable default stack size quite a bit less.  Increase the
4476   // stack for 64kb (or any > than 8kb) pages, this increases
4477   // virtual memory fragmentation (since we're not creating the
4478   // stack on a power of 2 boundary.  The real fix for this
4479   // should be to fix the guard page mechanism.
4480 
4481   if (vm_page_size() > 8*K) {
4482     threadStackSizeInBytes = (threadStackSizeInBytes != 0)
4483        ? threadStackSizeInBytes +
4484          ((StackYellowPages + StackRedPages) * vm_page_size())
4485        : 0;
4486     ThreadStackSize = threadStackSizeInBytes/K;
4487   }
4488 
4489   // Make the stack size a multiple of the page size so that
4490   // the yellow/red zones can be guarded.
4491   JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
4492                                                 vm_page_size()));
4493 
4494   Solaris::libthread_init();
4495 
4496   if (UseNUMA) {
4497     if (!Solaris::liblgrp_init()) {
4498       UseNUMA = false;
4499     } else {
4500       size_t lgrp_limit = os::numa_get_groups_num();
4501       int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal);
4502       size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
4503       FREE_C_HEAP_ARRAY(int, lgrp_ids);
4504       if (lgrp_num < 2) {
4505         // There's only one locality group, disable NUMA.
4506         UseNUMA = false;
4507       }
4508     }
4509     if (!UseNUMA && ForceNUMA) {
4510       UseNUMA = true;
4511     }
4512   }
4513 
4514   Solaris::signal_sets_init();
4515   Solaris::init_signal_mem();
4516   Solaris::install_signal_handlers();
4517 
4518   if (libjsigversion < JSIG_VERSION_1_4_1) {
4519     Maxlibjsigsigs = OLDMAXSIGNUM;
4520   }
4521 
4522   // initialize synchronization primitives to use either thread or
4523   // lwp synchronization (controlled by UseLWPSynchronization)
4524   Solaris::synchronization_init();
4525 
4526   if (MaxFDLimit) {
4527     // set the number of file descriptors to max. print out error
4528     // if getrlimit/setrlimit fails but continue regardless.
4529     struct rlimit nbr_files;
4530     int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
4531     if (status != 0) {
4532       if (PrintMiscellaneous && (Verbose || WizardMode)) {
4533         perror("os::init_2 getrlimit failed");
4534       }
4535     } else {
4536       nbr_files.rlim_cur = nbr_files.rlim_max;
4537       status = setrlimit(RLIMIT_NOFILE, &nbr_files);
4538       if (status != 0) {
4539         if (PrintMiscellaneous && (Verbose || WizardMode)) {
4540           perror("os::init_2 setrlimit failed");
4541         }
4542       }
4543     }
4544   }
4545 
4546   // Calculate theoretical max. size of Threads to guard gainst
4547   // artifical out-of-memory situations, where all available address-
4548   // space has been reserved by thread stacks. Default stack size is 1Mb.
4549   size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ?
4550     JavaThread::stack_size_at_create() : (1*K*K);
4551   assert(pre_thread_stack_size != 0, "Must have a stack");
4552   // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when
4553   // we should start doing Virtual Memory banging. Currently when the threads will
4554   // have used all but 200Mb of space.
4555   size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K);
4556   Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size;
4557 
4558   // at-exit methods are called in the reverse order of their registration.
4559   // In Solaris 7 and earlier, atexit functions are called on return from
4560   // main or as a result of a call to exit(3C). There can be only 32 of
4561   // these functions registered and atexit() does not set errno. In Solaris
4562   // 8 and later, there is no limit to the number of functions registered
4563   // and atexit() sets errno. In addition, in Solaris 8 and later, atexit
4564   // functions are called upon dlclose(3DL) in addition to return from main
4565   // and exit(3C).
4566 
4567   if (PerfAllowAtExitRegistration) {
4568     // only register atexit functions if PerfAllowAtExitRegistration is set.
4569     // atexit functions can be delayed until process exit time, which
4570     // can be problematic for embedded VM situations. Embedded VMs should
4571     // call DestroyJavaVM() to assure that VM resources are released.
4572 
4573     // note: perfMemory_exit_helper atexit function may be removed in
4574     // the future if the appropriate cleanup code can be added to the
4575     // VM_Exit VMOperation's doit method.
4576     if (atexit(perfMemory_exit_helper) != 0) {
4577       warning("os::init2 atexit(perfMemory_exit_helper) failed");
4578     }
4579   }
4580 
4581   // Init pset_loadavg function pointer
4582   init_pset_getloadavg_ptr();
4583 
4584   return JNI_OK;
4585 }
4586 
4587 // Mark the polling page as unreadable
4588 void os::make_polling_page_unreadable(void) {
4589   if (mprotect((char *)_polling_page, page_size, PROT_NONE) != 0) {
4590     fatal("Could not disable polling page");
4591   }
4592 }
4593 
4594 // Mark the polling page as readable
4595 void os::make_polling_page_readable(void) {
4596   if (mprotect((char *)_polling_page, page_size, PROT_READ) != 0) {
4597     fatal("Could not enable polling page");
4598   }
4599 }
4600 
4601 // OS interface.
4602 
4603 bool os::check_heap(bool force) { return true; }
4604 
4605 // Is a (classpath) directory empty?
4606 bool os::dir_is_empty(const char* path) {
4607   DIR *dir = NULL;
4608   struct dirent *ptr;
4609 
4610   dir = opendir(path);
4611   if (dir == NULL) return true;
4612 
4613   // Scan the directory
4614   bool result = true;
4615   char buf[sizeof(struct dirent) + MAX_PATH];
4616   struct dirent *dbuf = (struct dirent *) buf;
4617   while (result && (ptr = readdir(dir, dbuf)) != NULL) {
4618     if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
4619       result = false;
4620     }
4621   }
4622   closedir(dir);
4623   return result;
4624 }
4625 
4626 // This code originates from JDK's sysOpen and open64_w
4627 // from src/solaris/hpi/src/system_md.c
4628 
4629 int os::open(const char *path, int oflag, int mode) {
4630   if (strlen(path) > MAX_PATH - 1) {
4631     errno = ENAMETOOLONG;
4632     return -1;
4633   }
4634   int fd;
4635 
4636   fd = ::open64(path, oflag, mode);
4637   if (fd == -1) return -1;
4638 
4639   // If the open succeeded, the file might still be a directory
4640   {
4641     struct stat64 buf64;
4642     int ret = ::fstat64(fd, &buf64);
4643     int st_mode = buf64.st_mode;
4644 
4645     if (ret != -1) {
4646       if ((st_mode & S_IFMT) == S_IFDIR) {
4647         errno = EISDIR;
4648         ::close(fd);
4649         return -1;
4650       }
4651     } else {
4652       ::close(fd);
4653       return -1;
4654     }
4655   }
4656 
4657   // 32-bit Solaris systems suffer from:
4658   //
4659   // - an historical default soft limit of 256 per-process file
4660   //   descriptors that is too low for many Java programs.
4661   //
4662   // - a design flaw where file descriptors created using stdio
4663   //   fopen must be less than 256, _even_ when the first limit above
4664   //   has been raised.  This can cause calls to fopen (but not calls to
4665   //   open, for example) to fail mysteriously, perhaps in 3rd party
4666   //   native code (although the JDK itself uses fopen).  One can hardly
4667   //   criticize them for using this most standard of all functions.
4668   //
4669   // We attempt to make everything work anyways by:
4670   //
4671   // - raising the soft limit on per-process file descriptors beyond
4672   //   256
4673   //
4674   // - As of Solaris 10u4, we can request that Solaris raise the 256
4675   //   stdio fopen limit by calling function enable_extended_FILE_stdio.
4676   //   This is done in init_2 and recorded in enabled_extended_FILE_stdio
4677   //
4678   // - If we are stuck on an old (pre 10u4) Solaris system, we can
4679   //   workaround the bug by remapping non-stdio file descriptors below
4680   //   256 to ones beyond 256, which is done below.
4681   //
4682   // See:
4683   // 1085341: 32-bit stdio routines should support file descriptors >255
4684   // 6533291: Work around 32-bit Solaris stdio limit of 256 open files
4685   // 6431278: Netbeans crash on 32 bit Solaris: need to call
4686   //          enable_extended_FILE_stdio() in VM initialisation
4687   // Giri Mandalika's blog
4688   // http://technopark02.blogspot.com/2005_05_01_archive.html
4689   //
4690 #ifndef  _LP64
4691   if ((!enabled_extended_FILE_stdio) && fd < 256) {
4692     int newfd = ::fcntl(fd, F_DUPFD, 256);
4693     if (newfd != -1) {
4694       ::close(fd);
4695       fd = newfd;
4696     }
4697   }
4698 #endif // 32-bit Solaris
4699 
4700   // All file descriptors that are opened in the JVM and not
4701   // specifically destined for a subprocess should have the
4702   // close-on-exec flag set.  If we don't set it, then careless 3rd
4703   // party native code might fork and exec without closing all
4704   // appropriate file descriptors (e.g. as we do in closeDescriptors in
4705   // UNIXProcess.c), and this in turn might:
4706   //
4707   // - cause end-of-file to fail to be detected on some file
4708   //   descriptors, resulting in mysterious hangs, or
4709   //
4710   // - might cause an fopen in the subprocess to fail on a system
4711   //   suffering from bug 1085341.
4712   //
4713   // (Yes, the default setting of the close-on-exec flag is a Unix
4714   // design flaw)
4715   //
4716   // See:
4717   // 1085341: 32-bit stdio routines should support file descriptors >255
4718   // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
4719   // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
4720   //
4721 #ifdef FD_CLOEXEC
4722   {
4723     int flags = ::fcntl(fd, F_GETFD);
4724     if (flags != -1) {
4725       ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
4726     }
4727   }
4728 #endif
4729 
4730   return fd;
4731 }
4732 
4733 // create binary file, rewriting existing file if required
4734 int os::create_binary_file(const char* path, bool rewrite_existing) {
4735   int oflags = O_WRONLY | O_CREAT;
4736   if (!rewrite_existing) {
4737     oflags |= O_EXCL;
4738   }
4739   return ::open64(path, oflags, S_IREAD | S_IWRITE);
4740 }
4741 
4742 // return current position of file pointer
4743 jlong os::current_file_offset(int fd) {
4744   return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
4745 }
4746 
4747 // move file pointer to the specified offset
4748 jlong os::seek_to_file_offset(int fd, jlong offset) {
4749   return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
4750 }
4751 
4752 jlong os::lseek(int fd, jlong offset, int whence) {
4753   return (jlong) ::lseek64(fd, offset, whence);
4754 }
4755 
4756 char * os::native_path(char *path) {
4757   return path;
4758 }
4759 
4760 int os::ftruncate(int fd, jlong length) {
4761   return ::ftruncate64(fd, length);
4762 }
4763 
4764 int os::fsync(int fd)  {
4765   RESTARTABLE_RETURN_INT(::fsync(fd));
4766 }
4767 
4768 int os::available(int fd, jlong *bytes) {
4769   assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
4770          "Assumed _thread_in_native");
4771   jlong cur, end;
4772   int mode;
4773   struct stat64 buf64;
4774 
4775   if (::fstat64(fd, &buf64) >= 0) {
4776     mode = buf64.st_mode;
4777     if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
4778       int n,ioctl_return;
4779 
4780       RESTARTABLE(::ioctl(fd, FIONREAD, &n), ioctl_return);
4781       if (ioctl_return>= 0) {
4782         *bytes = n;
4783         return 1;
4784       }
4785     }
4786   }
4787   if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
4788     return 0;
4789   } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
4790     return 0;
4791   } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
4792     return 0;
4793   }
4794   *bytes = end - cur;
4795   return 1;
4796 }
4797 
4798 // Map a block of memory.
4799 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4800                         char *addr, size_t bytes, bool read_only,
4801                         bool allow_exec) {
4802   int prot;
4803   int flags;
4804 
4805   if (read_only) {
4806     prot = PROT_READ;
4807     flags = MAP_SHARED;
4808   } else {
4809     prot = PROT_READ | PROT_WRITE;
4810     flags = MAP_PRIVATE;
4811   }
4812 
4813   if (allow_exec) {
4814     prot |= PROT_EXEC;
4815   }
4816 
4817   if (addr != NULL) {
4818     flags |= MAP_FIXED;
4819   }
4820 
4821   char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
4822                                      fd, file_offset);
4823   if (mapped_address == MAP_FAILED) {
4824     return NULL;
4825   }
4826   return mapped_address;
4827 }
4828 
4829 
4830 // Remap a block of memory.
4831 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4832                           char *addr, size_t bytes, bool read_only,
4833                           bool allow_exec) {
4834   // same as map_memory() on this OS
4835   return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
4836                         allow_exec);
4837 }
4838 
4839 
4840 // Unmap a block of memory.
4841 bool os::pd_unmap_memory(char* addr, size_t bytes) {
4842   return munmap(addr, bytes) == 0;
4843 }
4844 
4845 void os::pause() {
4846   char filename[MAX_PATH];
4847   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4848     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4849   } else {
4850     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4851   }
4852 
4853   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4854   if (fd != -1) {
4855     struct stat buf;
4856     ::close(fd);
4857     while (::stat(filename, &buf) == 0) {
4858       (void)::poll(NULL, 0, 100);
4859     }
4860   } else {
4861     jio_fprintf(stderr,
4862                 "Could not open pause file '%s', continuing immediately.\n", filename);
4863   }
4864 }
4865 
4866 #ifndef PRODUCT
4867 #ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
4868 // Turn this on if you need to trace synch operations.
4869 // Set RECORD_SYNCH_LIMIT to a large-enough value,
4870 // and call record_synch_enable and record_synch_disable
4871 // around the computation of interest.
4872 
4873 void record_synch(char* name, bool returning);  // defined below
4874 
4875 class RecordSynch {
4876   char* _name;
4877  public:
4878   RecordSynch(char* name) :_name(name) { record_synch(_name, false); }
4879   ~RecordSynch()                       { record_synch(_name, true); }
4880 };
4881 
4882 #define CHECK_SYNCH_OP(ret, name, params, args, inner)          \
4883 extern "C" ret name params {                                    \
4884   typedef ret name##_t params;                                  \
4885   static name##_t* implem = NULL;                               \
4886   static int callcount = 0;                                     \
4887   if (implem == NULL) {                                         \
4888     implem = (name##_t*) dlsym(RTLD_NEXT, #name);               \
4889     if (implem == NULL)  fatal(dlerror());                      \
4890   }                                                             \
4891   ++callcount;                                                  \
4892   RecordSynch _rs(#name);                                       \
4893   inner;                                                        \
4894   return implem args;                                           \
4895 }
4896 // in dbx, examine callcounts this way:
4897 // for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done
4898 
4899 #define CHECK_POINTER_OK(p) \
4900   (!Universe::is_fully_initialized() || !Universe::is_reserved_heap((oop)(p)))
4901 #define CHECK_MU \
4902   if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only.");
4903 #define CHECK_CV \
4904   if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only.");
4905 #define CHECK_P(p) \
4906   if (!CHECK_POINTER_OK(p))  fatal(false,  "Pointer must be in C heap only.");
4907 
4908 #define CHECK_MUTEX(mutex_op) \
4909   CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU);
4910 
4911 CHECK_MUTEX(   mutex_lock)
4912 CHECK_MUTEX(  _mutex_lock)
4913 CHECK_MUTEX( mutex_unlock)
4914 CHECK_MUTEX(_mutex_unlock)
4915 CHECK_MUTEX( mutex_trylock)
4916 CHECK_MUTEX(_mutex_trylock)
4917 
4918 #define CHECK_COND(cond_op) \
4919   CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU; CHECK_CV);
4920 
4921 CHECK_COND( cond_wait);
4922 CHECK_COND(_cond_wait);
4923 CHECK_COND(_cond_wait_cancel);
4924 
4925 #define CHECK_COND2(cond_op) \
4926   CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU; CHECK_CV);
4927 
4928 CHECK_COND2( cond_timedwait);
4929 CHECK_COND2(_cond_timedwait);
4930 CHECK_COND2(_cond_timedwait_cancel);
4931 
4932 // do the _lwp_* versions too
4933 #define mutex_t lwp_mutex_t
4934 #define cond_t  lwp_cond_t
4935 CHECK_MUTEX(  _lwp_mutex_lock)
4936 CHECK_MUTEX(  _lwp_mutex_unlock)
4937 CHECK_MUTEX(  _lwp_mutex_trylock)
4938 CHECK_MUTEX( __lwp_mutex_lock)
4939 CHECK_MUTEX( __lwp_mutex_unlock)
4940 CHECK_MUTEX( __lwp_mutex_trylock)
4941 CHECK_MUTEX(___lwp_mutex_lock)
4942 CHECK_MUTEX(___lwp_mutex_unlock)
4943 
4944 CHECK_COND(  _lwp_cond_wait);
4945 CHECK_COND( __lwp_cond_wait);
4946 CHECK_COND(___lwp_cond_wait);
4947 
4948 CHECK_COND2(  _lwp_cond_timedwait);
4949 CHECK_COND2( __lwp_cond_timedwait);
4950 #undef mutex_t
4951 #undef cond_t
4952 
4953 CHECK_SYNCH_OP(int, _lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
4954 CHECK_SYNCH_OP(int,__lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
4955 CHECK_SYNCH_OP(int, _lwp_kill,           (int lwp, int n),  (lwp, n), 0);
4956 CHECK_SYNCH_OP(int,__lwp_kill,           (int lwp, int n),  (lwp, n), 0);
4957 CHECK_SYNCH_OP(int, _lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
4958 CHECK_SYNCH_OP(int,__lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
4959 CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
4960 CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
4961 
4962 
4963 // recording machinery:
4964 
4965 enum { RECORD_SYNCH_LIMIT = 200 };
4966 char* record_synch_name[RECORD_SYNCH_LIMIT];
4967 void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT];
4968 bool record_synch_returning[RECORD_SYNCH_LIMIT];
4969 thread_t record_synch_thread[RECORD_SYNCH_LIMIT];
4970 int record_synch_count = 0;
4971 bool record_synch_enabled = false;
4972 
4973 // in dbx, examine recorded data this way:
4974 // for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done
4975 
4976 void record_synch(char* name, bool returning) {
4977   if (record_synch_enabled) {
4978     if (record_synch_count < RECORD_SYNCH_LIMIT) {
4979       record_synch_name[record_synch_count] = name;
4980       record_synch_returning[record_synch_count] = returning;
4981       record_synch_thread[record_synch_count] = thr_self();
4982       record_synch_arg0ptr[record_synch_count] = &name;
4983       record_synch_count++;
4984     }
4985     // put more checking code here:
4986     // ...
4987   }
4988 }
4989 
4990 void record_synch_enable() {
4991   // start collecting trace data, if not already doing so
4992   if (!record_synch_enabled)  record_synch_count = 0;
4993   record_synch_enabled = true;
4994 }
4995 
4996 void record_synch_disable() {
4997   // stop collecting trace data
4998   record_synch_enabled = false;
4999 }
5000 
5001 #endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5002 #endif // PRODUCT
5003 
5004 const intptr_t thr_time_off  = (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5005 const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) -
5006                                (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5007 
5008 
5009 // JVMTI & JVM monitoring and management support
5010 // The thread_cpu_time() and current_thread_cpu_time() are only
5011 // supported if is_thread_cpu_time_supported() returns true.
5012 // They are not supported on Solaris T1.
5013 
5014 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
5015 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
5016 // of a thread.
5017 //
5018 // current_thread_cpu_time() and thread_cpu_time(Thread *)
5019 // returns the fast estimate available on the platform.
5020 
5021 // hrtime_t gethrvtime() return value includes
5022 // user time but does not include system time
5023 jlong os::current_thread_cpu_time() {
5024   return (jlong) gethrvtime();
5025 }
5026 
5027 jlong os::thread_cpu_time(Thread *thread) {
5028   // return user level CPU time only to be consistent with
5029   // what current_thread_cpu_time returns.
5030   // thread_cpu_time_info() must be changed if this changes
5031   return os::thread_cpu_time(thread, false /* user time only */);
5032 }
5033 
5034 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
5035   if (user_sys_cpu_time) {
5036     return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
5037   } else {
5038     return os::current_thread_cpu_time();
5039   }
5040 }
5041 
5042 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
5043   char proc_name[64];
5044   int count;
5045   prusage_t prusage;
5046   jlong lwp_time;
5047   int fd;
5048 
5049   sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage",
5050           getpid(),
5051           thread->osthread()->lwp_id());
5052   fd = ::open(proc_name, O_RDONLY);
5053   if (fd == -1) return -1;
5054 
5055   do {
5056     count = ::pread(fd,
5057                     (void *)&prusage.pr_utime,
5058                     thr_time_size,
5059                     thr_time_off);
5060   } while (count < 0 && errno == EINTR);
5061   ::close(fd);
5062   if (count < 0) return -1;
5063 
5064   if (user_sys_cpu_time) {
5065     // user + system CPU time
5066     lwp_time = (((jlong)prusage.pr_stime.tv_sec +
5067                  (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) +
5068                  (jlong)prusage.pr_stime.tv_nsec +
5069                  (jlong)prusage.pr_utime.tv_nsec;
5070   } else {
5071     // user level CPU time only
5072     lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) +
5073                 (jlong)prusage.pr_utime.tv_nsec;
5074   }
5075 
5076   return (lwp_time);
5077 }
5078 
5079 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5080   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5081   info_ptr->may_skip_backward = false;    // elapsed time not wall time
5082   info_ptr->may_skip_forward = false;     // elapsed time not wall time
5083   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5084 }
5085 
5086 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5087   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5088   info_ptr->may_skip_backward = false;    // elapsed time not wall time
5089   info_ptr->may_skip_forward = false;     // elapsed time not wall time
5090   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5091 }
5092 
5093 bool os::is_thread_cpu_time_supported() {
5094   return true;
5095 }
5096 
5097 // System loadavg support.  Returns -1 if load average cannot be obtained.
5098 // Return the load average for our processor set if the primitive exists
5099 // (Solaris 9 and later).  Otherwise just return system wide loadavg.
5100 int os::loadavg(double loadavg[], int nelem) {
5101   if (pset_getloadavg_ptr != NULL) {
5102     return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem);
5103   } else {
5104     return ::getloadavg(loadavg, nelem);
5105   }
5106 }
5107 
5108 //---------------------------------------------------------------------------------
5109 
5110 bool os::find(address addr, outputStream* st) {
5111   Dl_info dlinfo;
5112   memset(&dlinfo, 0, sizeof(dlinfo));
5113   if (dladdr(addr, &dlinfo) != 0) {
5114     st->print(PTR_FORMAT ": ", addr);
5115     if (dlinfo.dli_sname != NULL && dlinfo.dli_saddr != NULL) {
5116       st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
5117     } else if (dlinfo.dli_fbase != NULL) {
5118       st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
5119     } else {
5120       st->print("<absolute address>");
5121     }
5122     if (dlinfo.dli_fname != NULL) {
5123       st->print(" in %s", dlinfo.dli_fname);
5124     }
5125     if (dlinfo.dli_fbase != NULL) {
5126       st->print(" at " PTR_FORMAT, dlinfo.dli_fbase);
5127     }
5128     st->cr();
5129 
5130     if (Verbose) {
5131       // decode some bytes around the PC
5132       address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
5133       address end   = clamp_address_in_page(addr+40, addr, os::vm_page_size());
5134       address       lowest = (address) dlinfo.dli_sname;
5135       if (!lowest)  lowest = (address) dlinfo.dli_fbase;
5136       if (begin < lowest)  begin = lowest;
5137       Dl_info dlinfo2;
5138       if (dladdr(end, &dlinfo2) != 0 && dlinfo2.dli_saddr != dlinfo.dli_saddr
5139           && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin) {
5140         end = (address) dlinfo2.dli_saddr;
5141       }
5142       Disassembler::decode(begin, end, st);
5143     }
5144     return true;
5145   }
5146   return false;
5147 }
5148 
5149 // Following function has been added to support HotSparc's libjvm.so running
5150 // under Solaris production JDK 1.2.2 / 1.3.0.  These came from
5151 // src/solaris/hpi/native_threads in the EVM codebase.
5152 //
5153 // NOTE: This is no longer needed in the 1.3.1 and 1.4 production release
5154 // libraries and should thus be removed. We will leave it behind for a while
5155 // until we no longer want to able to run on top of 1.3.0 Solaris production
5156 // JDK. See 4341971.
5157 
5158 #define STACK_SLACK 0x800
5159 
5160 extern "C" {
5161   intptr_t sysThreadAvailableStackWithSlack() {
5162     stack_t st;
5163     intptr_t retval, stack_top;
5164     retval = thr_stksegment(&st);
5165     assert(retval == 0, "incorrect return value from thr_stksegment");
5166     assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
5167     assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
5168     stack_top=(intptr_t)st.ss_sp-st.ss_size;
5169     return ((intptr_t)&stack_top - stack_top - STACK_SLACK);
5170   }
5171 }
5172 
5173 // ObjectMonitor park-unpark infrastructure ...
5174 //
5175 // We implement Solaris and Linux PlatformEvents with the
5176 // obvious condvar-mutex-flag triple.
5177 // Another alternative that works quite well is pipes:
5178 // Each PlatformEvent consists of a pipe-pair.
5179 // The thread associated with the PlatformEvent
5180 // calls park(), which reads from the input end of the pipe.
5181 // Unpark() writes into the other end of the pipe.
5182 // The write-side of the pipe must be set NDELAY.
5183 // Unfortunately pipes consume a large # of handles.
5184 // Native solaris lwp_park() and lwp_unpark() work nicely, too.
5185 // Using pipes for the 1st few threads might be workable, however.
5186 //
5187 // park() is permitted to return spuriously.
5188 // Callers of park() should wrap the call to park() in
5189 // an appropriate loop.  A litmus test for the correct
5190 // usage of park is the following: if park() were modified
5191 // to immediately return 0 your code should still work,
5192 // albeit degenerating to a spin loop.
5193 //
5194 // In a sense, park()-unpark() just provides more polite spinning
5195 // and polling with the key difference over naive spinning being
5196 // that a parked thread needs to be explicitly unparked() in order
5197 // to wake up and to poll the underlying condition.
5198 //
5199 // Assumption:
5200 //    Only one parker can exist on an event, which is why we allocate
5201 //    them per-thread. Multiple unparkers can coexist.
5202 //
5203 // _Event transitions in park()
5204 //   -1 => -1 : illegal
5205 //    1 =>  0 : pass - return immediately
5206 //    0 => -1 : block; then set _Event to 0 before returning
5207 //
5208 // _Event transitions in unpark()
5209 //    0 => 1 : just return
5210 //    1 => 1 : just return
5211 //   -1 => either 0 or 1; must signal target thread
5212 //         That is, we can safely transition _Event from -1 to either
5213 //         0 or 1.
5214 //
5215 // _Event serves as a restricted-range semaphore.
5216 //   -1 : thread is blocked, i.e. there is a waiter
5217 //    0 : neutral: thread is running or ready,
5218 //        could have been signaled after a wait started
5219 //    1 : signaled - thread is running or ready
5220 //
5221 // Another possible encoding of _Event would be with
5222 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
5223 //
5224 // TODO-FIXME: add DTRACE probes for:
5225 // 1.   Tx parks
5226 // 2.   Ty unparks Tx
5227 // 3.   Tx resumes from park
5228 
5229 
5230 // value determined through experimentation
5231 #define ROUNDINGFIX 11
5232 
5233 // utility to compute the abstime argument to timedwait.
5234 // TODO-FIXME: switch from compute_abstime() to unpackTime().
5235 
5236 static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
5237   // millis is the relative timeout time
5238   // abstime will be the absolute timeout time
5239   if (millis < 0)  millis = 0;
5240   struct timeval now;
5241   int status = gettimeofday(&now, NULL);
5242   assert(status == 0, "gettimeofday");
5243   jlong seconds = millis / 1000;
5244   jlong max_wait_period;
5245 
5246   if (UseLWPSynchronization) {
5247     // forward port of fix for 4275818 (not sleeping long enough)
5248     // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where
5249     // _lwp_cond_timedwait() used a round_down algorithm rather
5250     // than a round_up. For millis less than our roundfactor
5251     // it rounded down to 0 which doesn't meet the spec.
5252     // For millis > roundfactor we may return a bit sooner, but
5253     // since we can not accurately identify the patch level and
5254     // this has already been fixed in Solaris 9 and 8 we will
5255     // leave it alone rather than always rounding down.
5256 
5257     if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX;
5258     // It appears that when we go directly through Solaris _lwp_cond_timedwait()
5259     // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6
5260     max_wait_period = 21000000;
5261   } else {
5262     max_wait_period = 50000000;
5263   }
5264   millis %= 1000;
5265   if (seconds > max_wait_period) {      // see man cond_timedwait(3T)
5266     seconds = max_wait_period;
5267   }
5268   abstime->tv_sec = now.tv_sec  + seconds;
5269   long       usec = now.tv_usec + millis * 1000;
5270   if (usec >= 1000000) {
5271     abstime->tv_sec += 1;
5272     usec -= 1000000;
5273   }
5274   abstime->tv_nsec = usec * 1000;
5275   return abstime;
5276 }
5277 
5278 void os::PlatformEvent::park() {           // AKA: down()
5279   // Transitions for _Event:
5280   //   -1 => -1 : illegal
5281   //    1 =>  0 : pass - return immediately
5282   //    0 => -1 : block; then set _Event to 0 before returning
5283 
5284   // Invariant: Only the thread associated with the Event/PlatformEvent
5285   // may call park().
5286   assert(_nParked == 0, "invariant");
5287 
5288   int v;
5289   for (;;) {
5290     v = _Event;
5291     if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
5292   }
5293   guarantee(v >= 0, "invariant");
5294   if (v == 0) {
5295     // Do this the hard way by blocking ...
5296     // See http://monaco.sfbay/detail.jsf?cr=5094058.
5297     // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5298     // Only for SPARC >= V8PlusA
5299 #if defined(__sparc) && defined(COMPILER2)
5300     if (ClearFPUAtPark) { _mark_fpu_nosave(); }
5301 #endif
5302     int status = os::Solaris::mutex_lock(_mutex);
5303     assert_status(status == 0, status, "mutex_lock");
5304     guarantee(_nParked == 0, "invariant");
5305     ++_nParked;
5306     while (_Event < 0) {
5307       // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
5308       // Treat this the same as if the wait was interrupted
5309       // With usr/lib/lwp going to kernel, always handle ETIME
5310       status = os::Solaris::cond_wait(_cond, _mutex);
5311       if (status == ETIME) status = EINTR;
5312       assert_status(status == 0 || status == EINTR, status, "cond_wait");
5313     }
5314     --_nParked;
5315     _Event = 0;
5316     status = os::Solaris::mutex_unlock(_mutex);
5317     assert_status(status == 0, status, "mutex_unlock");
5318     // Paranoia to ensure our locked and lock-free paths interact
5319     // correctly with each other.
5320     OrderAccess::fence();
5321   }
5322 }
5323 
5324 int os::PlatformEvent::park(jlong millis) {
5325   // Transitions for _Event:
5326   //   -1 => -1 : illegal
5327   //    1 =>  0 : pass - return immediately
5328   //    0 => -1 : block; then set _Event to 0 before returning
5329 
5330   guarantee(_nParked == 0, "invariant");
5331   int v;
5332   for (;;) {
5333     v = _Event;
5334     if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
5335   }
5336   guarantee(v >= 0, "invariant");
5337   if (v != 0) return OS_OK;
5338 
5339   int ret = OS_TIMEOUT;
5340   timestruc_t abst;
5341   compute_abstime(&abst, millis);
5342 
5343   // See http://monaco.sfbay/detail.jsf?cr=5094058.
5344   // For Solaris SPARC set fprs.FEF=0 prior to parking.
5345   // Only for SPARC >= V8PlusA
5346 #if defined(__sparc) && defined(COMPILER2)
5347   if (ClearFPUAtPark) { _mark_fpu_nosave(); }
5348 #endif
5349   int status = os::Solaris::mutex_lock(_mutex);
5350   assert_status(status == 0, status, "mutex_lock");
5351   guarantee(_nParked == 0, "invariant");
5352   ++_nParked;
5353   while (_Event < 0) {
5354     int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
5355     assert_status(status == 0 || status == EINTR ||
5356                   status == ETIME || status == ETIMEDOUT,
5357                   status, "cond_timedwait");
5358     if (!FilterSpuriousWakeups) break;                // previous semantics
5359     if (status == ETIME || status == ETIMEDOUT) break;
5360     // We consume and ignore EINTR and spurious wakeups.
5361   }
5362   --_nParked;
5363   if (_Event >= 0) ret = OS_OK;
5364   _Event = 0;
5365   status = os::Solaris::mutex_unlock(_mutex);
5366   assert_status(status == 0, status, "mutex_unlock");
5367   // Paranoia to ensure our locked and lock-free paths interact
5368   // correctly with each other.
5369   OrderAccess::fence();
5370   return ret;
5371 }
5372 
5373 void os::PlatformEvent::unpark() {
5374   // Transitions for _Event:
5375   //    0 => 1 : just return
5376   //    1 => 1 : just return
5377   //   -1 => either 0 or 1; must signal target thread
5378   //         That is, we can safely transition _Event from -1 to either
5379   //         0 or 1.
5380   // See also: "Semaphores in Plan 9" by Mullender & Cox
5381   //
5382   // Note: Forcing a transition from "-1" to "1" on an unpark() means
5383   // that it will take two back-to-back park() calls for the owning
5384   // thread to block. This has the benefit of forcing a spurious return
5385   // from the first park() call after an unpark() call which will help
5386   // shake out uses of park() and unpark() without condition variables.
5387 
5388   if (Atomic::xchg(1, &_Event) >= 0) return;
5389 
5390   // If the thread associated with the event was parked, wake it.
5391   // Wait for the thread assoc with the PlatformEvent to vacate.
5392   int status = os::Solaris::mutex_lock(_mutex);
5393   assert_status(status == 0, status, "mutex_lock");
5394   int AnyWaiters = _nParked;
5395   status = os::Solaris::mutex_unlock(_mutex);
5396   assert_status(status == 0, status, "mutex_unlock");
5397   guarantee(AnyWaiters == 0 || AnyWaiters == 1, "invariant");
5398   if (AnyWaiters != 0) {
5399     // Note that we signal() *after* dropping the lock for "immortal" Events.
5400     // This is safe and avoids a common class of  futile wakeups.  In rare
5401     // circumstances this can cause a thread to return prematurely from
5402     // cond_{timed}wait() but the spurious wakeup is benign and the victim
5403     // will simply re-test the condition and re-park itself.
5404     // This provides particular benefit if the underlying platform does not
5405     // provide wait morphing.
5406     status = os::Solaris::cond_signal(_cond);
5407     assert_status(status == 0, status, "cond_signal");
5408   }
5409 }
5410 
5411 // JSR166
5412 // -------------------------------------------------------
5413 
5414 // The solaris and linux implementations of park/unpark are fairly
5415 // conservative for now, but can be improved. They currently use a
5416 // mutex/condvar pair, plus _counter.
5417 // Park decrements _counter if > 0, else does a condvar wait.  Unpark
5418 // sets count to 1 and signals condvar.  Only one thread ever waits
5419 // on the condvar. Contention seen when trying to park implies that someone
5420 // is unparking you, so don't wait. And spurious returns are fine, so there
5421 // is no need to track notifications.
5422 
5423 #define MAX_SECS 100000000
5424 
5425 // This code is common to linux and solaris and will be moved to a
5426 // common place in dolphin.
5427 //
5428 // The passed in time value is either a relative time in nanoseconds
5429 // or an absolute time in milliseconds. Either way it has to be unpacked
5430 // into suitable seconds and nanoseconds components and stored in the
5431 // given timespec structure.
5432 // Given time is a 64-bit value and the time_t used in the timespec is only
5433 // a signed-32-bit value (except on 64-bit Linux) we have to watch for
5434 // overflow if times way in the future are given. Further on Solaris versions
5435 // prior to 10 there is a restriction (see cond_timedwait) that the specified
5436 // number of seconds, in abstime, is less than current_time  + 100,000,000.
5437 // As it will be 28 years before "now + 100000000" will overflow we can
5438 // ignore overflow and just impose a hard-limit on seconds using the value
5439 // of "now + 100,000,000". This places a limit on the timeout of about 3.17
5440 // years from "now".
5441 //
5442 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
5443   assert(time > 0, "convertTime");
5444 
5445   struct timeval now;
5446   int status = gettimeofday(&now, NULL);
5447   assert(status == 0, "gettimeofday");
5448 
5449   time_t max_secs = now.tv_sec + MAX_SECS;
5450 
5451   if (isAbsolute) {
5452     jlong secs = time / 1000;
5453     if (secs > max_secs) {
5454       absTime->tv_sec = max_secs;
5455     } else {
5456       absTime->tv_sec = secs;
5457     }
5458     absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
5459   } else {
5460     jlong secs = time / NANOSECS_PER_SEC;
5461     if (secs >= MAX_SECS) {
5462       absTime->tv_sec = max_secs;
5463       absTime->tv_nsec = 0;
5464     } else {
5465       absTime->tv_sec = now.tv_sec + secs;
5466       absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
5467       if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
5468         absTime->tv_nsec -= NANOSECS_PER_SEC;
5469         ++absTime->tv_sec; // note: this must be <= max_secs
5470       }
5471     }
5472   }
5473   assert(absTime->tv_sec >= 0, "tv_sec < 0");
5474   assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
5475   assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
5476   assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
5477 }
5478 
5479 void Parker::park(bool isAbsolute, jlong time) {
5480   // Ideally we'd do something useful while spinning, such
5481   // as calling unpackTime().
5482 
5483   // Optional fast-path check:
5484   // Return immediately if a permit is available.
5485   // We depend on Atomic::xchg() having full barrier semantics
5486   // since we are doing a lock-free update to _counter.
5487   if (Atomic::xchg(0, &_counter) > 0) return;
5488 
5489   // Optional fast-exit: Check interrupt before trying to wait
5490   Thread* thread = Thread::current();
5491   assert(thread->is_Java_thread(), "Must be JavaThread");
5492   JavaThread *jt = (JavaThread *)thread;
5493   if (Thread::is_interrupted(thread, false)) {
5494     return;
5495   }
5496 
5497   // First, demultiplex/decode time arguments
5498   timespec absTime;
5499   if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
5500     return;
5501   }
5502   if (time > 0) {
5503     // Warning: this code might be exposed to the old Solaris time
5504     // round-down bugs.  Grep "roundingFix" for details.
5505     unpackTime(&absTime, isAbsolute, time);
5506   }
5507 
5508   // Enter safepoint region
5509   // Beware of deadlocks such as 6317397.
5510   // The per-thread Parker:: _mutex is a classic leaf-lock.
5511   // In particular a thread must never block on the Threads_lock while
5512   // holding the Parker:: mutex.  If safepoints are pending both the
5513   // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
5514   ThreadBlockInVM tbivm(jt);
5515 
5516   // Don't wait if cannot get lock since interference arises from
5517   // unblocking.  Also. check interrupt before trying wait
5518   if (Thread::is_interrupted(thread, false) ||
5519       os::Solaris::mutex_trylock(_mutex) != 0) {
5520     return;
5521   }
5522 
5523   int status;
5524 
5525   if (_counter > 0)  { // no wait needed
5526     _counter = 0;
5527     status = os::Solaris::mutex_unlock(_mutex);
5528     assert(status == 0, "invariant");
5529     // Paranoia to ensure our locked and lock-free paths interact
5530     // correctly with each other and Java-level accesses.
5531     OrderAccess::fence();
5532     return;
5533   }
5534 
5535 #ifdef ASSERT
5536   // Don't catch signals while blocked; let the running threads have the signals.
5537   // (This allows a debugger to break into the running thread.)
5538   sigset_t oldsigs;
5539   sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals();
5540   thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
5541 #endif
5542 
5543   OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
5544   jt->set_suspend_equivalent();
5545   // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
5546 
5547   // Do this the hard way by blocking ...
5548   // See http://monaco.sfbay/detail.jsf?cr=5094058.
5549   // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5550   // Only for SPARC >= V8PlusA
5551 #if defined(__sparc) && defined(COMPILER2)
5552   if (ClearFPUAtPark) { _mark_fpu_nosave(); }
5553 #endif
5554 
5555   if (time == 0) {
5556     status = os::Solaris::cond_wait(_cond, _mutex);
5557   } else {
5558     status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
5559   }
5560   // Note that an untimed cond_wait() can sometimes return ETIME on older
5561   // versions of the Solaris.
5562   assert_status(status == 0 || status == EINTR ||
5563                 status == ETIME || status == ETIMEDOUT,
5564                 status, "cond_timedwait");
5565 
5566 #ifdef ASSERT
5567   thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
5568 #endif
5569   _counter = 0;
5570   status = os::Solaris::mutex_unlock(_mutex);
5571   assert_status(status == 0, status, "mutex_unlock");
5572   // Paranoia to ensure our locked and lock-free paths interact
5573   // correctly with each other and Java-level accesses.
5574   OrderAccess::fence();
5575 
5576   // If externally suspended while waiting, re-suspend
5577   if (jt->handle_special_suspend_equivalent_condition()) {
5578     jt->java_suspend_self();
5579   }
5580 }
5581 
5582 void Parker::unpark() {
5583   int status = os::Solaris::mutex_lock(_mutex);
5584   assert(status == 0, "invariant");
5585   const int s = _counter;
5586   _counter = 1;
5587   status = os::Solaris::mutex_unlock(_mutex);
5588   assert(status == 0, "invariant");
5589 
5590   if (s < 1) {
5591     status = os::Solaris::cond_signal(_cond);
5592     assert(status == 0, "invariant");
5593   }
5594 }
5595 
5596 extern char** environ;
5597 
5598 // Run the specified command in a separate process. Return its exit value,
5599 // or -1 on failure (e.g. can't fork a new process).
5600 // Unlike system(), this function can be called from signal handler. It
5601 // doesn't block SIGINT et al.
5602 int os::fork_and_exec(char* cmd) {
5603   char * argv[4];
5604   argv[0] = (char *)"sh";
5605   argv[1] = (char *)"-c";
5606   argv[2] = cmd;
5607   argv[3] = NULL;
5608 
5609   // fork is async-safe, fork1 is not so can't use in signal handler
5610   pid_t pid;
5611   Thread* t = Thread::current_or_null_safe();
5612   if (t != NULL && t->is_inside_signal_handler()) {
5613     pid = fork();
5614   } else {
5615     pid = fork1();
5616   }
5617 
5618   if (pid < 0) {
5619     // fork failed
5620     warning("fork failed: %s", strerror(errno));
5621     return -1;
5622 
5623   } else if (pid == 0) {
5624     // child process
5625 
5626     // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris
5627     execve("/usr/bin/sh", argv, environ);
5628 
5629     // execve failed
5630     _exit(-1);
5631 
5632   } else  {
5633     // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
5634     // care about the actual exit code, for now.
5635 
5636     int status;
5637 
5638     // Wait for the child process to exit.  This returns immediately if
5639     // the child has already exited. */
5640     while (waitpid(pid, &status, 0) < 0) {
5641       switch (errno) {
5642       case ECHILD: return 0;
5643       case EINTR: break;
5644       default: return -1;
5645       }
5646     }
5647 
5648     if (WIFEXITED(status)) {
5649       // The child exited normally; get its exit code.
5650       return WEXITSTATUS(status);
5651     } else if (WIFSIGNALED(status)) {
5652       // The child exited because of a signal
5653       // The best value to return is 0x80 + signal number,
5654       // because that is what all Unix shells do, and because
5655       // it allows callers to distinguish between process exit and
5656       // process death by signal.
5657       return 0x80 + WTERMSIG(status);
5658     } else {
5659       // Unknown exit code; pass it through
5660       return status;
5661     }
5662   }
5663 }
5664 
5665 // is_headless_jre()
5666 //
5667 // Test for the existence of xawt/libmawt.so or libawt_xawt.so
5668 // in order to report if we are running in a headless jre
5669 //
5670 // Since JDK8 xawt/libmawt.so was moved into the same directory
5671 // as libawt.so, and renamed libawt_xawt.so
5672 //
5673 bool os::is_headless_jre() {
5674   struct stat statbuf;
5675   char buf[MAXPATHLEN];
5676   char libmawtpath[MAXPATHLEN];
5677   const char *xawtstr  = "/xawt/libmawt.so";
5678   const char *new_xawtstr = "/libawt_xawt.so";
5679   char *p;
5680 
5681   // Get path to libjvm.so
5682   os::jvm_path(buf, sizeof(buf));
5683 
5684   // Get rid of libjvm.so
5685   p = strrchr(buf, '/');
5686   if (p == NULL) {
5687     return false;
5688   } else {
5689     *p = '\0';
5690   }
5691 
5692   // Get rid of client or server
5693   p = strrchr(buf, '/');
5694   if (p == NULL) {
5695     return false;
5696   } else {
5697     *p = '\0';
5698   }
5699 
5700   // check xawt/libmawt.so
5701   strcpy(libmawtpath, buf);
5702   strcat(libmawtpath, xawtstr);
5703   if (::stat(libmawtpath, &statbuf) == 0) return false;
5704 
5705   // check libawt_xawt.so
5706   strcpy(libmawtpath, buf);
5707   strcat(libmawtpath, new_xawtstr);
5708   if (::stat(libmawtpath, &statbuf) == 0) return false;
5709 
5710   return true;
5711 }
5712 
5713 size_t os::write(int fd, const void *buf, unsigned int nBytes) {
5714   size_t res;
5715   assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
5716          "Assumed _thread_in_native");
5717   RESTARTABLE((size_t) ::write(fd, buf, (size_t) nBytes), res);
5718   return res;
5719 }
5720 
5721 int os::close(int fd) {
5722   return ::close(fd);
5723 }
5724 
5725 int os::socket_close(int fd) {
5726   return ::close(fd);
5727 }
5728 
5729 int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
5730   assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
5731          "Assumed _thread_in_native");
5732   RESTARTABLE_RETURN_INT((int)::recv(fd, buf, nBytes, flags));
5733 }
5734 
5735 int os::send(int fd, char* buf, size_t nBytes, uint flags) {
5736   assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
5737          "Assumed _thread_in_native");
5738   RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags));
5739 }
5740 
5741 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
5742   RESTARTABLE_RETURN_INT((int)::send(fd, buf, nBytes, flags));
5743 }
5744 
5745 // As both poll and select can be interrupted by signals, we have to be
5746 // prepared to restart the system call after updating the timeout, unless
5747 // a poll() is done with timeout == -1, in which case we repeat with this
5748 // "wait forever" value.
5749 
5750 int os::connect(int fd, struct sockaddr *him, socklen_t len) {
5751   int _result;
5752   _result = ::connect(fd, him, len);
5753 
5754   // On Solaris, when a connect() call is interrupted, the connection
5755   // can be established asynchronously (see 6343810). Subsequent calls
5756   // to connect() must check the errno value which has the semantic
5757   // described below (copied from the connect() man page). Handling
5758   // of asynchronously established connections is required for both
5759   // blocking and non-blocking sockets.
5760   //     EINTR            The  connection  attempt  was   interrupted
5761   //                      before  any data arrived by the delivery of
5762   //                      a signal. The connection, however, will  be
5763   //                      established asynchronously.
5764   //
5765   //     EINPROGRESS      The socket is non-blocking, and the connec-
5766   //                      tion  cannot  be completed immediately.
5767   //
5768   //     EALREADY         The socket is non-blocking,  and a previous
5769   //                      connection  attempt  has  not yet been com-
5770   //                      pleted.
5771   //
5772   //     EISCONN          The socket is already connected.
5773   if (_result == OS_ERR && errno == EINTR) {
5774     // restarting a connect() changes its errno semantics
5775     RESTARTABLE(::connect(fd, him, len), _result);
5776     // undo these changes
5777     if (_result == OS_ERR) {
5778       if (errno == EALREADY) {
5779         errno = EINPROGRESS; // fall through
5780       } else if (errno == EISCONN) {
5781         errno = 0;
5782         return OS_OK;
5783       }
5784     }
5785   }
5786   return _result;
5787 }
5788 
5789 // Get the default path to the core file
5790 // Returns the length of the string
5791 int os::get_core_path(char* buffer, size_t bufferSize) {
5792   const char* p = get_current_directory(buffer, bufferSize);
5793 
5794   if (p == NULL) {
5795     assert(p != NULL, "failed to get current directory");
5796     return 0;
5797   }
5798 
5799   jio_snprintf(buffer, bufferSize, "%s/core or core.%d",
5800                                               p, current_process_id());
5801 
5802   return strlen(buffer);
5803 }
5804 
5805 #ifndef PRODUCT
5806 void TestReserveMemorySpecial_test() {
5807   // No tests available for this platform
5808 }
5809 #endif