os_solaris.cpp revision 2650:3cd0157e1d4d
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::pd_print_cpu_info(outputStream* st) {
2321  // Nothing to do for now.
2322}
2323
2324void os::print_memory_info(outputStream* st) {
2325  st->print("Memory:");
2326  st->print(" %dk page", os::vm_page_size()>>10);
2327  st->print(", physical " UINT64_FORMAT "k", os::physical_memory()>>10);
2328  st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10);
2329  st->cr();
2330  (void) check_addr0(st);
2331}
2332
2333// Taken from /usr/include/sys/machsig.h  Supposed to be architecture specific
2334// but they're the same for all the solaris architectures that we support.
2335const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR",
2336                          "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG",
2337                          "ILL_COPROC", "ILL_BADSTK" };
2338
2339const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV",
2340                          "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES",
2341                          "FPE_FLTINV", "FPE_FLTSUB" };
2342
2343const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" };
2344
2345const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" };
2346
2347void os::print_siginfo(outputStream* st, void* siginfo) {
2348  st->print("siginfo:");
2349
2350  const int buflen = 100;
2351  char buf[buflen];
2352  siginfo_t *si = (siginfo_t*)siginfo;
2353  st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen));
2354  char *err = strerror(si->si_errno);
2355  if (si->si_errno != 0 && err != NULL) {
2356    st->print("si_errno=%s", err);
2357  } else {
2358    st->print("si_errno=%d", si->si_errno);
2359  }
2360  const int c = si->si_code;
2361  assert(c > 0, "unexpected si_code");
2362  switch (si->si_signo) {
2363  case SIGILL:
2364    st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]);
2365    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2366    break;
2367  case SIGFPE:
2368    st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]);
2369    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2370    break;
2371  case SIGSEGV:
2372    st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]);
2373    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2374    break;
2375  case SIGBUS:
2376    st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]);
2377    st->print(", si_addr=" PTR_FORMAT, si->si_addr);
2378    break;
2379  default:
2380    st->print(", si_code=%d", si->si_code);
2381    // no si_addr
2382  }
2383
2384  if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
2385      UseSharedSpaces) {
2386    FileMapInfo* mapinfo = FileMapInfo::current_info();
2387    if (mapinfo->is_in_shared_space(si->si_addr)) {
2388      st->print("\n\nError accessing class data sharing archive."   \
2389                " Mapped file inaccessible during execution, "      \
2390                " possible disk/network problem.");
2391    }
2392  }
2393  st->cr();
2394}
2395
2396// Moved from whole group, because we need them here for diagnostic
2397// prints.
2398#define OLDMAXSIGNUM 32
2399static int Maxsignum = 0;
2400static int *ourSigFlags = NULL;
2401
2402extern "C" void sigINTRHandler(int, siginfo_t*, void*);
2403
2404int os::Solaris::get_our_sigflags(int sig) {
2405  assert(ourSigFlags!=NULL, "signal data structure not initialized");
2406  assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
2407  return ourSigFlags[sig];
2408}
2409
2410void os::Solaris::set_our_sigflags(int sig, int flags) {
2411  assert(ourSigFlags!=NULL, "signal data structure not initialized");
2412  assert(sig > 0 && sig < Maxsignum, "vm signal out of expected range");
2413  ourSigFlags[sig] = flags;
2414}
2415
2416
2417static const char* get_signal_handler_name(address handler,
2418                                           char* buf, int buflen) {
2419  int offset;
2420  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
2421  if (found) {
2422    // skip directory names
2423    const char *p1, *p2;
2424    p1 = buf;
2425    size_t len = strlen(os::file_separator());
2426    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
2427    jio_snprintf(buf, buflen, "%s+0x%x", p1, offset);
2428  } else {
2429    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
2430  }
2431  return buf;
2432}
2433
2434static void print_signal_handler(outputStream* st, int sig,
2435                                  char* buf, size_t buflen) {
2436  struct sigaction sa;
2437
2438  sigaction(sig, NULL, &sa);
2439
2440  st->print("%s: ", os::exception_name(sig, buf, buflen));
2441
2442  address handler = (sa.sa_flags & SA_SIGINFO)
2443                  ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
2444                  : CAST_FROM_FN_PTR(address, sa.sa_handler);
2445
2446  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
2447    st->print("SIG_DFL");
2448  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
2449    st->print("SIG_IGN");
2450  } else {
2451    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
2452  }
2453
2454  st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask);
2455
2456  address rh = VMError::get_resetted_sighandler(sig);
2457  // May be, handler was resetted by VMError?
2458  if(rh != NULL) {
2459    handler = rh;
2460    sa.sa_flags = VMError::get_resetted_sigflags(sig);
2461  }
2462
2463  st->print(", sa_flags="   PTR32_FORMAT, sa.sa_flags);
2464
2465  // Check: is it our handler?
2466  if(handler == CAST_FROM_FN_PTR(address, signalHandler) ||
2467     handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) {
2468    // It is our signal handler
2469    // check for flags
2470    if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
2471      st->print(
2472        ", flags was changed from " PTR32_FORMAT ", consider using jsig library",
2473        os::Solaris::get_our_sigflags(sig));
2474    }
2475  }
2476  st->cr();
2477}
2478
2479void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
2480  st->print_cr("Signal Handlers:");
2481  print_signal_handler(st, SIGSEGV, buf, buflen);
2482  print_signal_handler(st, SIGBUS , buf, buflen);
2483  print_signal_handler(st, SIGFPE , buf, buflen);
2484  print_signal_handler(st, SIGPIPE, buf, buflen);
2485  print_signal_handler(st, SIGXFSZ, buf, buflen);
2486  print_signal_handler(st, SIGILL , buf, buflen);
2487  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
2488  print_signal_handler(st, ASYNC_SIGNAL, buf, buflen);
2489  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
2490  print_signal_handler(st, SHUTDOWN1_SIGNAL , buf, buflen);
2491  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
2492  print_signal_handler(st, SHUTDOWN3_SIGNAL, buf, buflen);
2493  print_signal_handler(st, os::Solaris::SIGinterrupt(), buf, buflen);
2494  print_signal_handler(st, os::Solaris::SIGasync(), buf, buflen);
2495}
2496
2497static char saved_jvm_path[MAXPATHLEN] = { 0 };
2498
2499// Find the full path to the current module, libjvm.so or libjvm_g.so
2500void os::jvm_path(char *buf, jint buflen) {
2501  // Error checking.
2502  if (buflen < MAXPATHLEN) {
2503    assert(false, "must use a large-enough buffer");
2504    buf[0] = '\0';
2505    return;
2506  }
2507  // Lazy resolve the path to current module.
2508  if (saved_jvm_path[0] != 0) {
2509    strcpy(buf, saved_jvm_path);
2510    return;
2511  }
2512
2513  Dl_info dlinfo;
2514  int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
2515  assert(ret != 0, "cannot locate libjvm");
2516  realpath((char *)dlinfo.dli_fname, buf);
2517
2518  if (Arguments::created_by_gamma_launcher()) {
2519    // Support for the gamma launcher.  Typical value for buf is
2520    // "<JAVA_HOME>/jre/lib/<arch>/<vmtype>/libjvm.so".  If "/jre/lib/" appears at
2521    // the right place in the string, then assume we are installed in a JDK and
2522    // we're done.  Otherwise, check for a JAVA_HOME environment variable and fix
2523    // up the path so it looks like libjvm.so is installed there (append a
2524    // fake suffix hotspot/libjvm.so).
2525    const char *p = buf + strlen(buf) - 1;
2526    for (int count = 0; p > buf && count < 5; ++count) {
2527      for (--p; p > buf && *p != '/'; --p)
2528        /* empty */ ;
2529    }
2530
2531    if (strncmp(p, "/jre/lib/", 9) != 0) {
2532      // Look for JAVA_HOME in the environment.
2533      char* java_home_var = ::getenv("JAVA_HOME");
2534      if (java_home_var != NULL && java_home_var[0] != 0) {
2535        char cpu_arch[12];
2536        char* jrelib_p;
2537        int   len;
2538        sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch));
2539#ifdef _LP64
2540        // If we are on sparc running a 64-bit vm, look in jre/lib/sparcv9.
2541        if (strcmp(cpu_arch, "sparc") == 0) {
2542          strcat(cpu_arch, "v9");
2543        } else if (strcmp(cpu_arch, "i386") == 0) {
2544          strcpy(cpu_arch, "amd64");
2545        }
2546#endif
2547        // Check the current module name "libjvm.so" or "libjvm_g.so".
2548        p = strrchr(buf, '/');
2549        assert(strstr(p, "/libjvm") == p, "invalid library name");
2550        p = strstr(p, "_g") ? "_g" : "";
2551
2552        realpath(java_home_var, buf);
2553        // determine if this is a legacy image or modules image
2554        // modules image doesn't have "jre" subdirectory
2555        len = strlen(buf);
2556        jrelib_p = buf + len;
2557        snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
2558        if (0 != access(buf, F_OK)) {
2559          snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch);
2560        }
2561
2562        if (0 == access(buf, F_OK)) {
2563          // Use current module name "libjvm[_g].so" instead of
2564          // "libjvm"debug_only("_g")".so" since for fastdebug version
2565          // we should have "libjvm.so" but debug_only("_g") adds "_g"!
2566          len = strlen(buf);
2567          snprintf(buf + len, buflen-len, "/hotspot/libjvm%s.so", p);
2568        } else {
2569          // Go back to path of .so
2570          realpath((char *)dlinfo.dli_fname, buf);
2571        }
2572      }
2573    }
2574  }
2575
2576  strcpy(saved_jvm_path, buf);
2577}
2578
2579
2580void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
2581  // no prefix required, not even "_"
2582}
2583
2584
2585void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
2586  // no suffix required
2587}
2588
2589// This method is a copy of JDK's sysGetLastErrorString
2590// from src/solaris/hpi/src/system_md.c
2591
2592size_t os::lasterror(char *buf, size_t len) {
2593
2594  if (errno == 0)  return 0;
2595
2596  const char *s = ::strerror(errno);
2597  size_t n = ::strlen(s);
2598  if (n >= len) {
2599    n = len - 1;
2600  }
2601  ::strncpy(buf, s, n);
2602  buf[n] = '\0';
2603  return n;
2604}
2605
2606
2607// sun.misc.Signal
2608
2609extern "C" {
2610  static void UserHandler(int sig, void *siginfo, void *context) {
2611    // Ctrl-C is pressed during error reporting, likely because the error
2612    // handler fails to abort. Let VM die immediately.
2613    if (sig == SIGINT && is_error_reported()) {
2614       os::die();
2615    }
2616
2617    os::signal_notify(sig);
2618    // We do not need to reinstate the signal handler each time...
2619  }
2620}
2621
2622void* os::user_handler() {
2623  return CAST_FROM_FN_PTR(void*, UserHandler);
2624}
2625
2626extern "C" {
2627  typedef void (*sa_handler_t)(int);
2628  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
2629}
2630
2631void* os::signal(int signal_number, void* handler) {
2632  struct sigaction sigAct, oldSigAct;
2633  sigfillset(&(sigAct.sa_mask));
2634  sigAct.sa_flags = SA_RESTART & ~SA_RESETHAND;
2635  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
2636
2637  if (sigaction(signal_number, &sigAct, &oldSigAct))
2638    // -1 means registration failed
2639    return (void *)-1;
2640
2641  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
2642}
2643
2644void os::signal_raise(int signal_number) {
2645  raise(signal_number);
2646}
2647
2648/*
2649 * The following code is moved from os.cpp for making this
2650 * code platform specific, which it is by its very nature.
2651 */
2652
2653// a counter for each possible signal value
2654static int Sigexit = 0;
2655static int Maxlibjsigsigs;
2656static jint *pending_signals = NULL;
2657static int *preinstalled_sigs = NULL;
2658static struct sigaction *chainedsigactions = NULL;
2659static sema_t sig_sem;
2660typedef int (*version_getting_t)();
2661version_getting_t os::Solaris::get_libjsig_version = NULL;
2662static int libjsigversion = NULL;
2663
2664int os::sigexitnum_pd() {
2665  assert(Sigexit > 0, "signal memory not yet initialized");
2666  return Sigexit;
2667}
2668
2669void os::Solaris::init_signal_mem() {
2670  // Initialize signal structures
2671  Maxsignum = SIGRTMAX;
2672  Sigexit = Maxsignum+1;
2673  assert(Maxsignum >0, "Unable to obtain max signal number");
2674
2675  Maxlibjsigsigs = Maxsignum;
2676
2677  // pending_signals has one int per signal
2678  // The additional signal is for SIGEXIT - exit signal to signal_thread
2679  pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1));
2680  memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
2681
2682  if (UseSignalChaining) {
2683     chainedsigactions = (struct sigaction *)malloc(sizeof(struct sigaction)
2684       * (Maxsignum + 1));
2685     memset(chainedsigactions, 0, (sizeof(struct sigaction) * (Maxsignum + 1)));
2686     preinstalled_sigs = (int *)os::malloc(sizeof(int) * (Maxsignum + 1));
2687     memset(preinstalled_sigs, 0, (sizeof(int) * (Maxsignum + 1)));
2688  }
2689  ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1 ));
2690  memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
2691}
2692
2693void os::signal_init_pd() {
2694  int ret;
2695
2696  ret = ::sema_init(&sig_sem, 0, NULL, NULL);
2697  assert(ret == 0, "sema_init() failed");
2698}
2699
2700void os::signal_notify(int signal_number) {
2701  int ret;
2702
2703  Atomic::inc(&pending_signals[signal_number]);
2704  ret = ::sema_post(&sig_sem);
2705  assert(ret == 0, "sema_post() failed");
2706}
2707
2708static int check_pending_signals(bool wait_for_signal) {
2709  int ret;
2710  while (true) {
2711    for (int i = 0; i < Sigexit + 1; i++) {
2712      jint n = pending_signals[i];
2713      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
2714        return i;
2715      }
2716    }
2717    if (!wait_for_signal) {
2718      return -1;
2719    }
2720    JavaThread *thread = JavaThread::current();
2721    ThreadBlockInVM tbivm(thread);
2722
2723    bool threadIsSuspended;
2724    do {
2725      thread->set_suspend_equivalent();
2726      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
2727      while((ret = ::sema_wait(&sig_sem)) == EINTR)
2728          ;
2729      assert(ret == 0, "sema_wait() failed");
2730
2731      // were we externally suspended while we were waiting?
2732      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
2733      if (threadIsSuspended) {
2734        //
2735        // The semaphore has been incremented, but while we were waiting
2736        // another thread suspended us. We don't want to continue running
2737        // while suspended because that would surprise the thread that
2738        // suspended us.
2739        //
2740        ret = ::sema_post(&sig_sem);
2741        assert(ret == 0, "sema_post() failed");
2742
2743        thread->java_suspend_self();
2744      }
2745    } while (threadIsSuspended);
2746  }
2747}
2748
2749int os::signal_lookup() {
2750  return check_pending_signals(false);
2751}
2752
2753int os::signal_wait() {
2754  return check_pending_signals(true);
2755}
2756
2757////////////////////////////////////////////////////////////////////////////////
2758// Virtual Memory
2759
2760static int page_size = -1;
2761
2762// The mmap MAP_ALIGN flag is supported on Solaris 9 and later.  init_2() will
2763// clear this var if support is not available.
2764static bool has_map_align = true;
2765
2766int os::vm_page_size() {
2767  assert(page_size != -1, "must call os::init");
2768  return page_size;
2769}
2770
2771// Solaris allocates memory by pages.
2772int os::vm_allocation_granularity() {
2773  assert(page_size != -1, "must call os::init");
2774  return page_size;
2775}
2776
2777bool os::commit_memory(char* addr, size_t bytes, bool exec) {
2778  int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
2779  size_t size = bytes;
2780  char *res = Solaris::mmap_chunk(addr, size, MAP_PRIVATE|MAP_FIXED, prot);
2781  if (res != NULL) {
2782    if (UseNUMAInterleaving) {
2783      numa_make_global(addr, bytes);
2784    }
2785    return true;
2786  }
2787  return false;
2788}
2789
2790bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint,
2791                       bool exec) {
2792  if (commit_memory(addr, bytes, exec)) {
2793    if (UseMPSS && alignment_hint > (size_t)vm_page_size()) {
2794      // If the large page size has been set and the VM
2795      // is using large pages, use the large page size
2796      // if it is smaller than the alignment hint. This is
2797      // a case where the VM wants to use a larger alignment size
2798      // for its own reasons but still want to use large pages
2799      // (which is what matters to setting the mpss range.
2800      size_t page_size = 0;
2801      if (large_page_size() < alignment_hint) {
2802        assert(UseLargePages, "Expected to be here for large page use only");
2803        page_size = large_page_size();
2804      } else {
2805        // If the alignment hint is less than the large page
2806        // size, the VM wants a particular alignment (thus the hint)
2807        // for internal reasons.  Try to set the mpss range using
2808        // the alignment_hint.
2809        page_size = alignment_hint;
2810      }
2811      // Since this is a hint, ignore any failures.
2812      (void)Solaris::set_mpss_range(addr, bytes, page_size);
2813    }
2814    return true;
2815  }
2816  return false;
2817}
2818
2819// Uncommit the pages in a specified region.
2820void os::free_memory(char* addr, size_t bytes) {
2821  if (madvise(addr, bytes, MADV_FREE) < 0) {
2822    debug_only(warning("MADV_FREE failed."));
2823    return;
2824  }
2825}
2826
2827bool os::create_stack_guard_pages(char* addr, size_t size) {
2828  return os::commit_memory(addr, size);
2829}
2830
2831bool os::remove_stack_guard_pages(char* addr, size_t size) {
2832  return os::uncommit_memory(addr, size);
2833}
2834
2835// Change the page size in a given range.
2836void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2837  assert((intptr_t)addr % alignment_hint == 0, "Address should be aligned.");
2838  assert((intptr_t)(addr + bytes) % alignment_hint == 0, "End should be aligned.");
2839  if (UseLargePages && UseMPSS) {
2840    Solaris::set_mpss_range(addr, bytes, alignment_hint);
2841  }
2842}
2843
2844// Tell the OS to make the range local to the first-touching LWP
2845void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2846  assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2847  if (madvise(addr, bytes, MADV_ACCESS_LWP) < 0) {
2848    debug_only(warning("MADV_ACCESS_LWP failed."));
2849  }
2850}
2851
2852// Tell the OS that this range would be accessed from different LWPs.
2853void os::numa_make_global(char *addr, size_t bytes) {
2854  assert((intptr_t)addr % os::vm_page_size() == 0, "Address should be page-aligned.");
2855  if (madvise(addr, bytes, MADV_ACCESS_MANY) < 0) {
2856    debug_only(warning("MADV_ACCESS_MANY failed."));
2857  }
2858}
2859
2860// Get the number of the locality groups.
2861size_t os::numa_get_groups_num() {
2862  size_t n = Solaris::lgrp_nlgrps(Solaris::lgrp_cookie());
2863  return n != -1 ? n : 1;
2864}
2865
2866// Get a list of leaf locality groups. A leaf lgroup is group that
2867// doesn't have any children. Typical leaf group is a CPU or a CPU/memory
2868// board. An LWP is assigned to one of these groups upon creation.
2869size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2870   if ((ids[0] = Solaris::lgrp_root(Solaris::lgrp_cookie())) == -1) {
2871     ids[0] = 0;
2872     return 1;
2873   }
2874   int result_size = 0, top = 1, bottom = 0, cur = 0;
2875   for (int k = 0; k < size; k++) {
2876     int r = Solaris::lgrp_children(Solaris::lgrp_cookie(), ids[cur],
2877                                    (Solaris::lgrp_id_t*)&ids[top], size - top);
2878     if (r == -1) {
2879       ids[0] = 0;
2880       return 1;
2881     }
2882     if (!r) {
2883       // That's a leaf node.
2884       assert (bottom <= cur, "Sanity check");
2885       // Check if the node has memory
2886       if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur],
2887                                   NULL, 0, LGRP_RSRC_MEM) > 0) {
2888         ids[bottom++] = ids[cur];
2889       }
2890     }
2891     top += r;
2892     cur++;
2893   }
2894   if (bottom == 0) {
2895     // Handle a situation, when the OS reports no memory available.
2896     // Assume UMA architecture.
2897     ids[0] = 0;
2898     return 1;
2899   }
2900   return bottom;
2901}
2902
2903// Detect the topology change. Typically happens during CPU plugging-unplugging.
2904bool os::numa_topology_changed() {
2905  int is_stale = Solaris::lgrp_cookie_stale(Solaris::lgrp_cookie());
2906  if (is_stale != -1 && is_stale) {
2907    Solaris::lgrp_fini(Solaris::lgrp_cookie());
2908    Solaris::lgrp_cookie_t c = Solaris::lgrp_init(Solaris::LGRP_VIEW_CALLER);
2909    assert(c != 0, "Failure to initialize LGRP API");
2910    Solaris::set_lgrp_cookie(c);
2911    return true;
2912  }
2913  return false;
2914}
2915
2916// Get the group id of the current LWP.
2917int os::numa_get_group_id() {
2918  int lgrp_id = Solaris::lgrp_home(P_LWPID, P_MYID);
2919  if (lgrp_id == -1) {
2920    return 0;
2921  }
2922  const int size = os::numa_get_groups_num();
2923  int *ids = (int*)alloca(size * sizeof(int));
2924
2925  // Get the ids of all lgroups with memory; r is the count.
2926  int r = Solaris::lgrp_resources(Solaris::lgrp_cookie(), lgrp_id,
2927                                  (Solaris::lgrp_id_t*)ids, size, LGRP_RSRC_MEM);
2928  if (r <= 0) {
2929    return 0;
2930  }
2931  return ids[os::random() % r];
2932}
2933
2934// Request information about the page.
2935bool os::get_page_info(char *start, page_info* info) {
2936  const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2937  uint64_t addr = (uintptr_t)start;
2938  uint64_t outdata[2];
2939  uint_t validity = 0;
2940
2941  if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
2942    return false;
2943  }
2944
2945  info->size = 0;
2946  info->lgrp_id = -1;
2947
2948  if ((validity & 1) != 0) {
2949    if ((validity & 2) != 0) {
2950      info->lgrp_id = outdata[0];
2951    }
2952    if ((validity & 4) != 0) {
2953      info->size = outdata[1];
2954    }
2955    return true;
2956  }
2957  return false;
2958}
2959
2960// Scan the pages from start to end until a page different than
2961// the one described in the info parameter is encountered.
2962char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2963  const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2964  const size_t types = sizeof(info_types) / sizeof(info_types[0]);
2965  uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT];
2966  uint_t validity[MAX_MEMINFO_CNT];
2967
2968  size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
2969  uint64_t p = (uint64_t)start;
2970  while (p < (uint64_t)end) {
2971    addrs[0] = p;
2972    size_t addrs_count = 1;
2973    while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] < (uint64_t)end) {
2974      addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
2975      addrs_count++;
2976    }
2977
2978    if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
2979      return NULL;
2980    }
2981
2982    size_t i = 0;
2983    for (; i < addrs_count; i++) {
2984      if ((validity[i] & 1) != 0) {
2985        if ((validity[i] & 4) != 0) {
2986          if (outdata[types * i + 1] != page_expected->size) {
2987            break;
2988          }
2989        } else
2990          if (page_expected->size != 0) {
2991            break;
2992          }
2993
2994        if ((validity[i] & 2) != 0 && page_expected->lgrp_id > 0) {
2995          if (outdata[types * i] != page_expected->lgrp_id) {
2996            break;
2997          }
2998        }
2999      } else {
3000        return NULL;
3001      }
3002    }
3003
3004    if (i != addrs_count) {
3005      if ((validity[i] & 2) != 0) {
3006        page_found->lgrp_id = outdata[types * i];
3007      } else {
3008        page_found->lgrp_id = -1;
3009      }
3010      if ((validity[i] & 4) != 0) {
3011        page_found->size = outdata[types * i + 1];
3012      } else {
3013        page_found->size = 0;
3014      }
3015      return (char*)addrs[i];
3016    }
3017
3018    p = addrs[addrs_count - 1] + page_size;
3019  }
3020  return end;
3021}
3022
3023bool os::uncommit_memory(char* addr, size_t bytes) {
3024  size_t size = bytes;
3025  // Map uncommitted pages PROT_NONE so we fail early if we touch an
3026  // uncommitted page. Otherwise, the read/write might succeed if we
3027  // have enough swap space to back the physical page.
3028  return
3029    NULL != Solaris::mmap_chunk(addr, size,
3030                                MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE,
3031                                PROT_NONE);
3032}
3033
3034char* os::Solaris::mmap_chunk(char *addr, size_t size, int flags, int prot) {
3035  char *b = (char *)mmap(addr, size, prot, flags, os::Solaris::_dev_zero_fd, 0);
3036
3037  if (b == MAP_FAILED) {
3038    return NULL;
3039  }
3040  return b;
3041}
3042
3043char* os::Solaris::anon_mmap(char* requested_addr, size_t bytes, size_t alignment_hint, bool fixed) {
3044  char* addr = requested_addr;
3045  int flags = MAP_PRIVATE | MAP_NORESERVE;
3046
3047  assert(!(fixed && (alignment_hint > 0)), "alignment hint meaningless with fixed mmap");
3048
3049  if (fixed) {
3050    flags |= MAP_FIXED;
3051  } else if (has_map_align && (alignment_hint > (size_t) vm_page_size())) {
3052    flags |= MAP_ALIGN;
3053    addr = (char*) alignment_hint;
3054  }
3055
3056  // Map uncommitted pages PROT_NONE so we fail early if we touch an
3057  // uncommitted page. Otherwise, the read/write might succeed if we
3058  // have enough swap space to back the physical page.
3059  return mmap_chunk(addr, bytes, flags, PROT_NONE);
3060}
3061
3062char* os::reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
3063  char* addr = Solaris::anon_mmap(requested_addr, bytes, alignment_hint, (requested_addr != NULL));
3064
3065  guarantee(requested_addr == NULL || requested_addr == addr,
3066            "OS failed to return requested mmap address.");
3067  return addr;
3068}
3069
3070// Reserve memory at an arbitrary address, only if that area is
3071// available (and not reserved for something else).
3072
3073char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3074  const int max_tries = 10;
3075  char* base[max_tries];
3076  size_t size[max_tries];
3077
3078  // Solaris adds a gap between mmap'ed regions.  The size of the gap
3079  // is dependent on the requested size and the MMU.  Our initial gap
3080  // value here is just a guess and will be corrected later.
3081  bool had_top_overlap = false;
3082  bool have_adjusted_gap = false;
3083  size_t gap = 0x400000;
3084
3085  // Assert only that the size is a multiple of the page size, since
3086  // that's all that mmap requires, and since that's all we really know
3087  // about at this low abstraction level.  If we need higher alignment,
3088  // we can either pass an alignment to this method or verify alignment
3089  // in one of the methods further up the call chain.  See bug 5044738.
3090  assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
3091
3092  // Since snv_84, Solaris attempts to honor the address hint - see 5003415.
3093  // Give it a try, if the kernel honors the hint we can return immediately.
3094  char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
3095  volatile int err = errno;
3096  if (addr == requested_addr) {
3097    return addr;
3098  } else if (addr != NULL) {
3099    unmap_memory(addr, bytes);
3100  }
3101
3102  if (PrintMiscellaneous && Verbose) {
3103    char buf[256];
3104    buf[0] = '\0';
3105    if (addr == NULL) {
3106      jio_snprintf(buf, sizeof(buf), ": %s", strerror(err));
3107    }
3108    warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at "
3109            PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
3110            "%s", bytes, requested_addr, addr, buf);
3111  }
3112
3113  // Address hint method didn't work.  Fall back to the old method.
3114  // In theory, once SNV becomes our oldest supported platform, this
3115  // code will no longer be needed.
3116  //
3117  // Repeatedly allocate blocks until the block is allocated at the
3118  // right spot. Give up after max_tries.
3119  int i;
3120  for (i = 0; i < max_tries; ++i) {
3121    base[i] = reserve_memory(bytes);
3122
3123    if (base[i] != NULL) {
3124      // Is this the block we wanted?
3125      if (base[i] == requested_addr) {
3126        size[i] = bytes;
3127        break;
3128      }
3129
3130      // check that the gap value is right
3131      if (had_top_overlap && !have_adjusted_gap) {
3132        size_t actual_gap = base[i-1] - base[i] - bytes;
3133        if (gap != actual_gap) {
3134          // adjust the gap value and retry the last 2 allocations
3135          assert(i > 0, "gap adjustment code problem");
3136          have_adjusted_gap = true;  // adjust the gap only once, just in case
3137          gap = actual_gap;
3138          if (PrintMiscellaneous && Verbose) {
3139            warning("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap);
3140          }
3141          unmap_memory(base[i], bytes);
3142          unmap_memory(base[i-1], size[i-1]);
3143          i-=2;
3144          continue;
3145        }
3146      }
3147
3148      // Does this overlap the block we wanted? Give back the overlapped
3149      // parts and try again.
3150      //
3151      // There is still a bug in this code: if top_overlap == bytes,
3152      // the overlap is offset from requested region by the value of gap.
3153      // In this case giving back the overlapped part will not work,
3154      // because we'll give back the entire block at base[i] and
3155      // therefore the subsequent allocation will not generate a new gap.
3156      // This could be fixed with a new algorithm that used larger
3157      // or variable size chunks to find the requested region -
3158      // but such a change would introduce additional complications.
3159      // It's rare enough that the planets align for this bug,
3160      // so we'll just wait for a fix for 6204603/5003415 which
3161      // will provide a mmap flag to allow us to avoid this business.
3162
3163      size_t top_overlap = requested_addr + (bytes + gap) - base[i];
3164      if (top_overlap >= 0 && top_overlap < bytes) {
3165        had_top_overlap = true;
3166        unmap_memory(base[i], top_overlap);
3167        base[i] += top_overlap;
3168        size[i] = bytes - top_overlap;
3169      } else {
3170        size_t bottom_overlap = base[i] + bytes - requested_addr;
3171        if (bottom_overlap >= 0 && bottom_overlap < bytes) {
3172          if (PrintMiscellaneous && Verbose && bottom_overlap == 0) {
3173            warning("attempt_reserve_memory_at: possible alignment bug");
3174          }
3175          unmap_memory(requested_addr, bottom_overlap);
3176          size[i] = bytes - bottom_overlap;
3177        } else {
3178          size[i] = bytes;
3179        }
3180      }
3181    }
3182  }
3183
3184  // Give back the unused reserved pieces.
3185
3186  for (int j = 0; j < i; ++j) {
3187    if (base[j] != NULL) {
3188      unmap_memory(base[j], size[j]);
3189    }
3190  }
3191
3192  return (i < max_tries) ? requested_addr : NULL;
3193}
3194
3195bool os::release_memory(char* addr, size_t bytes) {
3196  size_t size = bytes;
3197  return munmap(addr, size) == 0;
3198}
3199
3200static bool solaris_mprotect(char* addr, size_t bytes, int prot) {
3201  assert(addr == (char*)align_size_down((uintptr_t)addr, os::vm_page_size()),
3202         "addr must be page aligned");
3203  int retVal = mprotect(addr, bytes, prot);
3204  return retVal == 0;
3205}
3206
3207// Protect memory (Used to pass readonly pages through
3208// JNI GetArray<type>Elements with empty arrays.)
3209// Also, used for serialization page and for compressed oops null pointer
3210// checking.
3211bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
3212                        bool is_committed) {
3213  unsigned int p = 0;
3214  switch (prot) {
3215  case MEM_PROT_NONE: p = PROT_NONE; break;
3216  case MEM_PROT_READ: p = PROT_READ; break;
3217  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
3218  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
3219  default:
3220    ShouldNotReachHere();
3221  }
3222  // is_committed is unused.
3223  return solaris_mprotect(addr, bytes, p);
3224}
3225
3226// guard_memory and unguard_memory only happens within stack guard pages.
3227// Since ISM pertains only to the heap, guard and unguard memory should not
3228/// happen with an ISM region.
3229bool os::guard_memory(char* addr, size_t bytes) {
3230  return solaris_mprotect(addr, bytes, PROT_NONE);
3231}
3232
3233bool os::unguard_memory(char* addr, size_t bytes) {
3234  return solaris_mprotect(addr, bytes, PROT_READ|PROT_WRITE);
3235}
3236
3237// Large page support
3238
3239// UseLargePages is the master flag to enable/disable large page memory.
3240// UseMPSS and UseISM are supported for compatibility reasons. Their combined
3241// effects can be described in the following table:
3242//
3243// UseLargePages UseMPSS UseISM
3244//    false         *       *   => UseLargePages is the master switch, turning
3245//                                 it off will turn off both UseMPSS and
3246//                                 UseISM. VM will not use large page memory
3247//                                 regardless the settings of UseMPSS/UseISM.
3248//     true      false    false => Unless future Solaris provides other
3249//                                 mechanism to use large page memory, this
3250//                                 combination is equivalent to -UseLargePages,
3251//                                 VM will not use large page memory
3252//     true      true     false => JVM will use MPSS for large page memory.
3253//                                 This is the default behavior.
3254//     true      false    true  => JVM will use ISM for large page memory.
3255//     true      true     true  => JVM will use ISM if it is available.
3256//                                 Otherwise, JVM will fall back to MPSS.
3257//                                 Becaues ISM is now available on all
3258//                                 supported Solaris versions, this combination
3259//                                 is equivalent to +UseISM -UseMPSS.
3260
3261static size_t _large_page_size = 0;
3262
3263bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) {
3264  // x86 uses either 2M or 4M page, depending on whether PAE (Physical Address
3265  // Extensions) mode is enabled. AMD64/EM64T uses 2M page in 64bit mode. Sparc
3266  // can support multiple page sizes.
3267
3268  // Don't bother to probe page size because getpagesizes() comes with MPSS.
3269  // ISM is only recommended on old Solaris where there is no MPSS support.
3270  // Simply choose a conservative value as default.
3271  *page_size = LargePageSizeInBytes ? LargePageSizeInBytes :
3272               SPARC_ONLY(4 * M) IA32_ONLY(4 * M) AMD64_ONLY(2 * M)
3273               ARM_ONLY(2 * M);
3274
3275  // ISM is available on all supported Solaris versions
3276  return true;
3277}
3278
3279// Insertion sort for small arrays (descending order).
3280static void insertion_sort_descending(size_t* array, int len) {
3281  for (int i = 0; i < len; i++) {
3282    size_t val = array[i];
3283    for (size_t key = i; key > 0 && array[key - 1] < val; --key) {
3284      size_t tmp = array[key];
3285      array[key] = array[key - 1];
3286      array[key - 1] = tmp;
3287    }
3288  }
3289}
3290
3291bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) {
3292  const unsigned int usable_count = VM_Version::page_size_count();
3293  if (usable_count == 1) {
3294    return false;
3295  }
3296
3297  // Find the right getpagesizes interface.  When solaris 11 is the minimum
3298  // build platform, getpagesizes() (without the '2') can be called directly.
3299  typedef int (*gps_t)(size_t[], int);
3300  gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2"));
3301  if (gps_func == NULL) {
3302    gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes"));
3303    if (gps_func == NULL) {
3304      if (warn) {
3305        warning("MPSS is not supported by the operating system.");
3306      }
3307      return false;
3308    }
3309  }
3310
3311  // Fill the array of page sizes.
3312  int n = (*gps_func)(_page_sizes, page_sizes_max);
3313  assert(n > 0, "Solaris bug?");
3314
3315  if (n == page_sizes_max) {
3316    // Add a sentinel value (necessary only if the array was completely filled
3317    // since it is static (zeroed at initialization)).
3318    _page_sizes[--n] = 0;
3319    DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");)
3320  }
3321  assert(_page_sizes[n] == 0, "missing sentinel");
3322  trace_page_sizes("available page sizes", _page_sizes, n);
3323
3324  if (n == 1) return false;     // Only one page size available.
3325
3326  // Skip sizes larger than 4M (or LargePageSizeInBytes if it was set) and
3327  // select up to usable_count elements.  First sort the array, find the first
3328  // acceptable value, then copy the usable sizes to the top of the array and
3329  // trim the rest.  Make sure to include the default page size :-).
3330  //
3331  // A better policy could get rid of the 4M limit by taking the sizes of the
3332  // important VM memory regions (java heap and possibly the code cache) into
3333  // account.
3334  insertion_sort_descending(_page_sizes, n);
3335  const size_t size_limit =
3336    FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes;
3337  int beg;
3338  for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ;
3339  const int end = MIN2((int)usable_count, n) - 1;
3340  for (int cur = 0; cur < end; ++cur, ++beg) {
3341    _page_sizes[cur] = _page_sizes[beg];
3342  }
3343  _page_sizes[end] = vm_page_size();
3344  _page_sizes[end + 1] = 0;
3345
3346  if (_page_sizes[end] > _page_sizes[end - 1]) {
3347    // Default page size is not the smallest; sort again.
3348    insertion_sort_descending(_page_sizes, end + 1);
3349  }
3350  *page_size = _page_sizes[0];
3351
3352  trace_page_sizes("usable page sizes", _page_sizes, end + 1);
3353  return true;
3354}
3355
3356void os::large_page_init() {
3357  if (!UseLargePages) {
3358    UseISM = false;
3359    UseMPSS = false;
3360    return;
3361  }
3362
3363  // print a warning if any large page related flag is specified on command line
3364  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages)        ||
3365                         !FLAG_IS_DEFAULT(UseISM)               ||
3366                         !FLAG_IS_DEFAULT(UseMPSS)              ||
3367                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
3368  UseISM = UseISM &&
3369           Solaris::ism_sanity_check(warn_on_failure, &_large_page_size);
3370  if (UseISM) {
3371    // ISM disables MPSS to be compatible with old JDK behavior
3372    UseMPSS = false;
3373    _page_sizes[0] = _large_page_size;
3374    _page_sizes[1] = vm_page_size();
3375  }
3376
3377  UseMPSS = UseMPSS &&
3378            Solaris::mpss_sanity_check(warn_on_failure, &_large_page_size);
3379
3380  UseLargePages = UseISM || UseMPSS;
3381}
3382
3383bool os::Solaris::set_mpss_range(caddr_t start, size_t bytes, size_t align) {
3384  // Signal to OS that we want large pages for addresses
3385  // from addr, addr + bytes
3386  struct memcntl_mha mpss_struct;
3387  mpss_struct.mha_cmd = MHA_MAPSIZE_VA;
3388  mpss_struct.mha_pagesize = align;
3389  mpss_struct.mha_flags = 0;
3390  if (memcntl(start, bytes, MC_HAT_ADVISE,
3391              (caddr_t) &mpss_struct, 0, 0) < 0) {
3392    debug_only(warning("Attempt to use MPSS failed."));
3393    return false;
3394  }
3395  return true;
3396}
3397
3398char* os::reserve_memory_special(size_t size, char* addr, bool exec) {
3399  // "exec" is passed in but not used.  Creating the shared image for
3400  // the code cache doesn't have an SHM_X executable permission to check.
3401  assert(UseLargePages && UseISM, "only for ISM large pages");
3402
3403  char* retAddr = NULL;
3404  int shmid;
3405  key_t ismKey;
3406
3407  bool warn_on_failure = UseISM &&
3408                        (!FLAG_IS_DEFAULT(UseLargePages)         ||
3409                         !FLAG_IS_DEFAULT(UseISM)                ||
3410                         !FLAG_IS_DEFAULT(LargePageSizeInBytes)
3411                        );
3412  char msg[128];
3413
3414  ismKey = IPC_PRIVATE;
3415
3416  // Create a large shared memory region to attach to based on size.
3417  // Currently, size is the total size of the heap
3418  shmid = shmget(ismKey, size, SHM_R | SHM_W | IPC_CREAT);
3419  if (shmid == -1){
3420     if (warn_on_failure) {
3421       jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno);
3422       warning(msg);
3423     }
3424     return NULL;
3425  }
3426
3427  // Attach to the region
3428  retAddr = (char *) shmat(shmid, 0, SHM_SHARE_MMU | SHM_R | SHM_W);
3429  int err = errno;
3430
3431  // Remove shmid. If shmat() is successful, the actual shared memory segment
3432  // will be deleted when it's detached by shmdt() or when the process
3433  // terminates. If shmat() is not successful this will remove the shared
3434  // segment immediately.
3435  shmctl(shmid, IPC_RMID, NULL);
3436
3437  if (retAddr == (char *) -1) {
3438    if (warn_on_failure) {
3439      jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err);
3440      warning(msg);
3441    }
3442    return NULL;
3443  }
3444  if ((retAddr != NULL) && UseNUMAInterleaving) {
3445    numa_make_global(retAddr, size);
3446  }
3447  return retAddr;
3448}
3449
3450bool os::release_memory_special(char* base, size_t bytes) {
3451  // detaching the SHM segment will also delete it, see reserve_memory_special()
3452  int rslt = shmdt(base);
3453  return rslt == 0;
3454}
3455
3456size_t os::large_page_size() {
3457  return _large_page_size;
3458}
3459
3460// MPSS allows application to commit large page memory on demand; with ISM
3461// the entire memory region must be allocated as shared memory.
3462bool os::can_commit_large_page_memory() {
3463  return UseISM ? false : true;
3464}
3465
3466bool os::can_execute_large_page_memory() {
3467  return UseISM ? false : true;
3468}
3469
3470static int os_sleep(jlong millis, bool interruptible) {
3471  const jlong limit = INT_MAX;
3472  jlong prevtime;
3473  int res;
3474
3475  while (millis > limit) {
3476    if ((res = os_sleep(limit, interruptible)) != OS_OK)
3477      return res;
3478    millis -= limit;
3479  }
3480
3481  // Restart interrupted polls with new parameters until the proper delay
3482  // has been completed.
3483
3484  prevtime = getTimeMillis();
3485
3486  while (millis > 0) {
3487    jlong newtime;
3488
3489    if (!interruptible) {
3490      // Following assert fails for os::yield_all:
3491      // assert(!thread->is_Java_thread(), "must not be java thread");
3492      res = poll(NULL, 0, millis);
3493    } else {
3494      JavaThread *jt = JavaThread::current();
3495
3496      INTERRUPTIBLE_NORESTART_VM_ALWAYS(poll(NULL, 0, millis), res, jt,
3497        os::Solaris::clear_interrupted);
3498    }
3499
3500    // INTERRUPTIBLE_NORESTART_VM_ALWAYS returns res == OS_INTRPT for
3501    // thread.Interrupt.
3502
3503    // See c/r 6751923. Poll can return 0 before time
3504    // has elapsed if time is set via clock_settime (as NTP does).
3505    // res == 0 if poll timed out (see man poll RETURN VALUES)
3506    // using the logic below checks that we really did
3507    // sleep at least "millis" if not we'll sleep again.
3508    if( ( res == 0 ) || ((res == OS_ERR) && (errno == EINTR))) {
3509      newtime = getTimeMillis();
3510      assert(newtime >= prevtime, "time moving backwards");
3511    /* Doing prevtime and newtime in microseconds doesn't help precision,
3512       and trying to round up to avoid lost milliseconds can result in a
3513       too-short delay. */
3514      millis -= newtime - prevtime;
3515      if(millis <= 0)
3516        return OS_OK;
3517      prevtime = newtime;
3518    } else
3519      return res;
3520  }
3521
3522  return OS_OK;
3523}
3524
3525// Read calls from inside the vm need to perform state transitions
3526size_t os::read(int fd, void *buf, unsigned int nBytes) {
3527  INTERRUPTIBLE_RETURN_INT_VM(::read(fd, buf, nBytes), os::Solaris::clear_interrupted);
3528}
3529
3530size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
3531  INTERRUPTIBLE_RETURN_INT(::read(fd, buf, nBytes), os::Solaris::clear_interrupted);
3532}
3533
3534int os::sleep(Thread* thread, jlong millis, bool interruptible) {
3535  assert(thread == Thread::current(),  "thread consistency check");
3536
3537  // TODO-FIXME: this should be removed.
3538  // On Solaris machines (especially 2.5.1) we found that sometimes the VM gets into a live lock
3539  // situation with a JavaThread being starved out of a lwp. The kernel doesn't seem to generate
3540  // a SIGWAITING signal which would enable the threads library to create a new lwp for the starving
3541  // thread. We suspect that because the Watcher thread keeps waking up at periodic intervals the kernel
3542  // is fooled into believing that the system is making progress. In the code below we block the
3543  // the watcher thread while safepoint is in progress so that it would not appear as though the
3544  // system is making progress.
3545  if (!Solaris::T2_libthread() &&
3546      thread->is_Watcher_thread() && SafepointSynchronize::is_synchronizing() && !Arguments::has_profile()) {
3547    // We now try to acquire the threads lock. Since this lock is held by the VM thread during
3548    // the entire safepoint, the watcher thread will  line up here during the safepoint.
3549    Threads_lock->lock_without_safepoint_check();
3550    Threads_lock->unlock();
3551  }
3552
3553  if (thread->is_Java_thread()) {
3554    // This is a JavaThread so we honor the _thread_blocked protocol
3555    // even for sleeps of 0 milliseconds. This was originally done
3556    // as a workaround for bug 4338139. However, now we also do it
3557    // to honor the suspend-equivalent protocol.
3558
3559    JavaThread *jt = (JavaThread *) thread;
3560    ThreadBlockInVM tbivm(jt);
3561
3562    jt->set_suspend_equivalent();
3563    // cleared by handle_special_suspend_equivalent_condition() or
3564    // java_suspend_self() via check_and_wait_while_suspended()
3565
3566    int ret_code;
3567    if (millis <= 0) {
3568      thr_yield();
3569      ret_code = 0;
3570    } else {
3571      // The original sleep() implementation did not create an
3572      // OSThreadWaitState helper for sleeps of 0 milliseconds.
3573      // I'm preserving that decision for now.
3574      OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */);
3575
3576      ret_code = os_sleep(millis, interruptible);
3577    }
3578
3579    // were we externally suspended while we were waiting?
3580    jt->check_and_wait_while_suspended();
3581
3582    return ret_code;
3583  }
3584
3585  // non-JavaThread from this point on:
3586
3587  if (millis <= 0) {
3588    thr_yield();
3589    return 0;
3590  }
3591
3592  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
3593
3594  return os_sleep(millis, interruptible);
3595}
3596
3597int os::naked_sleep() {
3598  // %% make the sleep time an integer flag. for now use 1 millisec.
3599  return os_sleep(1, false);
3600}
3601
3602// Sleep forever; naked call to OS-specific sleep; use with CAUTION
3603void os::infinite_sleep() {
3604  while (true) {    // sleep forever ...
3605    ::sleep(100);   // ... 100 seconds at a time
3606  }
3607}
3608
3609// Used to convert frequent JVM_Yield() to nops
3610bool os::dont_yield() {
3611  if (DontYieldALot) {
3612    static hrtime_t last_time = 0;
3613    hrtime_t diff = getTimeNanos() - last_time;
3614
3615    if (diff < DontYieldALotInterval * 1000000)
3616      return true;
3617
3618    last_time += diff;
3619
3620    return false;
3621  }
3622  else {
3623    return false;
3624  }
3625}
3626
3627// Caveat: Solaris os::yield() causes a thread-state transition whereas
3628// the linux and win32 implementations do not.  This should be checked.
3629
3630void os::yield() {
3631  // Yields to all threads with same or greater priority
3632  os::sleep(Thread::current(), 0, false);
3633}
3634
3635// Note that yield semantics are defined by the scheduling class to which
3636// the thread currently belongs.  Typically, yield will _not yield to
3637// other equal or higher priority threads that reside on the dispatch queues
3638// of other CPUs.
3639
3640os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; }
3641
3642
3643// On Solaris we found that yield_all doesn't always yield to all other threads.
3644// There have been cases where there is a thread ready to execute but it doesn't
3645// get an lwp as the VM thread continues to spin with sleeps of 1 millisecond.
3646// The 1 millisecond wait doesn't seem long enough for the kernel to issue a
3647// SIGWAITING signal which will cause a new lwp to be created. So we count the
3648// number of times yield_all is called in the one loop and increase the sleep
3649// time after 8 attempts. If this fails too we increase the concurrency level
3650// so that the starving thread would get an lwp
3651
3652void os::yield_all(int attempts) {
3653  // Yields to all threads, including threads with lower priorities
3654  if (attempts == 0) {
3655    os::sleep(Thread::current(), 1, false);
3656  } else {
3657    int iterations = attempts % 30;
3658    if (iterations == 0 && !os::Solaris::T2_libthread()) {
3659      // thr_setconcurrency and _getconcurrency make sense only under T1.
3660      int noofLWPS = thr_getconcurrency();
3661      if (noofLWPS < (Threads::number_of_threads() + 2)) {
3662        thr_setconcurrency(thr_getconcurrency() + 1);
3663      }
3664    } else if (iterations < 25) {
3665      os::sleep(Thread::current(), 1, false);
3666    } else {
3667      os::sleep(Thread::current(), 10, false);
3668    }
3669  }
3670}
3671
3672// Called from the tight loops to possibly influence time-sharing heuristics
3673void os::loop_breaker(int attempts) {
3674  os::yield_all(attempts);
3675}
3676
3677
3678// Interface for setting lwp priorities.  If we are using T2 libthread,
3679// which forces the use of BoundThreads or we manually set UseBoundThreads,
3680// all of our threads will be assigned to real lwp's.  Using the thr_setprio
3681// function is meaningless in this mode so we must adjust the real lwp's priority
3682// The routines below implement the getting and setting of lwp priorities.
3683//
3684// Note: There are three priority scales used on Solaris.  Java priotities
3685//       which range from 1 to 10, libthread "thr_setprio" scale which range
3686//       from 0 to 127, and the current scheduling class of the process we
3687//       are running in.  This is typically from -60 to +60.
3688//       The setting of the lwp priorities in done after a call to thr_setprio
3689//       so Java priorities are mapped to libthread priorities and we map from
3690//       the latter to lwp priorities.  We don't keep priorities stored in
3691//       Java priorities since some of our worker threads want to set priorities
3692//       higher than all Java threads.
3693//
3694// For related information:
3695// (1)  man -s 2 priocntl
3696// (2)  man -s 4 priocntl
3697// (3)  man dispadmin
3698// =    librt.so
3699// =    libthread/common/rtsched.c - thrp_setlwpprio().
3700// =    ps -cL <pid> ... to validate priority.
3701// =    sched_get_priority_min and _max
3702//              pthread_create
3703//              sched_setparam
3704//              pthread_setschedparam
3705//
3706// Assumptions:
3707// +    We assume that all threads in the process belong to the same
3708//              scheduling class.   IE. an homogenous process.
3709// +    Must be root or in IA group to change change "interactive" attribute.
3710//              Priocntl() will fail silently.  The only indication of failure is when
3711//              we read-back the value and notice that it hasn't changed.
3712// +    Interactive threads enter the runq at the head, non-interactive at the tail.
3713// +    For RT, change timeslice as well.  Invariant:
3714//              constant "priority integral"
3715//              Konst == TimeSlice * (60-Priority)
3716//              Given a priority, compute appropriate timeslice.
3717// +    Higher numerical values have higher priority.
3718
3719// sched class attributes
3720typedef struct {
3721        int   schedPolicy;              // classID
3722        int   maxPrio;
3723        int   minPrio;
3724} SchedInfo;
3725
3726
3727static SchedInfo tsLimits, iaLimits, rtLimits;
3728
3729#ifdef ASSERT
3730static int  ReadBackValidate = 1;
3731#endif
3732static int  myClass     = 0;
3733static int  myMin       = 0;
3734static int  myMax       = 0;
3735static int  myCur       = 0;
3736static bool priocntl_enable = false;
3737
3738
3739// Call the version of priocntl suitable for all supported versions
3740// of Solaris. We need to call through this wrapper so that we can
3741// build on Solaris 9 and run on Solaris 8, 9 and 10.
3742//
3743// This code should be removed if we ever stop supporting Solaris 8
3744// and earlier releases.
3745
3746static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg);
3747typedef long (*priocntl_type)(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg);
3748static priocntl_type priocntl_ptr = priocntl_stub;
3749
3750// Stub to set the value of the real pointer, and then call the real
3751// function.
3752
3753static long priocntl_stub(int pcver, idtype_t idtype, id_t id, int cmd, caddr_t arg) {
3754  // Try Solaris 8- name only.
3755  priocntl_type tmp = (priocntl_type)dlsym(RTLD_DEFAULT, "__priocntl");
3756  guarantee(tmp != NULL, "priocntl function not found.");
3757  priocntl_ptr = tmp;
3758  return (*priocntl_ptr)(PC_VERSION, idtype, id, cmd, arg);
3759}
3760
3761
3762// lwp_priocntl_init
3763//
3764// Try to determine the priority scale for our process.
3765//
3766// Return errno or 0 if OK.
3767//
3768static
3769int     lwp_priocntl_init ()
3770{
3771  int rslt;
3772  pcinfo_t ClassInfo;
3773  pcparms_t ParmInfo;
3774  int i;
3775
3776  if (!UseThreadPriorities) return 0;
3777
3778  // We are using Bound threads, we need to determine our priority ranges
3779  if (os::Solaris::T2_libthread() || UseBoundThreads) {
3780    // If ThreadPriorityPolicy is 1, switch tables
3781    if (ThreadPriorityPolicy == 1) {
3782      for (i = 0 ; i < MaxPriority+1; i++)
3783        os::java_to_os_priority[i] = prio_policy1[i];
3784    }
3785  }
3786  // Not using Bound Threads, set to ThreadPolicy 1
3787  else {
3788    for ( i = 0 ; i < MaxPriority+1; i++ ) {
3789      os::java_to_os_priority[i] = prio_policy1[i];
3790    }
3791    return 0;
3792  }
3793
3794
3795  // Get IDs for a set of well-known scheduling classes.
3796  // TODO-FIXME: GETCLINFO returns the current # of classes in the
3797  // the system.  We should have a loop that iterates over the
3798  // classID values, which are known to be "small" integers.
3799
3800  strcpy(ClassInfo.pc_clname, "TS");
3801  ClassInfo.pc_cid = -1;
3802  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3803  if (rslt < 0) return errno;
3804  assert(ClassInfo.pc_cid != -1, "cid for TS class is -1");
3805  tsLimits.schedPolicy = ClassInfo.pc_cid;
3806  tsLimits.maxPrio = ((tsinfo_t*)ClassInfo.pc_clinfo)->ts_maxupri;
3807  tsLimits.minPrio = -tsLimits.maxPrio;
3808
3809  strcpy(ClassInfo.pc_clname, "IA");
3810  ClassInfo.pc_cid = -1;
3811  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3812  if (rslt < 0) return errno;
3813  assert(ClassInfo.pc_cid != -1, "cid for IA class is -1");
3814  iaLimits.schedPolicy = ClassInfo.pc_cid;
3815  iaLimits.maxPrio = ((iainfo_t*)ClassInfo.pc_clinfo)->ia_maxupri;
3816  iaLimits.minPrio = -iaLimits.maxPrio;
3817
3818  strcpy(ClassInfo.pc_clname, "RT");
3819  ClassInfo.pc_cid = -1;
3820  rslt = (*priocntl_ptr)(PC_VERSION, P_ALL, 0, PC_GETCID, (caddr_t)&ClassInfo);
3821  if (rslt < 0) return errno;
3822  assert(ClassInfo.pc_cid != -1, "cid for RT class is -1");
3823  rtLimits.schedPolicy = ClassInfo.pc_cid;
3824  rtLimits.maxPrio = ((rtinfo_t*)ClassInfo.pc_clinfo)->rt_maxpri;
3825  rtLimits.minPrio = 0;
3826
3827
3828  // Query our "current" scheduling class.
3829  // This will normally be IA,TS or, rarely, RT.
3830  memset (&ParmInfo, 0, sizeof(ParmInfo));
3831  ParmInfo.pc_cid = PC_CLNULL;
3832  rslt = (*priocntl_ptr) (PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo );
3833  if ( rslt < 0 ) return errno;
3834  myClass = ParmInfo.pc_cid;
3835
3836  // We now know our scheduling classId, get specific information
3837  // the class.
3838  ClassInfo.pc_cid = myClass;
3839  ClassInfo.pc_clname[0] = 0;
3840  rslt = (*priocntl_ptr) (PC_VERSION, (idtype)0, 0, PC_GETCLINFO, (caddr_t)&ClassInfo );
3841  if ( rslt < 0 ) return errno;
3842
3843  if (ThreadPriorityVerbose)
3844    tty->print_cr ("lwp_priocntl_init: Class=%d(%s)...", myClass, ClassInfo.pc_clname);
3845
3846  memset(&ParmInfo, 0, sizeof(pcparms_t));
3847  ParmInfo.pc_cid = PC_CLNULL;
3848  rslt = (*priocntl_ptr)(PC_VERSION, P_PID, P_MYID, PC_GETPARMS, (caddr_t)&ParmInfo);
3849  if (rslt < 0) return errno;
3850
3851  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3852    myMin = rtLimits.minPrio;
3853    myMax = rtLimits.maxPrio;
3854  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3855    iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3856    myMin = iaLimits.minPrio;
3857    myMax = iaLimits.maxPrio;
3858    myMax = MIN2(myMax, (int)iaInfo->ia_uprilim);       // clamp - restrict
3859  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3860    tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3861    myMin = tsLimits.minPrio;
3862    myMax = tsLimits.maxPrio;
3863    myMax = MIN2(myMax, (int)tsInfo->ts_uprilim);       // clamp - restrict
3864  } else {
3865    // No clue - punt
3866    if (ThreadPriorityVerbose)
3867      tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname);
3868    return EINVAL;      // no clue, punt
3869  }
3870
3871  if (ThreadPriorityVerbose)
3872        tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax);
3873
3874  priocntl_enable = true;  // Enable changing priorities
3875  return 0;
3876}
3877
3878#define IAPRI(x)        ((iaparms_t *)((x).pc_clparms))
3879#define RTPRI(x)        ((rtparms_t *)((x).pc_clparms))
3880#define TSPRI(x)        ((tsparms_t *)((x).pc_clparms))
3881
3882
3883// scale_to_lwp_priority
3884//
3885// Convert from the libthread "thr_setprio" scale to our current
3886// lwp scheduling class scale.
3887//
3888static
3889int     scale_to_lwp_priority (int rMin, int rMax, int x)
3890{
3891  int v;
3892
3893  if (x == 127) return rMax;            // avoid round-down
3894    v = (((x*(rMax-rMin)))/128)+rMin;
3895  return v;
3896}
3897
3898
3899// set_lwp_priority
3900//
3901// Set the priority of the lwp.  This call should only be made
3902// when using bound threads (T2 threads are bound by default).
3903//
3904int     set_lwp_priority (int ThreadID, int lwpid, int newPrio )
3905{
3906  int rslt;
3907  int Actual, Expected, prv;
3908  pcparms_t ParmInfo;                   // for GET-SET
3909#ifdef ASSERT
3910  pcparms_t ReadBack;                   // for readback
3911#endif
3912
3913  // Set priority via PC_GETPARMS, update, PC_SETPARMS
3914  // Query current values.
3915  // TODO: accelerate this by eliminating the PC_GETPARMS call.
3916  // Cache "pcparms_t" in global ParmCache.
3917  // TODO: elide set-to-same-value
3918
3919  // If something went wrong on init, don't change priorities.
3920  if ( !priocntl_enable ) {
3921    if (ThreadPriorityVerbose)
3922      tty->print_cr("Trying to set priority but init failed, ignoring");
3923    return EINVAL;
3924  }
3925
3926
3927  // If lwp hasn't started yet, just return
3928  // the _start routine will call us again.
3929  if ( lwpid <= 0 ) {
3930    if (ThreadPriorityVerbose) {
3931      tty->print_cr ("deferring the set_lwp_priority of thread " INTPTR_FORMAT " to %d, lwpid not set",
3932                     ThreadID, newPrio);
3933    }
3934    return 0;
3935  }
3936
3937  if (ThreadPriorityVerbose) {
3938    tty->print_cr ("set_lwp_priority(" INTPTR_FORMAT "@" INTPTR_FORMAT " %d) ",
3939                   ThreadID, lwpid, newPrio);
3940  }
3941
3942  memset(&ParmInfo, 0, sizeof(pcparms_t));
3943  ParmInfo.pc_cid = PC_CLNULL;
3944  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ParmInfo);
3945  if (rslt < 0) return errno;
3946
3947  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
3948    rtparms_t *rtInfo  = (rtparms_t*)ParmInfo.pc_clparms;
3949    rtInfo->rt_pri     = scale_to_lwp_priority (rtLimits.minPrio, rtLimits.maxPrio, newPrio);
3950    rtInfo->rt_tqsecs  = RT_NOCHANGE;
3951    rtInfo->rt_tqnsecs = RT_NOCHANGE;
3952    if (ThreadPriorityVerbose) {
3953      tty->print_cr("RT: %d->%d\n", newPrio, rtInfo->rt_pri);
3954    }
3955  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
3956    iaparms_t *iaInfo  = (iaparms_t*)ParmInfo.pc_clparms;
3957    int maxClamped     = MIN2(iaLimits.maxPrio, (int)iaInfo->ia_uprilim);
3958    iaInfo->ia_upri    = scale_to_lwp_priority(iaLimits.minPrio, maxClamped, newPrio);
3959    iaInfo->ia_uprilim = IA_NOCHANGE;
3960    iaInfo->ia_mode    = IA_NOCHANGE;
3961    if (ThreadPriorityVerbose) {
3962      tty->print_cr ("IA: [%d...%d] %d->%d\n",
3963               iaLimits.minPrio, maxClamped, newPrio, iaInfo->ia_upri);
3964    }
3965  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
3966    tsparms_t *tsInfo  = (tsparms_t*)ParmInfo.pc_clparms;
3967    int maxClamped     = MIN2(tsLimits.maxPrio, (int)tsInfo->ts_uprilim);
3968    prv                = tsInfo->ts_upri;
3969    tsInfo->ts_upri    = scale_to_lwp_priority(tsLimits.minPrio, maxClamped, newPrio);
3970    tsInfo->ts_uprilim = IA_NOCHANGE;
3971    if (ThreadPriorityVerbose) {
3972      tty->print_cr ("TS: %d [%d...%d] %d->%d\n",
3973               prv, tsLimits.minPrio, maxClamped, newPrio, tsInfo->ts_upri);
3974    }
3975    if (prv == tsInfo->ts_upri) return 0;
3976  } else {
3977    if ( ThreadPriorityVerbose ) {
3978      tty->print_cr ("Unknown scheduling class\n");
3979    }
3980      return EINVAL;    // no clue, punt
3981  }
3982
3983  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_SETPARMS, (caddr_t)&ParmInfo);
3984  if (ThreadPriorityVerbose && rslt) {
3985    tty->print_cr ("PC_SETPARMS ->%d %d\n", rslt, errno);
3986  }
3987  if (rslt < 0) return errno;
3988
3989#ifdef ASSERT
3990  // Sanity check: read back what we just attempted to set.
3991  // In theory it could have changed in the interim ...
3992  //
3993  // The priocntl system call is tricky.
3994  // Sometimes it'll validate the priority value argument and
3995  // return EINVAL if unhappy.  At other times it fails silently.
3996  // Readbacks are prudent.
3997
3998  if (!ReadBackValidate) return 0;
3999
4000  memset(&ReadBack, 0, sizeof(pcparms_t));
4001  ReadBack.pc_cid = PC_CLNULL;
4002  rslt = (*priocntl_ptr)(PC_VERSION, P_LWPID, lwpid, PC_GETPARMS, (caddr_t)&ReadBack);
4003  assert(rslt >= 0, "priocntl failed");
4004  Actual = Expected = 0xBAD;
4005  assert(ParmInfo.pc_cid == ReadBack.pc_cid, "cid's don't match");
4006  if (ParmInfo.pc_cid == rtLimits.schedPolicy) {
4007    Actual   = RTPRI(ReadBack)->rt_pri;
4008    Expected = RTPRI(ParmInfo)->rt_pri;
4009  } else if (ParmInfo.pc_cid == iaLimits.schedPolicy) {
4010    Actual   = IAPRI(ReadBack)->ia_upri;
4011    Expected = IAPRI(ParmInfo)->ia_upri;
4012  } else if (ParmInfo.pc_cid == tsLimits.schedPolicy) {
4013    Actual   = TSPRI(ReadBack)->ts_upri;
4014    Expected = TSPRI(ParmInfo)->ts_upri;
4015  } else {
4016    if ( ThreadPriorityVerbose ) {
4017      tty->print_cr("set_lwp_priority: unexpected class in readback: %d\n", ParmInfo.pc_cid);
4018    }
4019  }
4020
4021  if (Actual != Expected) {
4022    if ( ThreadPriorityVerbose ) {
4023      tty->print_cr ("set_lwp_priority(%d %d) Class=%d: actual=%d vs expected=%d\n",
4024             lwpid, newPrio, ReadBack.pc_cid, Actual, Expected);
4025    }
4026  }
4027#endif
4028
4029  return 0;
4030}
4031
4032
4033
4034// Solaris only gives access to 128 real priorities at a time,
4035// so we expand Java's ten to fill this range.  This would be better
4036// if we dynamically adjusted relative priorities.
4037//
4038// The ThreadPriorityPolicy option allows us to select 2 different
4039// priority scales.
4040//
4041// ThreadPriorityPolicy=0
4042// Since the Solaris' default priority is MaximumPriority, we do not
4043// set a priority lower than Max unless a priority lower than
4044// NormPriority is requested.
4045//
4046// ThreadPriorityPolicy=1
4047// This mode causes the priority table to get filled with
4048// linear values.  NormPriority get's mapped to 50% of the
4049// Maximum priority an so on.  This will cause VM threads
4050// to get unfair treatment against other Solaris processes
4051// which do not explicitly alter their thread priorities.
4052//
4053
4054
4055int os::java_to_os_priority[MaxPriority + 1] = {
4056  -99999,         // 0 Entry should never be used
4057
4058  0,              // 1 MinPriority
4059  32,             // 2
4060  64,             // 3
4061
4062  96,             // 4
4063  127,            // 5 NormPriority
4064  127,            // 6
4065
4066  127,            // 7
4067  127,            // 8
4068  127,            // 9 NearMaxPriority
4069
4070  127             // 10 MaxPriority
4071};
4072
4073
4074OSReturn os::set_native_priority(Thread* thread, int newpri) {
4075  assert(newpri >= MinimumPriority && newpri <= MaximumPriority, "bad priority mapping");
4076  if ( !UseThreadPriorities ) return OS_OK;
4077  int status = thr_setprio(thread->osthread()->thread_id(), newpri);
4078  if ( os::Solaris::T2_libthread() || (UseBoundThreads && thread->osthread()->is_vm_created()) )
4079    status |= (set_lwp_priority (thread->osthread()->thread_id(),
4080                    thread->osthread()->lwp_id(), newpri ));
4081  return (status == 0) ? OS_OK : OS_ERR;
4082}
4083
4084
4085OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
4086  int p;
4087  if ( !UseThreadPriorities ) {
4088    *priority_ptr = NormalPriority;
4089    return OS_OK;
4090  }
4091  int status = thr_getprio(thread->osthread()->thread_id(), &p);
4092  if (status != 0) {
4093    return OS_ERR;
4094  }
4095  *priority_ptr = p;
4096  return OS_OK;
4097}
4098
4099
4100// Hint to the underlying OS that a task switch would not be good.
4101// Void return because it's a hint and can fail.
4102void os::hint_no_preempt() {
4103  schedctl_start(schedctl_init());
4104}
4105
4106void os::interrupt(Thread* thread) {
4107  assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
4108
4109  OSThread* osthread = thread->osthread();
4110
4111  int isInterrupted = osthread->interrupted();
4112  if (!isInterrupted) {
4113      osthread->set_interrupted(true);
4114      OrderAccess::fence();
4115      // os::sleep() is implemented with either poll (NULL,0,timeout) or
4116      // by parking on _SleepEvent.  If the former, thr_kill will unwedge
4117      // the sleeper by SIGINTR, otherwise the unpark() will wake the sleeper.
4118      ParkEvent * const slp = thread->_SleepEvent ;
4119      if (slp != NULL) slp->unpark() ;
4120  }
4121
4122  // For JSR166:  unpark after setting status but before thr_kill -dl
4123  if (thread->is_Java_thread()) {
4124    ((JavaThread*)thread)->parker()->unpark();
4125  }
4126
4127  // Handle interruptible wait() ...
4128  ParkEvent * const ev = thread->_ParkEvent ;
4129  if (ev != NULL) ev->unpark() ;
4130
4131  // When events are used everywhere for os::sleep, then this thr_kill
4132  // will only be needed if UseVMInterruptibleIO is true.
4133
4134  if (!isInterrupted) {
4135    int status = thr_kill(osthread->thread_id(), os::Solaris::SIGinterrupt());
4136    assert_status(status == 0, status, "thr_kill");
4137
4138    // Bump thread interruption counter
4139    RuntimeService::record_thread_interrupt_signaled_count();
4140  }
4141}
4142
4143
4144bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
4145  assert(Thread::current() == thread || Threads_lock->owned_by_self(), "possibility of dangling Thread pointer");
4146
4147  OSThread* osthread = thread->osthread();
4148
4149  bool res = osthread->interrupted();
4150
4151  // NOTE that since there is no "lock" around these two operations,
4152  // there is the possibility that the interrupted flag will be
4153  // "false" but that the interrupt event will be set. This is
4154  // intentional. The effect of this is that Object.wait() will appear
4155  // to have a spurious wakeup, which is not harmful, and the
4156  // possibility is so rare that it is not worth the added complexity
4157  // to add yet another lock. It has also been recommended not to put
4158  // the interrupted flag into the os::Solaris::Event structure,
4159  // because it hides the issue.
4160  if (res && clear_interrupted) {
4161    osthread->set_interrupted(false);
4162  }
4163  return res;
4164}
4165
4166
4167void os::print_statistics() {
4168}
4169
4170int os::message_box(const char* title, const char* message) {
4171  int i;
4172  fdStream err(defaultStream::error_fd());
4173  for (i = 0; i < 78; i++) err.print_raw("=");
4174  err.cr();
4175  err.print_raw_cr(title);
4176  for (i = 0; i < 78; i++) err.print_raw("-");
4177  err.cr();
4178  err.print_raw_cr(message);
4179  for (i = 0; i < 78; i++) err.print_raw("=");
4180  err.cr();
4181
4182  char buf[16];
4183  // Prevent process from exiting upon "read error" without consuming all CPU
4184  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
4185
4186  return buf[0] == 'y' || buf[0] == 'Y';
4187}
4188
4189// A lightweight implementation that does not suspend the target thread and
4190// thus returns only a hint. Used for profiling only!
4191ExtendedPC os::get_thread_pc(Thread* thread) {
4192  // Make sure that it is called by the watcher and the Threads lock is owned.
4193  assert(Thread::current()->is_Watcher_thread(), "Must be watcher and own Threads_lock");
4194  // For now, is only used to profile the VM Thread
4195  assert(thread->is_VM_thread(), "Can only be called for VMThread");
4196  ExtendedPC epc;
4197
4198  GetThreadPC_Callback  cb(ProfileVM_lock);
4199  OSThread *osthread = thread->osthread();
4200  const int time_to_wait = 400; // 400ms wait for initial response
4201  int status = cb.interrupt(thread, time_to_wait);
4202
4203  if (cb.is_done() ) {
4204    epc = cb.addr();
4205  } else {
4206    DEBUG_ONLY(tty->print_cr("Failed to get pc for thread: %d got %d status",
4207                              osthread->thread_id(), status););
4208    // epc is already NULL
4209  }
4210  return epc;
4211}
4212
4213
4214// This does not do anything on Solaris. This is basically a hook for being
4215// able to use structured exception handling (thread-local exception filters) on, e.g., Win32.
4216void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) {
4217  f(value, method, args, thread);
4218}
4219
4220// This routine may be used by user applications as a "hook" to catch signals.
4221// The user-defined signal handler must pass unrecognized signals to this
4222// routine, and if it returns true (non-zero), then the signal handler must
4223// return immediately.  If the flag "abort_if_unrecognized" is true, then this
4224// routine will never retun false (zero), but instead will execute a VM panic
4225// routine kill the process.
4226//
4227// If this routine returns false, it is OK to call it again.  This allows
4228// the user-defined signal handler to perform checks either before or after
4229// the VM performs its own checks.  Naturally, the user code would be making
4230// a serious error if it tried to handle an exception (such as a null check
4231// or breakpoint) that the VM was generating for its own correct operation.
4232//
4233// This routine may recognize any of the following kinds of signals:
4234// SIGBUS, SIGSEGV, SIGILL, SIGFPE, BREAK_SIGNAL, SIGPIPE, SIGXFSZ,
4235// os::Solaris::SIGasync
4236// It should be consulted by handlers for any of those signals.
4237// It explicitly does not recognize os::Solaris::SIGinterrupt
4238//
4239// The caller of this routine must pass in the three arguments supplied
4240// to the function referred to in the "sa_sigaction" (not the "sa_handler")
4241// field of the structure passed to sigaction().  This routine assumes that
4242// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
4243//
4244// Note that the VM will print warnings if it detects conflicting signal
4245// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
4246//
4247extern "C" JNIEXPORT int
4248JVM_handle_solaris_signal(int signo, siginfo_t* siginfo, void* ucontext,
4249                          int abort_if_unrecognized);
4250
4251
4252void signalHandler(int sig, siginfo_t* info, void* ucVoid) {
4253  JVM_handle_solaris_signal(sig, info, ucVoid, true);
4254}
4255
4256/* Do not delete - if guarantee is ever removed,  a signal handler (even empty)
4257   is needed to provoke threads blocked on IO to return an EINTR
4258   Note: this explicitly does NOT call JVM_handle_solaris_signal and
4259   does NOT participate in signal chaining due to requirement for
4260   NOT setting SA_RESTART to make EINTR work. */
4261extern "C" void sigINTRHandler(int sig, siginfo_t* info, void* ucVoid) {
4262   if (UseSignalChaining) {
4263      struct sigaction *actp = os::Solaris::get_chained_signal_action(sig);
4264      if (actp && actp->sa_handler) {
4265        vm_exit_during_initialization("Signal chaining detected for VM interrupt signal, try -XX:+UseAltSigs");
4266      }
4267   }
4268}
4269
4270// This boolean allows users to forward their own non-matching signals
4271// to JVM_handle_solaris_signal, harmlessly.
4272bool os::Solaris::signal_handlers_are_installed = false;
4273
4274// For signal-chaining
4275bool os::Solaris::libjsig_is_loaded = false;
4276typedef struct sigaction *(*get_signal_t)(int);
4277get_signal_t os::Solaris::get_signal_action = NULL;
4278
4279struct sigaction* os::Solaris::get_chained_signal_action(int sig) {
4280  struct sigaction *actp = NULL;
4281
4282  if ((libjsig_is_loaded)  && (sig <= Maxlibjsigsigs)) {
4283    // Retrieve the old signal handler from libjsig
4284    actp = (*get_signal_action)(sig);
4285  }
4286  if (actp == NULL) {
4287    // Retrieve the preinstalled signal handler from jvm
4288    actp = get_preinstalled_handler(sig);
4289  }
4290
4291  return actp;
4292}
4293
4294static bool call_chained_handler(struct sigaction *actp, int sig,
4295                                 siginfo_t *siginfo, void *context) {
4296  // Call the old signal handler
4297  if (actp->sa_handler == SIG_DFL) {
4298    // It's more reasonable to let jvm treat it as an unexpected exception
4299    // instead of taking the default action.
4300    return false;
4301  } else if (actp->sa_handler != SIG_IGN) {
4302    if ((actp->sa_flags & SA_NODEFER) == 0) {
4303      // automaticlly block the signal
4304      sigaddset(&(actp->sa_mask), sig);
4305    }
4306
4307    sa_handler_t hand;
4308    sa_sigaction_t sa;
4309    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
4310    // retrieve the chained handler
4311    if (siginfo_flag_set) {
4312      sa = actp->sa_sigaction;
4313    } else {
4314      hand = actp->sa_handler;
4315    }
4316
4317    if ((actp->sa_flags & SA_RESETHAND) != 0) {
4318      actp->sa_handler = SIG_DFL;
4319    }
4320
4321    // try to honor the signal mask
4322    sigset_t oset;
4323    thr_sigsetmask(SIG_SETMASK, &(actp->sa_mask), &oset);
4324
4325    // call into the chained handler
4326    if (siginfo_flag_set) {
4327      (*sa)(sig, siginfo, context);
4328    } else {
4329      (*hand)(sig);
4330    }
4331
4332    // restore the signal mask
4333    thr_sigsetmask(SIG_SETMASK, &oset, 0);
4334  }
4335  // Tell jvm's signal handler the signal is taken care of.
4336  return true;
4337}
4338
4339bool os::Solaris::chained_handler(int sig, siginfo_t* siginfo, void* context) {
4340  bool chained = false;
4341  // signal-chaining
4342  if (UseSignalChaining) {
4343    struct sigaction *actp = get_chained_signal_action(sig);
4344    if (actp != NULL) {
4345      chained = call_chained_handler(actp, sig, siginfo, context);
4346    }
4347  }
4348  return chained;
4349}
4350
4351struct sigaction* os::Solaris::get_preinstalled_handler(int sig) {
4352  assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4353  if (preinstalled_sigs[sig] != 0) {
4354    return &chainedsigactions[sig];
4355  }
4356  return NULL;
4357}
4358
4359void os::Solaris::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
4360
4361  assert(sig > 0 && sig <= Maxsignum, "vm signal out of expected range");
4362  assert((chainedsigactions != (struct sigaction *)NULL) && (preinstalled_sigs != (int *)NULL) , "signals not yet initialized");
4363  chainedsigactions[sig] = oldAct;
4364  preinstalled_sigs[sig] = 1;
4365}
4366
4367void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain) {
4368  // Check for overwrite.
4369  struct sigaction oldAct;
4370  sigaction(sig, (struct sigaction*)NULL, &oldAct);
4371  void* oldhand = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*,  oldAct.sa_sigaction)
4372                                      : CAST_FROM_FN_PTR(void*,  oldAct.sa_handler);
4373  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
4374      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
4375      oldhand != CAST_FROM_FN_PTR(void*, signalHandler)) {
4376    if (AllowUserSignalHandlers || !set_installed) {
4377      // Do not overwrite; user takes responsibility to forward to us.
4378      return;
4379    } else if (UseSignalChaining) {
4380      if (oktochain) {
4381        // save the old handler in jvm
4382        save_preinstalled_handler(sig, oldAct);
4383      } else {
4384        vm_exit_during_initialization("Signal chaining not allowed for VM interrupt signal, try -XX:+UseAltSigs.");
4385      }
4386      // libjsig also interposes the sigaction() call below and saves the
4387      // old sigaction on it own.
4388    } else {
4389      fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
4390                    "%#lx for signal %d.", (long)oldhand, sig));
4391    }
4392  }
4393
4394  struct sigaction sigAct;
4395  sigfillset(&(sigAct.sa_mask));
4396  sigAct.sa_handler = SIG_DFL;
4397
4398  sigAct.sa_sigaction = signalHandler;
4399  // Handle SIGSEGV on alternate signal stack if
4400  // not using stack banging
4401  if (!UseStackBanging && sig == SIGSEGV) {
4402    sigAct.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
4403  // Interruptible i/o requires SA_RESTART cleared so EINTR
4404  // is returned instead of restarting system calls
4405  } else if (sig == os::Solaris::SIGinterrupt()) {
4406    sigemptyset(&sigAct.sa_mask);
4407    sigAct.sa_handler = NULL;
4408    sigAct.sa_flags = SA_SIGINFO;
4409    sigAct.sa_sigaction = sigINTRHandler;
4410  } else {
4411    sigAct.sa_flags = SA_SIGINFO | SA_RESTART;
4412  }
4413  os::Solaris::set_our_sigflags(sig, sigAct.sa_flags);
4414
4415  sigaction(sig, &sigAct, &oldAct);
4416
4417  void* oldhand2 = oldAct.sa_sigaction ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
4418                                       : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
4419  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
4420}
4421
4422
4423#define DO_SIGNAL_CHECK(sig) \
4424  if (!sigismember(&check_signal_done, sig)) \
4425    os::Solaris::check_signal_handler(sig)
4426
4427// This method is a periodic task to check for misbehaving JNI applications
4428// under CheckJNI, we can add any periodic checks here
4429
4430void os::run_periodic_checks() {
4431  // A big source of grief is hijacking virt. addr 0x0 on Solaris,
4432  // thereby preventing a NULL checks.
4433  if(!check_addr0_done) check_addr0_done = check_addr0(tty);
4434
4435  if (check_signals == false) return;
4436
4437  // SEGV and BUS if overridden could potentially prevent
4438  // generation of hs*.log in the event of a crash, debugging
4439  // such a case can be very challenging, so we absolutely
4440  // check for the following for a good measure:
4441  DO_SIGNAL_CHECK(SIGSEGV);
4442  DO_SIGNAL_CHECK(SIGILL);
4443  DO_SIGNAL_CHECK(SIGFPE);
4444  DO_SIGNAL_CHECK(SIGBUS);
4445  DO_SIGNAL_CHECK(SIGPIPE);
4446  DO_SIGNAL_CHECK(SIGXFSZ);
4447
4448  // ReduceSignalUsage allows the user to override these handlers
4449  // see comments at the very top and jvm_solaris.h
4450  if (!ReduceSignalUsage) {
4451    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
4452    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
4453    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
4454    DO_SIGNAL_CHECK(BREAK_SIGNAL);
4455  }
4456
4457  // See comments above for using JVM1/JVM2 and UseAltSigs
4458  DO_SIGNAL_CHECK(os::Solaris::SIGinterrupt());
4459  DO_SIGNAL_CHECK(os::Solaris::SIGasync());
4460
4461}
4462
4463typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
4464
4465static os_sigaction_t os_sigaction = NULL;
4466
4467void os::Solaris::check_signal_handler(int sig) {
4468  char buf[O_BUFLEN];
4469  address jvmHandler = NULL;
4470
4471  struct sigaction act;
4472  if (os_sigaction == NULL) {
4473    // only trust the default sigaction, in case it has been interposed
4474    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
4475    if (os_sigaction == NULL) return;
4476  }
4477
4478  os_sigaction(sig, (struct sigaction*)NULL, &act);
4479
4480  address thisHandler = (act.sa_flags & SA_SIGINFO)
4481    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
4482    : CAST_FROM_FN_PTR(address, act.sa_handler) ;
4483
4484
4485  switch(sig) {
4486    case SIGSEGV:
4487    case SIGBUS:
4488    case SIGFPE:
4489    case SIGPIPE:
4490    case SIGXFSZ:
4491    case SIGILL:
4492      jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4493      break;
4494
4495    case SHUTDOWN1_SIGNAL:
4496    case SHUTDOWN2_SIGNAL:
4497    case SHUTDOWN3_SIGNAL:
4498    case BREAK_SIGNAL:
4499      jvmHandler = (address)user_handler();
4500      break;
4501
4502    default:
4503      int intrsig = os::Solaris::SIGinterrupt();
4504      int asynsig = os::Solaris::SIGasync();
4505
4506      if (sig == intrsig) {
4507        jvmHandler = CAST_FROM_FN_PTR(address, sigINTRHandler);
4508      } else if (sig == asynsig) {
4509        jvmHandler = CAST_FROM_FN_PTR(address, signalHandler);
4510      } else {
4511        return;
4512      }
4513      break;
4514  }
4515
4516
4517  if (thisHandler != jvmHandler) {
4518    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
4519    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
4520    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
4521    // No need to check this sig any longer
4522    sigaddset(&check_signal_done, sig);
4523  } else if(os::Solaris::get_our_sigflags(sig) != 0 && act.sa_flags != os::Solaris::get_our_sigflags(sig)) {
4524    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
4525    tty->print("expected:" PTR32_FORMAT, os::Solaris::get_our_sigflags(sig));
4526    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
4527    // No need to check this sig any longer
4528    sigaddset(&check_signal_done, sig);
4529  }
4530
4531  // Print all the signal handler state
4532  if (sigismember(&check_signal_done, sig)) {
4533    print_signal_handlers(tty, buf, O_BUFLEN);
4534  }
4535
4536}
4537
4538void os::Solaris::install_signal_handlers() {
4539  bool libjsigdone = false;
4540  signal_handlers_are_installed = true;
4541
4542  // signal-chaining
4543  typedef void (*signal_setting_t)();
4544  signal_setting_t begin_signal_setting = NULL;
4545  signal_setting_t end_signal_setting = NULL;
4546  begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4547                                        dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
4548  if (begin_signal_setting != NULL) {
4549    end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
4550                                        dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
4551    get_signal_action = CAST_TO_FN_PTR(get_signal_t,
4552                                       dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
4553    get_libjsig_version = CAST_TO_FN_PTR(version_getting_t,
4554                                         dlsym(RTLD_DEFAULT, "JVM_get_libjsig_version"));
4555    libjsig_is_loaded = true;
4556    if (os::Solaris::get_libjsig_version != NULL) {
4557      libjsigversion =  (*os::Solaris::get_libjsig_version)();
4558    }
4559    assert(UseSignalChaining, "should enable signal-chaining");
4560  }
4561  if (libjsig_is_loaded) {
4562    // Tell libjsig jvm is setting signal handlers
4563    (*begin_signal_setting)();
4564  }
4565
4566  set_signal_handler(SIGSEGV, true, true);
4567  set_signal_handler(SIGPIPE, true, true);
4568  set_signal_handler(SIGXFSZ, true, true);
4569  set_signal_handler(SIGBUS, true, true);
4570  set_signal_handler(SIGILL, true, true);
4571  set_signal_handler(SIGFPE, true, true);
4572
4573
4574  if (os::Solaris::SIGinterrupt() > OLDMAXSIGNUM || os::Solaris::SIGasync() > OLDMAXSIGNUM) {
4575
4576    // Pre-1.4.1 Libjsig limited to signal chaining signals <= 32 so
4577    // can not register overridable signals which might be > 32
4578    if (libjsig_is_loaded && libjsigversion <= JSIG_VERSION_1_4_1) {
4579    // Tell libjsig jvm has finished setting signal handlers
4580      (*end_signal_setting)();
4581      libjsigdone = true;
4582    }
4583  }
4584
4585  // Never ok to chain our SIGinterrupt
4586  set_signal_handler(os::Solaris::SIGinterrupt(), true, false);
4587  set_signal_handler(os::Solaris::SIGasync(), true, true);
4588
4589  if (libjsig_is_loaded && !libjsigdone) {
4590    // Tell libjsig jvm finishes setting signal handlers
4591    (*end_signal_setting)();
4592  }
4593
4594  // We don't activate signal checker if libjsig is in place, we trust ourselves
4595  // and if UserSignalHandler is installed all bets are off
4596  if (CheckJNICalls) {
4597    if (libjsig_is_loaded) {
4598      tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
4599      check_signals = false;
4600    }
4601    if (AllowUserSignalHandlers) {
4602      tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
4603      check_signals = false;
4604    }
4605  }
4606}
4607
4608
4609void report_error(const char* file_name, int line_no, const char* title, const char* format, ...);
4610
4611const char * signames[] = {
4612  "SIG0",
4613  "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
4614  "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS",
4615  "SIGSEGV", "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM",
4616  "SIGUSR1", "SIGUSR2", "SIGCLD", "SIGPWR", "SIGWINCH",
4617  "SIGURG", "SIGPOLL", "SIGSTOP", "SIGTSTP", "SIGCONT",
4618  "SIGTTIN", "SIGTTOU", "SIGVTALRM", "SIGPROF", "SIGXCPU",
4619  "SIGXFSZ", "SIGWAITING", "SIGLWP", "SIGFREEZE", "SIGTHAW",
4620  "SIGCANCEL", "SIGLOST"
4621};
4622
4623const char* os::exception_name(int exception_code, char* buf, size_t size) {
4624  if (0 < exception_code && exception_code <= SIGRTMAX) {
4625    // signal
4626    if (exception_code < sizeof(signames)/sizeof(const char*)) {
4627       jio_snprintf(buf, size, "%s", signames[exception_code]);
4628    } else {
4629       jio_snprintf(buf, size, "SIG%d", exception_code);
4630    }
4631    return buf;
4632  } else {
4633    return NULL;
4634  }
4635}
4636
4637// (Static) wrappers for the new libthread API
4638int_fnP_thread_t_iP_uP_stack_tP_gregset_t os::Solaris::_thr_getstate;
4639int_fnP_thread_t_i_gregset_t os::Solaris::_thr_setstate;
4640int_fnP_thread_t_i os::Solaris::_thr_setmutator;
4641int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
4642int_fnP_thread_t os::Solaris::_thr_continue_mutator;
4643
4644// (Static) wrapper for getisax(2) call.
4645os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
4646
4647// (Static) wrappers for the liblgrp API
4648os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
4649os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
4650os::Solaris::lgrp_fini_func_t os::Solaris::_lgrp_fini;
4651os::Solaris::lgrp_root_func_t os::Solaris::_lgrp_root;
4652os::Solaris::lgrp_children_func_t os::Solaris::_lgrp_children;
4653os::Solaris::lgrp_resources_func_t os::Solaris::_lgrp_resources;
4654os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
4655os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
4656os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
4657
4658// (Static) wrapper for meminfo() call.
4659os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
4660
4661static address resolve_symbol_lazy(const char* name) {
4662  address addr = (address) dlsym(RTLD_DEFAULT, name);
4663  if(addr == NULL) {
4664    // RTLD_DEFAULT was not defined on some early versions of 2.5.1
4665    addr = (address) dlsym(RTLD_NEXT, name);
4666  }
4667  return addr;
4668}
4669
4670static address resolve_symbol(const char* name) {
4671  address addr = resolve_symbol_lazy(name);
4672  if(addr == NULL) {
4673    fatal(dlerror());
4674  }
4675  return addr;
4676}
4677
4678
4679
4680// isT2_libthread()
4681//
4682// Routine to determine if we are currently using the new T2 libthread.
4683//
4684// We determine if we are using T2 by reading /proc/self/lstatus and
4685// looking for a thread with the ASLWP bit set.  If we find this status
4686// bit set, we must assume that we are NOT using T2.  The T2 team
4687// has approved this algorithm.
4688//
4689// We need to determine if we are running with the new T2 libthread
4690// since setting native thread priorities is handled differently
4691// when using this library.  All threads created using T2 are bound
4692// threads. Calling thr_setprio is meaningless in this case.
4693//
4694bool isT2_libthread() {
4695  static prheader_t * lwpArray = NULL;
4696  static int lwpSize = 0;
4697  static int lwpFile = -1;
4698  lwpstatus_t * that;
4699  char lwpName [128];
4700  bool isT2 = false;
4701
4702#define ADR(x)  ((uintptr_t)(x))
4703#define LWPINDEX(ary,ix)   ((lwpstatus_t *)(((ary)->pr_entsize * (ix)) + (ADR((ary) + 1))))
4704
4705  lwpFile = ::open("/proc/self/lstatus", O_RDONLY, 0);
4706  if (lwpFile < 0) {
4707      if (ThreadPriorityVerbose) warning ("Couldn't open /proc/self/lstatus\n");
4708      return false;
4709  }
4710  lwpSize = 16*1024;
4711  for (;;) {
4712    ::lseek64 (lwpFile, 0, SEEK_SET);
4713    lwpArray = (prheader_t *)NEW_C_HEAP_ARRAY(char, lwpSize);
4714    if (::read(lwpFile, lwpArray, lwpSize) < 0) {
4715      if (ThreadPriorityVerbose) warning("Error reading /proc/self/lstatus\n");
4716      break;
4717    }
4718    if ((lwpArray->pr_nent * lwpArray->pr_entsize) <= lwpSize) {
4719       // We got a good snapshot - now iterate over the list.
4720      int aslwpcount = 0;
4721      for (int i = 0; i < lwpArray->pr_nent; i++ ) {
4722        that = LWPINDEX(lwpArray,i);
4723        if (that->pr_flags & PR_ASLWP) {
4724          aslwpcount++;
4725        }
4726      }
4727      if (aslwpcount == 0) isT2 = true;
4728      break;
4729    }
4730    lwpSize = lwpArray->pr_nent * lwpArray->pr_entsize;
4731    FREE_C_HEAP_ARRAY(char, lwpArray);  // retry.
4732  }
4733
4734  FREE_C_HEAP_ARRAY(char, lwpArray);
4735  ::close (lwpFile);
4736  if (ThreadPriorityVerbose) {
4737    if (isT2) tty->print_cr("We are running with a T2 libthread\n");
4738    else tty->print_cr("We are not running with a T2 libthread\n");
4739  }
4740  return isT2;
4741}
4742
4743
4744void os::Solaris::libthread_init() {
4745  address func = (address)dlsym(RTLD_DEFAULT, "_thr_suspend_allmutators");
4746
4747  // Determine if we are running with the new T2 libthread
4748  os::Solaris::set_T2_libthread(isT2_libthread());
4749
4750  lwp_priocntl_init();
4751
4752  // RTLD_DEFAULT was not defined on some early versions of 5.5.1
4753  if(func == NULL) {
4754    func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
4755    // Guarantee that this VM is running on an new enough OS (5.6 or
4756    // later) that it will have a new enough libthread.so.
4757    guarantee(func != NULL, "libthread.so is too old.");
4758  }
4759
4760  // Initialize the new libthread getstate API wrappers
4761  func = resolve_symbol("thr_getstate");
4762  os::Solaris::set_thr_getstate(CAST_TO_FN_PTR(int_fnP_thread_t_iP_uP_stack_tP_gregset_t, func));
4763
4764  func = resolve_symbol("thr_setstate");
4765  os::Solaris::set_thr_setstate(CAST_TO_FN_PTR(int_fnP_thread_t_i_gregset_t, func));
4766
4767  func = resolve_symbol("thr_setmutator");
4768  os::Solaris::set_thr_setmutator(CAST_TO_FN_PTR(int_fnP_thread_t_i, func));
4769
4770  func = resolve_symbol("thr_suspend_mutator");
4771  os::Solaris::set_thr_suspend_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4772
4773  func = resolve_symbol("thr_continue_mutator");
4774  os::Solaris::set_thr_continue_mutator(CAST_TO_FN_PTR(int_fnP_thread_t, func));
4775
4776  int size;
4777  void (*handler_info_func)(address *, int *);
4778  handler_info_func = CAST_TO_FN_PTR(void (*)(address *, int *), resolve_symbol("thr_sighndlrinfo"));
4779  handler_info_func(&handler_start, &size);
4780  handler_end = handler_start + size;
4781}
4782
4783
4784int_fnP_mutex_tP os::Solaris::_mutex_lock;
4785int_fnP_mutex_tP os::Solaris::_mutex_trylock;
4786int_fnP_mutex_tP os::Solaris::_mutex_unlock;
4787int_fnP_mutex_tP_i_vP os::Solaris::_mutex_init;
4788int_fnP_mutex_tP os::Solaris::_mutex_destroy;
4789int os::Solaris::_mutex_scope = USYNC_THREAD;
4790
4791int_fnP_cond_tP_mutex_tP_timestruc_tP os::Solaris::_cond_timedwait;
4792int_fnP_cond_tP_mutex_tP os::Solaris::_cond_wait;
4793int_fnP_cond_tP os::Solaris::_cond_signal;
4794int_fnP_cond_tP os::Solaris::_cond_broadcast;
4795int_fnP_cond_tP_i_vP os::Solaris::_cond_init;
4796int_fnP_cond_tP os::Solaris::_cond_destroy;
4797int os::Solaris::_cond_scope = USYNC_THREAD;
4798
4799void os::Solaris::synchronization_init() {
4800  if(UseLWPSynchronization) {
4801    os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
4802    os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
4803    os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
4804    os::Solaris::set_mutex_init(lwp_mutex_init);
4805    os::Solaris::set_mutex_destroy(lwp_mutex_destroy);
4806    os::Solaris::set_mutex_scope(USYNC_THREAD);
4807
4808    os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("_lwp_cond_timedwait")));
4809    os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("_lwp_cond_wait")));
4810    os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_signal")));
4811    os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("_lwp_cond_broadcast")));
4812    os::Solaris::set_cond_init(lwp_cond_init);
4813    os::Solaris::set_cond_destroy(lwp_cond_destroy);
4814    os::Solaris::set_cond_scope(USYNC_THREAD);
4815  }
4816  else {
4817    os::Solaris::set_mutex_scope(USYNC_THREAD);
4818    os::Solaris::set_cond_scope(USYNC_THREAD);
4819
4820    if(UsePthreads) {
4821      os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
4822      os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
4823      os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
4824      os::Solaris::set_mutex_init(pthread_mutex_default_init);
4825      os::Solaris::set_mutex_destroy(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_destroy")));
4826
4827      os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("pthread_cond_timedwait")));
4828      os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("pthread_cond_wait")));
4829      os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_signal")));
4830      os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_broadcast")));
4831      os::Solaris::set_cond_init(pthread_cond_default_init);
4832      os::Solaris::set_cond_destroy(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("pthread_cond_destroy")));
4833    }
4834    else {
4835      os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_lock")));
4836      os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_trylock")));
4837      os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("mutex_unlock")));
4838      os::Solaris::set_mutex_init(::mutex_init);
4839      os::Solaris::set_mutex_destroy(::mutex_destroy);
4840
4841      os::Solaris::set_cond_timedwait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP_timestruc_tP, resolve_symbol("cond_timedwait")));
4842      os::Solaris::set_cond_wait(CAST_TO_FN_PTR(int_fnP_cond_tP_mutex_tP, resolve_symbol("cond_wait")));
4843      os::Solaris::set_cond_signal(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_signal")));
4844      os::Solaris::set_cond_broadcast(CAST_TO_FN_PTR(int_fnP_cond_tP, resolve_symbol("cond_broadcast")));
4845      os::Solaris::set_cond_init(::cond_init);
4846      os::Solaris::set_cond_destroy(::cond_destroy);
4847    }
4848  }
4849}
4850
4851bool os::Solaris::liblgrp_init() {
4852  void *handle = dlopen("liblgrp.so.1", RTLD_LAZY);
4853  if (handle != NULL) {
4854    os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home")));
4855    os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init")));
4856    os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini")));
4857    os::Solaris::set_lgrp_root(CAST_TO_FN_PTR(lgrp_root_func_t, dlsym(handle, "lgrp_root")));
4858    os::Solaris::set_lgrp_children(CAST_TO_FN_PTR(lgrp_children_func_t, dlsym(handle, "lgrp_children")));
4859    os::Solaris::set_lgrp_resources(CAST_TO_FN_PTR(lgrp_resources_func_t, dlsym(handle, "lgrp_resources")));
4860    os::Solaris::set_lgrp_nlgrps(CAST_TO_FN_PTR(lgrp_nlgrps_func_t, dlsym(handle, "lgrp_nlgrps")));
4861    os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t,
4862                                       dlsym(handle, "lgrp_cookie_stale")));
4863
4864    lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER);
4865    set_lgrp_cookie(c);
4866    return true;
4867  }
4868  return false;
4869}
4870
4871void os::Solaris::misc_sym_init() {
4872  address func;
4873
4874  // getisax
4875  func = resolve_symbol_lazy("getisax");
4876  if (func != NULL) {
4877    os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
4878  }
4879
4880  // meminfo
4881  func = resolve_symbol_lazy("meminfo");
4882  if (func != NULL) {
4883    os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
4884  }
4885}
4886
4887uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
4888  assert(_getisax != NULL, "_getisax not set");
4889  return _getisax(array, n);
4890}
4891
4892// Symbol doesn't exist in Solaris 8 pset.h
4893#ifndef PS_MYID
4894#define PS_MYID -3
4895#endif
4896
4897// int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
4898typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
4899static pset_getloadavg_type pset_getloadavg_ptr = NULL;
4900
4901void init_pset_getloadavg_ptr(void) {
4902  pset_getloadavg_ptr =
4903    (pset_getloadavg_type)dlsym(RTLD_DEFAULT, "pset_getloadavg");
4904  if (PrintMiscellaneous && Verbose && pset_getloadavg_ptr == NULL) {
4905    warning("pset_getloadavg function not found");
4906  }
4907}
4908
4909int os::Solaris::_dev_zero_fd = -1;
4910
4911// this is called _before_ the global arguments have been parsed
4912void os::init(void) {
4913  _initial_pid = getpid();
4914
4915  max_hrtime = first_hrtime = gethrtime();
4916
4917  init_random(1234567);
4918
4919  page_size = sysconf(_SC_PAGESIZE);
4920  if (page_size == -1)
4921    fatal(err_msg("os_solaris.cpp: os::init: sysconf failed (%s)",
4922                  strerror(errno)));
4923  init_page_sizes((size_t) page_size);
4924
4925  Solaris::initialize_system_info();
4926
4927  // Initialize misc. symbols as soon as possible, so we can use them
4928  // if we need them.
4929  Solaris::misc_sym_init();
4930
4931  int fd = ::open("/dev/zero", O_RDWR);
4932  if (fd < 0) {
4933    fatal(err_msg("os::init: cannot open /dev/zero (%s)", strerror(errno)));
4934  } else {
4935    Solaris::set_dev_zero_fd(fd);
4936
4937    // Close on exec, child won't inherit.
4938    fcntl(fd, F_SETFD, FD_CLOEXEC);
4939  }
4940
4941  clock_tics_per_sec = CLK_TCK;
4942
4943  // check if dladdr1() exists; dladdr1 can provide more information than
4944  // dladdr for os::dll_address_to_function_name. It comes with SunOS 5.9
4945  // and is available on linker patches for 5.7 and 5.8.
4946  // libdl.so must have been loaded, this call is just an entry lookup
4947  void * hdl = dlopen("libdl.so", RTLD_NOW);
4948  if (hdl)
4949    dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1"));
4950
4951  // (Solaris only) this switches to calls that actually do locking.
4952  ThreadCritical::initialize();
4953
4954  main_thread = thr_self();
4955
4956  // Constant minimum stack size allowed. It must be at least
4957  // the minimum of what the OS supports (thr_min_stack()), and
4958  // enough to allow the thread to get to user bytecode execution.
4959  Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
4960  // If the pagesize of the VM is greater than 8K determine the appropriate
4961  // number of initial guard pages.  The user can change this with the
4962  // command line arguments, if needed.
4963  if (vm_page_size() > 8*K) {
4964    StackYellowPages = 1;
4965    StackRedPages = 1;
4966    StackShadowPages = round_to((StackShadowPages*8*K), vm_page_size()) / vm_page_size();
4967  }
4968}
4969
4970// To install functions for atexit system call
4971extern "C" {
4972  static void perfMemory_exit_helper() {
4973    perfMemory_exit();
4974  }
4975}
4976
4977// this is called _after_ the global arguments have been parsed
4978jint os::init_2(void) {
4979  // try to enable extended file IO ASAP, see 6431278
4980  os::Solaris::try_enable_extended_io();
4981
4982  // Allocate a single page and mark it as readable for safepoint polling.  Also
4983  // use this first mmap call to check support for MAP_ALIGN.
4984  address polling_page = (address)Solaris::mmap_chunk((char*)page_size,
4985                                                      page_size,
4986                                                      MAP_PRIVATE | MAP_ALIGN,
4987                                                      PROT_READ);
4988  if (polling_page == NULL) {
4989    has_map_align = false;
4990    polling_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE,
4991                                                PROT_READ);
4992  }
4993
4994  os::set_polling_page(polling_page);
4995
4996#ifndef PRODUCT
4997  if( Verbose && PrintMiscellaneous )
4998    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
4999#endif
5000
5001  if (!UseMembar) {
5002    address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE );
5003    guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
5004    os::set_memory_serialize_page( mem_serialize_page );
5005
5006#ifndef PRODUCT
5007    if(Verbose && PrintMiscellaneous)
5008      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
5009#endif
5010}
5011
5012  os::large_page_init();
5013
5014  // Check minimum allowable stack size for thread creation and to initialize
5015  // the java system classes, including StackOverflowError - depends on page
5016  // size.  Add a page for compiler2 recursion in main thread.
5017  // Add in 2*BytesPerWord times page size to account for VM stack during
5018  // class initialization depending on 32 or 64 bit VM.
5019  os::Solaris::min_stack_allowed = MAX2(os::Solaris::min_stack_allowed,
5020            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
5021                    2*BytesPerWord COMPILER2_PRESENT(+1)) * page_size);
5022
5023  size_t threadStackSizeInBytes = ThreadStackSize * K;
5024  if (threadStackSizeInBytes != 0 &&
5025    threadStackSizeInBytes < os::Solaris::min_stack_allowed) {
5026    tty->print_cr("\nThe stack size specified is too small, Specify at least %dk",
5027                  os::Solaris::min_stack_allowed/K);
5028    return JNI_ERR;
5029  }
5030
5031  // For 64kbps there will be a 64kb page size, which makes
5032  // the usable default stack size quite a bit less.  Increase the
5033  // stack for 64kb (or any > than 8kb) pages, this increases
5034  // virtual memory fragmentation (since we're not creating the
5035  // stack on a power of 2 boundary.  The real fix for this
5036  // should be to fix the guard page mechanism.
5037
5038  if (vm_page_size() > 8*K) {
5039      threadStackSizeInBytes = (threadStackSizeInBytes != 0)
5040         ? threadStackSizeInBytes +
5041           ((StackYellowPages + StackRedPages) * vm_page_size())
5042         : 0;
5043      ThreadStackSize = threadStackSizeInBytes/K;
5044  }
5045
5046  // Make the stack size a multiple of the page size so that
5047  // the yellow/red zones can be guarded.
5048  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
5049        vm_page_size()));
5050
5051  Solaris::libthread_init();
5052
5053  if (UseNUMA) {
5054    if (!Solaris::liblgrp_init()) {
5055      UseNUMA = false;
5056    } else {
5057      size_t lgrp_limit = os::numa_get_groups_num();
5058      int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit);
5059      size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
5060      FREE_C_HEAP_ARRAY(int, lgrp_ids);
5061      if (lgrp_num < 2) {
5062        // There's only one locality group, disable NUMA.
5063        UseNUMA = false;
5064      }
5065    }
5066    // ISM is not compatible with the NUMA allocator - it always allocates
5067    // pages round-robin across the lgroups.
5068    if (UseNUMA && UseLargePages && UseISM) {
5069      if (!FLAG_IS_DEFAULT(UseNUMA)) {
5070        if (FLAG_IS_DEFAULT(UseLargePages) && FLAG_IS_DEFAULT(UseISM)) {
5071          UseLargePages = false;
5072        } else {
5073          warning("UseNUMA is not compatible with ISM large pages, disabling NUMA allocator");
5074          UseNUMA = false;
5075        }
5076      } else {
5077        UseNUMA = false;
5078      }
5079    }
5080    if (!UseNUMA && ForceNUMA) {
5081      UseNUMA = true;
5082    }
5083  }
5084
5085  Solaris::signal_sets_init();
5086  Solaris::init_signal_mem();
5087  Solaris::install_signal_handlers();
5088
5089  if (libjsigversion < JSIG_VERSION_1_4_1) {
5090    Maxlibjsigsigs = OLDMAXSIGNUM;
5091  }
5092
5093  // initialize synchronization primitives to use either thread or
5094  // lwp synchronization (controlled by UseLWPSynchronization)
5095  Solaris::synchronization_init();
5096
5097  if (MaxFDLimit) {
5098    // set the number of file descriptors to max. print out error
5099    // if getrlimit/setrlimit fails but continue regardless.
5100    struct rlimit nbr_files;
5101    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
5102    if (status != 0) {
5103      if (PrintMiscellaneous && (Verbose || WizardMode))
5104        perror("os::init_2 getrlimit failed");
5105    } else {
5106      nbr_files.rlim_cur = nbr_files.rlim_max;
5107      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
5108      if (status != 0) {
5109        if (PrintMiscellaneous && (Verbose || WizardMode))
5110          perror("os::init_2 setrlimit failed");
5111      }
5112    }
5113  }
5114
5115  // Calculate theoretical max. size of Threads to guard gainst
5116  // artifical out-of-memory situations, where all available address-
5117  // space has been reserved by thread stacks. Default stack size is 1Mb.
5118  size_t pre_thread_stack_size = (JavaThread::stack_size_at_create()) ?
5119    JavaThread::stack_size_at_create() : (1*K*K);
5120  assert(pre_thread_stack_size != 0, "Must have a stack");
5121  // Solaris has a maximum of 4Gb of user programs. Calculate the thread limit when
5122  // we should start doing Virtual Memory banging. Currently when the threads will
5123  // have used all but 200Mb of space.
5124  size_t max_address_space = ((unsigned int)4 * K * K * K) - (200 * K * K);
5125  Solaris::_os_thread_limit = max_address_space / pre_thread_stack_size;
5126
5127  // at-exit methods are called in the reverse order of their registration.
5128  // In Solaris 7 and earlier, atexit functions are called on return from
5129  // main or as a result of a call to exit(3C). There can be only 32 of
5130  // these functions registered and atexit() does not set errno. In Solaris
5131  // 8 and later, there is no limit to the number of functions registered
5132  // and atexit() sets errno. In addition, in Solaris 8 and later, atexit
5133  // functions are called upon dlclose(3DL) in addition to return from main
5134  // and exit(3C).
5135
5136  if (PerfAllowAtExitRegistration) {
5137    // only register atexit functions if PerfAllowAtExitRegistration is set.
5138    // atexit functions can be delayed until process exit time, which
5139    // can be problematic for embedded VM situations. Embedded VMs should
5140    // call DestroyJavaVM() to assure that VM resources are released.
5141
5142    // note: perfMemory_exit_helper atexit function may be removed in
5143    // the future if the appropriate cleanup code can be added to the
5144    // VM_Exit VMOperation's doit method.
5145    if (atexit(perfMemory_exit_helper) != 0) {
5146      warning("os::init2 atexit(perfMemory_exit_helper) failed");
5147    }
5148  }
5149
5150  // Init pset_loadavg function pointer
5151  init_pset_getloadavg_ptr();
5152
5153  return JNI_OK;
5154}
5155
5156void os::init_3(void) {
5157  return;
5158}
5159
5160// Mark the polling page as unreadable
5161void os::make_polling_page_unreadable(void) {
5162  if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
5163    fatal("Could not disable polling page");
5164};
5165
5166// Mark the polling page as readable
5167void os::make_polling_page_readable(void) {
5168  if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 )
5169    fatal("Could not enable polling page");
5170};
5171
5172// OS interface.
5173
5174bool os::check_heap(bool force) { return true; }
5175
5176typedef int (*vsnprintf_t)(char* buf, size_t count, const char* fmt, va_list argptr);
5177static vsnprintf_t sol_vsnprintf = NULL;
5178
5179int local_vsnprintf(char* buf, size_t count, const char* fmt, va_list argptr) {
5180  if (!sol_vsnprintf) {
5181    //search  for the named symbol in the objects that were loaded after libjvm
5182    void* where = RTLD_NEXT;
5183    if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
5184        sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
5185    if (!sol_vsnprintf){
5186      //search  for the named symbol in the objects that were loaded before libjvm
5187      where = RTLD_DEFAULT;
5188      if ((sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "__vsnprintf"))) == NULL)
5189        sol_vsnprintf = CAST_TO_FN_PTR(vsnprintf_t, dlsym(where, "vsnprintf"));
5190      assert(sol_vsnprintf != NULL, "vsnprintf not found");
5191    }
5192  }
5193  return (*sol_vsnprintf)(buf, count, fmt, argptr);
5194}
5195
5196
5197// Is a (classpath) directory empty?
5198bool os::dir_is_empty(const char* path) {
5199  DIR *dir = NULL;
5200  struct dirent *ptr;
5201
5202  dir = opendir(path);
5203  if (dir == NULL) return true;
5204
5205  /* Scan the directory */
5206  bool result = true;
5207  char buf[sizeof(struct dirent) + MAX_PATH];
5208  struct dirent *dbuf = (struct dirent *) buf;
5209  while (result && (ptr = readdir(dir, dbuf)) != NULL) {
5210    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
5211      result = false;
5212    }
5213  }
5214  closedir(dir);
5215  return result;
5216}
5217
5218// This code originates from JDK's sysOpen and open64_w
5219// from src/solaris/hpi/src/system_md.c
5220
5221#ifndef O_DELETE
5222#define O_DELETE 0x10000
5223#endif
5224
5225// Open a file. Unlink the file immediately after open returns
5226// if the specified oflag has the O_DELETE flag set.
5227// O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c
5228
5229int os::open(const char *path, int oflag, int mode) {
5230  if (strlen(path) > MAX_PATH - 1) {
5231    errno = ENAMETOOLONG;
5232    return -1;
5233  }
5234  int fd;
5235  int o_delete = (oflag & O_DELETE);
5236  oflag = oflag & ~O_DELETE;
5237
5238  fd = ::open64(path, oflag, mode);
5239  if (fd == -1) return -1;
5240
5241  //If the open succeeded, the file might still be a directory
5242  {
5243    struct stat64 buf64;
5244    int ret = ::fstat64(fd, &buf64);
5245    int st_mode = buf64.st_mode;
5246
5247    if (ret != -1) {
5248      if ((st_mode & S_IFMT) == S_IFDIR) {
5249        errno = EISDIR;
5250        ::close(fd);
5251        return -1;
5252      }
5253    } else {
5254      ::close(fd);
5255      return -1;
5256    }
5257  }
5258    /*
5259     * 32-bit Solaris systems suffer from:
5260     *
5261     * - an historical default soft limit of 256 per-process file
5262     *   descriptors that is too low for many Java programs.
5263     *
5264     * - a design flaw where file descriptors created using stdio
5265     *   fopen must be less than 256, _even_ when the first limit above
5266     *   has been raised.  This can cause calls to fopen (but not calls to
5267     *   open, for example) to fail mysteriously, perhaps in 3rd party
5268     *   native code (although the JDK itself uses fopen).  One can hardly
5269     *   criticize them for using this most standard of all functions.
5270     *
5271     * We attempt to make everything work anyways by:
5272     *
5273     * - raising the soft limit on per-process file descriptors beyond
5274     *   256
5275     *
5276     * - As of Solaris 10u4, we can request that Solaris raise the 256
5277     *   stdio fopen limit by calling function enable_extended_FILE_stdio.
5278     *   This is done in init_2 and recorded in enabled_extended_FILE_stdio
5279     *
5280     * - If we are stuck on an old (pre 10u4) Solaris system, we can
5281     *   workaround the bug by remapping non-stdio file descriptors below
5282     *   256 to ones beyond 256, which is done below.
5283     *
5284     * See:
5285     * 1085341: 32-bit stdio routines should support file descriptors >255
5286     * 6533291: Work around 32-bit Solaris stdio limit of 256 open files
5287     * 6431278: Netbeans crash on 32 bit Solaris: need to call
5288     *          enable_extended_FILE_stdio() in VM initialisation
5289     * Giri Mandalika's blog
5290     * http://technopark02.blogspot.com/2005_05_01_archive.html
5291     */
5292#ifndef  _LP64
5293     if ((!enabled_extended_FILE_stdio) && fd < 256) {
5294         int newfd = ::fcntl(fd, F_DUPFD, 256);
5295         if (newfd != -1) {
5296             ::close(fd);
5297             fd = newfd;
5298         }
5299     }
5300#endif // 32-bit Solaris
5301    /*
5302     * All file descriptors that are opened in the JVM and not
5303     * specifically destined for a subprocess should have the
5304     * close-on-exec flag set.  If we don't set it, then careless 3rd
5305     * party native code might fork and exec without closing all
5306     * appropriate file descriptors (e.g. as we do in closeDescriptors in
5307     * UNIXProcess.c), and this in turn might:
5308     *
5309     * - cause end-of-file to fail to be detected on some file
5310     *   descriptors, resulting in mysterious hangs, or
5311     *
5312     * - might cause an fopen in the subprocess to fail on a system
5313     *   suffering from bug 1085341.
5314     *
5315     * (Yes, the default setting of the close-on-exec flag is a Unix
5316     * design flaw)
5317     *
5318     * See:
5319     * 1085341: 32-bit stdio routines should support file descriptors >255
5320     * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
5321     * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
5322     */
5323#ifdef FD_CLOEXEC
5324    {
5325        int flags = ::fcntl(fd, F_GETFD);
5326        if (flags != -1)
5327            ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
5328    }
5329#endif
5330
5331  if (o_delete != 0) {
5332    ::unlink(path);
5333  }
5334  return fd;
5335}
5336
5337// create binary file, rewriting existing file if required
5338int os::create_binary_file(const char* path, bool rewrite_existing) {
5339  int oflags = O_WRONLY | O_CREAT;
5340  if (!rewrite_existing) {
5341    oflags |= O_EXCL;
5342  }
5343  return ::open64(path, oflags, S_IREAD | S_IWRITE);
5344}
5345
5346// return current position of file pointer
5347jlong os::current_file_offset(int fd) {
5348  return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
5349}
5350
5351// move file pointer to the specified offset
5352jlong os::seek_to_file_offset(int fd, jlong offset) {
5353  return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
5354}
5355
5356jlong os::lseek(int fd, jlong offset, int whence) {
5357  return (jlong) ::lseek64(fd, offset, whence);
5358}
5359
5360char * os::native_path(char *path) {
5361  return path;
5362}
5363
5364int os::ftruncate(int fd, jlong length) {
5365  return ::ftruncate64(fd, length);
5366}
5367
5368int os::fsync(int fd)  {
5369  RESTARTABLE_RETURN_INT(::fsync(fd));
5370}
5371
5372int os::available(int fd, jlong *bytes) {
5373  jlong cur, end;
5374  int mode;
5375  struct stat64 buf64;
5376
5377  if (::fstat64(fd, &buf64) >= 0) {
5378    mode = buf64.st_mode;
5379    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
5380      /*
5381      * XXX: is the following call interruptible? If so, this might
5382      * need to go through the INTERRUPT_IO() wrapper as for other
5383      * blocking, interruptible calls in this file.
5384      */
5385      int n,ioctl_return;
5386
5387      INTERRUPTIBLE(::ioctl(fd, FIONREAD, &n),ioctl_return,os::Solaris::clear_interrupted);
5388      if (ioctl_return>= 0) {
5389          *bytes = n;
5390        return 1;
5391      }
5392    }
5393  }
5394  if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
5395    return 0;
5396  } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
5397    return 0;
5398  } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
5399    return 0;
5400  }
5401  *bytes = end - cur;
5402  return 1;
5403}
5404
5405// Map a block of memory.
5406char* os::map_memory(int fd, const char* file_name, size_t file_offset,
5407                     char *addr, size_t bytes, bool read_only,
5408                     bool allow_exec) {
5409  int prot;
5410  int flags;
5411
5412  if (read_only) {
5413    prot = PROT_READ;
5414    flags = MAP_SHARED;
5415  } else {
5416    prot = PROT_READ | PROT_WRITE;
5417    flags = MAP_PRIVATE;
5418  }
5419
5420  if (allow_exec) {
5421    prot |= PROT_EXEC;
5422  }
5423
5424  if (addr != NULL) {
5425    flags |= MAP_FIXED;
5426  }
5427
5428  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
5429                                     fd, file_offset);
5430  if (mapped_address == MAP_FAILED) {
5431    return NULL;
5432  }
5433  return mapped_address;
5434}
5435
5436
5437// Remap a block of memory.
5438char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
5439                       char *addr, size_t bytes, bool read_only,
5440                       bool allow_exec) {
5441  // same as map_memory() on this OS
5442  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
5443                        allow_exec);
5444}
5445
5446
5447// Unmap a block of memory.
5448bool os::unmap_memory(char* addr, size_t bytes) {
5449  return munmap(addr, bytes) == 0;
5450}
5451
5452void os::pause() {
5453  char filename[MAX_PATH];
5454  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
5455    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
5456  } else {
5457    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
5458  }
5459
5460  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
5461  if (fd != -1) {
5462    struct stat buf;
5463    ::close(fd);
5464    while (::stat(filename, &buf) == 0) {
5465      (void)::poll(NULL, 0, 100);
5466    }
5467  } else {
5468    jio_fprintf(stderr,
5469      "Could not open pause file '%s', continuing immediately.\n", filename);
5470  }
5471}
5472
5473#ifndef PRODUCT
5474#ifdef INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5475// Turn this on if you need to trace synch operations.
5476// Set RECORD_SYNCH_LIMIT to a large-enough value,
5477// and call record_synch_enable and record_synch_disable
5478// around the computation of interest.
5479
5480void record_synch(char* name, bool returning);  // defined below
5481
5482class RecordSynch {
5483  char* _name;
5484 public:
5485  RecordSynch(char* name) :_name(name)
5486                 { record_synch(_name, false); }
5487  ~RecordSynch() { record_synch(_name,   true);  }
5488};
5489
5490#define CHECK_SYNCH_OP(ret, name, params, args, inner)          \
5491extern "C" ret name params {                                    \
5492  typedef ret name##_t params;                                  \
5493  static name##_t* implem = NULL;                               \
5494  static int callcount = 0;                                     \
5495  if (implem == NULL) {                                         \
5496    implem = (name##_t*) dlsym(RTLD_NEXT, #name);               \
5497    if (implem == NULL)  fatal(dlerror());                      \
5498  }                                                             \
5499  ++callcount;                                                  \
5500  RecordSynch _rs(#name);                                       \
5501  inner;                                                        \
5502  return implem args;                                           \
5503}
5504// in dbx, examine callcounts this way:
5505// for n in $(eval whereis callcount | awk '{print $2}'); do print $n; done
5506
5507#define CHECK_POINTER_OK(p) \
5508  (Universe::perm_gen() == NULL || !Universe::is_reserved_heap((oop)(p)))
5509#define CHECK_MU \
5510  if (!CHECK_POINTER_OK(mu)) fatal("Mutex must be in C heap only.");
5511#define CHECK_CV \
5512  if (!CHECK_POINTER_OK(cv)) fatal("Condvar must be in C heap only.");
5513#define CHECK_P(p) \
5514  if (!CHECK_POINTER_OK(p))  fatal(false,  "Pointer must be in C heap only.");
5515
5516#define CHECK_MUTEX(mutex_op) \
5517CHECK_SYNCH_OP(int, mutex_op, (mutex_t *mu), (mu), CHECK_MU);
5518
5519CHECK_MUTEX(   mutex_lock)
5520CHECK_MUTEX(  _mutex_lock)
5521CHECK_MUTEX( mutex_unlock)
5522CHECK_MUTEX(_mutex_unlock)
5523CHECK_MUTEX( mutex_trylock)
5524CHECK_MUTEX(_mutex_trylock)
5525
5526#define CHECK_COND(cond_op) \
5527CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu), (cv, mu), CHECK_MU;CHECK_CV);
5528
5529CHECK_COND( cond_wait);
5530CHECK_COND(_cond_wait);
5531CHECK_COND(_cond_wait_cancel);
5532
5533#define CHECK_COND2(cond_op) \
5534CHECK_SYNCH_OP(int, cond_op, (cond_t *cv, mutex_t *mu, timestruc_t* ts), (cv, mu, ts), CHECK_MU;CHECK_CV);
5535
5536CHECK_COND2( cond_timedwait);
5537CHECK_COND2(_cond_timedwait);
5538CHECK_COND2(_cond_timedwait_cancel);
5539
5540// do the _lwp_* versions too
5541#define mutex_t lwp_mutex_t
5542#define cond_t  lwp_cond_t
5543CHECK_MUTEX(  _lwp_mutex_lock)
5544CHECK_MUTEX(  _lwp_mutex_unlock)
5545CHECK_MUTEX(  _lwp_mutex_trylock)
5546CHECK_MUTEX( __lwp_mutex_lock)
5547CHECK_MUTEX( __lwp_mutex_unlock)
5548CHECK_MUTEX( __lwp_mutex_trylock)
5549CHECK_MUTEX(___lwp_mutex_lock)
5550CHECK_MUTEX(___lwp_mutex_unlock)
5551
5552CHECK_COND(  _lwp_cond_wait);
5553CHECK_COND( __lwp_cond_wait);
5554CHECK_COND(___lwp_cond_wait);
5555
5556CHECK_COND2(  _lwp_cond_timedwait);
5557CHECK_COND2( __lwp_cond_timedwait);
5558#undef mutex_t
5559#undef cond_t
5560
5561CHECK_SYNCH_OP(int, _lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5562CHECK_SYNCH_OP(int,__lwp_suspend2,       (int lwp, int *n), (lwp, n), 0);
5563CHECK_SYNCH_OP(int, _lwp_kill,           (int lwp, int n),  (lwp, n), 0);
5564CHECK_SYNCH_OP(int,__lwp_kill,           (int lwp, int n),  (lwp, n), 0);
5565CHECK_SYNCH_OP(int, _lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5566CHECK_SYNCH_OP(int,__lwp_sema_wait,      (lwp_sema_t* p),   (p),  CHECK_P(p));
5567CHECK_SYNCH_OP(int, _lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5568CHECK_SYNCH_OP(int,__lwp_cond_broadcast, (lwp_cond_t* cv),  (cv), CHECK_CV);
5569
5570
5571// recording machinery:
5572
5573enum { RECORD_SYNCH_LIMIT = 200 };
5574char* record_synch_name[RECORD_SYNCH_LIMIT];
5575void* record_synch_arg0ptr[RECORD_SYNCH_LIMIT];
5576bool record_synch_returning[RECORD_SYNCH_LIMIT];
5577thread_t record_synch_thread[RECORD_SYNCH_LIMIT];
5578int record_synch_count = 0;
5579bool record_synch_enabled = false;
5580
5581// in dbx, examine recorded data this way:
5582// for n in name arg0ptr returning thread; do print record_synch_$n[0..record_synch_count-1]; done
5583
5584void record_synch(char* name, bool returning) {
5585  if (record_synch_enabled) {
5586    if (record_synch_count < RECORD_SYNCH_LIMIT) {
5587      record_synch_name[record_synch_count] = name;
5588      record_synch_returning[record_synch_count] = returning;
5589      record_synch_thread[record_synch_count] = thr_self();
5590      record_synch_arg0ptr[record_synch_count] = &name;
5591      record_synch_count++;
5592    }
5593    // put more checking code here:
5594    // ...
5595  }
5596}
5597
5598void record_synch_enable() {
5599  // start collecting trace data, if not already doing so
5600  if (!record_synch_enabled)  record_synch_count = 0;
5601  record_synch_enabled = true;
5602}
5603
5604void record_synch_disable() {
5605  // stop collecting trace data
5606  record_synch_enabled = false;
5607}
5608
5609#endif // INTERPOSE_ON_SYSTEM_SYNCH_FUNCTIONS
5610#endif // PRODUCT
5611
5612const intptr_t thr_time_off  = (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5613const intptr_t thr_time_size = (intptr_t)(&((prusage_t *)(NULL))->pr_ttime) -
5614                               (intptr_t)(&((prusage_t *)(NULL))->pr_utime);
5615
5616
5617// JVMTI & JVM monitoring and management support
5618// The thread_cpu_time() and current_thread_cpu_time() are only
5619// supported if is_thread_cpu_time_supported() returns true.
5620// They are not supported on Solaris T1.
5621
5622// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
5623// are used by JVM M&M and JVMTI to get user+sys or user CPU time
5624// of a thread.
5625//
5626// current_thread_cpu_time() and thread_cpu_time(Thread *)
5627// returns the fast estimate available on the platform.
5628
5629// hrtime_t gethrvtime() return value includes
5630// user time but does not include system time
5631jlong os::current_thread_cpu_time() {
5632  return (jlong) gethrvtime();
5633}
5634
5635jlong os::thread_cpu_time(Thread *thread) {
5636  // return user level CPU time only to be consistent with
5637  // what current_thread_cpu_time returns.
5638  // thread_cpu_time_info() must be changed if this changes
5639  return os::thread_cpu_time(thread, false /* user time only */);
5640}
5641
5642jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
5643  if (user_sys_cpu_time) {
5644    return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
5645  } else {
5646    return os::current_thread_cpu_time();
5647  }
5648}
5649
5650jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
5651  char proc_name[64];
5652  int count;
5653  prusage_t prusage;
5654  jlong lwp_time;
5655  int fd;
5656
5657  sprintf(proc_name, "/proc/%d/lwp/%d/lwpusage",
5658                     getpid(),
5659                     thread->osthread()->lwp_id());
5660  fd = ::open(proc_name, O_RDONLY);
5661  if ( fd == -1 ) return -1;
5662
5663  do {
5664    count = ::pread(fd,
5665                  (void *)&prusage.pr_utime,
5666                  thr_time_size,
5667                  thr_time_off);
5668  } while (count < 0 && errno == EINTR);
5669  ::close(fd);
5670  if ( count < 0 ) return -1;
5671
5672  if (user_sys_cpu_time) {
5673    // user + system CPU time
5674    lwp_time = (((jlong)prusage.pr_stime.tv_sec +
5675                 (jlong)prusage.pr_utime.tv_sec) * (jlong)1000000000) +
5676                 (jlong)prusage.pr_stime.tv_nsec +
5677                 (jlong)prusage.pr_utime.tv_nsec;
5678  } else {
5679    // user level CPU time only
5680    lwp_time = ((jlong)prusage.pr_utime.tv_sec * (jlong)1000000000) +
5681                (jlong)prusage.pr_utime.tv_nsec;
5682  }
5683
5684  return(lwp_time);
5685}
5686
5687void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5688  info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5689  info_ptr->may_skip_backward = false;    // elapsed time not wall time
5690  info_ptr->may_skip_forward = false;     // elapsed time not wall time
5691  info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5692}
5693
5694void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
5695  info_ptr->max_value = ALL_64_BITS;      // will not wrap in less than 64 bits
5696  info_ptr->may_skip_backward = false;    // elapsed time not wall time
5697  info_ptr->may_skip_forward = false;     // elapsed time not wall time
5698  info_ptr->kind = JVMTI_TIMER_USER_CPU;  // only user time is returned
5699}
5700
5701bool os::is_thread_cpu_time_supported() {
5702  if ( os::Solaris::T2_libthread() || UseBoundThreads ) {
5703    return true;
5704  } else {
5705    return false;
5706  }
5707}
5708
5709// System loadavg support.  Returns -1 if load average cannot be obtained.
5710// Return the load average for our processor set if the primitive exists
5711// (Solaris 9 and later).  Otherwise just return system wide loadavg.
5712int os::loadavg(double loadavg[], int nelem) {
5713  if (pset_getloadavg_ptr != NULL) {
5714    return (*pset_getloadavg_ptr)(PS_MYID, loadavg, nelem);
5715  } else {
5716    return ::getloadavg(loadavg, nelem);
5717  }
5718}
5719
5720//---------------------------------------------------------------------------------
5721
5722static address same_page(address x, address y) {
5723  intptr_t page_bits = -os::vm_page_size();
5724  if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
5725    return x;
5726  else if (x > y)
5727    return (address)(intptr_t(y) | ~page_bits) + 1;
5728  else
5729    return (address)(intptr_t(y) & page_bits);
5730}
5731
5732bool os::find(address addr, outputStream* st) {
5733  Dl_info dlinfo;
5734  memset(&dlinfo, 0, sizeof(dlinfo));
5735  if (dladdr(addr, &dlinfo)) {
5736#ifdef _LP64
5737    st->print("0x%016lx: ", addr);
5738#else
5739    st->print("0x%08x: ", addr);
5740#endif
5741    if (dlinfo.dli_sname != NULL)
5742      st->print("%s+%#lx", dlinfo.dli_sname, addr-(intptr_t)dlinfo.dli_saddr);
5743    else if (dlinfo.dli_fname)
5744      st->print("<offset %#lx>", addr-(intptr_t)dlinfo.dli_fbase);
5745    else
5746      st->print("<absolute address>");
5747    if (dlinfo.dli_fname)  st->print(" in %s", dlinfo.dli_fname);
5748#ifdef _LP64
5749    if (dlinfo.dli_fbase)  st->print(" at 0x%016lx", dlinfo.dli_fbase);
5750#else
5751    if (dlinfo.dli_fbase)  st->print(" at 0x%08x", dlinfo.dli_fbase);
5752#endif
5753    st->cr();
5754
5755    if (Verbose) {
5756      // decode some bytes around the PC
5757      address begin = same_page(addr-40, addr);
5758      address end   = same_page(addr+40, addr);
5759      address       lowest = (address) dlinfo.dli_sname;
5760      if (!lowest)  lowest = (address) dlinfo.dli_fbase;
5761      if (begin < lowest)  begin = lowest;
5762      Dl_info dlinfo2;
5763      if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr
5764          && end > dlinfo2.dli_saddr && dlinfo2.dli_saddr > begin)
5765        end = (address) dlinfo2.dli_saddr;
5766      Disassembler::decode(begin, end, st);
5767    }
5768    return true;
5769  }
5770  return false;
5771}
5772
5773// Following function has been added to support HotSparc's libjvm.so running
5774// under Solaris production JDK 1.2.2 / 1.3.0.  These came from
5775// src/solaris/hpi/native_threads in the EVM codebase.
5776//
5777// NOTE: This is no longer needed in the 1.3.1 and 1.4 production release
5778// libraries and should thus be removed. We will leave it behind for a while
5779// until we no longer want to able to run on top of 1.3.0 Solaris production
5780// JDK. See 4341971.
5781
5782#define STACK_SLACK 0x800
5783
5784extern "C" {
5785  intptr_t sysThreadAvailableStackWithSlack() {
5786    stack_t st;
5787    intptr_t retval, stack_top;
5788    retval = thr_stksegment(&st);
5789    assert(retval == 0, "incorrect return value from thr_stksegment");
5790    assert((address)&st < (address)st.ss_sp, "Invalid stack base returned");
5791    assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned");
5792    stack_top=(intptr_t)st.ss_sp-st.ss_size;
5793    return ((intptr_t)&stack_top - stack_top - STACK_SLACK);
5794  }
5795}
5796
5797// Just to get the Kernel build to link on solaris for testing.
5798
5799extern "C" {
5800class ASGCT_CallTrace;
5801void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext)
5802  KERNEL_RETURN;
5803}
5804
5805
5806// ObjectMonitor park-unpark infrastructure ...
5807//
5808// We implement Solaris and Linux PlatformEvents with the
5809// obvious condvar-mutex-flag triple.
5810// Another alternative that works quite well is pipes:
5811// Each PlatformEvent consists of a pipe-pair.
5812// The thread associated with the PlatformEvent
5813// calls park(), which reads from the input end of the pipe.
5814// Unpark() writes into the other end of the pipe.
5815// The write-side of the pipe must be set NDELAY.
5816// Unfortunately pipes consume a large # of handles.
5817// Native solaris lwp_park() and lwp_unpark() work nicely, too.
5818// Using pipes for the 1st few threads might be workable, however.
5819//
5820// park() is permitted to return spuriously.
5821// Callers of park() should wrap the call to park() in
5822// an appropriate loop.  A litmus test for the correct
5823// usage of park is the following: if park() were modified
5824// to immediately return 0 your code should still work,
5825// albeit degenerating to a spin loop.
5826//
5827// An interesting optimization for park() is to use a trylock()
5828// to attempt to acquire the mutex.  If the trylock() fails
5829// then we know that a concurrent unpark() operation is in-progress.
5830// in that case the park() code could simply set _count to 0
5831// and return immediately.  The subsequent park() operation *might*
5832// return immediately.  That's harmless as the caller of park() is
5833// expected to loop.  By using trylock() we will have avoided a
5834// avoided a context switch caused by contention on the per-thread mutex.
5835//
5836// TODO-FIXME:
5837// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the
5838//     objectmonitor implementation.
5839// 2.  Collapse the JSR166 parker event, and the
5840//     objectmonitor ParkEvent into a single "Event" construct.
5841// 3.  In park() and unpark() add:
5842//     assert (Thread::current() == AssociatedWith).
5843// 4.  add spurious wakeup injection on a -XX:EarlyParkReturn=N switch.
5844//     1-out-of-N park() operations will return immediately.
5845//
5846// _Event transitions in park()
5847//   -1 => -1 : illegal
5848//    1 =>  0 : pass - return immediately
5849//    0 => -1 : block
5850//
5851// _Event serves as a restricted-range semaphore.
5852//
5853// Another possible encoding of _Event would be with
5854// explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
5855//
5856// TODO-FIXME: add DTRACE probes for:
5857// 1.   Tx parks
5858// 2.   Ty unparks Tx
5859// 3.   Tx resumes from park
5860
5861
5862// value determined through experimentation
5863#define ROUNDINGFIX 11
5864
5865// utility to compute the abstime argument to timedwait.
5866// TODO-FIXME: switch from compute_abstime() to unpackTime().
5867
5868static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
5869  // millis is the relative timeout time
5870  // abstime will be the absolute timeout time
5871  if (millis < 0)  millis = 0;
5872  struct timeval now;
5873  int status = gettimeofday(&now, NULL);
5874  assert(status == 0, "gettimeofday");
5875  jlong seconds = millis / 1000;
5876  jlong max_wait_period;
5877
5878  if (UseLWPSynchronization) {
5879    // forward port of fix for 4275818 (not sleeping long enough)
5880    // There was a bug in Solaris 6, 7 and pre-patch 5 of 8 where
5881    // _lwp_cond_timedwait() used a round_down algorithm rather
5882    // than a round_up. For millis less than our roundfactor
5883    // it rounded down to 0 which doesn't meet the spec.
5884    // For millis > roundfactor we may return a bit sooner, but
5885    // since we can not accurately identify the patch level and
5886    // this has already been fixed in Solaris 9 and 8 we will
5887    // leave it alone rather than always rounding down.
5888
5889    if (millis > 0 && millis < ROUNDINGFIX) millis = ROUNDINGFIX;
5890       // It appears that when we go directly through Solaris _lwp_cond_timedwait()
5891           // the acceptable max time threshold is smaller than for libthread on 2.5.1 and 2.6
5892           max_wait_period = 21000000;
5893  } else {
5894    max_wait_period = 50000000;
5895  }
5896  millis %= 1000;
5897  if (seconds > max_wait_period) {      // see man cond_timedwait(3T)
5898     seconds = max_wait_period;
5899  }
5900  abstime->tv_sec = now.tv_sec  + seconds;
5901  long       usec = now.tv_usec + millis * 1000;
5902  if (usec >= 1000000) {
5903    abstime->tv_sec += 1;
5904    usec -= 1000000;
5905  }
5906  abstime->tv_nsec = usec * 1000;
5907  return abstime;
5908}
5909
5910// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
5911// Conceptually TryPark() should be equivalent to park(0).
5912
5913int os::PlatformEvent::TryPark() {
5914  for (;;) {
5915    const int v = _Event ;
5916    guarantee ((v == 0) || (v == 1), "invariant") ;
5917    if (Atomic::cmpxchg (0, &_Event, v) == v) return v  ;
5918  }
5919}
5920
5921void os::PlatformEvent::park() {           // AKA: down()
5922  // Invariant: Only the thread associated with the Event/PlatformEvent
5923  // may call park().
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) {
5931     // Do this the hard way by blocking ...
5932     // See http://monaco.sfbay/detail.jsf?cr=5094058.
5933     // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
5934     // Only for SPARC >= V8PlusA
5935#if defined(__sparc) && defined(COMPILER2)
5936     if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5937#endif
5938     int status = os::Solaris::mutex_lock(_mutex);
5939     assert_status(status == 0, status,  "mutex_lock");
5940     guarantee (_nParked == 0, "invariant") ;
5941     ++ _nParked ;
5942     while (_Event < 0) {
5943        // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
5944        // Treat this the same as if the wait was interrupted
5945        // With usr/lib/lwp going to kernel, always handle ETIME
5946        status = os::Solaris::cond_wait(_cond, _mutex);
5947        if (status == ETIME) status = EINTR ;
5948        assert_status(status == 0 || status == EINTR, status, "cond_wait");
5949     }
5950     -- _nParked ;
5951     _Event = 0 ;
5952     status = os::Solaris::mutex_unlock(_mutex);
5953     assert_status(status == 0, status, "mutex_unlock");
5954  }
5955}
5956
5957int os::PlatformEvent::park(jlong millis) {
5958  guarantee (_nParked == 0, "invariant") ;
5959  int v ;
5960  for (;;) {
5961      v = _Event ;
5962      if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
5963  }
5964  guarantee (v >= 0, "invariant") ;
5965  if (v != 0) return OS_OK ;
5966
5967  int ret = OS_TIMEOUT;
5968  timestruc_t abst;
5969  compute_abstime (&abst, millis);
5970
5971  // See http://monaco.sfbay/detail.jsf?cr=5094058.
5972  // For Solaris SPARC set fprs.FEF=0 prior to parking.
5973  // Only for SPARC >= V8PlusA
5974#if defined(__sparc) && defined(COMPILER2)
5975 if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
5976#endif
5977  int status = os::Solaris::mutex_lock(_mutex);
5978  assert_status(status == 0, status, "mutex_lock");
5979  guarantee (_nParked == 0, "invariant") ;
5980  ++ _nParked ;
5981  while (_Event < 0) {
5982     int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
5983     assert_status(status == 0 || status == EINTR ||
5984                   status == ETIME || status == ETIMEDOUT,
5985                   status, "cond_timedwait");
5986     if (!FilterSpuriousWakeups) break ;                // previous semantics
5987     if (status == ETIME || status == ETIMEDOUT) break ;
5988     // We consume and ignore EINTR and spurious wakeups.
5989  }
5990  -- _nParked ;
5991  if (_Event >= 0) ret = OS_OK ;
5992  _Event = 0 ;
5993  status = os::Solaris::mutex_unlock(_mutex);
5994  assert_status(status == 0, status, "mutex_unlock");
5995  return ret;
5996}
5997
5998void os::PlatformEvent::unpark() {
5999  int v, AnyWaiters;
6000
6001  // Increment _Event.
6002  // Another acceptable implementation would be to simply swap 1
6003  // into _Event:
6004  //   if (Swap (&_Event, 1) < 0) {
6005  //      mutex_lock (_mutex) ; AnyWaiters = nParked; mutex_unlock (_mutex) ;
6006  //      if (AnyWaiters) cond_signal (_cond) ;
6007  //   }
6008
6009  for (;;) {
6010    v = _Event ;
6011    if (v > 0) {
6012       // The LD of _Event could have reordered or be satisfied
6013       // by a read-aside from this processor's write buffer.
6014       // To avoid problems execute a barrier and then
6015       // ratify the value.  A degenerate CAS() would also work.
6016       // Viz., CAS (v+0, &_Event, v) == v).
6017       OrderAccess::fence() ;
6018       if (_Event == v) return ;
6019       continue ;
6020    }
6021    if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
6022  }
6023
6024  // If the thread associated with the event was parked, wake it.
6025  if (v < 0) {
6026     int status ;
6027     // Wait for the thread assoc with the PlatformEvent to vacate.
6028     status = os::Solaris::mutex_lock(_mutex);
6029     assert_status(status == 0, status, "mutex_lock");
6030     AnyWaiters = _nParked ;
6031     status = os::Solaris::mutex_unlock(_mutex);
6032     assert_status(status == 0, status, "mutex_unlock");
6033     guarantee (AnyWaiters == 0 || AnyWaiters == 1, "invariant") ;
6034     if (AnyWaiters != 0) {
6035       // We intentional signal *after* dropping the lock
6036       // to avoid a common class of futile wakeups.
6037       status = os::Solaris::cond_signal(_cond);
6038       assert_status(status == 0, status, "cond_signal");
6039     }
6040  }
6041}
6042
6043// JSR166
6044// -------------------------------------------------------
6045
6046/*
6047 * The solaris and linux implementations of park/unpark are fairly
6048 * conservative for now, but can be improved. They currently use a
6049 * mutex/condvar pair, plus _counter.
6050 * Park decrements _counter if > 0, else does a condvar wait.  Unpark
6051 * sets count to 1 and signals condvar.  Only one thread ever waits
6052 * on the condvar. Contention seen when trying to park implies that someone
6053 * is unparking you, so don't wait. And spurious returns are fine, so there
6054 * is no need to track notifications.
6055 */
6056
6057#define NANOSECS_PER_SEC 1000000000
6058#define NANOSECS_PER_MILLISEC 1000000
6059#define MAX_SECS 100000000
6060
6061/*
6062 * This code is common to linux and solaris and will be moved to a
6063 * common place in dolphin.
6064 *
6065 * The passed in time value is either a relative time in nanoseconds
6066 * or an absolute time in milliseconds. Either way it has to be unpacked
6067 * into suitable seconds and nanoseconds components and stored in the
6068 * given timespec structure.
6069 * Given time is a 64-bit value and the time_t used in the timespec is only
6070 * a signed-32-bit value (except on 64-bit Linux) we have to watch for
6071 * overflow if times way in the future are given. Further on Solaris versions
6072 * prior to 10 there is a restriction (see cond_timedwait) that the specified
6073 * number of seconds, in abstime, is less than current_time  + 100,000,000.
6074 * As it will be 28 years before "now + 100000000" will overflow we can
6075 * ignore overflow and just impose a hard-limit on seconds using the value
6076 * of "now + 100,000,000". This places a limit on the timeout of about 3.17
6077 * years from "now".
6078 */
6079static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
6080  assert (time > 0, "convertTime");
6081
6082  struct timeval now;
6083  int status = gettimeofday(&now, NULL);
6084  assert(status == 0, "gettimeofday");
6085
6086  time_t max_secs = now.tv_sec + MAX_SECS;
6087
6088  if (isAbsolute) {
6089    jlong secs = time / 1000;
6090    if (secs > max_secs) {
6091      absTime->tv_sec = max_secs;
6092    }
6093    else {
6094      absTime->tv_sec = secs;
6095    }
6096    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
6097  }
6098  else {
6099    jlong secs = time / NANOSECS_PER_SEC;
6100    if (secs >= MAX_SECS) {
6101      absTime->tv_sec = max_secs;
6102      absTime->tv_nsec = 0;
6103    }
6104    else {
6105      absTime->tv_sec = now.tv_sec + secs;
6106      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
6107      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
6108        absTime->tv_nsec -= NANOSECS_PER_SEC;
6109        ++absTime->tv_sec; // note: this must be <= max_secs
6110      }
6111    }
6112  }
6113  assert(absTime->tv_sec >= 0, "tv_sec < 0");
6114  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
6115  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
6116  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
6117}
6118
6119void Parker::park(bool isAbsolute, jlong time) {
6120
6121  // Optional fast-path check:
6122  // Return immediately if a permit is available.
6123  if (_counter > 0) {
6124      _counter = 0 ;
6125      OrderAccess::fence();
6126      return ;
6127  }
6128
6129  // Optional fast-exit: Check interrupt before trying to wait
6130  Thread* thread = Thread::current();
6131  assert(thread->is_Java_thread(), "Must be JavaThread");
6132  JavaThread *jt = (JavaThread *)thread;
6133  if (Thread::is_interrupted(thread, false)) {
6134    return;
6135  }
6136
6137  // First, demultiplex/decode time arguments
6138  timespec absTime;
6139  if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
6140    return;
6141  }
6142  if (time > 0) {
6143    // Warning: this code might be exposed to the old Solaris time
6144    // round-down bugs.  Grep "roundingFix" for details.
6145    unpackTime(&absTime, isAbsolute, time);
6146  }
6147
6148  // Enter safepoint region
6149  // Beware of deadlocks such as 6317397.
6150  // The per-thread Parker:: _mutex is a classic leaf-lock.
6151  // In particular a thread must never block on the Threads_lock while
6152  // holding the Parker:: mutex.  If safepoints are pending both the
6153  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
6154  ThreadBlockInVM tbivm(jt);
6155
6156  // Don't wait if cannot get lock since interference arises from
6157  // unblocking.  Also. check interrupt before trying wait
6158  if (Thread::is_interrupted(thread, false) ||
6159      os::Solaris::mutex_trylock(_mutex) != 0) {
6160    return;
6161  }
6162
6163  int status ;
6164
6165  if (_counter > 0)  { // no wait needed
6166    _counter = 0;
6167    status = os::Solaris::mutex_unlock(_mutex);
6168    assert (status == 0, "invariant") ;
6169    OrderAccess::fence();
6170    return;
6171  }
6172
6173#ifdef ASSERT
6174  // Don't catch signals while blocked; let the running threads have the signals.
6175  // (This allows a debugger to break into the running thread.)
6176  sigset_t oldsigs;
6177  sigset_t* allowdebug_blocked = os::Solaris::allowdebug_blocked_signals();
6178  thr_sigsetmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
6179#endif
6180
6181  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
6182  jt->set_suspend_equivalent();
6183  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
6184
6185  // Do this the hard way by blocking ...
6186  // See http://monaco.sfbay/detail.jsf?cr=5094058.
6187  // TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
6188  // Only for SPARC >= V8PlusA
6189#if defined(__sparc) && defined(COMPILER2)
6190  if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
6191#endif
6192
6193  if (time == 0) {
6194    status = os::Solaris::cond_wait (_cond, _mutex) ;
6195  } else {
6196    status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
6197  }
6198  // Note that an untimed cond_wait() can sometimes return ETIME on older
6199  // versions of the Solaris.
6200  assert_status(status == 0 || status == EINTR ||
6201                status == ETIME || status == ETIMEDOUT,
6202                status, "cond_timedwait");
6203
6204#ifdef ASSERT
6205  thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
6206#endif
6207  _counter = 0 ;
6208  status = os::Solaris::mutex_unlock(_mutex);
6209  assert_status(status == 0, status, "mutex_unlock") ;
6210
6211  // If externally suspended while waiting, re-suspend
6212  if (jt->handle_special_suspend_equivalent_condition()) {
6213    jt->java_suspend_self();
6214  }
6215  OrderAccess::fence();
6216}
6217
6218void Parker::unpark() {
6219  int s, status ;
6220  status = os::Solaris::mutex_lock (_mutex) ;
6221  assert (status == 0, "invariant") ;
6222  s = _counter;
6223  _counter = 1;
6224  status = os::Solaris::mutex_unlock (_mutex) ;
6225  assert (status == 0, "invariant") ;
6226
6227  if (s < 1) {
6228    status = os::Solaris::cond_signal (_cond) ;
6229    assert (status == 0, "invariant") ;
6230  }
6231}
6232
6233extern char** environ;
6234
6235// Run the specified command in a separate process. Return its exit value,
6236// or -1 on failure (e.g. can't fork a new process).
6237// Unlike system(), this function can be called from signal handler. It
6238// doesn't block SIGINT et al.
6239int os::fork_and_exec(char* cmd) {
6240  char * argv[4];
6241  argv[0] = (char *)"sh";
6242  argv[1] = (char *)"-c";
6243  argv[2] = cmd;
6244  argv[3] = NULL;
6245
6246  // fork is async-safe, fork1 is not so can't use in signal handler
6247  pid_t pid;
6248  Thread* t = ThreadLocalStorage::get_thread_slow();
6249  if (t != NULL && t->is_inside_signal_handler()) {
6250    pid = fork();
6251  } else {
6252    pid = fork1();
6253  }
6254
6255  if (pid < 0) {
6256    // fork failed
6257    warning("fork failed: %s", strerror(errno));
6258    return -1;
6259
6260  } else if (pid == 0) {
6261    // child process
6262
6263    // try to be consistent with system(), which uses "/usr/bin/sh" on Solaris
6264    execve("/usr/bin/sh", argv, environ);
6265
6266    // execve failed
6267    _exit(-1);
6268
6269  } else  {
6270    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
6271    // care about the actual exit code, for now.
6272
6273    int status;
6274
6275    // Wait for the child process to exit.  This returns immediately if
6276    // the child has already exited. */
6277    while (waitpid(pid, &status, 0) < 0) {
6278        switch (errno) {
6279        case ECHILD: return 0;
6280        case EINTR: break;
6281        default: return -1;
6282        }
6283    }
6284
6285    if (WIFEXITED(status)) {
6286       // The child exited normally; get its exit code.
6287       return WEXITSTATUS(status);
6288    } else if (WIFSIGNALED(status)) {
6289       // The child exited because of a signal
6290       // The best value to return is 0x80 + signal number,
6291       // because that is what all Unix shells do, and because
6292       // it allows callers to distinguish between process exit and
6293       // process death by signal.
6294       return 0x80 + WTERMSIG(status);
6295    } else {
6296       // Unknown exit code; pass it through
6297       return status;
6298    }
6299  }
6300}
6301
6302// is_headless_jre()
6303//
6304// Test for the existence of libmawt in motif21 or xawt directories
6305// in order to report if we are running in a headless jre
6306//
6307bool os::is_headless_jre() {
6308    struct stat statbuf;
6309    char buf[MAXPATHLEN];
6310    char libmawtpath[MAXPATHLEN];
6311    const char *xawtstr  = "/xawt/libmawt.so";
6312    const char *motifstr = "/motif21/libmawt.so";
6313    char *p;
6314
6315    // Get path to libjvm.so
6316    os::jvm_path(buf, sizeof(buf));
6317
6318    // Get rid of libjvm.so
6319    p = strrchr(buf, '/');
6320    if (p == NULL) return false;
6321    else *p = '\0';
6322
6323    // Get rid of client or server
6324    p = strrchr(buf, '/');
6325    if (p == NULL) return false;
6326    else *p = '\0';
6327
6328    // check xawt/libmawt.so
6329    strcpy(libmawtpath, buf);
6330    strcat(libmawtpath, xawtstr);
6331    if (::stat(libmawtpath, &statbuf) == 0) return false;
6332
6333    // check motif21/libmawt.so
6334    strcpy(libmawtpath, buf);
6335    strcat(libmawtpath, motifstr);
6336    if (::stat(libmawtpath, &statbuf) == 0) return false;
6337
6338    return true;
6339}
6340
6341size_t os::write(int fd, const void *buf, unsigned int nBytes) {
6342  INTERRUPTIBLE_RETURN_INT(::write(fd, buf, nBytes), os::Solaris::clear_interrupted);
6343}
6344
6345int os::close(int fd) {
6346  RESTARTABLE_RETURN_INT(::close(fd));
6347}
6348
6349int os::socket_close(int fd) {
6350  RESTARTABLE_RETURN_INT(::close(fd));
6351}
6352
6353int os::recv(int fd, char *buf, int nBytes, int flags) {
6354  INTERRUPTIBLE_RETURN_INT(::recv(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
6355}
6356
6357
6358int os::send(int fd, char *buf, int nBytes, int flags) {
6359  INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
6360}
6361
6362int os::raw_send(int fd, char *buf, int nBytes, int flags) {
6363  RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
6364}
6365
6366// As both poll and select can be interrupted by signals, we have to be
6367// prepared to restart the system call after updating the timeout, unless
6368// a poll() is done with timeout == -1, in which case we repeat with this
6369// "wait forever" value.
6370
6371int os::timeout(int fd, long timeout) {
6372  int res;
6373  struct timeval t;
6374  julong prevtime, newtime;
6375  static const char* aNull = 0;
6376  struct pollfd pfd;
6377  pfd.fd = fd;
6378  pfd.events = POLLIN;
6379
6380  gettimeofday(&t, &aNull);
6381  prevtime = ((julong)t.tv_sec * 1000)  +  t.tv_usec / 1000;
6382
6383  for(;;) {
6384    INTERRUPTIBLE_NORESTART(::poll(&pfd, 1, timeout), res, os::Solaris::clear_interrupted);
6385    if(res == OS_ERR && errno == EINTR) {
6386        if(timeout != -1) {
6387          gettimeofday(&t, &aNull);
6388          newtime = ((julong)t.tv_sec * 1000)  +  t.tv_usec /1000;
6389          timeout -= newtime - prevtime;
6390          if(timeout <= 0)
6391            return OS_OK;
6392          prevtime = newtime;
6393        }
6394    } else return res;
6395  }
6396}
6397
6398int os::connect(int fd, struct sockaddr *him, int len) {
6399  int _result;
6400  INTERRUPTIBLE_NORESTART(::connect(fd, him, len), _result,
6401                          os::Solaris::clear_interrupted);
6402
6403  // Depending on when thread interruption is reset, _result could be
6404  // one of two values when errno == EINTR
6405
6406  if (((_result == OS_INTRPT) || (_result == OS_ERR))
6407                                        && (errno == EINTR)) {
6408     /* restarting a connect() changes its errno semantics */
6409     INTERRUPTIBLE(::connect(fd, him, len), _result,
6410                     os::Solaris::clear_interrupted);
6411     /* undo these changes */
6412     if (_result == OS_ERR) {
6413       if (errno == EALREADY) {
6414         errno = EINPROGRESS; /* fall through */
6415       } else if (errno == EISCONN) {
6416         errno = 0;
6417         return OS_OK;
6418       }
6419     }
6420   }
6421   return _result;
6422 }
6423
6424int os::accept(int fd, struct sockaddr *him, int *len) {
6425  if (fd < 0)
6426   return OS_ERR;
6427  INTERRUPTIBLE_RETURN_INT((int)::accept(fd, him,\
6428    (socklen_t*) len), os::Solaris::clear_interrupted);
6429 }
6430
6431int os::recvfrom(int fd, char *buf, int nBytes, int flags,
6432                             sockaddr *from, int *fromlen) {
6433   //%%note jvm_r11
6434  INTERRUPTIBLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes,\
6435    flags, from, fromlen), os::Solaris::clear_interrupted);
6436}
6437
6438int os::sendto(int fd, char *buf, int len, int flags,
6439                           struct sockaddr *to, int tolen) {
6440  //%%note jvm_r11
6441  INTERRUPTIBLE_RETURN_INT((int)::sendto(fd, buf, len, flags,\
6442    to, tolen), os::Solaris::clear_interrupted);
6443}
6444
6445int os::socket_available(int fd, jint *pbytes) {
6446   if (fd < 0)
6447     return OS_OK;
6448
6449   int ret;
6450
6451   RESTARTABLE(::ioctl(fd, FIONREAD, pbytes), ret);
6452
6453   //%% note ioctl can return 0 when successful, JVM_SocketAvailable
6454   // is expected to return 0 on failure and 1 on success to the jdk.
6455
6456   return (ret == OS_ERR) ? 0 : 1;
6457}
6458
6459
6460int os::bind(int fd, struct sockaddr *him, int len) {
6461   INTERRUPTIBLE_RETURN_INT_NORESTART(::bind(fd, him, len),\
6462     os::Solaris::clear_interrupted);
6463}
6464