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