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