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