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