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