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