os_solaris.cpp revision 242:d95b224e9f17
1/*
2 * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25// do not include  precompiled  header file
26# include "incls/_os_solaris.cpp.incl"
27
28// put OS-includes here
29# include <dlfcn.h>
30# include <errno.h>
31# include <link.h>
32# include <poll.h>
33# include <pthread.h>
34# include <pwd.h>
35# include <schedctl.h>
36# include <setjmp.h>
37# include <signal.h>
38# include <stdio.h>
39# include <alloca.h>
40# include <sys/filio.h>
41# include <sys/ipc.h>
42# include <sys/lwp.h>
43# include <sys/machelf.h>     // for elf Sym structure used by dladdr1
44# include <sys/mman.h>
45# include <sys/processor.h>
46# include <sys/procset.h>
47# include <sys/pset.h>
48# include <sys/resource.h>
49# include <sys/shm.h>
50# include <sys/socket.h>
51# include <sys/stat.h>
52# include <sys/systeminfo.h>
53# include <sys/time.h>
54# include <sys/times.h>
55# include <sys/types.h>
56# include <sys/wait.h>
57# include <sys/utsname.h>
58# include <thread.h>
59# include <unistd.h>
60# include <sys/priocntl.h>
61# include <sys/rtpriocntl.h>
62# include <sys/tspriocntl.h>
63# include <sys/iapriocntl.h>
64# include <sys/loadavg.h>
65# include <string.h>
66
67# define _STRUCTURED_PROC 1  //  this gets us the new structured proc interfaces of 5.6 & later
68# include <sys/procfs.h>     //  see comment in <sys/procfs.h>
69
70#define MAX_PATH (2 * K)
71
72// for timer info max values which include all bits
73#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
74
75#ifdef _GNU_SOURCE
76// See bug #6514594
77extern "C" int madvise(caddr_t, size_t, int);
78extern "C"  int memcntl(caddr_t addr, size_t len, int cmd, caddr_t  arg,
79     int attr, int mask);
80#endif //_GNU_SOURCE
81
82/*
83  MPSS Changes Start.
84  The JVM binary needs to be built and run on pre-Solaris 9
85  systems, but the constants needed by MPSS are only in Solaris 9
86  header files.  They are textually replicated here to allow
87  building on earlier systems.  Once building on Solaris 8 is
88  no longer a requirement, these #defines can be replaced by ordinary
89  system .h inclusion.
90
91  In earlier versions of the  JDK and Solaris, we used ISM for large pages.
92  But ISM requires shared memory to achieve this and thus has many caveats.
93  MPSS is a fully transparent and is a cleaner way to get large pages.
94  Although we still require keeping ISM for backward compatiblitiy as well as
95  giving the opportunity to use large pages on older systems it is
96  recommended that MPSS be used for Solaris 9 and above.
97
98*/
99
100#ifndef MC_HAT_ADVISE
101
102struct memcntl_mha {
103  uint_t          mha_cmd;        /* command(s) */
104  uint_t          mha_flags;
105  size_t          mha_pagesize;
106};
107#define MC_HAT_ADVISE   7       /* advise hat map size */
108#define MHA_MAPSIZE_VA  0x1     /* set preferred page size */
109#define MAP_ALIGN       0x200   /* addr specifies alignment */
110
111#endif
112// MPSS Changes End.
113
114
115// Here are some liblgrp types from sys/lgrp_user.h to be able to
116// compile on older systems without this header file.
117
118#ifndef MADV_ACCESS_LWP
119# define  MADV_ACCESS_LWP         7       /* next LWP to access heavily */
120#endif
121#ifndef MADV_ACCESS_MANY
122# define  MADV_ACCESS_MANY        8       /* many processes to access heavily */
123#endif
124
125#ifndef LGRP_RSRC_CPU
126# define LGRP_RSRC_CPU           0       /* CPU resources */
127#endif
128#ifndef LGRP_RSRC_MEM
129# define LGRP_RSRC_MEM           1       /* memory resources */
130#endif
131
132// Some more macros from sys/mman.h that are not present in Solaris 8.
133
134#ifndef MAX_MEMINFO_CNT
135/*
136 * info_req request type definitions for meminfo
137 * request types starting with MEMINFO_V are used for Virtual addresses
138 * and should not be mixed with MEMINFO_PLGRP which is targeted for Physical
139 * addresses
140 */
141# define MEMINFO_SHIFT           16
142# define MEMINFO_MASK            (0xFF << MEMINFO_SHIFT)
143# define MEMINFO_VPHYSICAL       (0x01 << MEMINFO_SHIFT) /* get physical addr */
144# define MEMINFO_VLGRP           (0x02 << MEMINFO_SHIFT) /* get lgroup */
145# define MEMINFO_VPAGESIZE       (0x03 << MEMINFO_SHIFT) /* size of phys page */
146# define MEMINFO_VREPLCNT        (0x04 << MEMINFO_SHIFT) /* no. of replica */
147# define MEMINFO_VREPL           (0x05 << MEMINFO_SHIFT) /* physical replica */
148# define MEMINFO_VREPL_LGRP      (0x06 << MEMINFO_SHIFT) /* lgrp of replica */
149# define MEMINFO_PLGRP           (0x07 << MEMINFO_SHIFT) /* lgroup for paddr */
150
151/* maximum number of addresses meminfo() can process at a time */
152# define MAX_MEMINFO_CNT 256
153
154/* maximum number of request types */
155# define MAX_MEMINFO_REQ 31
156#endif
157
158// see thr_setprio(3T) for the basis of these numbers
159#define MinimumPriority 0
160#define NormalPriority  64
161#define MaximumPriority 127
162
163// Values for ThreadPriorityPolicy == 1
164int prio_policy1[MaxPriority+1] = { -99999, 0, 16, 32, 48, 64,
165                                        80, 96, 112, 124, 127 };
166
167// System parameters used internally
168static clock_t clock_tics_per_sec = 100;
169
170// For diagnostics to print a message once. see run_periodic_checks
171static bool check_addr0_done = false;
172static sigset_t check_signal_done;
173static bool check_signals = true;
174
175address os::Solaris::handler_start;  // start pc of thr_sighndlrinfo
176address os::Solaris::handler_end;    // end pc of thr_sighndlrinfo
177
178address os::Solaris::_main_stack_base = NULL;  // 4352906 workaround
179
180
181// "default" initializers for missing libc APIs
182extern "C" {
183  static int lwp_mutex_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; }
184  static int lwp_mutex_destroy(mutex_t *mx)                 { return 0; }
185
186  static int lwp_cond_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; }
187  static int lwp_cond_destroy(cond_t *cv)                   { return 0; }
188}
189
190// "default" initializers for pthread-based synchronization
191extern "C" {
192  static int pthread_mutex_default_init(mutex_t *mx, int scope, void *arg) { memset(mx, 0, sizeof(mutex_t)); return 0; }
193  static int pthread_cond_default_init(cond_t *cv, int scope, void *arg){ memset(cv, 0, sizeof(cond_t)); return 0; }
194}
195
196// Thread Local Storage
197// This is common to all Solaris platforms so it is defined here,
198// in this common file.
199// The declarations are in the os_cpu threadLS*.hpp files.
200//
201// Static member initialization for TLS
202Thread* ThreadLocalStorage::_get_thread_cache[ThreadLocalStorage::_pd_cache_size] = {NULL};
203
204#ifndef PRODUCT
205#define _PCT(n,d)       ((100.0*(double)(n))/(double)(d))
206
207int ThreadLocalStorage::_tcacheHit = 0;
208int ThreadLocalStorage::_tcacheMiss = 0;
209
210void ThreadLocalStorage::print_statistics() {
211  int total = _tcacheMiss+_tcacheHit;
212  tty->print_cr("Thread cache hits %d misses %d total %d percent %f\n",
213                _tcacheHit, _tcacheMiss, total, _PCT(_tcacheHit, total));
214}
215#undef _PCT
216#endif // PRODUCT
217
218Thread* ThreadLocalStorage::get_thread_via_cache_slowly(uintptr_t raw_id,
219                                                        int index) {
220  Thread *thread = get_thread_slow();
221  if (thread != NULL) {
222    address sp = os::current_stack_pointer();
223    guarantee(thread->_stack_base == NULL ||
224              (sp <= thread->_stack_base &&
225                 sp >= thread->_stack_base - thread->_stack_size) ||
226               is_error_reported(),
227              "sp must be inside of selected thread stack");
228
229    thread->_self_raw_id = raw_id;  // mark for quick retrieval
230    _get_thread_cache[ index ] = thread;
231  }
232  return thread;
233}
234
235
236static const double all_zero[ sizeof(Thread) / sizeof(double) + 1 ] = {0};
237#define NO_CACHED_THREAD ((Thread*)all_zero)
238
239void ThreadLocalStorage::pd_set_thread(Thread* thread) {
240
241  // Store the new value before updating the cache to prevent a race
242  // between get_thread_via_cache_slowly() and this store operation.
243  os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
244
245  // Update thread cache with new thread if setting on thread create,
246  // or NO_CACHED_THREAD (zeroed) thread if resetting thread on exit.
247  uintptr_t raw = pd_raw_thread_id();
248  int ix = pd_cache_index(raw);
249  _get_thread_cache[ix] = thread == NULL ? NO_CACHED_THREAD : thread;
250}
251
252void ThreadLocalStorage::pd_init() {
253  for (int i = 0; i < _pd_cache_size; i++) {
254    _get_thread_cache[i] = NO_CACHED_THREAD;
255  }
256}
257
258// Invalidate all the caches (happens to be the same as pd_init).
259void ThreadLocalStorage::pd_invalidate_all() { pd_init(); }
260
261#undef NO_CACHED_THREAD
262
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
1694// Used internally for comparisons only
1695// getTimeMillis guaranteed to not move backwards on Solaris
1696jlong getTimeMillis() {
1697  jlong nanotime = getTimeNanos();
1698  return (jlong)(nanotime / NANOSECS_PER_MILLISECS);
1699}
1700
1701// Must return millis since Jan 1 1970 for JVM_CurrentTimeMillis
1702jlong os::javaTimeMillis() {
1703  timeval t;
1704  if (gettimeofday( &t, NULL) == -1)
1705    fatal1("os::javaTimeMillis: gettimeofday (%s)", strerror(errno));
1706  return jlong(t.tv_sec) * 1000  +  jlong(t.tv_usec) / 1000;
1707}
1708
1709jlong os::javaTimeNanos() {
1710  return (jlong)getTimeNanos();
1711}
1712
1713void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
1714  info_ptr->max_value = ALL_64_BITS;      // gethrtime() uses all 64 bits
1715  info_ptr->may_skip_backward = false;    // not subject to resetting or drifting
1716  info_ptr->may_skip_forward = false;     // not subject to resetting or drifting
1717  info_ptr->kind = JVMTI_TIMER_ELAPSED;   // elapsed not CPU time
1718}
1719
1720char * os::local_time_string(char *buf, size_t buflen) {
1721  struct tm t;
1722  time_t long_time;
1723  time(&long_time);
1724  localtime_r(&long_time, &t);
1725  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1726               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1727               t.tm_hour, t.tm_min, t.tm_sec);
1728  return buf;
1729}
1730
1731// Note: os::shutdown() might be called very early during initialization, or
1732// called from signal handler. Before adding something to os::shutdown(), make
1733// sure it is async-safe and can handle partially initialized VM.
1734void os::shutdown() {
1735
1736  // allow PerfMemory to attempt cleanup of any persistent resources
1737  perfMemory_exit();
1738
1739  // needs to remove object in file system
1740  AttachListener::abort();
1741
1742  // flush buffered output, finish log files
1743  ostream_abort();
1744
1745  // Check for abort hook
1746  abort_hook_t abort_hook = Arguments::abort_hook();
1747  if (abort_hook != NULL) {
1748    abort_hook();
1749  }
1750}
1751
1752// Note: os::abort() might be called very early during initialization, or
1753// called from signal handler. Before adding something to os::abort(), make
1754// sure it is async-safe and can handle partially initialized VM.
1755void os::abort(bool dump_core) {
1756  os::shutdown();
1757  if (dump_core) {
1758#ifndef PRODUCT
1759    fdStream out(defaultStream::output_fd());
1760    out.print_raw("Current thread is ");
1761    char buf[16];
1762    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
1763    out.print_raw_cr(buf);
1764    out.print_raw_cr("Dumping core ...");
1765#endif
1766    ::abort(); // dump core (for debugging)
1767  }
1768
1769  ::exit(1);
1770}
1771
1772// Die immediately, no exit hook, no abort hook, no cleanup.
1773void os::die() {
1774  _exit(-1);
1775}
1776
1777// unused
1778void os::set_error_file(const char *logfile) {}
1779
1780// DLL functions
1781
1782const char* os::dll_file_extension() { return ".so"; }
1783
1784const char* os::get_temp_directory() { return "/tmp/"; }
1785
1786void os::dll_build_name(
1787    char* buffer, size_t buflen, const char* pname, const char* fname) {
1788  // copied from libhpi
1789  const size_t pnamelen = pname ? strlen(pname) : 0;
1790
1791  /* Quietly truncate on buffer overflow.  Should be an error. */
1792  if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1793      *buffer = '\0';
1794      return;
1795  }
1796
1797  if (pnamelen == 0) {
1798      sprintf(buffer, "lib%s.so", fname);
1799  } else {
1800      sprintf(buffer, "%s/lib%s.so", pname, fname);
1801  }
1802}
1803
1804const char* os::get_current_directory(char *buf, int buflen) {
1805  return getcwd(buf, buflen);
1806}
1807
1808// check if addr is inside libjvm[_g].so
1809bool os::address_is_in_vm(address addr) {
1810  static address libjvm_base_addr;
1811  Dl_info dlinfo;
1812
1813  if (libjvm_base_addr == NULL) {
1814    dladdr(CAST_FROM_FN_PTR(void *, os::address_is_in_vm), &dlinfo);
1815    libjvm_base_addr = (address)dlinfo.dli_fbase;
1816    assert(libjvm_base_addr !=NULL, "Cannot obtain base address for libjvm");
1817  }
1818
1819  if (dladdr((void *)addr, &dlinfo)) {
1820    if (libjvm_base_addr == (address)dlinfo.dli_fbase) return true;
1821  }
1822
1823  return false;
1824}
1825
1826typedef int (*dladdr1_func_type) (void *, Dl_info *, void **, int);
1827static dladdr1_func_type dladdr1_func = NULL;
1828
1829bool os::dll_address_to_function_name(address addr, char *buf,
1830                                      int buflen, int * offset) {
1831  Dl_info dlinfo;
1832
1833  // dladdr1_func was initialized in os::init()
1834  if (dladdr1_func){
1835      // yes, we have dladdr1
1836
1837      // Support for dladdr1 is checked at runtime; it may be
1838      // available even if the vm is built on a machine that does
1839      // not have dladdr1 support.  Make sure there is a value for
1840      // RTLD_DL_SYMENT.
1841      #ifndef RTLD_DL_SYMENT
1842      #define RTLD_DL_SYMENT 1
1843      #endif
1844      Sym * info;
1845      if (dladdr1_func((void *)addr, &dlinfo, (void **)&info,
1846                       RTLD_DL_SYMENT)) {
1847          if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_sname);
1848          if (offset) *offset = addr - (address)dlinfo.dli_saddr;
1849
1850          // check if the returned symbol really covers addr
1851          return ((char *)dlinfo.dli_saddr + info->st_size > (char *)addr);
1852      } else {
1853          if (buf) buf[0] = '\0';
1854          if (offset) *offset  = -1;
1855          return false;
1856      }
1857  } else {
1858      // no, only dladdr is available
1859      if(dladdr((void *)addr, &dlinfo)) {
1860          if (buf) jio_snprintf(buf, buflen, dlinfo.dli_sname);
1861          if (offset) *offset = addr - (address)dlinfo.dli_saddr;
1862          return true;
1863      } else {
1864          if (buf) buf[0] = '\0';
1865          if (offset) *offset  = -1;
1866          return false;
1867      }
1868  }
1869}
1870
1871bool os::dll_address_to_library_name(address addr, char* buf,
1872                                     int buflen, int* offset) {
1873  Dl_info dlinfo;
1874
1875  if (dladdr((void*)addr, &dlinfo)){
1876     if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
1877     if (offset) *offset = addr - (address)dlinfo.dli_fbase;
1878     return true;
1879  } else {
1880     if (buf) buf[0] = '\0';
1881     if (offset) *offset = -1;
1882     return false;
1883  }
1884}
1885
1886// Prints the names and full paths of all opened dynamic libraries
1887// for current process
1888void os::print_dll_info(outputStream * st) {
1889    Dl_info dli;
1890    void *handle;
1891    Link_map *map;
1892    Link_map *p;
1893
1894    st->print_cr("Dynamic libraries:"); st->flush();
1895
1896    if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) {
1897        st->print_cr("Error: Cannot print dynamic libraries.");
1898        return;
1899    }
1900    handle = dlopen(dli.dli_fname, RTLD_LAZY);
1901    if (handle == NULL) {
1902        st->print_cr("Error: Cannot print dynamic libraries.");
1903        return;
1904    }
1905    dlinfo(handle, RTLD_DI_LINKMAP, &map);
1906    if (map == NULL) {
1907        st->print_cr("Error: Cannot print dynamic libraries.");
1908        return;
1909    }
1910
1911    while (map->l_prev != NULL)
1912        map = map->l_prev;
1913
1914    while (map != NULL) {
1915        st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
1916        map = map->l_next;
1917    }
1918
1919    dlclose(handle);
1920}
1921
1922  // Loads .dll/.so and
1923  // in case of error it checks if .dll/.so was built for the
1924  // same architecture as Hotspot is running on
1925
1926void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
1927{
1928  void * result= ::dlopen(filename, RTLD_LAZY);
1929  if (result != NULL) {
1930    // Successful loading
1931    return result;
1932  }
1933
1934  Elf32_Ehdr elf_head;
1935
1936  // Read system error message into ebuf
1937  // It may or may not be overwritten below
1938  ::strncpy(ebuf, ::dlerror(), ebuflen-1);
1939  ebuf[ebuflen-1]='\0';
1940  int diag_msg_max_length=ebuflen-strlen(ebuf);
1941  char* diag_msg_buf=ebuf+strlen(ebuf);
1942
1943  if (diag_msg_max_length==0) {
1944    // No more space in ebuf for additional diagnostics message
1945    return NULL;
1946  }
1947
1948
1949  int file_descriptor= ::open(filename, O_RDONLY | O_NONBLOCK);
1950
1951  if (file_descriptor < 0) {
1952    // Can't open library, report dlerror() message
1953    return NULL;
1954  }
1955
1956  bool failed_to_read_elf_head=
1957    (sizeof(elf_head)!=
1958        (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
1959
1960  ::close(file_descriptor);
1961  if (failed_to_read_elf_head) {
1962    // file i/o error - report dlerror() msg
1963    return NULL;
1964  }
1965
1966  typedef struct {
1967    Elf32_Half  code;         // Actual value as defined in elf.h
1968    Elf32_Half  compat_class; // Compatibility of archs at VM's sense
1969    char        elf_class;    // 32 or 64 bit
1970    char        endianess;    // MSB or LSB
1971    char*       name;         // String representation
1972  } arch_t;
1973
1974  static const arch_t arch_array[]={
1975    {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1976    {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1977    {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
1978    {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
1979    {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1980    {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1981    {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
1982    {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
1983    {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}
1984  };
1985
1986  #if  (defined IA32)
1987    static  Elf32_Half running_arch_code=EM_386;
1988  #elif   (defined AMD64)
1989    static  Elf32_Half running_arch_code=EM_X86_64;
1990  #elif  (defined IA64)
1991    static  Elf32_Half running_arch_code=EM_IA_64;
1992  #elif  (defined __sparc) && (defined _LP64)
1993    static  Elf32_Half running_arch_code=EM_SPARCV9;
1994  #elif  (defined __sparc) && (!defined _LP64)
1995    static  Elf32_Half running_arch_code=EM_SPARC;
1996  #elif  (defined __powerpc64__)
1997    static  Elf32_Half running_arch_code=EM_PPC64;
1998  #elif  (defined __powerpc__)
1999    static  Elf32_Half running_arch_code=EM_PPC;
2000  #else
2001    #error Method os::dll_load requires that one of following is defined:\
2002         IA32, AMD64, IA64, __sparc, __powerpc__
2003  #endif
2004
2005  // Identify compatability class for VM's architecture and library's architecture
2006  // Obtain string descriptions for architectures
2007
2008  arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
2009  int running_arch_index=-1;
2010
2011  for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
2012    if (running_arch_code == arch_array[i].code) {
2013      running_arch_index    = i;
2014    }
2015    if (lib_arch.code == arch_array[i].code) {
2016      lib_arch.compat_class = arch_array[i].compat_class;
2017      lib_arch.name         = arch_array[i].name;
2018    }
2019  }
2020
2021  assert(running_arch_index != -1,
2022    "Didn't find running architecture code (running_arch_code) in arch_array");
2023  if (running_arch_index == -1) {
2024    // Even though running architecture detection failed
2025    // we may still continue with reporting dlerror() message
2026    return NULL;
2027  }
2028
2029  if (lib_arch.endianess != arch_array[running_arch_index].endianess) {
2030    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: endianness mismatch)");
2031    return NULL;
2032  }
2033
2034  if (lib_arch.elf_class != arch_array[running_arch_index].elf_class) {
2035    ::snprintf(diag_msg_buf, diag_msg_max_length-1," (Possible cause: architecture word width mismatch)");
2036    return NULL;
2037  }
2038
2039  if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
2040    if ( lib_arch.name!=NULL ) {
2041      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
2042        " (Possible cause: can't load %s-bit .so on a %s-bit platform)",
2043        lib_arch.name, arch_array[running_arch_index].name);
2044    } else {
2045      ::snprintf(diag_msg_buf, diag_msg_max_length-1,
2046      " (Possible cause: can't load this .so (machine code=0x%x) on a %s-bit platform)",
2047        lib_arch.code,
2048        arch_array[running_arch_index].name);
2049    }
2050  }
2051
2052  return NULL;
2053}
2054
2055void* os::dll_lookup(void* handle, const char* name) {
2056  return dlsym(handle, name);
2057}
2058
2059
2060bool _print_ascii_file(const char* filename, outputStream* st) {
2061  int fd = open(filename, O_RDONLY);
2062  if (fd == -1) {
2063     return false;
2064  }
2065
2066  char buf[32];
2067  int bytes;
2068  while ((bytes = read(fd, buf, sizeof(buf))) > 0) {
2069    st->print_raw(buf, bytes);
2070  }
2071
2072  close(fd);
2073
2074  return true;
2075}
2076
2077void os::print_os_info(outputStream* st) {
2078  st->print("OS:");
2079
2080  if (!_print_ascii_file("/etc/release", st)) {
2081    st->print("Solaris");
2082  }
2083  st->cr();
2084
2085  // kernel
2086  st->print("uname:");
2087  struct utsname name;
2088  uname(&name);
2089  st->print(name.sysname); st->print(" ");
2090  st->print(name.release); st->print(" ");
2091  st->print(name.version); st->print(" ");
2092  st->print(name.machine);
2093
2094  // libthread
2095  if (os::Solaris::T2_libthread()) st->print("  (T2 libthread)");
2096  else st->print("  (T1 libthread)");
2097  st->cr();
2098
2099  // rlimit
2100  st->print("rlimit:");
2101  struct rlimit rlim;
2102
2103  st->print(" STACK ");
2104  getrlimit(RLIMIT_STACK, &rlim);
2105  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
2106  else st->print("%uk", rlim.rlim_cur >> 10);
2107
2108  st->print(", CORE ");
2109  getrlimit(RLIMIT_CORE, &rlim);
2110  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
2111  else st->print("%uk", rlim.rlim_cur >> 10);
2112
2113  st->print(", NOFILE ");
2114  getrlimit(RLIMIT_NOFILE, &rlim);
2115  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
2116  else st->print("%d", rlim.rlim_cur);
2117
2118  st->print(", AS ");
2119  getrlimit(RLIMIT_AS, &rlim);
2120  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
2121  else st->print("%uk", rlim.rlim_cur >> 10);
2122  st->cr();
2123
2124  // load average
2125  st->print("load average:");
2126  double loadavg[3];
2127  os::loadavg(loadavg, 3);
2128  st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
2129  st->cr();
2130}
2131
2132
2133static bool check_addr0(outputStream* st) {
2134  jboolean status = false;
2135  int fd = open("/proc/self/map",O_RDONLY);
2136  if (fd >= 0) {
2137    prmap_t p;
2138    while(read(fd, &p, sizeof(p)) > 0) {
2139      if (p.pr_vaddr == 0x0) {
2140        st->print("Warning: Address: 0x%x, Size: %dK, ",p.pr_vaddr, p.pr_size/1024, p.pr_mapname);
2141        st->print("Mapped file: %s, ", p.pr_mapname[0] == '\0' ? "None" : p.pr_mapname);
2142        st->print("Access:");
2143        st->print("%s",(p.pr_mflags & MA_READ)  ? "r" : "-");
2144        st->print("%s",(p.pr_mflags & MA_WRITE) ? "w" : "-");
2145        st->print("%s",(p.pr_mflags & MA_EXEC)  ? "x" : "-");
2146        st->cr();
2147        status = true;
2148      }
2149      close(fd);
2150    }
2151  }
2152  return status;
2153}
2154
2155void os::print_memory_info(outputStream* st) {
2156  st->print("Memory:");
2157  st->print(" %dk page", os::vm_page_size()>>10);
2158  st->print(", physical " UINT64_FORMAT "k", os::physical_memory()>>10);
2159  st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10);
2160  st->cr();
2161  (void) check_addr0(st);
2162}
2163
2164// Taken from /usr/include/sys/machsig.h  Supposed to be architecture specific
2165// but they're the same for all the solaris architectures that we support.
2166const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
2167                          "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
2168                          "ILL_COPROC", "ILL_BADSTK" };
2169
2170const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
2171                          "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
2172                          "FPE_FLTINV", "FPE_FLTSUB" };
2173
2174const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
2175
2176const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
2177
2178void os::print_siginfo(outputStream* st, void* siginfo) {
2179  st->print("siginfo:");
2180
2181  const int buflen = 100;
2182  char buf[buflen];
2183  siginfo_t *si = (siginfo_t*)siginfo;
2184  st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
2185  char *err = strerror(si->si_errno);
2186  if (si->si_errno != 0 && err != NULL) {
2187    st->print("si_errno=%s", err);
2188  } else {
2189    st->print("si_errno=%d", si->si_errno);
2190  }
2191  const int c = si->si_code;
2192  assert(c > 0, "unexpected si_code");
2193  switch (si->si_signo) {
2194  case SIGILL:
2195    st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
2196    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2197    break;
2198  case SIGFPE:
2199    st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
2200    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2201    break;
2202  case SIGSEGV:
2203    st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
2204    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2205    break;
2206  case SIGBUS:
2207    st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
2208    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2209    break;
2210  default:
2211    st->print(", si_code=%d", si->si_code);
2212    // no si_addr
2213  }
2214
2215  if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
2216      UseSharedSpaces) {
2217    FileMapInfo* mapinfo = FileMapInfo::current_info();
2218    if (mapinfo->is_in_shared_space(si->si_addr)) {
2219      st->print("\n\nError accessing class data sharing archive."   \
2220                " Mapped file inaccessible during execution, "      \
2221                " possible disk/network problem.");
2222    }
2223  }
2224  st->cr();
2225}
2226
2227// Moved from whole group, because we need them here for diagnostic
2228// prints.
2229#define OLDMAXSIGNUM 32
2230static int Maxsignum = 0;
2231static int *ourSigFlags = NULL;
2232
2233extern "C" void sigINTRHandler(int, siginfo_t*, void*);
2234
2235int os::Solaris::get_our_sigflags(int sig) {
2236  assert(ourSigFlags!=NULL, "signal data structure not initialized");
2237  assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
2238  return ourSigFlags[sig];
2239}
2240
2241void os::Solaris::set_our_sigflags(int sig, int flags) {
2242  assert(ourSigFlags!=NULL, "signal data structure not initialized");
2243  assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
2244  ourSigFlags[sig] = flags;
2245}
2246
2247
2248static const char* get_signal_handler_name(address handler,
2249                                           char* buf, int buflen) {
2250  int offset;
2251  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
2252  if (found) {
2253    // skip directory names
2254    const char *p1, *p2;
2255    p1 = buf;
2256    size_t len = strlen(os::file_separator());
2257    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
2258    jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
2259  } else {
2260    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
2261  }
2262  return buf;
2263}
2264
2265static void print_signal_handler(outputStream* st, int sig,
2266                                  char* buf, size_t buflen) {
2267  struct sigaction sa;
2268
2269  sigaction(sig, NULL, &sa);
2270
2271  st->print("%s: ", os::exception_name(sig, buf, buflen));
2272
2273  address handler = (sa.sa_flags & SA_SIGINFO)
2274                  ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
2275                  : CAST_FROM_FN_PTR(address, sa.sa_handler);
2276
2277  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
2278    st->print("SIG_DFL");
2279  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
2280    st->print("SIG_IGN");
2281  } else {
2282    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
2283  }
2284
2285  st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
2286
2287  address rh = VMError::get_resetted_sighandler(sig);
2288  // May be, handler was resetted by VMError?
2289  if(rh != NULL) {
2290    handler = rh;
2291    sa.sa_flags = VMError::get_resetted_sigflags(sig);
2292  }
2293
2294  st->print(", sa_flags="   PTR32_FORMAT, sa.sa_flags);
2295
2296  // Check: is it our handler?
2297  if(handler == CAST_FROM_FN_PTR(address, signalHandler) ||
2298     handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) {
2299    // It is our signal handler
2300    // check for flags
2301    if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
2302      st->print(
2303        ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
2304        os::Solaris::get_our_sigflags(sig));
2305    }
2306  }
2307  st->cr();
2308}
2309
2310void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
2311  st->print_cr("Signal Handlers:");
2312  print_signal_handler(st, SIGSEGV, buf, buflen);
2313  print_signal_handler(st, SIGBUS , buf, buflen);
2314  print_signal_handler(st, SIGFPE , buf, buflen);
2315  print_signal_handler(st, SIGPIPE, buf, buflen);
2316  print_signal_handler(st, SIGXFSZ, buf, buflen);
2317  print_signal_handler(st, SIGILL , buf, buflen);
2318  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
2319  print_signal_handler(st, ASYNC_SIGNAL, buf, buflen);
2320  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
2321  print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen);
2322  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
2323  print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen);
2324  print_signal_handler(st, os::Solaris::SIGinterrupt(), buf, buflen);
2325  print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen);
2326}
2327
2328static char saved_jvm_path[MAXPATHLEN] = { 0 };
2329
2330// Find the full path to the current module, libjvm.so or libjvm_g.so
2331void os::jvm_path(char *buf, jint buflen) {
2332  // Error checking.
2333  if (buflen < MAXPATHLEN) {
2334    assert(false, "must use a large-enough buffer");
2335    buf[0] = '\0';
2336    return;
2337  }
2338  // Lazy resolve the path to current module.
2339  if (saved_jvm_path[0] != 0) {
2340    strcpy(buf, saved_jvm_path);
2341    return;
2342  }
2343
2344  Dl_info dlinfo;
2345  int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
2346  assert(ret != 0, "cannot locate libjvm");
2347  realpath((char *)dlinfo.dli_fname, buf);
2348
2349  if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) {
2350    // Support for the gamma launcher.  Typical value for buf is
2351    // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".  If "/jre/lib/" appears at
2352    // the right place in the string, then assume we are installed in a JDK and
2353    // we're done.  Otherwise, check for a JAVA_HOME environment variable and fix
2354    // up the path so it looks like libjvm.so is installed there (append a
2355    // fake suffix hotspot/libjvm.so).
2356    const char *p = buf + strlen(buf) - 1;
2357    for (int count = 0; p > buf && count < 5; ++count) {
2358      for (--p; p > buf && *p != '/'; --p)
2359        /* empty */ ;
2360    }
2361
2362    if (strncmp(p, "/jre/lib/", 9) != 0) {
2363      // Look for JAVA_HOME in the environment.
2364      char* java_home_var = ::getenv("JAVA_HOME");
2365      if (java_home_var != NULL && java_home_var[0] != 0) {
2366        char cpu_arch[12];
2367        sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
2368#ifdef _LP64
2369        // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9.
2370        if (strcmp(cpu_arch, "sparc") == 0) {
2371          strcat(cpu_arch, "v9");
2372        } else if (strcmp(cpu_arch, "i386") == 0) {
2373          strcpy(cpu_arch, "amd64");
2374        }
2375#endif
2376        // Check the current module name "libjvm.so" or "libjvm_g.so".
2377        p = strrchr(buf, '/');
2378        assert(strstr(p, "/libjvm") == p, "invalid library name");
2379        p = strstr(p, "_g") ? "_g" : "";
2380
2381        realpath(java_home_var, buf);
2382        sprintf(buf + strlen(buf), "/jre/lib/%s", cpu_arch);
2383        if (0 == access(buf, F_OK)) {
2384          // Use current module name "libjvm[_g].so" instead of
2385          // "libjvm"debug_only("_g")".so" since for fastdebug version
2386          // we should have "libjvm.so" but debug_only("_g") adds "_g"!
2387          // It is used when we are choosing the HPI library's name
2388          // "libhpi[_g].so" in hpi::initialize_get_interface().
2389          sprintf(buf + strlen(buf), "/hotspot/libjvm%s.so", p);
2390        } else {
2391          // Go back to path of .so
2392          realpath((char *)dlinfo.dli_fname, buf);
2393        }
2394      }
2395    }
2396  }
2397
2398  strcpy(saved_jvm_path, buf);
2399}
2400
2401
2402void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
2403  // no prefix required, not even "_"
2404}
2405
2406
2407void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
2408  // no suffix required
2409}
2410
2411
2412// sun.misc.Signal
2413
2414extern "C" {
2415  static void UserHandler(int sig, void *siginfo, void *context) {
2416    // Ctrl-C is pressed during error reporting, likely because the error
2417    // handler fails to abort. Let VM die immediately.
2418    if (sig == SIGINT && is_error_reported()) {
2419       os::die();
2420    }
2421
2422    os::signal_notify(sig);
2423    // We do not need to reinstate the signal handler each time...
2424  }
2425}
2426
2427void* os::user_handler() {
2428  return CAST_FROM_FN_PTR(void*, UserHandler);
2429}
2430
2431extern "C" {
2432  typedef void (*sa_handler_t)(int);
2433  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
2434}
2435
2436void* os::signal(int signal_number, void* handler) {
2437  struct sigaction sigAct, oldSigAct;
2438  sigfillset(&(sigAct.sa_mask));
2439  sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND;
2440  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
2441
2442  if (sigaction(signal_number, &sigAct, &oldSigAct))
2443    // -1 means registration failed
2444    return (void *)-1;
2445
2446  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
2447}
2448
2449void os::signal_raise(int signal_number) {
2450  raise(signal_number);
2451}
2452
2453/*
2454 * The following code is moved from os.cpp for making this
2455 * code platform specific, which it is by its very nature.
2456 */
2457
2458// a counter for each possible signal value
2459static int Sigexit = 0;
2460static int Maxlibjsigsigs;
2461static jint *pending_signals = NULL;
2462static int *preinstalled_sigs = NULL;
2463static struct sigaction *chainedsigactions = NULL;
2464static sema_t sig_sem;
2465typedef int (*version_getting_t)();
2466version_getting_t os::Solaris::get_libjsig_version = NULL;
2467static int libjsigversion = NULL;
2468
2469int os::sigexitnum_pd() {
2470  assert(Sigexit > 0, "signal memory not yet initialized");
2471  return Sigexit;
2472}
2473
2474void os::Solaris::init_signal_mem() {
2475  // Initialize signal structures
2476  Maxsignum = SIGRTMAX;
2477  Sigexit = Maxsignum+1;
2478  assert(Maxsignum >0, "Unable to obtain max signal number");
2479
2480  Maxlibjsigsigs = Maxsignum;
2481
2482  // pending_signals has one int per signal
2483  // The additional signal is for SIGEXIT - exit signal to signal_thread
2484  pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1));
2485  memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
2486
2487  if (UseSignalChaining) {
2488     chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction)
2489       * (Maxsignum + 1));
2490     memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1)));
2491     preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1));
2492     memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1)));
2493  }
2494  ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ));
2495  memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
2496}
2497
2498void os::signal_init_pd() {
2499  int ret;
2500
2501  ret = ::sema_init(&sig_sem, 0, NULL, NULL);
2502  assert(ret == 0, "sema_init() failed");
2503}
2504
2505void os::signal_notify(int signal_number) {
2506  int ret;
2507
2508  Atomic::inc(&pending_signals[signal_number]);
2509  ret = ::sema_post(&sig_sem);
2510  assert(ret == 0, "sema_post() failed");
2511}
2512
2513static int check_pending_signals(bool wait_for_signal) {
2514  int ret;
2515  while (true) {
2516    for (int i = 0; i < Sigexit + 1; i++) {
2517      jint n = pending_signals[i];
2518      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
2519        return i;
2520      }
2521    }
2522    if (!wait_for_signal) {
2523      return -1;
2524    }
2525    JavaThread *thread = JavaThread::current();
2526    ThreadBlockInVM tbivm(thread);
2527
2528    bool threadIsSuspended;
2529    do {
2530      thread->set_suspend_equivalent();
2531      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
2532      while((ret = ::sema_wait(&sig_sem)) == EINTR)
2533          ;
2534      assert(ret == 0, "sema_wait() failed");
2535
2536      // were we externally suspended while we were waiting?
2537      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
2538      if (threadIsSuspended) {
2539        //
2540        // The semaphore has been incremented, but while we were waiting
2541        // another thread suspended us. We don't want to continue running
2542        // while suspended because that would surprise the thread that
2543        // suspended us.
2544        //
2545        ret = ::sema_post(&sig_sem);
2546        assert(ret == 0, "sema_post() failed");
2547
2548        thread->java_suspend_self();
2549      }
2550    } while (threadIsSuspended);
2551  }
2552}
2553
2554int os::signal_lookup() {
2555  return check_pending_signals(false);
2556}
2557
2558int os::signal_wait() {
2559  return check_pending_signals(true);
2560}
2561
2562////////////////////////////////////////////////////////////////////////////////
2563// Virtual Memory
2564
2565static int page_size = -1;
2566
2567// The mmap MAP_ALIGN flag is supported on Solaris 9 and later.  init_2() will
2568// clear this var if support is not available.
2569static bool has_map_align = true;
2570
2571int os::vm_page_size() {
2572  assert(page_size != -1, "must call os::init");
2573  return page_size;
2574}
2575
2576// Solaris allocates memory by pages.
2577int os::vm_allocation_granularity() {
2578  assert(page_size != -1, "must call os::init");
2579  return page_size;
2580}
2581
2582bool os::commit_memory(char* addr, size_t bytes) {
2583  size_t size = bytes;
2584  return
2585     NULL != Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED,
2586                                 PROT_READ | PROT_WRITE | PROT_EXEC);
2587}
2588
2589bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint) {
2590  if (commit_memory(addr, bytes)) {
2591    if (UseMPSS && alignment_hint > (size_t)vm_page_size()) {
2592      // If the large page size has been set and the VM
2593      // is using large pages, use the large page size
2594      // if it is smaller than the alignment hint. This is
2595      // a case where the VM wants to use a larger alignment size
2596      // for its own reasons but still want to use large pages
2597      // (which is what matters to setting the mpss range.
2598      size_t page_size = 0;
2599      if (large_page_size() < alignment_hint) {
2600        assert(UseLargePages, "Expected to be here for large page use only");
2601        page_size = large_page_size();
2602      } else {
2603        // If the alignment hint is less than the large page
2604        // size, the VM wants a particular alignment (thus the hint)
2605        // for internal reasons.  Try to set the mpss range using
2606        // the alignment_hint.
2607        page_size = alignment_hint;
2608      }
2609      // Since this is a hint, ignore any failures.
2610      (void)Solaris::set_mpss_range(addr, bytes, page_size);
2611    }
2612    return true;
2613  }
2614  return false;
2615}
2616
2617// Uncommit the pages in a specified region.
2618void os::free_memory(char* addr, size_t bytes) {
2619  if (madvise(addr, bytes, MADV_FREE) < 0) {
2620    debug_only(warning("MADV_FREE failed."));
2621    return;
2622  }
2623}
2624
2625// Change the page size in a given range.
2626void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2627  assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned.");
2628  assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned.");
2629  Solaris::set_mpss_range(addr, bytes, alignment_hint);
2630}
2631
2632// Tell the OS to make the range local to the first-touching LWP
2633void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2634  assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2635  if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) {
2636    debug_only(warning("MADV_ACCESS_LWP failed."));
2637  }
2638}
2639
2640// Tell the OS that this range would be accessed from different LWPs.
2641void os::numa_make_global(char *addr, size_t bytes) {
2642  assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2643  if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) {
2644    debug_only(warning("MADV_ACCESS_MANY failed."));
2645  }
2646}
2647
2648// Get the number of the locality groups.
2649size_t os::numa_get_groups_num() {
2650  size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie());
2651  return n != -1 ? n : 1;
2652}
2653
2654// Get a list of leaf locality groups. A leaf lgroup is group that
2655// doesn't have any children. Typical leaf group is a CPU or a CPU/memory
2656// board. An LWP is assigned to one of these groups upon creation.
2657size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2658   if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) {
2659     ids[0] = 0;
2660     return 1;
2661   }
2662   int result_size = 0, top = 1, bottom = 0, cur = 0;
2663   for (int k = 0; k < size; k++) {
2664     int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur],
2665                                    (Solaris::lgrp_id_t*)&ids[top], size - top);
2666     if (r == -1) {
2667       ids[0] = 0;
2668       return 1;
2669     }
2670     if (!r) {
2671       // That's a leaf node.
2672       assert (bottom <= cur, "Sanity check");
2673       // Check if the node has memory
2674       if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur],
2675                                   NULL, 0, LGRP_RSRC_MEM) > 0) {
2676         ids[bottom++] = ids[cur];
2677       }
2678     }
2679     top += r;
2680     cur++;
2681   }
2682   return bottom;
2683}
2684
2685// Detect the topology change. Typically happens during CPU pluggin-unplugging.
2686bool os::numa_topology_changed() {
2687  int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie());
2688  if (is_stale != -1 && is_stale) {
2689    Solaris::lgrp_fini(Solaris::lgrp_cookie());
2690    Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER);
2691    assert(c != 0, "Failure to initialize LGRP API");
2692    Solaris::set_lgrp_cookie(c);
2693    return true;
2694  }
2695  return false;
2696}
2697
2698// Get the group id of the current LWP.
2699int os::numa_get_group_id() {
2700  int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID);
2701  if (lgrp_id == -1) {
2702    return 0;
2703  }
2704  const int size = os::numa_get_groups_num();
2705  int *ids = (int*)alloca(size * sizeof(int));
2706
2707  // Get the ids of all lgroups with memory; r is the count.
2708  int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id,
2709                                  (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM);
2710  if (r <= 0) {
2711    return 0;
2712  }
2713  return ids[os::random() % r];
2714}
2715
2716// Request information about the page.
2717bool os::get_page_info(char *start, page_info* info) {
2718  const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2719  uint64_t addr = (uintptr_t)start;
2720  uint64_t outdata[2];
2721  uint_t validity = 0;
2722
2723  if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
2724    return false;
2725  }
2726
2727  info->size = 0;
2728  info->lgrp_id = -1;
2729
2730  if ((validity & 1) != 0) {
2731    if ((validity & 2) != 0) {
2732      info->lgrp_id = outdata[0];
2733    }
2734    if ((validity & 4) != 0) {
2735      info->size = outdata[1];
2736    }
2737    return true;
2738  }
2739  return false;
2740}
2741
2742// Scan the pages from start to end until a page different than
2743// the one described in the info parameter is encountered.
2744char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2745  const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2746  const size_t types = sizeof(info_types) / sizeof(info_types[0]);
2747  uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT];
2748  uint_t validity[MAX_MEMINFO_CNT];
2749
2750  size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
2751  uint64_t p = (uint64_t)start;
2752  while (p < (uint64_t)end) {
2753    addrs[0] = p;
2754    size_t addrs_count = 1;
2755    while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] < (uint64_t)end) {
2756      addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
2757      addrs_count++;
2758    }
2759
2760    if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
2761      return NULL;
2762    }
2763
2764    size_t i = 0;
2765    for (; i < addrs_count; i++) {
2766      if ((validity[i] & 1) != 0) {
2767        if ((validity[i] & 4) != 0) {
2768          if (outdata[types * i + 1] != page_expected->size) {
2769            break;
2770          }
2771        } else
2772          if (page_expected->size != 0) {
2773            break;
2774          }
2775
2776        if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) {
2777          if (outdata[types * i] != page_expected->lgrp_id) {
2778            break;
2779          }
2780        }
2781      } else {
2782        return NULL;
2783      }
2784    }
2785
2786    if (i != addrs_count) {
2787      if ((validity[i] & 2) != 0) {
2788        page_found->lgrp_id = outdata[types * i];
2789      } else {
2790        page_found->lgrp_id = -1;
2791      }
2792      if ((validity[i] & 4) != 0) {
2793        page_found->size = outdata[types * i + 1];
2794      } else {
2795        page_found->size = 0;
2796      }
2797      return (char*)addrs[i];
2798    }
2799
2800    p = addrs[addrs_count - 1] + page_size;
2801  }
2802  return end;
2803}
2804
2805bool os::uncommit_memory(char* addr, size_t bytes) {
2806  size_t size = bytes;
2807  // Map uncommitted pages PROT_NONE so we fail early if we touch an
2808  // uncommitted page. Otherwise, the read/write might succeed if we
2809  // have enough swap space to back the physical page.
2810  return
2811    NULL != Solaris::mmap_chunk(addr, size,
2812                                MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE,
2813                                PROT_NONE);
2814}
2815
2816char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) {
2817  char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0);
2818
2819  if (b == MAP_FAILED) {
2820    return NULL;
2821  }
2822  return b;
2823}
2824
2825char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) {
2826  char* addr = requested_addr;
2827  int flags = MAP_PRIVATE | MAP_NORESERVE;
2828
2829  assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap");
2830
2831  if (fixed) {
2832    flags |= MAP_FIXED;
2833  } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) {
2834    flags |= MAP_ALIGN;
2835    addr = (char*) alignment_hint;
2836  }
2837
2838  // Map uncommitted pages PROT_NONE so we fail early if we touch an
2839  // uncommitted page. Otherwise, the read/write might succeed if we
2840  // have enough swap space to back the physical page.
2841  return mmap_chunk(addr, bytes, flags, PROT_NONE);
2842}
2843
2844char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2845  char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL));
2846
2847  guarantee(requested_addr == NULL || requested_addr == addr,
2848            "OS failed to return requested mmap address.");
2849  return addr;
2850}
2851
2852// Reserve memory at an arbitrary address, only if that area is
2853// available (and not reserved for something else).
2854
2855char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2856  const int max_tries = 10;
2857  char* base[max_tries];
2858  size_t size[max_tries];
2859
2860  // Solaris adds a gap between mmap'ed regions.  The size of the gap
2861  // is dependent on the requested size and the MMU.  Our initial gap
2862  // value here is just a guess and will be corrected later.
2863  bool had_top_overlap = false;
2864  bool have_adjusted_gap = false;
2865  size_t gap = 0x400000;
2866
2867  // Assert only that the size is a multiple of the page size, since
2868  // that's all that mmap requires, and since that's all we really know
2869  // about at this low abstraction level.  If we need higher alignment,
2870  // we can either pass an alignment to this method or verify alignment
2871  // in one of the methods further up the call chain.  See bug 5044738.
2872  assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
2873
2874  // Since snv_84, Solaris attempts to honor the address hint - see 5003415.
2875  // Give it a try, if the kernel honors the hint we can return immediately.
2876  char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
2877  volatile int err = errno;
2878  if (addr == requested_addr) {
2879    return addr;
2880  } else if (addr != NULL) {
2881    unmap_memory(addr, bytes);
2882  }
2883
2884  if (PrintMiscellaneous && Verbose) {
2885    char buf[256];
2886    buf[0] = '\0';
2887    if (addr == NULL) {
2888      jio_snprintf(buf, sizeof(buf), ": %s", strerror(err));
2889    }
2890    warning("attempt_reserve_memory_at: couldn't reserve %d bytes at "
2891            PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
2892            "%s", bytes, requested_addr, addr, buf);
2893  }
2894
2895  // Address hint method didn't work.  Fall back to the old method.
2896  // In theory, once SNV becomes our oldest supported platform, this
2897  // code will no longer be needed.
2898  //
2899  // Repeatedly allocate blocks until the block is allocated at the
2900  // right spot. Give up after max_tries.
2901  int i;
2902  for (i = 0; i < max_tries; ++i) {
2903    base[i] = reserve_memory(bytes);
2904
2905    if (base[i] != NULL) {
2906      // Is this the block we wanted?
2907      if (base[i] == requested_addr) {
2908        size[i] = bytes;
2909        break;
2910      }
2911
2912      // check that the gap value is right
2913      if (had_top_overlap && !have_adjusted_gap) {
2914        size_t actual_gap = base[i-1] - base[i] - bytes;
2915        if (gap != actual_gap) {
2916          // adjust the gap value and retry the last 2 allocations
2917          assert(i > 0, "gap adjustment code problem");
2918          have_adjusted_gap = true;  // adjust the gap only once, just in case
2919          gap = actual_gap;
2920          if (PrintMiscellaneous && Verbose) {
2921            warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap);
2922          }
2923          unmap_memory(base[i], bytes);
2924          unmap_memory(base[i-1], size[i-1]);
2925          i-=2;
2926          continue;
2927        }
2928      }
2929
2930      // Does this overlap the block we wanted? Give back the overlapped
2931      // parts and try again.
2932      //
2933      // There is still a bug in this code: if top_overlap == bytes,
2934      // the overlap is offset from requested region by the value of gap.
2935      // In this case giving back the overlapped part will not work,
2936      // because we'll give back the entire block at base[i] and
2937      // therefore the subsequent allocation will not generate a new gap.
2938      // This could be fixed with a new algorithm that used larger
2939      // or variable size chunks to find the requested region -
2940      // but such a change would introduce additional complications.
2941      // It's rare enough that the planets align for this bug,
2942      // so we'll just wait for a fix for 6204603/5003415 which
2943      // will provide a mmap flag to allow us to avoid this business.
2944
2945      size_t top_overlap = requested_addr + (bytes + gap) - base[i];
2946      if (top_overlap >= 0 && top_overlap < bytes) {
2947        had_top_overlap = true;
2948        unmap_memory(base[i], top_overlap);
2949        base[i] += top_overlap;
2950        size[i] = bytes - top_overlap;
2951      } else {
2952        size_t bottom_overlap = base[i] + bytes - requested_addr;
2953        if (bottom_overlap >= 0 && bottom_overlap < bytes) {
2954          if (PrintMiscellaneous && Verbose && bottom_overlap == 0) {
2955            warning("attempt_reserve_memory_at: possible alignment bug");
2956          }
2957          unmap_memory(requested_addr, bottom_overlap);
2958          size[i] = bytes - bottom_overlap;
2959        } else {
2960          size[i] = bytes;
2961        }
2962      }
2963    }
2964  }
2965
2966  // Give back the unused reserved pieces.
2967
2968  for (int j = 0; j < i; ++j) {
2969    if (base[j] != NULL) {
2970      unmap_memory(base[j], size[j]);
2971    }
2972  }
2973
2974  return (i < max_tries) ? requested_addr : NULL;
2975}
2976
2977bool os::release_memory(char* addr, size_t bytes) {
2978  size_t size = bytes;
2979  return munmap(addr, size) == 0;
2980}
2981
2982static bool solaris_mprotect(char* addr, size_t bytes, int prot) {
2983  assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()),
2984         "addr must be page aligned");
2985  int retVal = mprotect(addr, bytes, prot);
2986  return retVal == 0;
2987}
2988
2989// Protect memory (Used to pass readonly pages through
2990// JNI GetArray<type>Elements with empty arrays.)
2991bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
2992                        bool is_committed) {
2993  unsigned int p = 0;
2994  switch (prot) {
2995  case MEM_PROT_NONE: p = PROT_NONE; break;
2996  case MEM_PROT_READ: p = PROT_READ; break;
2997  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
2998  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
2999  default:
3000    ShouldNotReachHere();
3001  }
3002  // is_committed is unused.
3003  return solaris_mprotect(addr, bytes, p);
3004}
3005
3006// guard_memory and unguard_memory only happens within stack guard pages.
3007// Since ISM pertains only to the heap, guard and unguard memory should not
3008/// happen with an ISM region.
3009bool os::guard_memory(char* addr, size_t bytes) {
3010  return solaris_mprotect(addr, bytes, PROT_NONE);
3011}
3012
3013bool os::unguard_memory(char* addr, size_t bytes) {
3014  return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC);
3015}
3016
3017// Large page support
3018
3019// UseLargePages is the master flag to enable/disable large page memory.
3020// UseMPSS and UseISM are supported for compatibility reasons. Their combined
3021// effects can be described in the following table:
3022//
3023// UseLargePages UseMPSS UseISM
3024//    false         *       *   => UseLargePages is the master switch, turning
3025//                                 it off will turn off both UseMPSS and
3026//                                 UseISM. VM will not use large page memory
3027//                                 regardless the settings of UseMPSS/UseISM.
3028//     true      false    false => Unless future Solaris provides other
3029//                                 mechanism to use large page memory, this
3030//                                 combination is equivalent to -UseLargePages,
3031//                                 VM will not use large page memory
3032//     true      true     false => JVM will use MPSS for large page memory.
3033//                                 This is the default behavior.
3034//     true      false    true  => JVM will use ISM for large page memory.
3035//     true      true     true  => JVM will use ISM if it is available.
3036//                                 Otherwise, JVM will fall back to MPSS.
3037//                                 Becaues ISM is now available on all
3038//                                 supported Solaris versions, this combination
3039//                                 is equivalent to +UseISM -UseMPSS.
3040
3041typedef int (*getpagesizes_func_type) (size_t[], int);
3042static size_t _large_page_size = 0;
3043
3044bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) {
3045  // x86 uses either 2M or 4M page, depending on whether PAE (Physical Address
3046  // Extensions) mode is enabled. AMD64/EM64T uses 2M page in 64bit mode. Sparc
3047  // can support multiple page sizes.
3048
3049  // Don't bother to probe page size because getpagesizes() comes with MPSS.
3050  // ISM is only recommended on old Solaris where there is no MPSS support.
3051  // Simply choose a conservative value as default.
3052  *page_size = LargePageSizeInBytes ? LargePageSizeInBytes :
3053               SPARC_ONLY(4 * M) IA32_ONLY(4 * M) AMD64_ONLY(2 * M);
3054
3055  // ISM is available on all supported Solaris versions
3056  return true;
3057}
3058
3059// Insertion sort for small arrays (descending order).
3060static void insertion_sort_descending(size_t* array, int len) {
3061  for (int i = 0; i < len; i++) {
3062    size_t val = array[i];
3063    for (size_t key = i; key > 0 && array[key - 1] < val; --key) {
3064      size_t tmp = array[key];
3065      array[key] = array[key - 1];
3066      array[key - 1] = tmp;
3067    }
3068  }
3069}
3070
3071bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) {
3072  getpagesizes_func_type getpagesizes_func =
3073    CAST_TO_FN_PTR(getpagesizes_func_type, dlsym(RTLD_DEFAULT, "getpagesizes"));
3074  if (getpagesizes_func == NULL) {
3075    if (warn) {
3076      warning("MPSS is not supported by the operating system.");
3077    }
3078    return false;
3079  }
3080
3081  const unsigned int usable_count = VM_Version::page_size_count();
3082  if (usable_count == 1) {
3083    return false;
3084  }
3085
3086  // Fill the array of page sizes.
3087  int n = getpagesizes_func(_page_sizes, page_sizes_max);
3088  assert(n > 0, "Solaris bug?");
3089  if (n == page_sizes_max) {
3090    // Add a sentinel value (necessary only if the array was completely filled
3091    // since it is static (zeroed at initialization)).
3092    _page_sizes[--n] = 0;
3093    DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");)
3094  }
3095  assert(_page_sizes[n] == 0, "missing sentinel");
3096
3097  if (n == 1) return false;     // Only one page size available.
3098
3099  // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and
3100  // select up to usable_count elements.  First sort the array, find the first
3101  // acceptable value, then copy the usable sizes to the top of the array and
3102  // trim the rest.  Make sure to include the default page size :-).
3103  //
3104  // A better policy could get rid of the 4M limit by taking the sizes of the
3105  // important VM memory regions (java heap and possibly the code cache) into
3106  // account.
3107  insertion_sort_descending(_page_sizes, n);
3108  const size_t size_limit =
3109    FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes;
3110  int beg;
3111  for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ;
3112  const int end = MIN2((int)usable_count, n) - 1;
3113  for (int cur = 0; cur < end; ++cur, ++beg) {
3114    _page_sizes[cur] = _page_sizes[beg];
3115  }
3116  _page_sizes[end] = vm_page_size();
3117  _page_sizes[end + 1] = 0;
3118
3119  if (_page_sizes[end] > _page_sizes[end - 1]) {
3120    // Default page size is not the smallest; sort again.
3121    insertion_sort_descending(_page_sizes, end + 1);
3122  }
3123  *page_size = _page_sizes[0];
3124
3125  return true;
3126}
3127
3128bool os::large_page_init() {
3129  if (!UseLargePages) {
3130    UseISM = false;
3131    UseMPSS = false;
3132    return false;
3133  }
3134
3135  // print a warning if any large page related flag is specified on command line
3136  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages)        ||
3137                         !FLAG_IS_DEFAULT(UseISM)               ||
3138                         !FLAG_IS_DEFAULT(UseMPSS)              ||
3139                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
3140  UseISM = UseISM &&
3141           Solaris::ism_sanity_check(warn_on_failure, &_large_page_size);
3142  if (UseISM) {
3143    // ISM disables MPSS to be compatible with old JDK behavior
3144    UseMPSS = false;
3145    _page_sizes[0] = _large_page_size;
3146    _page_sizes[1] = vm_page_size();
3147  }
3148
3149  UseMPSS = UseMPSS &&
3150            Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size);
3151
3152  UseLargePages = UseISM || UseMPSS;
3153  return UseLargePages;
3154}
3155
3156bool os::Solaris::set_mpss_range(caddr_t start, size_t bytes, size_t align) {
3157  // Signal to OS that we want large pages for addresses
3158  // from addr, addr + bytes
3159  struct memcntl_mha mpss_struct;
3160  mpss_struct.mha_cmd = MHA_MAPSIZE_VA;
3161  mpss_struct.mha_pagesize = align;
3162  mpss_struct.mha_flags = 0;
3163  if (memcntl(start, bytes, MC_HAT_ADVISE,
3164              (caddr_t) &mpss_struct, 0, 0) < 0) {
3165    debug_only(warning("Attempt to use MPSS failed."));
3166    return false;
3167  }
3168  return true;
3169}
3170
3171char* os::reserve_memory_special(size_t bytes) {
3172  assert(UseLargePages && UseISM, "only for ISM large pages");
3173
3174  size_t size = bytes;
3175  char* retAddr = NULL;
3176  int shmid;
3177  key_t ismKey;
3178
3179  bool warn_on_failure = UseISM &&
3180                        (!FLAG_IS_DEFAULT(UseLargePages)         ||
3181                         !FLAG_IS_DEFAULT(UseISM)                ||
3182                         !FLAG_IS_DEFAULT(LargePageSizeInBytes)
3183                        );
3184  char msg[128];
3185
3186  ismKey = IPC_PRIVATE;
3187
3188  // Create a large shared memory region to attach to based on size.
3189  // Currently, size is the total size of the heap
3190  shmid = shmget(ismKey, size, SHM_R | SHM_W | IPC_CREAT);
3191  if (shmid == -1){
3192     if (warn_on_failure) {
3193       jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
3194       warning(msg);
3195     }
3196     return NULL;
3197  }
3198
3199  // Attach to the region
3200  retAddr = (char *) shmat(shmid, 0, SHM_SHARE_MMU | SHM_R | SHM_W);
3201  int err = errno;
3202
3203  // Remove shmid. If shmat() is successful, the actual shared memory segment
3204  // will be deleted when it's detached by shmdt() or when the process
3205  // terminates. If shmat() is not successful this will remove the shared
3206  // segment immediately.
3207  shmctl(shmid, IPC_RMID, NULL);
3208
3209  if (retAddr == (char *) -1) {
3210    if (warn_on_failure) {
3211      jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
3212      warning(msg);
3213    }
3214    return NULL;
3215  }
3216
3217  return retAddr;
3218}
3219
3220bool os::release_memory_special(char* base, size_t bytes) {
3221  // detaching the SHM segment will also delete it, see reserve_memory_special()
3222  int rslt = shmdt(base);
3223  return rslt == 0;
3224}
3225
3226size_t os::large_page_size() {
3227  return _large_page_size;
3228}
3229
3230// MPSS allows application to commit large page memory on demand; with ISM
3231// the entire memory region must be allocated as shared memory.
3232bool os::can_commit_large_page_memory() {
3233  return UseISM ? false : true;
3234}
3235
3236bool os::can_execute_large_page_memory() {
3237  return UseISM ? false : true;
3238}
3239
3240static int os_sleep(jlong millis, bool interruptible) {
3241  const jlong limit = INT_MAX;
3242  jlong prevtime;
3243  int res;
3244
3245  while (millis > limit) {
3246    if ((res = os_sleep(limit, interruptible)) != OS_OK)
3247      return res;
3248    millis -= limit;
3249  }
3250
3251  // Restart interrupted polls with new parameters until the proper delay
3252  // has been completed.
3253
3254  prevtime = getTimeMillis();
3255
3256  while (millis > 0) {
3257    jlong newtime;
3258
3259    if (!interruptible) {
3260      // Following assert fails for os::yield_all:
3261      // assert(!thread->is_Java_thread(), "must not be java thread");
3262      res = poll(NULL, 0, millis);
3263    } else {
3264      JavaThread *jt = JavaThread::current();
3265
3266      INTERRUPTIBLE_NORESTART_VM_ALWAYS(poll(NULL, 0, millis), res, jt,
3267        os::Solaris::clear_interrupted);
3268    }
3269
3270    // INTERRUPTIBLE_NORESTART_VM_ALWAYS returns res == OS_INTRPT for
3271    // thread.Interrupt.
3272
3273    if((res == OS_ERR) && (errno == EINTR)) {
3274      newtime = getTimeMillis();
3275      assert(newtime >= prevtime, "time moving backwards");
3276    /* Doing prevtime and newtime in microseconds doesn't help precision,
3277       and trying to round up to avoid lost milliseconds can result in a
3278       too-short delay. */
3279      millis -= newtime - prevtime;
3280      if(millis <= 0)
3281        return OS_OK;
3282      prevtime = newtime;
3283    } else
3284      return res;
3285  }
3286
3287  return OS_OK;
3288}
3289
3290// Read calls from inside the vm need to perform state transitions
3291size_t os::read(int fd, void *buf, unsigned int nBytes) {
3292  INTERRUPTIBLE_RETURN_INT_VM(::read(fd, buf, nBytes), os::Solaris::clear_interrupted);
3293}
3294
3295int os::sleep(Thread* thread, jlong millis, bool interruptible) {
3296  assert(thread == Thread::current(),  "thread consistency check");
3297
3298  // TODO-FIXME: this should be removed.
3299  // On Solaris machines (especially 2.5.1) we found that sometimes the VM gets into a live lock
3300  // situation with a JavaThread being starved out of a lwp. The kernel doesn't seem to generate
3301  // a SIGWAITING signal which would enable the threads library to create a new lwp for the starving
3302  // thread. We suspect that because the Watcher thread keeps waking up at periodic intervals the kernel
3303  // is fooled into believing that the system is making progress. In the code below we block the
3304  // the watcher thread while safepoint is in progress so that it would not appear as though the
3305  // system is making progress.
3306  if (!Solaris::T2_libthread() &&
3307      thread->is_Watcher_thread() && SafepointSynchronize::is_synchronizing() && !Arguments::has_profile()) {
3308    // We now try to acquire the threads lock. Since this lock is held by the VM thread during
3309    // the entire safepoint, the watcher thread will  line up here during the safepoint.
3310    Threads_lock->lock_without_safepoint_check();
3311    Threads_lock->unlock();
3312  }
3313
3314  if (thread->is_Java_thread()) {
3315    // This is a JavaThread so we honor the _thread_blocked protocol
3316    // even for sleeps of 0 milliseconds. This was originally done
3317    // as a workaround for bug 4338139. However, now we also do it
3318    // to honor the suspend-equivalent protocol.
3319
3320    JavaThread *jt = (JavaThread *) thread;
3321    ThreadBlockInVM tbivm(jt);
3322
3323    jt->set_suspend_equivalent();
3324    // cleared by handle_special_suspend_equivalent_condition() or
3325    // java_suspend_self() via check_and_wait_while_suspended()
3326
3327    int ret_code;
3328    if (millis <= 0) {
3329      thr_yield();
3330      ret_code = 0;
3331    } else {
3332      // The original sleep() implementation did not create an
3333      // OSThreadWaitState helper for sleeps of 0 milliseconds.
3334      // I'm preserving that decision for now.
3335      OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
3336
3337      ret_code = os_sleep(millis, interruptible);
3338    }
3339
3340    // were we externally suspended while we were waiting?
3341    jt->check_and_wait_while_suspended();
3342
3343    return ret_code;
3344  }
3345
3346  // non-JavaThread from this point on:
3347
3348  if (millis <= 0) {
3349    thr_yield();
3350    return 0;
3351  }
3352
3353  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
3354
3355  return os_sleep(millis, interruptible);
3356}
3357
3358int os::naked_sleep() {
3359  // %% make the sleep time an integer flag. for now use 1 millisec.
3360  return os_sleep(1, false);
3361}
3362
3363// Sleep forever; naked call to OS-specific sleep; use with CAUTION
3364void os::infinite_sleep() {
3365  while (true) {    // sleep forever ...
3366    ::sleep(100);   // ... 100 seconds at a time
3367  }
3368}
3369
3370// Used to convert frequent JVM_Yield() to nops
3371bool os::dont_yield() {
3372  if (DontYieldALot) {
3373    static hrtime_t last_time = 0;
3374    hrtime_t diff = getTimeNanos() - last_time;
3375
3376    if (diff < DontYieldALotInterval * 1000000)
3377      return true;
3378
3379    last_time += diff;
3380
3381    return false;
3382  }
3383  else {
3384    return false;
3385  }
3386}
3387
3388// Caveat: Solaris os::yield() causes a thread-state transition whereas
3389// the linux and win32 implementations do not.  This should be checked.
3390
3391void os::yield() {
3392  // Yields to all threads with same or greater priority
3393  os::sleep(Thread::current(), 0, false);
3394}
3395
3396// Note that yield semantics are defined by the scheduling class to which
3397// the thread currently belongs.  Typically, yield will _not yield to
3398// other equal or higher priority threads that reside on the dispatch queues
3399// of other CPUs.
3400
3401os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; }
3402
3403
3404// On Solaris we found that yield_all doesn't always yield to all other threads.
3405// There have been cases where there is a thread ready to execute but it doesn't
3406// get an lwp as the VM thread continues to spin with sleeps of 1 millisecond.
3407// The 1 millisecond wait doesn't seem long enough for the kernel to issue a
3408// SIGWAITING signal which will cause a new lwp to be created. So we count the
3409// number of times yield_all is called in the one loop and increase the sleep
3410// time after 8 attempts. If this fails too we increase the concurrency level
3411// so that the starving thread would get an lwp
3412
3413void os::yield_all(int attempts) {
3414  // Yields to all threads, including threads with lower priorities
3415  if (attempts == 0) {
3416    os::sleep(Thread::current(), 1, false);
3417  } else {
3418    int iterations = attempts % 30;
3419    if (iterations == 0 && !os::Solaris::T2_libthread()) {
3420      // thr_setconcurrency and _getconcurrency make sense only under T1.
3421      int noofLWPS = thr_getconcurrency();
3422      if (noofLWPS < (Threads::number_of_threads() + 2)) {
3423        thr_setconcurrency(thr_getconcurrency() + 1);
3424      }
3425    } else if (iterations < 25) {
3426      os::sleep(Thread::current(), 1, false);
3427    } else {
3428      os::sleep(Thread::current(), 10, false);
3429    }
3430  }
3431}
3432
3433// Called from the tight loops to possibly influence time-sharing heuristics
3434void os::loop_breaker(int attempts) {
3435  os::yield_all(attempts);
3436}
3437
3438
3439// Interface for setting lwp priorities.  If we are using T2 libthread,
3440// which forces the use of BoundThreads or we manually set UseBoundThreads,
3441// all of our threads will be assigned to real lwp's.  Using the thr_setprio
3442// function is meaningless in this mode so we must adjust the real lwp's priority
3443// The routines below implement the getting and setting of lwp priorities.
3444//
3445// Note: There are three priority scales used on Solaris.  Java priotities
3446//       which range from 1 to 10, libthread "thr_setprio" scale which range
3447//       from 0 to 127, and the current scheduling class of the process we
3448//       are running in.  This is typically from -60 to +60.
3449//       The setting of the lwp priorities in done after a call to thr_setprio
3450//       so Java priorities are mapped to libthread priorities and we map from
3451//       the latter to lwp priorities.  We don't keep priorities stored in
3452//       Java priorities since some of our worker threads want to set priorities
3453//       higher than all Java threads.
3454//
3455// For related information:
3456// (1)  man -s 2 priocntl
3457// (2)  man -s 4 priocntl
3458// (3)  man dispadmin
3459// =    librt.so
3460// =    libthread/common/rtsched.c - thrp_setlwpprio().
3461// =    ps -cL <pid> ... to validate priority.
3462// =    sched_get_priority_min and _max
3463//              pthread_create
3464//              sched_setparam
3465//              pthread_setschedparam
3466//
3467// Assumptions:
3468// +    We assume that all threads in the process belong to the same
3469//              scheduling class.   IE. an homogenous process.
3470// +    Must be root or in IA group to change change "interactive" attribute.
3471//              Priocntl() will fail silently.  The only indication of failure is when
3472//              we read-back the value and notice that it hasn't changed.
3473// +    Interactive threads enter the runq at the head, non-interactive at the tail.
3474// +    For RT, change timeslice as well.  Invariant:
3475//              constant "priority integral"
3476//              Konst == TimeSlice * (60-Priority)
3477//              Given a priority, compute appropriate timeslice.
3478// +    Higher numerical values have higher priority.
3479
3480// sched class attributes
3481typedef struct {
3482        int   schedPolicy;              // classID
3483        int   maxPrio;
3484        int   minPrio;
3485} SchedInfo;
3486
3487
3488static SchedInfo tsLimits, iaLimits, rtLimits;
3489
3490#ifdef ASSERT
3491static int  ReadBackValidate = 1;
3492#endif
3493static int  myClass     = 0;
3494static int  myMin       = 0;
3495static int  myMax       = 0;
3496static int  myCur       = 0;
3497static bool priocntl_enable = false;
3498
3499
3500// Call the version of priocntl suitable for all supported versions
3501// of Solaris. We need to call through this wrapper so that we can
3502// build on Solaris 9 and run on Solaris 8, 9 and 10.
3503//
3504// This code should be removed if we ever stop supporting Solaris 8
3505// and earlier releases.
3506
3507static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg);
3508typedef long (*priocntl_type)(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg);
3509static priocntl_type priocntl_ptr = priocntl_stub;
3510
3511// Stub to set the value of the real pointer, and then call the real
3512// function.
3513
3514static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg) {
3515  // Try Solaris 8- name only.
3516  priocntl_type tmp = (priocntl_type)dlsym(RTLD_DEFAULT, "__priocntl");
3517  guarantee(tmp != NULL, "priocntl function not found.");
3518  priocntl_ptr = tmp;
3519  return (*priocntl_ptr)(PC_VERSION, idtype, id, cmd, arg);
3520}
3521
3522
3523// lwp_priocntl_init
3524//
3525// Try to determine the priority scale for our process.
3526//
3527// Return errno or 0 if OK.
3528//
3529static
3530int     lwp_priocntl_init ()
3531{
3532  int rslt;
3533  pcinfo_t ClassInfo;
3534  pcparms_t ParmInfo;
3535  int i;
3536
3537  if (!UseThreadPriorities) return 0;
3538
3539  // We are using Bound threads, we need to determine our priority ranges
3540  if (os::Solaris::T2_libthread() || UseBoundThreads) {
3541    // If ThreadPriorityPolicy is 1, switch tables
3542    if (ThreadPriorityPolicy == 1) {
3543      for (i = 0 ; i < MaxPriority+1; i++)
3544        os::java_to_os_priority[i] = prio_policy1[i];
3545    }
3546  }
3547  // Not using Bound Threads, set to ThreadPolicy 1
3548  else {
3549    for ( i = 0 ; i < MaxPriority+1; i++ ) {
3550      os::java_to_os_priority[i] = prio_policy1[i];
3551    }
3552    return 0;
3553  }
3554
3555
3556  // Get IDs for a set of well-known scheduling classes.
3557  // TODO-FIXME: GETCLINFO returns the current # of classes in the
3558  // the system.  We should have a loop that iterates over the
3559  // classID values, which are known to be "small" integers.
3560
3561  strcpy(ClassInfo.pc_clname, "TS");
3562  ClassInfo.pc_cid = -1;
3563  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3564  if (rslt < 0) return errno;
3565  assert(ClassInfo.pc_cid != -1, "cid for TS class is -1");
3566  tsLimits.schedPolicy = ClassInfo.pc_cid;
3567  tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri;
3568  tsLimits.minPrio = -tsLimits.maxPrio;
3569
3570  strcpy(ClassInfo.pc_clname, "IA");
3571  ClassInfo.pc_cid = -1;
3572  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3573  if (rslt < 0) return errno;
3574  assert(ClassInfo.pc_cid != -1, "cid for IA class is -1");
3575  iaLimits.schedPolicy = ClassInfo.pc_cid;
3576  iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri;
3577  iaLimits.minPrio = -iaLimits.maxPrio;
3578
3579  strcpy(ClassInfo.pc_clname, "RT");
3580  ClassInfo.pc_cid = -1;
3581  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3582  if (rslt < 0) return errno;
3583  assert(ClassInfo.pc_cid != -1, "cid for RT class is -1");
3584  rtLimits.schedPolicy = ClassInfo.pc_cid;
3585  rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri;
3586  rtLimits.minPrio = 0;
3587
3588
3589  // Query our "current" scheduling class.
3590  // This will normally be IA,TS or, rarely, RT.
3591  memset (&ParmInfo, 0, sizeof(ParmInfo));
3592  ParmInfo.pc_cid = PC_CLNULL;
3593  rslt = (*priocntl_ptr) (PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo );
3594  if ( rslt < 0 ) return errno;
3595  myClass = ParmInfo.pc_cid;
3596
3597  // We now know our scheduling classId, get specific information
3598  // the class.
3599  ClassInfo.pc_cid = myClass;
3600  ClassInfo.pc_clname[0] = 0;
3601  rslt = (*priocntl_ptr) (PC_VERSION, (idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo );
3602  if ( rslt < 0 ) return errno;
3603
3604  if (ThreadPriorityVerbose)
3605    tty->print_cr ("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname);
3606
3607  memset(&ParmInfo, 0, sizeof(pcparms_t));
3608  ParmInfo.pc_cid = PC_CLNULL;
3609  rslt = (*priocntl_ptr)(PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
3610  if (rslt < 0) return errno;
3611
3612  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3613    myMin = rtLimits.minPrio;
3614    myMax = rtLimits.maxPrio;
3615  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3616    iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3617    myMin = iaLimits.minPrio;
3618    myMax = iaLimits.maxPrio;
3619    myMax = MIN2(myMax, (int)iaInfo->ia_uprilim);       // clamp - restrict
3620  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3621    tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3622    myMin = tsLimits.minPrio;
3623    myMax = tsLimits.maxPrio;
3624    myMax = MIN2(myMax, (int)tsInfo->ts_uprilim);       // clamp - restrict
3625  } else {
3626    // No clue - punt
3627    if (ThreadPriorityVerbose)
3628      tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname);
3629    return EINVAL;      // no clue, punt
3630  }
3631
3632  if (ThreadPriorityVerbose)
3633        tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax);
3634
3635  priocntl_enable = true;  // Enable changing priorities
3636  return 0;
3637}
3638
3639#define IAPRI(x)        ((iaparms_t *)((x).pc_clparms))
3640#define RTPRI(x)        ((rtparms_t *)((x).pc_clparms))
3641#define TSPRI(x)        ((tsparms_t *)((x).pc_clparms))
3642
3643
3644// scale_to_lwp_priority
3645//
3646// Convert from the libthread "thr_setprio" scale to our current
3647// lwp scheduling class scale.
3648//
3649static
3650int     scale_to_lwp_priority (int rMin, int rMax, int x)
3651{
3652  int v;
3653
3654  if (x == 127) return rMax;            // avoid round-down
3655    v = (((x*(rMax-rMin)))/128)+rMin;
3656  return v;
3657}
3658
3659
3660// set_lwp_priority
3661//
3662// Set the priority of the lwp.  This call should only be made
3663// when using bound threads (T2 threads are bound by default).
3664//
3665int     set_lwp_priority (int ThreadID, int lwpid, int newPrio )
3666{
3667  int rslt;
3668  int Actual, Expected, prv;
3669  pcparms_t ParmInfo;                   // for GET-SET
3670#ifdef ASSERT
3671  pcparms_t ReadBack;                   // for readback
3672#endif
3673
3674  // Set priority via PC_GETPARMS, update, PC_SETPARMS
3675  // Query current values.
3676  // TODO: accelerate this by eliminating the PC_GETPARMS call.
3677  // Cache "pcparms_t" in global ParmCache.
3678  // TODO: elide set-to-same-value
3679
3680  // If something went wrong on init, don't change priorities.
3681  if ( !priocntl_enable ) {
3682    if (ThreadPriorityVerbose)
3683      tty->print_cr("Trying to set priority but init failed, ignoring");
3684    return EINVAL;
3685  }
3686
3687
3688  // If lwp hasn't started yet, just return
3689  // the _start routine will call us again.
3690  if ( lwpid <= 0 ) {
3691    if (ThreadPriorityVerbose) {
3692      tty->print_cr ("deferring the set_lwp_priority of thread " INTPTR_FORMAT " to %d, lwpid not set",
3693                     ThreadID, newPrio);
3694    }
3695    return 0;
3696  }
3697
3698  if (ThreadPriorityVerbose) {
3699    tty->print_cr ("set_lwp_priority(" INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ",
3700                   ThreadID, lwpid, newPrio);
3701  }
3702
3703  memset(&ParmInfo, 0, sizeof(pcparms_t));
3704  ParmInfo.pc_cid = PC_CLNULL;
3705  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo);
3706  if (rslt < 0) return errno;
3707
3708  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3709    rtparms_t *rtInfo  = (rtparms_t*)ParmInfo.pc_clparms;
3710    rtInfo->rt_pri     = scale_to_lwp_priority (rtLimits.minPrio, rtLimits.maxPrio, newPrio);
3711    rtInfo->rt_tqsecs  = RT_NOCHANGE;
3712    rtInfo->rt_tqnsecs = RT_NOCHANGE;
3713    if (ThreadPriorityVerbose) {
3714      tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri);
3715    }
3716  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3717    iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3718    int maxClamped     = MIN2(iaLimits.maxPrio, (int)iaInfo->ia_uprilim);
3719    iaInfo->ia_upri    = scale_to_lwp_priority(iaLimits.minPrio, maxClamped, newPrio);
3720    iaInfo->ia_uprilim = IA_NOCHANGE;
3721    iaInfo->ia_nice    = IA_NOCHANGE;
3722    iaInfo->ia_mode    = IA_NOCHANGE;
3723    if (ThreadPriorityVerbose) {
3724      tty->print_cr ("IA: [%d...%d] %d->%d\n",
3725               iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri);
3726    }
3727  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3728    tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3729    int maxClamped     = MIN2(tsLimits.maxPrio, (int)tsInfo->ts_uprilim);
3730    prv                = tsInfo->ts_upri;
3731    tsInfo->ts_upri    = scale_to_lwp_priority(tsLimits.minPrio, maxClamped, newPrio);
3732    tsInfo->ts_uprilim = IA_NOCHANGE;
3733    if (ThreadPriorityVerbose) {
3734      tty->print_cr ("TS: %d [%d...%d] %d->%d\n",
3735               prv, tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri);
3736    }
3737    if (prv == tsInfo->ts_upri) return 0;
3738  } else {
3739    if ( ThreadPriorityVerbose ) {
3740      tty->print_cr ("Unknown scheduling class\n");
3741    }
3742      return EINVAL;    // no clue, punt
3743  }
3744
3745  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo);
3746  if (ThreadPriorityVerbose && rslt) {
3747    tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno);
3748  }
3749  if (rslt < 0) return errno;
3750
3751#ifdef ASSERT
3752  // Sanity check: read back what we just attempted to set.
3753  // In theory it could have changed in the interim ...
3754  //
3755  // The priocntl system call is tricky.
3756  // Sometimes it'll validate the priority value argument and
3757  // return EINVAL if unhappy.  At other times it fails silently.
3758  // Readbacks are prudent.
3759
3760  if (!ReadBackValidate) return 0;
3761
3762  memset(&ReadBack, 0, sizeof(pcparms_t));
3763  ReadBack.pc_cid = PC_CLNULL;
3764  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack);
3765  assert(rslt >= 0, "priocntl failed");
3766  Actual = Expected = 0xBAD;
3767  assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match");
3768  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3769    Actual   = RTPRI(ReadBack)->rt_pri;
3770    Expected = RTPRI(ParmInfo)->rt_pri;
3771  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3772    Actual   = IAPRI(ReadBack)->ia_upri;
3773    Expected = IAPRI(ParmInfo)->ia_upri;
3774  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3775    Actual   = TSPRI(ReadBack)->ts_upri;
3776    Expected = TSPRI(ParmInfo)->ts_upri;
3777  } else {
3778    if ( ThreadPriorityVerbose ) {
3779      tty->print_cr("set_lwp_priority: unexpected class in readback: %d\n", ParmInfo.pc_cid);
3780    }
3781  }
3782
3783  if (Actual != Expected) {
3784    if ( ThreadPriorityVerbose ) {
3785      tty->print_cr ("set_lwp_priority(%d %d) Class=%d: actual=%d vs expected=%d\n",
3786             lwpid, newPrio, ReadBack.pc_cid, Actual, Expected);
3787    }
3788  }
3789#endif
3790
3791  return 0;
3792}
3793
3794
3795
3796// Solaris only gives access to 128 real priorities at a time,
3797// so we expand Java's ten to fill this range.  This would be better
3798// if we dynamically adjusted relative priorities.
3799//
3800// The ThreadPriorityPolicy option allows us to select 2 different
3801// priority scales.
3802//
3803// ThreadPriorityPolicy=0
3804// Since the Solaris' default priority is MaximumPriority, we do not
3805// set a priority lower than Max unless a priority lower than
3806// NormPriority is requested.
3807//
3808// ThreadPriorityPolicy=1
3809// This mode causes the priority table to get filled with
3810// linear values.  NormPriority get's mapped to 50% of the
3811// Maximum priority an so on.  This will cause VM threads
3812// to get unfair treatment against other Solaris processes
3813// which do not explicitly alter their thread priorities.
3814//
3815
3816
3817int os::java_to_os_priority[MaxPriority + 1] = {
3818  -99999,         // 0 Entry should never be used
3819
3820  0,              // 1 MinPriority
3821  32,             // 2
3822  64,             // 3
3823
3824  96,             // 4
3825  127,            // 5 NormPriority
3826  127,            // 6
3827
3828  127,            // 7
3829  127,            // 8
3830  127,            // 9 NearMaxPriority
3831
3832  127             // 10 MaxPriority
3833};
3834
3835
3836OSReturn os::set_native_priority(Thread* thread, int newpri) {
3837  assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping");
3838  if ( !UseThreadPriorities ) return OS_OK;
3839  int status = thr_setprio(thread->osthread()->thread_id(), newpri);
3840  if ( os::Solaris::T2_libthread() || (UseBoundThreads && thread->osthread()->is_vm_created()) )
3841    status |= (set_lwp_priority (thread->osthread()->thread_id(),
3842                    thread->osthread()->lwp_id(), newpri ));
3843  return (status == 0) ? OS_OK : OS_ERR;
3844}
3845
3846
3847OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
3848  int p;
3849  if ( !UseThreadPriorities ) {
3850    *priority_ptr = NormalPriority;
3851    return OS_OK;
3852  }
3853  int status = thr_getprio(thread->osthread()->thread_id(), &p);
3854  if (status != 0) {
3855    return OS_ERR;
3856  }
3857  *priority_ptr = p;
3858  return OS_OK;
3859}
3860
3861
3862// Hint to the underlying OS that a task switch would not be good.
3863// Void return because it's a hint and can fail.
3864void os::hint_no_preempt() {
3865  schedctl_start(schedctl_init());
3866}
3867
3868void os::interrupt(Thread* thread) {
3869  assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
3870
3871  OSThread* osthread = thread->osthread();
3872
3873  int isInterrupted = osthread->interrupted();
3874  if (!isInterrupted) {
3875      osthread->set_interrupted(true);
3876      OrderAccess::fence();
3877      // os::sleep() is implemented with either poll (NULL,0,timeout) or
3878      // by parking on _SleepEvent.  If the former, thr_kill will unwedge
3879      // the sleeper by SIGINTR, otherwise the unpark() will wake the sleeper.
3880      ParkEvent * const slp = thread->_SleepEvent ;
3881      if (slp != NULL) slp->unpark() ;
3882  }
3883
3884  // For JSR166:  unpark after setting status but before thr_kill -dl
3885  if (thread->is_Java_thread()) {
3886    ((JavaThread*)thread)->parker()->unpark();
3887  }
3888
3889  // Handle interruptible wait() ...
3890  ParkEvent * const ev = thread->_ParkEvent ;
3891  if (ev != NULL) ev->unpark() ;
3892
3893  // When events are used everywhere for os::sleep, then this thr_kill
3894  // will only be needed if UseVMInterruptibleIO is true.
3895
3896  if (!isInterrupted) {
3897    int status = thr_kill(osthread->thread_id(), os::Solaris::SIGinterrupt());
3898    assert_status(status == 0, status, "thr_kill");
3899
3900    // Bump thread interruption counter
3901    RuntimeService::record_thread_interrupt_signaled_count();
3902  }
3903}
3904
3905
3906bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3907  assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
3908
3909  OSThread* osthread = thread->osthread();
3910
3911  bool res = osthread->interrupted();
3912
3913  // NOTE that since there is no "lock" around these two operations,
3914  // there is the possibility that the interrupted flag will be
3915  // "false" but that the interrupt event will be set. This is
3916  // intentional. The effect of this is that Object.wait() will appear
3917  // to have a spurious wakeup, which is not harmful, and the
3918  // possibility is so rare that it is not worth the added complexity
3919  // to add yet another lock. It has also been recommended not to put
3920  // the interrupted flag into the os::Solaris::Event structure,
3921  // because it hides the issue.
3922  if (res && clear_interrupted) {
3923    osthread->set_interrupted(false);
3924  }
3925  return res;
3926}
3927
3928
3929void os::print_statistics() {
3930}
3931
3932int os::message_box(const char* title, const char* message) {
3933  int i;
3934  fdStream err(defaultStream::error_fd());
3935  for (i = 0; i < 78; i++) err.print_raw("=");
3936  err.cr();
3937  err.print_raw_cr(title);
3938  for (i = 0; i < 78; i++) err.print_raw("-");
3939  err.cr();
3940  err.print_raw_cr(message);
3941  for (i = 0; i < 78; i++) err.print_raw("=");
3942  err.cr();
3943
3944  char buf[16];
3945  // Prevent process from exiting upon "read error" without consuming all CPU
3946  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
3947
3948  return buf[0] == 'y' || buf[0] == 'Y';
3949}
3950
3951// A lightweight implementation that does not suspend the target thread and
3952// thus returns only a hint. Used for profiling only!
3953ExtendedPC os::get_thread_pc(Thread* thread) {
3954  // Make sure that it is called by the watcher and the Threads lock is owned.
3955  assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock");
3956  // For now, is only used to profile the VM Thread
3957  assert(thread->is_VM_thread(), "Can only be called for VMThread");
3958  ExtendedPC epc;
3959
3960  GetThreadPC_Callback  cb(ProfileVM_lock);
3961  OSThread *osthread = thread->osthread();
3962  const int time_to_wait = 400; // 400ms wait for initial response
3963  int status = cb.interrupt(thread, time_to_wait);
3964
3965  if (cb.is_done() ) {
3966    epc = cb.addr();
3967  } else {
3968    DEBUG_ONLY(tty->print_cr("Failed to get pc for thread: %d got %d status",
3969                              osthread->thread_id(), status););
3970    // epc is already NULL
3971  }
3972  return epc;
3973}
3974
3975
3976// This does not do anything on Solaris. This is basically a hook for being
3977// able to use structured exception handling (thread-local exception filters) on, e.g., Win32.
3978void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) {
3979  f(value, method, args, thread);
3980}
3981
3982// This routine may be used by user applications as a "hook" to catch signals.
3983// The user-defined signal handler must pass unrecognized signals to this
3984// routine, and if it returns true (non-zero), then the signal handler must
3985// return immediately.  If the flag "abort_if_unrecognized" is true, then this
3986// routine will never retun false (zero), but instead will execute a VM panic
3987// routine kill the process.
3988//
3989// If this routine returns false, it is OK to call it again.  This allows
3990// the user-defined signal handler to perform checks either before or after
3991// the VM performs its own checks.  Naturally, the user code would be making
3992// a serious error if it tried to handle an exception (such as a null check
3993// or breakpoint) that the VM was generating for its own correct operation.
3994//
3995// This routine may recognize any of the following kinds of signals:
3996// SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ,
3997// os::Solaris::SIGasync
3998// It should be consulted by handlers for any of those signals.
3999// It explicitly does not recognize os::Solaris::SIGinterrupt
4000//
4001// The caller of this routine must pass in the three arguments supplied
4002// to the function referred to in the "sa_sigaction" (not the "sa_handler")
4003// field of the structure passed to sigaction().  This routine assumes that
4004// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
4005//
4006// Note that the VM will print warnings if it detects conflicting signal
4007// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
4008//
4009extern "C" int JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
4010
4011
4012void signalHandler(int sig, siginfo_t* info, void* ucVoid) {
4013  JVM_handle_solaris_signal(sig, info, ucVoid, true);
4014}
4015
4016/* Do not delete - if guarantee is ever removed,  a signal handler (even empty)
4017   is needed to provoke threads blocked on IO to return an EINTR
4018   Note: this explicitly does NOT call JVM_handle_solaris_signal and
4019   does NOT participate in signal chaining due to requirement for
4020   NOT setting SA_RESTART to make EINTR work. */
4021extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) {
4022   if (UseSignalChaining) {
4023      struct sigaction *actp = os::Solaris::get_chained_signal_action(sig);
4024      if (actp && actp->sa_handler) {
4025        vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs");
4026      }
4027   }
4028}
4029
4030// This boolean allows users to forward their own non-matching signals
4031// to JVM_handle_solaris_signal, harmlessly.
4032bool os::Solaris::signal_handlers_are_installed = false;
4033
4034// For signal-chaining
4035bool os::Solaris::libjsig_is_loaded = false;
4036typedef struct sigaction *(*get_signal_t)(int);
4037get_signal_t os::Solaris::get_signal_action = NULL;
4038
4039struct sigaction* os::Solaris::get_chained_signal_action(int sig) {
4040  struct sigaction *actp = NULL;
4041
4042  if ((libjsig_is_loaded)  && (sig <= Maxlibjsigsigs)) {
4043    // Retrieve the old signal handler from libjsig
4044    actp = (*get_signal_action)(sig);
4045  }
4046  if (actp == NULL) {
4047    // Retrieve the preinstalled signal handler from jvm
4048    actp = get_preinstalled_handler(sig);
4049  }
4050
4051  return actp;
4052}
4053
4054static bool call_chained_handler(struct sigaction *actp, int sig,
4055                                 siginfo_t *siginfo, void *context) {
4056  // Call the old signal handler
4057  if (actp->sa_handler == SIG_DFL) {
4058    // It's more reasonable to let jvm treat it as an unexpected exception
4059    // instead of taking the default action.
4060    return false;
4061  } else if (actp->sa_handler != SIG_IGN) {
4062    if ((actp->sa_flags & SA_NODEFER) == 0) {
4063      // automaticlly block the signal
4064      sigaddset(&(actp->sa_mask), sig);
4065    }
4066
4067    sa_handler_t hand;
4068    sa_sigaction_t sa;
4069    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
4070    // retrieve the chained handler
4071    if (siginfo_flag_set) {
4072      sa = actp->sa_sigaction;
4073    } else {
4074      hand = actp->sa_handler;
4075    }
4076
4077    if ((actp->sa_flags & SA_RESETHAND) != 0) {
4078      actp->sa_handler = SIG_DFL;
4079    }
4080
4081    // try to honor the signal mask
4082    sigset_t oset;
4083    thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset);
4084
4085    // call into the chained handler
4086    if (siginfo_flag_set) {
4087      (*sa)(sig, siginfo, context);
4088    } else {
4089      (*hand)(sig);
4090    }
4091
4092    // restore the signal mask
4093    thr_sigsetmask(SIG_SETMASK, &oset, 0);
4094  }
4095  // Tell jvm's signal handler the signal is taken care of.
4096  return true;
4097}
4098
4099bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) {
4100  bool chained = false;
4101  // signal-chaining
4102  if (UseSignalChaining) {
4103    struct sigaction *actp = get_chained_signal_action(sig);
4104    if (actp != NULL) {
4105      chained = call_chained_handler(actp, sig, siginfo, context);
4106    }
4107  }
4108  return chained;
4109}
4110
4111struct sigaction* os::Solaris::get_preinstalled_handler(int sig) {
4112  assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4113  if (preinstalled_sigs[sig] != 0) {
4114    return &chainedsigactions[sig];
4115  }
4116  return NULL;
4117}
4118
4119void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
4120
4121  assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range");
4122  assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4123  chainedsigactions[sig] = oldAct;
4124  preinstalled_sigs[sig] = 1;
4125}
4126
4127void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) {
4128  // Check for overwrite.
4129  struct sigaction oldAct;
4130  sigaction(sig, (struct sigaction*)NULL, &oldAct);
4131  void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
4132                                      : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
4133  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
4134      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
4135      oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) {
4136    if (AllowUserSignalHandlers || !set_installed) {
4137      // Do not overwrite; user takes responsibility to forward to us.
4138      return;
4139    } else if (UseSignalChaining) {
4140      if (oktochain) {
4141        // save the old handler in jvm
4142        save_preinstalled_handler(sig, oldAct);
4143      } else {
4144        vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs.");
4145      }
4146      // libjsig also interposes the sigaction() call below and saves the
4147      // old sigaction on it own.
4148    } else {
4149      fatal2("Encountered unexpected pre-existing sigaction handler %#lx for signal %d.", (long)oldhand, sig);
4150    }
4151  }
4152
4153  struct sigaction sigAct;
4154  sigfillset(&(sigAct.sa_mask));
4155  sigAct.sa_handler = SIG_DFL;
4156
4157  sigAct.sa_sigaction = signalHandler;
4158  // Handle SIGSEGV on alternate signal stack if
4159  // not using stack banging
4160  if (!UseStackBanging && sig == SIGSEGV) {
4161    sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
4162  // Interruptible i/o requires SA_RESTART cleared so EINTR
4163  // is returned instead of restarting system calls
4164  } else if (sig == os::Solaris::SIGinterrupt()) {
4165    sigemptyset(&sigAct.sa_mask);
4166    sigAct.sa_handler = NULL;
4167    sigAct.sa_flags = SA_SIGINFO;
4168    sigAct.sa_sigaction = sigINTRHandler;
4169  } else {
4170    sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
4171  }
4172  os::Solaris::set_our_sigflags(sig, sigAct.sa_flags);
4173
4174  sigaction(sig, &sigAct, &oldAct);
4175
4176  void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
4177                                       : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
4178  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
4179}
4180
4181
4182#define DO_SIGNAL_CHECK(sig) \
4183  if (!sigismember(&check_signal_done, sig)) \
4184    os::Solaris::check_signal_handler(sig)
4185
4186// This method is a periodic task to check for misbehaving JNI applications
4187// under CheckJNI, we can add any periodic checks here
4188
4189void os::run_periodic_checks() {
4190  // A big source of grief is hijacking virt. addr 0x0 on Solaris,
4191  // thereby preventing a NULL checks.
4192  if(!check_addr0_done) check_addr0_done = check_addr0(tty);
4193
4194  if (check_signals == false) return;
4195
4196  // SEGV and BUS if overridden could potentially prevent
4197  // generation of hs*.log in the event of a crash, debugging
4198  // such a case can be very challenging, so we absolutely
4199  // check for the following for a good measure:
4200  DO_SIGNAL_CHECK(SIGSEGV);
4201  DO_SIGNAL_CHECK(SIGILL);
4202  DO_SIGNAL_CHECK(SIGFPE);
4203  DO_SIGNAL_CHECK(SIGBUS);
4204  DO_SIGNAL_CHECK(SIGPIPE);
4205  DO_SIGNAL_CHECK(SIGXFSZ);
4206
4207  // ReduceSignalUsage allows the user to override these handlers
4208  // see comments at the very top and jvm_solaris.h
4209  if (!ReduceSignalUsage) {
4210    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
4211    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
4212    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
4213    DO_SIGNAL_CHECK(BREAK_SIGNAL);
4214  }
4215
4216  // See comments above for using JVM1/JVM2 and UseAltSigs
4217  DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt());
4218  DO_SIGNAL_CHECK(os::Solaris::SIGasync());
4219
4220}
4221
4222typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
4223
4224static os_sigaction_t os_sigaction = NULL;
4225
4226void os::Solaris::check_signal_handler(int sig) {
4227  char buf[O_BUFLEN];
4228  address jvmHandler = NULL;
4229
4230  struct sigaction act;
4231  if (os_sigaction == NULL) {
4232    // only trust the default sigaction, in case it has been interposed
4233    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
4234    if (os_sigaction == NULL) return;
4235  }
4236
4237  os_sigaction(sig, (struct sigaction*)NULL, &act);
4238
4239  address thisHandler = (act.sa_flags & SA_SIGINFO)
4240    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
4241    : CAST_FROM_FN_PTR(address, act.sa_handler) ;
4242
4243
4244  switch(sig) {
4245    case SIGSEGV:
4246    case SIGBUS:
4247    case SIGFPE:
4248    case SIGPIPE:
4249    case SIGXFSZ:
4250    case SIGILL:
4251      jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4252      break;
4253
4254    case SHUTDOWN1_SIGNAL:
4255    case SHUTDOWN2_SIGNAL:
4256    case SHUTDOWN3_SIGNAL:
4257    case BREAK_SIGNAL:
4258      jvmHandler = (address)user_handler();
4259      break;
4260
4261    default:
4262      int intrsig = os::Solaris::SIGinterrupt();
4263      int asynsig = os::Solaris::SIGasync();
4264
4265      if (sig == intrsig) {
4266        jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler);
4267      } else if (sig == asynsig) {
4268        jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4269      } else {
4270        return;
4271      }
4272      break;
4273  }
4274
4275
4276  if (thisHandler != jvmHandler) {
4277    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
4278    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
4279    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
4280    // No need to check this sig any longer
4281    sigaddset(&check_signal_done, sig);
4282  } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) {
4283    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
4284    tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig));
4285    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
4286    // No need to check this sig any longer
4287    sigaddset(&check_signal_done, sig);
4288  }
4289
4290  // Print all the signal handler state
4291  if (sigismember(&check_signal_done, sig)) {
4292    print_signal_handlers(tty, buf, O_BUFLEN);
4293  }
4294
4295}
4296
4297void os::Solaris::install_signal_handlers() {
4298  bool libjsigdone = false;
4299  signal_handlers_are_installed = true;
4300
4301  // signal-chaining
4302  typedef void (*signal_setting_t)();
4303  signal_setting_t begin_signal_setting = NULL;
4304  signal_setting_t end_signal_setting = NULL;
4305  begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4306                                        dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
4307  if (begin_signal_setting != NULL) {
4308    end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4309                                        dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
4310    get_signal_action = CAST_TO_FN_PTR(get_signal_t,
4311                                       dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
4312    get_libjsig_version = CAST_TO_FN_PTR(version_getting_t,
4313                                         dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version"));
4314    libjsig_is_loaded = true;
4315    if (os::Solaris::get_libjsig_version != NULL) {
4316      libjsigversion =  (*os::Solaris::get_libjsig_version)();
4317    }
4318    assert(UseSignalChaining, "should enable signal-chaining");
4319  }
4320  if (libjsig_is_loaded) {
4321    // Tell libjsig jvm is setting signal handlers
4322    (*begin_signal_setting)();
4323  }
4324
4325  set_signal_handler(SIGSEGV, true, true);
4326  set_signal_handler(SIGPIPE, true, true);
4327  set_signal_handler(SIGXFSZ, true, true);
4328  set_signal_handler(SIGBUS, true, true);
4329  set_signal_handler(SIGILL, true, true);
4330  set_signal_handler(SIGFPE, true, true);
4331
4332
4333  if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) {
4334
4335    // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so
4336    // can not register overridable signals which might be > 32
4337    if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) {
4338    // Tell libjsig jvm has finished setting signal handlers
4339      (*end_signal_setting)();
4340      libjsigdone = true;
4341    }
4342  }
4343
4344  // Never ok to chain our SIGinterrupt
4345  set_signal_handler(os::Solaris::SIGinterrupt(), true, false);
4346  set_signal_handler(os::Solaris::SIGasync(), true, true);
4347
4348  if (libjsig_is_loaded && !libjsigdone) {
4349    // Tell libjsig jvm finishes setting signal handlers
4350    (*end_signal_setting)();
4351  }
4352
4353  // We don't activate signal checker if libjsig is in place, we trust ourselves
4354  // and if UserSignalHandler is installed all bets are off
4355  if (CheckJNICalls) {
4356    if (libjsig_is_loaded) {
4357      tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
4358      check_signals = false;
4359    }
4360    if (AllowUserSignalHandlers) {
4361      tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
4362      check_signals = false;
4363    }
4364  }
4365}
4366
4367
4368void report_error(const char* file_name, int line_no, const char* title, const char* format, ...);
4369
4370const char * signames[] = {
4371  "SIG0",
4372  "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
4373  "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
4374  "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
4375  "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
4376  "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
4377  "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
4378  "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
4379  "SIGCANCEL", "SIGLOST"
4380};
4381
4382const char* os::exception_name(int exception_code, char* buf, size_t size) {
4383  if (0 < exception_code && exception_code <= SIGRTMAX) {
4384    // signal
4385    if (exception_code < sizeof(signames)/sizeof(const char*)) {
4386       jio_snprintf(buf, size, "%s", signames[exception_code]);
4387    } else {
4388       jio_snprintf(buf, size, "SIG%d", exception_code);
4389    }
4390    return buf;
4391  } else {
4392    return NULL;
4393  }
4394}
4395
4396// (Static) wrappers for the new libthread API
4397int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate;
4398int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate;
4399int_fnP_thread_t_i os::Solaris::_thr_setmutator;
4400int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
4401int_fnP_thread_t os::Solaris::_thr_continue_mutator;
4402
4403// (Static) wrappers for the liblgrp API
4404os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
4405os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
4406os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini;
4407os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root;
4408os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children;
4409os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources;
4410os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
4411os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
4412os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
4413
4414// (Static) wrapper for meminfo() call.
4415os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
4416
4417static address resolve_symbol(const char *name) {
4418  address addr;
4419
4420  addr = (address) dlsym(RTLD_DEFAULT, name);
4421  if(addr == NULL) {
4422    // RTLD_DEFAULT was not defined on some early versions of 2.5.1
4423    addr = (address) dlsym(RTLD_NEXT, name);
4424    if(addr == NULL) {
4425      fatal(dlerror());
4426    }
4427  }
4428  return addr;
4429}
4430
4431
4432
4433// isT2_libthread()
4434//
4435// Routine to determine if we are currently using the new T2 libthread.
4436//
4437// We determine if we are using T2 by reading /proc/self/lstatus and
4438// looking for a thread with the ASLWP bit set.  If we find this status
4439// bit set, we must assume that we are NOT using T2.  The T2 team
4440// has approved this algorithm.
4441//
4442// We need to determine if we are running with the new T2 libthread
4443// since setting native thread priorities is handled differently
4444// when using this library.  All threads created using T2 are bound
4445// threads. Calling thr_setprio is meaningless in this case.
4446//
4447bool isT2_libthread() {
4448  static prheader_t * lwpArray = NULL;
4449  static int lwpSize = 0;
4450  static int lwpFile = -1;
4451  lwpstatus_t * that;
4452  char lwpName [128];
4453  bool isT2 = false;
4454
4455#define ADR(x)  ((uintptr_t)(x))
4456#define LWPINDEX(ary,ix)   ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1))))
4457
4458  lwpFile = open("/proc/self/lstatus", O_RDONLY, 0);
4459  if (lwpFile < 0) {
4460      if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n");
4461      return false;
4462  }
4463  lwpSize = 16*1024;
4464  for (;;) {
4465    lseek (lwpFile, 0, SEEK_SET);
4466    lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize);
4467    if (read(lwpFile, lwpArray, lwpSize) < 0) {
4468      if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n");
4469      break;
4470    }
4471    if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) {
4472       // We got a good snapshot - now iterate over the list.
4473      int aslwpcount = 0;
4474      for (int i = 0; i < lwpArray->pr_nent; i++ ) {
4475        that = LWPINDEX(lwpArray,i);
4476        if (that->pr_flags & PR_ASLWP) {
4477          aslwpcount++;
4478        }
4479      }
4480      if (aslwpcount == 0) isT2 = true;
4481      break;
4482    }
4483    lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize;
4484    FREE_C_HEAP_ARRAY(char, lwpArray);  // retry.
4485  }
4486
4487  FREE_C_HEAP_ARRAY(char, lwpArray);
4488  close (lwpFile);
4489  if (ThreadPriorityVerbose) {
4490    if (isT2) tty->print_cr("We are running with a T2 libthread\n");
4491    else tty->print_cr("We are not running with a T2 libthread\n");
4492  }
4493  return isT2;
4494}
4495
4496
4497void os::Solaris::libthread_init() {
4498  address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators");
4499
4500  // Determine if we are running with the new T2 libthread
4501  os::Solaris::set_T2_libthread(isT2_libthread());
4502
4503  lwp_priocntl_init();
4504
4505  // RTLD_DEFAULT was not defined on some early versions of 5.5.1
4506  if(func == NULL) {
4507    func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
4508    // Guarantee that this VM is running on an new enough OS (5.6 or
4509    // later) that it will have a new enough libthread.so.
4510    guarantee(func != NULL, "libthread.so is too old.");
4511  }
4512
4513  // Initialize the new libthread getstate API wrappers
4514  func = resolve_symbol("thr_getstate");
4515  os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func));
4516
4517  func = resolve_symbol("thr_setstate");
4518  os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func));
4519
4520  func = resolve_symbol("thr_setmutator");
4521  os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func));
4522
4523  func = resolve_symbol("thr_suspend_mutator");
4524  os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4525
4526  func = resolve_symbol("thr_continue_mutator");
4527  os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4528
4529  int size;
4530  void (*handler_info_func)(address *, int *);
4531  handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo"));
4532  handler_info_func(&handler_start, &size);
4533  handler_end = handler_start + size;
4534}
4535
4536
4537int_fnP_mutex_tP os::Solaris::_mutex_lock;
4538int_fnP_mutex_tP os::Solaris::_mutex_trylock;
4539int_fnP_mutex_tP os::Solaris::_mutex_unlock;
4540int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init;
4541int_fnP_mutex_tP os::Solaris::_mutex_destroy;
4542int os::Solaris::_mutex_scope = USYNC_THREAD;
4543
4544int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait;
4545int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait;
4546int_fnP_cond_tP os::Solaris::_cond_signal;
4547int_fnP_cond_tP os::Solaris::_cond_broadcast;
4548int_fnP_cond_tP_i_vP os::Solaris::_cond_init;
4549int_fnP_cond_tP os::Solaris::_cond_destroy;
4550int os::Solaris::_cond_scope = USYNC_THREAD;
4551
4552void os::Solaris::synchronization_init() {
4553  if(UseLWPSynchronization) {
4554    os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
4555    os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
4556    os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
4557    os::Solaris::set_mutex_init(lwp_mutex_init);
4558    os::Solaris::set_mutex_destroy(lwp_mutex_destroy);
4559    os::Solaris::set_mutex_scope(USYNC_THREAD);
4560
4561    os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait")));
4562    os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait")));
4563    os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal")));
4564    os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast")));
4565    os::Solaris::set_cond_init(lwp_cond_init);
4566    os::Solaris::set_cond_destroy(lwp_cond_destroy);
4567    os::Solaris::set_cond_scope(USYNC_THREAD);
4568  }
4569  else {
4570    os::Solaris::set_mutex_scope(USYNC_THREAD);
4571    os::Solaris::set_cond_scope(USYNC_THREAD);
4572
4573    if(UsePthreads) {
4574      os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
4575      os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
4576      os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
4577      os::Solaris::set_mutex_init(pthread_mutex_default_init);
4578      os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy")));
4579
4580      os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait")));
4581      os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait")));
4582      os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal")));
4583      os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast")));
4584      os::Solaris::set_cond_init(pthread_cond_default_init);
4585      os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy")));
4586    }
4587    else {
4588      os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock")));
4589      os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock")));
4590      os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock")));
4591      os::Solaris::set_mutex_init(::mutex_init);
4592      os::Solaris::set_mutex_destroy(::mutex_destroy);
4593
4594      os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait")));
4595      os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait")));
4596      os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal")));
4597      os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast")));
4598      os::Solaris::set_cond_init(::cond_init);
4599      os::Solaris::set_cond_destroy(::cond_destroy);
4600    }
4601  }
4602}
4603
4604void os::Solaris::liblgrp_init() {
4605  void *handle = dlopen("liblgrp.so", RTLD_LAZY);
4606  if (handle != NULL) {
4607    os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home")));
4608    os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init")));
4609    os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini")));
4610    os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root")));
4611    os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children")));
4612    os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources")));
4613    os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps")));
4614    os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t,
4615                                       dlsym(handle, "lgrp_cookie_stale")));
4616
4617    lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER);
4618    set_lgrp_cookie(c);
4619  } else {
4620    warning("your OS does not support NUMA");
4621  }
4622}
4623
4624void os::Solaris::misc_sym_init() {
4625  address func = (address)dlsym(RTLD_DEFAULT, "meminfo");
4626  if(func == NULL) {
4627    func = (address) dlsym(RTLD_NEXT, "meminfo");
4628  }
4629  if (func != NULL) {
4630    os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
4631  }
4632}
4633
4634// Symbol doesn't exist in Solaris 8 pset.h
4635#ifndef PS_MYID
4636#define PS_MYID -3
4637#endif
4638
4639// int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
4640typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
4641static pset_getloadavg_type pset_getloadavg_ptr = NULL;
4642
4643void init_pset_getloadavg_ptr(void) {
4644  pset_getloadavg_ptr =
4645    (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg");
4646  if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) {
4647    warning("pset_getloadavg function not found");
4648  }
4649}
4650
4651int os::Solaris::_dev_zero_fd = -1;
4652
4653// this is called _before_ the global arguments have been parsed
4654void os::init(void) {
4655  _initial_pid = getpid();
4656
4657  max_hrtime = first_hrtime = gethrtime();
4658
4659  init_random(1234567);
4660
4661  page_size = sysconf(_SC_PAGESIZE);
4662  if (page_size == -1)
4663    fatal1("os_solaris.cpp: os::init: sysconf failed (%s)", strerror(errno));
4664  init_page_sizes((size_t) page_size);
4665
4666  Solaris::initialize_system_info();
4667
4668  int fd = open("/dev/zero", O_RDWR);
4669  if (fd < 0) {
4670    fatal1("os::init: cannot open /dev/zero (%s)", strerror(errno));
4671  } else {
4672    Solaris::set_dev_zero_fd(fd);
4673
4674    // Close on exec, child won't inherit.
4675    fcntl(fd, F_SETFD, FD_CLOEXEC);
4676  }
4677
4678  clock_tics_per_sec = CLK_TCK;
4679
4680  // check if dladdr1() exists; dladdr1 can provide more information than
4681  // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9
4682  // and is available on linker patches for 5.7 and 5.8.
4683  // libdl.so must have been loaded, this call is just an entry lookup
4684  void * hdl = dlopen("libdl.so", RTLD_NOW);
4685  if (hdl)
4686    dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1"));
4687
4688  // (Solaris only) this switches to calls that actually do locking.
4689  ThreadCritical::initialize();
4690
4691  main_thread = thr_self();
4692
4693  // Constant minimum stack size allowed. It must be at least
4694  // the minimum of what the OS supports (thr_min_stack()), and
4695  // enough to allow the thread to get to user bytecode execution.
4696  Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
4697  // If the pagesize of the VM is greater than 8K determine the appropriate
4698  // number of initial guard pages.  The user can change this with the
4699  // command line arguments, if needed.
4700  if (vm_page_size() > 8*K) {
4701    StackYellowPages = 1;
4702    StackRedPages = 1;
4703    StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size();
4704  }
4705}
4706
4707// To install functions for atexit system call
4708extern "C" {
4709  static void perfMemory_exit_helper() {
4710    perfMemory_exit();
4711  }
4712}
4713
4714// this is called _after_ the global arguments have been parsed
4715jint os::init_2(void) {
4716  // try to enable extended file IO ASAP, see 6431278
4717  os::Solaris::try_enable_extended_io();
4718
4719  // Allocate a single page and mark it as readable for safepoint polling.  Also
4720  // use this first mmap call to check support for MAP_ALIGN.
4721  address polling_page = (address)Solaris::mmap_chunk((char*)page_size,
4722                                                      page_size,
4723                                                      MAP_PRIVATE | MAP_ALIGN,
4724                                                      PROT_READ);
4725  if (polling_page == NULL) {
4726    has_map_align = false;
4727    polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE,
4728                                                PROT_READ);
4729  }
4730
4731  os::set_polling_page(polling_page);
4732
4733#ifndef PRODUCT
4734  if( Verbose && PrintMiscellaneous )
4735    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
4736#endif
4737
4738  if (!UseMembar) {
4739    address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE );
4740    guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
4741    os::set_memory_serialize_page( mem_serialize_page );
4742
4743#ifndef PRODUCT
4744    if(Verbose && PrintMiscellaneous)
4745      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
4746#endif
4747}
4748
4749  FLAG_SET_DEFAULT(UseLargePages, os::large_page_init());
4750
4751  // Check minimum allowable stack size for thread creation and to initialize
4752  // the java system classes, including StackOverflowError - depends on page
4753  // size.  Add a page for compiler2 recursion in main thread.
4754  // Add in BytesPerWord times page size to account for VM stack during
4755  // class initialization depending on 32 or 64 bit VM.
4756  guarantee((Solaris::min_stack_allowed >=
4757    (StackYellowPages+StackRedPages+StackShadowPages+BytesPerWord
4758     COMPILER2_PRESENT(+1)) * page_size),
4759    "need to increase Solaris::min_stack_allowed on this platform");
4760
4761  size_t threadStackSizeInBytes = ThreadStackSize * K;
4762  if (threadStackSizeInBytes != 0 &&
4763    threadStackSizeInBytes < Solaris::min_stack_allowed) {
4764    tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
4765                  Solaris::min_stack_allowed/K);
4766    return JNI_ERR;
4767  }
4768
4769  // For 64kbps there will be a 64kb page size, which makes
4770  // the usable default stack size quite a bit less.  Increase the
4771  // stack for 64kb (or any > than 8kb) pages, this increases
4772  // virtual memory fragmentation (since we're not creating the
4773  // stack on a power of 2 boundary.  The real fix for this
4774  // should be to fix the guard page mechanism.
4775
4776  if (vm_page_size() > 8*K) {
4777      threadStackSizeInBytes = (threadStackSizeInBytes != 0)
4778         ? threadStackSizeInBytes +
4779           ((StackYellowPages + StackRedPages) * vm_page_size())
4780         : 0;
4781      ThreadStackSize = threadStackSizeInBytes/K;
4782  }
4783
4784  // Make the stack size a multiple of the page size so that
4785  // the yellow/red zones can be guarded.
4786  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
4787        vm_page_size()));
4788
4789  Solaris::libthread_init();
4790  if (UseNUMA) {
4791    Solaris::liblgrp_init();
4792  }
4793  Solaris::misc_sym_init();
4794  Solaris::signal_sets_init();
4795  Solaris::init_signal_mem();
4796  Solaris::install_signal_handlers();
4797
4798  if (libjsigversion < JSIG_VERSION_1_4_1) {
4799    Maxlibjsigsigs = OLDMAXSIGNUM;
4800  }
4801
4802  // initialize synchronization primitives to use either thread or
4803  // lwp synchronization (controlled by UseLWPSynchronization)
4804  Solaris::synchronization_init();
4805
4806  if (MaxFDLimit) {
4807    // set the number of file descriptors to max. print out error
4808    // if getrlimit/setrlimit fails but continue regardless.
4809    struct rlimit nbr_files;
4810    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
4811    if (status != 0) {
4812      if (PrintMiscellaneous && (Verbose || WizardMode))
4813        perror("os::init_2 getrlimit failed");
4814    } else {
4815      nbr_files.rlim_cur = nbr_files.rlim_max;
4816      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
4817      if (status != 0) {
4818        if (PrintMiscellaneous && (Verbose || WizardMode))
4819          perror("os::init_2 setrlimit failed");
4820      }
4821    }
4822  }
4823
4824  // Initialize HPI.
4825  jint hpi_result = hpi::initialize();
4826  if (hpi_result != JNI_OK) {
4827    tty->print_cr("There was an error trying to initialize the HPI library.");
4828    return hpi_result;
4829  }
4830
4831  // Calculate theoretical max. size of Threads to guard gainst
4832  // artifical out-of-memory situations, where all available address-
4833  // space has been reserved by thread stacks. Default stack size is 1Mb.
4834  size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ?
4835    JavaThread::stack_size_at_create() : (1*K*K);
4836  assert(pre_thread_stack_size != 0, "Must have a stack");
4837  // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when
4838  // we should start doing Virtual Memory banging. Currently when the threads will
4839  // have used all but 200Mb of space.
4840  size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K);
4841  Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size;
4842
4843  // at-exit methods are called in the reverse order of their registration.
4844  // In Solaris 7 and earlier, atexit functions are called on return from
4845  // main or as a result of a call to exit(3C). There can be only 32 of
4846  // these functions registered and atexit() does not set errno. In Solaris
4847  // 8 and later, there is no limit to the number of functions registered
4848  // and atexit() sets errno. In addition, in Solaris 8 and later, atexit
4849  // functions are called upon dlclose(3DL) in addition to return from main
4850  // and exit(3C).
4851
4852  if (PerfAllowAtExitRegistration) {
4853    // only register atexit functions if PerfAllowAtExitRegistration is set.
4854    // atexit functions can be delayed until process exit time, which
4855    // can be problematic for embedded VM situations. Embedded VMs should
4856    // call DestroyJavaVM() to assure that VM resources are released.
4857
4858    // note: perfMemory_exit_helper atexit function may be removed in
4859    // the future if the appropriate cleanup code can be added to the
4860    // VM_Exit VMOperation's doit method.
4861    if (atexit(perfMemory_exit_helper) != 0) {
4862      warning("os::init2 atexit(perfMemory_exit_helper) failed");
4863    }
4864  }
4865
4866  // Init pset_loadavg function pointer
4867  init_pset_getloadavg_ptr();
4868
4869  return JNI_OK;
4870}
4871
4872
4873// Mark the polling page as unreadable
4874void os::make_polling_page_unreadable(void) {
4875  if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
4876    fatal("Could not disable polling page");
4877};
4878
4879// Mark the polling page as readable
4880void os::make_polling_page_readable(void) {
4881  if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 )
4882    fatal("Could not enable polling page");
4883};
4884
4885// OS interface.
4886
4887int os::stat(const char *path, struct stat *sbuf) {
4888  char pathbuf[MAX_PATH];
4889  if (strlen(path) > MAX_PATH - 1) {
4890    errno = ENAMETOOLONG;
4891    return -1;
4892  }
4893  hpi::native_path(strcpy(pathbuf, path));
4894  return ::stat(pathbuf, sbuf);
4895}
4896
4897
4898bool os::check_heap(bool force) { return true; }
4899
4900typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr);
4901static vsnprintf_t sol_vsnprintf = NULL;
4902
4903int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) {
4904  if (!sol_vsnprintf) {
4905    //search  for the named symbol in the objects that were loaded after libjvm
4906    void* where = RTLD_NEXT;
4907    if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
4908        sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
4909    if (!sol_vsnprintf){
4910      //search  for the named symbol in the objects that were loaded before libjvm
4911      where = RTLD_DEFAULT;
4912      if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
4913        sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
4914      assert(sol_vsnprintf != NULL, "vsnprintf not found");
4915    }
4916  }
4917  return (*sol_vsnprintf)(buf, count, fmt, argptr);
4918}
4919
4920
4921// Is a (classpath) directory empty?
4922bool os::dir_is_empty(const char* path) {
4923  DIR *dir = NULL;
4924  struct dirent *ptr;
4925
4926  dir = opendir(path);
4927  if (dir == NULL) return true;
4928
4929  /* Scan the directory */
4930  bool result = true;
4931  char buf[sizeof(struct dirent) + MAX_PATH];
4932  struct dirent *dbuf = (struct dirent *) buf;
4933  while (result && (ptr = readdir(dir, dbuf)) != NULL) {
4934    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
4935      result = false;
4936    }
4937  }
4938  closedir(dir);
4939  return result;
4940}
4941
4942// create binary file, rewriting existing file if required
4943int os::create_binary_file(const char* path, bool rewrite_existing) {
4944  int oflags = O_WRONLY | O_CREAT;
4945  if (!rewrite_existing) {
4946    oflags |= O_EXCL;
4947  }
4948  return ::open64(path, oflags, S_IREAD | S_IWRITE);
4949}
4950
4951// return current position of file pointer
4952jlong os::current_file_offset(int fd) {
4953  return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
4954}
4955
4956// move file pointer to the specified offset
4957jlong os::seek_to_file_offset(int fd, jlong offset) {
4958  return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
4959}
4960
4961// Map a block of memory.
4962char* os::map_memory(int fd, const char* file_name, size_t file_offset,
4963                     char *addr, size_t bytes, bool read_only,
4964                     bool allow_exec) {
4965  int prot;
4966  int flags;
4967
4968  if (read_only) {
4969    prot = PROT_READ;
4970    flags = MAP_SHARED;
4971  } else {
4972    prot = PROT_READ | PROT_WRITE;
4973    flags = MAP_PRIVATE;
4974  }
4975
4976  if (allow_exec) {
4977    prot |= PROT_EXEC;
4978  }
4979
4980  if (addr != NULL) {
4981    flags |= MAP_FIXED;
4982  }
4983
4984  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
4985                                     fd, file_offset);
4986  if (mapped_address == MAP_FAILED) {
4987    return NULL;
4988  }
4989  return mapped_address;
4990}
4991
4992
4993// Remap a block of memory.
4994char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
4995                       char *addr, size_t bytes, bool read_only,
4996                       bool allow_exec) {
4997  // same as map_memory() on this OS
4998  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
4999                        allow_exec);
5000}
5001
5002
5003// Unmap a block of memory.
5004bool os::unmap_memory(char* addr, size_t bytes) {
5005  return munmap(addr, bytes) == 0;
5006}
5007
5008void os::pause() {
5009  char filename[MAX_PATH];
5010  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
5011    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
5012  } else {
5013    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
5014  }
5015
5016  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
5017  if (fd != -1) {
5018    struct stat buf;
5019    close(fd);
5020    while (::stat(filename, &buf) == 0) {
5021      (void)::poll(NULL, 0, 100);
5022    }
5023  } else {
5024    jio_fprintf(stderr,
5025      "Could not open pause file '%s', continuing immediately.\n", filename);
5026  }
5027}
5028
5029#ifndef PRODUCT
5030#ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5031// Turn this on if you need to trace synch operations.
5032// Set RECORD_SYNCH_LIMIT to a large-enough value,
5033// and call record_synch_enable and record_synch_disable
5034// around the computation of interest.
5035
5036void record_synch(char* name, bool returning);  // defined below
5037
5038class RecordSynch {
5039  char* _name;
5040 public:
5041  RecordSynch(char* name) :_name(name)
5042                 { record_synch(_name, false); }
5043  ~RecordSynch() { record_synch(_name,   true);  }
5044};
5045
5046#define CHECK_SYNCH_OP(ret, name, params, args, inner)          \
5047extern "C" ret name params {                                    \
5048  typedef ret name##_t params;                                  \
5049  static name##_t* implem = NULL;                               \
5050  static int callcount = 0;                                     \
5051  if (implem == NULL) {                                         \
5052    implem = (name##_t*) dlsym(RTLD_NEXT, #name);               \
5053    if (implem == NULL)  fatal(dlerror());                      \
5054  }                                                             \
5055  ++callcount;                                                  \
5056  RecordSynch _rs(#name);                                       \
5057  inner;                                                        \
5058  return implem args;                                           \
5059}
5060// in dbx, examine callcounts this way:
5061// for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done
5062
5063#define CHECK_POINTER_OK(p) \
5064  (Universe::perm_gen() == NULL || !Universe::is_reserved_heap((oop)(p)))
5065#define CHECK_MU \
5066  if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only.");
5067#define CHECK_CV \
5068  if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only.");
5069#define CHECK_P(p) \
5070  if (!CHECK_POINTER_OK(p))  fatal(false,  "Pointer must be in C heap only.");
5071
5072#define CHECK_MUTEX(mutex_op) \
5073CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU);
5074
5075CHECK_MUTEX(   mutex_lock)
5076CHECK_MUTEX(  _mutex_lock)
5077CHECK_MUTEX( mutex_unlock)
5078CHECK_MUTEX(_mutex_unlock)
5079CHECK_MUTEX( mutex_trylock)
5080CHECK_MUTEX(_mutex_trylock)
5081
5082#define CHECK_COND(cond_op) \
5083CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV);
5084
5085CHECK_COND( cond_wait);
5086CHECK_COND(_cond_wait);
5087CHECK_COND(_cond_wait_cancel);
5088
5089#define CHECK_COND2(cond_op) \
5090CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV);
5091
5092CHECK_COND2( cond_timedwait);
5093CHECK_COND2(_cond_timedwait);
5094CHECK_COND2(_cond_timedwait_cancel);
5095
5096// do the _lwp_* versions too
5097#define mutex_t lwp_mutex_t
5098#define cond_t  lwp_cond_t
5099CHECK_MUTEX(  _lwp_mutex_lock)
5100CHECK_MUTEX(  _lwp_mutex_unlock)
5101CHECK_MUTEX(  _lwp_mutex_trylock)
5102CHECK_MUTEX( __lwp_mutex_lock)
5103CHECK_MUTEX( __lwp_mutex_unlock)
5104CHECK_MUTEX( __lwp_mutex_trylock)
5105CHECK_MUTEX(___lwp_mutex_lock)
5106CHECK_MUTEX(___lwp_mutex_unlock)
5107
5108CHECK_COND(  _lwp_cond_wait);
5109CHECK_COND( __lwp_cond_wait);
5110CHECK_COND(___lwp_cond_wait);
5111
5112CHECK_COND2(  _lwp_cond_timedwait);
5113CHECK_COND2( __lwp_cond_timedwait);
5114#undef mutex_t
5115#undef cond_t
5116
5117CHECK_SYNCH_OP(int, _lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5118CHECK_SYNCH_OP(int,__lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5119CHECK_SYNCH_OP(int, _lwp_kill,           (int lwp, int n),  (lwp, n), 0);
5120CHECK_SYNCH_OP(int,__lwp_kill,           (int lwp, int n),  (lwp, n), 0);
5121CHECK_SYNCH_OP(int, _lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5122CHECK_SYNCH_OP(int,__lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5123CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5124CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5125
5126
5127// recording machinery:
5128
5129enum { RECORD_SYNCH_LIMIT = 200 };
5130char* record_synch_name[RECORD_SYNCH_LIMIT];
5131void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT];
5132bool record_synch_returning[RECORD_SYNCH_LIMIT];
5133thread_t record_synch_thread[RECORD_SYNCH_LIMIT];
5134int record_synch_count = 0;
5135bool record_synch_enabled = false;
5136
5137// in dbx, examine recorded data this way:
5138// for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done
5139
5140void record_synch(char* name, bool returning) {
5141  if (record_synch_enabled) {
5142    if (record_synch_count < RECORD_SYNCH_LIMIT) {
5143      record_synch_name[record_synch_count] = name;
5144      record_synch_returning[record_synch_count] = returning;
5145      record_synch_thread[record_synch_count] = thr_self();
5146      record_synch_arg0ptr[record_synch_count] = &name;
5147      record_synch_count++;
5148    }
5149    // put more checking code here:
5150    // ...
5151  }
5152}
5153
5154void record_synch_enable() {
5155  // start collecting trace data, if not already doing so
5156  if (!record_synch_enabled)  record_synch_count = 0;
5157  record_synch_enabled = true;
5158}
5159
5160void record_synch_disable() {
5161  // stop collecting trace data
5162  record_synch_enabled = false;
5163}
5164
5165#endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5166#endif // PRODUCT
5167
5168const intptr_t thr_time_off  = (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5169const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) -
5170                               (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5171
5172
5173// JVMTI & JVM monitoring and management support
5174// The thread_cpu_time() and current_thread_cpu_time() are only
5175// supported if is_thread_cpu_time_supported() returns true.
5176// They are not supported on Solaris T1.
5177
5178// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
5179// are used by JVM M&M and JVMTI to get user+sys or user CPU time
5180// of a thread.
5181//
5182// current_thread_cpu_time() and thread_cpu_time(Thread *)
5183// returns the fast estimate available on the platform.
5184
5185// hrtime_t gethrvtime() return value includes
5186// user time but does not include system time
5187jlong os::current_thread_cpu_time() {
5188  return (jlong) gethrvtime();
5189}
5190
5191jlong os::thread_cpu_time(Thread *thread) {
5192  // return user level CPU time only to be consistent with
5193  // what current_thread_cpu_time returns.
5194  // thread_cpu_time_info() must be changed if this changes
5195  return os::thread_cpu_time(thread, false /* user time only */);
5196}
5197
5198jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
5199  if (user_sys_cpu_time) {
5200    return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
5201  } else {
5202    return os::current_thread_cpu_time();
5203  }
5204}
5205
5206jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
5207  char proc_name[64];
5208  int count;
5209  prusage_t prusage;
5210  jlong lwp_time;
5211  int fd;
5212
5213  sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage",
5214                     getpid(),
5215                     thread->osthread()->lwp_id());
5216  fd = open(proc_name, O_RDONLY);
5217  if ( fd == -1 ) return -1;
5218
5219  do {
5220    count = pread(fd,
5221                  (void *)&prusage.pr_utime,
5222                  thr_time_size,
5223                  thr_time_off);
5224  } while (count < 0 && errno == EINTR);
5225  close(fd);
5226  if ( count < 0 ) return -1;
5227
5228  if (user_sys_cpu_time) {
5229    // user + system CPU time
5230    lwp_time = (((jlong)prusage.pr_stime.tv_sec +
5231                 (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) +
5232                 (jlong)prusage.pr_stime.tv_nsec +
5233                 (jlong)prusage.pr_utime.tv_nsec;
5234  } else {
5235    // user level CPU time only
5236    lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) +
5237                (jlong)prusage.pr_utime.tv_nsec;
5238  }
5239
5240  return(lwp_time);
5241}
5242
5243void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5244  info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5245  info_ptr->may_skip_backward = false;    // elapsed time not wall time
5246  info_ptr->may_skip_forward = false;     // elapsed time not wall time
5247  info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5248}
5249
5250void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5251  info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5252  info_ptr->may_skip_backward = false;    // elapsed time not wall time
5253  info_ptr->may_skip_forward = false;     // elapsed time not wall time
5254  info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5255}
5256
5257bool os::is_thread_cpu_time_supported() {
5258  if ( os::Solaris::T2_libthread() || UseBoundThreads ) {
5259    return true;
5260  } else {
5261    return false;
5262  }
5263}
5264
5265// System loadavg support.  Returns -1 if load average cannot be obtained.
5266// Return the load average for our processor set if the primitive exists
5267// (Solaris 9 and later).  Otherwise just return system wide loadavg.
5268int os::loadavg(double loadavg[], int nelem) {
5269  if (pset_getloadavg_ptr != NULL) {
5270    return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem);
5271  } else {
5272    return ::getloadavg(loadavg, nelem);
5273  }
5274}
5275
5276//---------------------------------------------------------------------------------
5277#ifndef PRODUCT
5278
5279static address same_page(address x, address y) {
5280  intptr_t page_bits = -os::vm_page_size();
5281  if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
5282    return x;
5283  else if (x > y)
5284    return (address)(intptr_t(y) | ~page_bits) + 1;
5285  else
5286    return (address)(intptr_t(y) & page_bits);
5287}
5288
5289bool os::find(address addr) {
5290  Dl_info dlinfo;
5291  memset(&dlinfo, 0, sizeof(dlinfo));
5292  if (dladdr(addr, &dlinfo)) {
5293#ifdef _LP64
5294    tty->print("0x%016lx: ", addr);
5295#else
5296    tty->print("0x%08x: ", addr);
5297#endif
5298    if (dlinfo.dli_sname != NULL)
5299      tty->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
5300    else if (dlinfo.dli_fname)
5301      tty->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
5302    else
5303      tty->print("<absolute address>");
5304    if (dlinfo.dli_fname)  tty->print(" in %s", dlinfo.dli_fname);
5305#ifdef _LP64
5306    if (dlinfo.dli_fbase)  tty->print(" at 0x%016lx", dlinfo.dli_fbase);
5307#else
5308    if (dlinfo.dli_fbase)  tty->print(" at 0x%08x", dlinfo.dli_fbase);
5309#endif
5310    tty->cr();
5311
5312    if (Verbose) {
5313      // decode some bytes around the PC
5314      address begin = same_page(addr-40, addr);
5315      address end   = same_page(addr+40, addr);
5316      address       lowest = (address) dlinfo.dli_sname;
5317      if (!lowest)  lowest = (address) dlinfo.dli_fbase;
5318      if (begin < lowest)  begin = lowest;
5319      Dl_info dlinfo2;
5320      if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
5321          && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
5322        end = (address) dlinfo2.dli_saddr;
5323      Disassembler::decode(begin, end);
5324    }
5325    return true;
5326  }
5327  return false;
5328}
5329
5330#endif
5331
5332
5333// Following function has been added to support HotSparc's libjvm.so running
5334// under Solaris production JDK 1.2.2 / 1.3.0.  These came from
5335// src/solaris/hpi/native_threads in the EVM codebase.
5336//
5337// NOTE: This is no longer needed in the 1.3.1 and 1.4 production release
5338// libraries and should thus be removed. We will leave it behind for a while
5339// until we no longer want to able to run on top of 1.3.0 Solaris production
5340// JDK. See 4341971.
5341
5342#define STACK_SLACK 0x800
5343
5344extern "C" {
5345  intptr_t sysThreadAvailableStackWithSlack() {
5346    stack_t st;
5347    intptr_t retval, stack_top;
5348    retval = thr_stksegment(&st);
5349    assert(retval == 0, "incorrect return value from thr_stksegment");
5350    assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
5351    assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
5352    stack_top=(intptr_t)st.ss_sp-st.ss_size;
5353    return ((intptr_t)&stack_top - stack_top - STACK_SLACK);
5354  }
5355}
5356
5357// Just to get the Kernel build to link on solaris for testing.
5358
5359extern "C" {
5360class ASGCT_CallTrace;
5361void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)
5362  KERNEL_RETURN;
5363}
5364
5365
5366// ObjectMonitor park-unpark infrastructure ...
5367//
5368// We implement Solaris and Linux PlatformEvents with the
5369// obvious condvar-mutex-flag triple.
5370// Another alternative that works quite well is pipes:
5371// Each PlatformEvent consists of a pipe-pair.
5372// The thread associated with the PlatformEvent
5373// calls park(), which reads from the input end of the pipe.
5374// Unpark() writes into the other end of the pipe.
5375// The write-side of the pipe must be set NDELAY.
5376// Unfortunately pipes consume a large # of handles.
5377// Native solaris lwp_park() and lwp_unpark() work nicely, too.
5378// Using pipes for the 1st few threads might be workable, however.
5379//
5380// park() is permitted to return spuriously.
5381// Callers of park() should wrap the call to park() in
5382// an appropriate loop.  A litmus test for the correct
5383// usage of park is the following: if park() were modified
5384// to immediately return 0 your code should still work,
5385// albeit degenerating to a spin loop.
5386//
5387// An interesting optimization for park() is to use a trylock()
5388// to attempt to acquire the mutex.  If the trylock() fails
5389// then we know that a concurrent unpark() operation is in-progress.
5390// in that case the park() code could simply set _count to 0
5391// and return immediately.  The subsequent park() operation *might*
5392// return immediately.  That's harmless as the caller of park() is
5393// expected to loop.  By using trylock() we will have avoided a
5394// avoided a context switch caused by contention on the per-thread mutex.
5395//
5396// TODO-FIXME:
5397// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the
5398//     objectmonitor implementation.
5399// 2.  Collapse the JSR166 parker event, and the
5400//     objectmonitor ParkEvent into a single "Event" construct.
5401// 3.  In park() and unpark() add:
5402//     assert (Thread::current() == AssociatedWith).
5403// 4.  add spurious wakeup injection on a -XX:EarlyParkReturn=N switch.
5404//     1-out-of-N park() operations will return immediately.
5405//
5406// _Event transitions in park()
5407//   -1 => -1 : illegal
5408//    1 =>  0 : pass - return immediately
5409//    0 => -1 : block
5410//
5411// _Event serves as a restricted-range semaphore.
5412//
5413// Another possible encoding of _Event would be with
5414// explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
5415//
5416// TODO-FIXME: add DTRACE probes for:
5417// 1.   Tx parks
5418// 2.   Ty unparks Tx
5419// 3.   Tx resumes from park
5420
5421
5422// value determined through experimentation
5423#define ROUNDINGFIX 11
5424
5425// utility to compute the abstime argument to timedwait.
5426// TODO-FIXME: switch from compute_abstime() to unpackTime().
5427
5428static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
5429  // millis is the relative timeout time
5430  // abstime will be the absolute timeout time
5431  if (millis < 0)  millis = 0;
5432  struct timeval now;
5433  int status = gettimeofday(&now, NULL);
5434  assert(status == 0, "gettimeofday");
5435  jlong seconds = millis / 1000;
5436  jlong max_wait_period;
5437
5438  if (UseLWPSynchronization) {
5439    // forward port of fix for 4275818 (not sleeping long enough)
5440    // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where
5441    // _lwp_cond_timedwait() used a round_down algorithm rather
5442    // than a round_up. For millis less than our roundfactor
5443    // it rounded down to 0 which doesn't meet the spec.
5444    // For millis > roundfactor we may return a bit sooner, but
5445    // since we can not accurately identify the patch level and
5446    // this has already been fixed in Solaris 9 and 8 we will
5447    // leave it alone rather than always rounding down.
5448
5449    if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX;
5450       // It appears that when we go directly through Solaris _lwp_cond_timedwait()
5451           // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6
5452           max_wait_period = 21000000;
5453  } else {
5454    max_wait_period = 50000000;
5455  }
5456  millis %= 1000;
5457  if (seconds > max_wait_period) {      // see man cond_timedwait(3T)
5458     seconds = max_wait_period;
5459  }
5460  abstime->tv_sec = now.tv_sec  + seconds;
5461  long       usec = now.tv_usec + millis * 1000;
5462  if (usec >= 1000000) {
5463    abstime->tv_sec += 1;
5464    usec -= 1000000;
5465  }
5466  abstime->tv_nsec = usec * 1000;
5467  return abstime;
5468}
5469
5470// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
5471// Conceptually TryPark() should be equivalent to park(0).
5472
5473int os::PlatformEvent::TryPark() {
5474  for (;;) {
5475    const int v = _Event ;
5476    guarantee ((v == 0) || (v == 1), "invariant") ;
5477    if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
5478  }
5479}
5480
5481void os::PlatformEvent::park() {           // AKA: down()
5482  // Invariant: Only the thread associated with the Event/PlatformEvent
5483  // may call park().
5484  int v ;
5485  for (;;) {
5486      v = _Event ;
5487      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
5488  }
5489  guarantee (v >= 0, "invariant") ;
5490  if (v == 0) {
5491     // Do this the hard way by blocking ...
5492     // See http://monaco.sfbay/detail.jsf?cr=5094058.
5493     // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5494     // Only for SPARC >= V8PlusA
5495#if defined(__sparc) && defined(COMPILER2)
5496     if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5497#endif
5498     int status = os::Solaris::mutex_lock(_mutex);
5499     assert_status(status == 0, status,  "mutex_lock");
5500     guarantee (_nParked == 0, "invariant") ;
5501     ++ _nParked ;
5502     while (_Event < 0) {
5503        // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
5504        // Treat this the same as if the wait was interrupted
5505        // With usr/lib/lwp going to kernel, always handle ETIME
5506        status = os::Solaris::cond_wait(_cond, _mutex);
5507        if (status == ETIME) status = EINTR ;
5508        assert_status(status == 0 || status == EINTR, status, "cond_wait");
5509     }
5510     -- _nParked ;
5511     _Event = 0 ;
5512     status = os::Solaris::mutex_unlock(_mutex);
5513     assert_status(status == 0, status, "mutex_unlock");
5514  }
5515}
5516
5517int os::PlatformEvent::park(jlong millis) {
5518  guarantee (_nParked == 0, "invariant") ;
5519  int v ;
5520  for (;;) {
5521      v = _Event ;
5522      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
5523  }
5524  guarantee (v >= 0, "invariant") ;
5525  if (v != 0) return OS_OK ;
5526
5527  int ret = OS_TIMEOUT;
5528  timestruc_t abst;
5529  compute_abstime (&abst, millis);
5530
5531  // See http://monaco.sfbay/detail.jsf?cr=5094058.
5532  // For Solaris SPARC set fprs.FEF=0 prior to parking.
5533  // Only for SPARC >= V8PlusA
5534#if defined(__sparc) && defined(COMPILER2)
5535 if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5536#endif
5537  int status = os::Solaris::mutex_lock(_mutex);
5538  assert_status(status == 0, status, "mutex_lock");
5539  guarantee (_nParked == 0, "invariant") ;
5540  ++ _nParked ;
5541  while (_Event < 0) {
5542     int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
5543     assert_status(status == 0 || status == EINTR ||
5544                   status == ETIME || status == ETIMEDOUT,
5545                   status, "cond_timedwait");
5546     if (!FilterSpuriousWakeups) break ;                // previous semantics
5547     if (status == ETIME || status == ETIMEDOUT) break ;
5548     // We consume and ignore EINTR and spurious wakeups.
5549  }
5550  -- _nParked ;
5551  if (_Event >= 0) ret = OS_OK ;
5552  _Event = 0 ;
5553  status = os::Solaris::mutex_unlock(_mutex);
5554  assert_status(status == 0, status, "mutex_unlock");
5555  return ret;
5556}
5557
5558void os::PlatformEvent::unpark() {
5559  int v, AnyWaiters;
5560
5561  // Increment _Event.
5562  // Another acceptable implementation would be to simply swap 1
5563  // into _Event:
5564  //   if (Swap (&_Event, 1) < 0) {
5565  //      mutex_lock (_mutex) ; AnyWaiters = nParked; mutex_unlock (_mutex) ;
5566  //      if (AnyWaiters) cond_signal (_cond) ;
5567  //   }
5568
5569  for (;;) {
5570    v = _Event ;
5571    if (v > 0) {
5572       // The LD of _Event could have reordered or be satisfied
5573       // by a read-aside from this processor's write buffer.
5574       // To avoid problems execute a barrier and then
5575       // ratify the value.  A degenerate CAS() would also work.
5576       // Viz., CAS (v+0, &_Event, v) == v).
5577       OrderAccess::fence() ;
5578       if (_Event == v) return ;
5579       continue ;
5580    }
5581    if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
5582  }
5583
5584  // If the thread associated with the event was parked, wake it.
5585  if (v < 0) {
5586     int status ;
5587     // Wait for the thread assoc with the PlatformEvent to vacate.
5588     status = os::Solaris::mutex_lock(_mutex);
5589     assert_status(status == 0, status, "mutex_lock");
5590     AnyWaiters = _nParked ;
5591     status = os::Solaris::mutex_unlock(_mutex);
5592     assert_status(status == 0, status, "mutex_unlock");
5593     guarantee (AnyWaiters == 0 || AnyWaiters == 1, "invariant") ;
5594     if (AnyWaiters != 0) {
5595       // We intentional signal *after* dropping the lock
5596       // to avoid a common class of futile wakeups.
5597       status = os::Solaris::cond_signal(_cond);
5598       assert_status(status == 0, status, "cond_signal");
5599     }
5600  }
5601}
5602
5603// JSR166
5604// -------------------------------------------------------
5605
5606/*
5607 * The solaris and linux implementations of park/unpark are fairly
5608 * conservative for now, but can be improved. They currently use a
5609 * mutex/condvar pair, plus _counter.
5610 * Park decrements _counter if > 0, else does a condvar wait.  Unpark
5611 * sets count to 1 and signals condvar.  Only one thread ever waits
5612 * on the condvar. Contention seen when trying to park implies that someone
5613 * is unparking you, so don't wait. And spurious returns are fine, so there
5614 * is no need to track notifications.
5615 */
5616
5617#define NANOSECS_PER_SEC 1000000000
5618#define NANOSECS_PER_MILLISEC 1000000
5619#define MAX_SECS 100000000
5620
5621/*
5622 * This code is common to linux and solaris and will be moved to a
5623 * common place in dolphin.
5624 *
5625 * The passed in time value is either a relative time in nanoseconds
5626 * or an absolute time in milliseconds. Either way it has to be unpacked
5627 * into suitable seconds and nanoseconds components and stored in the
5628 * given timespec structure.
5629 * Given time is a 64-bit value and the time_t used in the timespec is only
5630 * a signed-32-bit value (except on 64-bit Linux) we have to watch for
5631 * overflow if times way in the future are given. Further on Solaris versions
5632 * prior to 10 there is a restriction (see cond_timedwait) that the specified
5633 * number of seconds, in abstime, is less than current_time  + 100,000,000.
5634 * As it will be 28 years before "now + 100000000" will overflow we can
5635 * ignore overflow and just impose a hard-limit on seconds using the value
5636 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
5637 * years from "now".
5638 */
5639static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
5640  assert (time > 0, "convertTime");
5641
5642  struct timeval now;
5643  int status = gettimeofday(&now, NULL);
5644  assert(status == 0, "gettimeofday");
5645
5646  time_t max_secs = now.tv_sec + MAX_SECS;
5647
5648  if (isAbsolute) {
5649    jlong secs = time / 1000;
5650    if (secs > max_secs) {
5651      absTime->tv_sec = max_secs;
5652    }
5653    else {
5654      absTime->tv_sec = secs;
5655    }
5656    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
5657  }
5658  else {
5659    jlong secs = time / NANOSECS_PER_SEC;
5660    if (secs >= MAX_SECS) {
5661      absTime->tv_sec = max_secs;
5662      absTime->tv_nsec = 0;
5663    }
5664    else {
5665      absTime->tv_sec = now.tv_sec + secs;
5666      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
5667      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
5668        absTime->tv_nsec -= NANOSECS_PER_SEC;
5669        ++absTime->tv_sec; // note: this must be <= max_secs
5670      }
5671    }
5672  }
5673  assert(absTime->tv_sec >= 0, "tv_sec < 0");
5674  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
5675  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
5676  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
5677}
5678
5679void Parker::park(bool isAbsolute, jlong time) {
5680
5681  // Optional fast-path check:
5682  // Return immediately if a permit is available.
5683  if (_counter > 0) {
5684      _counter = 0 ;
5685      return ;
5686  }
5687
5688  // Optional fast-exit: Check interrupt before trying to wait
5689  Thread* thread = Thread::current();
5690  assert(thread->is_Java_thread(), "Must be JavaThread");
5691  JavaThread *jt = (JavaThread *)thread;
5692  if (Thread::is_interrupted(thread, false)) {
5693    return;
5694  }
5695
5696  // First, demultiplex/decode time arguments
5697  timespec absTime;
5698  if (time < 0) { // don't wait at all
5699    return;
5700  }
5701  if (time > 0) {
5702    // Warning: this code might be exposed to the old Solaris time
5703    // round-down bugs.  Grep "roundingFix" for details.
5704    unpackTime(&absTime, isAbsolute, time);
5705  }
5706
5707  // Enter safepoint region
5708  // Beware of deadlocks such as 6317397.
5709  // The per-thread Parker:: _mutex is a classic leaf-lock.
5710  // In particular a thread must never block on the Threads_lock while
5711  // holding the Parker:: mutex.  If safepoints are pending both the
5712  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
5713  ThreadBlockInVM tbivm(jt);
5714
5715  // Don't wait if cannot get lock since interference arises from
5716  // unblocking.  Also. check interrupt before trying wait
5717  if (Thread::is_interrupted(thread, false) ||
5718      os::Solaris::mutex_trylock(_mutex) != 0) {
5719    return;
5720  }
5721
5722  int status ;
5723
5724  if (_counter > 0)  { // no wait needed
5725    _counter = 0;
5726    status = os::Solaris::mutex_unlock(_mutex);
5727    assert (status == 0, "invariant") ;
5728    return;
5729  }
5730
5731#ifdef ASSERT
5732  // Don't catch signals while blocked; let the running threads have the signals.
5733  // (This allows a debugger to break into the running thread.)
5734  sigset_t oldsigs;
5735  sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals();
5736  thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
5737#endif
5738
5739  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
5740  jt->set_suspend_equivalent();
5741  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
5742
5743  // Do this the hard way by blocking ...
5744  // See http://monaco.sfbay/detail.jsf?cr=5094058.
5745  // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5746  // Only for SPARC >= V8PlusA
5747#if defined(__sparc) && defined(COMPILER2)
5748  if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5749#endif
5750
5751  if (time == 0) {
5752    status = os::Solaris::cond_wait (_cond, _mutex) ;
5753  } else {
5754    status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
5755  }
5756  // Note that an untimed cond_wait() can sometimes return ETIME on older
5757  // versions of the Solaris.
5758  assert_status(status == 0 || status == EINTR ||
5759                status == ETIME || status == ETIMEDOUT,
5760                status, "cond_timedwait");
5761
5762#ifdef ASSERT
5763  thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
5764#endif
5765  _counter = 0 ;
5766  status = os::Solaris::mutex_unlock(_mutex);
5767  assert_status(status == 0, status, "mutex_unlock") ;
5768
5769  // If externally suspended while waiting, re-suspend
5770  if (jt->handle_special_suspend_equivalent_condition()) {
5771    jt->java_suspend_self();
5772  }
5773
5774}
5775
5776void Parker::unpark() {
5777  int s, status ;
5778  status = os::Solaris::mutex_lock (_mutex) ;
5779  assert (status == 0, "invariant") ;
5780  s = _counter;
5781  _counter = 1;
5782  status = os::Solaris::mutex_unlock (_mutex) ;
5783  assert (status == 0, "invariant") ;
5784
5785  if (s < 1) {
5786    status = os::Solaris::cond_signal (_cond) ;
5787    assert (status == 0, "invariant") ;
5788  }
5789}
5790
5791extern char** environ;
5792
5793// Run the specified command in a separate process. Return its exit value,
5794// or -1 on failure (e.g. can't fork a new process).
5795// Unlike system(), this function can be called from signal handler. It
5796// doesn't block SIGINT et al.
5797int os::fork_and_exec(char* cmd) {
5798  char * argv[4];
5799  argv[0] = (char *)"sh";
5800  argv[1] = (char *)"-c";
5801  argv[2] = cmd;
5802  argv[3] = NULL;
5803
5804  // fork is async-safe, fork1 is not so can't use in signal handler
5805  pid_t pid;
5806  Thread* t = ThreadLocalStorage::get_thread_slow();
5807  if (t != NULL && t->is_inside_signal_handler()) {
5808    pid = fork();
5809  } else {
5810    pid = fork1();
5811  }
5812
5813  if (pid < 0) {
5814    // fork failed
5815    warning("fork failed: %s", strerror(errno));
5816    return -1;
5817
5818  } else if (pid == 0) {
5819    // child process
5820
5821    // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris
5822    execve("/usr/bin/sh", argv, environ);
5823
5824    // execve failed
5825    _exit(-1);
5826
5827  } else  {
5828    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
5829    // care about the actual exit code, for now.
5830
5831    int status;
5832
5833    // Wait for the child process to exit.  This returns immediately if
5834    // the child has already exited. */
5835    while (waitpid(pid, &status, 0) < 0) {
5836        switch (errno) {
5837        case ECHILD: return 0;
5838        case EINTR: break;
5839        default: return -1;
5840        }
5841    }
5842
5843    if (WIFEXITED(status)) {
5844       // The child exited normally; get its exit code.
5845       return WEXITSTATUS(status);
5846    } else if (WIFSIGNALED(status)) {
5847       // The child exited because of a signal
5848       // The best value to return is 0x80 + signal number,
5849       // because that is what all Unix shells do, and because
5850       // it allows callers to distinguish between process exit and
5851       // process death by signal.
5852       return 0x80 + WTERMSIG(status);
5853    } else {
5854       // Unknown exit code; pass it through
5855       return status;
5856    }
5857  }
5858}
5859