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