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