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