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