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