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