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