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