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