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