1 /*
2 * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2012, 2020 SAP SE. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26 // According to the AIX OS doc #pragma alloca must be used
27 // with C++ compiler before referencing the function alloca()
28 #pragma alloca
29
30 // no precompiled headers
31 #include "jvm.h"
32 #include "classfile/classLoader.hpp"
33 #include "classfile/systemDictionary.hpp"
34 #include "classfile/vmSymbols.hpp"
35 #include "code/icBuffer.hpp"
36 #include "code/vtableStubs.hpp"
37 #include "compiler/compileBroker.hpp"
38 #include "interpreter/interpreter.hpp"
39 #include "logging/log.hpp"
40 #include "logging/logStream.hpp"
41 #include "libo4.hpp"
42 #include "libperfstat_aix.hpp"
43 #include "libodm_aix.hpp"
44 #include "loadlib_aix.hpp"
45 #include "memory/allocation.inline.hpp"
46 #include "memory/filemap.hpp"
47 #include "misc_aix.hpp"
48 #include "oops/oop.inline.hpp"
49 #include "os_aix.inline.hpp"
50 #include "os_share_aix.hpp"
51 #include "porting_aix.hpp"
52 #include "prims/jniFastGetField.hpp"
53 #include "prims/jvm_misc.hpp"
54 #include "runtime/arguments.hpp"
55 #include "runtime/atomic.hpp"
56 #include "runtime/extendedPC.hpp"
57 #include "runtime/globals.hpp"
58 #include "runtime/interfaceSupport.inline.hpp"
59 #include "runtime/java.hpp"
60 #include "runtime/javaCalls.hpp"
61 #include "runtime/mutexLocker.hpp"
62 #include "runtime/objectMonitor.hpp"
63 #include "runtime/os.hpp"
64 #include "runtime/osThread.hpp"
65 #include "runtime/perfMemory.hpp"
66 #include "runtime/sharedRuntime.hpp"
67 #include "runtime/statSampler.hpp"
68 #include "runtime/stubRoutines.hpp"
69 #include "runtime/thread.inline.hpp"
70 #include "runtime/threadCritical.hpp"
71 #include "runtime/timer.hpp"
72 #include "runtime/vm_version.hpp"
73 #include "services/attachListener.hpp"
74 #include "services/runtimeService.hpp"
75 #include "utilities/align.hpp"
76 #include "utilities/decoder.hpp"
77 #include "utilities/defaultStream.hpp"
78 #include "utilities/events.hpp"
79 #include "utilities/growableArray.hpp"
80 #include "utilities/vmError.hpp"
81
82 // put OS-includes here (sorted alphabetically)
83 #include <errno.h>
84 #include <fcntl.h>
85 #include <inttypes.h>
86 #include <poll.h>
87 #include <procinfo.h>
88 #include <pthread.h>
89 #include <pwd.h>
90 #include <semaphore.h>
91 #include <signal.h>
92 #include <stdint.h>
93 #include <stdio.h>
94 #include <string.h>
95 #include <unistd.h>
96 #include <sys/ioctl.h>
97 #include <sys/ipc.h>
98 #include <sys/mman.h>
99 #include <sys/resource.h>
100 #include <sys/select.h>
101 #include <sys/shm.h>
102 #include <sys/socket.h>
103 #include <sys/stat.h>
104 #include <sys/sysinfo.h>
105 #include <sys/systemcfg.h>
106 #include <sys/time.h>
107 #include <sys/times.h>
108 #include <sys/types.h>
109 #include <sys/utsname.h>
110 #include <sys/vminfo.h>
111 #include <sys/wait.h>
112
113 // Missing prototypes for various system APIs.
114 extern "C"
115 int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t);
116
117 #if !defined(_AIXVERSION_610)
118 extern "C" int getthrds64(pid_t, struct thrdentry64*, int, tid64_t*, int);
119 extern "C" int getprocs64(procentry64*, int, fdsinfo*, int, pid_t*, int);
120 extern "C" int getargs(procsinfo*, int, char*, int);
121 #endif
122
123 #define MAX_PATH (2 * K)
124
125 // for timer info max values which include all bits
126 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
127 // for multipage initialization error analysis (in 'g_multipage_error')
128 #define ERROR_MP_OS_TOO_OLD 100
129 #define ERROR_MP_EXTSHM_ACTIVE 101
130 #define ERROR_MP_VMGETINFO_FAILED 102
131 #define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103
132
133 // excerpts from systemcfg.h that might be missing on older os levels
134 #ifndef PV_7
135 #define PV_7 0x200000 /* Power PC 7 */
136 #endif
137 #ifndef PV_7_Compat
138 #define PV_7_Compat 0x208000 /* Power PC 7 */
139 #endif
140 #ifndef PV_8
141 #define PV_8 0x300000 /* Power PC 8 */
142 #endif
143 #ifndef PV_8_Compat
144 #define PV_8_Compat 0x308000 /* Power PC 8 */
145 #endif
146 #ifndef PV_9
147 #define PV_9 0x400000 /* Power PC 9 */
148 #endif
149 #ifndef PV_9_Compat
150 #define PV_9_Compat 0x408000 /* Power PC 9 */
151 #endif
152
153
154 static address resolve_function_descriptor_to_code_pointer(address p);
155
156 static void vmembk_print_on(outputStream* os);
157
158 ////////////////////////////////////////////////////////////////////////////////
159 // global variables (for a description see os_aix.hpp)
160
161 julong os::Aix::_physical_memory = 0;
162
163 pthread_t os::Aix::_main_thread = ((pthread_t)0);
164 int os::Aix::_page_size = -1;
165
166 // -1 = uninitialized, 0 if AIX, 1 if OS/400 pase
167 int os::Aix::_on_pase = -1;
168
169 // 0 = uninitialized, otherwise 32 bit number:
170 // 0xVVRRTTSS
171 // VV - major version
172 // RR - minor version
173 // TT - tech level, if known, 0 otherwise
174 // SS - service pack, if known, 0 otherwise
175 uint32_t os::Aix::_os_version = 0;
176
177 // -1 = uninitialized, 0 - no, 1 - yes
178 int os::Aix::_xpg_sus_mode = -1;
179
180 // -1 = uninitialized, 0 - no, 1 - yes
181 int os::Aix::_extshm = -1;
182
183 ////////////////////////////////////////////////////////////////////////////////
184 // local variables
185
186 static volatile jlong max_real_time = 0;
187 static jlong initial_time_count = 0;
188 static int clock_tics_per_sec = 100;
189 static sigset_t check_signal_done; // For diagnostics to print a message once (see run_periodic_checks)
190 static bool check_signals = true;
191 static int SR_signum = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769)
192 static sigset_t SR_sigset;
193
194 // Process break recorded at startup.
195 static address g_brk_at_startup = NULL;
196
197 // This describes the state of multipage support of the underlying
198 // OS. Note that this is of no interest to the outsize world and
199 // therefore should not be defined in AIX class.
200 //
201 // AIX supports four different page sizes - 4K, 64K, 16MB, 16GB. The
202 // latter two (16M "large" resp. 16G "huge" pages) require special
203 // setup and are normally not available.
204 //
205 // AIX supports multiple page sizes per process, for:
206 // - Stack (of the primordial thread, so not relevant for us)
207 // - Data - data, bss, heap, for us also pthread stacks
208 // - Text - text code
209 // - shared memory
210 //
211 // Default page sizes can be set via linker options (-bdatapsize, -bstacksize, ...)
212 // and via environment variable LDR_CNTRL (DATAPSIZE, STACKPSIZE, ...).
213 //
214 // For shared memory, page size can be set dynamically via
215 // shmctl(). Different shared memory regions can have different page
216 // sizes.
217 //
218 // More information can be found at AIBM info center:
219 // http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm
220 //
221 static struct {
222 size_t pagesize; // sysconf _SC_PAGESIZE (4K)
223 size_t datapsize; // default data page size (LDR_CNTRL DATAPSIZE)
224 size_t shmpsize; // default shared memory page size (LDR_CNTRL SHMPSIZE)
225 size_t pthr_stack_pagesize; // stack page size of pthread threads
226 size_t textpsize; // default text page size (LDR_CNTRL STACKPSIZE)
227 bool can_use_64K_pages; // True if we can alloc 64K pages dynamically with Sys V shm.
228 bool can_use_16M_pages; // True if we can alloc 16M pages dynamically with Sys V shm.
229 int error; // Error describing if something went wrong at multipage init.
230 } g_multipage_support = {
231 (size_t) -1,
232 (size_t) -1,
233 (size_t) -1,
234 (size_t) -1,
235 (size_t) -1,
236 false, false,
237 0
238 };
239
240 // We must not accidentally allocate memory close to the BRK - even if
241 // that would work - because then we prevent the BRK segment from
242 // growing which may result in a malloc OOM even though there is
243 // enough memory. The problem only arises if we shmat() or mmap() at
244 // a specific wish address, e.g. to place the heap in a
245 // compressed-oops-friendly way.
is_close_to_brk(address a)246 static bool is_close_to_brk(address a) {
247 assert0(g_brk_at_startup != NULL);
248 if (a >= g_brk_at_startup &&
249 a < (g_brk_at_startup + MaxExpectedDataSegmentSize)) {
250 return true;
251 }
252 return false;
253 }
254
available_memory()255 julong os::available_memory() {
256 return Aix::available_memory();
257 }
258
available_memory()259 julong os::Aix::available_memory() {
260 // Avoid expensive API call here, as returned value will always be null.
261 if (os::Aix::on_pase()) {
262 return 0x0LL;
263 }
264 os::Aix::meminfo_t mi;
265 if (os::Aix::get_meminfo(&mi)) {
266 return mi.real_free;
267 } else {
268 return ULONG_MAX;
269 }
270 }
271
physical_memory()272 julong os::physical_memory() {
273 return Aix::physical_memory();
274 }
275
276 // Return true if user is running as root.
277
have_special_privileges()278 bool os::have_special_privileges() {
279 static bool init = false;
280 static bool privileges = false;
281 if (!init) {
282 privileges = (getuid() != geteuid()) || (getgid() != getegid());
283 init = true;
284 }
285 return privileges;
286 }
287
288 // Helper function, emulates disclaim64 using multiple 32bit disclaims
289 // because we cannot use disclaim64() on AS/400 and old AIX releases.
my_disclaim64(char * addr,size_t size)290 static bool my_disclaim64(char* addr, size_t size) {
291
292 if (size == 0) {
293 return true;
294 }
295
296 // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.)
297 const unsigned int maxDisclaimSize = 0x40000000;
298
299 const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize);
300 const unsigned int lastDisclaimSize = (size % maxDisclaimSize);
301
302 char* p = addr;
303
304 for (int i = 0; i < numFullDisclaimsNeeded; i ++) {
305 if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
306 trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
307 return false;
308 }
309 p += maxDisclaimSize;
310 }
311
312 if (lastDisclaimSize > 0) {
313 if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
314 trcVerbose("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
315 return false;
316 }
317 }
318
319 return true;
320 }
321
322 // Cpu architecture string
323 #if defined(PPC32)
324 static char cpu_arch[] = "ppc";
325 #elif defined(PPC64)
326 static char cpu_arch[] = "ppc64";
327 #else
328 #error Add appropriate cpu_arch setting
329 #endif
330
331 // Wrap the function "vmgetinfo" which is not available on older OS releases.
checked_vmgetinfo(void * out,int command,int arg)332 static int checked_vmgetinfo(void *out, int command, int arg) {
333 if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) {
334 guarantee(false, "cannot call vmgetinfo on AS/400 older than V6R1");
335 }
336 return ::vmgetinfo(out, command, arg);
337 }
338
339 // Given an address, returns the size of the page backing that address.
query_pagesize(void * addr)340 size_t os::Aix::query_pagesize(void* addr) {
341
342 if (os::Aix::on_pase() && os::Aix::os_version_short() < 0x0601) {
343 // AS/400 older than V6R1: no vmgetinfo here, default to 4K
344 return 4*K;
345 }
346
347 vm_page_info pi;
348 pi.addr = (uint64_t)addr;
349 if (checked_vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) {
350 return pi.pagesize;
351 } else {
352 assert(false, "vmgetinfo failed to retrieve page size");
353 return 4*K;
354 }
355 }
356
initialize_system_info()357 void os::Aix::initialize_system_info() {
358
359 // Get the number of online(logical) cpus instead of configured.
360 os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN);
361 assert(_processor_count > 0, "_processor_count must be > 0");
362
363 // Retrieve total physical storage.
364 os::Aix::meminfo_t mi;
365 if (!os::Aix::get_meminfo(&mi)) {
366 assert(false, "os::Aix::get_meminfo failed.");
367 }
368 _physical_memory = (julong) mi.real_total;
369 }
370
371 // Helper function for tracing page sizes.
describe_pagesize(size_t pagesize)372 static const char* describe_pagesize(size_t pagesize) {
373 switch (pagesize) {
374 case 4*K : return "4K";
375 case 64*K: return "64K";
376 case 16*M: return "16M";
377 case 16*G: return "16G";
378 default:
379 assert(false, "surprise");
380 return "??";
381 }
382 }
383
384 // Probe OS for multipage support.
385 // Will fill the global g_multipage_support structure.
386 // Must be called before calling os::large_page_init().
query_multipage_support()387 static void query_multipage_support() {
388
389 guarantee(g_multipage_support.pagesize == -1,
390 "do not call twice");
391
392 g_multipage_support.pagesize = ::sysconf(_SC_PAGESIZE);
393
394 // This really would surprise me.
395 assert(g_multipage_support.pagesize == 4*K, "surprise!");
396
397 // Query default data page size (default page size for C-Heap, pthread stacks and .bss).
398 // Default data page size is defined either by linker options (-bdatapsize)
399 // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given,
400 // default should be 4K.
401 {
402 void* p = ::malloc(16*M);
403 g_multipage_support.datapsize = os::Aix::query_pagesize(p);
404 ::free(p);
405 }
406
407 // Query default shm page size (LDR_CNTRL SHMPSIZE).
408 // Note that this is pure curiosity. We do not rely on default page size but set
409 // our own page size after allocated.
410 {
411 const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
412 guarantee(shmid != -1, "shmget failed");
413 void* p = ::shmat(shmid, NULL, 0);
414 ::shmctl(shmid, IPC_RMID, NULL);
415 guarantee(p != (void*) -1, "shmat failed");
416 g_multipage_support.shmpsize = os::Aix::query_pagesize(p);
417 ::shmdt(p);
418 }
419
420 // Before querying the stack page size, make sure we are not running as primordial
421 // thread (because primordial thread's stack may have different page size than
422 // pthread thread stacks). Running a VM on the primordial thread won't work for a
423 // number of reasons so we may just as well guarantee it here.
424 guarantee0(!os::is_primordial_thread());
425
426 // Query pthread stack page size. Should be the same as data page size because
427 // pthread stacks are allocated from C-Heap.
428 {
429 int dummy = 0;
430 g_multipage_support.pthr_stack_pagesize = os::Aix::query_pagesize(&dummy);
431 }
432
433 // Query default text page size (LDR_CNTRL TEXTPSIZE).
434 {
435 address any_function =
436 resolve_function_descriptor_to_code_pointer((address)describe_pagesize);
437 g_multipage_support.textpsize = os::Aix::query_pagesize(any_function);
438 }
439
440 // Now probe for support of 64K pages and 16M pages.
441
442 // Before OS/400 V6R1, there is no support for pages other than 4K.
443 if (os::Aix::on_pase_V5R4_or_older()) {
444 trcVerbose("OS/400 < V6R1 - no large page support.");
445 g_multipage_support.error = ERROR_MP_OS_TOO_OLD;
446 goto query_multipage_support_end;
447 }
448
449 // Now check which page sizes the OS claims it supports, and of those, which actually can be used.
450 {
451 const int MAX_PAGE_SIZES = 4;
452 psize_t sizes[MAX_PAGE_SIZES];
453 const int num_psizes = checked_vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES);
454 if (num_psizes == -1) {
455 trcVerbose("vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)", errno);
456 trcVerbose("disabling multipage support.");
457 g_multipage_support.error = ERROR_MP_VMGETINFO_FAILED;
458 goto query_multipage_support_end;
459 }
460 guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed.");
461 assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?");
462 trcVerbose("vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes);
463 for (int i = 0; i < num_psizes; i ++) {
464 trcVerbose(" %s ", describe_pagesize(sizes[i]));
465 }
466
467 // Can we use 64K, 16M pages?
468 for (int i = 0; i < num_psizes; i ++) {
469 const size_t pagesize = sizes[i];
470 if (pagesize != 64*K && pagesize != 16*M) {
471 continue;
472 }
473 bool can_use = false;
474 trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize));
475 const int shmid = ::shmget(IPC_PRIVATE, pagesize,
476 IPC_CREAT | S_IRUSR | S_IWUSR);
477 guarantee0(shmid != -1); // Should always work.
478 // Try to set pagesize.
479 struct shmid_ds shm_buf = { 0 };
480 shm_buf.shm_pagesize = pagesize;
481 if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) {
482 const int en = errno;
483 ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
484 trcVerbose("shmctl(SHM_PAGESIZE) failed with errno=%d", errno);
485 } else {
486 // Attach and double check pageisze.
487 void* p = ::shmat(shmid, NULL, 0);
488 ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
489 guarantee0(p != (void*) -1); // Should always work.
490 const size_t real_pagesize = os::Aix::query_pagesize(p);
491 if (real_pagesize != pagesize) {
492 trcVerbose("real page size (" SIZE_FORMAT_HEX ") differs.", real_pagesize);
493 } else {
494 can_use = true;
495 }
496 ::shmdt(p);
497 }
498 trcVerbose("Can use: %s", (can_use ? "yes" : "no"));
499 if (pagesize == 64*K) {
500 g_multipage_support.can_use_64K_pages = can_use;
501 } else if (pagesize == 16*M) {
502 g_multipage_support.can_use_16M_pages = can_use;
503 }
504 }
505
506 } // end: check which pages can be used for shared memory
507
508 query_multipage_support_end:
509
510 trcVerbose("base page size (sysconf _SC_PAGESIZE): %s",
511 describe_pagesize(g_multipage_support.pagesize));
512 trcVerbose("Data page size (C-Heap, bss, etc): %s",
513 describe_pagesize(g_multipage_support.datapsize));
514 trcVerbose("Text page size: %s",
515 describe_pagesize(g_multipage_support.textpsize));
516 trcVerbose("Thread stack page size (pthread): %s",
517 describe_pagesize(g_multipage_support.pthr_stack_pagesize));
518 trcVerbose("Default shared memory page size: %s",
519 describe_pagesize(g_multipage_support.shmpsize));
520 trcVerbose("Can use 64K pages dynamically with shared memory: %s",
521 (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
522 trcVerbose("Can use 16M pages dynamically with shared memory: %s",
523 (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
524 trcVerbose("Multipage error details: %d",
525 g_multipage_support.error);
526
527 // sanity checks
528 assert0(g_multipage_support.pagesize == 4*K);
529 assert0(g_multipage_support.datapsize == 4*K || g_multipage_support.datapsize == 64*K);
530 assert0(g_multipage_support.textpsize == 4*K || g_multipage_support.textpsize == 64*K);
531 assert0(g_multipage_support.pthr_stack_pagesize == g_multipage_support.datapsize);
532 assert0(g_multipage_support.shmpsize == 4*K || g_multipage_support.shmpsize == 64*K);
533
534 }
535
init_system_properties_values()536 void os::init_system_properties_values() {
537
538 #ifndef OVERRIDE_LIBPATH
539 #define DEFAULT_LIBPATH "/lib:/usr/lib"
540 #else
541 #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
542 #endif
543 #define EXTENSIONS_DIR "/lib/ext"
544
545 // Buffer that fits several sprintfs.
546 // Note that the space for the trailing null is provided
547 // by the nulls included by the sizeof operator.
548 const size_t bufsize =
549 MAX2((size_t)MAXPATHLEN, // For dll_dir & friends.
550 (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR)); // extensions dir
551 char *buf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
552
553 // sysclasspath, java_home, dll_dir
554 {
555 char *pslash;
556 os::jvm_path(buf, bufsize);
557
558 // Found the full path to libjvm.so.
559 // Now cut the path to <java_home>/jre if we can.
560 pslash = strrchr(buf, '/');
561 if (pslash != NULL) {
562 *pslash = '\0'; // Get rid of /libjvm.so.
563 }
564 pslash = strrchr(buf, '/');
565 if (pslash != NULL) {
566 *pslash = '\0'; // Get rid of /{client|server|hotspot}.
567 }
568 Arguments::set_dll_dir(buf);
569
570 if (pslash != NULL) {
571 pslash = strrchr(buf, '/');
572 if (pslash != NULL) {
573 *pslash = '\0'; // Get rid of /lib.
574 }
575 }
576 Arguments::set_java_home(buf);
577 if (!set_boot_path('/', ':')) {
578 vm_exit_during_initialization("Failed setting boot class path.", NULL);
579 }
580 }
581
582 // Where to look for native libraries.
583
584 // On Aix we get the user setting of LIBPATH.
585 // Eventually, all the library path setting will be done here.
586 // Get the user setting of LIBPATH.
587 const char *v = ::getenv("LIBPATH");
588 const char *v_colon = ":";
589 if (v == NULL) { v = ""; v_colon = ""; }
590
591 // Concatenate user and invariant part of ld_library_path.
592 // That's +1 for the colon and +1 for the trailing '\0'.
593 char *ld_library_path = NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
594 sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
595 Arguments::set_library_path(ld_library_path);
596 FREE_C_HEAP_ARRAY(char, ld_library_path);
597
598 // Extensions directories.
599 sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
600 Arguments::set_ext_dirs(buf);
601
602 FREE_C_HEAP_ARRAY(char, buf);
603
604 #undef DEFAULT_LIBPATH
605 #undef EXTENSIONS_DIR
606 }
607
608 ////////////////////////////////////////////////////////////////////////////////
609 // breakpoint support
610
breakpoint()611 void os::breakpoint() {
612 BREAKPOINT;
613 }
614
breakpoint()615 extern "C" void breakpoint() {
616 // use debugger to set breakpoint here
617 }
618
619 ////////////////////////////////////////////////////////////////////////////////
620 // signal support
621
622 debug_only(static bool signal_sets_initialized = false);
623 static sigset_t unblocked_sigs, vm_sigs;
624
signal_sets_init()625 void os::Aix::signal_sets_init() {
626 // Should also have an assertion stating we are still single-threaded.
627 assert(!signal_sets_initialized, "Already initialized");
628 // Fill in signals that are necessarily unblocked for all threads in
629 // the VM. Currently, we unblock the following signals:
630 // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
631 // by -Xrs (=ReduceSignalUsage));
632 // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
633 // other threads. The "ReduceSignalUsage" boolean tells us not to alter
634 // the dispositions or masks wrt these signals.
635 // Programs embedding the VM that want to use the above signals for their
636 // own purposes must, at this time, use the "-Xrs" option to prevent
637 // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
638 // (See bug 4345157, and other related bugs).
639 // In reality, though, unblocking these signals is really a nop, since
640 // these signals are not blocked by default.
641 sigemptyset(&unblocked_sigs);
642 sigaddset(&unblocked_sigs, SIGILL);
643 sigaddset(&unblocked_sigs, SIGSEGV);
644 sigaddset(&unblocked_sigs, SIGBUS);
645 sigaddset(&unblocked_sigs, SIGFPE);
646 sigaddset(&unblocked_sigs, SIGTRAP);
647 sigaddset(&unblocked_sigs, SR_signum);
648
649 if (!ReduceSignalUsage) {
650 if (!os::Posix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
651 sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
652 }
653 if (!os::Posix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
654 sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
655 }
656 if (!os::Posix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
657 sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
658 }
659 }
660 // Fill in signals that are blocked by all but the VM thread.
661 sigemptyset(&vm_sigs);
662 if (!ReduceSignalUsage)
663 sigaddset(&vm_sigs, BREAK_SIGNAL);
664 debug_only(signal_sets_initialized = true);
665 }
666
667 // These are signals that are unblocked while a thread is running Java.
668 // (For some reason, they get blocked by default.)
unblocked_signals()669 sigset_t* os::Aix::unblocked_signals() {
670 assert(signal_sets_initialized, "Not initialized");
671 return &unblocked_sigs;
672 }
673
674 // These are the signals that are blocked while a (non-VM) thread is
675 // running Java. Only the VM thread handles these signals.
vm_signals()676 sigset_t* os::Aix::vm_signals() {
677 assert(signal_sets_initialized, "Not initialized");
678 return &vm_sigs;
679 }
680
hotspot_sigmask(Thread * thread)681 void os::Aix::hotspot_sigmask(Thread* thread) {
682
683 //Save caller's signal mask before setting VM signal mask
684 sigset_t caller_sigmask;
685 pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
686
687 OSThread* osthread = thread->osthread();
688 osthread->set_caller_sigmask(caller_sigmask);
689
690 pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL);
691
692 if (!ReduceSignalUsage) {
693 if (thread->is_VM_thread()) {
694 // Only the VM thread handles BREAK_SIGNAL ...
695 pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
696 } else {
697 // ... all other threads block BREAK_SIGNAL
698 pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
699 }
700 }
701 }
702
703 // retrieve memory information.
704 // Returns false if something went wrong;
705 // content of pmi undefined in this case.
get_meminfo(meminfo_t * pmi)706 bool os::Aix::get_meminfo(meminfo_t* pmi) {
707
708 assert(pmi, "get_meminfo: invalid parameter");
709
710 memset(pmi, 0, sizeof(meminfo_t));
711
712 if (os::Aix::on_pase()) {
713 // On PASE, use the libo4 porting library.
714
715 unsigned long long virt_total = 0;
716 unsigned long long real_total = 0;
717 unsigned long long real_free = 0;
718 unsigned long long pgsp_total = 0;
719 unsigned long long pgsp_free = 0;
720 if (libo4::get_memory_info(&virt_total, &real_total, &real_free, &pgsp_total, &pgsp_free)) {
721 pmi->virt_total = virt_total;
722 pmi->real_total = real_total;
723 pmi->real_free = real_free;
724 pmi->pgsp_total = pgsp_total;
725 pmi->pgsp_free = pgsp_free;
726 return true;
727 }
728 return false;
729
730 } else {
731
732 // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics
733 // See:
734 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
735 // ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm
736 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
737 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
738
739 perfstat_memory_total_t psmt;
740 memset (&psmt, '\0', sizeof(psmt));
741 const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1);
742 if (rc == -1) {
743 trcVerbose("perfstat_memory_total() failed (errno=%d)", errno);
744 assert(0, "perfstat_memory_total() failed");
745 return false;
746 }
747
748 assert(rc == 1, "perfstat_memory_total() - weird return code");
749
750 // excerpt from
751 // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
752 // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
753 // The fields of perfstat_memory_total_t:
754 // u_longlong_t virt_total Total virtual memory (in 4 KB pages).
755 // u_longlong_t real_total Total real memory (in 4 KB pages).
756 // u_longlong_t real_free Free real memory (in 4 KB pages).
757 // u_longlong_t pgsp_total Total paging space (in 4 KB pages).
758 // u_longlong_t pgsp_free Free paging space (in 4 KB pages).
759
760 pmi->virt_total = psmt.virt_total * 4096;
761 pmi->real_total = psmt.real_total * 4096;
762 pmi->real_free = psmt.real_free * 4096;
763 pmi->pgsp_total = psmt.pgsp_total * 4096;
764 pmi->pgsp_free = psmt.pgsp_free * 4096;
765
766 return true;
767
768 }
769 } // end os::Aix::get_meminfo
770
771 //////////////////////////////////////////////////////////////////////////////
772 // create new thread
773
774 // Thread start routine for all newly created threads
thread_native_entry(Thread * thread)775 static void *thread_native_entry(Thread *thread) {
776
777 thread->record_stack_base_and_size();
778
779 const pthread_t pthread_id = ::pthread_self();
780 const tid_t kernel_thread_id = ::thread_self();
781
782 LogTarget(Info, os, thread) lt;
783 if (lt.is_enabled()) {
784 address low_address = thread->stack_end();
785 address high_address = thread->stack_base();
786 lt.print("Thread is alive (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT
787 ", stack [" PTR_FORMAT " - " PTR_FORMAT " (" SIZE_FORMAT "k using %uk pages)).",
788 os::current_thread_id(), (uintx) kernel_thread_id, low_address, high_address,
789 (high_address - low_address) / K, os::Aix::query_pagesize(low_address) / K);
790 }
791
792 // Normally, pthread stacks on AIX live in the data segment (are allocated with malloc()
793 // by the pthread library). In rare cases, this may not be the case, e.g. when third-party
794 // tools hook pthread_create(). In this case, we may run into problems establishing
795 // guard pages on those stacks, because the stacks may reside in memory which is not
796 // protectable (shmated).
797 if (thread->stack_base() > ::sbrk(0)) {
798 log_warning(os, thread)("Thread stack not in data segment.");
799 }
800
801 // Try to randomize the cache line index of hot stack frames.
802 // This helps when threads of the same stack traces evict each other's
803 // cache lines. The threads can be either from the same JVM instance, or
804 // from different JVM instances. The benefit is especially true for
805 // processors with hyperthreading technology.
806
807 static int counter = 0;
808 int pid = os::current_process_id();
809 alloca(((pid ^ counter++) & 7) * 128);
810
811 thread->initialize_thread_current();
812
813 OSThread* osthread = thread->osthread();
814
815 // Thread_id is pthread id.
816 osthread->set_thread_id(pthread_id);
817
818 // .. but keep kernel thread id too for diagnostics
819 osthread->set_kernel_thread_id(kernel_thread_id);
820
821 // Initialize signal mask for this thread.
822 os::Aix::hotspot_sigmask(thread);
823
824 // Initialize floating point control register.
825 os::Aix::init_thread_fpu_state();
826
827 assert(osthread->get_state() == RUNNABLE, "invalid os thread state");
828
829 // Call one more level start routine.
830 thread->call_run();
831
832 // Note: at this point the thread object may already have deleted itself.
833 // Prevent dereferencing it from here on out.
834 thread = NULL;
835
836 log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
837 os::current_thread_id(), (uintx) kernel_thread_id);
838
839 return 0;
840 }
841
create_thread(Thread * thread,ThreadType thr_type,size_t req_stack_size)842 bool os::create_thread(Thread* thread, ThreadType thr_type,
843 size_t req_stack_size) {
844
845 assert(thread->osthread() == NULL, "caller responsible");
846
847 // Allocate the OSThread object.
848 OSThread* osthread = new OSThread(NULL, NULL);
849 if (osthread == NULL) {
850 return false;
851 }
852
853 // Set the correct thread state.
854 osthread->set_thread_type(thr_type);
855
856 // Initial state is ALLOCATED but not INITIALIZED
857 osthread->set_state(ALLOCATED);
858
859 thread->set_osthread(osthread);
860
861 // Init thread attributes.
862 pthread_attr_t attr;
863 pthread_attr_init(&attr);
864 guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
865
866 // Make sure we run in 1:1 kernel-user-thread mode.
867 if (os::Aix::on_aix()) {
868 guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
869 guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
870 }
871
872 // Start in suspended state, and in os::thread_start, wake the thread up.
873 guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
874
875 // Calculate stack size if it's not specified by caller.
876 size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
877
878 // JDK-8187028: It was observed that on some configurations (4K backed thread stacks)
879 // the real thread stack size may be smaller than the requested stack size, by as much as 64K.
880 // This very much looks like a pthread lib error. As a workaround, increase the stack size
881 // by 64K for small thread stacks (arbitrarily choosen to be < 4MB)
882 if (stack_size < 4096 * K) {
883 stack_size += 64 * K;
884 }
885
886 // On Aix, pthread_attr_setstacksize fails with huge values and leaves the
887 // thread size in attr unchanged. If this is the minimal stack size as set
888 // by pthread_attr_init this leads to crashes after thread creation. E.g. the
889 // guard pages might not fit on the tiny stack created.
890 int ret = pthread_attr_setstacksize(&attr, stack_size);
891 if (ret != 0) {
892 log_warning(os, thread)("The %sthread stack size specified is invalid: " SIZE_FORMAT "k",
893 (thr_type == compiler_thread) ? "compiler " : ((thr_type == java_thread) ? "" : "VM "),
894 stack_size / K);
895 thread->set_osthread(NULL);
896 delete osthread;
897 return false;
898 }
899
900 // Save some cycles and a page by disabling OS guard pages where we have our own
901 // VM guard pages (in java threads). For other threads, keep system default guard
902 // pages in place.
903 if (thr_type == java_thread || thr_type == compiler_thread) {
904 ret = pthread_attr_setguardsize(&attr, 0);
905 }
906
907 pthread_t tid = 0;
908 if (ret == 0) {
909 ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
910 }
911
912 if (ret == 0) {
913 char buf[64];
914 log_info(os, thread)("Thread started (pthread id: " UINTX_FORMAT ", attributes: %s). ",
915 (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
916 } else {
917 char buf[64];
918 log_warning(os, thread)("Failed to start thread - pthread_create failed (%d=%s) for attributes: %s.",
919 ret, os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr));
920 // Log some OS information which might explain why creating the thread failed.
921 log_info(os, thread)("Number of threads approx. running in the VM: %d", Threads::number_of_threads());
922 LogStream st(Log(os, thread)::info());
923 os::Posix::print_rlimit_info(&st);
924 os::print_memory_info(&st);
925 }
926
927 pthread_attr_destroy(&attr);
928
929 if (ret != 0) {
930 // Need to clean up stuff we've allocated so far.
931 thread->set_osthread(NULL);
932 delete osthread;
933 return false;
934 }
935
936 // OSThread::thread_id is the pthread id.
937 osthread->set_thread_id(tid);
938
939 return true;
940 }
941
942 /////////////////////////////////////////////////////////////////////////////
943 // attach existing thread
944
945 // bootstrap the main thread
create_main_thread(JavaThread * thread)946 bool os::create_main_thread(JavaThread* thread) {
947 assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread");
948 return create_attached_thread(thread);
949 }
950
create_attached_thread(JavaThread * thread)951 bool os::create_attached_thread(JavaThread* thread) {
952 #ifdef ASSERT
953 thread->verify_not_published();
954 #endif
955
956 // Allocate the OSThread object
957 OSThread* osthread = new OSThread(NULL, NULL);
958
959 if (osthread == NULL) {
960 return false;
961 }
962
963 const pthread_t pthread_id = ::pthread_self();
964 const tid_t kernel_thread_id = ::thread_self();
965
966 // OSThread::thread_id is the pthread id.
967 osthread->set_thread_id(pthread_id);
968
969 // .. but keep kernel thread id too for diagnostics
970 osthread->set_kernel_thread_id(kernel_thread_id);
971
972 // initialize floating point control register
973 os::Aix::init_thread_fpu_state();
974
975 // Initial thread state is RUNNABLE
976 osthread->set_state(RUNNABLE);
977
978 thread->set_osthread(osthread);
979
980 if (UseNUMA) {
981 int lgrp_id = os::numa_get_group_id();
982 if (lgrp_id != -1) {
983 thread->set_lgrp_id(lgrp_id);
984 }
985 }
986
987 // initialize signal mask for this thread
988 // and save the caller's signal mask
989 os::Aix::hotspot_sigmask(thread);
990
991 log_info(os, thread)("Thread attached (tid: " UINTX_FORMAT ", kernel thread id: " UINTX_FORMAT ").",
992 os::current_thread_id(), (uintx) kernel_thread_id);
993
994 return true;
995 }
996
pd_start_thread(Thread * thread)997 void os::pd_start_thread(Thread* thread) {
998 int status = pthread_continue_np(thread->osthread()->pthread_id());
999 assert(status == 0, "thr_continue failed");
1000 }
1001
1002 // Free OS resources related to the OSThread
free_thread(OSThread * osthread)1003 void os::free_thread(OSThread* osthread) {
1004 assert(osthread != NULL, "osthread not set");
1005
1006 // We are told to free resources of the argument thread,
1007 // but we can only really operate on the current thread.
1008 assert(Thread::current()->osthread() == osthread,
1009 "os::free_thread but not current thread");
1010
1011 // Restore caller's signal mask
1012 sigset_t sigmask = osthread->caller_sigmask();
1013 pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
1014
1015 delete osthread;
1016 }
1017
1018 ////////////////////////////////////////////////////////////////////////////////
1019 // time support
1020
1021 // Time since start-up in seconds to a fine granularity.
1022 // Used by VMSelfDestructTimer and the MemProfiler.
elapsedTime()1023 double os::elapsedTime() {
1024 return ((double)os::elapsed_counter()) / os::elapsed_frequency(); // nanosecond resolution
1025 }
1026
elapsed_counter()1027 jlong os::elapsed_counter() {
1028 return javaTimeNanos() - initial_time_count;
1029 }
1030
elapsed_frequency()1031 jlong os::elapsed_frequency() {
1032 return NANOSECS_PER_SEC; // nanosecond resolution
1033 }
1034
supports_vtime()1035 bool os::supports_vtime() { return true; }
1036
elapsedVTime()1037 double os::elapsedVTime() {
1038 struct rusage usage;
1039 int retval = getrusage(RUSAGE_THREAD, &usage);
1040 if (retval == 0) {
1041 return usage.ru_utime.tv_sec + usage.ru_stime.tv_sec + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / (1000.0 * 1000);
1042 } else {
1043 // better than nothing, but not much
1044 return elapsedTime();
1045 }
1046 }
1047
javaTimeMillis()1048 jlong os::javaTimeMillis() {
1049 timeval time;
1050 int status = gettimeofday(&time, NULL);
1051 assert(status != -1, "aix error at gettimeofday()");
1052 return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
1053 }
1054
javaTimeSystemUTC(jlong & seconds,jlong & nanos)1055 void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
1056 timeval time;
1057 int status = gettimeofday(&time, NULL);
1058 assert(status != -1, "aix error at gettimeofday()");
1059 seconds = jlong(time.tv_sec);
1060 nanos = jlong(time.tv_usec) * 1000;
1061 }
1062
1063 // We use mread_real_time here.
1064 // On AIX: If the CPU has a time register, the result will be RTC_POWER and
1065 // it has to be converted to real time. AIX documentations suggests to do
1066 // this unconditionally, so we do it.
1067 //
1068 // See: https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/read_real_time.htm
1069 //
1070 // On PASE: mread_real_time will always return RTC_POWER_PC data, so no
1071 // conversion is necessary. However, mread_real_time will not return
1072 // monotonic results but merely matches read_real_time. So we need a tweak
1073 // to ensure monotonic results.
1074 //
1075 // For PASE no public documentation exists, just word by IBM
javaTimeNanos()1076 jlong os::javaTimeNanos() {
1077 timebasestruct_t time;
1078 int rc = mread_real_time(&time, TIMEBASE_SZ);
1079 if (os::Aix::on_pase()) {
1080 assert(rc == RTC_POWER, "expected time format RTC_POWER from mread_real_time in PASE");
1081 jlong now = jlong(time.tb_high) * NANOSECS_PER_SEC + jlong(time.tb_low);
1082 jlong prev = max_real_time;
1083 if (now <= prev) {
1084 return prev; // same or retrograde time;
1085 }
1086 jlong obsv = Atomic::cmpxchg(&max_real_time, prev, now);
1087 assert(obsv >= prev, "invariant"); // Monotonicity
1088 // If the CAS succeeded then we're done and return "now".
1089 // If the CAS failed and the observed value "obsv" is >= now then
1090 // we should return "obsv". If the CAS failed and now > obsv > prv then
1091 // some other thread raced this thread and installed a new value, in which case
1092 // we could either (a) retry the entire operation, (b) retry trying to install now
1093 // or (c) just return obsv. We use (c). No loop is required although in some cases
1094 // we might discard a higher "now" value in deference to a slightly lower but freshly
1095 // installed obsv value. That's entirely benign -- it admits no new orderings compared
1096 // to (a) or (b) -- and greatly reduces coherence traffic.
1097 // We might also condition (c) on the magnitude of the delta between obsv and now.
1098 // Avoiding excessive CAS operations to hot RW locations is critical.
1099 // See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
1100 return (prev == obsv) ? now : obsv;
1101 } else {
1102 if (rc != RTC_POWER) {
1103 rc = time_base_to_time(&time, TIMEBASE_SZ);
1104 assert(rc != -1, "error calling time_base_to_time()");
1105 }
1106 return jlong(time.tb_high) * NANOSECS_PER_SEC + jlong(time.tb_low);
1107 }
1108 }
1109
javaTimeNanos_info(jvmtiTimerInfo * info_ptr)1110 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
1111 info_ptr->max_value = ALL_64_BITS;
1112 // mread_real_time() is monotonic (see 'os::javaTimeNanos()')
1113 info_ptr->may_skip_backward = false;
1114 info_ptr->may_skip_forward = false;
1115 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time
1116 }
1117
1118 // Return the real, user, and system times in seconds from an
1119 // arbitrary fixed point in the past.
getTimesSecs(double * process_real_time,double * process_user_time,double * process_system_time)1120 bool os::getTimesSecs(double* process_real_time,
1121 double* process_user_time,
1122 double* process_system_time) {
1123 struct tms ticks;
1124 clock_t real_ticks = times(&ticks);
1125
1126 if (real_ticks == (clock_t) (-1)) {
1127 return false;
1128 } else {
1129 double ticks_per_second = (double) clock_tics_per_sec;
1130 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
1131 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
1132 *process_real_time = ((double) real_ticks) / ticks_per_second;
1133
1134 return true;
1135 }
1136 }
1137
local_time_string(char * buf,size_t buflen)1138 char * os::local_time_string(char *buf, size_t buflen) {
1139 struct tm t;
1140 time_t long_time;
1141 time(&long_time);
1142 localtime_r(&long_time, &t);
1143 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1144 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1145 t.tm_hour, t.tm_min, t.tm_sec);
1146 return buf;
1147 }
1148
localtime_pd(const time_t * clock,struct tm * res)1149 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
1150 return localtime_r(clock, res);
1151 }
1152
1153 ////////////////////////////////////////////////////////////////////////////////
1154 // runtime exit support
1155
1156 // Note: os::shutdown() might be called very early during initialization, or
1157 // called from signal handler. Before adding something to os::shutdown(), make
1158 // sure it is async-safe and can handle partially initialized VM.
shutdown()1159 void os::shutdown() {
1160
1161 // allow PerfMemory to attempt cleanup of any persistent resources
1162 perfMemory_exit();
1163
1164 // needs to remove object in file system
1165 AttachListener::abort();
1166
1167 // flush buffered output, finish log files
1168 ostream_abort();
1169
1170 // Check for abort hook
1171 abort_hook_t abort_hook = Arguments::abort_hook();
1172 if (abort_hook != NULL) {
1173 abort_hook();
1174 }
1175 }
1176
1177 // Note: os::abort() might be called very early during initialization, or
1178 // called from signal handler. Before adding something to os::abort(), make
1179 // sure it is async-safe and can handle partially initialized VM.
abort(bool dump_core,void * siginfo,const void * context)1180 void os::abort(bool dump_core, void* siginfo, const void* context) {
1181 os::shutdown();
1182 if (dump_core) {
1183 ::abort(); // dump core
1184 }
1185
1186 ::exit(1);
1187 }
1188
1189 // Die immediately, no exit hook, no abort hook, no cleanup.
1190 // Dump a core file, if possible, for debugging.
die()1191 void os::die() {
1192 if (TestUnresponsiveErrorHandler && !CreateCoredumpOnCrash) {
1193 // For TimeoutInErrorHandlingTest.java, we just kill the VM
1194 // and don't take the time to generate a core file.
1195 os::signal_raise(SIGKILL);
1196 } else {
1197 ::abort();
1198 }
1199 }
1200
current_thread_id()1201 intx os::current_thread_id() {
1202 return (intx)pthread_self();
1203 }
1204
current_process_id()1205 int os::current_process_id() {
1206 return getpid();
1207 }
1208
1209 // DLL functions
1210
dll_file_extension()1211 const char* os::dll_file_extension() { return ".so"; }
1212
1213 // This must be hard coded because it's the system's temporary
1214 // directory not the java application's temp directory, ala java.io.tmpdir.
get_temp_directory()1215 const char* os::get_temp_directory() { return "/tmp"; }
1216
1217 // Check if addr is inside libjvm.so.
address_is_in_vm(address addr)1218 bool os::address_is_in_vm(address addr) {
1219
1220 // Input could be a real pc or a function pointer literal. The latter
1221 // would be a function descriptor residing in the data segment of a module.
1222 loaded_module_t lm;
1223 if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL) {
1224 return lm.is_in_vm;
1225 } else if (LoadedLibraries::find_for_data_address(addr, &lm) != NULL) {
1226 return lm.is_in_vm;
1227 } else {
1228 return false;
1229 }
1230
1231 }
1232
1233 // Resolve an AIX function descriptor literal to a code pointer.
1234 // If the input is a valid code pointer to a text segment of a loaded module,
1235 // it is returned unchanged.
1236 // If the input is a valid AIX function descriptor, it is resolved to the
1237 // code entry point.
1238 // If the input is neither a valid function descriptor nor a valid code pointer,
1239 // NULL is returned.
resolve_function_descriptor_to_code_pointer(address p)1240 static address resolve_function_descriptor_to_code_pointer(address p) {
1241
1242 if (LoadedLibraries::find_for_text_address(p, NULL) != NULL) {
1243 // It is a real code pointer.
1244 return p;
1245 } else if (LoadedLibraries::find_for_data_address(p, NULL) != NULL) {
1246 // Pointer to data segment, potential function descriptor.
1247 address code_entry = (address)(((FunctionDescriptor*)p)->entry());
1248 if (LoadedLibraries::find_for_text_address(code_entry, NULL) != NULL) {
1249 // It is a function descriptor.
1250 return code_entry;
1251 }
1252 }
1253
1254 return NULL;
1255 }
1256
dll_address_to_function_name(address addr,char * buf,int buflen,int * offset,bool demangle)1257 bool os::dll_address_to_function_name(address addr, char *buf,
1258 int buflen, int *offset,
1259 bool demangle) {
1260 if (offset) {
1261 *offset = -1;
1262 }
1263 // Buf is not optional, but offset is optional.
1264 assert(buf != NULL, "sanity check");
1265 buf[0] = '\0';
1266
1267 // Resolve function ptr literals first.
1268 addr = resolve_function_descriptor_to_code_pointer(addr);
1269 if (!addr) {
1270 return false;
1271 }
1272
1273 return AixSymbols::get_function_name(addr, buf, buflen, offset, NULL, demangle);
1274 }
1275
dll_address_to_library_name(address addr,char * buf,int buflen,int * offset)1276 bool os::dll_address_to_library_name(address addr, char* buf,
1277 int buflen, int* offset) {
1278 if (offset) {
1279 *offset = -1;
1280 }
1281 // Buf is not optional, but offset is optional.
1282 assert(buf != NULL, "sanity check");
1283 buf[0] = '\0';
1284
1285 // Resolve function ptr literals first.
1286 addr = resolve_function_descriptor_to_code_pointer(addr);
1287 if (!addr) {
1288 return false;
1289 }
1290
1291 return AixSymbols::get_module_name(addr, buf, buflen);
1292 }
1293
1294 // Loads .dll/.so and in case of error it checks if .dll/.so was built
1295 // for the same architecture as Hotspot is running on.
dll_load(const char * filename,char * ebuf,int ebuflen)1296 void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
1297
1298 log_info(os)("attempting shared library load of %s", filename);
1299
1300 if (ebuf && ebuflen > 0) {
1301 ebuf[0] = '\0';
1302 ebuf[ebuflen - 1] = '\0';
1303 }
1304
1305 if (!filename || strlen(filename) == 0) {
1306 ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
1307 return NULL;
1308 }
1309
1310 // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
1311 void * result= ::dlopen(filename, RTLD_LAZY);
1312 if (result != NULL) {
1313 Events::log(NULL, "Loaded shared library %s", filename);
1314 // Reload dll cache. Don't do this in signal handling.
1315 LoadedLibraries::reload();
1316 log_info(os)("shared library load of %s was successful", filename);
1317 return result;
1318 } else {
1319 // error analysis when dlopen fails
1320 const char* error_report = ::dlerror();
1321 if (error_report == NULL) {
1322 error_report = "dlerror returned no error description";
1323 }
1324 if (ebuf != NULL && ebuflen > 0) {
1325 snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s",
1326 filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report);
1327 }
1328 Events::log(NULL, "Loading shared library %s failed, %s", filename, error_report);
1329 log_info(os)("shared library load of %s failed, %s", filename, error_report);
1330 }
1331 return NULL;
1332 }
1333
dll_lookup(void * handle,const char * name)1334 void* os::dll_lookup(void* handle, const char* name) {
1335 void* res = dlsym(handle, name);
1336 return res;
1337 }
1338
get_default_process_handle()1339 void* os::get_default_process_handle() {
1340 return (void*)::dlopen(NULL, RTLD_LAZY);
1341 }
1342
print_dll_info(outputStream * st)1343 void os::print_dll_info(outputStream *st) {
1344 st->print_cr("Dynamic libraries:");
1345 LoadedLibraries::print(st);
1346 }
1347
get_summary_os_info(char * buf,size_t buflen)1348 void os::get_summary_os_info(char* buf, size_t buflen) {
1349 // There might be something more readable than uname results for AIX.
1350 struct utsname name;
1351 uname(&name);
1352 snprintf(buf, buflen, "%s %s", name.release, name.version);
1353 }
1354
get_loaded_modules_info(os::LoadedModulesCallbackFunc callback,void * param)1355 int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *param) {
1356 // Not yet implemented.
1357 return 0;
1358 }
1359
print_os_info_brief(outputStream * st)1360 void os::print_os_info_brief(outputStream* st) {
1361 uint32_t ver = os::Aix::os_version();
1362 st->print_cr("AIX kernel version %u.%u.%u.%u",
1363 (ver >> 24) & 0xFF, (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
1364
1365 os::Posix::print_uname_info(st);
1366
1367 // Linux uses print_libversion_info(st); here.
1368 }
1369
print_os_info(outputStream * st)1370 void os::print_os_info(outputStream* st) {
1371 st->print_cr("OS:");
1372
1373 os::Posix::print_uname_info(st);
1374
1375 uint32_t ver = os::Aix::os_version();
1376 st->print_cr("AIX kernel version %u.%u.%u.%u",
1377 (ver >> 24) & 0xFF, (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
1378
1379 os::Posix::print_uptime_info(st);
1380
1381 os::Posix::print_rlimit_info(st);
1382
1383 os::Posix::print_load_average(st);
1384
1385 // _SC_THREAD_THREADS_MAX is the maximum number of threads within a process.
1386 long tmax = sysconf(_SC_THREAD_THREADS_MAX);
1387 st->print_cr("maximum #threads within a process:%ld", tmax);
1388
1389 // print wpar info
1390 libperfstat::wparinfo_t wi;
1391 if (libperfstat::get_wparinfo(&wi)) {
1392 st->print_cr("wpar info");
1393 st->print_cr("name: %s", wi.name);
1394 st->print_cr("id: %d", wi.wpar_id);
1395 st->print_cr("type: %s", (wi.app_wpar ? "application" : "system"));
1396 }
1397
1398 VM_Version::print_platform_virtualization_info(st);
1399 }
1400
print_memory_info(outputStream * st)1401 void os::print_memory_info(outputStream* st) {
1402
1403 st->print_cr("Memory:");
1404
1405 st->print_cr(" Base page size (sysconf _SC_PAGESIZE): %s",
1406 describe_pagesize(g_multipage_support.pagesize));
1407 st->print_cr(" Data page size (C-Heap, bss, etc): %s",
1408 describe_pagesize(g_multipage_support.datapsize));
1409 st->print_cr(" Text page size: %s",
1410 describe_pagesize(g_multipage_support.textpsize));
1411 st->print_cr(" Thread stack page size (pthread): %s",
1412 describe_pagesize(g_multipage_support.pthr_stack_pagesize));
1413 st->print_cr(" Default shared memory page size: %s",
1414 describe_pagesize(g_multipage_support.shmpsize));
1415 st->print_cr(" Can use 64K pages dynamically with shared memory: %s",
1416 (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
1417 st->print_cr(" Can use 16M pages dynamically with shared memory: %s",
1418 (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
1419 st->print_cr(" Multipage error: %d",
1420 g_multipage_support.error);
1421 st->cr();
1422 st->print_cr(" os::vm_page_size: %s", describe_pagesize(os::vm_page_size()));
1423
1424 // print out LDR_CNTRL because it affects the default page sizes
1425 const char* const ldr_cntrl = ::getenv("LDR_CNTRL");
1426 st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>");
1427
1428 // Print out EXTSHM because it is an unsupported setting.
1429 const char* const extshm = ::getenv("EXTSHM");
1430 st->print_cr(" EXTSHM=%s.", extshm ? extshm : "<unset>");
1431 if ( (strcmp(extshm, "on") == 0) || (strcmp(extshm, "ON") == 0) ) {
1432 st->print_cr(" *** Unsupported! Please remove EXTSHM from your environment! ***");
1433 }
1434
1435 // Print out AIXTHREAD_GUARDPAGES because it affects the size of pthread stacks.
1436 const char* const aixthread_guardpages = ::getenv("AIXTHREAD_GUARDPAGES");
1437 st->print_cr(" AIXTHREAD_GUARDPAGES=%s.",
1438 aixthread_guardpages ? aixthread_guardpages : "<unset>");
1439 st->cr();
1440
1441 os::Aix::meminfo_t mi;
1442 if (os::Aix::get_meminfo(&mi)) {
1443 if (os::Aix::on_aix()) {
1444 st->print_cr("physical total : " SIZE_FORMAT, mi.real_total);
1445 st->print_cr("physical free : " SIZE_FORMAT, mi.real_free);
1446 st->print_cr("swap total : " SIZE_FORMAT, mi.pgsp_total);
1447 st->print_cr("swap free : " SIZE_FORMAT, mi.pgsp_free);
1448 } else {
1449 // PASE - Numbers are result of QWCRSSTS; they mean:
1450 // real_total: Sum of all system pools
1451 // real_free: always 0
1452 // pgsp_total: we take the size of the system ASP
1453 // pgsp_free: size of system ASP times percentage of system ASP unused
1454 st->print_cr("physical total : " SIZE_FORMAT, mi.real_total);
1455 st->print_cr("system asp total : " SIZE_FORMAT, mi.pgsp_total);
1456 st->print_cr("%% system asp used : %.2f",
1457 mi.pgsp_total ? (100.0f * (mi.pgsp_total - mi.pgsp_free) / mi.pgsp_total) : -1.0f);
1458 }
1459 }
1460 st->cr();
1461
1462 // Print program break.
1463 st->print_cr("Program break at VM startup: " PTR_FORMAT ".", p2i(g_brk_at_startup));
1464 address brk_now = (address)::sbrk(0);
1465 if (brk_now != (address)-1) {
1466 st->print_cr("Program break now : " PTR_FORMAT " (distance: " SIZE_FORMAT "k).",
1467 p2i(brk_now), (size_t)((brk_now - g_brk_at_startup) / K));
1468 }
1469 st->print_cr("MaxExpectedDataSegmentSize : " SIZE_FORMAT "k.", MaxExpectedDataSegmentSize / K);
1470 st->cr();
1471
1472 // Print segments allocated with os::reserve_memory.
1473 st->print_cr("internal virtual memory regions used by vm:");
1474 vmembk_print_on(st);
1475 }
1476
1477 // Get a string for the cpuinfo that is a summary of the cpu type
get_summary_cpu_info(char * buf,size_t buflen)1478 void os::get_summary_cpu_info(char* buf, size_t buflen) {
1479 // read _system_configuration.version
1480 switch (_system_configuration.version) {
1481 case PV_9:
1482 strncpy(buf, "Power PC 9", buflen);
1483 break;
1484 case PV_8:
1485 strncpy(buf, "Power PC 8", buflen);
1486 break;
1487 case PV_7:
1488 strncpy(buf, "Power PC 7", buflen);
1489 break;
1490 case PV_6_1:
1491 strncpy(buf, "Power PC 6 DD1.x", buflen);
1492 break;
1493 case PV_6:
1494 strncpy(buf, "Power PC 6", buflen);
1495 break;
1496 case PV_5:
1497 strncpy(buf, "Power PC 5", buflen);
1498 break;
1499 case PV_5_2:
1500 strncpy(buf, "Power PC 5_2", buflen);
1501 break;
1502 case PV_5_3:
1503 strncpy(buf, "Power PC 5_3", buflen);
1504 break;
1505 case PV_5_Compat:
1506 strncpy(buf, "PV_5_Compat", buflen);
1507 break;
1508 case PV_6_Compat:
1509 strncpy(buf, "PV_6_Compat", buflen);
1510 break;
1511 case PV_7_Compat:
1512 strncpy(buf, "PV_7_Compat", buflen);
1513 break;
1514 case PV_8_Compat:
1515 strncpy(buf, "PV_8_Compat", buflen);
1516 break;
1517 case PV_9_Compat:
1518 strncpy(buf, "PV_9_Compat", buflen);
1519 break;
1520 default:
1521 strncpy(buf, "unknown", buflen);
1522 }
1523 }
1524
pd_print_cpu_info(outputStream * st,char * buf,size_t buflen)1525 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
1526 // Nothing to do beyond of what os::print_cpu_info() does.
1527 }
1528
1529 static void print_signal_handler(outputStream* st, int sig,
1530 char* buf, size_t buflen);
1531
print_signal_handlers(outputStream * st,char * buf,size_t buflen)1532 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1533 st->print_cr("Signal Handlers:");
1534 print_signal_handler(st, SIGSEGV, buf, buflen);
1535 print_signal_handler(st, SIGBUS , buf, buflen);
1536 print_signal_handler(st, SIGFPE , buf, buflen);
1537 print_signal_handler(st, SIGPIPE, buf, buflen);
1538 print_signal_handler(st, SIGXFSZ, buf, buflen);
1539 print_signal_handler(st, SIGILL , buf, buflen);
1540 print_signal_handler(st, SR_signum, buf, buflen);
1541 print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
1542 print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
1543 print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
1544 print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
1545 print_signal_handler(st, SIGTRAP, buf, buflen);
1546 // We also want to know if someone else adds a SIGDANGER handler because
1547 // that will interfere with OOM killling.
1548 print_signal_handler(st, SIGDANGER, buf, buflen);
1549 }
1550
1551 static char saved_jvm_path[MAXPATHLEN] = {0};
1552
1553 // Find the full path to the current module, libjvm.so.
jvm_path(char * buf,jint buflen)1554 void os::jvm_path(char *buf, jint buflen) {
1555 // Error checking.
1556 if (buflen < MAXPATHLEN) {
1557 assert(false, "must use a large-enough buffer");
1558 buf[0] = '\0';
1559 return;
1560 }
1561 // Lazy resolve the path to current module.
1562 if (saved_jvm_path[0] != 0) {
1563 strcpy(buf, saved_jvm_path);
1564 return;
1565 }
1566
1567 Dl_info dlinfo;
1568 int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
1569 assert(ret != 0, "cannot locate libjvm");
1570 char* rp = os::Posix::realpath((char *)dlinfo.dli_fname, buf, buflen);
1571 assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?");
1572
1573 if (Arguments::sun_java_launcher_is_altjvm()) {
1574 // Support for the java launcher's '-XXaltjvm=<path>' option. Typical
1575 // value for buf is "<JAVA_HOME>/jre/lib/<vmtype>/libjvm.so".
1576 // If "/jre/lib/" appears at the right place in the string, then
1577 // assume we are installed in a JDK and we're done. Otherwise, check
1578 // for a JAVA_HOME environment variable and fix up the path so it
1579 // looks like libjvm.so is installed there (append a fake suffix
1580 // hotspot/libjvm.so).
1581 const char *p = buf + strlen(buf) - 1;
1582 for (int count = 0; p > buf && count < 4; ++count) {
1583 for (--p; p > buf && *p != '/'; --p)
1584 /* empty */ ;
1585 }
1586
1587 if (strncmp(p, "/jre/lib/", 9) != 0) {
1588 // Look for JAVA_HOME in the environment.
1589 char* java_home_var = ::getenv("JAVA_HOME");
1590 if (java_home_var != NULL && java_home_var[0] != 0) {
1591 char* jrelib_p;
1592 int len;
1593
1594 // Check the current module name "libjvm.so".
1595 p = strrchr(buf, '/');
1596 if (p == NULL) {
1597 return;
1598 }
1599 assert(strstr(p, "/libjvm") == p, "invalid library name");
1600
1601 rp = os::Posix::realpath(java_home_var, buf, buflen);
1602 if (rp == NULL) {
1603 return;
1604 }
1605
1606 // determine if this is a legacy image or modules image
1607 // modules image doesn't have "jre" subdirectory
1608 len = strlen(buf);
1609 assert(len < buflen, "Ran out of buffer room");
1610 jrelib_p = buf + len;
1611 snprintf(jrelib_p, buflen-len, "/jre/lib");
1612 if (0 != access(buf, F_OK)) {
1613 snprintf(jrelib_p, buflen-len, "/lib");
1614 }
1615
1616 if (0 == access(buf, F_OK)) {
1617 // Use current module name "libjvm.so"
1618 len = strlen(buf);
1619 snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
1620 } else {
1621 // Go back to path of .so
1622 rp = os::Posix::realpath((char *)dlinfo.dli_fname, buf, buflen);
1623 if (rp == NULL) {
1624 return;
1625 }
1626 }
1627 }
1628 }
1629 }
1630
1631 strncpy(saved_jvm_path, buf, sizeof(saved_jvm_path));
1632 saved_jvm_path[sizeof(saved_jvm_path) - 1] = '\0';
1633 }
1634
print_jni_name_prefix_on(outputStream * st,int args_size)1635 void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1636 // no prefix required, not even "_"
1637 }
1638
print_jni_name_suffix_on(outputStream * st,int args_size)1639 void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1640 // no suffix required
1641 }
1642
1643 ////////////////////////////////////////////////////////////////////////////////
1644 // sun.misc.Signal support
1645
1646 static void
UserHandler(int sig,void * siginfo,void * context)1647 UserHandler(int sig, void *siginfo, void *context) {
1648 // Ctrl-C is pressed during error reporting, likely because the error
1649 // handler fails to abort. Let VM die immediately.
1650 if (sig == SIGINT && VMError::is_error_reported()) {
1651 os::die();
1652 }
1653
1654 os::signal_notify(sig);
1655 }
1656
user_handler()1657 void* os::user_handler() {
1658 return CAST_FROM_FN_PTR(void*, UserHandler);
1659 }
1660
1661 extern "C" {
1662 typedef void (*sa_handler_t)(int);
1663 typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
1664 }
1665
signal(int signal_number,void * handler)1666 void* os::signal(int signal_number, void* handler) {
1667 struct sigaction sigAct, oldSigAct;
1668
1669 sigfillset(&(sigAct.sa_mask));
1670
1671 // Do not block out synchronous signals in the signal handler.
1672 // Blocking synchronous signals only makes sense if you can really
1673 // be sure that those signals won't happen during signal handling,
1674 // when the blocking applies. Normal signal handlers are lean and
1675 // do not cause signals. But our signal handlers tend to be "risky"
1676 // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen.
1677 // On AIX, PASE there was a case where a SIGSEGV happened, followed
1678 // by a SIGILL, which was blocked due to the signal mask. The process
1679 // just hung forever. Better to crash from a secondary signal than to hang.
1680 sigdelset(&(sigAct.sa_mask), SIGSEGV);
1681 sigdelset(&(sigAct.sa_mask), SIGBUS);
1682 sigdelset(&(sigAct.sa_mask), SIGILL);
1683 sigdelset(&(sigAct.sa_mask), SIGFPE);
1684 sigdelset(&(sigAct.sa_mask), SIGTRAP);
1685
1686 sigAct.sa_flags = SA_RESTART|SA_SIGINFO;
1687
1688 sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
1689
1690 if (sigaction(signal_number, &sigAct, &oldSigAct)) {
1691 // -1 means registration failed
1692 return (void *)-1;
1693 }
1694
1695 return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
1696 }
1697
signal_raise(int signal_number)1698 void os::signal_raise(int signal_number) {
1699 ::raise(signal_number);
1700 }
1701
1702 //
1703 // The following code is moved from os.cpp for making this
1704 // code platform specific, which it is by its very nature.
1705 //
1706
1707 // Will be modified when max signal is changed to be dynamic
sigexitnum_pd()1708 int os::sigexitnum_pd() {
1709 return NSIG;
1710 }
1711
1712 // a counter for each possible signal value
1713 static volatile jint pending_signals[NSIG+1] = { 0 };
1714
1715 // Wrapper functions for: sem_init(), sem_post(), sem_wait()
1716 // On AIX, we use sem_init(), sem_post(), sem_wait()
1717 // On Pase, we need to use msem_lock() and msem_unlock(), because Posix Semaphores
1718 // do not seem to work at all on PASE (unimplemented, will cause SIGILL).
1719 // Note that just using msem_.. APIs for both PASE and AIX is not an option either, as
1720 // on AIX, msem_..() calls are suspected of causing problems.
1721 static sem_t sig_sem;
1722 static msemaphore* p_sig_msem = 0;
1723
local_sem_init()1724 static void local_sem_init() {
1725 if (os::Aix::on_aix()) {
1726 int rc = ::sem_init(&sig_sem, 0, 0);
1727 guarantee(rc != -1, "sem_init failed");
1728 } else {
1729 // Memory semaphores must live in shared mem.
1730 guarantee0(p_sig_msem == NULL);
1731 p_sig_msem = (msemaphore*)os::reserve_memory(sizeof(msemaphore), NULL);
1732 guarantee(p_sig_msem, "Cannot allocate memory for memory semaphore");
1733 guarantee(::msem_init(p_sig_msem, 0) == p_sig_msem, "msem_init failed");
1734 }
1735 }
1736
local_sem_post()1737 static void local_sem_post() {
1738 static bool warn_only_once = false;
1739 if (os::Aix::on_aix()) {
1740 int rc = ::sem_post(&sig_sem);
1741 if (rc == -1 && !warn_only_once) {
1742 trcVerbose("sem_post failed (errno = %d, %s)", errno, os::errno_name(errno));
1743 warn_only_once = true;
1744 }
1745 } else {
1746 guarantee0(p_sig_msem != NULL);
1747 int rc = ::msem_unlock(p_sig_msem, 0);
1748 if (rc == -1 && !warn_only_once) {
1749 trcVerbose("msem_unlock failed (errno = %d, %s)", errno, os::errno_name(errno));
1750 warn_only_once = true;
1751 }
1752 }
1753 }
1754
local_sem_wait()1755 static void local_sem_wait() {
1756 static bool warn_only_once = false;
1757 if (os::Aix::on_aix()) {
1758 int rc = ::sem_wait(&sig_sem);
1759 if (rc == -1 && !warn_only_once) {
1760 trcVerbose("sem_wait failed (errno = %d, %s)", errno, os::errno_name(errno));
1761 warn_only_once = true;
1762 }
1763 } else {
1764 guarantee0(p_sig_msem != NULL); // must init before use
1765 int rc = ::msem_lock(p_sig_msem, 0);
1766 if (rc == -1 && !warn_only_once) {
1767 trcVerbose("msem_lock failed (errno = %d, %s)", errno, os::errno_name(errno));
1768 warn_only_once = true;
1769 }
1770 }
1771 }
1772
jdk_misc_signal_init()1773 static void jdk_misc_signal_init() {
1774 // Initialize signal structures
1775 ::memset((void*)pending_signals, 0, sizeof(pending_signals));
1776
1777 // Initialize signal semaphore
1778 local_sem_init();
1779 }
1780
signal_notify(int sig)1781 void os::signal_notify(int sig) {
1782 Atomic::inc(&pending_signals[sig]);
1783 local_sem_post();
1784 }
1785
check_pending_signals()1786 static int check_pending_signals() {
1787 for (;;) {
1788 for (int i = 0; i < NSIG + 1; i++) {
1789 jint n = pending_signals[i];
1790 if (n > 0 && n == Atomic::cmpxchg(&pending_signals[i], n, n - 1)) {
1791 return i;
1792 }
1793 }
1794 JavaThread *thread = JavaThread::current();
1795 ThreadBlockInVM tbivm(thread);
1796
1797 bool threadIsSuspended;
1798 do {
1799 thread->set_suspend_equivalent();
1800 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1801
1802 local_sem_wait();
1803
1804 // were we externally suspended while we were waiting?
1805 threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1806 if (threadIsSuspended) {
1807 //
1808 // The semaphore has been incremented, but while we were waiting
1809 // another thread suspended us. We don't want to continue running
1810 // while suspended because that would surprise the thread that
1811 // suspended us.
1812 //
1813
1814 local_sem_post();
1815
1816 thread->java_suspend_self();
1817 }
1818 } while (threadIsSuspended);
1819 }
1820 }
1821
signal_wait()1822 int os::signal_wait() {
1823 return check_pending_signals();
1824 }
1825
1826 ////////////////////////////////////////////////////////////////////////////////
1827 // Virtual Memory
1828
1829 // We need to keep small simple bookkeeping for os::reserve_memory and friends.
1830
1831 #define VMEM_MAPPED 1
1832 #define VMEM_SHMATED 2
1833
1834 struct vmembk_t {
1835 int type; // 1 - mmap, 2 - shmat
1836 char* addr;
1837 size_t size; // Real size, may be larger than usersize.
1838 size_t pagesize; // page size of area
1839 vmembk_t* next;
1840
contains_addrvmembk_t1841 bool contains_addr(char* p) const {
1842 return p >= addr && p < (addr + size);
1843 }
1844
contains_rangevmembk_t1845 bool contains_range(char* p, size_t s) const {
1846 return contains_addr(p) && contains_addr(p + s - 1);
1847 }
1848
print_onvmembk_t1849 void print_on(outputStream* os) const {
1850 os->print("[" PTR_FORMAT " - " PTR_FORMAT "] (" UINTX_FORMAT
1851 " bytes, %d %s pages), %s",
1852 addr, addr + size - 1, size, size / pagesize, describe_pagesize(pagesize),
1853 (type == VMEM_SHMATED ? "shmat" : "mmap")
1854 );
1855 }
1856
1857 // Check that range is a sub range of memory block (or equal to memory block);
1858 // also check that range is fully page aligned to the page size if the block.
assert_is_valid_subrangevmembk_t1859 void assert_is_valid_subrange(char* p, size_t s) const {
1860 if (!contains_range(p, s)) {
1861 trcVerbose("[" PTR_FORMAT " - " PTR_FORMAT "] is not a sub "
1862 "range of [" PTR_FORMAT " - " PTR_FORMAT "].",
1863 p2i(p), p2i(p + s), p2i(addr), p2i(addr + size));
1864 guarantee0(false);
1865 }
1866 if (!is_aligned_to(p, pagesize) || !is_aligned_to(p + s, pagesize)) {
1867 trcVerbose("range [" PTR_FORMAT " - " PTR_FORMAT "] is not"
1868 " aligned to pagesize (%lu)", p2i(p), p2i(p + s), (unsigned long) pagesize);
1869 guarantee0(false);
1870 }
1871 }
1872 };
1873
1874 static struct {
1875 vmembk_t* first;
1876 MiscUtils::CritSect cs;
1877 } vmem;
1878
vmembk_add(char * addr,size_t size,size_t pagesize,int type)1879 static void vmembk_add(char* addr, size_t size, size_t pagesize, int type) {
1880 vmembk_t* p = (vmembk_t*) ::malloc(sizeof(vmembk_t));
1881 assert0(p);
1882 if (p) {
1883 MiscUtils::AutoCritSect lck(&vmem.cs);
1884 p->addr = addr; p->size = size;
1885 p->pagesize = pagesize;
1886 p->type = type;
1887 p->next = vmem.first;
1888 vmem.first = p;
1889 }
1890 }
1891
vmembk_find(char * addr)1892 static vmembk_t* vmembk_find(char* addr) {
1893 MiscUtils::AutoCritSect lck(&vmem.cs);
1894 for (vmembk_t* p = vmem.first; p; p = p->next) {
1895 if (p->addr <= addr && (p->addr + p->size) > addr) {
1896 return p;
1897 }
1898 }
1899 return NULL;
1900 }
1901
vmembk_remove(vmembk_t * p0)1902 static void vmembk_remove(vmembk_t* p0) {
1903 MiscUtils::AutoCritSect lck(&vmem.cs);
1904 assert0(p0);
1905 assert0(vmem.first); // List should not be empty.
1906 for (vmembk_t** pp = &(vmem.first); *pp; pp = &((*pp)->next)) {
1907 if (*pp == p0) {
1908 *pp = p0->next;
1909 ::free(p0);
1910 return;
1911 }
1912 }
1913 assert0(false); // Not found?
1914 }
1915
vmembk_print_on(outputStream * os)1916 static void vmembk_print_on(outputStream* os) {
1917 MiscUtils::AutoCritSect lck(&vmem.cs);
1918 for (vmembk_t* vmi = vmem.first; vmi; vmi = vmi->next) {
1919 vmi->print_on(os);
1920 os->cr();
1921 }
1922 }
1923
1924 // Reserve and attach a section of System V memory.
1925 // If <requested_addr> is not NULL, function will attempt to attach the memory at the given
1926 // address. Failing that, it will attach the memory anywhere.
1927 // If <requested_addr> is NULL, function will attach the memory anywhere.
1928 //
1929 // <alignment_hint> is being ignored by this function. It is very probable however that the
1930 // alignment requirements are met anyway, because shmat() attaches at 256M boundaries.
1931 // Should this be not enogh, we can put more work into it.
reserve_shmated_memory(size_t bytes,char * requested_addr,size_t alignment_hint)1932 static char* reserve_shmated_memory (
1933 size_t bytes,
1934 char* requested_addr,
1935 size_t alignment_hint) {
1936
1937 trcVerbose("reserve_shmated_memory " UINTX_FORMAT " bytes, wishaddress "
1938 PTR_FORMAT ", alignment_hint " UINTX_FORMAT "...",
1939 bytes, p2i(requested_addr), alignment_hint);
1940
1941 // Either give me wish address or wish alignment but not both.
1942 assert0(!(requested_addr != NULL && alignment_hint != 0));
1943
1944 // We must prevent anyone from attaching too close to the
1945 // BRK because that may cause malloc OOM.
1946 if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
1947 trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
1948 "Will attach anywhere.", p2i(requested_addr));
1949 // Act like the OS refused to attach there.
1950 requested_addr = NULL;
1951 }
1952
1953 // For old AS/400's (V5R4 and older) we should not even be here - System V shared memory is not
1954 // really supported (max size 4GB), so reserve_mmapped_memory should have been used instead.
1955 if (os::Aix::on_pase_V5R4_or_older()) {
1956 ShouldNotReachHere();
1957 }
1958
1959 // Align size of shm up to 64K to avoid errors if we later try to change the page size.
1960 const size_t size = align_up(bytes, 64*K);
1961
1962 // Reserve the shared segment.
1963 int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
1964 if (shmid == -1) {
1965 trcVerbose("shmget(.., " UINTX_FORMAT ", ..) failed (errno: %d).", size, errno);
1966 return NULL;
1967 }
1968
1969 // Important note:
1970 // It is very important that we, upon leaving this function, do not leave a shm segment alive.
1971 // We must right after attaching it remove it from the system. System V shm segments are global and
1972 // survive the process.
1973 // So, from here on: Do not assert, do not return, until we have called shmctl(IPC_RMID) (A).
1974
1975 struct shmid_ds shmbuf;
1976 memset(&shmbuf, 0, sizeof(shmbuf));
1977 shmbuf.shm_pagesize = 64*K;
1978 if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) != 0) {
1979 trcVerbose("Failed to set page size (need " UINTX_FORMAT " 64K pages) - shmctl failed with %d.",
1980 size / (64*K), errno);
1981 // I want to know if this ever happens.
1982 assert(false, "failed to set page size for shmat");
1983 }
1984
1985 // Now attach the shared segment.
1986 // Note that I attach with SHM_RND - which means that the requested address is rounded down, if
1987 // needed, to the next lowest segment boundary. Otherwise the attach would fail if the address
1988 // were not a segment boundary.
1989 char* const addr = (char*) shmat(shmid, requested_addr, SHM_RND);
1990 const int errno_shmat = errno;
1991
1992 // (A) Right after shmat and before handing shmat errors delete the shm segment.
1993 if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
1994 trcVerbose("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
1995 assert(false, "failed to remove shared memory segment!");
1996 }
1997
1998 // Handle shmat error. If we failed to attach, just return.
1999 if (addr == (char*)-1) {
2000 trcVerbose("Failed to attach segment at " PTR_FORMAT " (%d).", p2i(requested_addr), errno_shmat);
2001 return NULL;
2002 }
2003
2004 // Just for info: query the real page size. In case setting the page size did not
2005 // work (see above), the system may have given us something other then 4K (LDR_CNTRL).
2006 const size_t real_pagesize = os::Aix::query_pagesize(addr);
2007 if (real_pagesize != shmbuf.shm_pagesize) {
2008 trcVerbose("pagesize is, surprisingly, " SIZE_FORMAT, real_pagesize);
2009 }
2010
2011 if (addr) {
2012 trcVerbose("shm-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes, " UINTX_FORMAT " %s pages)",
2013 p2i(addr), p2i(addr + size - 1), size, size/real_pagesize, describe_pagesize(real_pagesize));
2014 } else {
2015 if (requested_addr != NULL) {
2016 trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at with address " PTR_FORMAT ".", size, p2i(requested_addr));
2017 } else {
2018 trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at any address.", size);
2019 }
2020 }
2021
2022 // book-keeping
2023 vmembk_add(addr, size, real_pagesize, VMEM_SHMATED);
2024 assert0(is_aligned_to(addr, os::vm_page_size()));
2025
2026 return addr;
2027 }
2028
release_shmated_memory(char * addr,size_t size)2029 static bool release_shmated_memory(char* addr, size_t size) {
2030
2031 trcVerbose("release_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2032 p2i(addr), p2i(addr + size - 1));
2033
2034 bool rc = false;
2035
2036 // TODO: is there a way to verify shm size without doing bookkeeping?
2037 if (::shmdt(addr) != 0) {
2038 trcVerbose("error (%d).", errno);
2039 } else {
2040 trcVerbose("ok.");
2041 rc = true;
2042 }
2043 return rc;
2044 }
2045
uncommit_shmated_memory(char * addr,size_t size)2046 static bool uncommit_shmated_memory(char* addr, size_t size) {
2047 trcVerbose("uncommit_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2048 p2i(addr), p2i(addr + size - 1));
2049
2050 const bool rc = my_disclaim64(addr, size);
2051
2052 if (!rc) {
2053 trcVerbose("my_disclaim64(" PTR_FORMAT ", " UINTX_FORMAT ") failed.\n", p2i(addr), size);
2054 return false;
2055 }
2056 return true;
2057 }
2058
2059 //////////////////////////////// mmap-based routines /////////////////////////////////
2060
2061 // Reserve memory via mmap.
2062 // If <requested_addr> is given, an attempt is made to attach at the given address.
2063 // Failing that, memory is allocated at any address.
2064 // If <alignment_hint> is given and <requested_addr> is NULL, an attempt is made to
2065 // allocate at an address aligned with the given alignment. Failing that, memory
2066 // is aligned anywhere.
reserve_mmaped_memory(size_t bytes,char * requested_addr,size_t alignment_hint)2067 static char* reserve_mmaped_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2068 trcVerbose("reserve_mmaped_memory " UINTX_FORMAT " bytes, wishaddress " PTR_FORMAT ", "
2069 "alignment_hint " UINTX_FORMAT "...",
2070 bytes, p2i(requested_addr), alignment_hint);
2071
2072 // If a wish address is given, but not aligned to 4K page boundary, mmap will fail.
2073 if (requested_addr && !is_aligned_to(requested_addr, os::vm_page_size()) != 0) {
2074 trcVerbose("Wish address " PTR_FORMAT " not aligned to page boundary.", p2i(requested_addr));
2075 return NULL;
2076 }
2077
2078 // We must prevent anyone from attaching too close to the
2079 // BRK because that may cause malloc OOM.
2080 if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
2081 trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
2082 "Will attach anywhere.", p2i(requested_addr));
2083 // Act like the OS refused to attach there.
2084 requested_addr = NULL;
2085 }
2086
2087 // Specify one or the other but not both.
2088 assert0(!(requested_addr != NULL && alignment_hint > 0));
2089
2090 // In 64K mode, we claim the global page size (os::vm_page_size())
2091 // is 64K. This is one of the few points where that illusion may
2092 // break, because mmap() will always return memory aligned to 4K. So
2093 // we must ensure we only ever return memory aligned to 64k.
2094 if (alignment_hint) {
2095 alignment_hint = lcm(alignment_hint, os::vm_page_size());
2096 } else {
2097 alignment_hint = os::vm_page_size();
2098 }
2099
2100 // Size shall always be a multiple of os::vm_page_size (esp. in 64K mode).
2101 const size_t size = align_up(bytes, os::vm_page_size());
2102
2103 // alignment: Allocate memory large enough to include an aligned range of the right size and
2104 // cut off the leading and trailing waste pages.
2105 assert0(alignment_hint != 0 && is_aligned_to(alignment_hint, os::vm_page_size())); // see above
2106 const size_t extra_size = size + alignment_hint;
2107
2108 // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to
2109 // later use msync(MS_INVALIDATE) (see os::uncommit_memory).
2110 int flags = MAP_ANONYMOUS | MAP_SHARED;
2111
2112 // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
2113 // it means if wishaddress is given but MAP_FIXED is not set.
2114 //
2115 // Important! Behaviour differs depending on whether SPEC1170 mode is active or not.
2116 // SPEC1170 mode active: behaviour like POSIX, MAP_FIXED will clobber existing mappings.
2117 // SPEC1170 mode not active: behaviour, unlike POSIX, is that no existing mappings will
2118 // get clobbered.
2119 if (requested_addr != NULL) {
2120 if (!os::Aix::xpg_sus_mode()) { // not SPEC1170 Behaviour
2121 flags |= MAP_FIXED;
2122 }
2123 }
2124
2125 char* addr = (char*)::mmap(requested_addr, extra_size,
2126 PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
2127
2128 if (addr == MAP_FAILED) {
2129 trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) failed (%d)", p2i(requested_addr), size, errno);
2130 return NULL;
2131 }
2132
2133 // Handle alignment.
2134 char* const addr_aligned = align_up(addr, alignment_hint);
2135 const size_t waste_pre = addr_aligned - addr;
2136 char* const addr_aligned_end = addr_aligned + size;
2137 const size_t waste_post = extra_size - waste_pre - size;
2138 if (waste_pre > 0) {
2139 ::munmap(addr, waste_pre);
2140 }
2141 if (waste_post > 0) {
2142 ::munmap(addr_aligned_end, waste_post);
2143 }
2144 addr = addr_aligned;
2145
2146 if (addr) {
2147 trcVerbose("mmap-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes)",
2148 p2i(addr), p2i(addr + bytes), bytes);
2149 } else {
2150 if (requested_addr != NULL) {
2151 trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at wish address " PTR_FORMAT ".", bytes, p2i(requested_addr));
2152 } else {
2153 trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at any address.", bytes);
2154 }
2155 }
2156
2157 // bookkeeping
2158 vmembk_add(addr, size, 4*K, VMEM_MAPPED);
2159
2160 // Test alignment, see above.
2161 assert0(is_aligned_to(addr, os::vm_page_size()));
2162
2163 return addr;
2164 }
2165
release_mmaped_memory(char * addr,size_t size)2166 static bool release_mmaped_memory(char* addr, size_t size) {
2167 assert0(is_aligned_to(addr, os::vm_page_size()));
2168 assert0(is_aligned_to(size, os::vm_page_size()));
2169
2170 trcVerbose("release_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2171 p2i(addr), p2i(addr + size - 1));
2172 bool rc = false;
2173
2174 if (::munmap(addr, size) != 0) {
2175 trcVerbose("failed (%d)\n", errno);
2176 rc = false;
2177 } else {
2178 trcVerbose("ok.");
2179 rc = true;
2180 }
2181
2182 return rc;
2183 }
2184
uncommit_mmaped_memory(char * addr,size_t size)2185 static bool uncommit_mmaped_memory(char* addr, size_t size) {
2186
2187 assert0(is_aligned_to(addr, os::vm_page_size()));
2188 assert0(is_aligned_to(size, os::vm_page_size()));
2189
2190 trcVerbose("uncommit_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
2191 p2i(addr), p2i(addr + size - 1));
2192 bool rc = false;
2193
2194 // Uncommit mmap memory with msync MS_INVALIDATE.
2195 if (::msync(addr, size, MS_INVALIDATE) != 0) {
2196 trcVerbose("failed (%d)\n", errno);
2197 rc = false;
2198 } else {
2199 trcVerbose("ok.");
2200 rc = true;
2201 }
2202
2203 return rc;
2204 }
2205
vm_page_size()2206 int os::vm_page_size() {
2207 // Seems redundant as all get out.
2208 assert(os::Aix::page_size() != -1, "must call os::init");
2209 return os::Aix::page_size();
2210 }
2211
2212 // Aix allocates memory by pages.
vm_allocation_granularity()2213 int os::vm_allocation_granularity() {
2214 assert(os::Aix::page_size() != -1, "must call os::init");
2215 return os::Aix::page_size();
2216 }
2217
2218 #ifdef PRODUCT
warn_fail_commit_memory(char * addr,size_t size,bool exec,int err)2219 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
2220 int err) {
2221 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2222 ", %d) failed; error='%s' (errno=%d)", p2i(addr), size, exec,
2223 os::errno_name(err), err);
2224 }
2225 #endif
2226
pd_commit_memory_or_exit(char * addr,size_t size,bool exec,const char * mesg)2227 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2228 const char* mesg) {
2229 assert(mesg != NULL, "mesg must be specified");
2230 if (!pd_commit_memory(addr, size, exec)) {
2231 // Add extra info in product mode for vm_exit_out_of_memory():
2232 PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
2233 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
2234 }
2235 }
2236
pd_commit_memory(char * addr,size_t size,bool exec)2237 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2238
2239 assert(is_aligned_to(addr, os::vm_page_size()),
2240 "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2241 p2i(addr), os::vm_page_size());
2242 assert(is_aligned_to(size, os::vm_page_size()),
2243 "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2244 size, os::vm_page_size());
2245
2246 vmembk_t* const vmi = vmembk_find(addr);
2247 guarantee0(vmi);
2248 vmi->assert_is_valid_subrange(addr, size);
2249
2250 trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", p2i(addr), p2i(addr + size - 1));
2251
2252 if (UseExplicitCommit) {
2253 // AIX commits memory on touch. So, touch all pages to be committed.
2254 for (char* p = addr; p < (addr + size); p += 4*K) {
2255 *p = '\0';
2256 }
2257 }
2258
2259 return true;
2260 }
2261
pd_commit_memory(char * addr,size_t size,size_t alignment_hint,bool exec)2262 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) {
2263 return pd_commit_memory(addr, size, exec);
2264 }
2265
pd_commit_memory_or_exit(char * addr,size_t size,size_t alignment_hint,bool exec,const char * mesg)2266 void os::pd_commit_memory_or_exit(char* addr, size_t size,
2267 size_t alignment_hint, bool exec,
2268 const char* mesg) {
2269 // Alignment_hint is ignored on this OS.
2270 pd_commit_memory_or_exit(addr, size, exec, mesg);
2271 }
2272
pd_uncommit_memory(char * addr,size_t size)2273 bool os::pd_uncommit_memory(char* addr, size_t size) {
2274 assert(is_aligned_to(addr, os::vm_page_size()),
2275 "addr " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2276 p2i(addr), os::vm_page_size());
2277 assert(is_aligned_to(size, os::vm_page_size()),
2278 "size " PTR_FORMAT " not aligned to vm_page_size (" PTR_FORMAT ")",
2279 size, os::vm_page_size());
2280
2281 // Dynamically do different things for mmap/shmat.
2282 const vmembk_t* const vmi = vmembk_find(addr);
2283 guarantee0(vmi);
2284 vmi->assert_is_valid_subrange(addr, size);
2285
2286 if (vmi->type == VMEM_SHMATED) {
2287 return uncommit_shmated_memory(addr, size);
2288 } else {
2289 return uncommit_mmaped_memory(addr, size);
2290 }
2291 }
2292
pd_create_stack_guard_pages(char * addr,size_t size)2293 bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
2294 // Do not call this; no need to commit stack pages on AIX.
2295 ShouldNotReachHere();
2296 return true;
2297 }
2298
remove_stack_guard_pages(char * addr,size_t size)2299 bool os::remove_stack_guard_pages(char* addr, size_t size) {
2300 // Do not call this; no need to commit stack pages on AIX.
2301 ShouldNotReachHere();
2302 return true;
2303 }
2304
pd_realign_memory(char * addr,size_t bytes,size_t alignment_hint)2305 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
2306 }
2307
pd_free_memory(char * addr,size_t bytes,size_t alignment_hint)2308 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
2309 }
2310
numa_make_global(char * addr,size_t bytes)2311 void os::numa_make_global(char *addr, size_t bytes) {
2312 }
2313
numa_make_local(char * addr,size_t bytes,int lgrp_hint)2314 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
2315 }
2316
numa_topology_changed()2317 bool os::numa_topology_changed() {
2318 return false;
2319 }
2320
numa_get_groups_num()2321 size_t os::numa_get_groups_num() {
2322 return 1;
2323 }
2324
numa_get_group_id()2325 int os::numa_get_group_id() {
2326 return 0;
2327 }
2328
numa_get_leaf_groups(int * ids,size_t size)2329 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2330 if (size > 0) {
2331 ids[0] = 0;
2332 return 1;
2333 }
2334 return 0;
2335 }
2336
numa_get_group_id_for_address(const void * address)2337 int os::numa_get_group_id_for_address(const void* address) {
2338 return 0;
2339 }
2340
get_page_info(char * start,page_info * info)2341 bool os::get_page_info(char *start, page_info* info) {
2342 return false;
2343 }
2344
scan_pages(char * start,char * end,page_info * page_expected,page_info * page_found)2345 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2346 return end;
2347 }
2348
2349 // Reserves and attaches a shared memory segment.
2350 // Will assert if a wish address is given and could not be obtained.
pd_reserve_memory(size_t bytes,char * requested_addr,size_t alignment_hint)2351 char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
2352
2353 // All other Unices do a mmap(MAP_FIXED) if the addr is given,
2354 // thereby clobbering old mappings at that place. That is probably
2355 // not intended, never used and almost certainly an error were it
2356 // ever be used this way (to try attaching at a specified address
2357 // without clobbering old mappings an alternate API exists,
2358 // os::attempt_reserve_memory_at()).
2359 // Instead of mimicking the dangerous coding of the other platforms, here I
2360 // just ignore the request address (release) or assert(debug).
2361 assert0(requested_addr == NULL);
2362
2363 // Always round to os::vm_page_size(), which may be larger than 4K.
2364 bytes = align_up(bytes, os::vm_page_size());
2365 const size_t alignment_hint0 =
2366 alignment_hint ? align_up(alignment_hint, os::vm_page_size()) : 0;
2367
2368 // In 4K mode always use mmap.
2369 // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
2370 if (os::vm_page_size() == 4*K) {
2371 return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
2372 } else {
2373 if (bytes >= Use64KPagesThreshold) {
2374 return reserve_shmated_memory(bytes, requested_addr, alignment_hint);
2375 } else {
2376 return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
2377 }
2378 }
2379 }
2380
pd_release_memory(char * addr,size_t size)2381 bool os::pd_release_memory(char* addr, size_t size) {
2382
2383 // Dynamically do different things for mmap/shmat.
2384 vmembk_t* const vmi = vmembk_find(addr);
2385 guarantee0(vmi);
2386
2387 // Always round to os::vm_page_size(), which may be larger than 4K.
2388 size = align_up(size, os::vm_page_size());
2389 addr = align_up(addr, os::vm_page_size());
2390
2391 bool rc = false;
2392 bool remove_bookkeeping = false;
2393 if (vmi->type == VMEM_SHMATED) {
2394 // For shmatted memory, we do:
2395 // - If user wants to release the whole range, release the memory (shmdt).
2396 // - If user only wants to release a partial range, uncommit (disclaim) that
2397 // range. That way, at least, we do not use memory anymore (bust still page
2398 // table space).
2399 vmi->assert_is_valid_subrange(addr, size);
2400 if (addr == vmi->addr && size == vmi->size) {
2401 rc = release_shmated_memory(addr, size);
2402 remove_bookkeeping = true;
2403 } else {
2404 rc = uncommit_shmated_memory(addr, size);
2405 }
2406 } else {
2407 // User may unmap partial regions but region has to be fully contained.
2408 #ifdef ASSERT
2409 vmi->assert_is_valid_subrange(addr, size);
2410 #endif
2411 rc = release_mmaped_memory(addr, size);
2412 remove_bookkeeping = true;
2413 }
2414
2415 // update bookkeeping
2416 if (rc && remove_bookkeeping) {
2417 vmembk_remove(vmi);
2418 }
2419
2420 return rc;
2421 }
2422
checked_mprotect(char * addr,size_t size,int prot)2423 static bool checked_mprotect(char* addr, size_t size, int prot) {
2424
2425 // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will
2426 // not tell me if protection failed when trying to protect an un-protectable range.
2427 //
2428 // This means if the memory was allocated using shmget/shmat, protection wont work
2429 // but mprotect will still return 0:
2430 //
2431 // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm
2432
2433 Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with protection modes %x", p2i(addr), p2i(addr+size), prot);
2434 bool rc = ::mprotect(addr, size, prot) == 0 ? true : false;
2435
2436 if (!rc) {
2437 const char* const s_errno = os::errno_name(errno);
2438 warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno);
2439 return false;
2440 }
2441
2442 // mprotect success check
2443 //
2444 // Mprotect said it changed the protection but can I believe it?
2445 //
2446 // To be sure I need to check the protection afterwards. Try to
2447 // read from protected memory and check whether that causes a segfault.
2448 //
2449 if (!os::Aix::xpg_sus_mode()) {
2450
2451 if (CanUseSafeFetch32()) {
2452
2453 const bool read_protected =
2454 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
2455 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
2456
2457 if (prot & PROT_READ) {
2458 rc = !read_protected;
2459 } else {
2460 rc = read_protected;
2461 }
2462
2463 if (!rc) {
2464 if (os::Aix::on_pase()) {
2465 // There is an issue on older PASE systems where mprotect() will return success but the
2466 // memory will not be protected.
2467 // This has nothing to do with the problem of using mproect() on SPEC1170 incompatible
2468 // machines; we only see it rarely, when using mprotect() to protect the guard page of
2469 // a stack. It is an OS error.
2470 //
2471 // A valid strategy is just to try again. This usually works. :-/
2472
2473 ::usleep(1000);
2474 Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with protection modes %x", p2i(addr), p2i(addr+size), prot);
2475 if (::mprotect(addr, size, prot) == 0) {
2476 const bool read_protected_2 =
2477 (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
2478 SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
2479 rc = true;
2480 }
2481 }
2482 }
2483 }
2484 }
2485
2486 assert(rc == true, "mprotect failed.");
2487
2488 return rc;
2489 }
2490
2491 // Set protections specified
protect_memory(char * addr,size_t size,ProtType prot,bool is_committed)2492 bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) {
2493 unsigned int p = 0;
2494 switch (prot) {
2495 case MEM_PROT_NONE: p = PROT_NONE; break;
2496 case MEM_PROT_READ: p = PROT_READ; break;
2497 case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break;
2498 case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
2499 default:
2500 ShouldNotReachHere();
2501 }
2502 // is_committed is unused.
2503 return checked_mprotect(addr, size, p);
2504 }
2505
guard_memory(char * addr,size_t size)2506 bool os::guard_memory(char* addr, size_t size) {
2507 return checked_mprotect(addr, size, PROT_NONE);
2508 }
2509
unguard_memory(char * addr,size_t size)2510 bool os::unguard_memory(char* addr, size_t size) {
2511 return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
2512 }
2513
2514 // Large page support
2515
2516 static size_t _large_page_size = 0;
2517
2518 // Enable large page support if OS allows that.
large_page_init()2519 void os::large_page_init() {
2520 return; // Nothing to do. See query_multipage_support and friends.
2521 }
2522
pd_reserve_memory_special(size_t bytes,size_t alignment,char * req_addr,bool exec)2523 char* os::pd_reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
2524 fatal("os::reserve_memory_special should not be called on AIX.");
2525 return NULL;
2526 }
2527
pd_release_memory_special(char * base,size_t bytes)2528 bool os::pd_release_memory_special(char* base, size_t bytes) {
2529 fatal("os::release_memory_special should not be called on AIX.");
2530 return false;
2531 }
2532
large_page_size()2533 size_t os::large_page_size() {
2534 return _large_page_size;
2535 }
2536
can_commit_large_page_memory()2537 bool os::can_commit_large_page_memory() {
2538 // Does not matter, we do not support huge pages.
2539 return false;
2540 }
2541
can_execute_large_page_memory()2542 bool os::can_execute_large_page_memory() {
2543 // Does not matter, we do not support huge pages.
2544 return false;
2545 }
2546
pd_attempt_reserve_memory_at(size_t bytes,char * requested_addr,int file_desc)2547 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int file_desc) {
2548 assert(file_desc >= 0, "file_desc is not valid");
2549 char* result = NULL;
2550
2551 // Always round to os::vm_page_size(), which may be larger than 4K.
2552 bytes = align_up(bytes, os::vm_page_size());
2553 result = reserve_mmaped_memory(bytes, requested_addr, 0);
2554
2555 if (result != NULL) {
2556 if (replace_existing_mapping_with_file_mapping(result, bytes, file_desc) == NULL) {
2557 vm_exit_during_initialization(err_msg("Error in mapping Java heap at the given filesystem directory"));
2558 }
2559 }
2560 return result;
2561 }
2562
2563 // Reserve memory at an arbitrary address, only if that area is
2564 // available (and not reserved for something else).
pd_attempt_reserve_memory_at(size_t bytes,char * requested_addr)2565 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2566 char* addr = NULL;
2567
2568 // Always round to os::vm_page_size(), which may be larger than 4K.
2569 bytes = align_up(bytes, os::vm_page_size());
2570
2571 // In 4K mode always use mmap.
2572 // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
2573 if (os::vm_page_size() == 4*K) {
2574 return reserve_mmaped_memory(bytes, requested_addr, 0);
2575 } else {
2576 if (bytes >= Use64KPagesThreshold) {
2577 return reserve_shmated_memory(bytes, requested_addr, 0);
2578 } else {
2579 return reserve_mmaped_memory(bytes, requested_addr, 0);
2580 }
2581 }
2582
2583 return addr;
2584 }
2585
2586 // Sleep forever; naked call to OS-specific sleep; use with CAUTION
infinite_sleep()2587 void os::infinite_sleep() {
2588 while (true) { // sleep forever ...
2589 ::sleep(100); // ... 100 seconds at a time
2590 }
2591 }
2592
2593 // Used to convert frequent JVM_Yield() to nops
dont_yield()2594 bool os::dont_yield() {
2595 return DontYieldALot;
2596 }
2597
naked_yield()2598 void os::naked_yield() {
2599 sched_yield();
2600 }
2601
2602 ////////////////////////////////////////////////////////////////////////////////
2603 // thread priority support
2604
2605 // From AIX manpage to pthread_setschedparam
2606 // (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?
2607 // topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm):
2608 //
2609 // "If schedpolicy is SCHED_OTHER, then sched_priority must be in the
2610 // range from 40 to 80, where 40 is the least favored priority and 80
2611 // is the most favored."
2612 //
2613 // (Actually, I doubt this even has an impact on AIX, as we do kernel
2614 // scheduling there; however, this still leaves iSeries.)
2615 //
2616 // We use the same values for AIX and PASE.
2617 int os::java_to_os_priority[CriticalPriority + 1] = {
2618 54, // 0 Entry should never be used
2619
2620 55, // 1 MinPriority
2621 55, // 2
2622 56, // 3
2623
2624 56, // 4
2625 57, // 5 NormPriority
2626 57, // 6
2627
2628 58, // 7
2629 58, // 8
2630 59, // 9 NearMaxPriority
2631
2632 60, // 10 MaxPriority
2633
2634 60 // 11 CriticalPriority
2635 };
2636
prio_init()2637 static int prio_init() {
2638 if (ThreadPriorityPolicy == 1) {
2639 if (geteuid() != 0) {
2640 if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy) && !FLAG_IS_JIMAGE_RESOURCE(ThreadPriorityPolicy)) {
2641 warning("-XX:ThreadPriorityPolicy=1 may require system level permission, " \
2642 "e.g., being the root user. If the necessary permission is not " \
2643 "possessed, changes to priority will be silently ignored.");
2644 }
2645 }
2646 }
2647 if (UseCriticalJavaThreadPriority) {
2648 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
2649 }
2650 return 0;
2651 }
2652
set_native_priority(Thread * thread,int newpri)2653 OSReturn os::set_native_priority(Thread* thread, int newpri) {
2654 if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK;
2655 pthread_t thr = thread->osthread()->pthread_id();
2656 int policy = SCHED_OTHER;
2657 struct sched_param param;
2658 param.sched_priority = newpri;
2659 int ret = pthread_setschedparam(thr, policy, ¶m);
2660
2661 if (ret != 0) {
2662 trcVerbose("Could not change priority for thread %d to %d (error %d, %s)",
2663 (int)thr, newpri, ret, os::errno_name(ret));
2664 }
2665 return (ret == 0) ? OS_OK : OS_ERR;
2666 }
2667
get_native_priority(const Thread * const thread,int * priority_ptr)2668 OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
2669 if (!UseThreadPriorities || ThreadPriorityPolicy == 0) {
2670 *priority_ptr = java_to_os_priority[NormPriority];
2671 return OS_OK;
2672 }
2673 pthread_t thr = thread->osthread()->pthread_id();
2674 int policy = SCHED_OTHER;
2675 struct sched_param param;
2676 int ret = pthread_getschedparam(thr, &policy, ¶m);
2677 *priority_ptr = param.sched_priority;
2678
2679 return (ret == 0) ? OS_OK : OS_ERR;
2680 }
2681
2682 ////////////////////////////////////////////////////////////////////////////////
2683 // suspend/resume support
2684
2685 // The low-level signal-based suspend/resume support is a remnant from the
2686 // old VM-suspension that used to be for java-suspension, safepoints etc,
2687 // within hotspot. Currently used by JFR's OSThreadSampler
2688 //
2689 // The remaining code is greatly simplified from the more general suspension
2690 // code that used to be used.
2691 //
2692 // The protocol is quite simple:
2693 // - suspend:
2694 // - sends a signal to the target thread
2695 // - polls the suspend state of the osthread using a yield loop
2696 // - target thread signal handler (SR_handler) sets suspend state
2697 // and blocks in sigsuspend until continued
2698 // - resume:
2699 // - sets target osthread state to continue
2700 // - sends signal to end the sigsuspend loop in the SR_handler
2701 //
2702 // Note that the SR_lock plays no role in this suspend/resume protocol,
2703 // but is checked for NULL in SR_handler as a thread termination indicator.
2704 // The SR_lock is, however, used by JavaThread::java_suspend()/java_resume() APIs.
2705 //
2706 // Note that resume_clear_context() and suspend_save_context() are needed
2707 // by SR_handler(), so that fetch_frame_from_ucontext() works,
2708 // which in part is used by:
2709 // - Forte Analyzer: AsyncGetCallTrace()
2710 // - StackBanging: get_frame_at_stack_banging_point()
2711
resume_clear_context(OSThread * osthread)2712 static void resume_clear_context(OSThread *osthread) {
2713 osthread->set_ucontext(NULL);
2714 osthread->set_siginfo(NULL);
2715 }
2716
suspend_save_context(OSThread * osthread,siginfo_t * siginfo,ucontext_t * context)2717 static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
2718 osthread->set_ucontext(context);
2719 osthread->set_siginfo(siginfo);
2720 }
2721
2722 //
2723 // Handler function invoked when a thread's execution is suspended or
2724 // resumed. We have to be careful that only async-safe functions are
2725 // called here (Note: most pthread functions are not async safe and
2726 // should be avoided.)
2727 //
2728 // Note: sigwait() is a more natural fit than sigsuspend() from an
2729 // interface point of view, but sigwait() prevents the signal hander
2730 // from being run. libpthread would get very confused by not having
2731 // its signal handlers run and prevents sigwait()'s use with the
2732 // mutex granting granting signal.
2733 //
2734 // Currently only ever called on the VMThread and JavaThreads (PC sampling).
2735 //
SR_handler(int sig,siginfo_t * siginfo,ucontext_t * context)2736 static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
2737 // Save and restore errno to avoid confusing native code with EINTR
2738 // after sigsuspend.
2739 int old_errno = errno;
2740
2741 Thread* thread = Thread::current_or_null_safe();
2742 assert(thread != NULL, "Missing current thread in SR_handler");
2743
2744 // On some systems we have seen signal delivery get "stuck" until the signal
2745 // mask is changed as part of thread termination. Check that the current thread
2746 // has not already terminated (via SR_lock()) - else the following assertion
2747 // will fail because the thread is no longer a JavaThread as the ~JavaThread
2748 // destructor has completed.
2749
2750 if (thread->SR_lock() == NULL) {
2751 return;
2752 }
2753
2754 assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
2755
2756 OSThread* osthread = thread->osthread();
2757
2758 os::SuspendResume::State current = osthread->sr.state();
2759 if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
2760 suspend_save_context(osthread, siginfo, context);
2761
2762 // attempt to switch the state, we assume we had a SUSPEND_REQUEST
2763 os::SuspendResume::State state = osthread->sr.suspended();
2764 if (state == os::SuspendResume::SR_SUSPENDED) {
2765 sigset_t suspend_set; // signals for sigsuspend()
2766 sigemptyset(&suspend_set);
2767 // get current set of blocked signals and unblock resume signal
2768 pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
2769 sigdelset(&suspend_set, SR_signum);
2770
2771 // wait here until we are resumed
2772 while (1) {
2773 sigsuspend(&suspend_set);
2774
2775 os::SuspendResume::State result = osthread->sr.running();
2776 if (result == os::SuspendResume::SR_RUNNING) {
2777 break;
2778 }
2779 }
2780
2781 } else if (state == os::SuspendResume::SR_RUNNING) {
2782 // request was cancelled, continue
2783 } else {
2784 ShouldNotReachHere();
2785 }
2786
2787 resume_clear_context(osthread);
2788 } else if (current == os::SuspendResume::SR_RUNNING) {
2789 // request was cancelled, continue
2790 } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
2791 // ignore
2792 } else {
2793 ShouldNotReachHere();
2794 }
2795
2796 errno = old_errno;
2797 }
2798
SR_initialize()2799 static int SR_initialize() {
2800 struct sigaction act;
2801 char *s;
2802 // Get signal number to use for suspend/resume
2803 if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
2804 int sig = ::strtol(s, 0, 10);
2805 if (sig > MAX2(SIGSEGV, SIGBUS) && // See 4355769.
2806 sig < NSIG) { // Must be legal signal and fit into sigflags[].
2807 SR_signum = sig;
2808 } else {
2809 warning("You set _JAVA_SR_SIGNUM=%d. It must be in range [%d, %d]. Using %d instead.",
2810 sig, MAX2(SIGSEGV, SIGBUS)+1, NSIG-1, SR_signum);
2811 }
2812 }
2813
2814 assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
2815 "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
2816
2817 sigemptyset(&SR_sigset);
2818 sigaddset(&SR_sigset, SR_signum);
2819
2820 // Set up signal handler for suspend/resume.
2821 act.sa_flags = SA_RESTART|SA_SIGINFO;
2822 act.sa_handler = (void (*)(int)) SR_handler;
2823
2824 // SR_signum is blocked by default.
2825 pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
2826
2827 if (sigaction(SR_signum, &act, 0) == -1) {
2828 return -1;
2829 }
2830
2831 // Save signal flag
2832 os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
2833 return 0;
2834 }
2835
SR_finalize()2836 static int SR_finalize() {
2837 return 0;
2838 }
2839
sr_notify(OSThread * osthread)2840 static int sr_notify(OSThread* osthread) {
2841 int status = pthread_kill(osthread->pthread_id(), SR_signum);
2842 assert_status(status == 0, status, "pthread_kill");
2843 return status;
2844 }
2845
2846 // "Randomly" selected value for how long we want to spin
2847 // before bailing out on suspending a thread, also how often
2848 // we send a signal to a thread we want to resume
2849 static const int RANDOMLY_LARGE_INTEGER = 1000000;
2850 static const int RANDOMLY_LARGE_INTEGER2 = 100;
2851
2852 // returns true on success and false on error - really an error is fatal
2853 // but this seems the normal response to library errors
do_suspend(OSThread * osthread)2854 static bool do_suspend(OSThread* osthread) {
2855 assert(osthread->sr.is_running(), "thread should be running");
2856 // mark as suspended and send signal
2857
2858 if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
2859 // failed to switch, state wasn't running?
2860 ShouldNotReachHere();
2861 return false;
2862 }
2863
2864 if (sr_notify(osthread) != 0) {
2865 // try to cancel, switch to running
2866
2867 os::SuspendResume::State result = osthread->sr.cancel_suspend();
2868 if (result == os::SuspendResume::SR_RUNNING) {
2869 // cancelled
2870 return false;
2871 } else if (result == os::SuspendResume::SR_SUSPENDED) {
2872 // somehow managed to suspend
2873 return true;
2874 } else {
2875 ShouldNotReachHere();
2876 return false;
2877 }
2878 }
2879
2880 // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
2881
2882 for (int n = 0; !osthread->sr.is_suspended(); n++) {
2883 for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
2884 os::naked_yield();
2885 }
2886
2887 // timeout, try to cancel the request
2888 if (n >= RANDOMLY_LARGE_INTEGER) {
2889 os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
2890 if (cancelled == os::SuspendResume::SR_RUNNING) {
2891 return false;
2892 } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
2893 return true;
2894 } else {
2895 ShouldNotReachHere();
2896 return false;
2897 }
2898 }
2899 }
2900
2901 guarantee(osthread->sr.is_suspended(), "Must be suspended");
2902 return true;
2903 }
2904
do_resume(OSThread * osthread)2905 static void do_resume(OSThread* osthread) {
2906 //assert(osthread->sr.is_suspended(), "thread should be suspended");
2907
2908 if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
2909 // failed to switch to WAKEUP_REQUEST
2910 ShouldNotReachHere();
2911 return;
2912 }
2913
2914 while (!osthread->sr.is_running()) {
2915 if (sr_notify(osthread) == 0) {
2916 for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
2917 for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
2918 os::naked_yield();
2919 }
2920 }
2921 } else {
2922 ShouldNotReachHere();
2923 }
2924 }
2925
2926 guarantee(osthread->sr.is_running(), "Must be running!");
2927 }
2928
2929 ///////////////////////////////////////////////////////////////////////////////////
2930 // signal handling (except suspend/resume)
2931
2932 // This routine may be used by user applications as a "hook" to catch signals.
2933 // The user-defined signal handler must pass unrecognized signals to this
2934 // routine, and if it returns true (non-zero), then the signal handler must
2935 // return immediately. If the flag "abort_if_unrecognized" is true, then this
2936 // routine will never retun false (zero), but instead will execute a VM panic
2937 // routine kill the process.
2938 //
2939 // If this routine returns false, it is OK to call it again. This allows
2940 // the user-defined signal handler to perform checks either before or after
2941 // the VM performs its own checks. Naturally, the user code would be making
2942 // a serious error if it tried to handle an exception (such as a null check
2943 // or breakpoint) that the VM was generating for its own correct operation.
2944 //
2945 // This routine may recognize any of the following kinds of signals:
2946 // SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
2947 // It should be consulted by handlers for any of those signals.
2948 //
2949 // The caller of this routine must pass in the three arguments supplied
2950 // to the function referred to in the "sa_sigaction" (not the "sa_handler")
2951 // field of the structure passed to sigaction(). This routine assumes that
2952 // the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
2953 //
2954 // Note that the VM will print warnings if it detects conflicting signal
2955 // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
2956 //
2957 extern "C" JNIEXPORT int
2958 JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
2959
2960 // Set thread signal mask (for some reason on AIX sigthreadmask() seems
2961 // to be the thing to call; documentation is not terribly clear about whether
2962 // pthread_sigmask also works, and if it does, whether it does the same.
set_thread_signal_mask(int how,const sigset_t * set,sigset_t * oset)2963 bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) {
2964 const int rc = ::pthread_sigmask(how, set, oset);
2965 // return value semantics differ slightly for error case:
2966 // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno
2967 // (so, pthread_sigmask is more theadsafe for error handling)
2968 // But success is always 0.
2969 return rc == 0 ? true : false;
2970 }
2971
2972 // Function to unblock all signals which are, according
2973 // to POSIX, typical program error signals. If they happen while being blocked,
2974 // they typically will bring down the process immediately.
unblock_program_error_signals()2975 bool unblock_program_error_signals() {
2976 sigset_t set;
2977 ::sigemptyset(&set);
2978 ::sigaddset(&set, SIGILL);
2979 ::sigaddset(&set, SIGBUS);
2980 ::sigaddset(&set, SIGFPE);
2981 ::sigaddset(&set, SIGSEGV);
2982 return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL);
2983 }
2984
2985 // Renamed from 'signalHandler' to avoid collision with other shared libs.
javaSignalHandler(int sig,siginfo_t * info,void * uc)2986 static void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
2987 assert(info != NULL && uc != NULL, "it must be old kernel");
2988
2989 // Never leave program error signals blocked;
2990 // on all our platforms they would bring down the process immediately when
2991 // getting raised while being blocked.
2992 unblock_program_error_signals();
2993
2994 int orig_errno = errno; // Preserve errno value over signal handler.
2995 JVM_handle_aix_signal(sig, info, uc, true);
2996 errno = orig_errno;
2997 }
2998
2999 // This boolean allows users to forward their own non-matching signals
3000 // to JVM_handle_aix_signal, harmlessly.
3001 bool os::Aix::signal_handlers_are_installed = false;
3002
3003 // For signal-chaining
3004 bool os::Aix::libjsig_is_loaded = false;
3005 typedef struct sigaction *(*get_signal_t)(int);
3006 get_signal_t os::Aix::get_signal_action = NULL;
3007
get_chained_signal_action(int sig)3008 struct sigaction* os::Aix::get_chained_signal_action(int sig) {
3009 struct sigaction *actp = NULL;
3010
3011 if (libjsig_is_loaded) {
3012 // Retrieve the old signal handler from libjsig
3013 actp = (*get_signal_action)(sig);
3014 }
3015 if (actp == NULL) {
3016 // Retrieve the preinstalled signal handler from jvm
3017 actp = os::Posix::get_preinstalled_handler(sig);
3018 }
3019
3020 return actp;
3021 }
3022
call_chained_handler(struct sigaction * actp,int sig,siginfo_t * siginfo,void * context)3023 static bool call_chained_handler(struct sigaction *actp, int sig,
3024 siginfo_t *siginfo, void *context) {
3025 // Call the old signal handler
3026 if (actp->sa_handler == SIG_DFL) {
3027 // It's more reasonable to let jvm treat it as an unexpected exception
3028 // instead of taking the default action.
3029 return false;
3030 } else if (actp->sa_handler != SIG_IGN) {
3031 if ((actp->sa_flags & SA_NODEFER) == 0) {
3032 // automaticlly block the signal
3033 sigaddset(&(actp->sa_mask), sig);
3034 }
3035
3036 sa_handler_t hand = NULL;
3037 sa_sigaction_t sa = NULL;
3038 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
3039 // retrieve the chained handler
3040 if (siginfo_flag_set) {
3041 sa = actp->sa_sigaction;
3042 } else {
3043 hand = actp->sa_handler;
3044 }
3045
3046 if ((actp->sa_flags & SA_RESETHAND) != 0) {
3047 actp->sa_handler = SIG_DFL;
3048 }
3049
3050 // try to honor the signal mask
3051 sigset_t oset;
3052 sigemptyset(&oset);
3053 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
3054
3055 // call into the chained handler
3056 if (siginfo_flag_set) {
3057 (*sa)(sig, siginfo, context);
3058 } else {
3059 (*hand)(sig);
3060 }
3061
3062 // restore the signal mask
3063 pthread_sigmask(SIG_SETMASK, &oset, NULL);
3064 }
3065 // Tell jvm's signal handler the signal is taken care of.
3066 return true;
3067 }
3068
chained_handler(int sig,siginfo_t * siginfo,void * context)3069 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) {
3070 bool chained = false;
3071 // signal-chaining
3072 if (UseSignalChaining) {
3073 struct sigaction *actp = get_chained_signal_action(sig);
3074 if (actp != NULL) {
3075 chained = call_chained_handler(actp, sig, siginfo, context);
3076 }
3077 }
3078 return chained;
3079 }
3080
3081 // for diagnostic
3082 int sigflags[NSIG];
3083
get_our_sigflags(int sig)3084 int os::Aix::get_our_sigflags(int sig) {
3085 assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3086 return sigflags[sig];
3087 }
3088
set_our_sigflags(int sig,int flags)3089 void os::Aix::set_our_sigflags(int sig, int flags) {
3090 assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3091 if (sig > 0 && sig < NSIG) {
3092 sigflags[sig] = flags;
3093 }
3094 }
3095
set_signal_handler(int sig,bool set_installed)3096 void os::Aix::set_signal_handler(int sig, bool set_installed) {
3097 // Check for overwrite.
3098 struct sigaction oldAct;
3099 sigaction(sig, (struct sigaction*)NULL, &oldAct);
3100
3101 void* oldhand = oldAct.sa_sigaction
3102 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3103 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3104 if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3105 oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3106 oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
3107 if (AllowUserSignalHandlers || !set_installed) {
3108 // Do not overwrite; user takes responsibility to forward to us.
3109 return;
3110 } else if (UseSignalChaining) {
3111 // save the old handler in jvm
3112 os::Posix::save_preinstalled_handler(sig, oldAct);
3113 // libjsig also interposes the sigaction() call below and saves the
3114 // old sigaction on it own.
3115 } else {
3116 fatal("Encountered unexpected pre-existing sigaction handler "
3117 "%#lx for signal %d.", (long)oldhand, sig);
3118 }
3119 }
3120
3121 struct sigaction sigAct;
3122 sigfillset(&(sigAct.sa_mask));
3123 if (!set_installed) {
3124 sigAct.sa_handler = SIG_DFL;
3125 sigAct.sa_flags = SA_RESTART;
3126 } else {
3127 sigAct.sa_sigaction = javaSignalHandler;
3128 sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
3129 }
3130 // Save flags, which are set by ours
3131 assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
3132 sigflags[sig] = sigAct.sa_flags;
3133
3134 int ret = sigaction(sig, &sigAct, &oldAct);
3135 assert(ret == 0, "check");
3136
3137 void* oldhand2 = oldAct.sa_sigaction
3138 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3139 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3140 assert(oldhand2 == oldhand, "no concurrent signal handler installation");
3141 }
3142
3143 // install signal handlers for signals that HotSpot needs to
3144 // handle in order to support Java-level exception handling.
install_signal_handlers()3145 void os::Aix::install_signal_handlers() {
3146 if (!signal_handlers_are_installed) {
3147 signal_handlers_are_installed = true;
3148
3149 // signal-chaining
3150 typedef void (*signal_setting_t)();
3151 signal_setting_t begin_signal_setting = NULL;
3152 signal_setting_t end_signal_setting = NULL;
3153 begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3154 dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
3155 if (begin_signal_setting != NULL) {
3156 end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
3157 dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
3158 get_signal_action = CAST_TO_FN_PTR(get_signal_t,
3159 dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
3160 libjsig_is_loaded = true;
3161 assert(UseSignalChaining, "should enable signal-chaining");
3162 }
3163 if (libjsig_is_loaded) {
3164 // Tell libjsig jvm is setting signal handlers.
3165 (*begin_signal_setting)();
3166 }
3167
3168 set_signal_handler(SIGSEGV, true);
3169 set_signal_handler(SIGPIPE, true);
3170 set_signal_handler(SIGBUS, true);
3171 set_signal_handler(SIGILL, true);
3172 set_signal_handler(SIGFPE, true);
3173 set_signal_handler(SIGTRAP, true);
3174 set_signal_handler(SIGXFSZ, true);
3175
3176 if (libjsig_is_loaded) {
3177 // Tell libjsig jvm finishes setting signal handlers.
3178 (*end_signal_setting)();
3179 }
3180
3181 // We don't activate signal checker if libjsig is in place, we trust ourselves
3182 // and if UserSignalHandler is installed all bets are off.
3183 // Log that signal checking is off only if -verbose:jni is specified.
3184 if (CheckJNICalls) {
3185 if (libjsig_is_loaded) {
3186 tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
3187 check_signals = false;
3188 }
3189 if (AllowUserSignalHandlers) {
3190 tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
3191 check_signals = false;
3192 }
3193 // Need to initialize check_signal_done.
3194 ::sigemptyset(&check_signal_done);
3195 }
3196 }
3197 }
3198
get_signal_handler_name(address handler,char * buf,int buflen)3199 static const char* get_signal_handler_name(address handler,
3200 char* buf, int buflen) {
3201 int offset;
3202 bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
3203 if (found) {
3204 // skip directory names
3205 const char *p1, *p2;
3206 p1 = buf;
3207 size_t len = strlen(os::file_separator());
3208 while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
3209 // The way os::dll_address_to_library_name is implemented on Aix
3210 // right now, it always returns -1 for the offset which is not
3211 // terribly informative.
3212 // Will fix that. For now, omit the offset.
3213 jio_snprintf(buf, buflen, "%s", p1);
3214 } else {
3215 jio_snprintf(buf, buflen, PTR_FORMAT, handler);
3216 }
3217 return buf;
3218 }
3219
print_signal_handler(outputStream * st,int sig,char * buf,size_t buflen)3220 static void print_signal_handler(outputStream* st, int sig,
3221 char* buf, size_t buflen) {
3222 struct sigaction sa;
3223 sigaction(sig, NULL, &sa);
3224
3225 st->print("%s: ", os::exception_name(sig, buf, buflen));
3226
3227 address handler = (sa.sa_flags & SA_SIGINFO)
3228 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
3229 : CAST_FROM_FN_PTR(address, sa.sa_handler);
3230
3231 if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
3232 st->print("SIG_DFL");
3233 } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
3234 st->print("SIG_IGN");
3235 } else {
3236 st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
3237 }
3238
3239 // Print readable mask.
3240 st->print(", sa_mask[0]=");
3241 os::Posix::print_signal_set_short(st, &sa.sa_mask);
3242
3243 address rh = VMError::get_resetted_sighandler(sig);
3244 // May be, handler was resetted by VMError?
3245 if (rh != NULL) {
3246 handler = rh;
3247 sa.sa_flags = VMError::get_resetted_sigflags(sig);
3248 }
3249
3250 // Print textual representation of sa_flags.
3251 st->print(", sa_flags=");
3252 os::Posix::print_sa_flags(st, sa.sa_flags);
3253
3254 // Check: is it our handler?
3255 if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) ||
3256 handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
3257 // It is our signal handler.
3258 // Check for flags, reset system-used one!
3259 if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) {
3260 st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library",
3261 os::Aix::get_our_sigflags(sig));
3262 }
3263 }
3264 st->cr();
3265 }
3266
3267 #define DO_SIGNAL_CHECK(sig) \
3268 if (!sigismember(&check_signal_done, sig)) \
3269 os::Aix::check_signal_handler(sig)
3270
3271 // This method is a periodic task to check for misbehaving JNI applications
3272 // under CheckJNI, we can add any periodic checks here
3273
run_periodic_checks()3274 void os::run_periodic_checks() {
3275
3276 if (check_signals == false) return;
3277
3278 // SEGV and BUS if overridden could potentially prevent
3279 // generation of hs*.log in the event of a crash, debugging
3280 // such a case can be very challenging, so we absolutely
3281 // check the following for a good measure:
3282 DO_SIGNAL_CHECK(SIGSEGV);
3283 DO_SIGNAL_CHECK(SIGILL);
3284 DO_SIGNAL_CHECK(SIGFPE);
3285 DO_SIGNAL_CHECK(SIGBUS);
3286 DO_SIGNAL_CHECK(SIGPIPE);
3287 DO_SIGNAL_CHECK(SIGXFSZ);
3288 if (UseSIGTRAP) {
3289 DO_SIGNAL_CHECK(SIGTRAP);
3290 }
3291
3292 // ReduceSignalUsage allows the user to override these handlers
3293 // see comments at the very top and jvm_md.h
3294 if (!ReduceSignalUsage) {
3295 DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
3296 DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
3297 DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
3298 DO_SIGNAL_CHECK(BREAK_SIGNAL);
3299 }
3300
3301 DO_SIGNAL_CHECK(SR_signum);
3302 }
3303
3304 typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
3305
3306 static os_sigaction_t os_sigaction = NULL;
3307
check_signal_handler(int sig)3308 void os::Aix::check_signal_handler(int sig) {
3309 char buf[O_BUFLEN];
3310 address jvmHandler = NULL;
3311
3312 struct sigaction act;
3313 if (os_sigaction == NULL) {
3314 // only trust the default sigaction, in case it has been interposed
3315 os_sigaction = CAST_TO_FN_PTR(os_sigaction_t, dlsym(RTLD_DEFAULT, "sigaction"));
3316 if (os_sigaction == NULL) return;
3317 }
3318
3319 os_sigaction(sig, (struct sigaction*)NULL, &act);
3320
3321 address thisHandler = (act.sa_flags & SA_SIGINFO)
3322 ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
3323 : CAST_FROM_FN_PTR(address, act.sa_handler);
3324
3325 switch(sig) {
3326 case SIGSEGV:
3327 case SIGBUS:
3328 case SIGFPE:
3329 case SIGPIPE:
3330 case SIGILL:
3331 case SIGXFSZ:
3332 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler);
3333 break;
3334
3335 case SHUTDOWN1_SIGNAL:
3336 case SHUTDOWN2_SIGNAL:
3337 case SHUTDOWN3_SIGNAL:
3338 case BREAK_SIGNAL:
3339 jvmHandler = (address)user_handler();
3340 break;
3341
3342 default:
3343 if (sig == SR_signum) {
3344 jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
3345 } else {
3346 return;
3347 }
3348 break;
3349 }
3350
3351 if (thisHandler != jvmHandler) {
3352 tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
3353 tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
3354 tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
3355 // No need to check this sig any longer
3356 sigaddset(&check_signal_done, sig);
3357 // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
3358 if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
3359 tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
3360 exception_name(sig, buf, O_BUFLEN));
3361 }
3362 } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) {
3363 tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
3364 tty->print("expected:");
3365 os::Posix::print_sa_flags(tty, os::Aix::get_our_sigflags(sig));
3366 tty->cr();
3367 tty->print(" found:");
3368 os::Posix::print_sa_flags(tty, act.sa_flags);
3369 tty->cr();
3370 // No need to check this sig any longer
3371 sigaddset(&check_signal_done, sig);
3372 }
3373
3374 // Dump all the signal
3375 if (sigismember(&check_signal_done, sig)) {
3376 print_signal_handlers(tty, buf, O_BUFLEN);
3377 }
3378 }
3379
3380 // To install functions for atexit system call
3381 extern "C" {
perfMemory_exit_helper()3382 static void perfMemory_exit_helper() {
3383 perfMemory_exit();
3384 }
3385 }
3386
3387 // This is called _before_ the most of global arguments have been parsed.
init(void)3388 void os::init(void) {
3389 // This is basic, we want to know if that ever changes.
3390 // (Shared memory boundary is supposed to be a 256M aligned.)
3391 assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected");
3392
3393 // Record process break at startup.
3394 g_brk_at_startup = (address) ::sbrk(0);
3395 assert(g_brk_at_startup != (address) -1, "sbrk failed");
3396
3397 // First off, we need to know whether we run on AIX or PASE, and
3398 // the OS level we run on.
3399 os::Aix::initialize_os_info();
3400
3401 // Scan environment (SPEC1170 behaviour, etc).
3402 os::Aix::scan_environment();
3403
3404 // Probe multipage support.
3405 query_multipage_support();
3406
3407 // Act like we only have one page size by eliminating corner cases which
3408 // we did not support very well anyway.
3409 // We have two input conditions:
3410 // 1) Data segment page size. This is controlled by linker setting (datapsize) on the
3411 // launcher, and/or by LDR_CNTRL environment variable. The latter overrules the linker
3412 // setting.
3413 // Data segment page size is important for us because it defines the thread stack page
3414 // size, which is needed for guard page handling, stack banging etc.
3415 // 2) The ability to allocate 64k pages dynamically. If this is a given, java heap can
3416 // and should be allocated with 64k pages.
3417 //
3418 // So, we do the following:
3419 // LDR_CNTRL can_use_64K_pages_dynamically what we do remarks
3420 // 4K no 4K old systems (aix 5.2, as/400 v5r4) or new systems with AME activated
3421 // 4k yes 64k (treat 4k stacks as 64k) different loader than java and standard settings
3422 // 64k no --- AIX 5.2 ? ---
3423 // 64k yes 64k new systems and standard java loader (we set datapsize=64k when linking)
3424
3425 // We explicitly leave no option to change page size, because only upgrading would work,
3426 // not downgrading (if stack page size is 64k you cannot pretend its 4k).
3427
3428 if (g_multipage_support.datapsize == 4*K) {
3429 // datapsize = 4K. Data segment, thread stacks are 4K paged.
3430 if (g_multipage_support.can_use_64K_pages) {
3431 // .. but we are able to use 64K pages dynamically.
3432 // This would be typical for java launchers which are not linked
3433 // with datapsize=64K (like, any other launcher but our own).
3434 //
3435 // In this case it would be smart to allocate the java heap with 64K
3436 // to get the performance benefit, and to fake 64k pages for the
3437 // data segment (when dealing with thread stacks).
3438 //
3439 // However, leave a possibility to downgrade to 4K, using
3440 // -XX:-Use64KPages.
3441 if (Use64KPages) {
3442 trcVerbose("64K page mode (faked for data segment)");
3443 Aix::_page_size = 64*K;
3444 } else {
3445 trcVerbose("4K page mode (Use64KPages=off)");
3446 Aix::_page_size = 4*K;
3447 }
3448 } else {
3449 // .. and not able to allocate 64k pages dynamically. Here, just
3450 // fall back to 4K paged mode and use mmap for everything.
3451 trcVerbose("4K page mode");
3452 Aix::_page_size = 4*K;
3453 FLAG_SET_ERGO(Use64KPages, false);
3454 }
3455 } else {
3456 // datapsize = 64k. Data segment, thread stacks are 64k paged.
3457 // This normally means that we can allocate 64k pages dynamically.
3458 // (There is one special case where this may be false: EXTSHM=on.
3459 // but we decided to not support that mode).
3460 assert0(g_multipage_support.can_use_64K_pages);
3461 Aix::_page_size = 64*K;
3462 trcVerbose("64K page mode");
3463 FLAG_SET_ERGO(Use64KPages, true);
3464 }
3465
3466 // For now UseLargePages is just ignored.
3467 FLAG_SET_ERGO(UseLargePages, false);
3468 _page_sizes[0] = 0;
3469
3470 // debug trace
3471 trcVerbose("os::vm_page_size %s", describe_pagesize(os::vm_page_size()));
3472
3473 // Next, we need to initialize libo4 and libperfstat libraries.
3474 if (os::Aix::on_pase()) {
3475 os::Aix::initialize_libo4();
3476 } else {
3477 os::Aix::initialize_libperfstat();
3478 }
3479
3480 // Reset the perfstat information provided by ODM.
3481 if (os::Aix::on_aix()) {
3482 libperfstat::perfstat_reset();
3483 }
3484
3485 // Now initialze basic system properties. Note that for some of the values we
3486 // need libperfstat etc.
3487 os::Aix::initialize_system_info();
3488
3489 clock_tics_per_sec = sysconf(_SC_CLK_TCK);
3490
3491 init_random(1234567);
3492
3493 // _main_thread points to the thread that created/loaded the JVM.
3494 Aix::_main_thread = pthread_self();
3495
3496 initial_time_count = javaTimeNanos();
3497
3498 os::Posix::init();
3499 }
3500
3501 // This is called _after_ the global arguments have been parsed.
init_2(void)3502 jint os::init_2(void) {
3503
3504 // This could be set after os::Posix::init() but all platforms
3505 // have to set it the same so we have to mirror Solaris.
3506 DEBUG_ONLY(os::set_mutex_init_done();)
3507
3508 os::Posix::init_2();
3509
3510 if (os::Aix::on_pase()) {
3511 trcVerbose("Running on PASE.");
3512 } else {
3513 trcVerbose("Running on AIX (not PASE).");
3514 }
3515
3516 trcVerbose("processor count: %d", os::_processor_count);
3517 trcVerbose("physical memory: %lu", Aix::_physical_memory);
3518
3519 // Initially build up the loaded dll map.
3520 LoadedLibraries::reload();
3521 if (Verbose) {
3522 trcVerbose("Loaded Libraries: ");
3523 LoadedLibraries::print(tty);
3524 }
3525
3526 // initialize suspend/resume support - must do this before signal_sets_init()
3527 if (SR_initialize() != 0) {
3528 perror("SR_initialize failed");
3529 return JNI_ERR;
3530 }
3531
3532 Aix::signal_sets_init();
3533 Aix::install_signal_handlers();
3534 // Initialize data for jdk.internal.misc.Signal
3535 if (!ReduceSignalUsage) {
3536 jdk_misc_signal_init();
3537 }
3538
3539 // Check and sets minimum stack sizes against command line options
3540 if (Posix::set_minimum_stack_sizes() == JNI_ERR) {
3541 return JNI_ERR;
3542 }
3543
3544 // Not supported.
3545 FLAG_SET_ERGO(UseNUMA, false);
3546 FLAG_SET_ERGO(UseNUMAInterleaving, false);
3547
3548 if (MaxFDLimit) {
3549 // Set the number of file descriptors to max. print out error
3550 // if getrlimit/setrlimit fails but continue regardless.
3551 struct rlimit nbr_files;
3552 int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
3553 if (status != 0) {
3554 log_info(os)("os::init_2 getrlimit failed: %s", os::strerror(errno));
3555 } else {
3556 nbr_files.rlim_cur = nbr_files.rlim_max;
3557 status = setrlimit(RLIMIT_NOFILE, &nbr_files);
3558 if (status != 0) {
3559 log_info(os)("os::init_2 setrlimit failed: %s", os::strerror(errno));
3560 }
3561 }
3562 }
3563
3564 if (PerfAllowAtExitRegistration) {
3565 // Only register atexit functions if PerfAllowAtExitRegistration is set.
3566 // At exit functions can be delayed until process exit time, which
3567 // can be problematic for embedded VM situations. Embedded VMs should
3568 // call DestroyJavaVM() to assure that VM resources are released.
3569
3570 // Note: perfMemory_exit_helper atexit function may be removed in
3571 // the future if the appropriate cleanup code can be added to the
3572 // VM_Exit VMOperation's doit method.
3573 if (atexit(perfMemory_exit_helper) != 0) {
3574 warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3575 }
3576 }
3577
3578 // initialize thread priority policy
3579 prio_init();
3580
3581 return JNI_OK;
3582 }
3583
active_processor_count()3584 int os::active_processor_count() {
3585 // User has overridden the number of active processors
3586 if (ActiveProcessorCount > 0) {
3587 log_trace(os)("active_processor_count: "
3588 "active processor count set by user : %d",
3589 ActiveProcessorCount);
3590 return ActiveProcessorCount;
3591 }
3592
3593 int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
3594 assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
3595 return online_cpus;
3596 }
3597
set_native_thread_name(const char * name)3598 void os::set_native_thread_name(const char *name) {
3599 // Not yet implemented.
3600 return;
3601 }
3602
bind_to_processor(uint processor_id)3603 bool os::bind_to_processor(uint processor_id) {
3604 // Not yet implemented.
3605 return false;
3606 }
3607
internal_do_task()3608 void os::SuspendedThreadTask::internal_do_task() {
3609 if (do_suspend(_thread->osthread())) {
3610 SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
3611 do_task(context);
3612 do_resume(_thread->osthread());
3613 }
3614 }
3615
3616 ////////////////////////////////////////////////////////////////////////////////
3617 // debug support
3618
find(address addr,outputStream * st)3619 bool os::find(address addr, outputStream* st) {
3620
3621 st->print(PTR_FORMAT ": ", addr);
3622
3623 loaded_module_t lm;
3624 if (LoadedLibraries::find_for_text_address(addr, &lm) != NULL ||
3625 LoadedLibraries::find_for_data_address(addr, &lm) != NULL) {
3626 st->print_cr("%s", lm.path);
3627 return true;
3628 }
3629
3630 return false;
3631 }
3632
3633 ////////////////////////////////////////////////////////////////////////////////
3634 // misc
3635
3636 // This does not do anything on Aix. This is basically a hook for being
3637 // able to use structured exception handling (thread-local exception filters)
3638 // on, e.g., Win32.
3639 void
os_exception_wrapper(java_call_t f,JavaValue * value,const methodHandle & method,JavaCallArguments * args,Thread * thread)3640 os::os_exception_wrapper(java_call_t f, JavaValue* value, const methodHandle& method,
3641 JavaCallArguments* args, Thread* thread) {
3642 f(value, method, args, thread);
3643 }
3644
print_statistics()3645 void os::print_statistics() {
3646 }
3647
message_box(const char * title,const char * message)3648 bool os::message_box(const char* title, const char* message) {
3649 int i;
3650 fdStream err(defaultStream::error_fd());
3651 for (i = 0; i < 78; i++) err.print_raw("=");
3652 err.cr();
3653 err.print_raw_cr(title);
3654 for (i = 0; i < 78; i++) err.print_raw("-");
3655 err.cr();
3656 err.print_raw_cr(message);
3657 for (i = 0; i < 78; i++) err.print_raw("=");
3658 err.cr();
3659
3660 char buf[16];
3661 // Prevent process from exiting upon "read error" without consuming all CPU
3662 while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
3663
3664 return buf[0] == 'y' || buf[0] == 'Y';
3665 }
3666
3667 // Is a (classpath) directory empty?
dir_is_empty(const char * path)3668 bool os::dir_is_empty(const char* path) {
3669 DIR *dir = NULL;
3670 struct dirent *ptr;
3671
3672 dir = opendir(path);
3673 if (dir == NULL) return true;
3674
3675 /* Scan the directory */
3676 bool result = true;
3677 while (result && (ptr = readdir(dir)) != NULL) {
3678 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
3679 result = false;
3680 }
3681 }
3682 closedir(dir);
3683 return result;
3684 }
3685
3686 // This code originates from JDK's sysOpen and open64_w
3687 // from src/solaris/hpi/src/system_md.c
3688
open(const char * path,int oflag,int mode)3689 int os::open(const char *path, int oflag, int mode) {
3690
3691 if (strlen(path) > MAX_PATH - 1) {
3692 errno = ENAMETOOLONG;
3693 return -1;
3694 }
3695 // AIX 7.X now supports O_CLOEXEC too, like modern Linux; but we have to be careful, see
3696 // IV90804: OPENING A FILE IN AFS WITH O_CLOEXEC FAILS WITH AN EINVAL ERROR APPLIES TO AIX 7100-04 17/04/14 PTF PECHANGE
3697 int oflag_with_o_cloexec = oflag | O_CLOEXEC;
3698
3699 int fd = ::open64(path, oflag_with_o_cloexec, mode);
3700 if (fd == -1) {
3701 // we might fail in the open call when O_CLOEXEC is set, so try again without (see IV90804)
3702 fd = ::open64(path, oflag, mode);
3703 if (fd == -1) {
3704 return -1;
3705 }
3706 }
3707
3708 // If the open succeeded, the file might still be a directory.
3709 {
3710 struct stat64 buf64;
3711 int ret = ::fstat64(fd, &buf64);
3712 int st_mode = buf64.st_mode;
3713
3714 if (ret != -1) {
3715 if ((st_mode & S_IFMT) == S_IFDIR) {
3716 errno = EISDIR;
3717 ::close(fd);
3718 return -1;
3719 }
3720 } else {
3721 ::close(fd);
3722 return -1;
3723 }
3724 }
3725
3726 // All file descriptors that are opened in the JVM and not
3727 // specifically destined for a subprocess should have the
3728 // close-on-exec flag set. If we don't set it, then careless 3rd
3729 // party native code might fork and exec without closing all
3730 // appropriate file descriptors (e.g. as we do in closeDescriptors in
3731 // UNIXProcess.c), and this in turn might:
3732 //
3733 // - cause end-of-file to fail to be detected on some file
3734 // descriptors, resulting in mysterious hangs, or
3735 //
3736 // - might cause an fopen in the subprocess to fail on a system
3737 // suffering from bug 1085341.
3738
3739 // Validate that the use of the O_CLOEXEC flag on open above worked.
3740 static sig_atomic_t O_CLOEXEC_is_known_to_work = 0;
3741 if (O_CLOEXEC_is_known_to_work == 0) {
3742 int flags = ::fcntl(fd, F_GETFD);
3743 if (flags != -1) {
3744 if ((flags & FD_CLOEXEC) != 0) {
3745 O_CLOEXEC_is_known_to_work = 1;
3746 } else { // it does not work
3747 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
3748 O_CLOEXEC_is_known_to_work = -1;
3749 }
3750 }
3751 } else if (O_CLOEXEC_is_known_to_work == -1) {
3752 int flags = ::fcntl(fd, F_GETFD);
3753 if (flags != -1) {
3754 ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
3755 }
3756 }
3757
3758 return fd;
3759 }
3760
3761 // create binary file, rewriting existing file if required
create_binary_file(const char * path,bool rewrite_existing)3762 int os::create_binary_file(const char* path, bool rewrite_existing) {
3763 int oflags = O_WRONLY | O_CREAT;
3764 if (!rewrite_existing) {
3765 oflags |= O_EXCL;
3766 }
3767 return ::open64(path, oflags, S_IREAD | S_IWRITE);
3768 }
3769
3770 // return current position of file pointer
current_file_offset(int fd)3771 jlong os::current_file_offset(int fd) {
3772 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
3773 }
3774
3775 // move file pointer to the specified offset
seek_to_file_offset(int fd,jlong offset)3776 jlong os::seek_to_file_offset(int fd, jlong offset) {
3777 return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
3778 }
3779
3780 // This code originates from JDK's sysAvailable
3781 // from src/solaris/hpi/src/native_threads/src/sys_api_td.c
3782
available(int fd,jlong * bytes)3783 int os::available(int fd, jlong *bytes) {
3784 jlong cur, end;
3785 int mode;
3786 struct stat64 buf64;
3787
3788 if (::fstat64(fd, &buf64) >= 0) {
3789 mode = buf64.st_mode;
3790 if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
3791 int n;
3792 if (::ioctl(fd, FIONREAD, &n) >= 0) {
3793 *bytes = n;
3794 return 1;
3795 }
3796 }
3797 }
3798 if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
3799 return 0;
3800 } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
3801 return 0;
3802 } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
3803 return 0;
3804 }
3805 *bytes = end - cur;
3806 return 1;
3807 }
3808
3809 // Map a block of memory.
pd_map_memory(int fd,const char * file_name,size_t file_offset,char * addr,size_t bytes,bool read_only,bool allow_exec)3810 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
3811 char *addr, size_t bytes, bool read_only,
3812 bool allow_exec) {
3813 int prot;
3814 int flags = MAP_PRIVATE;
3815
3816 if (read_only) {
3817 prot = PROT_READ;
3818 flags = MAP_SHARED;
3819 } else {
3820 prot = PROT_READ | PROT_WRITE;
3821 flags = MAP_PRIVATE;
3822 }
3823
3824 if (allow_exec) {
3825 prot |= PROT_EXEC;
3826 }
3827
3828 if (addr != NULL) {
3829 flags |= MAP_FIXED;
3830 }
3831
3832 // Allow anonymous mappings if 'fd' is -1.
3833 if (fd == -1) {
3834 flags |= MAP_ANONYMOUS;
3835 }
3836
3837 char* mapped_address = (char*)::mmap(addr, (size_t)bytes, prot, flags,
3838 fd, file_offset);
3839 if (mapped_address == MAP_FAILED) {
3840 return NULL;
3841 }
3842 return mapped_address;
3843 }
3844
3845 // Remap a block of memory.
pd_remap_memory(int fd,const char * file_name,size_t file_offset,char * addr,size_t bytes,bool read_only,bool allow_exec)3846 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
3847 char *addr, size_t bytes, bool read_only,
3848 bool allow_exec) {
3849 // same as map_memory() on this OS
3850 return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
3851 allow_exec);
3852 }
3853
3854 // Unmap a block of memory.
pd_unmap_memory(char * addr,size_t bytes)3855 bool os::pd_unmap_memory(char* addr, size_t bytes) {
3856 return munmap(addr, bytes) == 0;
3857 }
3858
3859 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3860 // are used by JVM M&M and JVMTI to get user+sys or user CPU time
3861 // of a thread.
3862 //
3863 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3864 // the fast estimate available on the platform.
3865
current_thread_cpu_time()3866 jlong os::current_thread_cpu_time() {
3867 // return user + sys since the cost is the same
3868 const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */);
3869 assert(n >= 0, "negative CPU time");
3870 return n;
3871 }
3872
thread_cpu_time(Thread * thread)3873 jlong os::thread_cpu_time(Thread* thread) {
3874 // consistent with what current_thread_cpu_time() returns
3875 const jlong n = os::thread_cpu_time(thread, true /* user + sys */);
3876 assert(n >= 0, "negative CPU time");
3877 return n;
3878 }
3879
current_thread_cpu_time(bool user_sys_cpu_time)3880 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3881 const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3882 assert(n >= 0, "negative CPU time");
3883 return n;
3884 }
3885
thread_cpu_time_unchecked(Thread * thread,jlong * p_sys_time,jlong * p_user_time)3886 static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) {
3887 bool error = false;
3888
3889 jlong sys_time = 0;
3890 jlong user_time = 0;
3891
3892 // Reimplemented using getthrds64().
3893 //
3894 // Works like this:
3895 // For the thread in question, get the kernel thread id. Then get the
3896 // kernel thread statistics using that id.
3897 //
3898 // This only works of course when no pthread scheduling is used,
3899 // i.e. there is a 1:1 relationship to kernel threads.
3900 // On AIX, see AIXTHREAD_SCOPE variable.
3901
3902 pthread_t pthtid = thread->osthread()->pthread_id();
3903
3904 // retrieve kernel thread id for the pthread:
3905 tid64_t tid = 0;
3906 struct __pthrdsinfo pinfo;
3907 // I just love those otherworldly IBM APIs which force me to hand down
3908 // dummy buffers for stuff I dont care for...
3909 char dummy[1];
3910 int dummy_size = sizeof(dummy);
3911 if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo),
3912 dummy, &dummy_size) == 0) {
3913 tid = pinfo.__pi_tid;
3914 } else {
3915 tty->print_cr("pthread_getthrds_np failed.");
3916 error = true;
3917 }
3918
3919 // retrieve kernel timing info for that kernel thread
3920 if (!error) {
3921 struct thrdentry64 thrdentry;
3922 if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) {
3923 sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL;
3924 user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL;
3925 } else {
3926 tty->print_cr("pthread_getthrds_np failed.");
3927 error = true;
3928 }
3929 }
3930
3931 if (p_sys_time) {
3932 *p_sys_time = sys_time;
3933 }
3934
3935 if (p_user_time) {
3936 *p_user_time = user_time;
3937 }
3938
3939 if (error) {
3940 return false;
3941 }
3942
3943 return true;
3944 }
3945
thread_cpu_time(Thread * thread,bool user_sys_cpu_time)3946 jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
3947 jlong sys_time;
3948 jlong user_time;
3949
3950 if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) {
3951 return -1;
3952 }
3953
3954 return user_sys_cpu_time ? sys_time + user_time : user_time;
3955 }
3956
current_thread_cpu_time_info(jvmtiTimerInfo * info_ptr)3957 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3958 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
3959 info_ptr->may_skip_backward = false; // elapsed time not wall time
3960 info_ptr->may_skip_forward = false; // elapsed time not wall time
3961 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
3962 }
3963
thread_cpu_time_info(jvmtiTimerInfo * info_ptr)3964 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3965 info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
3966 info_ptr->may_skip_backward = false; // elapsed time not wall time
3967 info_ptr->may_skip_forward = false; // elapsed time not wall time
3968 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned
3969 }
3970
is_thread_cpu_time_supported()3971 bool os::is_thread_cpu_time_supported() {
3972 return true;
3973 }
3974
3975 // System loadavg support. Returns -1 if load average cannot be obtained.
3976 // For now just return the system wide load average (no processor sets).
loadavg(double values[],int nelem)3977 int os::loadavg(double values[], int nelem) {
3978
3979 guarantee(nelem >= 0 && nelem <= 3, "argument error");
3980 guarantee(values, "argument error");
3981
3982 if (os::Aix::on_pase()) {
3983
3984 // AS/400 PASE: use libo4 porting library
3985 double v[3] = { 0.0, 0.0, 0.0 };
3986
3987 if (libo4::get_load_avg(v, v + 1, v + 2)) {
3988 for (int i = 0; i < nelem; i ++) {
3989 values[i] = v[i];
3990 }
3991 return nelem;
3992 } else {
3993 return -1;
3994 }
3995
3996 } else {
3997
3998 // AIX: use libperfstat
3999 libperfstat::cpuinfo_t ci;
4000 if (libperfstat::get_cpuinfo(&ci)) {
4001 for (int i = 0; i < nelem; i++) {
4002 values[i] = ci.loadavg[i];
4003 }
4004 } else {
4005 return -1;
4006 }
4007 return nelem;
4008 }
4009 }
4010
pause()4011 void os::pause() {
4012 char filename[MAX_PATH];
4013 if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4014 jio_snprintf(filename, MAX_PATH, "%s", PauseAtStartupFile);
4015 } else {
4016 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4017 }
4018
4019 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4020 if (fd != -1) {
4021 struct stat buf;
4022 ::close(fd);
4023 while (::stat(filename, &buf) == 0) {
4024 (void)::poll(NULL, 0, 100);
4025 }
4026 } else {
4027 trcVerbose("Could not open pause file '%s', continuing immediately.", filename);
4028 }
4029 }
4030
is_primordial_thread(void)4031 bool os::is_primordial_thread(void) {
4032 if (pthread_self() == (pthread_t)1) {
4033 return true;
4034 } else {
4035 return false;
4036 }
4037 }
4038
4039 // OS recognitions (PASE/AIX, OS level) call this before calling any
4040 // one of Aix::on_pase(), Aix::os_version() static
initialize_os_info()4041 void os::Aix::initialize_os_info() {
4042
4043 assert(_on_pase == -1 && _os_version == 0, "already called.");
4044
4045 struct utsname uts;
4046 memset(&uts, 0, sizeof(uts));
4047 strcpy(uts.sysname, "?");
4048 if (::uname(&uts) == -1) {
4049 trcVerbose("uname failed (%d)", errno);
4050 guarantee(0, "Could not determine whether we run on AIX or PASE");
4051 } else {
4052 trcVerbose("uname says: sysname \"%s\" version \"%s\" release \"%s\" "
4053 "node \"%s\" machine \"%s\"\n",
4054 uts.sysname, uts.version, uts.release, uts.nodename, uts.machine);
4055 const int major = atoi(uts.version);
4056 assert(major > 0, "invalid OS version");
4057 const int minor = atoi(uts.release);
4058 assert(minor > 0, "invalid OS release");
4059 _os_version = (major << 24) | (minor << 16);
4060 char ver_str[20] = {0};
4061 const char* name_str = "unknown OS";
4062 if (strcmp(uts.sysname, "OS400") == 0) {
4063 // We run on AS/400 PASE. We do not support versions older than V5R4M0.
4064 _on_pase = 1;
4065 if (os_version_short() < 0x0504) {
4066 trcVerbose("OS/400 releases older than V5R4M0 not supported.");
4067 assert(false, "OS/400 release too old.");
4068 }
4069 name_str = "OS/400 (pase)";
4070 jio_snprintf(ver_str, sizeof(ver_str), "%u.%u", major, minor);
4071 } else if (strcmp(uts.sysname, "AIX") == 0) {
4072 // We run on AIX. We do not support versions older than AIX 7.1.
4073 _on_pase = 0;
4074 // Determine detailed AIX version: Version, Release, Modification, Fix Level.
4075 odmWrapper::determine_os_kernel_version(&_os_version);
4076 if (os_version_short() < 0x0701) {
4077 trcVerbose("AIX releases older than AIX 7.1 are not supported.");
4078 assert(false, "AIX release too old.");
4079 }
4080 name_str = "AIX";
4081 jio_snprintf(ver_str, sizeof(ver_str), "%u.%u.%u.%u",
4082 major, minor, (_os_version >> 8) & 0xFF, _os_version & 0xFF);
4083 } else {
4084 assert(false, "%s", name_str);
4085 }
4086 trcVerbose("We run on %s %s", name_str, ver_str);
4087 }
4088
4089 guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release");
4090 } // end: os::Aix::initialize_os_info()
4091
4092 // Scan environment for important settings which might effect the VM.
4093 // Trace out settings. Warn about invalid settings and/or correct them.
4094 //
4095 // Must run after os::Aix::initialue_os_info().
scan_environment()4096 void os::Aix::scan_environment() {
4097
4098 char* p;
4099 int rc;
4100
4101 // Warn explicity if EXTSHM=ON is used. That switch changes how
4102 // System V shared memory behaves. One effect is that page size of
4103 // shared memory cannot be change dynamically, effectivly preventing
4104 // large pages from working.
4105 // This switch was needed on AIX 32bit, but on AIX 64bit the general
4106 // recommendation is (in OSS notes) to switch it off.
4107 p = ::getenv("EXTSHM");
4108 trcVerbose("EXTSHM=%s.", p ? p : "<unset>");
4109 if (p && strcasecmp(p, "ON") == 0) {
4110 _extshm = 1;
4111 trcVerbose("*** Unsupported mode! Please remove EXTSHM from your environment! ***");
4112 if (!AllowExtshm) {
4113 // We allow under certain conditions the user to continue. However, we want this
4114 // to be a fatal error by default. On certain AIX systems, leaving EXTSHM=ON means
4115 // that the VM is not able to allocate 64k pages for the heap.
4116 // We do not want to run with reduced performance.
4117 vm_exit_during_initialization("EXTSHM is ON. Please remove EXTSHM from your environment.");
4118 }
4119 } else {
4120 _extshm = 0;
4121 }
4122
4123 // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs.
4124 // Not tested, not supported.
4125 //
4126 // Note that it might be worth the trouble to test and to require it, if only to
4127 // get useful return codes for mprotect.
4128 //
4129 // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before
4130 // exec() ? before loading the libjvm ? ....)
4131 p = ::getenv("XPG_SUS_ENV");
4132 trcVerbose("XPG_SUS_ENV=%s.", p ? p : "<unset>");
4133 if (p && strcmp(p, "ON") == 0) {
4134 _xpg_sus_mode = 1;
4135 trcVerbose("Unsupported setting: XPG_SUS_ENV=ON");
4136 // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to
4137 // clobber address ranges. If we ever want to support that, we have to do some
4138 // testing first.
4139 guarantee(false, "XPG_SUS_ENV=ON not supported");
4140 } else {
4141 _xpg_sus_mode = 0;
4142 }
4143
4144 if (os::Aix::on_pase()) {
4145 p = ::getenv("QIBM_MULTI_THREADED");
4146 trcVerbose("QIBM_MULTI_THREADED=%s.", p ? p : "<unset>");
4147 }
4148
4149 p = ::getenv("LDR_CNTRL");
4150 trcVerbose("LDR_CNTRL=%s.", p ? p : "<unset>");
4151 if (os::Aix::on_pase() && os::Aix::os_version_short() == 0x0701) {
4152 if (p && ::strstr(p, "TEXTPSIZE")) {
4153 trcVerbose("*** WARNING - LDR_CNTRL contains TEXTPSIZE. "
4154 "you may experience hangs or crashes on OS/400 V7R1.");
4155 }
4156 }
4157
4158 p = ::getenv("AIXTHREAD_GUARDPAGES");
4159 trcVerbose("AIXTHREAD_GUARDPAGES=%s.", p ? p : "<unset>");
4160
4161 } // end: os::Aix::scan_environment()
4162
4163 // PASE: initialize the libo4 library (PASE porting library).
initialize_libo4()4164 void os::Aix::initialize_libo4() {
4165 guarantee(os::Aix::on_pase(), "OS/400 only.");
4166 if (!libo4::init()) {
4167 trcVerbose("libo4 initialization failed.");
4168 assert(false, "libo4 initialization failed");
4169 } else {
4170 trcVerbose("libo4 initialized.");
4171 }
4172 }
4173
4174 // AIX: initialize the libperfstat library.
initialize_libperfstat()4175 void os::Aix::initialize_libperfstat() {
4176 assert(os::Aix::on_aix(), "AIX only");
4177 if (!libperfstat::init()) {
4178 trcVerbose("libperfstat initialization failed.");
4179 assert(false, "libperfstat initialization failed");
4180 } else {
4181 trcVerbose("libperfstat initialized.");
4182 }
4183 }
4184
4185 /////////////////////////////////////////////////////////////////////////////
4186 // thread stack
4187
4188 // Get the current stack base from the OS (actually, the pthread library).
4189 // Note: usually not page aligned.
current_stack_base()4190 address os::current_stack_base() {
4191 AixMisc::stackbounds_t bounds;
4192 bool rc = AixMisc::query_stack_bounds_for_current_thread(&bounds);
4193 guarantee(rc, "Unable to retrieve stack bounds.");
4194 return bounds.base;
4195 }
4196
4197 // Get the current stack size from the OS (actually, the pthread library).
4198 // Returned size is such that (base - size) is always aligned to page size.
current_stack_size()4199 size_t os::current_stack_size() {
4200 AixMisc::stackbounds_t bounds;
4201 bool rc = AixMisc::query_stack_bounds_for_current_thread(&bounds);
4202 guarantee(rc, "Unable to retrieve stack bounds.");
4203 // Align the returned stack size such that the stack low address
4204 // is aligned to page size (Note: base is usually not and we do not care).
4205 // We need to do this because caller code will assume stack low address is
4206 // page aligned and will place guard pages without checking.
4207 address low = bounds.base - bounds.size;
4208 address low_aligned = (address)align_up(low, os::vm_page_size());
4209 size_t s = bounds.base - low_aligned;
4210 return s;
4211 }
4212
4213 extern char** environ;
4214
4215 // Run the specified command in a separate process. Return its exit value,
4216 // or -1 on failure (e.g. can't fork a new process).
4217 // Unlike system(), this function can be called from signal handler. It
4218 // doesn't block SIGINT et al.
fork_and_exec(char * cmd,bool use_vfork_if_available)4219 int os::fork_and_exec(char* cmd, bool use_vfork_if_available) {
4220 char* argv[4] = { (char*)"sh", (char*)"-c", cmd, NULL};
4221
4222 pid_t pid = fork();
4223
4224 if (pid < 0) {
4225 // fork failed
4226 return -1;
4227
4228 } else if (pid == 0) {
4229 // child process
4230
4231 // Try to be consistent with system(), which uses "/usr/bin/sh" on AIX.
4232 execve("/usr/bin/sh", argv, environ);
4233
4234 // execve failed
4235 _exit(-1);
4236
4237 } else {
4238 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
4239 // care about the actual exit code, for now.
4240
4241 int status;
4242
4243 // Wait for the child process to exit. This returns immediately if
4244 // the child has already exited. */
4245 while (waitpid(pid, &status, 0) < 0) {
4246 switch (errno) {
4247 case ECHILD: return 0;
4248 case EINTR: break;
4249 default: return -1;
4250 }
4251 }
4252
4253 if (WIFEXITED(status)) {
4254 // The child exited normally; get its exit code.
4255 return WEXITSTATUS(status);
4256 } else if (WIFSIGNALED(status)) {
4257 // The child exited because of a signal.
4258 // The best value to return is 0x80 + signal number,
4259 // because that is what all Unix shells do, and because
4260 // it allows callers to distinguish between process exit and
4261 // process death by signal.
4262 return 0x80 + WTERMSIG(status);
4263 } else {
4264 // Unknown exit code; pass it through.
4265 return status;
4266 }
4267 }
4268 return -1;
4269 }
4270
4271 // Get the default path to the core file
4272 // Returns the length of the string
get_core_path(char * buffer,size_t bufferSize)4273 int os::get_core_path(char* buffer, size_t bufferSize) {
4274 const char* p = get_current_directory(buffer, bufferSize);
4275
4276 if (p == NULL) {
4277 assert(p != NULL, "failed to get current directory");
4278 return 0;
4279 }
4280
4281 jio_snprintf(buffer, bufferSize, "%s/core or core.%d",
4282 p, current_process_id());
4283
4284 return strlen(buffer);
4285 }
4286
4287 #ifndef PRODUCT
TestReserveMemorySpecial_test()4288 void TestReserveMemorySpecial_test() {
4289 // No tests available for this platform
4290 }
4291 #endif
4292
start_debugging(char * buf,int buflen)4293 bool os::start_debugging(char *buf, int buflen) {
4294 int len = (int)strlen(buf);
4295 char *p = &buf[len];
4296
4297 jio_snprintf(p, buflen -len,
4298 "\n\n"
4299 "Do you want to debug the problem?\n\n"
4300 "To debug, run 'dbx -a %d'; then switch to thread tid " INTX_FORMAT ", k-tid " INTX_FORMAT "\n"
4301 "Enter 'yes' to launch dbx automatically (PATH must include dbx)\n"
4302 "Otherwise, press RETURN to abort...",
4303 os::current_process_id(),
4304 os::current_thread_id(), thread_self());
4305
4306 bool yes = os::message_box("Unexpected Error", buf);
4307
4308 if (yes) {
4309 // yes, user asked VM to launch debugger
4310 jio_snprintf(buf, buflen, "dbx -a %d", os::current_process_id());
4311
4312 os::fork_and_exec(buf);
4313 yes = false;
4314 }
4315 return yes;
4316 }
4317
get_mtime(const char * filename)4318 static inline time_t get_mtime(const char* filename) {
4319 struct stat st;
4320 int ret = os::stat(filename, &st);
4321 assert(ret == 0, "failed to stat() file '%s': %s", filename, os::strerror(errno));
4322 return st.st_mtime;
4323 }
4324
compare_file_modified_times(const char * file1,const char * file2)4325 int os::compare_file_modified_times(const char* file1, const char* file2) {
4326 time_t t1 = get_mtime(file1);
4327 time_t t2 = get_mtime(file2);
4328 return t1 - t2;
4329 }
4330
supports_map_sync()4331 bool os::supports_map_sync() {
4332 return false;
4333 }
4334