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