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_mode    = IA_NOCHANGE;
3760     if (ThreadPriorityVerbose) {
3761       tty->print_cr ("IA: [%d...%d] %d->%d\n",
3762                iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri);
3763     }
3764   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3765     tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3766     int maxClamped     = MIN2(tsLimits.maxPrio, (int)tsInfo->ts_uprilim);
3767     prv                = tsInfo->ts_upri;
3768     tsInfo->ts_upri    = scale_to_lwp_priority(tsLimits.minPrio, maxClamped, newPrio);
3769     tsInfo->ts_uprilim = IA_NOCHANGE;
3770     if (ThreadPriorityVerbose) {
3771       tty->print_cr ("TS: %d [%d...%d] %d->%d\n",
3772                prv, tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri);
3773     }
3774     if (prv == tsInfo->ts_upri) return 0;
3775   } else {
3776     if ( ThreadPriorityVerbose ) {
3777       tty->print_cr ("Unknown scheduling class\n");
3778     }
3779       return EINVAL;    // no clue, punt
3780   }
3781 
3782   rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo);
3783   if (ThreadPriorityVerbose && rslt) {
3784     tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno);
3785   }
3786   if (rslt < 0) return errno;
3787 
3788 #ifdef ASSERT
3789   // Sanity check: read back what we just attempted to set.
3790   // In theory it could have changed in the interim ...
3791   //
3792   // The priocntl system call is tricky.
3793   // Sometimes it'll validate the priority value argument and
3794   // return EINVAL if unhappy.  At other times it fails silently.
3795   // Readbacks are prudent.
3796 
3797   if (!ReadBackValidate) return 0;
3798 
3799   memset(&ReadBack, 0, sizeof(pcparms_t));
3800   ReadBack.pc_cid = PC_CLNULL;
3801   rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack);
3802   assert(rslt >= 0, "priocntl failed");
3803   Actual = Expected = 0xBAD;
3804   assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match");
3805   if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3806     Actual   = RTPRI(ReadBack)->rt_pri;
3807     Expected = RTPRI(ParmInfo)->rt_pri;
3808   } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3809     Actual   = IAPRI(ReadBack)->ia_upri;
3810     Expected = IAPRI(ParmInfo)->ia_upri;
3811   } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3812     Actual   = TSPRI(ReadBack)->ts_upri;
3813     Expected = TSPRI(ParmInfo)->ts_upri;
3814   } else {
3815     if ( ThreadPriorityVerbose ) {
3816       tty->print_cr("set_lwp_priority: unexpected class in readback: %d\n", ParmInfo.pc_cid);
3817     }
3818   }
3819 
3820   if (Actual != Expected) {
3821     if ( ThreadPriorityVerbose ) {
3822       tty->print_cr ("set_lwp_priority(%d %d) Class=%d: actual=%d vs expected=%d\n",
3823              lwpid, newPrio, ReadBack.pc_cid, Actual, Expected);
3824     }
3825   }
3826 #endif
3827 
3828   return 0;
3829 }
3830 
3831 
3832 
3833 // Solaris only gives access to 128 real priorities at a time,
3834 // so we expand Java's ten to fill this range.  This would be better
3835 // if we dynamically adjusted relative priorities.
3836 //
3837 // The ThreadPriorityPolicy option allows us to select 2 different
3838 // priority scales.
3839 //
3840 // ThreadPriorityPolicy=0
3841 // Since the Solaris' default priority is MaximumPriority, we do not
3842 // set a priority lower than Max unless a priority lower than
3843 // NormPriority is requested.
3844 //
3845 // ThreadPriorityPolicy=1
3846 // This mode causes the priority table to get filled with
3847 // linear values.  NormPriority get's mapped to 50% of the
3848 // Maximum priority an so on.  This will cause VM threads
3849 // to get unfair treatment against other Solaris processes
3850 // which do not explicitly alter their thread priorities.
3851 //
3852 
3853 
3854 int os::java_to_os_priority[MaxPriority + 1] = {
3855   -99999,         // 0 Entry should never be used
3856 
3857   0,              // 1 MinPriority
3858   32,             // 2
3859   64,             // 3
3860 
3861   96,             // 4
3862   127,            // 5 NormPriority
3863   127,            // 6
3864 
3865   127,            // 7
3866   127,            // 8
3867   127,            // 9 NearMaxPriority
3868 
3869   127             // 10 MaxPriority
3870 };
3871 
3872 
3873 OSReturn os::set_native_priority(Thread* thread, int newpri) {
3874   assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping");
3875   if ( !UseThreadPriorities ) return OS_OK;
3876   int status = thr_setprio(thread->osthread()->thread_id(), newpri);
3877   if ( os::Solaris::T2_libthread() || (UseBoundThreads && thread->osthread()->is_vm_created()) )
3878     status |= (set_lwp_priority (thread->osthread()->thread_id(),
3879                     thread->osthread()->lwp_id(), newpri ));
3880   return (status == 0) ? OS_OK : OS_ERR;
3881 }
3882 
3883 
3884 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
3885   int p;
3886   if ( !UseThreadPriorities ) {
3887     *priority_ptr = NormalPriority;
3888     return OS_OK;
3889   }
3890   int status = thr_getprio(thread->osthread()->thread_id(), &p);
3891   if (status != 0) {
3892     return OS_ERR;
3893   }
3894   *priority_ptr = p;
3895   return OS_OK;
3896 }
3897 
3898 
3899 // Hint to the underlying OS that a task switch would not be good.
3900 // Void return because it's a hint and can fail.
3901 void os::hint_no_preempt() {
3902   schedctl_start(schedctl_init());
3903 }
3904 
3905 void os::interrupt(Thread* thread) {
3906   assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
3907 
3908   OSThread* osthread = thread->osthread();
3909 
3910   int isInterrupted = osthread->interrupted();
3911   if (!isInterrupted) {
3912       osthread->set_interrupted(true);
3913       OrderAccess::fence();
3914       // os::sleep() is implemented with either poll (NULL,0,timeout) or
3915       // by parking on _SleepEvent.  If the former, thr_kill will unwedge
3916       // the sleeper by SIGINTR, otherwise the unpark() will wake the sleeper.
3917       ParkEvent * const slp = thread->_SleepEvent ;
3918       if (slp != NULL) slp->unpark() ;
3919   }
3920 
3921   // For JSR166:  unpark after setting status but before thr_kill -dl
3922   if (thread->is_Java_thread()) {
3923     ((JavaThread*)thread)->parker()->unpark();
3924   }
3925 
3926   // Handle interruptible wait() ...
3927   ParkEvent * const ev = thread->_ParkEvent ;
3928   if (ev != NULL) ev->unpark() ;
3929 
3930   // When events are used everywhere for os::sleep, then this thr_kill
3931   // will only be needed if UseVMInterruptibleIO is true.
3932 
3933   if (!isInterrupted) {
3934     int status = thr_kill(osthread->thread_id(), os::Solaris::SIGinterrupt());
3935     assert_status(status == 0, status, "thr_kill");
3936 
3937     // Bump thread interruption counter
3938     RuntimeService::record_thread_interrupt_signaled_count();
3939   }
3940 }
3941 
3942 
3943 bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3944   assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
3945 
3946   OSThread* osthread = thread->osthread();
3947 
3948   bool res = osthread->interrupted();
3949 
3950   // NOTE that since there is no "lock" around these two operations,
3951   // there is the possibility that the interrupted flag will be
3952   // "false" but that the interrupt event will be set. This is
3953   // intentional. The effect of this is that Object.wait() will appear
3954   // to have a spurious wakeup, which is not harmful, and the
3955   // possibility is so rare that it is not worth the added complexity
3956   // to add yet another lock. It has also been recommended not to put
3957   // the interrupted flag into the os::Solaris::Event structure,
3958   // because it hides the issue.
3959   if (res && clear_interrupted) {
3960     osthread->set_interrupted(false);
3961   }
3962   return res;
3963 }
3964 
3965 
3966 void os::print_statistics() {
3967 }
3968 
3969 int os::message_box(const char* title, const char* message) {
3970   int i;
3971   fdStream err(defaultStream::error_fd());
3972   for (i = 0; i < 78; i++) err.print_raw("=");
3973   err.cr();
3974   err.print_raw_cr(title);
3975   for (i = 0; i < 78; i++) err.print_raw("-");
3976   err.cr();
3977   err.print_raw_cr(message);
3978   for (i = 0; i < 78; i++) err.print_raw("=");
3979   err.cr();
3980 
3981   char buf[16];
3982   // Prevent process from exiting upon "read error" without consuming all CPU
3983   while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
3984 
3985   return buf[0] == 'y' || buf[0] == 'Y';
3986 }
3987 
3988 // A lightweight implementation that does not suspend the target thread and
3989 // thus returns only a hint. Used for profiling only!
3990 ExtendedPC os::get_thread_pc(Thread* thread) {
3991   // Make sure that it is called by the watcher and the Threads lock is owned.
3992   assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock");
3993   // For now, is only used to profile the VM Thread
3994   assert(thread->is_VM_thread(), "Can only be called for VMThread");
3995   ExtendedPC epc;
3996 
3997   GetThreadPC_Callback  cb(ProfileVM_lock);
3998   OSThread *osthread = thread->osthread();
3999   const int time_to_wait = 400; // 400ms wait for initial response
4000   int status = cb.interrupt(thread, time_to_wait);
4001 
4002   if (cb.is_done() ) {
4003     epc = cb.addr();
4004   } else {
4005     DEBUG_ONLY(tty->print_cr("Failed to get pc for thread: %d got %d status",
4006                               osthread->thread_id(), status););
4007     // epc is already NULL
4008   }
4009   return epc;
4010 }
4011 
4012 
4013 // This does not do anything on Solaris. This is basically a hook for being
4014 // able to use structured exception handling (thread-local exception filters) on, e.g., Win32.
4015 void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) {
4016   f(value, method, args, thread);
4017 }
4018 
4019 // This routine may be used by user applications as a "hook" to catch signals.
4020 // The user-defined signal handler must pass unrecognized signals to this
4021 // routine, and if it returns true (non-zero), then the signal handler must
4022 // return immediately.  If the flag "abort_if_unrecognized" is true, then this
4023 // routine will never retun false (zero), but instead will execute a VM panic
4024 // routine kill the process.
4025 //
4026 // If this routine returns false, it is OK to call it again.  This allows
4027 // the user-defined signal handler to perform checks either before or after
4028 // the VM performs its own checks.  Naturally, the user code would be making
4029 // a serious error if it tried to handle an exception (such as a null check
4030 // or breakpoint) that the VM was generating for its own correct operation.
4031 //
4032 // This routine may recognize any of the following kinds of signals:
4033 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ,
4034 // os::Solaris::SIGasync
4035 // It should be consulted by handlers for any of those signals.
4036 // It explicitly does not recognize os::Solaris::SIGinterrupt
4037 //
4038 // The caller of this routine must pass in the three arguments supplied
4039 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
4040 // field of the structure passed to sigaction().  This routine assumes that
4041 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
4042 //
4043 // Note that the VM will print warnings if it detects conflicting signal
4044 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
4045 //
4046 extern "C" int JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
4047 
4048 
4049 void signalHandler(int sig, siginfo_t* info, void* ucVoid) {
4050   JVM_handle_solaris_signal(sig, info, ucVoid, true);
4051 }
4052 
4053 /* Do not delete - if guarantee is ever removed,  a signal handler (even empty)
4054    is needed to provoke threads blocked on IO to return an EINTR
4055    Note: this explicitly does NOT call JVM_handle_solaris_signal and
4056    does NOT participate in signal chaining due to requirement for
4057    NOT setting SA_RESTART to make EINTR work. */
4058 extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) {
4059    if (UseSignalChaining) {
4060       struct sigaction *actp = os::Solaris::get_chained_signal_action(sig);
4061       if (actp && actp->sa_handler) {
4062         vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs");
4063       }
4064    }
4065 }
4066 
4067 // This boolean allows users to forward their own non-matching signals
4068 // to JVM_handle_solaris_signal, harmlessly.
4069 bool os::Solaris::signal_handlers_are_installed = false;
4070 
4071 // For signal-chaining
4072 bool os::Solaris::libjsig_is_loaded = false;
4073 typedef struct sigaction *(*get_signal_t)(int);
4074 get_signal_t os::Solaris::get_signal_action = NULL;
4075 
4076 struct sigaction* os::Solaris::get_chained_signal_action(int sig) {
4077   struct sigaction *actp = NULL;
4078 
4079   if ((libjsig_is_loaded)  && (sig <= Maxlibjsigsigs)) {
4080     // Retrieve the old signal handler from libjsig
4081     actp = (*get_signal_action)(sig);
4082   }
4083   if (actp == NULL) {
4084     // Retrieve the preinstalled signal handler from jvm
4085     actp = get_preinstalled_handler(sig);
4086   }
4087 
4088   return actp;
4089 }
4090 
4091 static bool call_chained_handler(struct sigaction *actp, int sig,
4092                                  siginfo_t *siginfo, void *context) {
4093   // Call the old signal handler
4094   if (actp->sa_handler == SIG_DFL) {
4095     // It's more reasonable to let jvm treat it as an unexpected exception
4096     // instead of taking the default action.
4097     return false;
4098   } else if (actp->sa_handler != SIG_IGN) {
4099     if ((actp->sa_flags & SA_NODEFER) == 0) {
4100       // automaticlly block the signal
4101       sigaddset(&(actp->sa_mask), sig);
4102     }
4103 
4104     sa_handler_t hand;
4105     sa_sigaction_t sa;
4106     bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
4107     // retrieve the chained handler
4108     if (siginfo_flag_set) {
4109       sa = actp->sa_sigaction;
4110     } else {
4111       hand = actp->sa_handler;
4112     }
4113 
4114     if ((actp->sa_flags & SA_RESETHAND) != 0) {
4115       actp->sa_handler = SIG_DFL;
4116     }
4117 
4118     // try to honor the signal mask
4119     sigset_t oset;
4120     thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset);
4121 
4122     // call into the chained handler
4123     if (siginfo_flag_set) {
4124       (*sa)(sig, siginfo, context);
4125     } else {
4126       (*hand)(sig);
4127     }
4128 
4129     // restore the signal mask
4130     thr_sigsetmask(SIG_SETMASK, &oset, 0);
4131   }
4132   // Tell jvm's signal handler the signal is taken care of.
4133   return true;
4134 }
4135 
4136 bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) {
4137   bool chained = false;
4138   // signal-chaining
4139   if (UseSignalChaining) {
4140     struct sigaction *actp = get_chained_signal_action(sig);
4141     if (actp != NULL) {
4142       chained = call_chained_handler(actp, sig, siginfo, context);
4143     }
4144   }
4145   return chained;
4146 }
4147 
4148 struct sigaction* os::Solaris::get_preinstalled_handler(int sig) {
4149   assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4150   if (preinstalled_sigs[sig] != 0) {
4151     return &chainedsigactions[sig];
4152   }
4153   return NULL;
4154 }
4155 
4156 void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
4157 
4158   assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range");
4159   assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4160   chainedsigactions[sig] = oldAct;
4161   preinstalled_sigs[sig] = 1;
4162 }
4163 
4164 void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) {
4165   // Check for overwrite.
4166   struct sigaction oldAct;
4167   sigaction(sig, (struct sigaction*)NULL, &oldAct);
4168   void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
4169                                       : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
4170   if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
4171       oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
4172       oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) {
4173     if (AllowUserSignalHandlers || !set_installed) {
4174       // Do not overwrite; user takes responsibility to forward to us.
4175       return;
4176     } else if (UseSignalChaining) {
4177       if (oktochain) {
4178         // save the old handler in jvm
4179         save_preinstalled_handler(sig, oldAct);
4180       } else {
4181         vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs.");
4182       }
4183       // libjsig also interposes the sigaction() call below and saves the
4184       // old sigaction on it own.
4185     } else {
4186       fatal2("Encountered unexpected pre-existing sigaction handler %#lx for signal %d.", (long)oldhand, sig);
4187     }
4188   }
4189 
4190   struct sigaction sigAct;
4191   sigfillset(&(sigAct.sa_mask));
4192   sigAct.sa_handler = SIG_DFL;
4193 
4194   sigAct.sa_sigaction = signalHandler;
4195   // Handle SIGSEGV on alternate signal stack if
4196   // not using stack banging
4197   if (!UseStackBanging && sig == SIGSEGV) {
4198     sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
4199   // Interruptible i/o requires SA_RESTART cleared so EINTR
4200   // is returned instead of restarting system calls
4201   } else if (sig == os::Solaris::SIGinterrupt()) {
4202     sigemptyset(&sigAct.sa_mask);
4203     sigAct.sa_handler = NULL;
4204     sigAct.sa_flags = SA_SIGINFO;
4205     sigAct.sa_sigaction = sigINTRHandler;
4206   } else {
4207     sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
4208   }
4209   os::Solaris::set_our_sigflags(sig, sigAct.sa_flags);
4210 
4211   sigaction(sig, &sigAct, &oldAct);
4212 
4213   void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
4214                                        : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
4215   assert(oldhand2 == oldhand, "no concurrent signal handler installation");
4216 }
4217 
4218 
4219 #define DO_SIGNAL_CHECK(sig) \
4220   if (!sigismember(&check_signal_done, sig)) \
4221     os::Solaris::check_signal_handler(sig)
4222 
4223 // This method is a periodic task to check for misbehaving JNI applications
4224 // under CheckJNI, we can add any periodic checks here
4225 
4226 void os::run_periodic_checks() {
4227   // A big source of grief is hijacking virt. addr 0x0 on Solaris,
4228   // thereby preventing a NULL checks.
4229   if(!check_addr0_done) check_addr0_done = check_addr0(tty);
4230 
4231   if (check_signals == false) return;
4232 
4233   // SEGV and BUS if overridden could potentially prevent
4234   // generation of hs*.log in the event of a crash, debugging
4235   // such a case can be very challenging, so we absolutely
4236   // check for the following for a good measure:
4237   DO_SIGNAL_CHECK(SIGSEGV);
4238   DO_SIGNAL_CHECK(SIGILL);
4239   DO_SIGNAL_CHECK(SIGFPE);
4240   DO_SIGNAL_CHECK(SIGBUS);
4241   DO_SIGNAL_CHECK(SIGPIPE);
4242   DO_SIGNAL_CHECK(SIGXFSZ);
4243 
4244   // ReduceSignalUsage allows the user to override these handlers
4245   // see comments at the very top and jvm_solaris.h
4246   if (!ReduceSignalUsage) {
4247     DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
4248     DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
4249     DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
4250     DO_SIGNAL_CHECK(BREAK_SIGNAL);
4251   }
4252 
4253   // See comments above for using JVM1/JVM2 and UseAltSigs
4254   DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt());
4255   DO_SIGNAL_CHECK(os::Solaris::SIGasync());
4256 
4257 }
4258 
4259 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
4260 
4261 static os_sigaction_t os_sigaction = NULL;
4262 
4263 void os::Solaris::check_signal_handler(int sig) {
4264   char buf[O_BUFLEN];
4265   address jvmHandler = NULL;
4266 
4267   struct sigaction act;
4268   if (os_sigaction == NULL) {
4269     // only trust the default sigaction, in case it has been interposed
4270     os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
4271     if (os_sigaction == NULL) return;
4272   }
4273 
4274   os_sigaction(sig, (struct sigaction*)NULL, &act);
4275 
4276   address thisHandler = (act.sa_flags & SA_SIGINFO)
4277     ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
4278     : CAST_FROM_FN_PTR(address, act.sa_handler) ;
4279 
4280 
4281   switch(sig) {
4282     case SIGSEGV:
4283     case SIGBUS:
4284     case SIGFPE:
4285     case SIGPIPE:
4286     case SIGXFSZ:
4287     case SIGILL:
4288       jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4289       break;
4290 
4291     case SHUTDOWN1_SIGNAL:
4292     case SHUTDOWN2_SIGNAL:
4293     case SHUTDOWN3_SIGNAL:
4294     case BREAK_SIGNAL:
4295       jvmHandler = (address)user_handler();
4296       break;
4297 
4298     default:
4299       int intrsig = os::Solaris::SIGinterrupt();
4300       int asynsig = os::Solaris::SIGasync();
4301 
4302       if (sig == intrsig) {
4303         jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler);
4304       } else if (sig == asynsig) {
4305         jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4306       } else {
4307         return;
4308       }
4309       break;
4310   }
4311 
4312 
4313   if (thisHandler != jvmHandler) {
4314     tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
4315     tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
4316     tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
4317     // No need to check this sig any longer
4318     sigaddset(&check_signal_done, sig);
4319   } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) {
4320     tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
4321     tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig));
4322     tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
4323     // No need to check this sig any longer
4324     sigaddset(&check_signal_done, sig);
4325   }
4326 
4327   // Print all the signal handler state
4328   if (sigismember(&check_signal_done, sig)) {
4329     print_signal_handlers(tty, buf, O_BUFLEN);
4330   }
4331 
4332 }
4333 
4334 void os::Solaris::install_signal_handlers() {
4335   bool libjsigdone = false;
4336   signal_handlers_are_installed = true;
4337 
4338   // signal-chaining
4339   typedef void (*signal_setting_t)();
4340   signal_setting_t begin_signal_setting = NULL;
4341   signal_setting_t end_signal_setting = NULL;
4342   begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4343                                         dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
4344   if (begin_signal_setting != NULL) {
4345     end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4346                                         dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
4347     get_signal_action = CAST_TO_FN_PTR(get_signal_t,
4348                                        dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
4349     get_libjsig_version = CAST_TO_FN_PTR(version_getting_t,
4350                                          dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version"));
4351     libjsig_is_loaded = true;
4352     if (os::Solaris::get_libjsig_version != NULL) {
4353       libjsigversion =  (*os::Solaris::get_libjsig_version)();
4354     }
4355     assert(UseSignalChaining, "should enable signal-chaining");
4356   }
4357   if (libjsig_is_loaded) {
4358     // Tell libjsig jvm is setting signal handlers
4359     (*begin_signal_setting)();
4360   }
4361 
4362   set_signal_handler(SIGSEGV, true, true);
4363   set_signal_handler(SIGPIPE, true, true);
4364   set_signal_handler(SIGXFSZ, true, true);
4365   set_signal_handler(SIGBUS, true, true);
4366   set_signal_handler(SIGILL, true, true);
4367   set_signal_handler(SIGFPE, true, true);
4368 
4369 
4370   if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) {
4371 
4372     // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so
4373     // can not register overridable signals which might be > 32
4374     if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) {
4375     // Tell libjsig jvm has finished setting signal handlers
4376       (*end_signal_setting)();
4377       libjsigdone = true;
4378     }
4379   }
4380 
4381   // Never ok to chain our SIGinterrupt
4382   set_signal_handler(os::Solaris::SIGinterrupt(), true, false);
4383   set_signal_handler(os::Solaris::SIGasync(), true, true);
4384 
4385   if (libjsig_is_loaded && !libjsigdone) {
4386     // Tell libjsig jvm finishes setting signal handlers
4387     (*end_signal_setting)();
4388   }
4389 
4390   // We don't activate signal checker if libjsig is in place, we trust ourselves
4391   // and if UserSignalHandler is installed all bets are off
4392   if (CheckJNICalls) {
4393     if (libjsig_is_loaded) {
4394       tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
4395       check_signals = false;
4396     }
4397     if (AllowUserSignalHandlers) {
4398       tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
4399       check_signals = false;
4400     }
4401   }
4402 }
4403 
4404 
4405 void report_error(const char* file_name, int line_no, const char* title, const char* format, ...);
4406 
4407 const char * signames[] = {
4408   "SIG0",
4409   "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
4410   "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
4411   "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
4412   "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
4413   "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
4414   "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
4415   "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
4416   "SIGCANCEL", "SIGLOST"
4417 };
4418 
4419 const char* os::exception_name(int exception_code, char* buf, size_t size) {
4420   if (0 < exception_code && exception_code <= SIGRTMAX) {
4421     // signal
4422     if (exception_code < sizeof(signames)/sizeof(const char*)) {
4423        jio_snprintf(buf, size, "%s", signames[exception_code]);
4424     } else {
4425        jio_snprintf(buf, size, "SIG%d", exception_code);
4426     }
4427     return buf;
4428   } else {
4429     return NULL;
4430   }
4431 }
4432 
4433 // (Static) wrappers for the new libthread API
4434 int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate;
4435 int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate;
4436 int_fnP_thread_t_i os::Solaris::_thr_setmutator;
4437 int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
4438 int_fnP_thread_t os::Solaris::_thr_continue_mutator;
4439 
4440 // (Static) wrappers for the liblgrp API
4441 os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
4442 os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
4443 os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini;
4444 os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root;
4445 os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children;
4446 os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources;
4447 os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
4448 os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
4449 os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
4450 
4451 // (Static) wrapper for meminfo() call.
4452 os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
4453 
4454 static address resolve_symbol(const char *name) {
4455   address addr;
4456 
4457   addr = (address) dlsym(RTLD_DEFAULT, name);
4458   if(addr == NULL) {
4459     // RTLD_DEFAULT was not defined on some early versions of 2.5.1
4460     addr = (address) dlsym(RTLD_NEXT, name);
4461     if(addr == NULL) {
4462       fatal(dlerror());
4463     }
4464   }
4465   return addr;
4466 }
4467 
4468 
4469 
4470 // isT2_libthread()
4471 //
4472 // Routine to determine if we are currently using the new T2 libthread.
4473 //
4474 // We determine if we are using T2 by reading /proc/self/lstatus and
4475 // looking for a thread with the ASLWP bit set.  If we find this status
4476 // bit set, we must assume that we are NOT using T2.  The T2 team
4477 // has approved this algorithm.
4478 //
4479 // We need to determine if we are running with the new T2 libthread
4480 // since setting native thread priorities is handled differently
4481 // when using this library.  All threads created using T2 are bound
4482 // threads. Calling thr_setprio is meaningless in this case.
4483 //
4484 bool isT2_libthread() {
4485   static prheader_t * lwpArray = NULL;
4486   static int lwpSize = 0;
4487   static int lwpFile = -1;
4488   lwpstatus_t * that;
4489   char lwpName [128];
4490   bool isT2 = false;
4491 
4492 #define ADR(x)  ((uintptr_t)(x))
4493 #define LWPINDEX(ary,ix)   ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1))))
4494 
4495   lwpFile = open("/proc/self/lstatus", O_RDONLY, 0);
4496   if (lwpFile < 0) {
4497       if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n");
4498       return false;
4499   }
4500   lwpSize = 16*1024;
4501   for (;;) {
4502     lseek (lwpFile, 0, SEEK_SET);
4503     lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize);
4504     if (read(lwpFile, lwpArray, lwpSize) < 0) {
4505       if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n");
4506       break;
4507     }
4508     if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) {
4509        // We got a good snapshot - now iterate over the list.
4510       int aslwpcount = 0;
4511       for (int i = 0; i < lwpArray->pr_nent; i++ ) {
4512         that = LWPINDEX(lwpArray,i);
4513         if (that->pr_flags & PR_ASLWP) {
4514           aslwpcount++;
4515         }
4516       }
4517       if (aslwpcount == 0) isT2 = true;
4518       break;
4519     }
4520     lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize;
4521     FREE_C_HEAP_ARRAY(char, lwpArray);  // retry.
4522   }
4523 
4524   FREE_C_HEAP_ARRAY(char, lwpArray);
4525   close (lwpFile);
4526   if (ThreadPriorityVerbose) {
4527     if (isT2) tty->print_cr("We are running with a T2 libthread\n");
4528     else tty->print_cr("We are not running with a T2 libthread\n");
4529   }
4530   return isT2;
4531 }
4532 
4533 
4534 void os::Solaris::libthread_init() {
4535   address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators");
4536 
4537   // Determine if we are running with the new T2 libthread
4538   os::Solaris::set_T2_libthread(isT2_libthread());
4539 
4540   lwp_priocntl_init();
4541 
4542   // RTLD_DEFAULT was not defined on some early versions of 5.5.1
4543   if(func == NULL) {
4544     func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
4545     // Guarantee that this VM is running on an new enough OS (5.6 or
4546     // later) that it will have a new enough libthread.so.
4547     guarantee(func != NULL, "libthread.so is too old.");
4548   }
4549 
4550   // Initialize the new libthread getstate API wrappers
4551   func = resolve_symbol("thr_getstate");
4552   os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func));
4553 
4554   func = resolve_symbol("thr_setstate");
4555   os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func));
4556 
4557   func = resolve_symbol("thr_setmutator");
4558   os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func));
4559 
4560   func = resolve_symbol("thr_suspend_mutator");
4561   os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4562 
4563   func = resolve_symbol("thr_continue_mutator");
4564   os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4565 
4566   int size;
4567   void (*handler_info_func)(address *, int *);
4568   handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo"));
4569   handler_info_func(&handler_start, &size);
4570   handler_end = handler_start + size;
4571 }
4572 
4573 
4574 int_fnP_mutex_tP os::Solaris::_mutex_lock;
4575 int_fnP_mutex_tP os::Solaris::_mutex_trylock;
4576 int_fnP_mutex_tP os::Solaris::_mutex_unlock;
4577 int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init;
4578 int_fnP_mutex_tP os::Solaris::_mutex_destroy;
4579 int os::Solaris::_mutex_scope = USYNC_THREAD;
4580 
4581 int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait;
4582 int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait;
4583 int_fnP_cond_tP os::Solaris::_cond_signal;
4584 int_fnP_cond_tP os::Solaris::_cond_broadcast;
4585 int_fnP_cond_tP_i_vP os::Solaris::_cond_init;
4586 int_fnP_cond_tP os::Solaris::_cond_destroy;
4587 int os::Solaris::_cond_scope = USYNC_THREAD;
4588 
4589 void os::Solaris::synchronization_init() {
4590   if(UseLWPSynchronization) {
4591     os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
4592     os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
4593     os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
4594     os::Solaris::set_mutex_init(lwp_mutex_init);
4595     os::Solaris::set_mutex_destroy(lwp_mutex_destroy);
4596     os::Solaris::set_mutex_scope(USYNC_THREAD);
4597 
4598     os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait")));
4599     os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait")));
4600     os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal")));
4601     os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast")));
4602     os::Solaris::set_cond_init(lwp_cond_init);
4603     os::Solaris::set_cond_destroy(lwp_cond_destroy);
4604     os::Solaris::set_cond_scope(USYNC_THREAD);
4605   }
4606   else {
4607     os::Solaris::set_mutex_scope(USYNC_THREAD);
4608     os::Solaris::set_cond_scope(USYNC_THREAD);
4609 
4610     if(UsePthreads) {
4611       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
4612       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
4613       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
4614       os::Solaris::set_mutex_init(pthread_mutex_default_init);
4615       os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy")));
4616 
4617       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait")));
4618       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait")));
4619       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal")));
4620       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast")));
4621       os::Solaris::set_cond_init(pthread_cond_default_init);
4622       os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy")));
4623     }
4624     else {
4625       os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock")));
4626       os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock")));
4627       os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock")));
4628       os::Solaris::set_mutex_init(::mutex_init);
4629       os::Solaris::set_mutex_destroy(::mutex_destroy);
4630 
4631       os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait")));
4632       os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait")));
4633       os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal")));
4634       os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast")));
4635       os::Solaris::set_cond_init(::cond_init);
4636       os::Solaris::set_cond_destroy(::cond_destroy);
4637     }
4638   }
4639 }
4640 
4641 void os::Solaris::liblgrp_init() {
4642   void *handle = dlopen("liblgrp.so.1", RTLD_LAZY);
4643   if (handle != NULL) {
4644     os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home")));
4645     os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init")));
4646     os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini")));
4647     os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root")));
4648     os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children")));
4649     os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources")));
4650     os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps")));
4651     os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t,
4652                                        dlsym(handle, "lgrp_cookie_stale")));
4653 
4654     lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER);
4655     set_lgrp_cookie(c);
4656   } else {
4657     warning("your OS does not support NUMA");
4658   }
4659 }
4660 
4661 void os::Solaris::misc_sym_init() {
4662   address func = (address)dlsym(RTLD_DEFAULT, "meminfo");
4663   if(func == NULL) {
4664     func = (address) dlsym(RTLD_NEXT, "meminfo");
4665   }
4666   if (func != NULL) {
4667     os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
4668   }
4669 }
4670 
4671 // Symbol doesn't exist in Solaris 8 pset.h
4672 #ifndef PS_MYID
4673 #define PS_MYID -3
4674 #endif
4675 
4676 // int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
4677 typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
4678 static pset_getloadavg_type pset_getloadavg_ptr = NULL;
4679 
4680 void init_pset_getloadavg_ptr(void) {
4681   pset_getloadavg_ptr =
4682     (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg");
4683   if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) {
4684     warning("pset_getloadavg function not found");
4685   }
4686 }
4687 
4688 int os::Solaris::_dev_zero_fd = -1;
4689 
4690 // this is called _before_ the global arguments have been parsed
4691 void os::init(void) {
4692   _initial_pid = getpid();
4693 
4694   max_hrtime = first_hrtime = gethrtime();
4695 
4696   init_random(1234567);
4697 
4698   page_size = sysconf(_SC_PAGESIZE);
4699   if (page_size == -1)
4700     fatal1("os_solaris.cpp: os::init: sysconf failed (%s)", strerror(errno));
4701   init_page_sizes((size_t) page_size);
4702 
4703   Solaris::initialize_system_info();
4704 
4705   int fd = open("/dev/zero", O_RDWR);
4706   if (fd < 0) {
4707     fatal1("os::init: cannot open /dev/zero (%s)", strerror(errno));
4708   } else {
4709     Solaris::set_dev_zero_fd(fd);
4710 
4711     // Close on exec, child won't inherit.
4712     fcntl(fd, F_SETFD, FD_CLOEXEC);
4713   }
4714 
4715   clock_tics_per_sec = CLK_TCK;
4716 
4717   // check if dladdr1() exists; dladdr1 can provide more information than
4718   // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9
4719   // and is available on linker patches for 5.7 and 5.8.
4720   // libdl.so must have been loaded, this call is just an entry lookup
4721   void * hdl = dlopen("libdl.so", RTLD_NOW);
4722   if (hdl)
4723     dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1"));
4724 
4725   // (Solaris only) this switches to calls that actually do locking.
4726   ThreadCritical::initialize();
4727 
4728   main_thread = thr_self();
4729 
4730   // Constant minimum stack size allowed. It must be at least
4731   // the minimum of what the OS supports (thr_min_stack()), and
4732   // enough to allow the thread to get to user bytecode execution.
4733   Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
4734   // If the pagesize of the VM is greater than 8K determine the appropriate
4735   // number of initial guard pages.  The user can change this with the
4736   // command line arguments, if needed.
4737   if (vm_page_size() > 8*K) {
4738     StackYellowPages = 1;
4739     StackRedPages = 1;
4740     StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size();
4741   }
4742 }
4743 
4744 // To install functions for atexit system call
4745 extern "C" {
4746   static void perfMemory_exit_helper() {
4747     perfMemory_exit();
4748   }
4749 }
4750 
4751 // this is called _after_ the global arguments have been parsed
4752 jint os::init_2(void) {
4753   // try to enable extended file IO ASAP, see 6431278
4754   os::Solaris::try_enable_extended_io();
4755 
4756   // Allocate a single page and mark it as readable for safepoint polling.  Also
4757   // use this first mmap call to check support for MAP_ALIGN.
4758   address polling_page = (address)Solaris::mmap_chunk((char*)page_size,
4759                                                       page_size,
4760                                                       MAP_PRIVATE | MAP_ALIGN,
4761                                                       PROT_READ);
4762   if (polling_page == NULL) {
4763     has_map_align = false;
4764     polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE,
4765                                                 PROT_READ);
4766   }
4767 
4768   os::set_polling_page(polling_page);
4769 
4770 #ifndef PRODUCT
4771   if( Verbose && PrintMiscellaneous )
4772     tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
4773 #endif
4774 
4775   if (!UseMembar) {
4776     address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE );
4777     guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
4778     os::set_memory_serialize_page( mem_serialize_page );
4779 
4780 #ifndef PRODUCT
4781     if(Verbose && PrintMiscellaneous)
4782       tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
4783 #endif
4784 }
4785 
4786   FLAG_SET_DEFAULT(UseLargePages, os::large_page_init());
4787 
4788   // Check minimum allowable stack size for thread creation and to initialize
4789   // the java system classes, including StackOverflowError - depends on page
4790   // size.  Add a page for compiler2 recursion in main thread.
4791   // Add in BytesPerWord times page size to account for VM stack during
4792   // class initialization depending on 32 or 64 bit VM.
4793   guarantee((Solaris::min_stack_allowed >=
4794     (StackYellowPages+StackRedPages+StackShadowPages+BytesPerWord
4795      COMPILER2_PRESENT(+1)) * page_size),
4796     "need to increase Solaris::min_stack_allowed on this platform");
4797 
4798   size_t threadStackSizeInBytes = ThreadStackSize * K;
4799   if (threadStackSizeInBytes != 0 &&
4800     threadStackSizeInBytes < Solaris::min_stack_allowed) {
4801     tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
4802                   Solaris::min_stack_allowed/K);
4803     return JNI_ERR;
4804   }
4805 
4806   // For 64kbps there will be a 64kb page size, which makes
4807   // the usable default stack size quite a bit less.  Increase the
4808   // stack for 64kb (or any > than 8kb) pages, this increases
4809   // virtual memory fragmentation (since we're not creating the
4810   // stack on a power of 2 boundary.  The real fix for this
4811   // should be to fix the guard page mechanism.
4812 
4813   if (vm_page_size() > 8*K) {
4814       threadStackSizeInBytes = (threadStackSizeInBytes != 0)
4815          ? threadStackSizeInBytes +
4816            ((StackYellowPages + StackRedPages) * vm_page_size())
4817          : 0;
4818       ThreadStackSize = threadStackSizeInBytes/K;
4819   }
4820 
4821   // Make the stack size a multiple of the page size so that
4822   // the yellow/red zones can be guarded.
4823   JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
4824         vm_page_size()));
4825 
4826   Solaris::libthread_init();
4827   if (UseNUMA) {
4828     Solaris::liblgrp_init();
4829   }
4830   Solaris::misc_sym_init();
4831   Solaris::signal_sets_init();
4832   Solaris::init_signal_mem();
4833   Solaris::install_signal_handlers();
4834 
4835   if (libjsigversion < JSIG_VERSION_1_4_1) {
4836     Maxlibjsigsigs = OLDMAXSIGNUM;
4837   }
4838 
4839   // initialize synchronization primitives to use either thread or
4840   // lwp synchronization (controlled by UseLWPSynchronization)
4841   Solaris::synchronization_init();
4842 
4843   if (MaxFDLimit) {
4844     // set the number of file descriptors to max. print out error
4845     // if getrlimit/setrlimit fails but continue regardless.
4846     struct rlimit nbr_files;
4847     int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
4848     if (status != 0) {
4849       if (PrintMiscellaneous && (Verbose || WizardMode))
4850         perror("os::init_2 getrlimit failed");
4851     } else {
4852       nbr_files.rlim_cur = nbr_files.rlim_max;
4853       status = setrlimit(RLIMIT_NOFILE, &nbr_files);
4854       if (status != 0) {
4855         if (PrintMiscellaneous && (Verbose || WizardMode))
4856           perror("os::init_2 setrlimit failed");
4857       }
4858     }
4859   }
4860 
4861   // Initialize HPI.
4862   jint hpi_result = hpi::initialize();
4863   if (hpi_result != JNI_OK) {
4864     tty->print_cr("There was an error trying to initialize the HPI library.");
4865     return hpi_result;
4866   }
4867 
4868   // Calculate theoretical max. size of Threads to guard gainst
4869   // artifical out-of-memory situations, where all available address-
4870   // space has been reserved by thread stacks. Default stack size is 1Mb.
4871   size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ?
4872     JavaThread::stack_size_at_create() : (1*K*K);
4873   assert(pre_thread_stack_size != 0, "Must have a stack");
4874   // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when
4875   // we should start doing Virtual Memory banging. Currently when the threads will
4876   // have used all but 200Mb of space.
4877   size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K);
4878   Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size;
4879 
4880   // at-exit methods are called in the reverse order of their registration.
4881   // In Solaris 7 and earlier, atexit functions are called on return from
4882   // main or as a result of a call to exit(3C). There can be only 32 of
4883   // these functions registered and atexit() does not set errno. In Solaris
4884   // 8 and later, there is no limit to the number of functions registered
4885   // and atexit() sets errno. In addition, in Solaris 8 and later, atexit
4886   // functions are called upon dlclose(3DL) in addition to return from main
4887   // and exit(3C).
4888 
4889   if (PerfAllowAtExitRegistration) {
4890     // only register atexit functions if PerfAllowAtExitRegistration is set.
4891     // atexit functions can be delayed until process exit time, which
4892     // can be problematic for embedded VM situations. Embedded VMs should
4893     // call DestroyJavaVM() to assure that VM resources are released.
4894 
4895     // note: perfMemory_exit_helper atexit function may be removed in
4896     // the future if the appropriate cleanup code can be added to the
4897     // VM_Exit VMOperation's doit method.
4898     if (atexit(perfMemory_exit_helper) != 0) {
4899       warning("os::init2 atexit(perfMemory_exit_helper) failed");
4900     }
4901   }
4902 
4903   // Init pset_loadavg function pointer
4904   init_pset_getloadavg_ptr();
4905 
4906   return JNI_OK;
4907 }
4908 
4909 
4910 // Mark the polling page as unreadable
4911 void os::make_polling_page_unreadable(void) {
4912   if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
4913     fatal("Could not disable polling page");
4914 };
4915 
4916 // Mark the polling page as readable
4917 void os::make_polling_page_readable(void) {
4918   if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 )
4919     fatal("Could not enable polling page");
4920 };
4921 
4922 // OS interface.
4923 
4924 int os::stat(const char *path, struct stat *sbuf) {
4925   char pathbuf[MAX_PATH];
4926   if (strlen(path) > MAX_PATH - 1) {
4927     errno = ENAMETOOLONG;
4928     return -1;
4929   }
4930   hpi::native_path(strcpy(pathbuf, path));
4931   return ::stat(pathbuf, sbuf);
4932 }
4933 
4934 
4935 bool os::check_heap(bool force) { return true; }
4936 
4937 typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr);
4938 static vsnprintf_t sol_vsnprintf = NULL;
4939 
4940 int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) {
4941   if (!sol_vsnprintf) {
4942     //search  for the named symbol in the objects that were loaded after libjvm
4943     void* where = RTLD_NEXT;
4944     if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
4945         sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
4946     if (!sol_vsnprintf){
4947       //search  for the named symbol in the objects that were loaded before libjvm
4948       where = RTLD_DEFAULT;
4949       if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
4950         sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
4951       assert(sol_vsnprintf != NULL, "vsnprintf not found");
4952     }
4953   }
4954   return (*sol_vsnprintf)(buf, count, fmt, argptr);
4955 }
4956 
4957 
4958 // Is a (classpath) directory empty?
4959 bool os::dir_is_empty(const char* path) {
4960   DIR *dir = NULL;
4961   struct dirent *ptr;
4962 
4963   dir = opendir(path);
4964   if (dir == NULL) return true;
4965 
4966   /* Scan the directory */
4967   bool result = true;
4968   char buf[sizeof(struct dirent) + MAX_PATH];
4969   struct dirent *dbuf = (struct dirent *) buf;
4970   while (result && (ptr = readdir(dir, dbuf)) != NULL) {
4971     if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
4972       result = false;
4973     }
4974   }
4975   closedir(dir);
4976   return result;
4977 }
4978 
4979 // create binary file, rewriting existing file if required
4980 int os::create_binary_file(const char* path, bool rewrite_existing) {
4981   int oflags = O_WRONLY | O_CREAT;
4982   if (!rewrite_existing) {
4983     oflags |= O_EXCL;
4984   }
4985   return ::open64(path, oflags, S_IREAD | S_IWRITE);
4986 }
4987 
4988 // return current position of file pointer
4989 jlong os::current_file_offset(int fd) {
4990   return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
4991 }
4992 
4993 // move file pointer to the specified offset
4994 jlong os::seek_to_file_offset(int fd, jlong offset) {
4995   return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
4996 }
4997 
4998 // Map a block of memory.
4999 char* os::map_memory(int fd, const char* file_name, size_t file_offset,
5000                      char *addr, size_t bytes, bool read_only,
5001                      bool allow_exec) {
5002   int prot;
5003   int flags;
5004 
5005   if (read_only) {
5006     prot = PROT_READ;
5007     flags = MAP_SHARED;
5008   } else {
5009     prot = PROT_READ | PROT_WRITE;
5010     flags = MAP_PRIVATE;
5011   }
5012 
5013   if (allow_exec) {
5014     prot |= PROT_EXEC;
5015   }
5016 
5017   if (addr != NULL) {
5018     flags |= MAP_FIXED;
5019   }
5020 
5021   char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
5022                                      fd, file_offset);
5023   if (mapped_address == MAP_FAILED) {
5024     return NULL;
5025   }
5026   return mapped_address;
5027 }
5028 
5029 
5030 // Remap a block of memory.
5031 char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
5032                        char *addr, size_t bytes, bool read_only,
5033                        bool allow_exec) {
5034   // same as map_memory() on this OS
5035   return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
5036                         allow_exec);
5037 }
5038 
5039 
5040 // Unmap a block of memory.
5041 bool os::unmap_memory(char* addr, size_t bytes) {
5042   return munmap(addr, bytes) == 0;
5043 }
5044 
5045 void os::pause() {
5046   char filename[MAX_PATH];
5047   if (PauseAtStartupFile && PauseAtStartupFile[0]) {
5048     jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
5049   } else {
5050     jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
5051   }
5052 
5053   int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
5054   if (fd != -1) {
5055     struct stat buf;
5056     close(fd);
5057     while (::stat(filename, &buf) == 0) {
5058       (void)::poll(NULL, 0, 100);
5059     }
5060   } else {
5061     jio_fprintf(stderr,
5062       "Could not open pause file '%s', continuing immediately.\n", filename);
5063   }
5064 }
5065 
5066 #ifndef PRODUCT
5067 #ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5068 // Turn this on if you need to trace synch operations.
5069 // Set RECORD_SYNCH_LIMIT to a large-enough value,
5070 // and call record_synch_enable and record_synch_disable
5071 // around the computation of interest.
5072 
5073 void record_synch(char* name, bool returning);  // defined below
5074 
5075 class RecordSynch {
5076   char* _name;
5077  public:
5078   RecordSynch(char* name) :_name(name)
5079                  { record_synch(_name, false); }
5080   ~RecordSynch() { record_synch(_name,   true);  }
5081 };
5082 
5083 #define CHECK_SYNCH_OP(ret, name, params, args, inner)          \
5084 extern "C" ret name params {                                    \
5085   typedef ret name##_t params;                                  \
5086   static name##_t* implem = NULL;                               \
5087   static int callcount = 0;                                     \
5088   if (implem == NULL) {                                         \
5089     implem = (name##_t*) dlsym(RTLD_NEXT, #name);               \
5090     if (implem == NULL)  fatal(dlerror());                      \
5091   }                                                             \
5092   ++callcount;                                                  \
5093   RecordSynch _rs(#name);                                       \
5094   inner;                                                        \
5095   return implem args;                                           \
5096 }
5097 // in dbx, examine callcounts this way:
5098 // for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done
5099 
5100 #define CHECK_POINTER_OK(p) \
5101   (Universe::perm_gen() == NULL || !Universe::is_reserved_heap((oop)(p)))
5102 #define CHECK_MU \
5103   if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only.");
5104 #define CHECK_CV \
5105   if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only.");
5106 #define CHECK_P(p) \
5107   if (!CHECK_POINTER_OK(p))  fatal(false,  "Pointer must be in C heap only.");
5108 
5109 #define CHECK_MUTEX(mutex_op) \
5110 CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU);
5111 
5112 CHECK_MUTEX(   mutex_lock)
5113 CHECK_MUTEX(  _mutex_lock)
5114 CHECK_MUTEX( mutex_unlock)
5115 CHECK_MUTEX(_mutex_unlock)
5116 CHECK_MUTEX( mutex_trylock)
5117 CHECK_MUTEX(_mutex_trylock)
5118 
5119 #define CHECK_COND(cond_op) \
5120 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV);
5121 
5122 CHECK_COND( cond_wait);
5123 CHECK_COND(_cond_wait);
5124 CHECK_COND(_cond_wait_cancel);
5125 
5126 #define CHECK_COND2(cond_op) \
5127 CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV);
5128 
5129 CHECK_COND2( cond_timedwait);
5130 CHECK_COND2(_cond_timedwait);
5131 CHECK_COND2(_cond_timedwait_cancel);
5132 
5133 // do the _lwp_* versions too
5134 #define mutex_t lwp_mutex_t
5135 #define cond_t  lwp_cond_t
5136 CHECK_MUTEX(  _lwp_mutex_lock)
5137 CHECK_MUTEX(  _lwp_mutex_unlock)
5138 CHECK_MUTEX(  _lwp_mutex_trylock)
5139 CHECK_MUTEX( __lwp_mutex_lock)
5140 CHECK_MUTEX( __lwp_mutex_unlock)
5141 CHECK_MUTEX( __lwp_mutex_trylock)
5142 CHECK_MUTEX(___lwp_mutex_lock)
5143 CHECK_MUTEX(___lwp_mutex_unlock)
5144 
5145 CHECK_COND(  _lwp_cond_wait);
5146 CHECK_COND( __lwp_cond_wait);
5147 CHECK_COND(___lwp_cond_wait);
5148 
5149 CHECK_COND2(  _lwp_cond_timedwait);
5150 CHECK_COND2( __lwp_cond_timedwait);
5151 #undef mutex_t
5152 #undef cond_t
5153 
5154 CHECK_SYNCH_OP(int, _lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5155 CHECK_SYNCH_OP(int,__lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5156 CHECK_SYNCH_OP(int, _lwp_kill,           (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_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5159 CHECK_SYNCH_OP(int,__lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5160 CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5161 CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5162 
5163 
5164 // recording machinery:
5165 
5166 enum { RECORD_SYNCH_LIMIT = 200 };
5167 char* record_synch_name[RECORD_SYNCH_LIMIT];
5168 void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT];
5169 bool record_synch_returning[RECORD_SYNCH_LIMIT];
5170 thread_t record_synch_thread[RECORD_SYNCH_LIMIT];
5171 int record_synch_count = 0;
5172 bool record_synch_enabled = false;
5173 
5174 // in dbx, examine recorded data this way:
5175 // for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done
5176 
5177 void record_synch(char* name, bool returning) {
5178   if (record_synch_enabled) {
5179     if (record_synch_count < RECORD_SYNCH_LIMIT) {
5180       record_synch_name[record_synch_count] = name;
5181       record_synch_returning[record_synch_count] = returning;
5182       record_synch_thread[record_synch_count] = thr_self();
5183       record_synch_arg0ptr[record_synch_count] = &name;
5184       record_synch_count++;
5185     }
5186     // put more checking code here:
5187     // ...
5188   }
5189 }
5190 
5191 void record_synch_enable() {
5192   // start collecting trace data, if not already doing so
5193   if (!record_synch_enabled)  record_synch_count = 0;
5194   record_synch_enabled = true;
5195 }
5196 
5197 void record_synch_disable() {
5198   // stop collecting trace data
5199   record_synch_enabled = false;
5200 }
5201 
5202 #endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5203 #endif // PRODUCT
5204 
5205 const intptr_t thr_time_off  = (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5206 const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) -
5207                                (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5208 
5209 
5210 // JVMTI & JVM monitoring and management support
5211 // The thread_cpu_time() and current_thread_cpu_time() are only
5212 // supported if is_thread_cpu_time_supported() returns true.
5213 // They are not supported on Solaris T1.
5214 
5215 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
5216 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
5217 // of a thread.
5218 //
5219 // current_thread_cpu_time() and thread_cpu_time(Thread *)
5220 // returns the fast estimate available on the platform.
5221 
5222 // hrtime_t gethrvtime() return value includes
5223 // user time but does not include system time
5224 jlong os::current_thread_cpu_time() {
5225   return (jlong) gethrvtime();
5226 }
5227 
5228 jlong os::thread_cpu_time(Thread *thread) {
5229   // return user level CPU time only to be consistent with
5230   // what current_thread_cpu_time returns.
5231   // thread_cpu_time_info() must be changed if this changes
5232   return os::thread_cpu_time(thread, false /* user time only */);
5233 }
5234 
5235 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
5236   if (user_sys_cpu_time) {
5237     return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
5238   } else {
5239     return os::current_thread_cpu_time();
5240   }
5241 }
5242 
5243 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
5244   char proc_name[64];
5245   int count;
5246   prusage_t prusage;
5247   jlong lwp_time;
5248   int fd;
5249 
5250   sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage",
5251                      getpid(),
5252                      thread->osthread()->lwp_id());
5253   fd = open(proc_name, O_RDONLY);
5254   if ( fd == -1 ) return -1;
5255 
5256   do {
5257     count = pread(fd,
5258                   (void *)&prusage.pr_utime,
5259                   thr_time_size,
5260                   thr_time_off);
5261   } while (count < 0 && errno == EINTR);
5262   close(fd);
5263   if ( count < 0 ) return -1;
5264 
5265   if (user_sys_cpu_time) {
5266     // user + system CPU time
5267     lwp_time = (((jlong)prusage.pr_stime.tv_sec +
5268                  (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) +
5269                  (jlong)prusage.pr_stime.tv_nsec +
5270                  (jlong)prusage.pr_utime.tv_nsec;
5271   } else {
5272     // user level CPU time only
5273     lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) +
5274                 (jlong)prusage.pr_utime.tv_nsec;
5275   }
5276 
5277   return(lwp_time);
5278 }
5279 
5280 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5281   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5282   info_ptr->may_skip_backward = false;    // elapsed time not wall time
5283   info_ptr->may_skip_forward = false;     // elapsed time not wall time
5284   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5285 }
5286 
5287 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5288   info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5289   info_ptr->may_skip_backward = false;    // elapsed time not wall time
5290   info_ptr->may_skip_forward = false;     // elapsed time not wall time
5291   info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5292 }
5293 
5294 bool os::is_thread_cpu_time_supported() {
5295   if ( os::Solaris::T2_libthread() || UseBoundThreads ) {
5296     return true;
5297   } else {
5298     return false;
5299   }
5300 }
5301 
5302 // System loadavg support.  Returns -1 if load average cannot be obtained.
5303 // Return the load average for our processor set if the primitive exists
5304 // (Solaris 9 and later).  Otherwise just return system wide loadavg.
5305 int os::loadavg(double loadavg[], int nelem) {
5306   if (pset_getloadavg_ptr != NULL) {
5307     return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem);
5308   } else {
5309     return ::getloadavg(loadavg, nelem);
5310   }
5311 }
5312 
5313 //---------------------------------------------------------------------------------
5314 #ifndef PRODUCT
5315 
5316 static address same_page(address x, address y) {
5317   intptr_t page_bits = -os::vm_page_size();
5318   if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
5319     return x;
5320   else if (x > y)
5321     return (address)(intptr_t(y) | ~page_bits) + 1;
5322   else
5323     return (address)(intptr_t(y) & page_bits);
5324 }
5325 
5326 bool os::find(address addr) {
5327   Dl_info dlinfo;
5328   memset(&dlinfo, 0, sizeof(dlinfo));
5329   if (dladdr(addr, &dlinfo)) {
5330 #ifdef _LP64
5331     tty->print("0x%016lx: ", addr);
5332 #else
5333     tty->print("0x%08x: ", addr);
5334 #endif
5335     if (dlinfo.dli_sname != NULL)
5336       tty->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
5337     else if (dlinfo.dli_fname)
5338       tty->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
5339     else
5340       tty->print("<absolute address>");
5341     if (dlinfo.dli_fname)  tty->print(" in %s", dlinfo.dli_fname);
5342 #ifdef _LP64
5343     if (dlinfo.dli_fbase)  tty->print(" at 0x%016lx", dlinfo.dli_fbase);
5344 #else
5345     if (dlinfo.dli_fbase)  tty->print(" at 0x%08x", dlinfo.dli_fbase);
5346 #endif
5347     tty->cr();
5348 
5349     if (Verbose) {
5350       // decode some bytes around the PC
5351       address begin = same_page(addr-40, addr);
5352       address end   = same_page(addr+40, addr);
5353       address       lowest = (address) dlinfo.dli_sname;
5354       if (!lowest)  lowest = (address) dlinfo.dli_fbase;
5355       if (begin < lowest)  begin = lowest;
5356       Dl_info dlinfo2;
5357       if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
5358           && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
5359         end = (address) dlinfo2.dli_saddr;
5360       Disassembler::decode(begin, end);
5361     }
5362     return true;
5363   }
5364   return false;
5365 }
5366 
5367 #endif
5368 
5369 
5370 // Following function has been added to support HotSparc's libjvm.so running
5371 // under Solaris production JDK 1.2.2 / 1.3.0.  These came from
5372 // src/solaris/hpi/native_threads in the EVM codebase.
5373 //
5374 // NOTE: This is no longer needed in the 1.3.1 and 1.4 production release
5375 // libraries and should thus be removed. We will leave it behind for a while
5376 // until we no longer want to able to run on top of 1.3.0 Solaris production
5377 // JDK. See 4341971.
5378 
5379 #define STACK_SLACK 0x800
5380 
5381 extern "C" {
5382   intptr_t sysThreadAvailableStackWithSlack() {
5383     stack_t st;
5384     intptr_t retval, stack_top;
5385     retval = thr_stksegment(&st);
5386     assert(retval == 0, "incorrect return value from thr_stksegment");
5387     assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
5388     assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
5389     stack_top=(intptr_t)st.ss_sp-st.ss_size;
5390     return ((intptr_t)&stack_top - stack_top - STACK_SLACK);
5391   }
5392 }
5393 
5394 // Just to get the Kernel build to link on solaris for testing.
5395 
5396 extern "C" {
5397 class ASGCT_CallTrace;
5398 void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)
5399   KERNEL_RETURN;
5400 }
5401 
5402 
5403 // ObjectMonitor park-unpark infrastructure ...
5404 //
5405 // We implement Solaris and Linux PlatformEvents with the
5406 // obvious condvar-mutex-flag triple.
5407 // Another alternative that works quite well is pipes:
5408 // Each PlatformEvent consists of a pipe-pair.
5409 // The thread associated with the PlatformEvent
5410 // calls park(), which reads from the input end of the pipe.
5411 // Unpark() writes into the other end of the pipe.
5412 // The write-side of the pipe must be set NDELAY.
5413 // Unfortunately pipes consume a large # of handles.
5414 // Native solaris lwp_park() and lwp_unpark() work nicely, too.
5415 // Using pipes for the 1st few threads might be workable, however.
5416 //
5417 // park() is permitted to return spuriously.
5418 // Callers of park() should wrap the call to park() in
5419 // an appropriate loop.  A litmus test for the correct
5420 // usage of park is the following: if park() were modified
5421 // to immediately return 0 your code should still work,
5422 // albeit degenerating to a spin loop.
5423 //
5424 // An interesting optimization for park() is to use a trylock()
5425 // to attempt to acquire the mutex.  If the trylock() fails
5426 // then we know that a concurrent unpark() operation is in-progress.
5427 // in that case the park() code could simply set _count to 0
5428 // and return immediately.  The subsequent park() operation *might*
5429 // return immediately.  That's harmless as the caller of park() is
5430 // expected to loop.  By using trylock() we will have avoided a
5431 // avoided a context switch caused by contention on the per-thread mutex.
5432 //
5433 // TODO-FIXME:
5434 // 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the
5435 //     objectmonitor implementation.
5436 // 2.  Collapse the JSR166 parker event, and the
5437 //     objectmonitor ParkEvent into a single "Event" construct.
5438 // 3.  In park() and unpark() add:
5439 //     assert (Thread::current() == AssociatedWith).
5440 // 4.  add spurious wakeup injection on a -XX:EarlyParkReturn=N switch.
5441 //     1-out-of-N park() operations will return immediately.
5442 //
5443 // _Event transitions in park()
5444 //   -1 => -1 : illegal
5445 //    1 =>  0 : pass - return immediately
5446 //    0 => -1 : block
5447 //
5448 // _Event serves as a restricted-range semaphore.
5449 //
5450 // Another possible encoding of _Event would be with
5451 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
5452 //
5453 // TODO-FIXME: add DTRACE probes for:
5454 // 1.   Tx parks
5455 // 2.   Ty unparks Tx
5456 // 3.   Tx resumes from park
5457 
5458 
5459 // value determined through experimentation
5460 #define ROUNDINGFIX 11
5461 
5462 // utility to compute the abstime argument to timedwait.
5463 // TODO-FIXME: switch from compute_abstime() to unpackTime().
5464 
5465 static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
5466   // millis is the relative timeout time
5467   // abstime will be the absolute timeout time
5468   if (millis < 0)  millis = 0;
5469   struct timeval now;
5470   int status = gettimeofday(&now, NULL);
5471   assert(status == 0, "gettimeofday");
5472   jlong seconds = millis / 1000;
5473   jlong max_wait_period;
5474 
5475   if (UseLWPSynchronization) {
5476     // forward port of fix for 4275818 (not sleeping long enough)
5477     // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where
5478     // _lwp_cond_timedwait() used a round_down algorithm rather
5479     // than a round_up. For millis less than our roundfactor
5480     // it rounded down to 0 which doesn't meet the spec.
5481     // For millis > roundfactor we may return a bit sooner, but
5482     // since we can not accurately identify the patch level and
5483     // this has already been fixed in Solaris 9 and 8 we will
5484     // leave it alone rather than always rounding down.
5485 
5486     if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX;
5487        // It appears that when we go directly through Solaris _lwp_cond_timedwait()
5488            // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6
5489            max_wait_period = 21000000;
5490   } else {
5491     max_wait_period = 50000000;
5492   }
5493   millis %= 1000;
5494   if (seconds > max_wait_period) {      // see man cond_timedwait(3T)
5495      seconds = max_wait_period;
5496   }
5497   abstime->tv_sec = now.tv_sec  + seconds;
5498   long       usec = now.tv_usec + millis * 1000;
5499   if (usec >= 1000000) {
5500     abstime->tv_sec += 1;
5501     usec -= 1000000;
5502   }
5503   abstime->tv_nsec = usec * 1000;
5504   return abstime;
5505 }
5506 
5507 // Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
5508 // Conceptually TryPark() should be equivalent to park(0).
5509 
5510 int os::PlatformEvent::TryPark() {
5511   for (;;) {
5512     const int v = _Event ;
5513     guarantee ((v == 0) || (v == 1), "invariant") ;
5514     if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
5515   }
5516 }
5517 
5518 void os::PlatformEvent::park() {           // AKA: down()
5519   // Invariant: Only the thread associated with the Event/PlatformEvent
5520   // may call park().
5521   int v ;
5522   for (;;) {
5523       v = _Event ;
5524       if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
5525   }
5526   guarantee (v >= 0, "invariant") ;
5527   if (v == 0) {
5528      // Do this the hard way by blocking ...
5529      // See http://monaco.sfbay/detail.jsf?cr=5094058.
5530      // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5531      // Only for SPARC >= V8PlusA
5532 #if defined(__sparc) && defined(COMPILER2)
5533      if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5534 #endif
5535      int status = os::Solaris::mutex_lock(_mutex);
5536      assert_status(status == 0, status,  "mutex_lock");
5537      guarantee (_nParked == 0, "invariant") ;
5538      ++ _nParked ;
5539      while (_Event < 0) {
5540         // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
5541         // Treat this the same as if the wait was interrupted
5542         // With usr/lib/lwp going to kernel, always handle ETIME
5543         status = os::Solaris::cond_wait(_cond, _mutex);
5544         if (status == ETIME) status = EINTR ;
5545         assert_status(status == 0 || status == EINTR, status, "cond_wait");
5546      }
5547      -- _nParked ;
5548      _Event = 0 ;
5549      status = os::Solaris::mutex_unlock(_mutex);
5550      assert_status(status == 0, status, "mutex_unlock");
5551   }
5552 }
5553 
5554 int os::PlatformEvent::park(jlong millis) {
5555   guarantee (_nParked == 0, "invariant") ;
5556   int v ;
5557   for (;;) {
5558       v = _Event ;
5559       if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
5560   }
5561   guarantee (v >= 0, "invariant") ;
5562   if (v != 0) return OS_OK ;
5563 
5564   int ret = OS_TIMEOUT;
5565   timestruc_t abst;
5566   compute_abstime (&abst, millis);
5567 
5568   // See http://monaco.sfbay/detail.jsf?cr=5094058.
5569   // For Solaris SPARC set fprs.FEF=0 prior to parking.
5570   // Only for SPARC >= V8PlusA
5571 #if defined(__sparc) && defined(COMPILER2)
5572  if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5573 #endif
5574   int status = os::Solaris::mutex_lock(_mutex);
5575   assert_status(status == 0, status, "mutex_lock");
5576   guarantee (_nParked == 0, "invariant") ;
5577   ++ _nParked ;
5578   while (_Event < 0) {
5579      int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
5580      assert_status(status == 0 || status == EINTR ||
5581                    status == ETIME || status == ETIMEDOUT,
5582                    status, "cond_timedwait");
5583      if (!FilterSpuriousWakeups) break ;                // previous semantics
5584      if (status == ETIME || status == ETIMEDOUT) break ;
5585      // We consume and ignore EINTR and spurious wakeups.
5586   }
5587   -- _nParked ;
5588   if (_Event >= 0) ret = OS_OK ;
5589   _Event = 0 ;
5590   status = os::Solaris::mutex_unlock(_mutex);
5591   assert_status(status == 0, status, "mutex_unlock");
5592   return ret;
5593 }
5594 
5595 void os::PlatformEvent::unpark() {
5596   int v, AnyWaiters;
5597 
5598   // Increment _Event.
5599   // Another acceptable implementation would be to simply swap 1
5600   // into _Event:
5601   //   if (Swap (&_Event, 1) < 0) {
5602   //      mutex_lock (_mutex) ; AnyWaiters = nParked; mutex_unlock (_mutex) ;
5603   //      if (AnyWaiters) cond_signal (_cond) ;
5604   //   }
5605 
5606   for (;;) {
5607     v = _Event ;
5608     if (v > 0) {
5609        // The LD of _Event could have reordered or be satisfied
5610        // by a read-aside from this processor's write buffer.
5611        // To avoid problems execute a barrier and then
5612        // ratify the value.  A degenerate CAS() would also work.
5613        // Viz., CAS (v+0, &_Event, v) == v).
5614        OrderAccess::fence() ;
5615        if (_Event == v) return ;
5616        continue ;
5617     }
5618     if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
5619   }
5620 
5621   // If the thread associated with the event was parked, wake it.
5622   if (v < 0) {
5623      int status ;
5624      // Wait for the thread assoc with the PlatformEvent to vacate.
5625      status = os::Solaris::mutex_lock(_mutex);
5626      assert_status(status == 0, status, "mutex_lock");
5627      AnyWaiters = _nParked ;
5628      status = os::Solaris::mutex_unlock(_mutex);
5629      assert_status(status == 0, status, "mutex_unlock");
5630      guarantee (AnyWaiters == 0 || AnyWaiters == 1, "invariant") ;
5631      if (AnyWaiters != 0) {
5632        // We intentional signal *after* dropping the lock
5633        // to avoid a common class of futile wakeups.
5634        status = os::Solaris::cond_signal(_cond);
5635        assert_status(status == 0, status, "cond_signal");
5636      }
5637   }
5638 }
5639 
5640 // JSR166
5641 // -------------------------------------------------------
5642 
5643 /*
5644  * The solaris and linux implementations of park/unpark are fairly
5645  * conservative for now, but can be improved. They currently use a
5646  * mutex/condvar pair, plus _counter.
5647  * Park decrements _counter if > 0, else does a condvar wait.  Unpark
5648  * sets count to 1 and signals condvar.  Only one thread ever waits
5649  * on the condvar. Contention seen when trying to park implies that someone
5650  * is unparking you, so don't wait. And spurious returns are fine, so there
5651  * is no need to track notifications.
5652  */
5653 
5654 #define NANOSECS_PER_SEC 1000000000
5655 #define NANOSECS_PER_MILLISEC 1000000
5656 #define MAX_SECS 100000000
5657 
5658 /*
5659  * This code is common to linux and solaris and will be moved to a
5660  * common place in dolphin.
5661  *
5662  * The passed in time value is either a relative time in nanoseconds
5663  * or an absolute time in milliseconds. Either way it has to be unpacked
5664  * into suitable seconds and nanoseconds components and stored in the
5665  * given timespec structure.
5666  * Given time is a 64-bit value and the time_t used in the timespec is only
5667  * a signed-32-bit value (except on 64-bit Linux) we have to watch for
5668  * overflow if times way in the future are given. Further on Solaris versions
5669  * prior to 10 there is a restriction (see cond_timedwait) that the specified
5670  * number of seconds, in abstime, is less than current_time  + 100,000,000.
5671  * As it will be 28 years before "now + 100000000" will overflow we can
5672  * ignore overflow and just impose a hard-limit on seconds using the value
5673  * of "now + 100,000,000". This places a limit on the timeout of about 3.17
5674  * years from "now".
5675  */
5676 static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
5677   assert (time > 0, "convertTime");
5678 
5679   struct timeval now;
5680   int status = gettimeofday(&now, NULL);
5681   assert(status == 0, "gettimeofday");
5682 
5683   time_t max_secs = now.tv_sec + MAX_SECS;
5684 
5685   if (isAbsolute) {
5686     jlong secs = time / 1000;
5687     if (secs > max_secs) {
5688       absTime->tv_sec = max_secs;
5689     }
5690     else {
5691       absTime->tv_sec = secs;
5692     }
5693     absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
5694   }
5695   else {
5696     jlong secs = time / NANOSECS_PER_SEC;
5697     if (secs >= MAX_SECS) {
5698       absTime->tv_sec = max_secs;
5699       absTime->tv_nsec = 0;
5700     }
5701     else {
5702       absTime->tv_sec = now.tv_sec + secs;
5703       absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
5704       if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
5705         absTime->tv_nsec -= NANOSECS_PER_SEC;
5706         ++absTime->tv_sec; // note: this must be <= max_secs
5707       }
5708     }
5709   }
5710   assert(absTime->tv_sec >= 0, "tv_sec < 0");
5711   assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
5712   assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
5713   assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
5714 }
5715 
5716 void Parker::park(bool isAbsolute, jlong time) {
5717 
5718   // Optional fast-path check:
5719   // Return immediately if a permit is available.
5720   if (_counter > 0) {
5721       _counter = 0 ;
5722       return ;
5723   }
5724 
5725   // Optional fast-exit: Check interrupt before trying to wait
5726   Thread* thread = Thread::current();
5727   assert(thread->is_Java_thread(), "Must be JavaThread");
5728   JavaThread *jt = (JavaThread *)thread;
5729   if (Thread::is_interrupted(thread, false)) {
5730     return;
5731   }
5732 
5733   // First, demultiplex/decode time arguments
5734   timespec absTime;
5735   if (time < 0) { // don't wait at all
5736     return;
5737   }
5738   if (time > 0) {
5739     // Warning: this code might be exposed to the old Solaris time
5740     // round-down bugs.  Grep "roundingFix" for details.
5741     unpackTime(&absTime, isAbsolute, time);
5742   }
5743 
5744   // Enter safepoint region
5745   // Beware of deadlocks such as 6317397.
5746   // The per-thread Parker:: _mutex is a classic leaf-lock.
5747   // In particular a thread must never block on the Threads_lock while
5748   // holding the Parker:: mutex.  If safepoints are pending both the
5749   // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
5750   ThreadBlockInVM tbivm(jt);
5751 
5752   // Don't wait if cannot get lock since interference arises from
5753   // unblocking.  Also. check interrupt before trying wait
5754   if (Thread::is_interrupted(thread, false) ||
5755       os::Solaris::mutex_trylock(_mutex) != 0) {
5756     return;
5757   }
5758 
5759   int status ;
5760 
5761   if (_counter > 0)  { // no wait needed
5762     _counter = 0;
5763     status = os::Solaris::mutex_unlock(_mutex);
5764     assert (status == 0, "invariant") ;
5765     return;
5766   }
5767 
5768 #ifdef ASSERT
5769   // Don't catch signals while blocked; let the running threads have the signals.
5770   // (This allows a debugger to break into the running thread.)
5771   sigset_t oldsigs;
5772   sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals();
5773   thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
5774 #endif
5775 
5776   OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
5777   jt->set_suspend_equivalent();
5778   // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
5779 
5780   // Do this the hard way by blocking ...
5781   // See http://monaco.sfbay/detail.jsf?cr=5094058.
5782   // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5783   // Only for SPARC >= V8PlusA
5784 #if defined(__sparc) && defined(COMPILER2)
5785   if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5786 #endif
5787 
5788   if (time == 0) {
5789     status = os::Solaris::cond_wait (_cond, _mutex) ;
5790   } else {
5791     status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
5792   }
5793   // Note that an untimed cond_wait() can sometimes return ETIME on older
5794   // versions of the Solaris.
5795   assert_status(status == 0 || status == EINTR ||
5796                 status == ETIME || status == ETIMEDOUT,
5797                 status, "cond_timedwait");
5798 
5799 #ifdef ASSERT
5800   thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
5801 #endif
5802   _counter = 0 ;
5803   status = os::Solaris::mutex_unlock(_mutex);
5804   assert_status(status == 0, status, "mutex_unlock") ;
5805 
5806   // If externally suspended while waiting, re-suspend
5807   if (jt->handle_special_suspend_equivalent_condition()) {
5808     jt->java_suspend_self();
5809   }
5810 
5811 }
5812 
5813 void Parker::unpark() {
5814   int s, status ;
5815   status = os::Solaris::mutex_lock (_mutex) ;
5816   assert (status == 0, "invariant") ;
5817   s = _counter;
5818   _counter = 1;
5819   status = os::Solaris::mutex_unlock (_mutex) ;
5820   assert (status == 0, "invariant") ;
5821 
5822   if (s < 1) {
5823     status = os::Solaris::cond_signal (_cond) ;
5824     assert (status == 0, "invariant") ;
5825   }
5826 }
5827 
5828 extern char** environ;
5829 
5830 // Run the specified command in a separate process. Return its exit value,
5831 // or -1 on failure (e.g. can't fork a new process).
5832 // Unlike system(), this function can be called from signal handler. It
5833 // doesn't block SIGINT et al.
5834 int os::fork_and_exec(char* cmd) {
5835   char * argv[4];
5836   argv[0] = (char *)"sh";
5837   argv[1] = (char *)"-c";
5838   argv[2] = cmd;
5839   argv[3] = NULL;
5840 
5841   // fork is async-safe, fork1 is not so can't use in signal handler
5842   pid_t pid;
5843   Thread* t = ThreadLocalStorage::get_thread_slow();
5844   if (t != NULL && t->is_inside_signal_handler()) {
5845     pid = fork();
5846   } else {
5847     pid = fork1();
5848   }
5849 
5850   if (pid < 0) {
5851     // fork failed
5852     warning("fork failed: %s", strerror(errno));
5853     return -1;
5854 
5855   } else if (pid == 0) {
5856     // child process
5857 
5858     // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris
5859     execve("/usr/bin/sh", argv, environ);
5860 
5861     // execve failed
5862     _exit(-1);
5863 
5864   } else  {
5865     // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
5866     // care about the actual exit code, for now.
5867 
5868     int status;
5869 
5870     // Wait for the child process to exit.  This returns immediately if
5871     // the child has already exited. */
5872     while (waitpid(pid, &status, 0) < 0) {
5873         switch (errno) {
5874         case ECHILD: return 0;
5875         case EINTR: break;
5876         default: return -1;
5877         }
5878     }
5879 
5880     if (WIFEXITED(status)) {
5881        // The child exited normally; get its exit code.
5882        return WEXITSTATUS(status);
5883     } else if (WIFSIGNALED(status)) {
5884        // The child exited because of a signal
5885        // The best value to return is 0x80 + signal number,
5886        // because that is what all Unix shells do, and because
5887        // it allows callers to distinguish between process exit and
5888        // process death by signal.
5889        return 0x80 + WTERMSIG(status);
5890     } else {
5891        // Unknown exit code; pass it through
5892        return status;
5893     }
5894   }
5895 }