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