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