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