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