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