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