os_aix.cpp revision 11811:133339642ba1
1/*
2 * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2012, 2016 SAP SE. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26// According to the AIX OS doc #pragma alloca must be used
27// with C++ compiler before referencing the function alloca()
28#pragma alloca
29
30// no precompiled headers
31#include "classfile/classLoader.hpp"
32#include "classfile/systemDictionary.hpp"
33#include "classfile/vmSymbols.hpp"
34#include "code/icBuffer.hpp"
35#include "code/vtableStubs.hpp"
36#include "compiler/compileBroker.hpp"
37#include "interpreter/interpreter.hpp"
38#include "jvm_aix.h"
39#include "logging/log.hpp"
40#include "libo4.hpp"
41#include "libperfstat_aix.hpp"
42#include "libodm_aix.hpp"
43#include "loadlib_aix.hpp"
44#include "memory/allocation.inline.hpp"
45#include "memory/filemap.hpp"
46#include "misc_aix.hpp"
47#include "oops/oop.inline.hpp"
48#include "os_aix.inline.hpp"
49#include "os_share_aix.hpp"
50#include "porting_aix.hpp"
51#include "prims/jniFastGetField.hpp"
52#include "prims/jvm.h"
53#include "prims/jvm_misc.hpp"
54#include "runtime/arguments.hpp"
55#include "runtime/atomic.inline.hpp"
56#include "runtime/extendedPC.hpp"
57#include "runtime/globals.hpp"
58#include "runtime/interfaceSupport.hpp"
59#include "runtime/java.hpp"
60#include "runtime/javaCalls.hpp"
61#include "runtime/mutexLocker.hpp"
62#include "runtime/objectMonitor.hpp"
63#include "runtime/orderAccess.inline.hpp"
64#include "runtime/os.hpp"
65#include "runtime/osThread.hpp"
66#include "runtime/perfMemory.hpp"
67#include "runtime/sharedRuntime.hpp"
68#include "runtime/statSampler.hpp"
69#include "runtime/stubRoutines.hpp"
70#include "runtime/thread.inline.hpp"
71#include "runtime/threadCritical.hpp"
72#include "runtime/timer.hpp"
73#include "runtime/vm_version.hpp"
74#include "services/attachListener.hpp"
75#include "services/runtimeService.hpp"
76#include "utilities/decoder.hpp"
77#include "utilities/defaultStream.hpp"
78#include "utilities/events.hpp"
79#include "utilities/growableArray.hpp"
80#include "utilities/vmError.hpp"
81
82// put OS-includes here (sorted alphabetically)
83#include <errno.h>
84#include <fcntl.h>
85#include <inttypes.h>
86#include <poll.h>
87#include <procinfo.h>
88#include <pthread.h>
89#include <pwd.h>
90#include <semaphore.h>
91#include <signal.h>
92#include <stdint.h>
93#include <stdio.h>
94#include <string.h>
95#include <unistd.h>
96#include <sys/ioctl.h>
97#include <sys/ipc.h>
98#include <sys/mman.h>
99#include <sys/resource.h>
100#include <sys/select.h>
101#include <sys/shm.h>
102#include <sys/socket.h>
103#include <sys/stat.h>
104#include <sys/sysinfo.h>
105#include <sys/systemcfg.h>
106#include <sys/time.h>
107#include <sys/times.h>
108#include <sys/types.h>
109#include <sys/utsname.h>
110#include <sys/vminfo.h>
111#include <sys/wait.h>
112
113// Missing prototypes for various system APIs.
114extern "C"
115int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t);
116
117#if !defined(_AIXVERSION_610)
118extern "C" int getthrds64(pid_t, struct thrdentry64*, int, tid64_t*, int);
119extern "C" int getprocs64(procentry64*, int, fdsinfo*, int, pid_t*, int);
120extern "C" int getargs   (procsinfo*, int, char*, int);
121#endif
122
123#define MAX_PATH (2 * K)
124
125// for timer info max values which include all bits
126#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
127// for multipage initialization error analysis (in 'g_multipage_error')
128#define ERROR_MP_OS_TOO_OLD                          100
129#define ERROR_MP_EXTSHM_ACTIVE                       101
130#define ERROR_MP_VMGETINFO_FAILED                    102
131#define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103
132
133// Query dimensions of the stack of the calling thread.
134static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size);
135static address resolve_function_descriptor_to_code_pointer(address p);
136
137static void vmembk_print_on(outputStream* os);
138
139////////////////////////////////////////////////////////////////////////////////
140// global variables (for a description see os_aix.hpp)
141
142julong    os::Aix::_physical_memory = 0;
143
144pthread_t os::Aix::_main_thread = ((pthread_t)0);
145int       os::Aix::_page_size = -1;
146
147// -1 = uninitialized, 0 if AIX, 1 if OS/400 pase
148int       os::Aix::_on_pase = -1;
149
150// 0 = uninitialized, otherwise 32 bit number:
151//  0xVVRRTTSS
152//  VV - major version
153//  RR - minor version
154//  TT - tech level, if known, 0 otherwise
155//  SS - service pack, if known, 0 otherwise
156uint32_t  os::Aix::_os_version = 0;
157
158// -1 = uninitialized, 0 - no, 1 - yes
159int       os::Aix::_xpg_sus_mode = -1;
160
161// -1 = uninitialized, 0 - no, 1 - yes
162int       os::Aix::_extshm = -1;
163
164////////////////////////////////////////////////////////////////////////////////
165// local variables
166
167static jlong    initial_time_count = 0;
168static int      clock_tics_per_sec = 100;
169static sigset_t check_signal_done;         // For diagnostics to print a message once (see run_periodic_checks)
170static bool     check_signals      = true;
171static int      SR_signum          = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769)
172static sigset_t SR_sigset;
173
174// Process break recorded at startup.
175static address g_brk_at_startup = NULL;
176
177// This describes the state of multipage support of the underlying
178// OS. Note that this is of no interest to the outsize world and
179// therefore should not be defined in AIX class.
180//
181// AIX supports four different page sizes - 4K, 64K, 16MB, 16GB. The
182// latter two (16M "large" resp. 16G "huge" pages) require special
183// setup and are normally not available.
184//
185// AIX supports multiple page sizes per process, for:
186//  - Stack (of the primordial thread, so not relevant for us)
187//  - Data - data, bss, heap, for us also pthread stacks
188//  - Text - text code
189//  - shared memory
190//
191// Default page sizes can be set via linker options (-bdatapsize, -bstacksize, ...)
192// and via environment variable LDR_CNTRL (DATAPSIZE, STACKPSIZE, ...).
193//
194// For shared memory, page size can be set dynamically via
195// shmctl(). Different shared memory regions can have different page
196// sizes.
197//
198// More information can be found at AIBM info center:
199//   http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm
200//
201static struct {
202  size_t pagesize;            // sysconf _SC_PAGESIZE (4K)
203  size_t datapsize;           // default data page size (LDR_CNTRL DATAPSIZE)
204  size_t shmpsize;            // default shared memory page size (LDR_CNTRL SHMPSIZE)
205  size_t pthr_stack_pagesize; // stack page size of pthread threads
206  size_t textpsize;           // default text page size (LDR_CNTRL STACKPSIZE)
207  bool can_use_64K_pages;     // True if we can alloc 64K pages dynamically with Sys V shm.
208  bool can_use_16M_pages;     // True if we can alloc 16M pages dynamically with Sys V shm.
209  int error;                  // Error describing if something went wrong at multipage init.
210} g_multipage_support = {
211  (size_t) -1,
212  (size_t) -1,
213  (size_t) -1,
214  (size_t) -1,
215  (size_t) -1,
216  false, false,
217  0
218};
219
220// We must not accidentally allocate memory close to the BRK - even if
221// that would work - because then we prevent the BRK segment from
222// growing which may result in a malloc OOM even though there is
223// enough memory. The problem only arises if we shmat() or mmap() at
224// a specific wish address, e.g. to place the heap in a
225// compressed-oops-friendly way.
226static bool is_close_to_brk(address a) {
227  assert0(g_brk_at_startup != NULL);
228  if (a >= g_brk_at_startup &&
229      a < (g_brk_at_startup + MaxExpectedDataSegmentSize)) {
230    return true;
231  }
232  return false;
233}
234
235julong os::available_memory() {
236  return Aix::available_memory();
237}
238
239julong os::Aix::available_memory() {
240  // Avoid expensive API call here, as returned value will always be null.
241  if (os::Aix::on_pase()) {
242    return 0x0LL;
243  }
244  os::Aix::meminfo_t mi;
245  if (os::Aix::get_meminfo(&mi)) {
246    return mi.real_free;
247  } else {
248    return ULONG_MAX;
249  }
250}
251
252julong os::physical_memory() {
253  return Aix::physical_memory();
254}
255
256// Return true if user is running as root.
257
258bool os::have_special_privileges() {
259  static bool init = false;
260  static bool privileges = false;
261  if (!init) {
262    privileges = (getuid() != geteuid()) || (getgid() != getegid());
263    init = true;
264  }
265  return privileges;
266}
267
268// Helper function, emulates disclaim64 using multiple 32bit disclaims
269// because we cannot use disclaim64() on AS/400 and old AIX releases.
270static bool my_disclaim64(char* addr, size_t size) {
271
272  if (size == 0) {
273    return true;
274  }
275
276  // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.)
277  const unsigned int maxDisclaimSize = 0x40000000;
278
279  const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize);
280  const unsigned int lastDisclaimSize = (size % maxDisclaimSize);
281
282  char* p = addr;
283
284  for (int i = 0; i < numFullDisclaimsNeeded; i ++) {
285    if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
286      trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
287      return false;
288    }
289    p += maxDisclaimSize;
290  }
291
292  if (lastDisclaimSize > 0) {
293    if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
294      trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
295      return false;
296    }
297  }
298
299  return true;
300}
301
302// Cpu architecture string
303#if defined(PPC32)
304static char cpu_arch[] = "ppc";
305#elif defined(PPC64)
306static char cpu_arch[] = "ppc64";
307#else
308#error Add appropriate cpu_arch setting
309#endif
310
311// Wrap the function "vmgetinfo" which is not available on older OS releases.
312static int checked_vmgetinfo(void *out, int command, int arg) {
313  if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) {
314    guarantee(false, "cannot call vmgetinfo on AS/400 older than V6R1");
315  }
316  return ::vmgetinfo(out, command, arg);
317}
318
319// Given an address, returns the size of the page backing that address.
320size_t os::Aix::query_pagesize(void* addr) {
321
322  if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) {
323    // AS/400 older than V6R1: no vmgetinfo here, default to 4K
324    return SIZE_4K;
325  }
326
327  vm_page_info pi;
328  pi.addr = (uint64_t)addr;
329  if (checked_vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) {
330    return pi.pagesize;
331  } else {
332    assert(false, "vmgetinfo failed to retrieve page size");
333    return SIZE_4K;
334  }
335}
336
337void os::Aix::initialize_system_info() {
338
339  // Get the number of online(logical) cpus instead of configured.
340  os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN);
341  assert(_processor_count > 0, "_processor_count must be > 0");
342
343  // Retrieve total physical storage.
344  os::Aix::meminfo_t mi;
345  if (!os::Aix::get_meminfo(&mi)) {
346    assert(false, "os::Aix::get_meminfo failed.");
347  }
348  _physical_memory = (julong) mi.real_total;
349}
350
351// Helper function for tracing page sizes.
352static const char* describe_pagesize(size_t pagesize) {
353  switch (pagesize) {
354    case SIZE_4K : return "4K";
355    case SIZE_64K: return "64K";
356    case SIZE_16M: return "16M";
357    case SIZE_16G: return "16G";
358    default:
359      assert(false, "surprise");
360      return "??";
361  }
362}
363
364// Probe OS for multipage support.
365// Will fill the global g_multipage_support structure.
366// Must be called before calling os::large_page_init().
367static void query_multipage_support() {
368
369  guarantee(g_multipage_support.pagesize == -1,
370            "do not call twice");
371
372  g_multipage_support.pagesize = ::sysconf(_SC_PAGESIZE);
373
374  // This really would surprise me.
375  assert(g_multipage_support.pagesize == SIZE_4K, "surprise!");
376
377  // Query default data page size (default page size for C-Heap, pthread stacks and .bss).
378  // Default data page size is defined either by linker options (-bdatapsize)
379  // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given,
380  // default should be 4K.
381  {
382    void* p = ::malloc(SIZE_16M);
383    g_multipage_support.datapsize = os::Aix::query_pagesize(p);
384    ::free(p);
385  }
386
387  // Query default shm page size (LDR_CNTRL SHMPSIZE).
388  // Note that this is pure curiosity. We do not rely on default page size but set
389  // our own page size after allocated.
390  {
391    const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
392    guarantee(shmid != -1, "shmget failed");
393    void* p = ::shmat(shmid, NULL, 0);
394    ::shmctl(shmid, IPC_RMID, NULL);
395    guarantee(p != (void*) -1, "shmat failed");
396    g_multipage_support.shmpsize = os::Aix::query_pagesize(p);
397    ::shmdt(p);
398  }
399
400  // Before querying the stack page size, make sure we are not running as primordial
401  // thread (because primordial thread's stack may have different page size than
402  // pthread thread stacks). Running a VM on the primordial thread won't work for a
403  // number of reasons so we may just as well guarantee it here.
404  guarantee0(!os::Aix::is_primordial_thread());
405
406  // Query pthread stack page size. Should be the same as data page size because
407  // pthread stacks are allocated from C-Heap.
408  {
409    int dummy = 0;
410    g_multipage_support.pthr_stack_pagesize = os::Aix::query_pagesize(&dummy);
411  }
412
413  // Query default text page size (LDR_CNTRL TEXTPSIZE).
414  {
415    address any_function =
416      resolve_function_descriptor_to_code_pointer((address)describe_pagesize);
417    g_multipage_support.textpsize = os::Aix::query_pagesize(any_function);
418  }
419
420  // Now probe for support of 64K pages and 16M pages.
421
422  // Before OS/400 V6R1, there is no support for pages other than 4K.
423  if (os::Aix::on_pase_V5R4_or_older()) {
424    trcVerbose("OS/400 < V6R1 - no large page support.");
425    g_multipage_support.error = ERROR_MP_OS_TOO_OLD;
426    goto query_multipage_support_end;
427  }
428
429  // Now check which page sizes the OS claims it supports, and of those, which actually can be used.
430  {
431    const int MAX_PAGE_SIZES = 4;
432    psize_t sizes[MAX_PAGE_SIZES];
433    const int num_psizes = checked_vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES);
434    if (num_psizes == -1) {
435      trcVerbose("vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)", errno);
436      trcVerbose("disabling multipage support.");
437      g_multipage_support.error = ERROR_MP_VMGETINFO_FAILED;
438      goto query_multipage_support_end;
439    }
440    guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed.");
441    assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?");
442    trcVerbose("vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes);
443    for (int i = 0; i < num_psizes; i ++) {
444      trcVerbose(" %s ", describe_pagesize(sizes[i]));
445    }
446
447    // Can we use 64K, 16M pages?
448    for (int i = 0; i < num_psizes; i ++) {
449      const size_t pagesize = sizes[i];
450      if (pagesize != SIZE_64K && pagesize != SIZE_16M) {
451        continue;
452      }
453      bool can_use = false;
454      trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize));
455      const int shmid = ::shmget(IPC_PRIVATE, pagesize,
456        IPC_CREAT | S_IRUSR | S_IWUSR);
457      guarantee0(shmid != -1); // Should always work.
458      // Try to set pagesize.
459      struct shmid_ds shm_buf = { 0 };
460      shm_buf.shm_pagesize = pagesize;
461      if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) {
462        const int en = errno;
463        ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
464        trcVerbose("shmctl(SHM_PAGESIZE) failed with errno=%n",
465          errno);
466      } else {
467        // Attach and double check pageisze.
468        void* p = ::shmat(shmid, NULL, 0);
469        ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
470        guarantee0(p != (void*) -1); // Should always work.
471        const size_t real_pagesize = os::Aix::query_pagesize(p);
472        if (real_pagesize != pagesize) {
473          trcVerbose("real page size (0x%llX) differs.", real_pagesize);
474        } else {
475          can_use = true;
476        }
477        ::shmdt(p);
478      }
479      trcVerbose("Can use: %s", (can_use ? "yes" : "no"));
480      if (pagesize == SIZE_64K) {
481        g_multipage_support.can_use_64K_pages = can_use;
482      } else if (pagesize == SIZE_16M) {
483        g_multipage_support.can_use_16M_pages = can_use;
484      }
485    }
486
487  } // end: check which pages can be used for shared memory
488
489query_multipage_support_end:
490
491  trcVerbose("base page size (sysconf _SC_PAGESIZE): %s",
492      describe_pagesize(g_multipage_support.pagesize));
493  trcVerbose("Data page size (C-Heap, bss, etc): %s",
494      describe_pagesize(g_multipage_support.datapsize));
495  trcVerbose("Text page size: %s",
496      describe_pagesize(g_multipage_support.textpsize));
497  trcVerbose("Thread stack page size (pthread): %s",
498      describe_pagesize(g_multipage_support.pthr_stack_pagesize));
499  trcVerbose("Default shared memory page size: %s",
500      describe_pagesize(g_multipage_support.shmpsize));
501  trcVerbose("Can use 64K pages dynamically with shared meory: %s",
502      (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
503  trcVerbose("Can use 16M pages dynamically with shared memory: %s",
504      (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
505  trcVerbose("Multipage error details: %d",
506      g_multipage_support.error);
507
508  // sanity checks
509  assert0(g_multipage_support.pagesize == SIZE_4K);
510  assert0(g_multipage_support.datapsize == SIZE_4K || g_multipage_support.datapsize == SIZE_64K);
511  assert0(g_multipage_support.textpsize == SIZE_4K || g_multipage_support.textpsize == SIZE_64K);
512  assert0(g_multipage_support.pthr_stack_pagesize == g_multipage_support.datapsize);
513  assert0(g_multipage_support.shmpsize == SIZE_4K || g_multipage_support.shmpsize == SIZE_64K);
514
515}
516
517void os::init_system_properties_values() {
518
519#define DEFAULT_LIBPATH "/lib:/usr/lib"
520#define EXTENSIONS_DIR  "/lib/ext"
521
522  // Buffer that fits several sprintfs.
523  // Note that the space for the trailing null is provided
524  // by the nulls included by the sizeof operator.
525  const size_t bufsize =
526    MAX2((size_t)MAXPATHLEN,  // For dll_dir & friends.
527         (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR)); // extensions dir
528  char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
529
530  // sysclasspath, java_home, dll_dir
531  {
532    char *pslash;
533    os::jvm_path(buf, bufsize);
534
535    // Found the full path to libjvm.so.
536    // Now cut the path to <java_home>/jre if we can.
537    pslash = strrchr(buf, '/');
538    if (pslash != NULL) {
539      *pslash = '\0';            // Get rid of /libjvm.so.
540    }
541    pslash = strrchr(buf, '/');
542    if (pslash != NULL) {
543      *pslash = '\0';            // Get rid of /{client|server|hotspot}.
544    }
545    Arguments::set_dll_dir(buf);
546
547    if (pslash != NULL) {
548      pslash = strrchr(buf, '/');
549      if (pslash != NULL) {
550        *pslash = '\0';          // Get rid of /<arch>.
551        pslash = strrchr(buf, '/');
552        if (pslash != NULL) {
553          *pslash = '\0';        // Get rid of /lib.
554        }
555      }
556    }
557    Arguments::set_java_home(buf);
558    set_boot_path('/', ':');
559  }
560
561  // Where to look for native libraries.
562
563  // On Aix we get the user setting of LIBPATH.
564  // Eventually, all the library path setting will be done here.
565  // Get the user setting of LIBPATH.
566  const char *v = ::getenv("LIBPATH");
567  const char *v_colon = ":";
568  if (v == NULL) { v = ""; v_colon = ""; }
569
570  // Concatenate user and invariant part of ld_library_path.
571  // That's +1 for the colon and +1 for the trailing '\0'.
572  char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
573  sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
574  Arguments::set_library_path(ld_library_path);
575  FREE_C_HEAP_ARRAY(char, ld_library_path);
576
577  // Extensions directories.
578  sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
579  Arguments::set_ext_dirs(buf);
580
581  FREE_C_HEAP_ARRAY(char, buf);
582
583#undef DEFAULT_LIBPATH
584#undef EXTENSIONS_DIR
585}
586
587////////////////////////////////////////////////////////////////////////////////
588// breakpoint support
589
590void os::breakpoint() {
591  BREAKPOINT;
592}
593
594extern "C" void breakpoint() {
595  // use debugger to set breakpoint here
596}
597
598////////////////////////////////////////////////////////////////////////////////
599// signal support
600
601debug_only(static bool signal_sets_initialized = false);
602static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
603
604bool os::Aix::is_sig_ignored(int sig) {
605  struct sigaction oact;
606  sigaction(sig, (struct sigaction*)NULL, &oact);
607  void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
608    : CAST_FROM_FN_PTR(void*, oact.sa_handler);
609  if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
610    return true;
611  } else {
612    return false;
613  }
614}
615
616void os::Aix::signal_sets_init() {
617  // Should also have an assertion stating we are still single-threaded.
618  assert(!signal_sets_initialized, "Already initialized");
619  // Fill in signals that are necessarily unblocked for all threads in
620  // the VM. Currently, we unblock the following signals:
621  // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
622  //                         by -Xrs (=ReduceSignalUsage));
623  // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
624  // other threads. The "ReduceSignalUsage" boolean tells us not to alter
625  // the dispositions or masks wrt these signals.
626  // Programs embedding the VM that want to use the above signals for their
627  // own purposes must, at this time, use the "-Xrs" option to prevent
628  // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
629  // (See bug 4345157, and other related bugs).
630  // In reality, though, unblocking these signals is really a nop, since
631  // these signals are not blocked by default.
632  sigemptyset(&unblocked_sigs);
633  sigemptyset(&allowdebug_blocked_sigs);
634  sigaddset(&unblocked_sigs, SIGILL);
635  sigaddset(&unblocked_sigs, SIGSEGV);
636  sigaddset(&unblocked_sigs, SIGBUS);
637  sigaddset(&unblocked_sigs, SIGFPE);
638  sigaddset(&unblocked_sigs, SIGTRAP);
639  sigaddset(&unblocked_sigs, SIGDANGER);
640  sigaddset(&unblocked_sigs, SR_signum);
641
642  if (!ReduceSignalUsage) {
643   if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
644     sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
645     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
646   }
647   if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
648     sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
649     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
650   }
651   if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
652     sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
653     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
654   }
655  }
656  // Fill in signals that are blocked by all but the VM thread.
657  sigemptyset(&vm_sigs);
658  if (!ReduceSignalUsage)
659    sigaddset(&vm_sigs, BREAK_SIGNAL);
660  debug_only(signal_sets_initialized = true);
661}
662
663// These are signals that are unblocked while a thread is running Java.
664// (For some reason, they get blocked by default.)
665sigset_t* os::Aix::unblocked_signals() {
666  assert(signal_sets_initialized, "Not initialized");
667  return &unblocked_sigs;
668}
669
670// These are the signals that are blocked while a (non-VM) thread is
671// running Java. Only the VM thread handles these signals.
672sigset_t* os::Aix::vm_signals() {
673  assert(signal_sets_initialized, "Not initialized");
674  return &vm_sigs;
675}
676
677// These are signals that are blocked during cond_wait to allow debugger in
678sigset_t* os::Aix::allowdebug_blocked_signals() {
679  assert(signal_sets_initialized, "Not initialized");
680  return &allowdebug_blocked_sigs;
681}
682
683void os::Aix::hotspot_sigmask(Thread* thread) {
684
685  //Save caller's signal mask before setting VM signal mask
686  sigset_t caller_sigmask;
687  pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
688
689  OSThread* osthread = thread->osthread();
690  osthread->set_caller_sigmask(caller_sigmask);
691
692  pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL);
693
694  if (!ReduceSignalUsage) {
695    if (thread->is_VM_thread()) {
696      // Only the VM thread handles BREAK_SIGNAL ...
697      pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
698    } else {
699      // ... all other threads block BREAK_SIGNAL
700      pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
701    }
702  }
703}
704
705// retrieve memory information.
706// Returns false if something went wrong;
707// content of pmi undefined in this case.
708bool os::Aix::get_meminfo(meminfo_t* pmi) {
709
710  assert(pmi, "get_meminfo: invalid parameter");
711
712  memset(pmi, 0, sizeof(meminfo_t));
713
714  if (os::Aix::on_pase()) {
715    // On PASE, use the libo4 porting library.
716
717    unsigned long long virt_total = 0;
718    unsigned long long real_total = 0;
719    unsigned long long real_free = 0;
720    unsigned long long pgsp_total = 0;
721    unsigned long long pgsp_free = 0;
722    if (libo4::get_memory_info(&virt_total, &real_total, &real_free, &pgsp_total, &pgsp_free)) {
723      pmi->virt_total = virt_total;
724      pmi->real_total = real_total;
725      pmi->real_free = real_free;
726      pmi->pgsp_total = pgsp_total;
727      pmi->pgsp_free = pgsp_free;
728      return true;
729    }
730    return false;
731
732  } else {
733
734    // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics
735    // See:
736    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
737    //        ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm
738    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
739    //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
740
741    perfstat_memory_total_t psmt;
742    memset (&psmt, '\0', sizeof(psmt));
743    const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1);
744    if (rc == -1) {
745      trcVerbose("perfstat_memory_total() failed (errno=%d)", errno);
746      assert(0, "perfstat_memory_total() failed");
747      return false;
748    }
749
750    assert(rc == 1, "perfstat_memory_total() - weird return code");
751
752    // excerpt from
753    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
754    //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
755    // The fields of perfstat_memory_total_t:
756    // u_longlong_t virt_total         Total virtual memory (in 4 KB pages).
757    // u_longlong_t real_total         Total real memory (in 4 KB pages).
758    // u_longlong_t real_free          Free real memory (in 4 KB pages).
759    // u_longlong_t pgsp_total         Total paging space (in 4 KB pages).
760    // u_longlong_t pgsp_free          Free paging space (in 4 KB pages).
761
762    pmi->virt_total = psmt.virt_total * 4096;
763    pmi->real_total = psmt.real_total * 4096;
764    pmi->real_free = psmt.real_free * 4096;
765    pmi->pgsp_total = psmt.pgsp_total * 4096;
766    pmi->pgsp_free = psmt.pgsp_free * 4096;
767
768    return true;
769
770  }
771} // end os::Aix::get_meminfo
772
773//////////////////////////////////////////////////////////////////////////////
774// create new thread
775
776// Thread start routine for all newly created threads
777static void *thread_native_entry(Thread *thread) {
778
779  // find out my own stack dimensions
780  {
781    // actually, this should do exactly the same as thread->record_stack_base_and_size...
782    address base = 0;
783    size_t size = 0;
784    query_stack_dimensions(&base, &size);
785    thread->set_stack_base(base);
786    thread->set_stack_size(size);
787  }
788
789  const pthread_t pthread_id = ::pthread_self();
790  const tid_t kernel_thread_id = ::thread_self();
791
792  log_info(os, thread)("Thread is alive (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
793    os::current_thread_id(), (uintx) kernel_thread_id);
794
795  // Normally, pthread stacks on AIX live in the data segment (are allocated with malloc()
796  // by the pthread library). In rare cases, this may not be the case, e.g. when third-party
797  // tools hook pthread_create(). In this case, we may run into problems establishing
798  // guard pages on those stacks, because the stacks may reside in memory which is not
799  // protectable (shmated).
800  if (thread->stack_base() > ::sbrk(0)) {
801    log_warning(os, thread)("Thread stack not in data segment.");
802  }
803
804  // Try to randomize the cache line index of hot stack frames.
805  // This helps when threads of the same stack traces evict each other's
806  // cache lines. The threads can be either from the same JVM instance, or
807  // from different JVM instances. The benefit is especially true for
808  // processors with hyperthreading technology.
809
810  static int counter = 0;
811  int pid = os::current_process_id();
812  alloca(((pid ^ counter++) & 7) * 128);
813
814  thread->initialize_thread_current();
815
816  OSThread* osthread = thread->osthread();
817
818  // Thread_id is pthread id.
819  osthread->set_thread_id(pthread_id);
820
821  // .. but keep kernel thread id too for diagnostics
822  osthread->set_kernel_thread_id(kernel_thread_id);
823
824  // Initialize signal mask for this thread.
825  os::Aix::hotspot_sigmask(thread);
826
827  // Initialize floating point control register.
828  os::Aix::init_thread_fpu_state();
829
830  assert(osthread->get_state() == RUNNABLE, "invalid os thread state");
831
832  // Call one more level start routine.
833  thread->run();
834
835  log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
836    os::current_thread_id(), (uintx) kernel_thread_id);
837
838  // If a thread has not deleted itself ("delete this") as part of its
839  // termination sequence, we have to ensure thread-local-storage is
840  // cleared before we actually terminate. No threads should ever be
841  // deleted asynchronously with respect to their termination.
842  if (Thread::current_or_null_safe() != NULL) {
843    assert(Thread::current_or_null_safe() == thread, "current thread is wrong");
844    thread->clear_thread_current();
845  }
846
847  return 0;
848}
849
850bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
851
852  assert(thread->osthread() == NULL, "caller responsible");
853
854  // Allocate the OSThread object
855  OSThread* osthread = new OSThread(NULL, NULL);
856  if (osthread == NULL) {
857    return false;
858  }
859
860  // set the correct thread state
861  osthread->set_thread_type(thr_type);
862
863  // Initial state is ALLOCATED but not INITIALIZED
864  osthread->set_state(ALLOCATED);
865
866  thread->set_osthread(osthread);
867
868  // init thread attributes
869  pthread_attr_t attr;
870  pthread_attr_init(&attr);
871  guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
872
873  // Make sure we run in 1:1 kernel-user-thread mode.
874  if (os::Aix::on_aix()) {
875    guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
876    guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
877  } // end: aix
878
879  // Start in suspended state, and in os::thread_start, wake the thread up.
880  guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
881
882  // calculate stack size if it's not specified by caller
883  if (stack_size == 0) {
884    stack_size = os::Aix::default_stack_size(thr_type);
885
886    switch (thr_type) {
887    case os::java_thread:
888      // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss.
889      assert(JavaThread::stack_size_at_create() > 0, "this should be set");
890      stack_size = JavaThread::stack_size_at_create();
891      break;
892    case os::compiler_thread:
893      if (CompilerThreadStackSize > 0) {
894        stack_size = (size_t)(CompilerThreadStackSize * K);
895        break;
896      } // else fall through:
897        // use VMThreadStackSize if CompilerThreadStackSize is not defined
898    case os::vm_thread:
899    case os::pgc_thread:
900    case os::cgc_thread:
901    case os::watcher_thread:
902      if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
903      break;
904    }
905  }
906
907  stack_size = MAX2(stack_size, os::Aix::min_stack_allowed);
908  pthread_attr_setstacksize(&attr, stack_size);
909
910  pthread_t tid;
911  int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
912
913
914  char buf[64];
915  if (ret == 0) {
916    log_info(os, thread)("Thread started (pthread id: " UINTX_FORMAT ", attributes: %s). ",
917      (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
918  } else {
919    log_warning(os, thread)("Failed to start thread - pthread_create failed (%d=%s) for attributes: %s.",
920      ret, os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
921  }
922
923  pthread_attr_destroy(&attr);
924
925  if (ret != 0) {
926    // Need to clean up stuff we've allocated so far
927    thread->set_osthread(NULL);
928    delete osthread;
929    return false;
930  }
931
932  // OSThread::thread_id is the pthread id.
933  osthread->set_thread_id(tid);
934
935  return true;
936}
937
938/////////////////////////////////////////////////////////////////////////////
939// attach existing thread
940
941// bootstrap the main thread
942bool os::create_main_thread(JavaThread* thread) {
943  assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread");
944  return create_attached_thread(thread);
945}
946
947bool os::create_attached_thread(JavaThread* thread) {
948#ifdef ASSERT
949    thread->verify_not_published();
950#endif
951
952  // Allocate the OSThread object
953  OSThread* osthread = new OSThread(NULL, NULL);
954
955  if (osthread == NULL) {
956    return false;
957  }
958
959  const pthread_t pthread_id = ::pthread_self();
960  const tid_t kernel_thread_id = ::thread_self();
961
962  // OSThread::thread_id is the pthread id.
963  osthread->set_thread_id(pthread_id);
964
965  // .. but keep kernel thread id too for diagnostics
966  osthread->set_kernel_thread_id(kernel_thread_id);
967
968  // initialize floating point control register
969  os::Aix::init_thread_fpu_state();
970
971  // Initial thread state is RUNNABLE
972  osthread->set_state(RUNNABLE);
973
974  thread->set_osthread(osthread);
975
976  if (UseNUMA) {
977    int lgrp_id = os::numa_get_group_id();
978    if (lgrp_id != -1) {
979      thread->set_lgrp_id(lgrp_id);
980    }
981  }
982
983  // initialize signal mask for this thread
984  // and save the caller's signal mask
985  os::Aix::hotspot_sigmask(thread);
986
987  log_info(os, thread)("Thread attached (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
988    os::current_thread_id(), (uintx) kernel_thread_id);
989
990  return true;
991}
992
993void os::pd_start_thread(Thread* thread) {
994  int status = pthread_continue_np(thread->osthread()->pthread_id());
995  assert(status == 0, "thr_continue failed");
996}
997
998// Free OS resources related to the OSThread
999void os::free_thread(OSThread* osthread) {
1000  assert(osthread != NULL, "osthread not set");
1001
1002  // We are told to free resources of the argument thread,
1003  // but we can only really operate on the current thread.
1004  assert(Thread::current()->osthread() == osthread,
1005         "os::free_thread but not current thread");
1006
1007  // Restore caller's signal mask
1008  sigset_t sigmask = osthread->caller_sigmask();
1009  pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
1010
1011  delete osthread;
1012}
1013
1014////////////////////////////////////////////////////////////////////////////////
1015// time support
1016
1017// Time since start-up in seconds to a fine granularity.
1018// Used by VMSelfDestructTimer and the MemProfiler.
1019double os::elapsedTime() {
1020  return (double)(os::elapsed_counter()) * 0.000001;
1021}
1022
1023jlong os::elapsed_counter() {
1024  timeval time;
1025  int status = gettimeofday(&time, NULL);
1026  return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
1027}
1028
1029jlong os::elapsed_frequency() {
1030  return (1000 * 1000);
1031}
1032
1033bool os::supports_vtime() { return true; }
1034bool os::enable_vtime()   { return false; }
1035bool os::vtime_enabled()  { return false; }
1036
1037double os::elapsedVTime() {
1038  struct rusage usage;
1039  int retval = getrusage(RUSAGE_THREAD, &usage);
1040  if (retval == 0) {
1041    return usage.ru_utime.tv_sec + usage.ru_stime.tv_sec + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / (1000.0 * 1000);
1042  } else {
1043    // better than nothing, but not much
1044    return elapsedTime();
1045  }
1046}
1047
1048jlong os::javaTimeMillis() {
1049  timeval time;
1050  int status = gettimeofday(&time, NULL);
1051  assert(status != -1, "aix error at gettimeofday()");
1052  return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
1053}
1054
1055void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
1056  timeval time;
1057  int status = gettimeofday(&time, NULL);
1058  assert(status != -1, "aix error at gettimeofday()");
1059  seconds = jlong(time.tv_sec);
1060  nanos = jlong(time.tv_usec) * 1000;
1061}
1062
1063jlong os::javaTimeNanos() {
1064  if (os::Aix::on_pase()) {
1065
1066    timeval time;
1067    int status = gettimeofday(&time, NULL);
1068    assert(status != -1, "PASE error at gettimeofday()");
1069    jlong usecs = jlong((unsigned long long) time.tv_sec * (1000 * 1000) + time.tv_usec);
1070    return 1000 * usecs;
1071
1072  } else {
1073    // On AIX use the precision of processors real time clock
1074    // or time base registers.
1075    timebasestruct_t time;
1076    int rc;
1077
1078    // If the CPU has a time register, it will be used and
1079    // we have to convert to real time first. After convertion we have following data:
1080    // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970]
1081    // time.tb_low  [nanoseconds after the last full second above]
1082    // We better use mread_real_time here instead of read_real_time
1083    // to ensure that we will get a monotonic increasing time.
1084    if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) {
1085      rc = time_base_to_time(&time, TIMEBASE_SZ);
1086      assert(rc != -1, "aix error at time_base_to_time()");
1087    }
1088    return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low);
1089  }
1090}
1091
1092void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
1093  info_ptr->max_value = ALL_64_BITS;
1094  // mread_real_time() is monotonic (see 'os::javaTimeNanos()')
1095  info_ptr->may_skip_backward = false;
1096  info_ptr->may_skip_forward = false;
1097  info_ptr->kind = JVMTI_TIMER_ELAPSED;    // elapsed not CPU time
1098}
1099
1100// Return the real, user, and system times in seconds from an
1101// arbitrary fixed point in the past.
1102bool os::getTimesSecs(double* process_real_time,
1103                      double* process_user_time,
1104                      double* process_system_time) {
1105  struct tms ticks;
1106  clock_t real_ticks = times(&ticks);
1107
1108  if (real_ticks == (clock_t) (-1)) {
1109    return false;
1110  } else {
1111    double ticks_per_second = (double) clock_tics_per_sec;
1112    *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
1113    *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
1114    *process_real_time = ((double) real_ticks) / ticks_per_second;
1115
1116    return true;
1117  }
1118}
1119
1120char * os::local_time_string(char *buf, size_t buflen) {
1121  struct tm t;
1122  time_t long_time;
1123  time(&long_time);
1124  localtime_r(&long_time, &t);
1125  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1126               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1127               t.tm_hour, t.tm_min, t.tm_sec);
1128  return buf;
1129}
1130
1131struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
1132  return localtime_r(clock, res);
1133}
1134
1135////////////////////////////////////////////////////////////////////////////////
1136// runtime exit support
1137
1138// Note: os::shutdown() might be called very early during initialization, or
1139// called from signal handler. Before adding something to os::shutdown(), make
1140// sure it is async-safe and can handle partially initialized VM.
1141void os::shutdown() {
1142
1143  // allow PerfMemory to attempt cleanup of any persistent resources
1144  perfMemory_exit();
1145
1146  // needs to remove object in file system
1147  AttachListener::abort();
1148
1149  // flush buffered output, finish log files
1150  ostream_abort();
1151
1152  // Check for abort hook
1153  abort_hook_t abort_hook = Arguments::abort_hook();
1154  if (abort_hook != NULL) {
1155    abort_hook();
1156  }
1157}
1158
1159// Note: os::abort() might be called very early during initialization, or
1160// called from signal handler. Before adding something to os::abort(), make
1161// sure it is async-safe and can handle partially initialized VM.
1162void os::abort(bool dump_core, void* siginfo, const void* context) {
1163  os::shutdown();
1164  if (dump_core) {
1165#ifndef PRODUCT
1166    fdStream out(defaultStream::output_fd());
1167    out.print_raw("Current thread is ");
1168    char buf[16];
1169    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
1170    out.print_raw_cr(buf);
1171    out.print_raw_cr("Dumping core ...");
1172#endif
1173    ::abort(); // dump core
1174  }
1175
1176  ::exit(1);
1177}
1178
1179// Die immediately, no exit hook, no abort hook, no cleanup.
1180void os::die() {
1181  ::abort();
1182}
1183
1184// This method is a copy of JDK's sysGetLastErrorString
1185// from src/solaris/hpi/src/system_md.c
1186
1187size_t os::lasterror(char *buf, size_t len) {
1188  if (errno == 0) return 0;
1189
1190  const char *s = os::strerror(errno);
1191  size_t n = ::strlen(s);
1192  if (n >= len) {
1193    n = len - 1;
1194  }
1195  ::strncpy(buf, s, n);
1196  buf[n] = '\0';
1197  return n;
1198}
1199
1200intx os::current_thread_id() {
1201  return (intx)pthread_self();
1202}
1203
1204int os::current_process_id() {
1205  return getpid();
1206}
1207
1208// DLL functions
1209
1210const char* os::dll_file_extension() { return ".so"; }
1211
1212// This must be hard coded because it's the system's temporary
1213// directory not the java application's temp directory, ala java.io.tmpdir.
1214const char* os::get_temp_directory() { return "/tmp"; }
1215
1216static bool file_exists(const char* filename) {
1217  struct stat statbuf;
1218  if (filename == NULL || strlen(filename) == 0) {
1219    return false;
1220  }
1221  return os::stat(filename, &statbuf) == 0;
1222}
1223
1224bool os::dll_build_name(char* buffer, size_t buflen,
1225                        const char* pname, const char* fname) {
1226  bool retval = false;
1227  // Copied from libhpi
1228  const size_t pnamelen = pname ? strlen(pname) : 0;
1229
1230  // Return error on buffer overflow.
1231  if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1232    *buffer = '\0';
1233    return retval;
1234  }
1235
1236  if (pnamelen == 0) {
1237    snprintf(buffer, buflen, "lib%s.so", fname);
1238    retval = true;
1239  } else if (strchr(pname, *os::path_separator()) != NULL) {
1240    int n;
1241    char** pelements = split_path(pname, &n);
1242    if (pelements == NULL) {
1243      return false;
1244    }
1245    for (int i = 0; i < n; i++) {
1246      // Really shouldn't be NULL, but check can't hurt
1247      if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1248        continue; // skip the empty path values
1249      }
1250      snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1251      if (file_exists(buffer)) {
1252        retval = true;
1253        break;
1254      }
1255    }
1256    // release the storage
1257    for (int i = 0; i < n; i++) {
1258      if (pelements[i] != NULL) {
1259        FREE_C_HEAP_ARRAY(char, pelements[i]);
1260      }
1261    }
1262    if (pelements != NULL) {
1263      FREE_C_HEAP_ARRAY(char*, pelements);
1264    }
1265  } else {
1266    snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1267    retval = true;
1268  }
1269  return retval;
1270}
1271
1272// Check if addr is inside libjvm.so.
1273bool os::address_is_in_vm(address addr) {
1274
1275  // Input could be a real pc or a function pointer literal. The latter
1276  // would be a function descriptor residing in the data segment of a module.
1277  loaded_module_t lm;
1278  if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL) {
1279    return lm.is_in_vm;
1280  } else if (LoadedLibraries::find_for_data_address(addr, &lm) != NULL) {
1281    return lm.is_in_vm;
1282  } else {
1283    return false;
1284  }
1285
1286}
1287
1288// Resolve an AIX function descriptor literal to a code pointer.
1289// If the input is a valid code pointer to a text segment of a loaded module,
1290//   it is returned unchanged.
1291// If the input is a valid AIX function descriptor, it is resolved to the
1292//   code entry point.
1293// If the input is neither a valid function descriptor nor a valid code pointer,
1294//   NULL is returned.
1295static address resolve_function_descriptor_to_code_pointer(address p) {
1296
1297  if (LoadedLibraries::find_for_text_address(p, NULL) != NULL) {
1298    // It is a real code pointer.
1299    return p;
1300  } else if (LoadedLibraries::find_for_data_address(p, NULL) != NULL) {
1301    // Pointer to data segment, potential function descriptor.
1302    address code_entry = (address)(((FunctionDescriptor*)p)->entry());
1303    if (LoadedLibraries::find_for_text_address(code_entry, NULL) != NULL) {
1304      // It is a function descriptor.
1305      return code_entry;
1306    }
1307  }
1308
1309  return NULL;
1310}
1311
1312bool os::dll_address_to_function_name(address addr, char *buf,
1313                                      int buflen, int *offset,
1314                                      bool demangle) {
1315  if (offset) {
1316    *offset = -1;
1317  }
1318  // Buf is not optional, but offset is optional.
1319  assert(buf != NULL, "sanity check");
1320  buf[0] = '\0';
1321
1322  // Resolve function ptr literals first.
1323  addr = resolve_function_descriptor_to_code_pointer(addr);
1324  if (!addr) {
1325    return false;
1326  }
1327
1328  return AixSymbols::get_function_name(addr, buf, buflen, offset, NULL, demangle);
1329}
1330
1331bool os::dll_address_to_library_name(address addr, char* buf,
1332                                     int buflen, int* offset) {
1333  if (offset) {
1334    *offset = -1;
1335  }
1336  // Buf is not optional, but offset is optional.
1337  assert(buf != NULL, "sanity check");
1338  buf[0] = '\0';
1339
1340  // Resolve function ptr literals first.
1341  addr = resolve_function_descriptor_to_code_pointer(addr);
1342  if (!addr) {
1343    return false;
1344  }
1345
1346  return AixSymbols::get_module_name(addr, buf, buflen);
1347}
1348
1349// Loads .dll/.so and in case of error it checks if .dll/.so was built
1350// for the same architecture as Hotspot is running on.
1351void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
1352
1353  if (ebuf && ebuflen > 0) {
1354    ebuf[0] = '\0';
1355    ebuf[ebuflen - 1] = '\0';
1356  }
1357
1358  if (!filename || strlen(filename) == 0) {
1359    ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
1360    return NULL;
1361  }
1362
1363  // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
1364  void * result= ::dlopen(filename, RTLD_LAZY);
1365  if (result != NULL) {
1366    // Reload dll cache. Don't do this in signal handling.
1367    LoadedLibraries::reload();
1368    return result;
1369  } else {
1370    // error analysis when dlopen fails
1371    const char* const error_report = ::dlerror();
1372    if (error_report && ebuf && ebuflen > 0) {
1373      snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s",
1374               filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report);
1375    }
1376  }
1377  return NULL;
1378}
1379
1380void* os::dll_lookup(void* handle, const char* name) {
1381  void* res = dlsym(handle, name);
1382  return res;
1383}
1384
1385void* os::get_default_process_handle() {
1386  return (void*)::dlopen(NULL, RTLD_LAZY);
1387}
1388
1389void os::print_dll_info(outputStream *st) {
1390  st->print_cr("Dynamic libraries:");
1391  LoadedLibraries::print(st);
1392}
1393
1394void os::get_summary_os_info(char* buf, size_t buflen) {
1395  // There might be something more readable than uname results for AIX.
1396  struct utsname name;
1397  uname(&name);
1398  snprintf(buf, buflen, "%s %s", name.release, name.version);
1399}
1400
1401void os::print_os_info(outputStream* st) {
1402  st->print("OS:");
1403
1404  st->print("uname:");
1405  struct utsname name;
1406  uname(&name);
1407  st->print(name.sysname); st->print(" ");
1408  st->print(name.nodename); st->print(" ");
1409  st->print(name.release); st->print(" ");
1410  st->print(name.version); st->print(" ");
1411  st->print(name.machine);
1412  st->cr();
1413
1414  uint32_t ver = os::Aix::os_version();
1415  st->print_cr("AIX kernel version %u.%u.%u.%u",
1416               (ver >> 24) & 0xFF, (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
1417
1418  // rlimit
1419  st->print("rlimit:");
1420  struct rlimit rlim;
1421
1422  st->print(" STACK ");
1423  getrlimit(RLIMIT_STACK, &rlim);
1424  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1425  else st->print("%uk", rlim.rlim_cur >> 10);
1426
1427  st->print(", CORE ");
1428  getrlimit(RLIMIT_CORE, &rlim);
1429  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1430  else st->print("%uk", rlim.rlim_cur >> 10);
1431
1432  st->print(", NPROC ");
1433  st->print("%d", sysconf(_SC_CHILD_MAX));
1434
1435  st->print(", NOFILE ");
1436  getrlimit(RLIMIT_NOFILE, &rlim);
1437  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1438  else st->print("%d", rlim.rlim_cur);
1439
1440  st->print(", AS ");
1441  getrlimit(RLIMIT_AS, &rlim);
1442  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1443  else st->print("%uk", rlim.rlim_cur >> 10);
1444
1445  // Print limits on DATA, because it limits the C-heap.
1446  st->print(", DATA ");
1447  getrlimit(RLIMIT_DATA, &rlim);
1448  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1449  else st->print("%uk", rlim.rlim_cur >> 10);
1450  st->cr();
1451
1452  // load average
1453  st->print("load average:");
1454  double loadavg[3] = {-1.L, -1.L, -1.L};
1455  os::loadavg(loadavg, 3);
1456  st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
1457  st->cr();
1458
1459  // print wpar info
1460  libperfstat::wparinfo_t wi;
1461  if (libperfstat::get_wparinfo(&wi)) {
1462    st->print_cr("wpar info");
1463    st->print_cr("name: %s", wi.name);
1464    st->print_cr("id:   %d", wi.wpar_id);
1465    st->print_cr("type: %s", (wi.app_wpar ? "application" : "system"));
1466  }
1467
1468  // print partition info
1469  libperfstat::partitioninfo_t pi;
1470  if (libperfstat::get_partitioninfo(&pi)) {
1471    st->print_cr("partition info");
1472    st->print_cr(" name: %s", pi.name);
1473  }
1474
1475}
1476
1477void os::print_memory_info(outputStream* st) {
1478
1479  st->print_cr("Memory:");
1480
1481  st->print_cr("  Base page size (sysconf _SC_PAGESIZE):  %s",
1482    describe_pagesize(g_multipage_support.pagesize));
1483  st->print_cr("  Data page size (C-Heap, bss, etc):      %s",
1484    describe_pagesize(g_multipage_support.datapsize));
1485  st->print_cr("  Text page size:                         %s",
1486    describe_pagesize(g_multipage_support.textpsize));
1487  st->print_cr("  Thread stack page size (pthread):       %s",
1488    describe_pagesize(g_multipage_support.pthr_stack_pagesize));
1489  st->print_cr("  Default shared memory page size:        %s",
1490    describe_pagesize(g_multipage_support.shmpsize));
1491  st->print_cr("  Can use 64K pages dynamically with shared meory:  %s",
1492    (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
1493  st->print_cr("  Can use 16M pages dynamically with shared memory: %s",
1494    (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
1495  st->print_cr("  Multipage error: %d",
1496    g_multipage_support.error);
1497  st->cr();
1498  st->print_cr("  os::vm_page_size:       %s", describe_pagesize(os::vm_page_size()));
1499
1500  // print out LDR_CNTRL because it affects the default page sizes
1501  const char* const ldr_cntrl = ::getenv("LDR_CNTRL");
1502  st->print_cr("  LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>");
1503
1504  // Print out EXTSHM because it is an unsupported setting.
1505  const char* const extshm = ::getenv("EXTSHM");
1506  st->print_cr("  EXTSHM=%s.", extshm ? extshm : "<unset>");
1507  if ( (strcmp(extshm, "on") == 0) || (strcmp(extshm, "ON") == 0) ) {
1508    st->print_cr("  *** Unsupported! Please remove EXTSHM from your environment! ***");
1509  }
1510
1511  // Print out AIXTHREAD_GUARDPAGES because it affects the size of pthread stacks.
1512  const char* const aixthread_guardpages = ::getenv("AIXTHREAD_GUARDPAGES");
1513  st->print_cr("  AIXTHREAD_GUARDPAGES=%s.",
1514      aixthread_guardpages ? aixthread_guardpages : "<unset>");
1515
1516  os::Aix::meminfo_t mi;
1517  if (os::Aix::get_meminfo(&mi)) {
1518    char buffer[256];
1519    if (os::Aix::on_aix()) {
1520      st->print_cr("physical total : " SIZE_FORMAT, mi.real_total);
1521      st->print_cr("physical free  : " SIZE_FORMAT, mi.real_free);
1522      st->print_cr("swap total     : " SIZE_FORMAT, mi.pgsp_total);
1523      st->print_cr("swap free      : " SIZE_FORMAT, mi.pgsp_free);
1524    } else {
1525      // PASE - Numbers are result of QWCRSSTS; they mean:
1526      // real_total: Sum of all system pools
1527      // real_free: always 0
1528      // pgsp_total: we take the size of the system ASP
1529      // pgsp_free: size of system ASP times percentage of system ASP unused
1530      st->print_cr("physical total     : " SIZE_FORMAT, mi.real_total);
1531      st->print_cr("system asp total   : " SIZE_FORMAT, mi.pgsp_total);
1532      st->print_cr("%% system asp used : " SIZE_FORMAT,
1533        mi.pgsp_total ? (100.0f * (mi.pgsp_total - mi.pgsp_free) / mi.pgsp_total) : -1.0f);
1534    }
1535    st->print_raw(buffer);
1536  }
1537  st->cr();
1538
1539  // Print segments allocated with os::reserve_memory.
1540  st->print_cr("internal virtual memory regions used by vm:");
1541  vmembk_print_on(st);
1542}
1543
1544// Get a string for the cpuinfo that is a summary of the cpu type
1545void os::get_summary_cpu_info(char* buf, size_t buflen) {
1546  // This looks good
1547  libperfstat::cpuinfo_t ci;
1548  if (libperfstat::get_cpuinfo(&ci)) {
1549    strncpy(buf, ci.version, buflen);
1550  } else {
1551    strncpy(buf, "AIX", buflen);
1552  }
1553}
1554
1555void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
1556  st->print("CPU:");
1557  st->print("total %d", os::processor_count());
1558  // It's not safe to query number of active processors after crash.
1559  // st->print("(active %d)", os::active_processor_count());
1560  st->print(" %s", VM_Version::features());
1561  st->cr();
1562}
1563
1564static void print_signal_handler(outputStream* st, int sig,
1565                                 char* buf, size_t buflen);
1566
1567void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1568  st->print_cr("Signal Handlers:");
1569  print_signal_handler(st, SIGSEGV, buf, buflen);
1570  print_signal_handler(st, SIGBUS , buf, buflen);
1571  print_signal_handler(st, SIGFPE , buf, buflen);
1572  print_signal_handler(st, SIGPIPE, buf, buflen);
1573  print_signal_handler(st, SIGXFSZ, buf, buflen);
1574  print_signal_handler(st, SIGILL , buf, buflen);
1575  print_signal_handler(st, SR_signum, buf, buflen);
1576  print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
1577  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
1578  print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
1579  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
1580  print_signal_handler(st, SIGTRAP, buf, buflen);
1581  print_signal_handler(st, SIGDANGER, buf, buflen);
1582}
1583
1584static char saved_jvm_path[MAXPATHLEN] = {0};
1585
1586// Find the full path to the current module, libjvm.so.
1587void os::jvm_path(char *buf, jint buflen) {
1588  // Error checking.
1589  if (buflen < MAXPATHLEN) {
1590    assert(false, "must use a large-enough buffer");
1591    buf[0] = '\0';
1592    return;
1593  }
1594  // Lazy resolve the path to current module.
1595  if (saved_jvm_path[0] != 0) {
1596    strcpy(buf, saved_jvm_path);
1597    return;
1598  }
1599
1600  Dl_info dlinfo;
1601  int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
1602  assert(ret != 0, "cannot locate libjvm");
1603  char* rp = realpath((char *)dlinfo.dli_fname, buf);
1604  assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?");
1605
1606  strncpy(saved_jvm_path, buf, sizeof(saved_jvm_path));
1607  saved_jvm_path[sizeof(saved_jvm_path) - 1] = '\0';
1608}
1609
1610void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1611  // no prefix required, not even "_"
1612}
1613
1614void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1615  // no suffix required
1616}
1617
1618////////////////////////////////////////////////////////////////////////////////
1619// sun.misc.Signal support
1620
1621static volatile jint sigint_count = 0;
1622
1623static void
1624UserHandler(int sig, void *siginfo, void *context) {
1625  // 4511530 - sem_post is serialized and handled by the manager thread. When
1626  // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
1627  // don't want to flood the manager thread with sem_post requests.
1628  if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
1629    return;
1630
1631  // Ctrl-C is pressed during error reporting, likely because the error
1632  // handler fails to abort. Let VM die immediately.
1633  if (sig == SIGINT && is_error_reported()) {
1634    os::die();
1635  }
1636
1637  os::signal_notify(sig);
1638}
1639
1640void* os::user_handler() {
1641  return CAST_FROM_FN_PTR(void*, UserHandler);
1642}
1643
1644extern "C" {
1645  typedef void (*sa_handler_t)(int);
1646  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
1647}
1648
1649void* os::signal(int signal_number, void* handler) {
1650  struct sigaction sigAct, oldSigAct;
1651
1652  sigfillset(&(sigAct.sa_mask));
1653
1654  // Do not block out synchronous signals in the signal handler.
1655  // Blocking synchronous signals only makes sense if you can really
1656  // be sure that those signals won't happen during signal handling,
1657  // when the blocking applies. Normal signal handlers are lean and
1658  // do not cause signals. But our signal handlers tend to be "risky"
1659  // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen.
1660  // On AIX, PASE there was a case where a SIGSEGV happened, followed
1661  // by a SIGILL, which was blocked due to the signal mask. The process
1662  // just hung forever. Better to crash from a secondary signal than to hang.
1663  sigdelset(&(sigAct.sa_mask), SIGSEGV);
1664  sigdelset(&(sigAct.sa_mask), SIGBUS);
1665  sigdelset(&(sigAct.sa_mask), SIGILL);
1666  sigdelset(&(sigAct.sa_mask), SIGFPE);
1667  sigdelset(&(sigAct.sa_mask), SIGTRAP);
1668
1669  sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
1670
1671  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
1672
1673  if (sigaction(signal_number, &sigAct, &oldSigAct)) {
1674    // -1 means registration failed
1675    return (void *)-1;
1676  }
1677
1678  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
1679}
1680
1681void os::signal_raise(int signal_number) {
1682  ::raise(signal_number);
1683}
1684
1685//
1686// The following code is moved from os.cpp for making this
1687// code platform specific, which it is by its very nature.
1688//
1689
1690// Will be modified when max signal is changed to be dynamic
1691int os::sigexitnum_pd() {
1692  return NSIG;
1693}
1694
1695// a counter for each possible signal value
1696static volatile jint pending_signals[NSIG+1] = { 0 };
1697
1698// Wrapper functions for: sem_init(), sem_post(), sem_wait()
1699// On AIX, we use sem_init(), sem_post(), sem_wait()
1700// On Pase, we need to use msem_lock() and msem_unlock(), because Posix Semaphores
1701// do not seem to work at all on PASE (unimplemented, will cause SIGILL).
1702// Note that just using msem_.. APIs for both PASE and AIX is not an option either, as
1703// on AIX, msem_..() calls are suspected of causing problems.
1704static sem_t sig_sem;
1705static msemaphore* p_sig_msem = 0;
1706
1707static void local_sem_init() {
1708  if (os::Aix::on_aix()) {
1709    int rc = ::sem_init(&sig_sem, 0, 0);
1710    guarantee(rc != -1, "sem_init failed");
1711  } else {
1712    // Memory semaphores must live in shared mem.
1713    guarantee0(p_sig_msem == NULL);
1714    p_sig_msem = (msemaphore*)os::reserve_memory(sizeof(msemaphore), NULL);
1715    guarantee(p_sig_msem, "Cannot allocate memory for memory semaphore");
1716    guarantee(::msem_init(p_sig_msem, 0) == p_sig_msem, "msem_init failed");
1717  }
1718}
1719
1720static void local_sem_post() {
1721  static bool warn_only_once = false;
1722  if (os::Aix::on_aix()) {
1723    int rc = ::sem_post(&sig_sem);
1724    if (rc == -1 && !warn_only_once) {
1725      trcVerbose("sem_post failed (errno = %d, %s)", errno, os::errno_name(errno));
1726      warn_only_once = true;
1727    }
1728  } else {
1729    guarantee0(p_sig_msem != NULL);
1730    int rc = ::msem_unlock(p_sig_msem, 0);
1731    if (rc == -1 && !warn_only_once) {
1732      trcVerbose("msem_unlock failed (errno = %d, %s)", errno, os::errno_name(errno));
1733      warn_only_once = true;
1734    }
1735  }
1736}
1737
1738static void local_sem_wait() {
1739  static bool warn_only_once = false;
1740  if (os::Aix::on_aix()) {
1741    int rc = ::sem_wait(&sig_sem);
1742    if (rc == -1 && !warn_only_once) {
1743      trcVerbose("sem_wait failed (errno = %d, %s)", errno, os::errno_name(errno));
1744      warn_only_once = true;
1745    }
1746  } else {
1747    guarantee0(p_sig_msem != NULL); // must init before use
1748    int rc = ::msem_lock(p_sig_msem, 0);
1749    if (rc == -1 && !warn_only_once) {
1750      trcVerbose("msem_lock failed (errno = %d, %s)", errno, os::errno_name(errno));
1751      warn_only_once = true;
1752    }
1753  }
1754}
1755
1756void os::signal_init_pd() {
1757  // Initialize signal structures
1758  ::memset((void*)pending_signals, 0, sizeof(pending_signals));
1759
1760  // Initialize signal semaphore
1761  local_sem_init();
1762}
1763
1764void os::signal_notify(int sig) {
1765  Atomic::inc(&pending_signals[sig]);
1766  local_sem_post();
1767}
1768
1769static int check_pending_signals(bool wait) {
1770  Atomic::store(0, &sigint_count);
1771  for (;;) {
1772    for (int i = 0; i < NSIG + 1; i++) {
1773      jint n = pending_signals[i];
1774      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1775        return i;
1776      }
1777    }
1778    if (!wait) {
1779      return -1;
1780    }
1781    JavaThread *thread = JavaThread::current();
1782    ThreadBlockInVM tbivm(thread);
1783
1784    bool threadIsSuspended;
1785    do {
1786      thread->set_suspend_equivalent();
1787      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1788
1789      local_sem_wait();
1790
1791      // were we externally suspended while we were waiting?
1792      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1793      if (threadIsSuspended) {
1794        //
1795        // The semaphore has been incremented, but while we were waiting
1796        // another thread suspended us. We don't want to continue running
1797        // while suspended because that would surprise the thread that
1798        // suspended us.
1799        //
1800
1801        local_sem_post();
1802
1803        thread->java_suspend_self();
1804      }
1805    } while (threadIsSuspended);
1806  }
1807}
1808
1809int os::signal_lookup() {
1810  return check_pending_signals(false);
1811}
1812
1813int os::signal_wait() {
1814  return check_pending_signals(true);
1815}
1816
1817////////////////////////////////////////////////////////////////////////////////
1818// Virtual Memory
1819
1820// We need to keep small simple bookkeeping for os::reserve_memory and friends.
1821
1822#define VMEM_MAPPED  1
1823#define VMEM_SHMATED 2
1824
1825struct vmembk_t {
1826  int type;         // 1 - mmap, 2 - shmat
1827  char* addr;
1828  size_t size;      // Real size, may be larger than usersize.
1829  size_t pagesize;  // page size of area
1830  vmembk_t* next;
1831
1832  bool contains_addr(char* p) const {
1833    return p >= addr && p < (addr + size);
1834  }
1835
1836  bool contains_range(char* p, size_t s) const {
1837    return contains_addr(p) && contains_addr(p + s - 1);
1838  }
1839
1840  void print_on(outputStream* os) const {
1841    os->print("[" PTR_FORMAT " - " PTR_FORMAT "] (" UINTX_FORMAT
1842      " bytes, %d %s pages), %s",
1843      addr, addr + size - 1, size, size / pagesize, describe_pagesize(pagesize),
1844      (type == VMEM_SHMATED ? "shmat" : "mmap")
1845    );
1846  }
1847
1848  // Check that range is a sub range of memory block (or equal to memory block);
1849  // also check that range is fully page aligned to the page size if the block.
1850  void assert_is_valid_subrange(char* p, size_t s) const {
1851    if (!contains_range(p, s)) {
1852      trcVerbose("[" PTR_FORMAT " - " PTR_FORMAT "] is not a sub "
1853              "range of [" PTR_FORMAT " - " PTR_FORMAT "].",
1854              p, p + s, addr, addr + size);
1855      guarantee0(false);
1856    }
1857    if (!is_aligned_to(p, pagesize) || !is_aligned_to(p + s, pagesize)) {
1858      trcVerbose("range [" PTR_FORMAT " - " PTR_FORMAT "] is not"
1859              " aligned to pagesize (%lu)", p, p + s, (unsigned long) pagesize);
1860      guarantee0(false);
1861    }
1862  }
1863};
1864
1865static struct {
1866  vmembk_t* first;
1867  MiscUtils::CritSect cs;
1868} vmem;
1869
1870static void vmembk_add(char* addr, size_t size, size_t pagesize, int type) {
1871  vmembk_t* p = (vmembk_t*) ::malloc(sizeof(vmembk_t));
1872  assert0(p);
1873  if (p) {
1874    MiscUtils::AutoCritSect lck(&vmem.cs);
1875    p->addr = addr; p->size = size;
1876    p->pagesize = pagesize;
1877    p->type = type;
1878    p->next = vmem.first;
1879    vmem.first = p;
1880  }
1881}
1882
1883static vmembk_t* vmembk_find(char* addr) {
1884  MiscUtils::AutoCritSect lck(&vmem.cs);
1885  for (vmembk_t* p = vmem.first; p; p = p->next) {
1886    if (p->addr <= addr && (p->addr + p->size) > addr) {
1887      return p;
1888    }
1889  }
1890  return NULL;
1891}
1892
1893static void vmembk_remove(vmembk_t* p0) {
1894  MiscUtils::AutoCritSect lck(&vmem.cs);
1895  assert0(p0);
1896  assert0(vmem.first); // List should not be empty.
1897  for (vmembk_t** pp = &(vmem.first); *pp; pp = &((*pp)->next)) {
1898    if (*pp == p0) {
1899      *pp = p0->next;
1900      ::free(p0);
1901      return;
1902    }
1903  }
1904  assert0(false); // Not found?
1905}
1906
1907static void vmembk_print_on(outputStream* os) {
1908  MiscUtils::AutoCritSect lck(&vmem.cs);
1909  for (vmembk_t* vmi = vmem.first; vmi; vmi = vmi->next) {
1910    vmi->print_on(os);
1911    os->cr();
1912  }
1913}
1914
1915// Reserve and attach a section of System V memory.
1916// If <requested_addr> is not NULL, function will attempt to attach the memory at the given
1917// address. Failing that, it will attach the memory anywhere.
1918// If <requested_addr> is NULL, function will attach the memory anywhere.
1919//
1920// <alignment_hint> is being ignored by this function. It is very probable however that the
1921// alignment requirements are met anyway, because shmat() attaches at 256M boundaries.
1922// Should this be not enogh, we can put more work into it.
1923static char* reserve_shmated_memory (
1924  size_t bytes,
1925  char* requested_addr,
1926  size_t alignment_hint) {
1927
1928  trcVerbose("reserve_shmated_memory " UINTX_FORMAT " bytes, wishaddress "
1929    PTR_FORMAT ", alignment_hint " UINTX_FORMAT "...",
1930    bytes, requested_addr, alignment_hint);
1931
1932  // Either give me wish address or wish alignment but not both.
1933  assert0(!(requested_addr != NULL && alignment_hint != 0));
1934
1935  // We must prevent anyone from attaching too close to the
1936  // BRK because that may cause malloc OOM.
1937  if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
1938    trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
1939      "Will attach anywhere.", requested_addr);
1940    // Act like the OS refused to attach there.
1941    requested_addr = NULL;
1942  }
1943
1944  // For old AS/400's (V5R4 and older) we should not even be here - System V shared memory is not
1945  // really supported (max size 4GB), so reserve_mmapped_memory should have been used instead.
1946  if (os::Aix::on_pase_V5R4_or_older()) {
1947    ShouldNotReachHere();
1948  }
1949
1950  // Align size of shm up to 64K to avoid errors if we later try to change the page size.
1951  const size_t size = align_size_up(bytes, SIZE_64K);
1952
1953  // Reserve the shared segment.
1954  int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
1955  if (shmid == -1) {
1956    trcVerbose("shmget(.., " UINTX_FORMAT ", ..) failed (errno: %d).", size, errno);
1957    return NULL;
1958  }
1959
1960  // Important note:
1961  // It is very important that we, upon leaving this function, do not leave a shm segment alive.
1962  // We must right after attaching it remove it from the system. System V shm segments are global and
1963  // survive the process.
1964  // So, from here on: Do not assert, do not return, until we have called shmctl(IPC_RMID) (A).
1965
1966  struct shmid_ds shmbuf;
1967  memset(&shmbuf, 0, sizeof(shmbuf));
1968  shmbuf.shm_pagesize = SIZE_64K;
1969  if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) != 0) {
1970    trcVerbose("Failed to set page size (need " UINTX_FORMAT " 64K pages) - shmctl failed with %d.",
1971               size / SIZE_64K, errno);
1972    // I want to know if this ever happens.
1973    assert(false, "failed to set page size for shmat");
1974  }
1975
1976  // Now attach the shared segment.
1977  // Note that I attach with SHM_RND - which means that the requested address is rounded down, if
1978  // needed, to the next lowest segment boundary. Otherwise the attach would fail if the address
1979  // were not a segment boundary.
1980  char* const addr = (char*) shmat(shmid, requested_addr, SHM_RND);
1981  const int errno_shmat = errno;
1982
1983  // (A) Right after shmat and before handing shmat errors delete the shm segment.
1984  if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
1985    trcVerbose("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
1986    assert(false, "failed to remove shared memory segment!");
1987  }
1988
1989  // Handle shmat error. If we failed to attach, just return.
1990  if (addr == (char*)-1) {
1991    trcVerbose("Failed to attach segment at " PTR_FORMAT " (%d).", requested_addr, errno_shmat);
1992    return NULL;
1993  }
1994
1995  // Just for info: query the real page size. In case setting the page size did not
1996  // work (see above), the system may have given us something other then 4K (LDR_CNTRL).
1997  const size_t real_pagesize = os::Aix::query_pagesize(addr);
1998  if (real_pagesize != shmbuf.shm_pagesize) {
1999    trcVerbose("pagesize is, surprisingly, %h.", real_pagesize);
2000  }
2001
2002  if (addr) {
2003    trcVerbose("shm-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes, " UINTX_FORMAT " %s pages)",
2004      addr, addr + size - 1, size, size/real_pagesize, describe_pagesize(real_pagesize));
2005  } else {
2006    if (requested_addr != NULL) {
2007      trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at with address " PTR_FORMAT ".", size, requested_addr);
2008    } else {
2009      trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at any address.", size);
2010    }
2011  }
2012
2013  // book-keeping
2014  vmembk_add(addr, size, real_pagesize, VMEM_SHMATED);
2015  assert0(is_aligned_to(addr, os::vm_page_size()));
2016
2017  return addr;
2018}
2019
2020static bool release_shmated_memory(char* addr, size_t size) {
2021
2022  trcVerbose("release_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2023    addr, addr + size - 1);
2024
2025  bool rc = false;
2026
2027  // TODO: is there a way to verify shm size without doing bookkeeping?
2028  if (::shmdt(addr) != 0) {
2029    trcVerbose("error (%d).", errno);
2030  } else {
2031    trcVerbose("ok.");
2032    rc = true;
2033  }
2034  return rc;
2035}
2036
2037static bool uncommit_shmated_memory(char* addr, size_t size) {
2038  trcVerbose("uncommit_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2039    addr, addr + size - 1);
2040
2041  const bool rc = my_disclaim64(addr, size);
2042
2043  if (!rc) {
2044    trcVerbose("my_disclaim64(" PTR_FORMAT ", " UINTX_FORMAT ") failed.\n", addr, size);
2045    return false;
2046  }
2047  return true;
2048}
2049
2050////////////////////////////////  mmap-based routines /////////////////////////////////
2051
2052// Reserve memory via mmap.
2053// If <requested_addr> is given, an attempt is made to attach at the given address.
2054// Failing that, memory is allocated at any address.
2055// If <alignment_hint> is given and <requested_addr> is NULL, an attempt is made to
2056// allocate at an address aligned with the given alignment. Failing that, memory
2057// is aligned anywhere.
2058static char* reserve_mmaped_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2059  trcVerbose("reserve_mmaped_memory " UINTX_FORMAT " bytes, wishaddress " PTR_FORMAT ", "
2060    "alignment_hint " UINTX_FORMAT "...",
2061    bytes, requested_addr, alignment_hint);
2062
2063  // If a wish address is given, but not aligned to 4K page boundary, mmap will fail.
2064  if (requested_addr && !is_aligned_to(requested_addr, os::vm_page_size()) != 0) {
2065    trcVerbose("Wish address " PTR_FORMAT " not aligned to page boundary.", requested_addr);
2066    return NULL;
2067  }
2068
2069  // We must prevent anyone from attaching too close to the
2070  // BRK because that may cause malloc OOM.
2071  if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
2072    trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
2073      "Will attach anywhere.", requested_addr);
2074    // Act like the OS refused to attach there.
2075    requested_addr = NULL;
2076  }
2077
2078  // Specify one or the other but not both.
2079  assert0(!(requested_addr != NULL && alignment_hint > 0));
2080
2081  // In 64K mode, we claim the global page size (os::vm_page_size())
2082  // is 64K. This is one of the few points where that illusion may
2083  // break, because mmap() will always return memory aligned to 4K. So
2084  // we must ensure we only ever return memory aligned to 64k.
2085  if (alignment_hint) {
2086    alignment_hint = lcm(alignment_hint, os::vm_page_size());
2087  } else {
2088    alignment_hint = os::vm_page_size();
2089  }
2090
2091  // Size shall always be a multiple of os::vm_page_size (esp. in 64K mode).
2092  const size_t size = align_size_up(bytes, os::vm_page_size());
2093
2094  // alignment: Allocate memory large enough to include an aligned range of the right size and
2095  // cut off the leading and trailing waste pages.
2096  assert0(alignment_hint != 0 && is_aligned_to(alignment_hint, os::vm_page_size())); // see above
2097  const size_t extra_size = size + alignment_hint;
2098
2099  // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to
2100  // later use msync(MS_INVALIDATE) (see os::uncommit_memory).
2101  int flags = MAP_ANONYMOUS | MAP_SHARED;
2102
2103  // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
2104  // it means if wishaddress is given but MAP_FIXED is not set.
2105  //
2106  // Important! Behaviour differs depending on whether SPEC1170 mode is active or not.
2107  // SPEC1170 mode active: behaviour like POSIX, MAP_FIXED will clobber existing mappings.
2108  // SPEC1170 mode not active: behaviour, unlike POSIX, is that no existing mappings will
2109  // get clobbered.
2110  if (requested_addr != NULL) {
2111    if (!os::Aix::xpg_sus_mode()) {  // not SPEC1170 Behaviour
2112      flags |= MAP_FIXED;
2113    }
2114  }
2115
2116  char* addr = (char*)::mmap(requested_addr, extra_size,
2117      PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
2118
2119  if (addr == MAP_FAILED) {
2120    trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) failed (%d)", requested_addr, size, errno);
2121    return NULL;
2122  }
2123
2124  // Handle alignment.
2125  char* const addr_aligned = (char *)align_ptr_up(addr, alignment_hint);
2126  const size_t waste_pre = addr_aligned - addr;
2127  char* const addr_aligned_end = addr_aligned + size;
2128  const size_t waste_post = extra_size - waste_pre - size;
2129  if (waste_pre > 0) {
2130    ::munmap(addr, waste_pre);
2131  }
2132  if (waste_post > 0) {
2133    ::munmap(addr_aligned_end, waste_post);
2134  }
2135  addr = addr_aligned;
2136
2137  if (addr) {
2138    trcVerbose("mmap-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes)",
2139      addr, addr + bytes, bytes);
2140  } else {
2141    if (requested_addr != NULL) {
2142      trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at wish address " PTR_FORMAT ".", bytes, requested_addr);
2143    } else {
2144      trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at any address.", bytes);
2145    }
2146  }
2147
2148  // bookkeeping
2149  vmembk_add(addr, size, SIZE_4K, VMEM_MAPPED);
2150
2151  // Test alignment, see above.
2152  assert0(is_aligned_to(addr, os::vm_page_size()));
2153
2154  return addr;
2155}
2156
2157static bool release_mmaped_memory(char* addr, size_t size) {
2158  assert0(is_aligned_to(addr, os::vm_page_size()));
2159  assert0(is_aligned_to(size, os::vm_page_size()));
2160
2161  trcVerbose("release_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2162    addr, addr + size - 1);
2163  bool rc = false;
2164
2165  if (::munmap(addr, size) != 0) {
2166    trcVerbose("failed (%d)\n", errno);
2167    rc = false;
2168  } else {
2169    trcVerbose("ok.");
2170    rc = true;
2171  }
2172
2173  return rc;
2174}
2175
2176static bool uncommit_mmaped_memory(char* addr, size_t size) {
2177
2178  assert0(is_aligned_to(addr, os::vm_page_size()));
2179  assert0(is_aligned_to(size, os::vm_page_size()));
2180
2181  trcVerbose("uncommit_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2182    addr, addr + size - 1);
2183  bool rc = false;
2184
2185  // Uncommit mmap memory with msync MS_INVALIDATE.
2186  if (::msync(addr, size, MS_INVALIDATE) != 0) {
2187    trcVerbose("failed (%d)\n", errno);
2188    rc = false;
2189  } else {
2190    trcVerbose("ok.");
2191    rc = true;
2192  }
2193
2194  return rc;
2195}
2196
2197int os::vm_page_size() {
2198  // Seems redundant as all get out.
2199  assert(os::Aix::page_size() != -1, "must call os::init");
2200  return os::Aix::page_size();
2201}
2202
2203// Aix allocates memory by pages.
2204int os::vm_allocation_granularity() {
2205  assert(os::Aix::page_size() != -1, "must call os::init");
2206  return os::Aix::page_size();
2207}
2208
2209#ifdef PRODUCT
2210static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
2211                                    int err) {
2212  warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2213          ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
2214          os::errno_name(err), err);
2215}
2216#endif
2217
2218void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2219                                  const char* mesg) {
2220  assert(mesg != NULL, "mesg must be specified");
2221  if (!pd_commit_memory(addr, size, exec)) {
2222    // Add extra info in product mode for vm_exit_out_of_memory():
2223    PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
2224    vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
2225  }
2226}
2227
2228bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2229
2230  assert(is_aligned_to(addr, os::vm_page_size()),
2231    "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2232    p2i(addr), os::vm_page_size());
2233  assert(is_aligned_to(size, os::vm_page_size()),
2234    "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2235    size, os::vm_page_size());
2236
2237  vmembk_t* const vmi = vmembk_find(addr);
2238  guarantee0(vmi);
2239  vmi->assert_is_valid_subrange(addr, size);
2240
2241  trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", addr, addr + size - 1);
2242
2243  if (UseExplicitCommit) {
2244    // AIX commits memory on touch. So, touch all pages to be committed.
2245    for (char* p = addr; p < (addr + size); p += SIZE_4K) {
2246      *p = '\0';
2247    }
2248  }
2249
2250  return true;
2251}
2252
2253bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) {
2254  return pd_commit_memory(addr, size, exec);
2255}
2256
2257void os::pd_commit_memory_or_exit(char* addr, size_t size,
2258                                  size_t alignment_hint, bool exec,
2259                                  const char* mesg) {
2260  // Alignment_hint is ignored on this OS.
2261  pd_commit_memory_or_exit(addr, size, exec, mesg);
2262}
2263
2264bool os::pd_uncommit_memory(char* addr, size_t size) {
2265  assert(is_aligned_to(addr, os::vm_page_size()),
2266    "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2267    p2i(addr), os::vm_page_size());
2268  assert(is_aligned_to(size, os::vm_page_size()),
2269    "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2270    size, os::vm_page_size());
2271
2272  // Dynamically do different things for mmap/shmat.
2273  const vmembk_t* const vmi = vmembk_find(addr);
2274  guarantee0(vmi);
2275  vmi->assert_is_valid_subrange(addr, size);
2276
2277  if (vmi->type == VMEM_SHMATED) {
2278    return uncommit_shmated_memory(addr, size);
2279  } else {
2280    return uncommit_mmaped_memory(addr, size);
2281  }
2282}
2283
2284bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
2285  // Do not call this; no need to commit stack pages on AIX.
2286  ShouldNotReachHere();
2287  return true;
2288}
2289
2290bool os::remove_stack_guard_pages(char* addr, size_t size) {
2291  // Do not call this; no need to commit stack pages on AIX.
2292  ShouldNotReachHere();
2293  return true;
2294}
2295
2296void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2297}
2298
2299void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
2300}
2301
2302void os::numa_make_global(char *addr, size_t bytes) {
2303}
2304
2305void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2306}
2307
2308bool os::numa_topology_changed() {
2309  return false;
2310}
2311
2312size_t os::numa_get_groups_num() {
2313  return 1;
2314}
2315
2316int os::numa_get_group_id() {
2317  return 0;
2318}
2319
2320size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2321  if (size > 0) {
2322    ids[0] = 0;
2323    return 1;
2324  }
2325  return 0;
2326}
2327
2328bool os::get_page_info(char *start, page_info* info) {
2329  return false;
2330}
2331
2332char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2333  return end;
2334}
2335
2336// Reserves and attaches a shared memory segment.
2337// Will assert if a wish address is given and could not be obtained.
2338char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2339
2340  // All other Unices do a mmap(MAP_FIXED) if the addr is given,
2341  // thereby clobbering old mappings at that place. That is probably
2342  // not intended, never used and almost certainly an error were it
2343  // ever be used this way (to try attaching at a specified address
2344  // without clobbering old mappings an alternate API exists,
2345  // os::attempt_reserve_memory_at()).
2346  // Instead of mimicking the dangerous coding of the other platforms, here I
2347  // just ignore the request address (release) or assert(debug).
2348  assert0(requested_addr == NULL);
2349
2350  // Always round to os::vm_page_size(), which may be larger than 4K.
2351  bytes = align_size_up(bytes, os::vm_page_size());
2352  const size_t alignment_hint0 =
2353    alignment_hint ? align_size_up(alignment_hint, os::vm_page_size()) : 0;
2354
2355  // In 4K mode always use mmap.
2356  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
2357  if (os::vm_page_size() == SIZE_4K) {
2358    return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
2359  } else {
2360    if (bytes >= Use64KPagesThreshold) {
2361      return reserve_shmated_memory(bytes, requested_addr, alignment_hint);
2362    } else {
2363      return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
2364    }
2365  }
2366}
2367
2368bool os::pd_release_memory(char* addr, size_t size) {
2369
2370  // Dynamically do different things for mmap/shmat.
2371  vmembk_t* const vmi = vmembk_find(addr);
2372  guarantee0(vmi);
2373
2374  // Always round to os::vm_page_size(), which may be larger than 4K.
2375  size = align_size_up(size, os::vm_page_size());
2376  addr = (char *)align_ptr_up(addr, os::vm_page_size());
2377
2378  bool rc = false;
2379  bool remove_bookkeeping = false;
2380  if (vmi->type == VMEM_SHMATED) {
2381    // For shmatted memory, we do:
2382    // - If user wants to release the whole range, release the memory (shmdt).
2383    // - If user only wants to release a partial range, uncommit (disclaim) that
2384    //   range. That way, at least, we do not use memory anymore (bust still page
2385    //   table space).
2386    vmi->assert_is_valid_subrange(addr, size);
2387    if (addr == vmi->addr && size == vmi->size) {
2388      rc = release_shmated_memory(addr, size);
2389      remove_bookkeeping = true;
2390    } else {
2391      rc = uncommit_shmated_memory(addr, size);
2392    }
2393  } else {
2394    // User may unmap partial regions but region has to be fully contained.
2395#ifdef ASSERT
2396    vmi->assert_is_valid_subrange(addr, size);
2397#endif
2398    rc = release_mmaped_memory(addr, size);
2399    remove_bookkeeping = true;
2400  }
2401
2402  // update bookkeeping
2403  if (rc && remove_bookkeeping) {
2404    vmembk_remove(vmi);
2405  }
2406
2407  return rc;
2408}
2409
2410static bool checked_mprotect(char* addr, size_t size, int prot) {
2411
2412  // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will
2413  // not tell me if protection failed when trying to protect an un-protectable range.
2414  //
2415  // This means if the memory was allocated using shmget/shmat, protection wont work
2416  // but mprotect will still return 0:
2417  //
2418  // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm
2419
2420  bool rc = ::mprotect(addr, size, prot) == 0 ? true : false;
2421
2422  if (!rc) {
2423    const char* const s_errno = os::errno_name(errno);
2424    warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno);
2425    return false;
2426  }
2427
2428  // mprotect success check
2429  //
2430  // Mprotect said it changed the protection but can I believe it?
2431  //
2432  // To be sure I need to check the protection afterwards. Try to
2433  // read from protected memory and check whether that causes a segfault.
2434  //
2435  if (!os::Aix::xpg_sus_mode()) {
2436
2437    if (CanUseSafeFetch32()) {
2438
2439      const bool read_protected =
2440        (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
2441         SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
2442
2443      if (prot & PROT_READ) {
2444        rc = !read_protected;
2445      } else {
2446        rc = read_protected;
2447      }
2448
2449      if (!rc) {
2450        if (os::Aix::on_pase()) {
2451          // There is an issue on older PASE systems where mprotect() will return success but the
2452          // memory will not be protected.
2453          // This has nothing to do with the problem of using mproect() on SPEC1170 incompatible
2454          // machines; we only see it rarely, when using mprotect() to protect the guard page of
2455          // a stack. It is an OS error.
2456          //
2457          // A valid strategy is just to try again. This usually works. :-/
2458
2459          ::usleep(1000);
2460          if (::mprotect(addr, size, prot) == 0) {
2461            const bool read_protected_2 =
2462              (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
2463              SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
2464            rc = true;
2465          }
2466        }
2467      }
2468    }
2469  }
2470
2471  assert(rc == true, "mprotect failed.");
2472
2473  return rc;
2474}
2475
2476// Set protections specified
2477bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) {
2478  unsigned int p = 0;
2479  switch (prot) {
2480  case MEM_PROT_NONE: p = PROT_NONE; break;
2481  case MEM_PROT_READ: p = PROT_READ; break;
2482  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
2483  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
2484  default:
2485    ShouldNotReachHere();
2486  }
2487  // is_committed is unused.
2488  return checked_mprotect(addr, size, p);
2489}
2490
2491bool os::guard_memory(char* addr, size_t size) {
2492  return checked_mprotect(addr, size, PROT_NONE);
2493}
2494
2495bool os::unguard_memory(char* addr, size_t size) {
2496  return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
2497}
2498
2499// Large page support
2500
2501static size_t _large_page_size = 0;
2502
2503// Enable large page support if OS allows that.
2504void os::large_page_init() {
2505  return; // Nothing to do. See query_multipage_support and friends.
2506}
2507
2508char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
2509  // reserve_memory_special() is used to allocate large paged memory. On AIX, we implement
2510  // 64k paged memory reservation using the normal memory allocation paths (os::reserve_memory()),
2511  // so this is not needed.
2512  assert(false, "should not be called on AIX");
2513  return NULL;
2514}
2515
2516bool os::release_memory_special(char* base, size_t bytes) {
2517  // Detaching the SHM segment will also delete it, see reserve_memory_special().
2518  Unimplemented();
2519  return false;
2520}
2521
2522size_t os::large_page_size() {
2523  return _large_page_size;
2524}
2525
2526bool os::can_commit_large_page_memory() {
2527  // Does not matter, we do not support huge pages.
2528  return false;
2529}
2530
2531bool os::can_execute_large_page_memory() {
2532  // Does not matter, we do not support huge pages.
2533  return false;
2534}
2535
2536// Reserve memory at an arbitrary address, only if that area is
2537// available (and not reserved for something else).
2538char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2539  char* addr = NULL;
2540
2541  // Always round to os::vm_page_size(), which may be larger than 4K.
2542  bytes = align_size_up(bytes, os::vm_page_size());
2543
2544  // In 4K mode always use mmap.
2545  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
2546  if (os::vm_page_size() == SIZE_4K) {
2547    return reserve_mmaped_memory(bytes, requested_addr, 0);
2548  } else {
2549    if (bytes >= Use64KPagesThreshold) {
2550      return reserve_shmated_memory(bytes, requested_addr, 0);
2551    } else {
2552      return reserve_mmaped_memory(bytes, requested_addr, 0);
2553    }
2554  }
2555
2556  return addr;
2557}
2558
2559size_t os::read(int fd, void *buf, unsigned int nBytes) {
2560  return ::read(fd, buf, nBytes);
2561}
2562
2563size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
2564  return ::pread(fd, buf, nBytes, offset);
2565}
2566
2567void os::naked_short_sleep(jlong ms) {
2568  struct timespec req;
2569
2570  assert(ms < 1000, "Un-interruptable sleep, short time use only");
2571  req.tv_sec = 0;
2572  if (ms > 0) {
2573    req.tv_nsec = (ms % 1000) * 1000000;
2574  }
2575  else {
2576    req.tv_nsec = 1;
2577  }
2578
2579  nanosleep(&req, NULL);
2580
2581  return;
2582}
2583
2584// Sleep forever; naked call to OS-specific sleep; use with CAUTION
2585void os::infinite_sleep() {
2586  while (true) {    // sleep forever ...
2587    ::sleep(100);   // ... 100 seconds at a time
2588  }
2589}
2590
2591// Used to convert frequent JVM_Yield() to nops
2592bool os::dont_yield() {
2593  return DontYieldALot;
2594}
2595
2596void os::naked_yield() {
2597  sched_yield();
2598}
2599
2600////////////////////////////////////////////////////////////////////////////////
2601// thread priority support
2602
2603// From AIX manpage to pthread_setschedparam
2604// (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?
2605//    topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm):
2606//
2607// "If schedpolicy is SCHED_OTHER, then sched_priority must be in the
2608// range from 40 to 80, where 40 is the least favored priority and 80
2609// is the most favored."
2610//
2611// (Actually, I doubt this even has an impact on AIX, as we do kernel
2612// scheduling there; however, this still leaves iSeries.)
2613//
2614// We use the same values for AIX and PASE.
2615int os::java_to_os_priority[CriticalPriority + 1] = {
2616  54,             // 0 Entry should never be used
2617
2618  55,             // 1 MinPriority
2619  55,             // 2
2620  56,             // 3
2621
2622  56,             // 4
2623  57,             // 5 NormPriority
2624  57,             // 6
2625
2626  58,             // 7
2627  58,             // 8
2628  59,             // 9 NearMaxPriority
2629
2630  60,             // 10 MaxPriority
2631
2632  60              // 11 CriticalPriority
2633};
2634
2635OSReturn os::set_native_priority(Thread* thread, int newpri) {
2636  if (!UseThreadPriorities) return OS_OK;
2637  pthread_t thr = thread->osthread()->pthread_id();
2638  int policy = SCHED_OTHER;
2639  struct sched_param param;
2640  param.sched_priority = newpri;
2641  int ret = pthread_setschedparam(thr, policy, &param);
2642
2643  if (ret != 0) {
2644    trcVerbose("Could not change priority for thread %d to %d (error %d, %s)",
2645        (int)thr, newpri, ret, os::errno_name(ret));
2646  }
2647  return (ret == 0) ? OS_OK : OS_ERR;
2648}
2649
2650OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
2651  if (!UseThreadPriorities) {
2652    *priority_ptr = java_to_os_priority[NormPriority];
2653    return OS_OK;
2654  }
2655  pthread_t thr = thread->osthread()->pthread_id();
2656  int policy = SCHED_OTHER;
2657  struct sched_param param;
2658  int ret = pthread_getschedparam(thr, &policy, &param);
2659  *priority_ptr = param.sched_priority;
2660
2661  return (ret == 0) ? OS_OK : OS_ERR;
2662}
2663
2664// Hint to the underlying OS that a task switch would not be good.
2665// Void return because it's a hint and can fail.
2666void os::hint_no_preempt() {}
2667
2668////////////////////////////////////////////////////////////////////////////////
2669// suspend/resume support
2670
2671//  the low-level signal-based suspend/resume support is a remnant from the
2672//  old VM-suspension that used to be for java-suspension, safepoints etc,
2673//  within hotspot. Now there is a single use-case for this:
2674//    - calling get_thread_pc() on the VMThread by the flat-profiler task
2675//      that runs in the watcher thread.
2676//  The remaining code is greatly simplified from the more general suspension
2677//  code that used to be used.
2678//
2679//  The protocol is quite simple:
2680//  - suspend:
2681//      - sends a signal to the target thread
2682//      - polls the suspend state of the osthread using a yield loop
2683//      - target thread signal handler (SR_handler) sets suspend state
2684//        and blocks in sigsuspend until continued
2685//  - resume:
2686//      - sets target osthread state to continue
2687//      - sends signal to end the sigsuspend loop in the SR_handler
2688//
2689//  Note that the SR_lock plays no role in this suspend/resume protocol,
2690//  but is checked for NULL in SR_handler as a thread termination indicator.
2691//
2692
2693static void resume_clear_context(OSThread *osthread) {
2694  osthread->set_ucontext(NULL);
2695  osthread->set_siginfo(NULL);
2696}
2697
2698static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
2699  osthread->set_ucontext(context);
2700  osthread->set_siginfo(siginfo);
2701}
2702
2703//
2704// Handler function invoked when a thread's execution is suspended or
2705// resumed. We have to be careful that only async-safe functions are
2706// called here (Note: most pthread functions are not async safe and
2707// should be avoided.)
2708//
2709// Note: sigwait() is a more natural fit than sigsuspend() from an
2710// interface point of view, but sigwait() prevents the signal hander
2711// from being run. libpthread would get very confused by not having
2712// its signal handlers run and prevents sigwait()'s use with the
2713// mutex granting granting signal.
2714//
2715// Currently only ever called on the VMThread and JavaThreads (PC sampling).
2716//
2717static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
2718  // Save and restore errno to avoid confusing native code with EINTR
2719  // after sigsuspend.
2720  int old_errno = errno;
2721
2722  Thread* thread = Thread::current_or_null_safe();
2723  assert(thread != NULL, "Missing current thread in SR_handler");
2724
2725  // On some systems we have seen signal delivery get "stuck" until the signal
2726  // mask is changed as part of thread termination. Check that the current thread
2727  // has not already terminated (via SR_lock()) - else the following assertion
2728  // will fail because the thread is no longer a JavaThread as the ~JavaThread
2729  // destructor has completed.
2730
2731  if (thread->SR_lock() == NULL) {
2732    return;
2733  }
2734
2735  assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
2736
2737  OSThread* osthread = thread->osthread();
2738
2739  os::SuspendResume::State current = osthread->sr.state();
2740  if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
2741    suspend_save_context(osthread, siginfo, context);
2742
2743    // attempt to switch the state, we assume we had a SUSPEND_REQUEST
2744    os::SuspendResume::State state = osthread->sr.suspended();
2745    if (state == os::SuspendResume::SR_SUSPENDED) {
2746      sigset_t suspend_set;  // signals for sigsuspend()
2747
2748      // get current set of blocked signals and unblock resume signal
2749      pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
2750      sigdelset(&suspend_set, SR_signum);
2751
2752      // wait here until we are resumed
2753      while (1) {
2754        sigsuspend(&suspend_set);
2755
2756        os::SuspendResume::State result = osthread->sr.running();
2757        if (result == os::SuspendResume::SR_RUNNING) {
2758          break;
2759        }
2760      }
2761
2762    } else if (state == os::SuspendResume::SR_RUNNING) {
2763      // request was cancelled, continue
2764    } else {
2765      ShouldNotReachHere();
2766    }
2767
2768    resume_clear_context(osthread);
2769  } else if (current == os::SuspendResume::SR_RUNNING) {
2770    // request was cancelled, continue
2771  } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
2772    // ignore
2773  } else {
2774    ShouldNotReachHere();
2775  }
2776
2777  errno = old_errno;
2778}
2779
2780static int SR_initialize() {
2781  struct sigaction act;
2782  char *s;
2783  // Get signal number to use for suspend/resume
2784  if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
2785    int sig = ::strtol(s, 0, 10);
2786    if (sig > MAX2(SIGSEGV, SIGBUS) &&  // See 4355769.
2787        sig < NSIG) {                   // Must be legal signal and fit into sigflags[].
2788      SR_signum = sig;
2789    } else {
2790      warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.",
2791              sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum);
2792    }
2793  }
2794
2795  assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
2796        "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
2797
2798  sigemptyset(&SR_sigset);
2799  sigaddset(&SR_sigset, SR_signum);
2800
2801  // Set up signal handler for suspend/resume.
2802  act.sa_flags = SA_RESTART|SA_SIGINFO;
2803  act.sa_handler = (void (*)(int)) SR_handler;
2804
2805  // SR_signum is blocked by default.
2806  pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
2807
2808  if (sigaction(SR_signum, &act, 0) == -1) {
2809    return -1;
2810  }
2811
2812  // Save signal flag
2813  os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
2814  return 0;
2815}
2816
2817static int SR_finalize() {
2818  return 0;
2819}
2820
2821static int sr_notify(OSThread* osthread) {
2822  int status = pthread_kill(osthread->pthread_id(), SR_signum);
2823  assert_status(status == 0, status, "pthread_kill");
2824  return status;
2825}
2826
2827// "Randomly" selected value for how long we want to spin
2828// before bailing out on suspending a thread, also how often
2829// we send a signal to a thread we want to resume
2830static const int RANDOMLY_LARGE_INTEGER = 1000000;
2831static const int RANDOMLY_LARGE_INTEGER2 = 100;
2832
2833// returns true on success and false on error - really an error is fatal
2834// but this seems the normal response to library errors
2835static bool do_suspend(OSThread* osthread) {
2836  assert(osthread->sr.is_running(), "thread should be running");
2837  // mark as suspended and send signal
2838
2839  if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
2840    // failed to switch, state wasn't running?
2841    ShouldNotReachHere();
2842    return false;
2843  }
2844
2845  if (sr_notify(osthread) != 0) {
2846    // try to cancel, switch to running
2847
2848    os::SuspendResume::State result = osthread->sr.cancel_suspend();
2849    if (result == os::SuspendResume::SR_RUNNING) {
2850      // cancelled
2851      return false;
2852    } else if (result == os::SuspendResume::SR_SUSPENDED) {
2853      // somehow managed to suspend
2854      return true;
2855    } else {
2856      ShouldNotReachHere();
2857      return false;
2858    }
2859  }
2860
2861  // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
2862
2863  for (int n = 0; !osthread->sr.is_suspended(); n++) {
2864    for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
2865      os::naked_yield();
2866    }
2867
2868    // timeout, try to cancel the request
2869    if (n >= RANDOMLY_LARGE_INTEGER) {
2870      os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
2871      if (cancelled == os::SuspendResume::SR_RUNNING) {
2872        return false;
2873      } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
2874        return true;
2875      } else {
2876        ShouldNotReachHere();
2877        return false;
2878      }
2879    }
2880  }
2881
2882  guarantee(osthread->sr.is_suspended(), "Must be suspended");
2883  return true;
2884}
2885
2886static void do_resume(OSThread* osthread) {
2887  //assert(osthread->sr.is_suspended(), "thread should be suspended");
2888
2889  if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
2890    // failed to switch to WAKEUP_REQUEST
2891    ShouldNotReachHere();
2892    return;
2893  }
2894
2895  while (!osthread->sr.is_running()) {
2896    if (sr_notify(osthread) == 0) {
2897      for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
2898        for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
2899          os::naked_yield();
2900        }
2901      }
2902    } else {
2903      ShouldNotReachHere();
2904    }
2905  }
2906
2907  guarantee(osthread->sr.is_running(), "Must be running!");
2908}
2909
2910///////////////////////////////////////////////////////////////////////////////////
2911// signal handling (except suspend/resume)
2912
2913// This routine may be used by user applications as a "hook" to catch signals.
2914// The user-defined signal handler must pass unrecognized signals to this
2915// routine, and if it returns true (non-zero), then the signal handler must
2916// return immediately. If the flag "abort_if_unrecognized" is true, then this
2917// routine will never retun false (zero), but instead will execute a VM panic
2918// routine kill the process.
2919//
2920// If this routine returns false, it is OK to call it again. This allows
2921// the user-defined signal handler to perform checks either before or after
2922// the VM performs its own checks. Naturally, the user code would be making
2923// a serious error if it tried to handle an exception (such as a null check
2924// or breakpoint) that the VM was generating for its own correct operation.
2925//
2926// This routine may recognize any of the following kinds of signals:
2927//   SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
2928// It should be consulted by handlers for any of those signals.
2929//
2930// The caller of this routine must pass in the three arguments supplied
2931// to the function referred to in the "sa_sigaction" (not the "sa_handler")
2932// field of the structure passed to sigaction(). This routine assumes that
2933// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
2934//
2935// Note that the VM will print warnings if it detects conflicting signal
2936// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
2937//
2938extern "C" JNIEXPORT int
2939JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
2940
2941// Set thread signal mask (for some reason on AIX sigthreadmask() seems
2942// to be the thing to call; documentation is not terribly clear about whether
2943// pthread_sigmask also works, and if it does, whether it does the same.
2944bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) {
2945  const int rc = ::pthread_sigmask(how, set, oset);
2946  // return value semantics differ slightly for error case:
2947  // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno
2948  // (so, pthread_sigmask is more theadsafe for error handling)
2949  // But success is always 0.
2950  return rc == 0 ? true : false;
2951}
2952
2953// Function to unblock all signals which are, according
2954// to POSIX, typical program error signals. If they happen while being blocked,
2955// they typically will bring down the process immediately.
2956bool unblock_program_error_signals() {
2957  sigset_t set;
2958  ::sigemptyset(&set);
2959  ::sigaddset(&set, SIGILL);
2960  ::sigaddset(&set, SIGBUS);
2961  ::sigaddset(&set, SIGFPE);
2962  ::sigaddset(&set, SIGSEGV);
2963  return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL);
2964}
2965
2966// Renamed from 'signalHandler' to avoid collision with other shared libs.
2967void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
2968  assert(info != NULL && uc != NULL, "it must be old kernel");
2969
2970  // Never leave program error signals blocked;
2971  // on all our platforms they would bring down the process immediately when
2972  // getting raised while being blocked.
2973  unblock_program_error_signals();
2974
2975  int orig_errno = errno;  // Preserve errno value over signal handler.
2976  JVM_handle_aix_signal(sig, info, uc, true);
2977  errno = orig_errno;
2978}
2979
2980// This boolean allows users to forward their own non-matching signals
2981// to JVM_handle_aix_signal, harmlessly.
2982bool os::Aix::signal_handlers_are_installed = false;
2983
2984// For signal-chaining
2985struct sigaction sigact[NSIG];
2986sigset_t sigs;
2987bool os::Aix::libjsig_is_loaded = false;
2988typedef struct sigaction *(*get_signal_t)(int);
2989get_signal_t os::Aix::get_signal_action = NULL;
2990
2991struct sigaction* os::Aix::get_chained_signal_action(int sig) {
2992  struct sigaction *actp = NULL;
2993
2994  if (libjsig_is_loaded) {
2995    // Retrieve the old signal handler from libjsig
2996    actp = (*get_signal_action)(sig);
2997  }
2998  if (actp == NULL) {
2999    // Retrieve the preinstalled signal handler from jvm
3000    actp = get_preinstalled_handler(sig);
3001  }
3002
3003  return actp;
3004}
3005
3006static bool call_chained_handler(struct sigaction *actp, int sig,
3007                                 siginfo_t *siginfo, void *context) {
3008  // Call the old signal handler
3009  if (actp->sa_handler == SIG_DFL) {
3010    // It's more reasonable to let jvm treat it as an unexpected exception
3011    // instead of taking the default action.
3012    return false;
3013  } else if (actp->sa_handler != SIG_IGN) {
3014    if ((actp->sa_flags & SA_NODEFER) == 0) {
3015      // automaticlly block the signal
3016      sigaddset(&(actp->sa_mask), sig);
3017    }
3018
3019    sa_handler_t hand = NULL;
3020    sa_sigaction_t sa = NULL;
3021    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
3022    // retrieve the chained handler
3023    if (siginfo_flag_set) {
3024      sa = actp->sa_sigaction;
3025    } else {
3026      hand = actp->sa_handler;
3027    }
3028
3029    if ((actp->sa_flags & SA_RESETHAND) != 0) {
3030      actp->sa_handler = SIG_DFL;
3031    }
3032
3033    // try to honor the signal mask
3034    sigset_t oset;
3035    pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
3036
3037    // call into the chained handler
3038    if (siginfo_flag_set) {
3039      (*sa)(sig, siginfo, context);
3040    } else {
3041      (*hand)(sig);
3042    }
3043
3044    // restore the signal mask
3045    pthread_sigmask(SIG_SETMASK, &oset, 0);
3046  }
3047  // Tell jvm's signal handler the signal is taken care of.
3048  return true;
3049}
3050
3051bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) {
3052  bool chained = false;
3053  // signal-chaining
3054  if (UseSignalChaining) {
3055    struct sigaction *actp = get_chained_signal_action(sig);
3056    if (actp != NULL) {
3057      chained = call_chained_handler(actp, sig, siginfo, context);
3058    }
3059  }
3060  return chained;
3061}
3062
3063struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
3064  if (sigismember(&sigs, sig)) {
3065    return &sigact[sig];
3066  }
3067  return NULL;
3068}
3069
3070void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
3071  assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3072  sigact[sig] = oldAct;
3073  sigaddset(&sigs, sig);
3074}
3075
3076// for diagnostic
3077int sigflags[NSIG];
3078
3079int os::Aix::get_our_sigflags(int sig) {
3080  assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3081  return sigflags[sig];
3082}
3083
3084void os::Aix::set_our_sigflags(int sig, int flags) {
3085  assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3086  if (sig > 0 && sig < NSIG) {
3087    sigflags[sig] = flags;
3088  }
3089}
3090
3091void os::Aix::set_signal_handler(int sig, bool set_installed) {
3092  // Check for overwrite.
3093  struct sigaction oldAct;
3094  sigaction(sig, (struct sigaction*)NULL, &oldAct);
3095
3096  void* oldhand = oldAct.sa_sigaction
3097    ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3098    : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3099  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3100      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3101      oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
3102    if (AllowUserSignalHandlers || !set_installed) {
3103      // Do not overwrite; user takes responsibility to forward to us.
3104      return;
3105    } else if (UseSignalChaining) {
3106      // save the old handler in jvm
3107      save_preinstalled_handler(sig, oldAct);
3108      // libjsig also interposes the sigaction() call below and saves the
3109      // old sigaction on it own.
3110    } else {
3111      fatal("Encountered unexpected pre-existing sigaction handler "
3112            "%#lx for signal %d.", (long)oldhand, sig);
3113    }
3114  }
3115
3116  struct sigaction sigAct;
3117  sigfillset(&(sigAct.sa_mask));
3118  if (!set_installed) {
3119    sigAct.sa_handler = SIG_DFL;
3120    sigAct.sa_flags = SA_RESTART;
3121  } else {
3122    sigAct.sa_sigaction = javaSignalHandler;
3123    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
3124  }
3125  // Save flags, which are set by ours
3126  assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3127  sigflags[sig] = sigAct.sa_flags;
3128
3129  int ret = sigaction(sig, &sigAct, &oldAct);
3130  assert(ret == 0, "check");
3131
3132  void* oldhand2 = oldAct.sa_sigaction
3133                 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3134                 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3135  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
3136}
3137
3138// install signal handlers for signals that HotSpot needs to
3139// handle in order to support Java-level exception handling.
3140void os::Aix::install_signal_handlers() {
3141  if (!signal_handlers_are_installed) {
3142    signal_handlers_are_installed = true;
3143
3144    // signal-chaining
3145    typedef void (*signal_setting_t)();
3146    signal_setting_t begin_signal_setting = NULL;
3147    signal_setting_t end_signal_setting = NULL;
3148    begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3149                             dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
3150    if (begin_signal_setting != NULL) {
3151      end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3152                             dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
3153      get_signal_action = CAST_TO_FN_PTR(get_signal_t,
3154                            dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
3155      libjsig_is_loaded = true;
3156      assert(UseSignalChaining, "should enable signal-chaining");
3157    }
3158    if (libjsig_is_loaded) {
3159      // Tell libjsig jvm is setting signal handlers.
3160      (*begin_signal_setting)();
3161    }
3162
3163    ::sigemptyset(&sigs);
3164    set_signal_handler(SIGSEGV, true);
3165    set_signal_handler(SIGPIPE, true);
3166    set_signal_handler(SIGBUS, true);
3167    set_signal_handler(SIGILL, true);
3168    set_signal_handler(SIGFPE, true);
3169    set_signal_handler(SIGTRAP, true);
3170    set_signal_handler(SIGXFSZ, true);
3171    set_signal_handler(SIGDANGER, true);
3172
3173    if (libjsig_is_loaded) {
3174      // Tell libjsig jvm finishes setting signal handlers.
3175      (*end_signal_setting)();
3176    }
3177
3178    // We don't activate signal checker if libjsig is in place, we trust ourselves
3179    // and if UserSignalHandler is installed all bets are off.
3180    // Log that signal checking is off only if -verbose:jni is specified.
3181    if (CheckJNICalls) {
3182      if (libjsig_is_loaded) {
3183        tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
3184        check_signals = false;
3185      }
3186      if (AllowUserSignalHandlers) {
3187        tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
3188        check_signals = false;
3189      }
3190      // Need to initialize check_signal_done.
3191      ::sigemptyset(&check_signal_done);
3192    }
3193  }
3194}
3195
3196static const char* get_signal_handler_name(address handler,
3197                                           char* buf, int buflen) {
3198  int offset;
3199  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
3200  if (found) {
3201    // skip directory names
3202    const char *p1, *p2;
3203    p1 = buf;
3204    size_t len = strlen(os::file_separator());
3205    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
3206    // The way os::dll_address_to_library_name is implemented on Aix
3207    // right now, it always returns -1 for the offset which is not
3208    // terribly informative.
3209    // Will fix that. For now, omit the offset.
3210    jio_snprintf(buf, buflen, "%s", p1);
3211  } else {
3212    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
3213  }
3214  return buf;
3215}
3216
3217static void print_signal_handler(outputStream* st, int sig,
3218                                 char* buf, size_t buflen) {
3219  struct sigaction sa;
3220  sigaction(sig, NULL, &sa);
3221
3222  st->print("%s: ", os::exception_name(sig, buf, buflen));
3223
3224  address handler = (sa.sa_flags & SA_SIGINFO)
3225    ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
3226    : CAST_FROM_FN_PTR(address, sa.sa_handler);
3227
3228  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
3229    st->print("SIG_DFL");
3230  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
3231    st->print("SIG_IGN");
3232  } else {
3233    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
3234  }
3235
3236  // Print readable mask.
3237  st->print(", sa_mask[0]=");
3238  os::Posix::print_signal_set_short(st, &sa.sa_mask);
3239
3240  address rh = VMError::get_resetted_sighandler(sig);
3241  // May be, handler was resetted by VMError?
3242  if (rh != NULL) {
3243    handler = rh;
3244    sa.sa_flags = VMError::get_resetted_sigflags(sig);
3245  }
3246
3247  // Print textual representation of sa_flags.
3248  st->print(", sa_flags=");
3249  os::Posix::print_sa_flags(st, sa.sa_flags);
3250
3251  // Check: is it our handler?
3252  if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) ||
3253      handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
3254    // It is our signal handler.
3255    // Check for flags, reset system-used one!
3256    if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) {
3257      st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library",
3258                os::Aix::get_our_sigflags(sig));
3259    }
3260  }
3261  st->cr();
3262}
3263
3264#define DO_SIGNAL_CHECK(sig) \
3265  if (!sigismember(&check_signal_done, sig)) \
3266    os::Aix::check_signal_handler(sig)
3267
3268// This method is a periodic task to check for misbehaving JNI applications
3269// under CheckJNI, we can add any periodic checks here
3270
3271void os::run_periodic_checks() {
3272
3273  if (check_signals == false) return;
3274
3275  // SEGV and BUS if overridden could potentially prevent
3276  // generation of hs*.log in the event of a crash, debugging
3277  // such a case can be very challenging, so we absolutely
3278  // check the following for a good measure:
3279  DO_SIGNAL_CHECK(SIGSEGV);
3280  DO_SIGNAL_CHECK(SIGILL);
3281  DO_SIGNAL_CHECK(SIGFPE);
3282  DO_SIGNAL_CHECK(SIGBUS);
3283  DO_SIGNAL_CHECK(SIGPIPE);
3284  DO_SIGNAL_CHECK(SIGXFSZ);
3285  if (UseSIGTRAP) {
3286    DO_SIGNAL_CHECK(SIGTRAP);
3287  }
3288  DO_SIGNAL_CHECK(SIGDANGER);
3289
3290  // ReduceSignalUsage allows the user to override these handlers
3291  // see comments at the very top and jvm_solaris.h
3292  if (!ReduceSignalUsage) {
3293    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
3294    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
3295    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
3296    DO_SIGNAL_CHECK(BREAK_SIGNAL);
3297  }
3298
3299  DO_SIGNAL_CHECK(SR_signum);
3300}
3301
3302typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
3303
3304static os_sigaction_t os_sigaction = NULL;
3305
3306void os::Aix::check_signal_handler(int sig) {
3307  char buf[O_BUFLEN];
3308  address jvmHandler = NULL;
3309
3310  struct sigaction act;
3311  if (os_sigaction == NULL) {
3312    // only trust the default sigaction, in case it has been interposed
3313    os_sigaction = CAST_TO_FN_PTR(os_sigaction_t, dlsym(RTLD_DEFAULT, "sigaction"));
3314    if (os_sigaction == NULL) return;
3315  }
3316
3317  os_sigaction(sig, (struct sigaction*)NULL, &act);
3318
3319  address thisHandler = (act.sa_flags & SA_SIGINFO)
3320    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
3321    : CAST_FROM_FN_PTR(address, act.sa_handler);
3322
3323  switch(sig) {
3324  case SIGSEGV:
3325  case SIGBUS:
3326  case SIGFPE:
3327  case SIGPIPE:
3328  case SIGILL:
3329  case SIGXFSZ:
3330    jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler);
3331    break;
3332
3333  case SHUTDOWN1_SIGNAL:
3334  case SHUTDOWN2_SIGNAL:
3335  case SHUTDOWN3_SIGNAL:
3336  case BREAK_SIGNAL:
3337    jvmHandler = (address)user_handler();
3338    break;
3339
3340  default:
3341    if (sig == SR_signum) {
3342      jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
3343    } else {
3344      return;
3345    }
3346    break;
3347  }
3348
3349  if (thisHandler != jvmHandler) {
3350    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
3351    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
3352    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
3353    // No need to check this sig any longer
3354    sigaddset(&check_signal_done, sig);
3355    // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
3356    if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
3357      tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
3358                    exception_name(sig, buf, O_BUFLEN));
3359    }
3360  } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) {
3361    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
3362    tty->print("expected:");
3363    os::Posix::print_sa_flags(tty, os::Aix::get_our_sigflags(sig));
3364    tty->cr();
3365    tty->print("  found:");
3366    os::Posix::print_sa_flags(tty, act.sa_flags);
3367    tty->cr();
3368    // No need to check this sig any longer
3369    sigaddset(&check_signal_done, sig);
3370  }
3371
3372  // Dump all the signal
3373  if (sigismember(&check_signal_done, sig)) {
3374    print_signal_handlers(tty, buf, O_BUFLEN);
3375  }
3376}
3377
3378// To install functions for atexit system call
3379extern "C" {
3380  static void perfMemory_exit_helper() {
3381    perfMemory_exit();
3382  }
3383}
3384
3385// This is called _before_ the most of global arguments have been parsed.
3386void os::init(void) {
3387  // This is basic, we want to know if that ever changes.
3388  // (Shared memory boundary is supposed to be a 256M aligned.)
3389  assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected");
3390
3391  // Record process break at startup.
3392  g_brk_at_startup = (address) ::sbrk(0);
3393  assert(g_brk_at_startup != (address) -1, "sbrk failed");
3394
3395  // First off, we need to know whether we run on AIX or PASE, and
3396  // the OS level we run on.
3397  os::Aix::initialize_os_info();
3398
3399  // Scan environment (SPEC1170 behaviour, etc).
3400  os::Aix::scan_environment();
3401
3402  // Probe multipage support.
3403  query_multipage_support();
3404
3405  // Act like we only have one page size by eliminating corner cases which
3406  // we did not support very well anyway.
3407  // We have two input conditions:
3408  // 1) Data segment page size. This is controlled by linker setting (datapsize) on the
3409  //    launcher, and/or by LDR_CNTRL environment variable. The latter overrules the linker
3410  //    setting.
3411  //    Data segment page size is important for us because it defines the thread stack page
3412  //    size, which is needed for guard page handling, stack banging etc.
3413  // 2) The ability to allocate 64k pages dynamically. If this is a given, java heap can
3414  //    and should be allocated with 64k pages.
3415  //
3416  // So, we do the following:
3417  // LDR_CNTRL    can_use_64K_pages_dynamically       what we do                      remarks
3418  // 4K           no                                  4K                              old systems (aix 5.2, as/400 v5r4) or new systems with AME activated
3419  // 4k           yes                                 64k (treat 4k stacks as 64k)    different loader than java and standard settings
3420  // 64k          no              --- AIX 5.2 ? ---
3421  // 64k          yes                                 64k                             new systems and standard java loader (we set datapsize=64k when linking)
3422
3423  // We explicitly leave no option to change page size, because only upgrading would work,
3424  // not downgrading (if stack page size is 64k you cannot pretend its 4k).
3425
3426  if (g_multipage_support.datapsize == SIZE_4K) {
3427    // datapsize = 4K. Data segment, thread stacks are 4K paged.
3428    if (g_multipage_support.can_use_64K_pages) {
3429      // .. but we are able to use 64K pages dynamically.
3430      // This would be typical for java launchers which are not linked
3431      // with datapsize=64K (like, any other launcher but our own).
3432      //
3433      // In this case it would be smart to allocate the java heap with 64K
3434      // to get the performance benefit, and to fake 64k pages for the
3435      // data segment (when dealing with thread stacks).
3436      //
3437      // However, leave a possibility to downgrade to 4K, using
3438      // -XX:-Use64KPages.
3439      if (Use64KPages) {
3440        trcVerbose("64K page mode (faked for data segment)");
3441        Aix::_page_size = SIZE_64K;
3442      } else {
3443        trcVerbose("4K page mode (Use64KPages=off)");
3444        Aix::_page_size = SIZE_4K;
3445      }
3446    } else {
3447      // .. and not able to allocate 64k pages dynamically. Here, just
3448      // fall back to 4K paged mode and use mmap for everything.
3449      trcVerbose("4K page mode");
3450      Aix::_page_size = SIZE_4K;
3451      FLAG_SET_ERGO(bool, Use64KPages, false);
3452    }
3453  } else {
3454    // datapsize = 64k. Data segment, thread stacks are 64k paged.
3455    // This normally means that we can allocate 64k pages dynamically.
3456    // (There is one special case where this may be false: EXTSHM=on.
3457    // but we decided to not support that mode).
3458    assert0(g_multipage_support.can_use_64K_pages);
3459    Aix::_page_size = SIZE_64K;
3460    trcVerbose("64K page mode");
3461    FLAG_SET_ERGO(bool, Use64KPages, true);
3462  }
3463
3464  // For now UseLargePages is just ignored.
3465  FLAG_SET_ERGO(bool, UseLargePages, false);
3466  _page_sizes[0] = 0;
3467
3468  // debug trace
3469  trcVerbose("os::vm_page_size %s", describe_pagesize(os::vm_page_size()));
3470
3471  // Next, we need to initialize libo4 and libperfstat libraries.
3472  if (os::Aix::on_pase()) {
3473    os::Aix::initialize_libo4();
3474  } else {
3475    os::Aix::initialize_libperfstat();
3476  }
3477
3478  // Reset the perfstat information provided by ODM.
3479  if (os::Aix::on_aix()) {
3480    libperfstat::perfstat_reset();
3481  }
3482
3483  // Now initialze basic system properties. Note that for some of the values we
3484  // need libperfstat etc.
3485  os::Aix::initialize_system_info();
3486
3487  clock_tics_per_sec = sysconf(_SC_CLK_TCK);
3488
3489  init_random(1234567);
3490
3491  ThreadCritical::initialize();
3492
3493  // Main_thread points to the aboriginal thread.
3494  Aix::_main_thread = pthread_self();
3495
3496  initial_time_count = os::elapsed_counter();
3497}
3498
3499// This is called _after_ the global arguments have been parsed.
3500jint os::init_2(void) {
3501
3502  if (os::Aix::on_pase()) {
3503    trcVerbose("Running on PASE.");
3504  } else {
3505    trcVerbose("Running on AIX (not PASE).");
3506  }
3507
3508  trcVerbose("processor count: %d", os::_processor_count);
3509  trcVerbose("physical memory: %lu", Aix::_physical_memory);
3510
3511  // Initially build up the loaded dll map.
3512  LoadedLibraries::reload();
3513  if (Verbose) {
3514    trcVerbose("Loaded Libraries: ");
3515    LoadedLibraries::print(tty);
3516  }
3517
3518  const int page_size = Aix::page_size();
3519  const int map_size = page_size;
3520
3521  address map_address = (address) MAP_FAILED;
3522  const int prot  = PROT_READ;
3523  const int flags = MAP_PRIVATE|MAP_ANONYMOUS;
3524
3525  // Use optimized addresses for the polling page,
3526  // e.g. map it to a special 32-bit address.
3527  if (OptimizePollingPageLocation) {
3528    // architecture-specific list of address wishes:
3529    address address_wishes[] = {
3530      // AIX: addresses lower than 0x30000000 don't seem to work on AIX.
3531      // PPC64: all address wishes are non-negative 32 bit values where
3532      // the lower 16 bits are all zero. we can load these addresses
3533      // with a single ppc_lis instruction.
3534      (address) 0x30000000, (address) 0x31000000,
3535      (address) 0x32000000, (address) 0x33000000,
3536      (address) 0x40000000, (address) 0x41000000,
3537      (address) 0x42000000, (address) 0x43000000,
3538      (address) 0x50000000, (address) 0x51000000,
3539      (address) 0x52000000, (address) 0x53000000,
3540      (address) 0x60000000, (address) 0x61000000,
3541      (address) 0x62000000, (address) 0x63000000
3542    };
3543    int address_wishes_length = sizeof(address_wishes)/sizeof(address);
3544
3545    // iterate over the list of address wishes:
3546    for (int i=0; i<address_wishes_length; i++) {
3547      // Try to map with current address wish.
3548      // AIX: AIX needs MAP_FIXED if we provide an address and mmap will
3549      // fail if the address is already mapped.
3550      map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size,
3551                                     map_size, prot,
3552                                     flags | MAP_FIXED,
3553                                     -1, 0);
3554      trcVerbose("SafePoint Polling  Page address: %p (wish) => %p",
3555                   address_wishes[i], map_address + (ssize_t)page_size);
3556
3557      if (map_address + (ssize_t)page_size == address_wishes[i]) {
3558        // Map succeeded and map_address is at wished address, exit loop.
3559        break;
3560      }
3561
3562      if (map_address != (address) MAP_FAILED) {
3563        // Map succeeded, but polling_page is not at wished address, unmap and continue.
3564        ::munmap(map_address, map_size);
3565        map_address = (address) MAP_FAILED;
3566      }
3567      // Map failed, continue loop.
3568    }
3569  } // end OptimizePollingPageLocation
3570
3571  if (map_address == (address) MAP_FAILED) {
3572    map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0);
3573  }
3574  guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page");
3575  os::set_polling_page(map_address);
3576
3577  if (!UseMembar) {
3578    address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
3579    guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
3580    os::set_memory_serialize_page(mem_serialize_page);
3581
3582    trcVerbose("Memory Serialize  Page address: %p - %p, size %IX (%IB)",
3583        mem_serialize_page, mem_serialize_page + Aix::page_size(),
3584        Aix::page_size(), Aix::page_size());
3585  }
3586
3587  // initialize suspend/resume support - must do this before signal_sets_init()
3588  if (SR_initialize() != 0) {
3589    perror("SR_initialize failed");
3590    return JNI_ERR;
3591  }
3592
3593  Aix::signal_sets_init();
3594  Aix::install_signal_handlers();
3595
3596  // Check minimum allowable stack size for thread creation and to initialize
3597  // the java system classes, including StackOverflowError - depends on page
3598  // size. Add two 4K pages for compiler2 recursion in main thread.
3599  // Add in 4*BytesPerWord 4K pages to account for VM stack during
3600  // class initialization depending on 32 or 64 bit VM.
3601  os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed,
3602                                    JavaThread::stack_guard_zone_size() +
3603                                    JavaThread::stack_shadow_zone_size() +
3604                                    (4*BytesPerWord COMPILER2_PRESENT(+2)) * 4 * K);
3605
3606  os::Aix::min_stack_allowed = align_size_up(os::Aix::min_stack_allowed, os::vm_page_size());
3607
3608  size_t threadStackSizeInBytes = ThreadStackSize * K;
3609  if (threadStackSizeInBytes != 0 &&
3610      threadStackSizeInBytes < os::Aix::min_stack_allowed) {
3611    tty->print_cr("\nThe stack size specified is too small, "
3612                  "Specify at least %dk",
3613                  os::Aix::min_stack_allowed / K);
3614    return JNI_ERR;
3615  }
3616
3617  // Make the stack size a multiple of the page size so that
3618  // the yellow/red zones can be guarded.
3619  // Note that this can be 0, if no default stacksize was set.
3620  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size()));
3621
3622  if (UseNUMA) {
3623    UseNUMA = false;
3624    warning("NUMA optimizations are not available on this OS.");
3625  }
3626
3627  if (MaxFDLimit) {
3628    // Set the number of file descriptors to max. print out error
3629    // if getrlimit/setrlimit fails but continue regardless.
3630    struct rlimit nbr_files;
3631    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
3632    if (status != 0) {
3633      log_info(os)("os::init_2 getrlimit failed: %s", os::strerror(errno));
3634    } else {
3635      nbr_files.rlim_cur = nbr_files.rlim_max;
3636      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
3637      if (status != 0) {
3638        log_info(os)("os::init_2 setrlimit failed: %s", os::strerror(errno));
3639      }
3640    }
3641  }
3642
3643  if (PerfAllowAtExitRegistration) {
3644    // Only register atexit functions if PerfAllowAtExitRegistration is set.
3645    // At exit functions can be delayed until process exit time, which
3646    // can be problematic for embedded VM situations. Embedded VMs should
3647    // call DestroyJavaVM() to assure that VM resources are released.
3648
3649    // Note: perfMemory_exit_helper atexit function may be removed in
3650    // the future if the appropriate cleanup code can be added to the
3651    // VM_Exit VMOperation's doit method.
3652    if (atexit(perfMemory_exit_helper) != 0) {
3653      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3654    }
3655  }
3656
3657  return JNI_OK;
3658}
3659
3660// Mark the polling page as unreadable
3661void os::make_polling_page_unreadable(void) {
3662  if (!guard_memory((char*)_polling_page, Aix::page_size())) {
3663    fatal("Could not disable polling page");
3664  }
3665};
3666
3667// Mark the polling page as readable
3668void os::make_polling_page_readable(void) {
3669  // Changed according to os_linux.cpp.
3670  if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
3671    fatal("Could not enable polling page at " PTR_FORMAT, _polling_page);
3672  }
3673};
3674
3675int os::active_processor_count() {
3676  int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
3677  assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
3678  return online_cpus;
3679}
3680
3681void os::set_native_thread_name(const char *name) {
3682  // Not yet implemented.
3683  return;
3684}
3685
3686bool os::distribute_processes(uint length, uint* distribution) {
3687  // Not yet implemented.
3688  return false;
3689}
3690
3691bool os::bind_to_processor(uint processor_id) {
3692  // Not yet implemented.
3693  return false;
3694}
3695
3696void os::SuspendedThreadTask::internal_do_task() {
3697  if (do_suspend(_thread->osthread())) {
3698    SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
3699    do_task(context);
3700    do_resume(_thread->osthread());
3701  }
3702}
3703
3704class PcFetcher : public os::SuspendedThreadTask {
3705public:
3706  PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
3707  ExtendedPC result();
3708protected:
3709  void do_task(const os::SuspendedThreadTaskContext& context);
3710private:
3711  ExtendedPC _epc;
3712};
3713
3714ExtendedPC PcFetcher::result() {
3715  guarantee(is_done(), "task is not done yet.");
3716  return _epc;
3717}
3718
3719void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
3720  Thread* thread = context.thread();
3721  OSThread* osthread = thread->osthread();
3722  if (osthread->ucontext() != NULL) {
3723    _epc = os::Aix::ucontext_get_pc((const ucontext_t *) context.ucontext());
3724  } else {
3725    // NULL context is unexpected, double-check this is the VMThread.
3726    guarantee(thread->is_VM_thread(), "can only be called for VMThread");
3727  }
3728}
3729
3730// Suspends the target using the signal mechanism and then grabs the PC before
3731// resuming the target. Used by the flat-profiler only
3732ExtendedPC os::get_thread_pc(Thread* thread) {
3733  // Make sure that it is called by the watcher for the VMThread.
3734  assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
3735  assert(thread->is_VM_thread(), "Can only be called for VMThread");
3736
3737  PcFetcher fetcher(thread);
3738  fetcher.run();
3739  return fetcher.result();
3740}
3741
3742////////////////////////////////////////////////////////////////////////////////
3743// debug support
3744
3745bool os::find(address addr, outputStream* st) {
3746
3747  st->print(PTR_FORMAT ": ", addr);
3748
3749  loaded_module_t lm;
3750  if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL ||
3751      LoadedLibraries::find_for_data_address(addr, &lm) != NULL) {
3752    st->print_cr("%s", lm.path);
3753    return true;
3754  }
3755
3756  return false;
3757}
3758
3759////////////////////////////////////////////////////////////////////////////////
3760// misc
3761
3762// This does not do anything on Aix. This is basically a hook for being
3763// able to use structured exception handling (thread-local exception filters)
3764// on, e.g., Win32.
3765void
3766os::os_exception_wrapper(java_call_t f, JavaValue* value, const methodHandle& method,
3767                         JavaCallArguments* args, Thread* thread) {
3768  f(value, method, args, thread);
3769}
3770
3771void os::print_statistics() {
3772}
3773
3774bool os::message_box(const char* title, const char* message) {
3775  int i;
3776  fdStream err(defaultStream::error_fd());
3777  for (i = 0; i < 78; i++) err.print_raw("=");
3778  err.cr();
3779  err.print_raw_cr(title);
3780  for (i = 0; i < 78; i++) err.print_raw("-");
3781  err.cr();
3782  err.print_raw_cr(message);
3783  for (i = 0; i < 78; i++) err.print_raw("=");
3784  err.cr();
3785
3786  char buf[16];
3787  // Prevent process from exiting upon "read error" without consuming all CPU
3788  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
3789
3790  return buf[0] == 'y' || buf[0] == 'Y';
3791}
3792
3793int os::stat(const char *path, struct stat *sbuf) {
3794  char pathbuf[MAX_PATH];
3795  if (strlen(path) > MAX_PATH - 1) {
3796    errno = ENAMETOOLONG;
3797    return -1;
3798  }
3799  os::native_path(strcpy(pathbuf, path));
3800  return ::stat(pathbuf, sbuf);
3801}
3802
3803bool os::check_heap(bool force) {
3804  return true;
3805}
3806
3807// Is a (classpath) directory empty?
3808bool os::dir_is_empty(const char* path) {
3809  DIR *dir = NULL;
3810  struct dirent *ptr;
3811
3812  dir = opendir(path);
3813  if (dir == NULL) return true;
3814
3815  /* Scan the directory */
3816  bool result = true;
3817  char buf[sizeof(struct dirent) + MAX_PATH];
3818  while (result && (ptr = ::readdir(dir)) != NULL) {
3819    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
3820      result = false;
3821    }
3822  }
3823  closedir(dir);
3824  return result;
3825}
3826
3827// This code originates from JDK's sysOpen and open64_w
3828// from src/solaris/hpi/src/system_md.c
3829
3830int os::open(const char *path, int oflag, int mode) {
3831
3832  if (strlen(path) > MAX_PATH - 1) {
3833    errno = ENAMETOOLONG;
3834    return -1;
3835  }
3836  int fd;
3837
3838  fd = ::open64(path, oflag, mode);
3839  if (fd == -1) return -1;
3840
3841  // If the open succeeded, the file might still be a directory.
3842  {
3843    struct stat64 buf64;
3844    int ret = ::fstat64(fd, &buf64);
3845    int st_mode = buf64.st_mode;
3846
3847    if (ret != -1) {
3848      if ((st_mode & S_IFMT) == S_IFDIR) {
3849        errno = EISDIR;
3850        ::close(fd);
3851        return -1;
3852      }
3853    } else {
3854      ::close(fd);
3855      return -1;
3856    }
3857  }
3858
3859  // All file descriptors that are opened in the JVM and not
3860  // specifically destined for a subprocess should have the
3861  // close-on-exec flag set. If we don't set it, then careless 3rd
3862  // party native code might fork and exec without closing all
3863  // appropriate file descriptors (e.g. as we do in closeDescriptors in
3864  // UNIXProcess.c), and this in turn might:
3865  //
3866  // - cause end-of-file to fail to be detected on some file
3867  //   descriptors, resulting in mysterious hangs, or
3868  //
3869  // - might cause an fopen in the subprocess to fail on a system
3870  //   suffering from bug 1085341.
3871  //
3872  // (Yes, the default setting of the close-on-exec flag is a Unix
3873  // design flaw.)
3874  //
3875  // See:
3876  // 1085341: 32-bit stdio routines should support file descriptors >255
3877  // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
3878  // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
3879#ifdef FD_CLOEXEC
3880  {
3881    int flags = ::fcntl(fd, F_GETFD);
3882    if (flags != -1)
3883      ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
3884  }
3885#endif
3886
3887  return fd;
3888}
3889
3890// create binary file, rewriting existing file if required
3891int os::create_binary_file(const char* path, bool rewrite_existing) {
3892  int oflags = O_WRONLY | O_CREAT;
3893  if (!rewrite_existing) {
3894    oflags |= O_EXCL;
3895  }
3896  return ::open64(path, oflags, S_IREAD | S_IWRITE);
3897}
3898
3899// return current position of file pointer
3900jlong os::current_file_offset(int fd) {
3901  return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
3902}
3903
3904// move file pointer to the specified offset
3905jlong os::seek_to_file_offset(int fd, jlong offset) {
3906  return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
3907}
3908
3909// This code originates from JDK's sysAvailable
3910// from src/solaris/hpi/src/native_threads/src/sys_api_td.c
3911
3912int os::available(int fd, jlong *bytes) {
3913  jlong cur, end;
3914  int mode;
3915  struct stat64 buf64;
3916
3917  if (::fstat64(fd, &buf64) >= 0) {
3918    mode = buf64.st_mode;
3919    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
3920      int n;
3921      if (::ioctl(fd, FIONREAD, &n) >= 0) {
3922        *bytes = n;
3923        return 1;
3924      }
3925    }
3926  }
3927  if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
3928    return 0;
3929  } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
3930    return 0;
3931  } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
3932    return 0;
3933  }
3934  *bytes = end - cur;
3935  return 1;
3936}
3937
3938// Map a block of memory.
3939char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
3940                        char *addr, size_t bytes, bool read_only,
3941                        bool allow_exec) {
3942  int prot;
3943  int flags = MAP_PRIVATE;
3944
3945  if (read_only) {
3946    prot = PROT_READ;
3947    flags = MAP_SHARED;
3948  } else {
3949    prot = PROT_READ | PROT_WRITE;
3950    flags = MAP_PRIVATE;
3951  }
3952
3953  if (allow_exec) {
3954    prot |= PROT_EXEC;
3955  }
3956
3957  if (addr != NULL) {
3958    flags |= MAP_FIXED;
3959  }
3960
3961  // Allow anonymous mappings if 'fd' is -1.
3962  if (fd == -1) {
3963    flags |= MAP_ANONYMOUS;
3964  }
3965
3966  char* mapped_address = (char*)::mmap(addr, (size_t)bytes, prot, flags,
3967                                     fd, file_offset);
3968  if (mapped_address == MAP_FAILED) {
3969    return NULL;
3970  }
3971  return mapped_address;
3972}
3973
3974// Remap a block of memory.
3975char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
3976                          char *addr, size_t bytes, bool read_only,
3977                          bool allow_exec) {
3978  // same as map_memory() on this OS
3979  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
3980                        allow_exec);
3981}
3982
3983// Unmap a block of memory.
3984bool os::pd_unmap_memory(char* addr, size_t bytes) {
3985  return munmap(addr, bytes) == 0;
3986}
3987
3988// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3989// are used by JVM M&M and JVMTI to get user+sys or user CPU time
3990// of a thread.
3991//
3992// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3993// the fast estimate available on the platform.
3994
3995jlong os::current_thread_cpu_time() {
3996  // return user + sys since the cost is the same
3997  const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */);
3998  assert(n >= 0, "negative CPU time");
3999  return n;
4000}
4001
4002jlong os::thread_cpu_time(Thread* thread) {
4003  // consistent with what current_thread_cpu_time() returns
4004  const jlong n = os::thread_cpu_time(thread, true /* user + sys */);
4005  assert(n >= 0, "negative CPU time");
4006  return n;
4007}
4008
4009jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
4010  const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
4011  assert(n >= 0, "negative CPU time");
4012  return n;
4013}
4014
4015static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) {
4016  bool error = false;
4017
4018  jlong sys_time = 0;
4019  jlong user_time = 0;
4020
4021  // Reimplemented using getthrds64().
4022  //
4023  // Works like this:
4024  // For the thread in question, get the kernel thread id. Then get the
4025  // kernel thread statistics using that id.
4026  //
4027  // This only works of course when no pthread scheduling is used,
4028  // i.e. there is a 1:1 relationship to kernel threads.
4029  // On AIX, see AIXTHREAD_SCOPE variable.
4030
4031  pthread_t pthtid = thread->osthread()->pthread_id();
4032
4033  // retrieve kernel thread id for the pthread:
4034  tid64_t tid = 0;
4035  struct __pthrdsinfo pinfo;
4036  // I just love those otherworldly IBM APIs which force me to hand down
4037  // dummy buffers for stuff I dont care for...
4038  char dummy[1];
4039  int dummy_size = sizeof(dummy);
4040  if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo),
4041                          dummy, &dummy_size) == 0) {
4042    tid = pinfo.__pi_tid;
4043  } else {
4044    tty->print_cr("pthread_getthrds_np failed.");
4045    error = true;
4046  }
4047
4048  // retrieve kernel timing info for that kernel thread
4049  if (!error) {
4050    struct thrdentry64 thrdentry;
4051    if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) {
4052      sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL;
4053      user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL;
4054    } else {
4055      tty->print_cr("pthread_getthrds_np failed.");
4056      error = true;
4057    }
4058  }
4059
4060  if (p_sys_time) {
4061    *p_sys_time = sys_time;
4062  }
4063
4064  if (p_user_time) {
4065    *p_user_time = user_time;
4066  }
4067
4068  if (error) {
4069    return false;
4070  }
4071
4072  return true;
4073}
4074
4075jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
4076  jlong sys_time;
4077  jlong user_time;
4078
4079  if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) {
4080    return -1;
4081  }
4082
4083  return user_sys_cpu_time ? sys_time + user_time : user_time;
4084}
4085
4086void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4087  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
4088  info_ptr->may_skip_backward = false;     // elapsed time not wall time
4089  info_ptr->may_skip_forward = false;      // elapsed time not wall time
4090  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
4091}
4092
4093void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4094  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
4095  info_ptr->may_skip_backward = false;     // elapsed time not wall time
4096  info_ptr->may_skip_forward = false;      // elapsed time not wall time
4097  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
4098}
4099
4100bool os::is_thread_cpu_time_supported() {
4101  return true;
4102}
4103
4104// System loadavg support. Returns -1 if load average cannot be obtained.
4105// For now just return the system wide load average (no processor sets).
4106int os::loadavg(double values[], int nelem) {
4107
4108  guarantee(nelem >= 0 && nelem <= 3, "argument error");
4109  guarantee(values, "argument error");
4110
4111  if (os::Aix::on_pase()) {
4112
4113    // AS/400 PASE: use libo4 porting library
4114    double v[3] = { 0.0, 0.0, 0.0 };
4115
4116    if (libo4::get_load_avg(v, v + 1, v + 2)) {
4117      for (int i = 0; i < nelem; i ++) {
4118        values[i] = v[i];
4119      }
4120      return nelem;
4121    } else {
4122      return -1;
4123    }
4124
4125  } else {
4126
4127    // AIX: use libperfstat
4128    libperfstat::cpuinfo_t ci;
4129    if (libperfstat::get_cpuinfo(&ci)) {
4130      for (int i = 0; i < nelem; i++) {
4131        values[i] = ci.loadavg[i];
4132      }
4133    } else {
4134      return -1;
4135    }
4136    return nelem;
4137  }
4138}
4139
4140void os::pause() {
4141  char filename[MAX_PATH];
4142  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4143    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4144  } else {
4145    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4146  }
4147
4148  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4149  if (fd != -1) {
4150    struct stat buf;
4151    ::close(fd);
4152    while (::stat(filename, &buf) == 0) {
4153      (void)::poll(NULL, 0, 100);
4154    }
4155  } else {
4156    trcVerbose("Could not open pause file '%s', continuing immediately.", filename);
4157  }
4158}
4159
4160bool os::Aix::is_primordial_thread() {
4161  if (pthread_self() == (pthread_t)1) {
4162    return true;
4163  } else {
4164    return false;
4165  }
4166}
4167
4168// OS recognitions (PASE/AIX, OS level) call this before calling any
4169// one of Aix::on_pase(), Aix::os_version() static
4170void os::Aix::initialize_os_info() {
4171
4172  assert(_on_pase == -1 && _os_version == 0, "already called.");
4173
4174  struct utsname uts;
4175  memset(&uts, 0, sizeof(uts));
4176  strcpy(uts.sysname, "?");
4177  if (::uname(&uts) == -1) {
4178    trcVerbose("uname failed (%d)", errno);
4179    guarantee(0, "Could not determine whether we run on AIX or PASE");
4180  } else {
4181    trcVerbose("uname says: sysname \"%s\" version \"%s\" release \"%s\" "
4182               "node \"%s\" machine \"%s\"\n",
4183               uts.sysname, uts.version, uts.release, uts.nodename, uts.machine);
4184    const int major = atoi(uts.version);
4185    assert(major > 0, "invalid OS version");
4186    const int minor = atoi(uts.release);
4187    assert(minor > 0, "invalid OS release");
4188    _os_version = (major << 24) | (minor << 16);
4189    char ver_str[20] = {0};
4190    char *name_str = "unknown OS";
4191    if (strcmp(uts.sysname, "OS400") == 0) {
4192      // We run on AS/400 PASE. We do not support versions older than V5R4M0.
4193      _on_pase = 1;
4194      if (os_version_short() < 0x0504) {
4195        trcVerbose("OS/400 releases older than V5R4M0 not supported.");
4196        assert(false, "OS/400 release too old.");
4197      }
4198      name_str = "OS/400 (pase)";
4199      jio_snprintf(ver_str, sizeof(ver_str), "%u.%u", major, minor);
4200    } else if (strcmp(uts.sysname, "AIX") == 0) {
4201      // We run on AIX. We do not support versions older than AIX 5.3.
4202      _on_pase = 0;
4203      // Determine detailed AIX version: Version, Release, Modification, Fix Level.
4204      odmWrapper::determine_os_kernel_version(&_os_version);
4205      if (os_version_short() < 0x0503) {
4206        trcVerbose("AIX release older than AIX 5.3 not supported.");
4207        assert(false, "AIX release too old.");
4208      }
4209      name_str = "AIX";
4210      jio_snprintf(ver_str, sizeof(ver_str), "%u.%u.%u.%u",
4211                   major, minor, (_os_version >> 8) & 0xFF, _os_version & 0xFF);
4212    } else {
4213      assert(false, name_str);
4214    }
4215    trcVerbose("We run on %s %s", name_str, ver_str);
4216  }
4217
4218  guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release");
4219} // end: os::Aix::initialize_os_info()
4220
4221// Scan environment for important settings which might effect the VM.
4222// Trace out settings. Warn about invalid settings and/or correct them.
4223//
4224// Must run after os::Aix::initialue_os_info().
4225void os::Aix::scan_environment() {
4226
4227  char* p;
4228  int rc;
4229
4230  // Warn explicity if EXTSHM=ON is used. That switch changes how
4231  // System V shared memory behaves. One effect is that page size of
4232  // shared memory cannot be change dynamically, effectivly preventing
4233  // large pages from working.
4234  // This switch was needed on AIX 32bit, but on AIX 64bit the general
4235  // recommendation is (in OSS notes) to switch it off.
4236  p = ::getenv("EXTSHM");
4237  trcVerbose("EXTSHM=%s.", p ? p : "<unset>");
4238  if (p && strcasecmp(p, "ON") == 0) {
4239    _extshm = 1;
4240    trcVerbose("*** Unsupported mode! Please remove EXTSHM from your environment! ***");
4241    if (!AllowExtshm) {
4242      // We allow under certain conditions the user to continue. However, we want this
4243      // to be a fatal error by default. On certain AIX systems, leaving EXTSHM=ON means
4244      // that the VM is not able to allocate 64k pages for the heap.
4245      // We do not want to run with reduced performance.
4246      vm_exit_during_initialization("EXTSHM is ON. Please remove EXTSHM from your environment.");
4247    }
4248  } else {
4249    _extshm = 0;
4250  }
4251
4252  // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs.
4253  // Not tested, not supported.
4254  //
4255  // Note that it might be worth the trouble to test and to require it, if only to
4256  // get useful return codes for mprotect.
4257  //
4258  // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before
4259  // exec() ? before loading the libjvm ? ....)
4260  p = ::getenv("XPG_SUS_ENV");
4261  trcVerbose("XPG_SUS_ENV=%s.", p ? p : "<unset>");
4262  if (p && strcmp(p, "ON") == 0) {
4263    _xpg_sus_mode = 1;
4264    trcVerbose("Unsupported setting: XPG_SUS_ENV=ON");
4265    // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to
4266    // clobber address ranges. If we ever want to support that, we have to do some
4267    // testing first.
4268    guarantee(false, "XPG_SUS_ENV=ON not supported");
4269  } else {
4270    _xpg_sus_mode = 0;
4271  }
4272
4273  if (os::Aix::on_pase()) {
4274    p = ::getenv("QIBM_MULTI_THREADED");
4275    trcVerbose("QIBM_MULTI_THREADED=%s.", p ? p : "<unset>");
4276  }
4277
4278  p = ::getenv("LDR_CNTRL");
4279  trcVerbose("LDR_CNTRL=%s.", p ? p : "<unset>");
4280  if (os::Aix::on_pase() && os::Aix::os_version_short() == 0x0701) {
4281    if (p && ::strstr(p, "TEXTPSIZE")) {
4282      trcVerbose("*** WARNING - LDR_CNTRL contains TEXTPSIZE. "
4283        "you may experience hangs or crashes on OS/400 V7R1.");
4284    }
4285  }
4286
4287  p = ::getenv("AIXTHREAD_GUARDPAGES");
4288  trcVerbose("AIXTHREAD_GUARDPAGES=%s.", p ? p : "<unset>");
4289
4290} // end: os::Aix::scan_environment()
4291
4292// PASE: initialize the libo4 library (PASE porting library).
4293void os::Aix::initialize_libo4() {
4294  guarantee(os::Aix::on_pase(), "OS/400 only.");
4295  if (!libo4::init()) {
4296    trcVerbose("libo4 initialization failed.");
4297    assert(false, "libo4 initialization failed");
4298  } else {
4299    trcVerbose("libo4 initialized.");
4300  }
4301}
4302
4303// AIX: initialize the libperfstat library.
4304void os::Aix::initialize_libperfstat() {
4305  assert(os::Aix::on_aix(), "AIX only");
4306  if (!libperfstat::init()) {
4307    trcVerbose("libperfstat initialization failed.");
4308    assert(false, "libperfstat initialization failed");
4309  } else {
4310    trcVerbose("libperfstat initialized.");
4311  }
4312}
4313
4314/////////////////////////////////////////////////////////////////////////////
4315// thread stack
4316
4317// Function to query the current stack size using pthread_getthrds_np.
4318static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
4319  // This only works when invoked on a pthread. As we agreed not to use
4320  // primordial threads anyway, I assert here.
4321  guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread");
4322
4323  // Information about this api can be found (a) in the pthread.h header and
4324  // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
4325  //
4326  // The use of this API to find out the current stack is kind of undefined.
4327  // But after a lot of tries and asking IBM about it, I concluded that it is safe
4328  // enough for cases where I let the pthread library create its stacks. For cases
4329  // where I create an own stack and pass this to pthread_create, it seems not to
4330  // work (the returned stack size in that case is 0).
4331
4332  pthread_t tid = pthread_self();
4333  struct __pthrdsinfo pinfo;
4334  char dummy[1]; // Just needed to satisfy pthread_getthrds_np.
4335  int dummy_size = sizeof(dummy);
4336
4337  memset(&pinfo, 0, sizeof(pinfo));
4338
4339  const int rc = pthread_getthrds_np(&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
4340                                     sizeof(pinfo), dummy, &dummy_size);
4341
4342  if (rc != 0) {
4343    assert0(false);
4344    trcVerbose("pthread_getthrds_np failed (%d)", rc);
4345    return false;
4346  }
4347  guarantee0(pinfo.__pi_stackend);
4348
4349  // The following may happen when invoking pthread_getthrds_np on a pthread
4350  // running on a user provided stack (when handing down a stack to pthread
4351  // create, see pthread_attr_setstackaddr).
4352  // Not sure what to do then.
4353
4354  guarantee0(pinfo.__pi_stacksize);
4355
4356  // Note: we get three values from pthread_getthrds_np:
4357  //       __pi_stackaddr, __pi_stacksize, __pi_stackend
4358  //
4359  // high addr    ---------------------
4360  //
4361  //    |         pthread internal data, like ~2K
4362  //    |
4363  //    |         ---------------------   __pi_stackend   (usually not page aligned, (xxxxF890))
4364  //    |
4365  //    |
4366  //    |
4367  //    |
4368  //    |
4369  //    |
4370  //    |          ---------------------   (__pi_stackend - __pi_stacksize)
4371  //    |
4372  //    |          padding to align the following AIX guard pages, if enabled.
4373  //    |
4374  //    V          ---------------------   __pi_stackaddr
4375  //
4376  // low addr      AIX guard pages, if enabled (AIXTHREAD_GUARDPAGES > 0)
4377  //
4378
4379  address stack_base = (address)(pinfo.__pi_stackend);
4380  address stack_low_addr = (address)align_ptr_up(pinfo.__pi_stackaddr,
4381    os::vm_page_size());
4382  size_t stack_size = stack_base - stack_low_addr;
4383
4384  if (p_stack_base) {
4385    *p_stack_base = stack_base;
4386  }
4387
4388  if (p_stack_size) {
4389    *p_stack_size = stack_size;
4390  }
4391
4392  return true;
4393}
4394
4395// Get the current stack base from the OS (actually, the pthread library).
4396address os::current_stack_base() {
4397  address p;
4398  query_stack_dimensions(&p, 0);
4399  return p;
4400}
4401
4402// Get the current stack size from the OS (actually, the pthread library).
4403size_t os::current_stack_size() {
4404  size_t s;
4405  query_stack_dimensions(0, &s);
4406  return s;
4407}
4408
4409// Refer to the comments in os_solaris.cpp park-unpark.
4410
4411// utility to compute the abstime argument to timedwait:
4412// millis is the relative timeout time
4413// abstime will be the absolute timeout time
4414// TODO: replace compute_abstime() with unpackTime()
4415
4416static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
4417  if (millis < 0) millis = 0;
4418  struct timeval now;
4419  int status = gettimeofday(&now, NULL);
4420  assert(status == 0, "gettimeofday");
4421  jlong seconds = millis / 1000;
4422  millis %= 1000;
4423  if (seconds > 50000000) { // see man cond_timedwait(3T)
4424    seconds = 50000000;
4425  }
4426  abstime->tv_sec = now.tv_sec  + seconds;
4427  long       usec = now.tv_usec + millis * 1000;
4428  if (usec >= 1000000) {
4429    abstime->tv_sec += 1;
4430    usec -= 1000000;
4431  }
4432  abstime->tv_nsec = usec * 1000;
4433  return abstime;
4434}
4435
4436// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
4437// Conceptually TryPark() should be equivalent to park(0).
4438
4439int os::PlatformEvent::TryPark() {
4440  for (;;) {
4441    const int v = _Event;
4442    guarantee ((v == 0) || (v == 1), "invariant");
4443    if (Atomic::cmpxchg (0, &_Event, v) == v) return v;
4444  }
4445}
4446
4447void os::PlatformEvent::park() {       // AKA "down()"
4448  // Invariant: Only the thread associated with the Event/PlatformEvent
4449  // may call park().
4450  // TODO: assert that _Assoc != NULL or _Assoc == Self
4451  int v;
4452  for (;;) {
4453    v = _Event;
4454    if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
4455  }
4456  guarantee (v >= 0, "invariant");
4457  if (v == 0) {
4458    // Do this the hard way by blocking ...
4459    int status = pthread_mutex_lock(_mutex);
4460    assert_status(status == 0, status, "mutex_lock");
4461    guarantee (_nParked == 0, "invariant");
4462    ++ _nParked;
4463    while (_Event < 0) {
4464      status = pthread_cond_wait(_cond, _mutex);
4465      assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait");
4466    }
4467    -- _nParked;
4468
4469    // In theory we could move the ST of 0 into _Event past the unlock(),
4470    // but then we'd need a MEMBAR after the ST.
4471    _Event = 0;
4472    status = pthread_mutex_unlock(_mutex);
4473    assert_status(status == 0, status, "mutex_unlock");
4474  }
4475  guarantee (_Event >= 0, "invariant");
4476}
4477
4478int os::PlatformEvent::park(jlong millis) {
4479  guarantee (_nParked == 0, "invariant");
4480
4481  int v;
4482  for (;;) {
4483    v = _Event;
4484    if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
4485  }
4486  guarantee (v >= 0, "invariant");
4487  if (v != 0) return OS_OK;
4488
4489  // We do this the hard way, by blocking the thread.
4490  // Consider enforcing a minimum timeout value.
4491  struct timespec abst;
4492  compute_abstime(&abst, millis);
4493
4494  int ret = OS_TIMEOUT;
4495  int status = pthread_mutex_lock(_mutex);
4496  assert_status(status == 0, status, "mutex_lock");
4497  guarantee (_nParked == 0, "invariant");
4498  ++_nParked;
4499
4500  // Object.wait(timo) will return because of
4501  // (a) notification
4502  // (b) timeout
4503  // (c) thread.interrupt
4504  //
4505  // Thread.interrupt and object.notify{All} both call Event::set.
4506  // That is, we treat thread.interrupt as a special case of notification.
4507  // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
4508  // We assume all ETIME returns are valid.
4509  //
4510  // TODO: properly differentiate simultaneous notify+interrupt.
4511  // In that case, we should propagate the notify to another waiter.
4512
4513  while (_Event < 0) {
4514    status = pthread_cond_timedwait(_cond, _mutex, &abst);
4515    assert_status(status == 0 || status == ETIMEDOUT,
4516                  status, "cond_timedwait");
4517    if (!FilterSpuriousWakeups) break;         // previous semantics
4518    if (status == ETIMEDOUT) break;
4519    // We consume and ignore EINTR and spurious wakeups.
4520  }
4521  --_nParked;
4522  if (_Event >= 0) {
4523     ret = OS_OK;
4524  }
4525  _Event = 0;
4526  status = pthread_mutex_unlock(_mutex);
4527  assert_status(status == 0, status, "mutex_unlock");
4528  assert (_nParked == 0, "invariant");
4529  return ret;
4530}
4531
4532void os::PlatformEvent::unpark() {
4533  int v, AnyWaiters;
4534  for (;;) {
4535    v = _Event;
4536    if (v > 0) {
4537      // The LD of _Event could have reordered or be satisfied
4538      // by a read-aside from this processor's write buffer.
4539      // To avoid problems execute a barrier and then
4540      // ratify the value.
4541      OrderAccess::fence();
4542      if (_Event == v) return;
4543      continue;
4544    }
4545    if (Atomic::cmpxchg (v+1, &_Event, v) == v) break;
4546  }
4547  if (v < 0) {
4548    // Wait for the thread associated with the event to vacate
4549    int status = pthread_mutex_lock(_mutex);
4550    assert_status(status == 0, status, "mutex_lock");
4551    AnyWaiters = _nParked;
4552
4553    if (AnyWaiters != 0) {
4554      // We intentional signal *after* dropping the lock
4555      // to avoid a common class of futile wakeups.
4556      status = pthread_cond_signal(_cond);
4557      assert_status(status == 0, status, "cond_signal");
4558    }
4559    // Mutex should be locked for pthread_cond_signal(_cond).
4560    status = pthread_mutex_unlock(_mutex);
4561    assert_status(status == 0, status, "mutex_unlock");
4562  }
4563
4564  // Note that we signal() _after dropping the lock for "immortal" Events.
4565  // This is safe and avoids a common class of futile wakeups. In rare
4566  // circumstances this can cause a thread to return prematurely from
4567  // cond_{timed}wait() but the spurious wakeup is benign and the victim will
4568  // simply re-test the condition and re-park itself.
4569}
4570
4571
4572// JSR166
4573// -------------------------------------------------------
4574
4575//
4576// The solaris and linux implementations of park/unpark are fairly
4577// conservative for now, but can be improved. They currently use a
4578// mutex/condvar pair, plus a a count.
4579// Park decrements count if > 0, else does a condvar wait. Unpark
4580// sets count to 1 and signals condvar. Only one thread ever waits
4581// on the condvar. Contention seen when trying to park implies that someone
4582// is unparking you, so don't wait. And spurious returns are fine, so there
4583// is no need to track notifications.
4584//
4585
4586#define MAX_SECS 100000000
4587//
4588// This code is common to linux and solaris and will be moved to a
4589// common place in dolphin.
4590//
4591// The passed in time value is either a relative time in nanoseconds
4592// or an absolute time in milliseconds. Either way it has to be unpacked
4593// into suitable seconds and nanoseconds components and stored in the
4594// given timespec structure.
4595// Given time is a 64-bit value and the time_t used in the timespec is only
4596// a signed-32-bit value (except on 64-bit Linux) we have to watch for
4597// overflow if times way in the future are given. Further on Solaris versions
4598// prior to 10 there is a restriction (see cond_timedwait) that the specified
4599// number of seconds, in abstime, is less than current_time + 100,000,000.
4600// As it will be 28 years before "now + 100000000" will overflow we can
4601// ignore overflow and just impose a hard-limit on seconds using the value
4602// of "now + 100,000,000". This places a limit on the timeout of about 3.17
4603// years from "now".
4604//
4605
4606static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
4607  assert (time > 0, "convertTime");
4608
4609  struct timeval now;
4610  int status = gettimeofday(&now, NULL);
4611  assert(status == 0, "gettimeofday");
4612
4613  time_t max_secs = now.tv_sec + MAX_SECS;
4614
4615  if (isAbsolute) {
4616    jlong secs = time / 1000;
4617    if (secs > max_secs) {
4618      absTime->tv_sec = max_secs;
4619    }
4620    else {
4621      absTime->tv_sec = secs;
4622    }
4623    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
4624  }
4625  else {
4626    jlong secs = time / NANOSECS_PER_SEC;
4627    if (secs >= MAX_SECS) {
4628      absTime->tv_sec = max_secs;
4629      absTime->tv_nsec = 0;
4630    }
4631    else {
4632      absTime->tv_sec = now.tv_sec + secs;
4633      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
4634      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
4635        absTime->tv_nsec -= NANOSECS_PER_SEC;
4636        ++absTime->tv_sec; // note: this must be <= max_secs
4637      }
4638    }
4639  }
4640  assert(absTime->tv_sec >= 0, "tv_sec < 0");
4641  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
4642  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
4643  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
4644}
4645
4646void Parker::park(bool isAbsolute, jlong time) {
4647  // Optional fast-path check:
4648  // Return immediately if a permit is available.
4649  if (_counter > 0) {
4650    _counter = 0;
4651    OrderAccess::fence();
4652    return;
4653  }
4654
4655  Thread* thread = Thread::current();
4656  assert(thread->is_Java_thread(), "Must be JavaThread");
4657  JavaThread *jt = (JavaThread *)thread;
4658
4659  // Optional optimization -- avoid state transitions if there's an interrupt pending.
4660  // Check interrupt before trying to wait
4661  if (Thread::is_interrupted(thread, false)) {
4662    return;
4663  }
4664
4665  // Next, demultiplex/decode time arguments
4666  timespec absTime;
4667  if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
4668    return;
4669  }
4670  if (time > 0) {
4671    unpackTime(&absTime, isAbsolute, time);
4672  }
4673
4674  // Enter safepoint region
4675  // Beware of deadlocks such as 6317397.
4676  // The per-thread Parker:: mutex is a classic leaf-lock.
4677  // In particular a thread must never block on the Threads_lock while
4678  // holding the Parker:: mutex. If safepoints are pending both the
4679  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
4680  ThreadBlockInVM tbivm(jt);
4681
4682  // Don't wait if cannot get lock since interference arises from
4683  // unblocking. Also. check interrupt before trying wait
4684  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
4685    return;
4686  }
4687
4688  int status;
4689  if (_counter > 0) { // no wait needed
4690    _counter = 0;
4691    status = pthread_mutex_unlock(_mutex);
4692    assert (status == 0, "invariant");
4693    OrderAccess::fence();
4694    return;
4695  }
4696
4697#ifdef ASSERT
4698  // Don't catch signals while blocked; let the running threads have the signals.
4699  // (This allows a debugger to break into the running thread.)
4700  sigset_t oldsigs;
4701  sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals();
4702  pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
4703#endif
4704
4705  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4706  jt->set_suspend_equivalent();
4707  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
4708
4709  if (time == 0) {
4710    status = pthread_cond_wait (_cond, _mutex);
4711  } else {
4712    status = pthread_cond_timedwait (_cond, _mutex, &absTime);
4713  }
4714  assert_status(status == 0 || status == EINTR ||
4715                status == ETIME || status == ETIMEDOUT,
4716                status, "cond_timedwait");
4717
4718#ifdef ASSERT
4719  pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
4720#endif
4721
4722  _counter = 0;
4723  status = pthread_mutex_unlock(_mutex);
4724  assert_status(status == 0, status, "invariant");
4725  // If externally suspended while waiting, re-suspend
4726  if (jt->handle_special_suspend_equivalent_condition()) {
4727    jt->java_suspend_self();
4728  }
4729
4730  OrderAccess::fence();
4731}
4732
4733void Parker::unpark() {
4734  int s, status;
4735  status = pthread_mutex_lock(_mutex);
4736  assert (status == 0, "invariant");
4737  s = _counter;
4738  _counter = 1;
4739  if (s < 1) {
4740    status = pthread_mutex_unlock(_mutex);
4741    assert (status == 0, "invariant");
4742    status = pthread_cond_signal (_cond);
4743    assert (status == 0, "invariant");
4744  } else {
4745    pthread_mutex_unlock(_mutex);
4746    assert (status == 0, "invariant");
4747  }
4748}
4749
4750extern char** environ;
4751
4752// Run the specified command in a separate process. Return its exit value,
4753// or -1 on failure (e.g. can't fork a new process).
4754// Unlike system(), this function can be called from signal handler. It
4755// doesn't block SIGINT et al.
4756int os::fork_and_exec(char* cmd) {
4757  char * argv[4] = {"sh", "-c", cmd, NULL};
4758
4759  pid_t pid = fork();
4760
4761  if (pid < 0) {
4762    // fork failed
4763    return -1;
4764
4765  } else if (pid == 0) {
4766    // child process
4767
4768    // Try to be consistent with system(), which uses "/usr/bin/sh" on AIX.
4769    execve("/usr/bin/sh", argv, environ);
4770
4771    // execve failed
4772    _exit(-1);
4773
4774  } else {
4775    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
4776    // care about the actual exit code, for now.
4777
4778    int status;
4779
4780    // Wait for the child process to exit. This returns immediately if
4781    // the child has already exited. */
4782    while (waitpid(pid, &status, 0) < 0) {
4783      switch (errno) {
4784        case ECHILD: return 0;
4785        case EINTR: break;
4786        default: return -1;
4787      }
4788    }
4789
4790    if (WIFEXITED(status)) {
4791      // The child exited normally; get its exit code.
4792      return WEXITSTATUS(status);
4793    } else if (WIFSIGNALED(status)) {
4794      // The child exited because of a signal.
4795      // The best value to return is 0x80 + signal number,
4796      // because that is what all Unix shells do, and because
4797      // it allows callers to distinguish between process exit and
4798      // process death by signal.
4799      return 0x80 + WTERMSIG(status);
4800    } else {
4801      // Unknown exit code; pass it through.
4802      return status;
4803    }
4804  }
4805  return -1;
4806}
4807
4808// is_headless_jre()
4809//
4810// Test for the existence of xawt/libmawt.so or libawt_xawt.so
4811// in order to report if we are running in a headless jre.
4812//
4813// Since JDK8 xawt/libmawt.so is moved into the same directory
4814// as libawt.so, and renamed libawt_xawt.so
4815bool os::is_headless_jre() {
4816  struct stat statbuf;
4817  char buf[MAXPATHLEN];
4818  char libmawtpath[MAXPATHLEN];
4819  const char *xawtstr = "/xawt/libmawt.so";
4820  const char *new_xawtstr = "/libawt_xawt.so";
4821
4822  char *p;
4823
4824  // Get path to libjvm.so
4825  os::jvm_path(buf, sizeof(buf));
4826
4827  // Get rid of libjvm.so
4828  p = strrchr(buf, '/');
4829  if (p == NULL) return false;
4830  else *p = '\0';
4831
4832  // Get rid of client or server
4833  p = strrchr(buf, '/');
4834  if (p == NULL) return false;
4835  else *p = '\0';
4836
4837  // check xawt/libmawt.so
4838  strcpy(libmawtpath, buf);
4839  strcat(libmawtpath, xawtstr);
4840  if (::stat(libmawtpath, &statbuf) == 0) return false;
4841
4842  // check libawt_xawt.so
4843  strcpy(libmawtpath, buf);
4844  strcat(libmawtpath, new_xawtstr);
4845  if (::stat(libmawtpath, &statbuf) == 0) return false;
4846
4847  return true;
4848}
4849
4850// Get the default path to the core file
4851// Returns the length of the string
4852int os::get_core_path(char* buffer, size_t bufferSize) {
4853  const char* p = get_current_directory(buffer, bufferSize);
4854
4855  if (p == NULL) {
4856    assert(p != NULL, "failed to get current directory");
4857    return 0;
4858  }
4859
4860  jio_snprintf(buffer, bufferSize, "%s/core or core.%d",
4861                                               p, current_process_id());
4862
4863  return strlen(buffer);
4864}
4865
4866#ifndef PRODUCT
4867void TestReserveMemorySpecial_test() {
4868  // No tests available for this platform
4869}
4870#endif
4871
4872bool os::start_debugging(char *buf, int buflen) {
4873  int len = (int)strlen(buf);
4874  char *p = &buf[len];
4875
4876  jio_snprintf(p, buflen -len,
4877                 "\n\n"
4878                 "Do you want to debug the problem?\n\n"
4879                 "To debug, run 'dbx -a %d'; then switch to thread tid " INTX_FORMAT ", k-tid " INTX_FORMAT "\n"
4880                 "Enter 'yes' to launch dbx automatically (PATH must include dbx)\n"
4881                 "Otherwise, press RETURN to abort...",
4882                 os::current_process_id(),
4883                 os::current_thread_id(), thread_self());
4884
4885  bool yes = os::message_box("Unexpected Error", buf);
4886
4887  if (yes) {
4888    // yes, user asked VM to launch debugger
4889    jio_snprintf(buf, buflen, "dbx -a %d", os::current_process_id());
4890
4891    os::fork_and_exec(buf);
4892    yes = false;
4893  }
4894  return yes;
4895}
4896
4897static inline time_t get_mtime(const char* filename) {
4898  struct stat st;
4899  int ret = os::stat(filename, &st);
4900  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
4901  return st.st_mtime;
4902}
4903
4904int os::compare_file_modified_times(const char* file1, const char* file2) {
4905  time_t t1 = get_mtime(file1);
4906  time_t t2 = get_mtime(file2);
4907  return t1 - t2;
4908}
4909