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