hotspot/src/os/aix/vm/os_aix.cpp
author coleenp
Wed, 22 Jul 2015 00:03:45 -0400
changeset 31963 641ed52732ec
parent 31850 cee76595e1bb
child 32080 9d2ace436482
permissions -rw-r--r--
8026324: hs_err improvement: Add summary section to hs_err file 8026333: hs_err improvement: Print GC Strategy 8026336: hs_err improvement: Print compilation mode, server, client or tiered Summary: Added command line, summary cpu and os information to summary section. Moved time of crash and duration in summary section. Add GC strategy and compiler setting (tiered) to enhanced version string in error report. Moved the stack trace sooner in hs_err file. Reviewed-by: dholmes, ctornqvi, ddmitriev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     1
/*
28737
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
     2
 * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
     3
 * Copyright 2012, 2015 SAP AG. All rights reserved.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     5
 *
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     8
 * published by the Free Software Foundation.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
     9
 *
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    14
 * accompanied this code).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    15
 *
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    19
 *
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    22
 * questions.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    23
 *
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    24
 */
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    25
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    26
// According to the AIX OS doc #pragma alloca must be used
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    27
// with C++ compiler before referencing the function alloca()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    28
#pragma alloca
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    29
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    30
// no precompiled headers
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    31
#include "classfile/classLoader.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    32
#include "classfile/systemDictionary.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    33
#include "classfile/vmSymbols.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    34
#include "code/icBuffer.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    35
#include "code/vtableStubs.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    36
#include "compiler/compileBroker.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    37
#include "interpreter/interpreter.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    38
#include "jvm_aix.h"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    39
#include "libperfstat_aix.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    40
#include "loadlib_aix.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    41
#include "memory/allocation.inline.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    42
#include "memory/filemap.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    43
#include "mutex_aix.inline.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    44
#include "oops/oop.inline.hpp"
25468
5331df506290 8048241: Introduce umbrella header os.inline.hpp and clean up includes
goetz
parents: 25354
diff changeset
    45
#include "os_aix.inline.hpp"
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    46
#include "os_share_aix.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    47
#include "porting_aix.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    48
#include "prims/jniFastGetField.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    49
#include "prims/jvm.h"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    50
#include "prims/jvm_misc.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    51
#include "runtime/arguments.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 24931
diff changeset
    52
#include "runtime/atomic.inline.hpp"
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    53
#include "runtime/extendedPC.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    54
#include "runtime/globals.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    55
#include "runtime/interfaceSupport.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    56
#include "runtime/java.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    57
#include "runtime/javaCalls.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    58
#include "runtime/mutexLocker.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    59
#include "runtime/objectMonitor.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 23865
diff changeset
    60
#include "runtime/orderAccess.inline.hpp"
25949
34557722059b 6424123: JVM crashes on failed 'strdup' call
zgu
parents: 25719
diff changeset
    61
#include "runtime/os.hpp"
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    62
#include "runtime/osThread.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    63
#include "runtime/perfMemory.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    64
#include "runtime/sharedRuntime.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    65
#include "runtime/statSampler.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    66
#include "runtime/stubRoutines.hpp"
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
    67
#include "runtime/thread.inline.hpp"
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    68
#include "runtime/threadCritical.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    69
#include "runtime/timer.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 25468
diff changeset
    70
#include "runtime/vm_version.hpp"
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    71
#include "services/attachListener.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    72
#include "services/runtimeService.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    73
#include "utilities/decoder.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    74
#include "utilities/defaultStream.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    75
#include "utilities/events.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    76
#include "utilities/growableArray.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    77
#include "utilities/vmError.hpp"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    78
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    79
// put OS-includes here (sorted alphabetically)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    80
#include <errno.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    81
#include <fcntl.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    82
#include <inttypes.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    83
#include <poll.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    84
#include <procinfo.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    85
#include <pthread.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    86
#include <pwd.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    87
#include <semaphore.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    88
#include <signal.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    89
#include <stdint.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    90
#include <stdio.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    91
#include <string.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    92
#include <unistd.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    93
#include <sys/ioctl.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    94
#include <sys/ipc.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    95
#include <sys/mman.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    96
#include <sys/resource.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    97
#include <sys/select.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    98
#include <sys/shm.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
    99
#include <sys/socket.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   100
#include <sys/stat.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   101
#include <sys/sysinfo.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   102
#include <sys/systemcfg.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   103
#include <sys/time.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   104
#include <sys/times.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   105
#include <sys/types.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   106
#include <sys/utsname.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   107
#include <sys/vminfo.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   108
#include <sys/wait.h>
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   109
27668
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   110
// If RUSAGE_THREAD for getrusage() has not been defined, do it here. The code calling
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   111
// getrusage() is prepared to handle the associated failure.
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   112
#ifndef RUSAGE_THREAD
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   113
#define RUSAGE_THREAD   (1)               /* only the calling thread */
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   114
#endif
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
   115
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   116
// PPC port
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   117
static const uintx Use64KPagesThreshold       = 1*M;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   118
static const uintx MaxExpectedDataSegmentSize = SIZE_4G*2;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   119
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   120
// Add missing declarations (should be in procinfo.h but isn't until AIX 6.1).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   121
#if !defined(_AIXVERSION_610)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   122
extern "C" {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   123
  int getthrds64(pid_t ProcessIdentifier,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   124
                 struct thrdentry64* ThreadBuffer,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   125
                 int ThreadSize,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   126
                 tid64_t* IndexPointer,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   127
                 int Count);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   128
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   129
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   130
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   131
#define MAX_PATH (2 * K)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   132
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   133
// for timer info max values which include all bits
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   134
#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   135
// for multipage initialization error analysis (in 'g_multipage_error')
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   136
#define ERROR_MP_OS_TOO_OLD                          100
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   137
#define ERROR_MP_EXTSHM_ACTIVE                       101
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   138
#define ERROR_MP_VMGETINFO_FAILED                    102
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   139
#define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   140
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   141
// The semantics in this file are thus that codeptr_t is a *real code ptr*.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   142
// This means that any function taking codeptr_t as arguments will assume
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   143
// a real codeptr and won't handle function descriptors (eg getFuncName),
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   144
// whereas functions taking address as args will deal with function
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   145
// descriptors (eg os::dll_address_to_library_name).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   146
typedef unsigned int* codeptr_t;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   147
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   148
// Typedefs for stackslots, stack pointers, pointers to op codes.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   149
typedef unsigned long stackslot_t;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   150
typedef stackslot_t* stackptr_t;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   151
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   152
// Excerpts from systemcfg.h definitions newer than AIX 5.3.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   153
#ifndef PV_7
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   154
#define PV_7 0x200000          /* Power PC 7 */
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   155
#define PV_7_Compat 0x208000   /* Power PC 7 */
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   156
#endif
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   157
#ifndef PV_8
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   158
#define PV_8 0x300000          /* Power PC 8 */
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   159
#define PV_8_Compat 0x308000   /* Power PC 8 */
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   160
#endif
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   161
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   162
#define trcVerbose(fmt, ...) { /* PPC port */  \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   163
  if (Verbose) { \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   164
    fprintf(stderr, fmt, ##__VA_ARGS__); \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   165
    fputc('\n', stderr); fflush(stderr); \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   166
  } \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   167
}
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   168
#define trc(fmt, ...)        /* PPC port */
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   169
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   170
#define ERRBYE(s) { \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   171
    trcVerbose(s); \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   172
    return -1; \
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   173
}
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   174
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   175
// Query dimensions of the stack of the calling thread.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   176
static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   177
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   178
// function to check a given stack pointer against given stack limits
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   179
inline bool is_valid_stackpointer(stackptr_t sp, stackptr_t stack_base, size_t stack_size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   180
  if (((uintptr_t)sp) & 0x7) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   181
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   182
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   183
  if (sp > stack_base) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   184
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   185
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   186
  if (sp < (stackptr_t) ((address)stack_base - stack_size)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   187
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   188
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   189
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   190
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   191
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   192
// returns true if function is a valid codepointer
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   193
inline bool is_valid_codepointer(codeptr_t p) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   194
  if (!p) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   195
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   196
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   197
  if (((uintptr_t)p) & 0x3) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   198
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   199
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   200
  if (LoadedLibraries::find_for_text_address((address)p) == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   201
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   202
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   203
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   204
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   205
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   206
// Macro to check a given stack pointer against given stack limits and to die if test fails.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   207
#define CHECK_STACK_PTR(sp, stack_base, stack_size) { \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   208
    guarantee(is_valid_stackpointer((stackptr_t)(sp), (stackptr_t)(stack_base), stack_size), "Stack Pointer Invalid"); \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   209
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   210
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   211
// Macro to check the current stack pointer against given stacklimits.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   212
#define CHECK_CURRENT_STACK_PTR(stack_base, stack_size) { \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   213
  address sp; \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   214
  sp = os::current_stack_pointer(); \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   215
  CHECK_STACK_PTR(sp, stack_base, stack_size); \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   216
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   217
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   218
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   219
// global variables (for a description see os_aix.hpp)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   220
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   221
julong    os::Aix::_physical_memory = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   222
pthread_t os::Aix::_main_thread = ((pthread_t)0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   223
int       os::Aix::_page_size = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   224
int       os::Aix::_on_pase = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   225
int       os::Aix::_os_version = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   226
int       os::Aix::_stack_page_size = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   227
int       os::Aix::_xpg_sus_mode = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   228
int       os::Aix::_extshm = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   229
int       os::Aix::_logical_cpus = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   230
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   231
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   232
// local variables
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   233
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   234
static int      g_multipage_error  = -1;   // error analysis for multipage initialization
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   235
static jlong    initial_time_count = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   236
static int      clock_tics_per_sec = 100;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   237
static sigset_t check_signal_done;         // For diagnostics to print a message once (see run_periodic_checks)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   238
static bool     check_signals      = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   239
static pid_t    _initial_pid       = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   240
static int      SR_signum          = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   241
static sigset_t SR_sigset;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   242
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   243
// This describes the state of multipage support of the underlying
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   244
// OS. Note that this is of no interest to the outsize world and
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   245
// therefore should not be defined in AIX class.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   246
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   247
// AIX supports four different page sizes - 4K, 64K, 16MB, 16GB. The
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   248
// latter two (16M "large" resp. 16G "huge" pages) require special
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   249
// setup and are normally not available.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   250
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   251
// AIX supports multiple page sizes per process, for:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   252
//  - Stack (of the primordial thread, so not relevant for us)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   253
//  - Data - data, bss, heap, for us also pthread stacks
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   254
//  - Text - text code
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   255
//  - shared memory
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   256
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   257
// Default page sizes can be set via linker options (-bdatapsize, -bstacksize, ...)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   258
// and via environment variable LDR_CNTRL (DATAPSIZE, STACKPSIZE, ...).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   259
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   260
// For shared memory, page size can be set dynamically via
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   261
// shmctl(). Different shared memory regions can have different page
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   262
// sizes.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   263
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   264
// More information can be found at AIBM info center:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   265
//   http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   266
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   267
static struct {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   268
  size_t pagesize;            // sysconf _SC_PAGESIZE (4K)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   269
  size_t datapsize;           // default data page size (LDR_CNTRL DATAPSIZE)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   270
  size_t shmpsize;            // default shared memory page size (LDR_CNTRL SHMPSIZE)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   271
  size_t pthr_stack_pagesize; // stack page size of pthread threads
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   272
  size_t textpsize;           // default text page size (LDR_CNTRL STACKPSIZE)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   273
  bool can_use_64K_pages;     // True if we can alloc 64K pages dynamically with Sys V shm.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   274
  bool can_use_16M_pages;     // True if we can alloc 16M pages dynamically with Sys V shm.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   275
  int error;                  // Error describing if something went wrong at multipage init.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   276
} g_multipage_support = {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   277
  (size_t) -1,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   278
  (size_t) -1,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   279
  (size_t) -1,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   280
  (size_t) -1,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   281
  (size_t) -1,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   282
  false, false,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   283
  0
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   284
};
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   285
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   286
// We must not accidentally allocate memory close to the BRK - even if
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   287
// that would work - because then we prevent the BRK segment from
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   288
// growing which may result in a malloc OOM even though there is
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   289
// enough memory. The problem only arises if we shmat() or mmap() at
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   290
// a specific wish address, e.g. to place the heap in a
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   291
// compressed-oops-friendly way.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   292
static bool is_close_to_brk(address a) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   293
  address a1 = (address) sbrk(0);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   294
  if (a >= a1 && a < (a1 + MaxExpectedDataSegmentSize)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   295
    return true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   296
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   297
  return false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   298
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   299
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   300
julong os::available_memory() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   301
  return Aix::available_memory();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   302
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   303
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   304
julong os::Aix::available_memory() {
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   305
  os::Aix::meminfo_t mi;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   306
  if (os::Aix::get_meminfo(&mi)) {
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   307
    return mi.real_free;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   308
  } else {
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   309
    return 0xFFFFFFFFFFFFFFFFLL;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
   310
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   311
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   312
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   313
julong os::physical_memory() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   314
  return Aix::physical_memory();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   315
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   316
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   317
// Return true if user is running as root.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   318
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   319
bool os::have_special_privileges() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   320
  static bool init = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   321
  static bool privileges = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   322
  if (!init) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   323
    privileges = (getuid() != geteuid()) || (getgid() != getegid());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   324
    init = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   325
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   326
  return privileges;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   327
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   328
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   329
// Helper function, emulates disclaim64 using multiple 32bit disclaims
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   330
// because we cannot use disclaim64() on AS/400 and old AIX releases.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   331
static bool my_disclaim64(char* addr, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   332
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   333
  if (size == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   334
    return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   335
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   336
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   337
  // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.)
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   338
  const unsigned int maxDisclaimSize = 0x40000000;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   339
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   340
  const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   341
  const unsigned int lastDisclaimSize = (size % maxDisclaimSize);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   342
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   343
  char* p = addr;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   344
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   345
  for (int i = 0; i < numFullDisclaimsNeeded; i ++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   346
    if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   347
      trc("Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   348
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   349
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   350
    p += maxDisclaimSize;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   351
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   352
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   353
  if (lastDisclaimSize > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   354
    if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   355
      trc("Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   356
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   357
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   358
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   359
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   360
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   361
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   362
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   363
// Cpu architecture string
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   364
#if defined(PPC32)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   365
static char cpu_arch[] = "ppc";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   366
#elif defined(PPC64)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   367
static char cpu_arch[] = "ppc64";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   368
#else
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   369
#error Add appropriate cpu_arch setting
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   370
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   371
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   372
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   373
// Given an address, returns the size of the page backing that address.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   374
size_t os::Aix::query_pagesize(void* addr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   375
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   376
  vm_page_info pi;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   377
  pi.addr = (uint64_t)addr;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   378
  if (::vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   379
    return pi.pagesize;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   380
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   381
    fprintf(stderr, "vmgetinfo failed to retrieve page size for address %p (errno %d).\n", addr, errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   382
    assert(false, "vmgetinfo failed to retrieve page size");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   383
    return SIZE_4K;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   384
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   385
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   386
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   387
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   388
// Returns the kernel thread id of the currently running thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   389
pid_t os::Aix::gettid() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   390
  return (pid_t) thread_self();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   391
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   392
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   393
void os::Aix::initialize_system_info() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   394
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   395
  // Get the number of online(logical) cpus instead of configured.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   396
  os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   397
  assert(_processor_count > 0, "_processor_count must be > 0");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   398
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   399
  // Retrieve total physical storage.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   400
  os::Aix::meminfo_t mi;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   401
  if (!os::Aix::get_meminfo(&mi)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   402
    fprintf(stderr, "os::Aix::get_meminfo failed.\n"); fflush(stderr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   403
    assert(false, "os::Aix::get_meminfo failed.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   404
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   405
  _physical_memory = (julong) mi.real_total;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   406
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   407
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   408
// Helper function for tracing page sizes.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   409
static const char* describe_pagesize(size_t pagesize) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   410
  switch (pagesize) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   411
    case SIZE_4K : return "4K";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   412
    case SIZE_64K: return "64K";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   413
    case SIZE_16M: return "16M";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   414
    case SIZE_16G: return "16G";
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   415
    case -1:       return "not set";
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   416
    default:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   417
      assert(false, "surprise");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   418
      return "??";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   419
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   420
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   421
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   422
// Probe OS for multipage support.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   423
// Will fill the global g_multipage_support structure.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   424
// Must be called before calling os::large_page_init().
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   425
static void query_multipage_support() {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   426
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   427
  guarantee(g_multipage_support.pagesize == -1,
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   428
            "do not call twice");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   429
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   430
  g_multipage_support.pagesize = ::sysconf(_SC_PAGESIZE);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   431
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   432
  // This really would surprise me.
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   433
  assert(g_multipage_support.pagesize == SIZE_4K, "surprise!");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   434
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   435
  // Query default data page size (default page size for C-Heap, pthread stacks and .bss).
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   436
  // Default data page size is defined either by linker options (-bdatapsize)
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   437
  // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   438
  // default should be 4K.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   439
  {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   440
    void* p = ::malloc(SIZE_16M);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   441
    g_multipage_support.datapsize = os::Aix::query_pagesize(p);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   442
    ::free(p);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   443
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   444
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   445
  // Query default shm page size (LDR_CNTRL SHMPSIZE).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   446
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   447
    const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   448
    guarantee(shmid != -1, "shmget failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   449
    void* p = ::shmat(shmid, NULL, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   450
    ::shmctl(shmid, IPC_RMID, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   451
    guarantee(p != (void*) -1, "shmat failed");
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   452
    g_multipage_support.shmpsize = os::Aix::query_pagesize(p);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   453
    ::shmdt(p);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   454
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   455
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   456
  // Before querying the stack page size, make sure we are not running as primordial
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   457
  // thread (because primordial thread's stack may have different page size than
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   458
  // pthread thread stacks). Running a VM on the primordial thread won't work for a
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   459
  // number of reasons so we may just as well guarantee it here.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   460
  guarantee0(!os::Aix::is_primordial_thread());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   461
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   462
  // Query pthread stack page size.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   463
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   464
    int dummy = 0;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   465
    g_multipage_support.pthr_stack_pagesize = os::Aix::query_pagesize(&dummy);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   466
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   467
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   468
  // Query default text page size (LDR_CNTRL TEXTPSIZE).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   469
  /* PPC port: so far unused.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   470
  {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   471
    address any_function =
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   472
      (address) resolve_function_descriptor_to_code_pointer((address)describe_pagesize);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   473
    g_multipage_support.textpsize = os::Aix::query_pagesize(any_function);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   474
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   475
  */
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   476
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   477
  // Now probe for support of 64K pages and 16M pages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   478
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   479
  // Before OS/400 V6R1, there is no support for pages other than 4K.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   480
  if (os::Aix::on_pase_V5R4_or_older()) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   481
    Unimplemented();
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   482
    goto query_multipage_support_end;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   483
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   484
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   485
  // Now check which page sizes the OS claims it supports, and of those, which actually can be used.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   486
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   487
    const int MAX_PAGE_SIZES = 4;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   488
    psize_t sizes[MAX_PAGE_SIZES];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   489
    const int num_psizes = ::vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   490
    if (num_psizes == -1) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   491
      trc("vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)\n", errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   492
      trc("disabling multipage support.\n");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   493
      g_multipage_support.error = ERROR_MP_VMGETINFO_FAILED;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   494
      goto query_multipage_support_end;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   495
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   496
    guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   497
    assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?");
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   498
    trcVerbose("vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   499
    for (int i = 0; i < num_psizes; i ++) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   500
      trcVerbose(" %s ", describe_pagesize(sizes[i]));
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   501
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   502
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   503
    // Can we use 64K, 16M pages?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   504
    for (int i = 0; i < num_psizes; i ++) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   505
      const size_t pagesize = sizes[i];
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   506
      if (pagesize != SIZE_64K && pagesize != SIZE_16M) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   507
        continue;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   508
      }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   509
      bool can_use = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   510
      trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   511
      const int shmid = ::shmget(IPC_PRIVATE, pagesize,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   512
        IPC_CREAT | S_IRUSR | S_IWUSR);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   513
      guarantee0(shmid != -1); // Should always work.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   514
      // Try to set pagesize.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   515
      struct shmid_ds shm_buf = { 0 };
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   516
      shm_buf.shm_pagesize = pagesize;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   517
      if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   518
        const int en = errno;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   519
        ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   520
        // PPC port trcVerbose("shmctl(SHM_PAGESIZE) failed with %s",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   521
        // PPC port  MiscUtils::describe_errno(en));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   522
      } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   523
        // Attach and double check pageisze.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   524
        void* p = ::shmat(shmid, NULL, 0);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   525
        ::shmctl(shmid, IPC_RMID, NULL); // As early as possible!
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   526
        guarantee0(p != (void*) -1); // Should always work.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   527
        const size_t real_pagesize = os::Aix::query_pagesize(p);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   528
        if (real_pagesize != pagesize) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   529
          trcVerbose("real page size (0x%llX) differs.", real_pagesize);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   530
        } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   531
          can_use = true;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   532
        }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   533
        ::shmdt(p);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   534
      }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   535
      trcVerbose("Can use: %s", (can_use ? "yes" : "no"));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   536
      if (pagesize == SIZE_64K) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   537
        g_multipage_support.can_use_64K_pages = can_use;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   538
      } else if (pagesize == SIZE_16M) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   539
        g_multipage_support.can_use_16M_pages = can_use;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   540
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   541
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   542
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   543
  } // end: check which pages can be used for shared memory
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   544
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   545
query_multipage_support_end:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   546
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   547
  trcVerbose("base page size (sysconf _SC_PAGESIZE): %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   548
      describe_pagesize(g_multipage_support.pagesize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   549
  trcVerbose("Data page size (C-Heap, bss, etc): %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   550
      describe_pagesize(g_multipage_support.datapsize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   551
  trcVerbose("Text page size: %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   552
      describe_pagesize(g_multipage_support.textpsize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   553
  trcVerbose("Thread stack page size (pthread): %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   554
      describe_pagesize(g_multipage_support.pthr_stack_pagesize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   555
  trcVerbose("Default shared memory page size: %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   556
      describe_pagesize(g_multipage_support.shmpsize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   557
  trcVerbose("Can use 64K pages dynamically with shared meory: %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   558
      (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   559
  trcVerbose("Can use 16M pages dynamically with shared memory: %s\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   560
      (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   561
  trcVerbose("Multipage error details: %d\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   562
      g_multipage_support.error);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   563
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   564
  // sanity checks
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   565
  assert0(g_multipage_support.pagesize == SIZE_4K);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   566
  assert0(g_multipage_support.datapsize == SIZE_4K || g_multipage_support.datapsize == SIZE_64K);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   567
  // PPC port: so far unused.assert0(g_multipage_support.textpsize == SIZE_4K || g_multipage_support.textpsize == SIZE_64K);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   568
  assert0(g_multipage_support.pthr_stack_pagesize == g_multipage_support.datapsize);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
   569
  assert0(g_multipage_support.shmpsize == SIZE_4K || g_multipage_support.shmpsize == SIZE_64K);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   570
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   571
} // end os::Aix::query_multipage_support()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   572
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   573
void os::init_system_properties_values() {
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   574
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   575
#define DEFAULT_LIBPATH "/usr/lib:/lib"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   576
#define EXTENSIONS_DIR  "/lib/ext"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   577
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   578
  // Buffer that fits several sprintfs.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   579
  // Note that the space for the trailing null is provided
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   580
  // by the nulls included by the sizeof operator.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   581
  const size_t bufsize =
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   582
    MAX2((size_t)MAXPATHLEN,  // For dll_dir & friends.
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
   583
         (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR)); // extensions dir
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   584
  char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   585
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   586
  // sysclasspath, java_home, dll_dir
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   587
  {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   588
    char *pslash;
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   589
    os::jvm_path(buf, bufsize);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   590
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   591
    // Found the full path to libjvm.so.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   592
    // Now cut the path to <java_home>/jre if we can.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   593
    *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   594
    pslash = strrchr(buf, '/');
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   595
    if (pslash != NULL) {
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   596
      *pslash = '\0';            // Get rid of /{client|server|hotspot}.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   597
    }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   598
    Arguments::set_dll_dir(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   599
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   600
    if (pslash != NULL) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   601
      pslash = strrchr(buf, '/');
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   602
      if (pslash != NULL) {
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   603
        *pslash = '\0';          // Get rid of /<arch>.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   604
        pslash = strrchr(buf, '/');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   605
        if (pslash != NULL) {
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   606
          *pslash = '\0';        // Get rid of /lib.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   607
        }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   608
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   609
    }
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   610
    Arguments::set_java_home(buf);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   611
    set_boot_path('/', ':');
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   612
  }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   613
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   614
  // Where to look for native libraries.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   615
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   616
  // On Aix we get the user setting of LIBPATH.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   617
  // Eventually, all the library path setting will be done here.
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   618
  // Get the user setting of LIBPATH.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   619
  const char *v = ::getenv("LIBPATH");
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   620
  const char *v_colon = ":";
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   621
  if (v == NULL) { v = ""; v_colon = ""; }
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   622
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   623
  // Concatenate user and invariant part of ld_library_path.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   624
  // That's +1 for the colon and +1 for the trailing '\0'.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   625
  char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   626
  sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   627
  Arguments::set_library_path(ld_library_path);
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27668
diff changeset
   628
  FREE_C_HEAP_ARRAY(char, ld_library_path);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   629
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   630
  // Extensions directories.
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   631
  sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   632
  Arguments::set_ext_dirs(buf);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   633
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27668
diff changeset
   634
  FREE_C_HEAP_ARRAY(char, buf);
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23500
diff changeset
   635
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   636
#undef DEFAULT_LIBPATH
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   637
#undef EXTENSIONS_DIR
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   638
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   639
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   640
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   641
// breakpoint support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   642
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   643
void os::breakpoint() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   644
  BREAKPOINT;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   645
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   646
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   647
extern "C" void breakpoint() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   648
  // use debugger to set breakpoint here
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   649
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   650
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   651
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   652
// signal support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   653
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   654
debug_only(static bool signal_sets_initialized = false);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   655
static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   656
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   657
bool os::Aix::is_sig_ignored(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   658
  struct sigaction oact;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   659
  sigaction(sig, (struct sigaction*)NULL, &oact);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   660
  void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   661
    : CAST_FROM_FN_PTR(void*, oact.sa_handler);
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   662
  if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   663
    return true;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   664
  } else {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   665
    return false;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   666
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   667
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   668
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   669
void os::Aix::signal_sets_init() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   670
  // Should also have an assertion stating we are still single-threaded.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   671
  assert(!signal_sets_initialized, "Already initialized");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   672
  // Fill in signals that are necessarily unblocked for all threads in
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   673
  // the VM. Currently, we unblock the following signals:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   674
  // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   675
  //                         by -Xrs (=ReduceSignalUsage));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   676
  // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   677
  // other threads. The "ReduceSignalUsage" boolean tells us not to alter
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   678
  // the dispositions or masks wrt these signals.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   679
  // Programs embedding the VM that want to use the above signals for their
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   680
  // own purposes must, at this time, use the "-Xrs" option to prevent
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   681
  // interference with shutdown hooks and BREAK_SIGNAL thread dumping.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   682
  // (See bug 4345157, and other related bugs).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   683
  // In reality, though, unblocking these signals is really a nop, since
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   684
  // these signals are not blocked by default.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   685
  sigemptyset(&unblocked_sigs);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   686
  sigemptyset(&allowdebug_blocked_sigs);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   687
  sigaddset(&unblocked_sigs, SIGILL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   688
  sigaddset(&unblocked_sigs, SIGSEGV);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   689
  sigaddset(&unblocked_sigs, SIGBUS);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   690
  sigaddset(&unblocked_sigs, SIGFPE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   691
  sigaddset(&unblocked_sigs, SIGTRAP);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   692
  sigaddset(&unblocked_sigs, SIGDANGER);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   693
  sigaddset(&unblocked_sigs, SR_signum);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   694
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   695
  if (!ReduceSignalUsage) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   696
   if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   697
     sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   698
     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   699
   }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   700
   if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   701
     sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   702
     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   703
   }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   704
   if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   705
     sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   706
     sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   707
   }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   708
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   709
  // Fill in signals that are blocked by all but the VM thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   710
  sigemptyset(&vm_sigs);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   711
  if (!ReduceSignalUsage)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   712
    sigaddset(&vm_sigs, BREAK_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   713
  debug_only(signal_sets_initialized = true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   714
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   715
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   716
// These are signals that are unblocked while a thread is running Java.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   717
// (For some reason, they get blocked by default.)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   718
sigset_t* os::Aix::unblocked_signals() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   719
  assert(signal_sets_initialized, "Not initialized");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   720
  return &unblocked_sigs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   721
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   722
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   723
// These are the signals that are blocked while a (non-VM) thread is
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   724
// running Java. Only the VM thread handles these signals.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   725
sigset_t* os::Aix::vm_signals() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   726
  assert(signal_sets_initialized, "Not initialized");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   727
  return &vm_sigs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   728
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   729
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   730
// These are signals that are blocked during cond_wait to allow debugger in
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   731
sigset_t* os::Aix::allowdebug_blocked_signals() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   732
  assert(signal_sets_initialized, "Not initialized");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   733
  return &allowdebug_blocked_sigs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   734
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   735
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   736
void os::Aix::hotspot_sigmask(Thread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   737
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   738
  //Save caller's signal mask before setting VM signal mask
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   739
  sigset_t caller_sigmask;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   740
  pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   741
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   742
  OSThread* osthread = thread->osthread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   743
  osthread->set_caller_sigmask(caller_sigmask);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   744
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   745
  pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   746
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   747
  if (!ReduceSignalUsage) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   748
    if (thread->is_VM_thread()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   749
      // Only the VM thread handles BREAK_SIGNAL ...
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   750
      pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   751
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   752
      // ... all other threads block BREAK_SIGNAL
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   753
      pthread_sigmask(SIG_BLOCK, vm_signals(), NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   754
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   755
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   756
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   757
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   758
// retrieve memory information.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   759
// Returns false if something went wrong;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   760
// content of pmi undefined in this case.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   761
bool os::Aix::get_meminfo(meminfo_t* pmi) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   762
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   763
  assert(pmi, "get_meminfo: invalid parameter");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   764
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   765
  memset(pmi, 0, sizeof(meminfo_t));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   766
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   767
  if (os::Aix::on_pase()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   768
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   769
    Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   770
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   771
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   772
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   773
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   774
    // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   775
    // See:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   776
    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   777
    //        ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   778
    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   779
    //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   780
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   781
    perfstat_memory_total_t psmt;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   782
    memset (&psmt, '\0', sizeof(psmt));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   783
    const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   784
    if (rc == -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   785
      fprintf(stderr, "perfstat_memory_total() failed (errno=%d)\n", errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   786
      assert(0, "perfstat_memory_total() failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   787
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   788
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   789
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   790
    assert(rc == 1, "perfstat_memory_total() - weird return code");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   791
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   792
    // excerpt from
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   793
    // http://publib.boulder.ibm.com/infocenter/systems/index.jsp
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   794
    //        ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   795
    // The fields of perfstat_memory_total_t:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   796
    // u_longlong_t virt_total         Total virtual memory (in 4 KB pages).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   797
    // u_longlong_t real_total         Total real memory (in 4 KB pages).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   798
    // u_longlong_t real_free          Free real memory (in 4 KB pages).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   799
    // u_longlong_t pgsp_total         Total paging space (in 4 KB pages).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   800
    // u_longlong_t pgsp_free          Free paging space (in 4 KB pages).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   801
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   802
    pmi->virt_total = psmt.virt_total * 4096;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   803
    pmi->real_total = psmt.real_total * 4096;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   804
    pmi->real_free = psmt.real_free * 4096;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   805
    pmi->pgsp_total = psmt.pgsp_total * 4096;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   806
    pmi->pgsp_free = psmt.pgsp_free * 4096;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   807
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   808
    return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   809
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   810
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   811
} // end os::Aix::get_meminfo
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   812
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   813
// Retrieve global cpu information.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   814
// Returns false if something went wrong;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   815
// the content of pci is undefined in this case.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   816
bool os::Aix::get_cpuinfo(cpuinfo_t* pci) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   817
  assert(pci, "get_cpuinfo: invalid parameter");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   818
  memset(pci, 0, sizeof(cpuinfo_t));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   819
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   820
  perfstat_cpu_total_t psct;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   821
  memset (&psct, '\0', sizeof(psct));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   822
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   823
  if (-1 == libperfstat::perfstat_cpu_total(NULL, &psct, sizeof(perfstat_cpu_total_t), 1)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   824
    fprintf(stderr, "perfstat_cpu_total() failed (errno=%d)\n", errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   825
    assert(0, "perfstat_cpu_total() failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   826
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   827
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   828
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   829
  // global cpu information
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   830
  strcpy (pci->description, psct.description);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   831
  pci->processorHZ = psct.processorHZ;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   832
  pci->ncpus = psct.ncpus;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   833
  os::Aix::_logical_cpus = psct.ncpus;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   834
  for (int i = 0; i < 3; i++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   835
    pci->loadavg[i] = (double) psct.loadavg[i] / (1 << SBITS);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   836
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   837
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   838
  // get the processor version from _system_configuration
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   839
  switch (_system_configuration.version) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   840
  case PV_8:
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   841
    strcpy(pci->version, "Power PC 8");
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   842
    break;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   843
  case PV_7:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   844
    strcpy(pci->version, "Power PC 7");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   845
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   846
  case PV_6_1:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   847
    strcpy(pci->version, "Power PC 6 DD1.x");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   848
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   849
  case PV_6:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   850
    strcpy(pci->version, "Power PC 6");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   851
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   852
  case PV_5:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   853
    strcpy(pci->version, "Power PC 5");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   854
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   855
  case PV_5_2:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   856
    strcpy(pci->version, "Power PC 5_2");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   857
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   858
  case PV_5_3:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   859
    strcpy(pci->version, "Power PC 5_3");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   860
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   861
  case PV_5_Compat:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   862
    strcpy(pci->version, "PV_5_Compat");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   863
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   864
  case PV_6_Compat:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   865
    strcpy(pci->version, "PV_6_Compat");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   866
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   867
  case PV_7_Compat:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   868
    strcpy(pci->version, "PV_7_Compat");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   869
    break;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   870
  case PV_8_Compat:
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   871
    strcpy(pci->version, "PV_8_Compat");
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
   872
    break;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   873
  default:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   874
    strcpy(pci->version, "unknown");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   875
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   876
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   877
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   878
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   879
} //end os::Aix::get_cpuinfo
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   880
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   881
//////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   882
// detecting pthread library
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   883
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   884
void os::Aix::libpthread_init() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   885
  return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   886
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   887
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   888
//////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   889
// create new thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   890
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   891
// Thread start routine for all newly created threads
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   892
static void *java_start(Thread *thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   893
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   894
  // find out my own stack dimensions
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   895
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   896
    // actually, this should do exactly the same as thread->record_stack_base_and_size...
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   897
    address base = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   898
    size_t size = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   899
    query_stack_dimensions(&base, &size);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   900
    thread->set_stack_base(base);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   901
    thread->set_stack_size(size);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   902
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   903
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   904
  // Do some sanity checks.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   905
  CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   906
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   907
  // Try to randomize the cache line index of hot stack frames.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   908
  // This helps when threads of the same stack traces evict each other's
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   909
  // cache lines. The threads can be either from the same JVM instance, or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   910
  // from different JVM instances. The benefit is especially true for
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   911
  // processors with hyperthreading technology.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   912
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   913
  static int counter = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   914
  int pid = os::current_process_id();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   915
  alloca(((pid ^ counter++) & 7) * 128);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   916
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   917
  ThreadLocalStorage::set_thread(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   918
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   919
  OSThread* osthread = thread->osthread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   920
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   921
  // thread_id is kernel thread id (similar to Solaris LWP id)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   922
  osthread->set_thread_id(os::Aix::gettid());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   923
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   924
  // initialize signal mask for this thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   925
  os::Aix::hotspot_sigmask(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   926
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   927
  // initialize floating point control register
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   928
  os::Aix::init_thread_fpu_state();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   929
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   930
  assert(osthread->get_state() == RUNNABLE, "invalid os thread state");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   931
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   932
  // call one more level start routine
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   933
  thread->run();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   934
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   935
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   936
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   937
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   938
bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   939
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   940
  // We want the whole function to be synchronized.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   941
  ThreadCritical cs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   942
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   943
  assert(thread->osthread() == NULL, "caller responsible");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   944
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   945
  // Allocate the OSThread object
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   946
  OSThread* osthread = new OSThread(NULL, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   947
  if (osthread == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   948
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   949
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   950
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   951
  // set the correct thread state
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   952
  osthread->set_thread_type(thr_type);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   953
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   954
  // Initial state is ALLOCATED but not INITIALIZED
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   955
  osthread->set_state(ALLOCATED);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   956
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   957
  thread->set_osthread(osthread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   958
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   959
  // init thread attributes
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   960
  pthread_attr_t attr;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   961
  pthread_attr_init(&attr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   962
  guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   963
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   964
  // Make sure we run in 1:1 kernel-user-thread mode.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   965
  if (os::Aix::on_aix()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   966
    guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   967
    guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   968
  } // end: aix
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   969
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   970
  // Start in suspended state, and in os::thread_start, wake the thread up.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   971
  guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   972
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   973
  // calculate stack size if it's not specified by caller
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   974
  if (os::Aix::supports_variable_stack_size()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   975
    if (stack_size == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   976
      stack_size = os::Aix::default_stack_size(thr_type);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   977
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   978
      switch (thr_type) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   979
      case os::java_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   980
        // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   981
        assert(JavaThread::stack_size_at_create() > 0, "this should be set");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   982
        stack_size = JavaThread::stack_size_at_create();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   983
        break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   984
      case os::compiler_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   985
        if (CompilerThreadStackSize > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   986
          stack_size = (size_t)(CompilerThreadStackSize * K);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   987
          break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   988
        } // else fall through:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   989
          // use VMThreadStackSize if CompilerThreadStackSize is not defined
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   990
      case os::vm_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   991
      case os::pgc_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   992
      case os::cgc_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   993
      case os::watcher_thread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   994
        if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   995
        break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   996
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   997
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   998
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
   999
    stack_size = MAX2(stack_size, os::Aix::min_stack_allowed);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1000
    pthread_attr_setstacksize(&attr, stack_size);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1001
  } //else let thread_create() pick the default value (96 K on AIX)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1002
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1003
  pthread_t tid;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1004
  int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1005
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1006
  pthread_attr_destroy(&attr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1007
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1008
  if (ret == 0) {
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1009
    // PPC port traceOsMisc(("Created New Thread : pthread-id %u", tid));
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1010
  } else {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1011
    if (PrintMiscellaneous && (Verbose || WizardMode)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1012
      perror("pthread_create()");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1013
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1014
    // Need to clean up stuff we've allocated so far
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1015
    thread->set_osthread(NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1016
    delete osthread;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1017
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1018
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1019
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1020
  // Store pthread info into the OSThread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1021
  osthread->set_pthread_id(tid);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1022
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1023
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1024
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1025
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1026
/////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1027
// attach existing thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1028
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1029
// bootstrap the main thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1030
bool os::create_main_thread(JavaThread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1031
  assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1032
  return create_attached_thread(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1033
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1034
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1035
bool os::create_attached_thread(JavaThread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1036
#ifdef ASSERT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1037
    thread->verify_not_published();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1038
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1039
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1040
  // Allocate the OSThread object
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1041
  OSThread* osthread = new OSThread(NULL, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1042
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1043
  if (osthread == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1044
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1045
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1046
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1047
  // Store pthread info into the OSThread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1048
  osthread->set_thread_id(os::Aix::gettid());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1049
  osthread->set_pthread_id(::pthread_self());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1050
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1051
  // initialize floating point control register
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1052
  os::Aix::init_thread_fpu_state();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1053
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1054
  // some sanity checks
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1055
  CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1056
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1057
  // Initial thread state is RUNNABLE
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1058
  osthread->set_state(RUNNABLE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1059
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1060
  thread->set_osthread(osthread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1061
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1062
  if (UseNUMA) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1063
    int lgrp_id = os::numa_get_group_id();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1064
    if (lgrp_id != -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1065
      thread->set_lgrp_id(lgrp_id);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1066
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1067
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1068
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1069
  // initialize signal mask for this thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1070
  // and save the caller's signal mask
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1071
  os::Aix::hotspot_sigmask(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1072
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1073
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1074
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1075
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1076
void os::pd_start_thread(Thread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1077
  int status = pthread_continue_np(thread->osthread()->pthread_id());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1078
  assert(status == 0, "thr_continue failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1079
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1080
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1081
// Free OS resources related to the OSThread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1082
void os::free_thread(OSThread* osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1083
  assert(osthread != NULL, "osthread not set");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1084
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1085
  if (Thread::current()->osthread() == osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1086
    // Restore caller's signal mask
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1087
    sigset_t sigmask = osthread->caller_sigmask();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1088
    pthread_sigmask(SIG_SETMASK, &sigmask, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1089
   }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1090
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1091
  delete osthread;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1092
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1093
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1094
//////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1095
// thread local storage
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1096
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1097
int os::allocate_thread_local_storage() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1098
  pthread_key_t key;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1099
  int rslt = pthread_key_create(&key, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1100
  assert(rslt == 0, "cannot allocate thread local storage");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1101
  return (int)key;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1102
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1103
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1104
// Note: This is currently not used by VM, as we don't destroy TLS key
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1105
// on VM exit.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1106
void os::free_thread_local_storage(int index) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1107
  int rslt = pthread_key_delete((pthread_key_t)index);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1108
  assert(rslt == 0, "invalid index");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1109
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1110
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1111
void os::thread_local_storage_at_put(int index, void* value) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1112
  int rslt = pthread_setspecific((pthread_key_t)index, value);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1113
  assert(rslt == 0, "pthread_setspecific failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1114
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1115
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1116
extern "C" Thread* get_thread() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1117
  return ThreadLocalStorage::thread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1118
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1119
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1120
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1121
// time support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1122
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1123
// Time since start-up in seconds to a fine granularity.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1124
// Used by VMSelfDestructTimer and the MemProfiler.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1125
double os::elapsedTime() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1126
  return (double)(os::elapsed_counter()) * 0.000001;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1127
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1128
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1129
jlong os::elapsed_counter() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1130
  timeval time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1131
  int status = gettimeofday(&time, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1132
  return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1133
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1134
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1135
jlong os::elapsed_frequency() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1136
  return (1000 * 1000);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1137
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1138
27668
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1139
bool os::supports_vtime() { return true; }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1140
bool os::enable_vtime()   { return false; }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1141
bool os::vtime_enabled()  { return false; }
27668
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1142
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1143
double os::elapsedVTime() {
27668
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1144
  struct rusage usage;
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1145
  int retval = getrusage(RUSAGE_THREAD, &usage);
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1146
  if (retval == 0) {
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1147
    return usage.ru_utime.tv_sec + usage.ru_stime.tv_sec + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / (1000.0 * 1000);
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1148
  } else {
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1149
    // better than nothing, but not much
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1150
    return elapsedTime();
d373a4781717 8064471: Port 8013895: G1: G1SummarizeRSetStats output on Linux needs improvement to AIX
simonis
parents: 27474
diff changeset
  1151
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1152
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1153
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1154
jlong os::javaTimeMillis() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1155
  timeval time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1156
  int status = gettimeofday(&time, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1157
  assert(status != -1, "aix error at gettimeofday()");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1158
  return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1159
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1160
28737
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1161
void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1162
  timeval time;
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1163
  int status = gettimeofday(&time, NULL);
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1164
  assert(status != -1, "aix error at gettimeofday()");
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1165
  seconds = jlong(time.tv_sec);
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1166
  nanos = jlong(time.tv_usec) * 1000;
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1167
}
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1168
ca4b6a6e5cc8 8068730: Increase the precision of the implementation of java.time.Clock.systemUTC()
dfuchs
parents: 28203
diff changeset
  1169
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1170
// We need to manually declare mread_real_time,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1171
// because IBM didn't provide a prototype in time.h.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1172
// (they probably only ever tested in C, not C++)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1173
extern "C"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1174
int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1175
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1176
jlong os::javaTimeNanos() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1177
  if (os::Aix::on_pase()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1178
    Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1179
    return 0;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1180
  } else {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1181
    // On AIX use the precision of processors real time clock
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1182
    // or time base registers.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1183
    timebasestruct_t time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1184
    int rc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1185
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1186
    // If the CPU has a time register, it will be used and
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1187
    // we have to convert to real time first. After convertion we have following data:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1188
    // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970]
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1189
    // time.tb_low  [nanoseconds after the last full second above]
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1190
    // We better use mread_real_time here instead of read_real_time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1191
    // to ensure that we will get a monotonic increasing time.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1192
    if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1193
      rc = time_base_to_time(&time, TIMEBASE_SZ);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1194
      assert(rc != -1, "aix error at time_base_to_time()");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1195
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1196
    return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1197
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1198
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1199
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1200
void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
23213
141e27fa5a42 8036777: AIX: Adapt implementation after '6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris.'
simonis
parents: 22880
diff changeset
  1201
  info_ptr->max_value = ALL_64_BITS;
141e27fa5a42 8036777: AIX: Adapt implementation after '6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris.'
simonis
parents: 22880
diff changeset
  1202
  // mread_real_time() is monotonic (see 'os::javaTimeNanos()')
141e27fa5a42 8036777: AIX: Adapt implementation after '6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris.'
simonis
parents: 22880
diff changeset
  1203
  info_ptr->may_skip_backward = false;
141e27fa5a42 8036777: AIX: Adapt implementation after '6546236: Thread interrupt() of Thread.sleep() can be lost on Solaris.'
simonis
parents: 22880
diff changeset
  1204
  info_ptr->may_skip_forward = false;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1205
  info_ptr->kind = JVMTI_TIMER_ELAPSED;    // elapsed not CPU time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1206
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1207
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1208
// Return the real, user, and system times in seconds from an
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1209
// arbitrary fixed point in the past.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1210
bool os::getTimesSecs(double* process_real_time,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1211
                      double* process_user_time,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1212
                      double* process_system_time) {
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1213
  struct tms ticks;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1214
  clock_t real_ticks = times(&ticks);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1215
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1216
  if (real_ticks == (clock_t) (-1)) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1217
    return false;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1218
  } else {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1219
    double ticks_per_second = (double) clock_tics_per_sec;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1220
    *process_user_time = ((double) ticks.tms_utime) / ticks_per_second;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1221
    *process_system_time = ((double) ticks.tms_stime) / ticks_per_second;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1222
    *process_real_time = ((double) real_ticks) / ticks_per_second;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1223
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1224
    return true;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  1225
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1226
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1227
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1228
char * os::local_time_string(char *buf, size_t buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1229
  struct tm t;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1230
  time_t long_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1231
  time(&long_time);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1232
  localtime_r(&long_time, &t);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1233
  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1234
               t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1235
               t.tm_hour, t.tm_min, t.tm_sec);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1236
  return buf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1237
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1238
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1239
struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1240
  return localtime_r(clock, res);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1241
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1242
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1243
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1244
// runtime exit support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1245
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1246
// Note: os::shutdown() might be called very early during initialization, or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1247
// called from signal handler. Before adding something to os::shutdown(), make
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1248
// sure it is async-safe and can handle partially initialized VM.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1249
void os::shutdown() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1250
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1251
  // allow PerfMemory to attempt cleanup of any persistent resources
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1252
  perfMemory_exit();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1253
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1254
  // needs to remove object in file system
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1255
  AttachListener::abort();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1256
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1257
  // flush buffered output, finish log files
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1258
  ostream_abort();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1259
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1260
  // Check for abort hook
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1261
  abort_hook_t abort_hook = Arguments::abort_hook();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1262
  if (abort_hook != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1263
    abort_hook();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1264
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1265
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1266
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1267
// Note: os::abort() might be called very early during initialization, or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1268
// called from signal handler. Before adding something to os::abort(), make
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1269
// sure it is async-safe and can handle partially initialized VM.
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30234
diff changeset
  1270
void os::abort(bool dump_core, void* siginfo, void* context) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1271
  os::shutdown();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1272
  if (dump_core) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1273
#ifndef PRODUCT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1274
    fdStream out(defaultStream::output_fd());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1275
    out.print_raw("Current thread is ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1276
    char buf[16];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1277
    jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1278
    out.print_raw_cr(buf);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1279
    out.print_raw_cr("Dumping core ...");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1280
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1281
    ::abort(); // dump core
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1282
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1283
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1284
  ::exit(1);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1285
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1286
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1287
// Die immediately, no exit hook, no abort hook, no cleanup.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1288
void os::die() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1289
  ::abort();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1290
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1291
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1292
// This method is a copy of JDK's sysGetLastErrorString
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1293
// from src/solaris/hpi/src/system_md.c
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1294
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1295
size_t os::lasterror(char *buf, size_t len) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1296
  if (errno == 0) return 0;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1297
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1298
  const char *s = ::strerror(errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1299
  size_t n = ::strlen(s);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1300
  if (n >= len) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1301
    n = len - 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1302
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1303
  ::strncpy(buf, s, n);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1304
  buf[n] = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1305
  return n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1306
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1307
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1308
intx os::current_thread_id() { return (intx)pthread_self(); }
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1309
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1310
int os::current_process_id() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1311
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1312
  // This implementation returns a unique pid, the pid of the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1313
  // launcher thread that starts the vm 'process'.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1314
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1315
  // Under POSIX, getpid() returns the same pid as the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1316
  // launcher thread rather than a unique pid per thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1317
  // Use gettid() if you want the old pre NPTL behaviour.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1318
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1319
  // if you are looking for the result of a call to getpid() that
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1320
  // returns a unique pid for the calling thread, then look at the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1321
  // OSThread::thread_id() method in osThread_linux.hpp file
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1322
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1323
  return (int)(_initial_pid ? _initial_pid : getpid());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1324
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1325
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1326
// DLL functions
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1327
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1328
const char* os::dll_file_extension() { return ".so"; }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1329
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1330
// This must be hard coded because it's the system's temporary
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1331
// directory not the java application's temp directory, ala java.io.tmpdir.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1332
const char* os::get_temp_directory() { return "/tmp"; }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1333
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1334
static bool file_exists(const char* filename) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1335
  struct stat statbuf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1336
  if (filename == NULL || strlen(filename) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1337
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1338
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1339
  return os::stat(filename, &statbuf) == 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1340
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1341
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1342
bool os::dll_build_name(char* buffer, size_t buflen,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1343
                        const char* pname, const char* fname) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1344
  bool retval = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1345
  // Copied from libhpi
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1346
  const size_t pnamelen = pname ? strlen(pname) : 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1347
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1348
  // Return error on buffer overflow.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1349
  if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1350
    *buffer = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1351
    return retval;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1352
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1353
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1354
  if (pnamelen == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1355
    snprintf(buffer, buflen, "lib%s.so", fname);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1356
    retval = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1357
  } else if (strchr(pname, *os::path_separator()) != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1358
    int n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1359
    char** pelements = split_path(pname, &n);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1360
    for (int i = 0; i < n; i++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1361
      // Really shouldn't be NULL, but check can't hurt
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1362
      if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1363
        continue; // skip the empty path values
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1364
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1365
      snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1366
      if (file_exists(buffer)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1367
        retval = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1368
        break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1369
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1370
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1371
    // release the storage
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1372
    for (int i = 0; i < n; i++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1373
      if (pelements[i] != NULL) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27668
diff changeset
  1374
        FREE_C_HEAP_ARRAY(char, pelements[i]);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1375
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1376
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1377
    if (pelements != NULL) {
27880
afb974a04396 8060074: os::free() takes MemoryTrackingLevel but doesn't need it
coleenp
parents: 27668
diff changeset
  1378
      FREE_C_HEAP_ARRAY(char*, pelements);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1379
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1380
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1381
    snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1382
    retval = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1383
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1384
  return retval;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1385
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1386
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1387
// Check if addr is inside libjvm.so.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1388
bool os::address_is_in_vm(address addr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1389
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1390
  // Input could be a real pc or a function pointer literal. The latter
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1391
  // would be a function descriptor residing in the data segment of a module.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1392
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1393
  const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1394
  if (lib) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1395
    if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1396
      return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1397
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1398
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1399
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1400
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1401
    lib = LoadedLibraries::find_for_data_address(addr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1402
    if (lib) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1403
      if (strcmp(lib->get_shortname(), "libjvm.so") == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1404
        return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1405
      } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1406
        return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1407
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1408
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1409
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1410
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1411
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1412
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1413
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1414
// Resolve an AIX function descriptor literal to a code pointer.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1415
// If the input is a valid code pointer to a text segment of a loaded module,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1416
//   it is returned unchanged.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1417
// If the input is a valid AIX function descriptor, it is resolved to the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1418
//   code entry point.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1419
// If the input is neither a valid function descriptor nor a valid code pointer,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1420
//   NULL is returned.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1421
static address resolve_function_descriptor_to_code_pointer(address p) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1422
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1423
  const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(p);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1424
  if (lib) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1425
    // its a real code pointer
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1426
    return p;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1427
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1428
    lib = LoadedLibraries::find_for_data_address(p);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1429
    if (lib) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1430
      // pointer to data segment, potential function descriptor
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1431
      address code_entry = (address)(((FunctionDescriptor*)p)->entry());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1432
      if (LoadedLibraries::find_for_text_address(code_entry)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1433
        // Its a function descriptor
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1434
        return code_entry;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1435
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1436
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1437
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1438
  return NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1439
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1440
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1441
bool os::dll_address_to_function_name(address addr, char *buf,
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1442
                                      int buflen, int *offset,
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1443
                                      bool demangle) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1444
  if (offset) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1445
    *offset = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1446
  }
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1447
  // Buf is not optional, but offset is optional.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1448
  assert(buf != NULL, "sanity check");
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1449
  buf[0] = '\0';
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1450
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1451
  // Resolve function ptr literals first.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1452
  addr = resolve_function_descriptor_to_code_pointer(addr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1453
  if (!addr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1454
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1455
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1456
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1457
  // Go through Decoder::decode to call getFuncName which reads the name from the traceback table.
31352
a6ab7217b5cc 8079473: allow demangling to be optional in dll_address_to_function_name
bdelsart
parents: 31026
diff changeset
  1458
  return Decoder::decode(addr, buf, buflen, offset, demangle);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1459
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1460
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1461
static int getModuleName(codeptr_t pc,                    // [in] program counter
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1462
                         char* p_name, size_t namelen,    // [out] optional: function name
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1463
                         char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1464
                         ) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1465
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1466
  // initialize output parameters
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1467
  if (p_name && namelen > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1468
    *p_name = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1469
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1470
  if (p_errmsg && errmsglen > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1471
    *p_errmsg = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1472
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1473
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1474
  const LoadedLibraryModule* const lib = LoadedLibraries::find_for_text_address((address)pc);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1475
  if (lib) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1476
    if (p_name && namelen > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1477
      sprintf(p_name, "%.*s", namelen, lib->get_shortname());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1478
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1479
    return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1480
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1481
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1482
  trcVerbose("pc outside any module");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1483
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1484
  return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1485
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1486
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1487
bool os::dll_address_to_library_name(address addr, char* buf,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1488
                                     int buflen, int* offset) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1489
  if (offset) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1490
    *offset = -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1491
  }
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1492
  // Buf is not optional, but offset is optional.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1493
  assert(buf != NULL, "sanity check");
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1494
  buf[0] = '\0';
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1495
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1496
  // Resolve function ptr literals first.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1497
  addr = resolve_function_descriptor_to_code_pointer(addr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1498
  if (!addr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1499
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1500
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1501
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1502
  if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1503
    return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1504
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1505
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1506
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1507
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1508
// Loads .dll/.so and in case of error it checks if .dll/.so was built
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1509
// for the same architecture as Hotspot is running on.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1510
void *os::dll_load(const char *filename, char *ebuf, int ebuflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1511
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1512
  if (ebuf && ebuflen > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1513
    ebuf[0] = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1514
    ebuf[ebuflen - 1] = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1515
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1516
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1517
  if (!filename || strlen(filename) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1518
    ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1519
    return NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1520
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1521
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1522
  // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1523
  void * result= ::dlopen(filename, RTLD_LAZY);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1524
  if (result != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1525
    // Reload dll cache. Don't do this in signal handling.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1526
    LoadedLibraries::reload();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1527
    return result;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1528
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1529
    // error analysis when dlopen fails
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1530
    const char* const error_report = ::dlerror();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1531
    if (error_report && ebuf && ebuflen > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1532
      snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s",
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1533
               filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1534
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1535
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1536
  return NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1537
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1538
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1539
void* os::dll_lookup(void* handle, const char* name) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1540
  void* res = dlsym(handle, name);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1541
  return res;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1542
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1543
22880
312d82487cc8 8035423: AIX: Fix os::get_default_process_handle() in os_aix.cpp after 8031968
simonis
parents: 22877
diff changeset
  1544
void* os::get_default_process_handle() {
312d82487cc8 8035423: AIX: Fix os::get_default_process_handle() in os_aix.cpp after 8031968
simonis
parents: 22877
diff changeset
  1545
  return (void*)::dlopen(NULL, RTLD_LAZY);
312d82487cc8 8035423: AIX: Fix os::get_default_process_handle() in os_aix.cpp after 8031968
simonis
parents: 22877
diff changeset
  1546
}
312d82487cc8 8035423: AIX: Fix os::get_default_process_handle() in os_aix.cpp after 8031968
simonis
parents: 22877
diff changeset
  1547
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1548
void os::print_dll_info(outputStream *st) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1549
  st->print_cr("Dynamic libraries:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1550
  LoadedLibraries::print(st);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1551
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1552
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1553
void os::get_summary_os_info(char* buf, size_t buflen) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1554
  // There might be something more readable than uname results for AIX.
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1555
  struct utsname name;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1556
  uname(&name);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1557
  snprintf(buf, buflen, "%s %s", name.release, name.version);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1558
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1559
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1560
void os::print_os_info(outputStream* st) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1561
  st->print("OS:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1562
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1563
  st->print("uname:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1564
  struct utsname name;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1565
  uname(&name);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1566
  st->print(name.sysname); st->print(" ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1567
  st->print(name.nodename); st->print(" ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1568
  st->print(name.release); st->print(" ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1569
  st->print(name.version); st->print(" ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1570
  st->print(name.machine);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1571
  st->cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1572
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1573
  // rlimit
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1574
  st->print("rlimit:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1575
  struct rlimit rlim;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1576
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1577
  st->print(" STACK ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1578
  getrlimit(RLIMIT_STACK, &rlim);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1579
  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1580
  else st->print("%uk", rlim.rlim_cur >> 10);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1581
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1582
  st->print(", CORE ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1583
  getrlimit(RLIMIT_CORE, &rlim);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1584
  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1585
  else st->print("%uk", rlim.rlim_cur >> 10);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1586
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1587
  st->print(", NPROC ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1588
  st->print("%d", sysconf(_SC_CHILD_MAX));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1589
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1590
  st->print(", NOFILE ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1591
  getrlimit(RLIMIT_NOFILE, &rlim);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1592
  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1593
  else st->print("%d", rlim.rlim_cur);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1594
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1595
  st->print(", AS ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1596
  getrlimit(RLIMIT_AS, &rlim);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1597
  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1598
  else st->print("%uk", rlim.rlim_cur >> 10);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1599
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1600
  // Print limits on DATA, because it limits the C-heap.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1601
  st->print(", DATA ");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1602
  getrlimit(RLIMIT_DATA, &rlim);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1603
  if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1604
  else st->print("%uk", rlim.rlim_cur >> 10);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1605
  st->cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1606
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1607
  // load average
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1608
  st->print("load average:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1609
  double loadavg[3] = {-1.L, -1.L, -1.L};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1610
  os::loadavg(loadavg, 3);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1611
  st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1612
  st->cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1613
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1614
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1615
void os::print_memory_info(outputStream* st) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1616
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1617
  st->print_cr("Memory:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1618
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1619
  st->print_cr("  default page size: %s", describe_pagesize(os::vm_page_size()));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1620
  st->print_cr("  default stack page size: %s", describe_pagesize(os::vm_page_size()));
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1621
  st->print_cr("  Default shared memory page size:        %s",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1622
    describe_pagesize(g_multipage_support.shmpsize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1623
  st->print_cr("  Can use 64K pages dynamically with shared meory:  %s",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1624
    (g_multipage_support.can_use_64K_pages ? "yes" :"no"));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1625
  st->print_cr("  Can use 16M pages dynamically with shared memory: %s",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1626
    (g_multipage_support.can_use_16M_pages ? "yes" :"no"));
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1627
  if (g_multipage_error != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1628
    st->print_cr("  multipage error: %d", g_multipage_error);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1629
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1630
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1631
  // print out LDR_CNTRL because it affects the default page sizes
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1632
  const char* const ldr_cntrl = ::getenv("LDR_CNTRL");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1633
  st->print_cr("  LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : "<unset>");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1634
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1635
  const char* const extshm = ::getenv("EXTSHM");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1636
  st->print_cr("  EXTSHM=%s.", extshm ? extshm : "<unset>");
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1637
  if ( (strcmp(extshm, "on") == 0) || (strcmp(extshm, "ON") == 0) ) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1638
    st->print_cr("  *** Unsupported! Please remove EXTSHM from your environment! ***");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1639
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1640
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1641
  // Call os::Aix::get_meminfo() to retrieve memory statistics.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1642
  os::Aix::meminfo_t mi;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1643
  if (os::Aix::get_meminfo(&mi)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1644
    char buffer[256];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1645
    if (os::Aix::on_aix()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1646
      jio_snprintf(buffer, sizeof(buffer),
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1647
                   "  physical total : %llu\n"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1648
                   "  physical free  : %llu\n"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1649
                   "  swap total     : %llu\n"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1650
                   "  swap free      : %llu\n",
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1651
                   mi.real_total,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1652
                   mi.real_free,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1653
                   mi.pgsp_total,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1654
                   mi.pgsp_free);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1655
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1656
      Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1657
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1658
    st->print_raw(buffer);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1659
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1660
    st->print_cr("  (no more information available)");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1661
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1662
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1663
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1664
// Get a string for the cpuinfo that is a summary of the cpu type
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1665
void os::get_summary_cpu_info(char* buf, size_t buflen) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1666
  // This looks good
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1667
  os::Aix::cpuinfo_t ci;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1668
  if (os::Aix::get_cpuinfo(&ci)) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1669
    strncpy(buf, ci.version, buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1670
  } else {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1671
    strncpy(buf, "AIX", buflen);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1672
  }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1673
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31850
diff changeset
  1674
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31026
diff changeset
  1675
void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1676
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1677
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1678
void os::print_siginfo(outputStream* st, void* siginfo) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1679
  // Use common posix version.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1680
  os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1681
  st->cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1682
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1683
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1684
static void print_signal_handler(outputStream* st, int sig,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1685
                                 char* buf, size_t buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1686
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1687
void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1688
  st->print_cr("Signal Handlers:");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1689
  print_signal_handler(st, SIGSEGV, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1690
  print_signal_handler(st, SIGBUS , buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1691
  print_signal_handler(st, SIGFPE , buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1692
  print_signal_handler(st, SIGPIPE, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1693
  print_signal_handler(st, SIGXFSZ, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1694
  print_signal_handler(st, SIGILL , buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1695
  print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1696
  print_signal_handler(st, SR_signum, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1697
  print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1698
  print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1699
  print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1700
  print_signal_handler(st, BREAK_SIGNAL, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1701
  print_signal_handler(st, SIGTRAP, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1702
  print_signal_handler(st, SIGDANGER, buf, buflen);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1703
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1704
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1705
static char saved_jvm_path[MAXPATHLEN] = {0};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1706
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1707
// Find the full path to the current module, libjvm.so.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1708
void os::jvm_path(char *buf, jint buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1709
  // Error checking.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1710
  if (buflen < MAXPATHLEN) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1711
    assert(false, "must use a large-enough buffer");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1712
    buf[0] = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1713
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1714
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1715
  // Lazy resolve the path to current module.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1716
  if (saved_jvm_path[0] != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1717
    strcpy(buf, saved_jvm_path);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1718
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1719
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1720
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1721
  Dl_info dlinfo;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1722
  int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1723
  assert(ret != 0, "cannot locate libjvm");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1724
  char* rp = realpath((char *)dlinfo.dli_fname, buf);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1725
  assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1726
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27400
diff changeset
  1727
  strncpy(saved_jvm_path, buf, sizeof(saved_jvm_path));
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27400
diff changeset
  1728
  saved_jvm_path[sizeof(saved_jvm_path) - 1] = '\0';
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1729
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1730
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1731
void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1732
  // no prefix required, not even "_"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1733
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1734
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1735
void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1736
  // no suffix required
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1737
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1738
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1739
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1740
// sun.misc.Signal support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1741
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1742
static volatile jint sigint_count = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1743
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1744
static void
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1745
UserHandler(int sig, void *siginfo, void *context) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1746
  // 4511530 - sem_post is serialized and handled by the manager thread. When
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1747
  // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1748
  // don't want to flood the manager thread with sem_post requests.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1749
  if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1750
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1751
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1752
  // Ctrl-C is pressed during error reporting, likely because the error
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1753
  // handler fails to abort. Let VM die immediately.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1754
  if (sig == SIGINT && is_error_reported()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1755
    os::die();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1756
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1757
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1758
  os::signal_notify(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1759
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1760
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1761
void* os::user_handler() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1762
  return CAST_FROM_FN_PTR(void*, UserHandler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1763
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1764
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1765
extern "C" {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1766
  typedef void (*sa_handler_t)(int);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1767
  typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1768
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1769
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1770
void* os::signal(int signal_number, void* handler) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1771
  struct sigaction sigAct, oldSigAct;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1772
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1773
  sigfillset(&(sigAct.sa_mask));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1774
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1775
  // Do not block out synchronous signals in the signal handler.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1776
  // Blocking synchronous signals only makes sense if you can really
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1777
  // be sure that those signals won't happen during signal handling,
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  1778
  // when the blocking applies. Normal signal handlers are lean and
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1779
  // do not cause signals. But our signal handlers tend to be "risky"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1780
  // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1781
  // On AIX, PASE there was a case where a SIGSEGV happened, followed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1782
  // by a SIGILL, which was blocked due to the signal mask. The process
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1783
  // just hung forever. Better to crash from a secondary signal than to hang.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1784
  sigdelset(&(sigAct.sa_mask), SIGSEGV);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1785
  sigdelset(&(sigAct.sa_mask), SIGBUS);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1786
  sigdelset(&(sigAct.sa_mask), SIGILL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1787
  sigdelset(&(sigAct.sa_mask), SIGFPE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1788
  sigdelset(&(sigAct.sa_mask), SIGTRAP);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1789
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1790
  sigAct.sa_flags   = SA_RESTART|SA_SIGINFO;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1791
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1792
  sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1793
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1794
  if (sigaction(signal_number, &sigAct, &oldSigAct)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1795
    // -1 means registration failed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1796
    return (void *)-1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1797
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1798
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1799
  return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1800
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1801
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1802
void os::signal_raise(int signal_number) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1803
  ::raise(signal_number);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1804
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1805
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1806
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1807
// The following code is moved from os.cpp for making this
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1808
// code platform specific, which it is by its very nature.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1809
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1810
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1811
// Will be modified when max signal is changed to be dynamic
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1812
int os::sigexitnum_pd() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1813
  return NSIG;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1814
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1815
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1816
// a counter for each possible signal value
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1817
static volatile jint pending_signals[NSIG+1] = { 0 };
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1818
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1819
// Linux(POSIX) specific hand shaking semaphore.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1820
static sem_t sig_sem;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1821
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1822
void os::signal_init_pd() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1823
  // Initialize signal structures
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1824
  ::memset((void*)pending_signals, 0, sizeof(pending_signals));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1825
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1826
  // Initialize signal semaphore
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1827
  int rc = ::sem_init(&sig_sem, 0, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1828
  guarantee(rc != -1, "sem_init failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1829
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1830
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1831
void os::signal_notify(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1832
  Atomic::inc(&pending_signals[sig]);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1833
  ::sem_post(&sig_sem);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1834
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1835
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1836
static int check_pending_signals(bool wait) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1837
  Atomic::store(0, &sigint_count);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1838
  for (;;) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1839
    for (int i = 0; i < NSIG + 1; i++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1840
      jint n = pending_signals[i];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1841
      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1842
        return i;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1843
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1844
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1845
    if (!wait) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1846
      return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1847
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1848
    JavaThread *thread = JavaThread::current();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1849
    ThreadBlockInVM tbivm(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1850
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1851
    bool threadIsSuspended;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1852
    do {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1853
      thread->set_suspend_equivalent();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1854
      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1855
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1856
      ::sem_wait(&sig_sem);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1857
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1858
      // were we externally suspended while we were waiting?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1859
      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1860
      if (threadIsSuspended) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1861
        //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1862
        // The semaphore has been incremented, but while we were waiting
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1863
        // another thread suspended us. We don't want to continue running
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1864
        // while suspended because that would surprise the thread that
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1865
        // suspended us.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1866
        //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1867
        ::sem_post(&sig_sem);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1868
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1869
        thread->java_suspend_self();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1870
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1871
    } while (threadIsSuspended);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1872
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1873
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1874
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1875
int os::signal_lookup() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1876
  return check_pending_signals(false);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1877
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1878
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1879
int os::signal_wait() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1880
  return check_pending_signals(true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1881
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1882
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1883
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1884
// Virtual Memory
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1885
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1886
// We need to keep small simple bookkeeping for os::reserve_memory and friends.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1887
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1888
#define VMEM_MAPPED  1
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1889
#define VMEM_SHMATED 2
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1890
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1891
struct vmembk_t {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1892
  int type;         // 1 - mmap, 2 - shmat
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1893
  char* addr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1894
  size_t size;      // Real size, may be larger than usersize.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1895
  size_t pagesize;  // page size of area
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1896
  vmembk_t* next;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1897
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1898
  bool contains_addr(char* p) const {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1899
    return p >= addr && p < (addr + size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1900
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1901
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1902
  bool contains_range(char* p, size_t s) const {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1903
    return contains_addr(p) && contains_addr(p + s - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1904
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1905
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1906
  void print_on(outputStream* os) const {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1907
    os->print("[" PTR_FORMAT " - " PTR_FORMAT "] (" UINTX_FORMAT
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1908
      " bytes, %d %s pages), %s",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1909
      addr, addr + size - 1, size, size / pagesize, describe_pagesize(pagesize),
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1910
      (type == VMEM_SHMATED ? "shmat" : "mmap")
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1911
    );
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1912
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1913
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1914
  // Check that range is a sub range of memory block (or equal to memory block);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1915
  // also check that range is fully page aligned to the page size if the block.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1916
  void assert_is_valid_subrange(char* p, size_t s) const {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1917
    if (!contains_range(p, s)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1918
      fprintf(stderr, "[" PTR_FORMAT " - " PTR_FORMAT "] is not a sub "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1919
              "range of [" PTR_FORMAT " - " PTR_FORMAT "].\n",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1920
              p, p + s - 1, addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1921
      guarantee0(false);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1922
    }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1923
    if (!is_aligned_to(p, pagesize) || !is_aligned_to(p + s, pagesize)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1924
      fprintf(stderr, "range [" PTR_FORMAT " - " PTR_FORMAT "] is not"
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1925
              " aligned to pagesize (%s)\n", p, p + s);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1926
      guarantee0(false);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1927
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1928
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1929
};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1930
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1931
static struct {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1932
  vmembk_t* first;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1933
  MiscUtils::CritSect cs;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1934
} vmem;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1935
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1936
static void vmembk_add(char* addr, size_t size, size_t pagesize, int type) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1937
  vmembk_t* p = (vmembk_t*) ::malloc(sizeof(vmembk_t));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1938
  assert0(p);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1939
  if (p) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1940
    MiscUtils::AutoCritSect lck(&vmem.cs);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1941
    p->addr = addr; p->size = size;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1942
    p->pagesize = pagesize;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1943
    p->type = type;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1944
    p->next = vmem.first;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1945
    vmem.first = p;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1946
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1947
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1948
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1949
static vmembk_t* vmembk_find(char* addr) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1950
  MiscUtils::AutoCritSect lck(&vmem.cs);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1951
  for (vmembk_t* p = vmem.first; p; p = p->next) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1952
    if (p->addr <= addr && (p->addr + p->size) > addr) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1953
      return p;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1954
    }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1955
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1956
  return NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1957
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1958
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1959
static void vmembk_remove(vmembk_t* p0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1960
  MiscUtils::AutoCritSect lck(&vmem.cs);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1961
  assert0(p0);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1962
  assert0(vmem.first); // List should not be empty.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1963
  for (vmembk_t** pp = &(vmem.first); *pp; pp = &((*pp)->next)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1964
    if (*pp == p0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1965
      *pp = p0->next;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1966
      ::free(p0);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1967
      return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  1968
    }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1969
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1970
  assert0(false); // Not found?
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1971
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1972
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1973
static void vmembk_print_on(outputStream* os) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1974
  MiscUtils::AutoCritSect lck(&vmem.cs);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1975
  for (vmembk_t* vmi = vmem.first; vmi; vmi = vmi->next) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1976
    vmi->print_on(os);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1977
    os->cr();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1978
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1979
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1980
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1981
// Reserve and attach a section of System V memory.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1982
// If <requested_addr> is not NULL, function will attempt to attach the memory at the given
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1983
// address. Failing that, it will attach the memory anywhere.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1984
// If <requested_addr> is NULL, function will attach the memory anywhere.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1985
//
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1986
// <alignment_hint> is being ignored by this function. It is very probable however that the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1987
// alignment requirements are met anyway, because shmat() attaches at 256M boundaries.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1988
// Should this be not enogh, we can put more work into it.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1989
static char* reserve_shmated_memory (
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1990
  size_t bytes,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1991
  char* requested_addr,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1992
  size_t alignment_hint) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1993
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1994
  trcVerbose("reserve_shmated_memory " UINTX_FORMAT " bytes, wishaddress "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1995
    PTR_FORMAT ", alignment_hint " UINTX_FORMAT "...",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1996
    bytes, requested_addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1997
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1998
  // Either give me wish address or wish alignment but not both.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  1999
  assert0(!(requested_addr != NULL && alignment_hint != 0));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2000
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2001
  // We must prevent anyone from attaching too close to the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2002
  // BRK because that may cause malloc OOM.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2003
  if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2004
    trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2005
      "Will attach anywhere.", requested_addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2006
    // Act like the OS refused to attach there.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2007
    requested_addr = NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2008
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2009
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2010
  // For old AS/400's (V5R4 and older) we should not even be here - System V shared memory is not
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2011
  // really supported (max size 4GB), so reserve_mmapped_memory should have been used instead.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2012
  if (os::Aix::on_pase_V5R4_or_older()) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2013
    ShouldNotReachHere();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2014
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2015
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2016
  // Align size of shm up to 64K to avoid errors if we later try to change the page size.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2017
  const size_t size = align_size_up(bytes, SIZE_64K);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2018
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2019
  // Reserve the shared segment.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2020
  int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2021
  if (shmid == -1) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2022
    trc("shmget(.., " UINTX_FORMAT ", ..) failed (errno: %d).", size, errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2023
    return NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2024
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2025
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2026
  // Important note:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2027
  // It is very important that we, upon leaving this function, do not leave a shm segment alive.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2028
  // We must right after attaching it remove it from the system. System V shm segments are global and
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2029
  // survive the process.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2030
  // So, from here on: Do not assert, do not return, until we have called shmctl(IPC_RMID) (A).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2031
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2032
  struct shmid_ds shmbuf;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2033
  memset(&shmbuf, 0, sizeof(shmbuf));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2034
  shmbuf.shm_pagesize = SIZE_64K;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2035
  if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2036
    trcVerbose("Failed to set page size (need " UINTX_FORMAT " 64K pages) - shmctl failed with %d.",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2037
               size / SIZE_64K, errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2038
    // I want to know if this ever happens.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2039
    assert(false, "failed to set page size for shmat");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2040
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2041
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2042
  // Now attach the shared segment.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2043
  // Note that I attach with SHM_RND - which means that the requested address is rounded down, if
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2044
  // needed, to the next lowest segment boundary. Otherwise the attach would fail if the address
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2045
  // were not a segment boundary.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2046
  char* const addr = (char*) shmat(shmid, requested_addr, SHM_RND);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2047
  const int errno_shmat = errno;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2048
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2049
  // (A) Right after shmat and before handing shmat errors delete the shm segment.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2050
  if (::shmctl(shmid, IPC_RMID, NULL) == -1) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2051
    trc("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2052
    assert(false, "failed to remove shared memory segment!");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2053
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2054
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2055
  // Handle shmat error. If we failed to attach, just return.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2056
  if (addr == (char*)-1) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2057
    trcVerbose("Failed to attach segment at " PTR_FORMAT " (%d).", requested_addr, errno_shmat);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2058
    return NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2059
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2060
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2061
  // Just for info: query the real page size. In case setting the page size did not
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2062
  // work (see above), the system may have given us something other then 4K (LDR_CNTRL).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2063
  const size_t real_pagesize = os::Aix::query_pagesize(addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2064
  if (real_pagesize != shmbuf.shm_pagesize) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2065
    trcVerbose("pagesize is, surprisingly, %h.", real_pagesize);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2066
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2067
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2068
  if (addr) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2069
    trcVerbose("shm-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes, " UINTX_FORMAT " %s pages)",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2070
      addr, addr + size - 1, size, size/real_pagesize, describe_pagesize(real_pagesize));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2071
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2072
    if (requested_addr != NULL) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2073
      trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at with address " PTR_FORMAT ".", size, requested_addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2074
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2075
      trcVerbose("failed to shm-allocate " UINTX_FORMAT " bytes at any address.", size);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2076
    }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2077
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2078
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2079
  // book-keeping
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2080
  vmembk_add(addr, size, real_pagesize, VMEM_SHMATED);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2081
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2082
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2083
  return addr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2084
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2085
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2086
static bool release_shmated_memory(char* addr, size_t size) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2087
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2088
  trcVerbose("release_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2089
    addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2090
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2091
  bool rc = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2092
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2093
  // TODO: is there a way to verify shm size without doing bookkeeping?
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2094
  if (::shmdt(addr) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2095
    trcVerbose("error (%d).", errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2096
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2097
    trcVerbose("ok.");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2098
    rc = true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2099
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2100
  return rc;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2101
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2102
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2103
static bool uncommit_shmated_memory(char* addr, size_t size) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2104
  trcVerbose("uncommit_shmated_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2105
    addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2106
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2107
  const bool rc = my_disclaim64(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2108
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2109
  if (!rc) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2110
    trcVerbose("my_disclaim64(" PTR_FORMAT ", " UINTX_FORMAT ") failed.\n", addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2111
    return false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2112
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2113
  return true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2114
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2115
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2116
// Reserve memory via mmap.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2117
// If <requested_addr> is given, an attempt is made to attach at the given address.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2118
// Failing that, memory is allocated at any address.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2119
// If <alignment_hint> is given and <requested_addr> is NULL, an attempt is made to
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2120
// allocate at an address aligned with the given alignment. Failing that, memory
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2121
// is aligned anywhere.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2122
static char* reserve_mmaped_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2123
  trcVerbose("reserve_mmaped_memory " UINTX_FORMAT " bytes, wishaddress " PTR_FORMAT ", "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2124
    "alignment_hint " UINTX_FORMAT "...",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2125
    bytes, requested_addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2126
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2127
  // If a wish address is given, but not aligned to 4K page boundary, mmap will fail.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2128
  if (requested_addr && !is_aligned_to(requested_addr, os::vm_page_size()) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2129
    trcVerbose("Wish address " PTR_FORMAT " not aligned to page boundary.", requested_addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2130
    return NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2131
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2132
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2133
  // We must prevent anyone from attaching too close to the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2134
  // BRK because that may cause malloc OOM.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2135
  if (requested_addr != NULL && is_close_to_brk((address)requested_addr)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2136
    trcVerbose("Wish address " PTR_FORMAT " is too close to the BRK segment. "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2137
      "Will attach anywhere.", requested_addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2138
    // Act like the OS refused to attach there.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2139
    requested_addr = NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2140
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2141
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2142
  // Specify one or the other but not both.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2143
  assert0(!(requested_addr != NULL && alignment_hint > 0));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2144
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2145
  // In 64K mode, we claim the global page size (os::vm_page_size())
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2146
  // is 64K. This is one of the few points where that illusion may
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2147
  // break, because mmap() will always return memory aligned to 4K. So
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2148
  // we must ensure we only ever return memory aligned to 64k.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2149
  if (alignment_hint) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2150
    alignment_hint = lcm(alignment_hint, os::vm_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2151
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2152
    alignment_hint = os::vm_page_size();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2153
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2154
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2155
  // Size shall always be a multiple of os::vm_page_size (esp. in 64K mode).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2156
  const size_t size = align_size_up(bytes, os::vm_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2157
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2158
  // alignment: Allocate memory large enough to include an aligned range of the right size and
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2159
  // cut off the leading and trailing waste pages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2160
  assert0(alignment_hint != 0 && is_aligned_to(alignment_hint, os::vm_page_size())); // see above
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2161
  const size_t extra_size = size + alignment_hint;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2162
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2163
  // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2164
  // later use msync(MS_INVALIDATE) (see os::uncommit_memory).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2165
  int flags = MAP_ANONYMOUS | MAP_SHARED;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2166
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2167
  // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2168
  // it means if wishaddress is given but MAP_FIXED is not set.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2169
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2170
  // Important! Behaviour differs depending on whether SPEC1170 mode is active or not.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2171
  // SPEC1170 mode active: behaviour like POSIX, MAP_FIXED will clobber existing mappings.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2172
  // SPEC1170 mode not active: behaviour, unlike POSIX, is that no existing mappings will
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2173
  // get clobbered.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2174
  if (requested_addr != NULL) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2175
    if (!os::Aix::xpg_sus_mode()) {  // not SPEC1170 Behaviour
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2176
      flags |= MAP_FIXED;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2177
    }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2178
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2179
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2180
  char* addr = (char*)::mmap(requested_addr, extra_size,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2181
      PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2182
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2183
  if (addr == MAP_FAILED) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2184
    trcVerbose("mmap(" PTR_FORMAT ", " UINTX_FORMAT ", ..) failed (%d)", requested_addr, size, errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2185
    return NULL;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2186
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2187
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2188
  // Handle alignment.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2189
  char* const addr_aligned = (char *)align_ptr_up(addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2190
  const size_t waste_pre = addr_aligned - addr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2191
  char* const addr_aligned_end = addr_aligned + size;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2192
  const size_t waste_post = extra_size - waste_pre - size;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2193
  if (waste_pre > 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2194
    ::munmap(addr, waste_pre);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2195
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2196
  if (waste_post > 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2197
    ::munmap(addr_aligned_end, waste_post);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2198
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2199
  addr = addr_aligned;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2200
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2201
  if (addr) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2202
    trcVerbose("mmap-allocated " PTR_FORMAT " .. " PTR_FORMAT " (" UINTX_FORMAT " bytes)",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2203
      addr, addr + bytes, bytes);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2204
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2205
    if (requested_addr != NULL) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2206
      trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at wish address " PTR_FORMAT ".", bytes, requested_addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2207
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2208
      trcVerbose("failed to mmap-allocate " UINTX_FORMAT " bytes at any address.", bytes);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2209
    }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2210
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2211
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2212
  // bookkeeping
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2213
  vmembk_add(addr, size, SIZE_4K, VMEM_MAPPED);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2214
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2215
  // Test alignment, see above.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2216
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2217
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2218
  return addr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2219
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2220
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2221
static bool release_mmaped_memory(char* addr, size_t size) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2222
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2223
  assert0(is_aligned_to(size, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2224
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2225
  trcVerbose("release_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2226
    addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2227
  bool rc = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2228
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2229
  if (::munmap(addr, size) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2230
    trcVerbose("failed (%d)\n", errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2231
    rc = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2232
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2233
    trcVerbose("ok.");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2234
    rc = true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2235
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2236
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2237
  return rc;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2238
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2239
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2240
static bool uncommit_mmaped_memory(char* addr, size_t size) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2241
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2242
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2243
  assert0(is_aligned_to(size, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2244
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2245
  trcVerbose("uncommit_mmaped_memory [" PTR_FORMAT " - " PTR_FORMAT "].",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2246
    addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2247
  bool rc = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2248
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2249
  // Uncommit mmap memory with msync MS_INVALIDATE.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2250
  if (::msync(addr, size, MS_INVALIDATE) != 0) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2251
    trcVerbose("failed (%d)\n", errno);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2252
    rc = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2253
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2254
    trcVerbose("ok.");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2255
    rc = true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2256
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2257
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2258
  return rc;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2259
}
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2260
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2261
// End: shared memory bookkeeping
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2262
////////////////////////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2263
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2264
int os::vm_page_size() {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2265
  // Seems redundant as all get out.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2266
  assert(os::Aix::page_size() != -1, "must call os::init");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2267
  return os::Aix::page_size();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2268
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2269
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2270
// Aix allocates memory by pages.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2271
int os::vm_allocation_granularity() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2272
  assert(os::Aix::page_size() != -1, "must call os::init");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2273
  return os::Aix::page_size();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2274
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2275
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2276
#ifdef PRODUCT
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2277
static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2278
                                    int err) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2279
  warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2280
          ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2281
          strerror(err), err);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2282
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2283
#endif
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2284
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2285
void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2286
                                  const char* mesg) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2287
  assert(mesg != NULL, "mesg must be specified");
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2288
  if (!pd_commit_memory(addr, size, exec)) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2289
    // Add extra info in product mode for vm_exit_out_of_memory():
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2290
    PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2291
    vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2292
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2293
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2294
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2295
bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2296
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2297
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2298
  assert0(is_aligned_to(size, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2299
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2300
  vmembk_t* const vmi = vmembk_find(addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2301
  assert0(vmi);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2302
  vmi->assert_is_valid_subrange(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2303
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2304
  trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", addr, addr + size - 1);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2305
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2306
  return true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2307
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2308
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2309
bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2310
  return pd_commit_memory(addr, size, exec);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2311
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2312
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2313
void os::pd_commit_memory_or_exit(char* addr, size_t size,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2314
                                  size_t alignment_hint, bool exec,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2315
                                  const char* mesg) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2316
  // Alignment_hint is ignored on this OS.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2317
  pd_commit_memory_or_exit(addr, size, exec, mesg);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2318
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2319
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2320
bool os::pd_uncommit_memory(char* addr, size_t size) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2321
  assert0(is_aligned_to(addr, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2322
  assert0(is_aligned_to(size, os::vm_page_size()));
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2323
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2324
  // Dynamically do different things for mmap/shmat.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2325
  const vmembk_t* const vmi = vmembk_find(addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2326
  assert0(vmi);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2327
  vmi->assert_is_valid_subrange(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2328
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2329
  if (vmi->type == VMEM_SHMATED) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2330
    return uncommit_shmated_memory(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2331
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2332
    return uncommit_mmaped_memory(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2333
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2334
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2335
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2336
bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2337
  // Do not call this; no need to commit stack pages on AIX.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2338
  ShouldNotReachHere();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2339
  return true;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2340
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2341
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2342
bool os::remove_stack_guard_pages(char* addr, size_t size) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2343
  // Do not call this; no need to commit stack pages on AIX.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2344
  ShouldNotReachHere();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2345
  return true;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2346
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2347
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2348
void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2349
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2350
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2351
void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2352
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2353
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2354
void os::numa_make_global(char *addr, size_t bytes) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2355
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2356
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2357
void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2358
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2359
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2360
bool os::numa_topology_changed() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2361
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2362
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2363
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2364
size_t os::numa_get_groups_num() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2365
  return 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2366
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2367
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2368
int os::numa_get_group_id() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2369
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2370
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2371
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2372
size_t os::numa_get_leaf_groups(int *ids, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2373
  if (size > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2374
    ids[0] = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2375
    return 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2376
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2377
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2378
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2379
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2380
bool os::get_page_info(char *start, page_info* info) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2381
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2382
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2383
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2384
char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2385
  return end;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2386
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2387
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2388
// Reserves and attaches a shared memory segment.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2389
// Will assert if a wish address is given and could not be obtained.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2390
char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2391
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2392
  // All other Unices do a mmap(MAP_FIXED) if the addr is given,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2393
  // thereby clobbering old mappings at that place. That is probably
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2394
  // not intended, never used and almost certainly an error were it
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2395
  // ever be used this way (to try attaching at a specified address
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2396
  // without clobbering old mappings an alternate API exists,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2397
  // os::attempt_reserve_memory_at()).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2398
  // Instead of mimicking the dangerous coding of the other platforms, here I
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2399
  // just ignore the request address (release) or assert(debug).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2400
  assert0(requested_addr == NULL);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2401
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2402
  // Always round to os::vm_page_size(), which may be larger than 4K.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2403
  bytes = align_size_up(bytes, os::vm_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2404
  const size_t alignment_hint0 =
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2405
    alignment_hint ? align_size_up(alignment_hint, os::vm_page_size()) : 0;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2406
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2407
  // In 4K mode always use mmap.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2408
  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2409
  if (os::vm_page_size() == SIZE_4K) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2410
    return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2411
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2412
    if (bytes >= Use64KPagesThreshold) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2413
      return reserve_shmated_memory(bytes, requested_addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2414
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2415
      return reserve_mmaped_memory(bytes, requested_addr, alignment_hint);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2416
    }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2417
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2418
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2419
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2420
bool os::pd_release_memory(char* addr, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2421
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2422
  // Dynamically do different things for mmap/shmat.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2423
  vmembk_t* const vmi = vmembk_find(addr);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2424
  assert0(vmi);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2425
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2426
  // Always round to os::vm_page_size(), which may be larger than 4K.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2427
  size = align_size_up(size, os::vm_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2428
  addr = (char *)align_ptr_up(addr, os::vm_page_size());
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2429
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2430
  bool rc = false;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2431
  bool remove_bookkeeping = false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2432
  if (vmi->type == VMEM_SHMATED) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2433
    // For shmatted memory, we do:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2434
    // - If user wants to release the whole range, release the memory (shmdt).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2435
    // - If user only wants to release a partial range, uncommit (disclaim) that
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2436
    //   range. That way, at least, we do not use memory anymore (bust still page
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2437
    //   table space).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2438
    vmi->assert_is_valid_subrange(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2439
    if (addr == vmi->addr && size == vmi->size) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2440
      rc = release_shmated_memory(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2441
      remove_bookkeeping = true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2442
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2443
      rc = uncommit_shmated_memory(addr, size);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2444
    }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2445
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2446
    // User may unmap partial regions but region has to be fully contained.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2447
#ifdef ASSERT
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2448
    vmi->assert_is_valid_subrange(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2449
#endif
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2450
    rc = release_mmaped_memory(addr, size);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2451
    remove_bookkeeping = true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2452
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2453
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2454
  // update bookkeeping
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2455
  if (rc && remove_bookkeeping) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2456
    vmembk_remove(vmi);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2457
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2458
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2459
  return rc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2460
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2461
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2462
static bool checked_mprotect(char* addr, size_t size, int prot) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2463
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2464
  // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2465
  // not tell me if protection failed when trying to protect an un-protectable range.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2466
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2467
  // This means if the memory was allocated using shmget/shmat, protection wont work
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2468
  // but mprotect will still return 0:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2469
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2470
  // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2471
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2472
  bool rc = ::mprotect(addr, size, prot) == 0 ? true : false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2473
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2474
  if (!rc) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2475
    const char* const s_errno = strerror(errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2476
    warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2477
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2478
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2479
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2480
  // mprotect success check
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2481
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2482
  // Mprotect said it changed the protection but can I believe it?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2483
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2484
  // To be sure I need to check the protection afterwards. Try to
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2485
  // read from protected memory and check whether that causes a segfault.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2486
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2487
  if (!os::Aix::xpg_sus_mode()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2488
30234
aa6bfe87720b 8077257: Use CanUseSafeFetch instead of probing SafeFetch stub directly
stuefe
parents: 30139
diff changeset
  2489
    if (CanUseSafeFetch32()) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2490
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2491
      const bool read_protected =
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2492
        (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 &&
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2493
         SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2494
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2495
      if (prot & PROT_READ) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2496
        rc = !read_protected;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2497
      } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2498
        rc = read_protected;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2499
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2500
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2501
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2502
  if (!rc) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2503
    assert(false, "mprotect failed.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2504
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2505
  return rc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2506
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2507
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2508
// Set protections specified
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2509
bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2510
  unsigned int p = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2511
  switch (prot) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2512
  case MEM_PROT_NONE: p = PROT_NONE; break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2513
  case MEM_PROT_READ: p = PROT_READ; break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2514
  case MEM_PROT_RW:   p = PROT_READ|PROT_WRITE; break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2515
  case MEM_PROT_RWX:  p = PROT_READ|PROT_WRITE|PROT_EXEC; break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2516
  default:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2517
    ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2518
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2519
  // is_committed is unused.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2520
  return checked_mprotect(addr, size, p);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2521
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2522
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2523
bool os::guard_memory(char* addr, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2524
  return checked_mprotect(addr, size, PROT_NONE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2525
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2526
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2527
bool os::unguard_memory(char* addr, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2528
  return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2529
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2530
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2531
// Large page support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2532
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2533
static size_t _large_page_size = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2534
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2535
// Enable large page support if OS allows that.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2536
void os::large_page_init() {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2537
  return; // Nothing to do. See query_multipage_support and friends.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2538
}
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2539
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2540
char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2541
  // "exec" is passed in but not used. Creating the shared image for
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2542
  // the code cache doesn't have an SHM_X executable permission to check.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2543
  Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2544
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2545
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2546
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2547
bool os::release_memory_special(char* base, size_t bytes) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2548
  // Detaching the SHM segment will also delete it, see reserve_memory_special().
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2549
  Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2550
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2551
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2552
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2553
size_t os::large_page_size() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2554
  return _large_page_size;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2555
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2556
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2557
bool os::can_commit_large_page_memory() {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2558
  // Does not matter, we do not support huge pages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2559
  return false;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2560
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2561
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2562
bool os::can_execute_large_page_memory() {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2563
  // Does not matter, we do not support huge pages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2564
  return false;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2565
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2566
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2567
// Reserve memory at an arbitrary address, only if that area is
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2568
// available (and not reserved for something else).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2569
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2570
  char* addr = NULL;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2571
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2572
  // Always round to os::vm_page_size(), which may be larger than 4K.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2573
  bytes = align_size_up(bytes, os::vm_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2574
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2575
  // In 4K mode always use mmap.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2576
  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2577
  if (os::vm_page_size() == SIZE_4K) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2578
    return reserve_mmaped_memory(bytes, requested_addr, 0);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2579
  } else {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2580
    if (bytes >= Use64KPagesThreshold) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2581
      return reserve_shmated_memory(bytes, requested_addr, 0);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2582
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  2583
      return reserve_mmaped_memory(bytes, requested_addr, 0);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2584
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2585
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2586
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2587
  return addr;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2588
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2589
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2590
size_t os::read(int fd, void *buf, unsigned int nBytes) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2591
  return ::read(fd, buf, nBytes);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2592
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2593
27562
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2594
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2595
  return ::pread(fd, buf, nBytes, offset);
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2596
}
47f369e3c69c 8049367: Modular Run-Time Images
chegar
parents: 27474
diff changeset
  2597
22877
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2598
void os::naked_short_sleep(jlong ms) {
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2599
  struct timespec req;
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2600
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2601
  assert(ms < 1000, "Un-interruptable sleep, short time use only");
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2602
  req.tv_sec = 0;
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2603
  if (ms > 0) {
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2604
    req.tv_nsec = (ms % 1000) * 1000000;
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2605
  }
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2606
  else {
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2607
    req.tv_nsec = 1;
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2608
  }
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2609
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2610
  nanosleep(&req, NULL);
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2611
121e3c2d2238 8034797: AIX: Fix os::naked_short_sleep() in os_aix.cpp after 8028280
goetz
parents: 22867
diff changeset
  2612
  return;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2613
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2614
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2615
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2616
void os::infinite_sleep() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2617
  while (true) {    // sleep forever ...
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2618
    ::sleep(100);   // ... 100 seconds at a time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2619
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2620
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2621
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2622
// Used to convert frequent JVM_Yield() to nops
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2623
bool os::dont_yield() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2624
  return DontYieldALot;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2625
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2626
25477
7dad9f95fd31 8047714: Fix for JDK-6546236 made Solaris os::yield() a no-op
fparain
parents: 25468
diff changeset
  2627
void os::naked_yield() {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2628
  sched_yield();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2629
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2630
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2631
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2632
// thread priority support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2633
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2634
// From AIX manpage to pthread_setschedparam
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2635
// (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2636
//    topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm):
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2637
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2638
// "If schedpolicy is SCHED_OTHER, then sched_priority must be in the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2639
// range from 40 to 80, where 40 is the least favored priority and 80
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2640
// is the most favored."
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2641
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2642
// (Actually, I doubt this even has an impact on AIX, as we do kernel
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2643
// scheduling there; however, this still leaves iSeries.)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2644
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2645
// We use the same values for AIX and PASE.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2646
int os::java_to_os_priority[CriticalPriority + 1] = {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2647
  54,             // 0 Entry should never be used
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2648
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2649
  55,             // 1 MinPriority
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2650
  55,             // 2
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2651
  56,             // 3
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2652
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2653
  56,             // 4
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2654
  57,             // 5 NormPriority
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2655
  57,             // 6
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2656
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2657
  58,             // 7
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2658
  58,             // 8
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2659
  59,             // 9 NearMaxPriority
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2660
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2661
  60,             // 10 MaxPriority
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2662
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2663
  60              // 11 CriticalPriority
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2664
};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2665
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2666
OSReturn os::set_native_priority(Thread* thread, int newpri) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2667
  if (!UseThreadPriorities) return OS_OK;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2668
  pthread_t thr = thread->osthread()->pthread_id();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2669
  int policy = SCHED_OTHER;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2670
  struct sched_param param;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2671
  param.sched_priority = newpri;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2672
  int ret = pthread_setschedparam(thr, policy, &param);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2673
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  2674
  if (ret != 0) {
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  2675
    trcVerbose("Could not change priority for thread %d to %d (error %d, %s)",
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  2676
        (int)thr, newpri, ret, strerror(ret));
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2677
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2678
  return (ret == 0) ? OS_OK : OS_ERR;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2679
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2680
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2681
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2682
  if (!UseThreadPriorities) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2683
    *priority_ptr = java_to_os_priority[NormPriority];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2684
    return OS_OK;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2685
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2686
  pthread_t thr = thread->osthread()->pthread_id();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2687
  int policy = SCHED_OTHER;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2688
  struct sched_param param;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2689
  int ret = pthread_getschedparam(thr, &policy, &param);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2690
  *priority_ptr = param.sched_priority;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2691
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2692
  return (ret == 0) ? OS_OK : OS_ERR;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2693
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2694
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2695
// Hint to the underlying OS that a task switch would not be good.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2696
// Void return because it's a hint and can fail.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2697
void os::hint_no_preempt() {}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2698
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2699
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2700
// suspend/resume support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2701
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2702
//  the low-level signal-based suspend/resume support is a remnant from the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2703
//  old VM-suspension that used to be for java-suspension, safepoints etc,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2704
//  within hotspot. Now there is a single use-case for this:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2705
//    - calling get_thread_pc() on the VMThread by the flat-profiler task
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2706
//      that runs in the watcher thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2707
//  The remaining code is greatly simplified from the more general suspension
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2708
//  code that used to be used.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2709
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2710
//  The protocol is quite simple:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2711
//  - suspend:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2712
//      - sends a signal to the target thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2713
//      - polls the suspend state of the osthread using a yield loop
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2714
//      - target thread signal handler (SR_handler) sets suspend state
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2715
//        and blocks in sigsuspend until continued
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2716
//  - resume:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2717
//      - sets target osthread state to continue
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2718
//      - sends signal to end the sigsuspend loop in the SR_handler
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2719
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2720
//  Note that the SR_lock plays no role in this suspend/resume protocol.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2721
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2722
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2723
static void resume_clear_context(OSThread *osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2724
  osthread->set_ucontext(NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2725
  osthread->set_siginfo(NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2726
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2727
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2728
static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2729
  osthread->set_ucontext(context);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2730
  osthread->set_siginfo(siginfo);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2731
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2732
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2733
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2734
// Handler function invoked when a thread's execution is suspended or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2735
// resumed. We have to be careful that only async-safe functions are
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2736
// called here (Note: most pthread functions are not async safe and
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2737
// should be avoided.)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2738
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2739
// Note: sigwait() is a more natural fit than sigsuspend() from an
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2740
// interface point of view, but sigwait() prevents the signal hander
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2741
// from being run. libpthread would get very confused by not having
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2742
// its signal handlers run and prevents sigwait()'s use with the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2743
// mutex granting granting signal.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2744
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2745
// Currently only ever called on the VMThread and JavaThreads (PC sampling).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2746
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2747
static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2748
  // Save and restore errno to avoid confusing native code with EINTR
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2749
  // after sigsuspend.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2750
  int old_errno = errno;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2751
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2752
  Thread* thread = Thread::current();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2753
  OSThread* osthread = thread->osthread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2754
  assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2755
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2756
  os::SuspendResume::State current = osthread->sr.state();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2757
  if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2758
    suspend_save_context(osthread, siginfo, context);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2759
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2760
    // attempt to switch the state, we assume we had a SUSPEND_REQUEST
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2761
    os::SuspendResume::State state = osthread->sr.suspended();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2762
    if (state == os::SuspendResume::SR_SUSPENDED) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2763
      sigset_t suspend_set;  // signals for sigsuspend()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2764
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2765
      // get current set of blocked signals and unblock resume signal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2766
      pthread_sigmask(SIG_BLOCK, NULL, &suspend_set);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2767
      sigdelset(&suspend_set, SR_signum);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2768
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2769
      // wait here until we are resumed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2770
      while (1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2771
        sigsuspend(&suspend_set);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2772
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2773
        os::SuspendResume::State result = osthread->sr.running();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2774
        if (result == os::SuspendResume::SR_RUNNING) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2775
          break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2776
        }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2777
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2778
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2779
    } else if (state == os::SuspendResume::SR_RUNNING) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2780
      // request was cancelled, continue
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2781
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2782
      ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2783
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2784
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2785
    resume_clear_context(osthread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2786
  } else if (current == os::SuspendResume::SR_RUNNING) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2787
    // request was cancelled, continue
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2788
  } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2789
    // ignore
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2790
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2791
    ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2792
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2793
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2794
  errno = old_errno;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2795
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2796
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2797
static int SR_initialize() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2798
  struct sigaction act;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2799
  char *s;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2800
  // Get signal number to use for suspend/resume
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2801
  if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2802
    int sig = ::strtol(s, 0, 10);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2803
    if (sig > 0 || sig < NSIG) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2804
      SR_signum = sig;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2805
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2806
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2807
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2808
  assert(SR_signum > SIGSEGV && SR_signum > SIGBUS,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2809
        "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2810
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2811
  sigemptyset(&SR_sigset);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2812
  sigaddset(&SR_sigset, SR_signum);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2813
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2814
  // Set up signal handler for suspend/resume.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2815
  act.sa_flags = SA_RESTART|SA_SIGINFO;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2816
  act.sa_handler = (void (*)(int)) SR_handler;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2817
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2818
  // SR_signum is blocked by default.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2819
  // 4528190 - We also need to block pthread restart signal (32 on all
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2820
  // supported Linux platforms). Note that LinuxThreads need to block
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2821
  // this signal for all threads to work properly. So we don't have
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2822
  // to use hard-coded signal number when setting up the mask.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2823
  pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2824
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2825
  if (sigaction(SR_signum, &act, 0) == -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2826
    return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2827
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2828
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2829
  // Save signal flag
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2830
  os::Aix::set_our_sigflags(SR_signum, act.sa_flags);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2831
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2832
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2833
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2834
static int SR_finalize() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2835
  return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2836
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2837
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2838
static int sr_notify(OSThread* osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2839
  int status = pthread_kill(osthread->pthread_id(), SR_signum);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2840
  assert_status(status == 0, status, "pthread_kill");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2841
  return status;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2842
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2843
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2844
// "Randomly" selected value for how long we want to spin
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2845
// before bailing out on suspending a thread, also how often
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2846
// we send a signal to a thread we want to resume
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2847
static const int RANDOMLY_LARGE_INTEGER = 1000000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2848
static const int RANDOMLY_LARGE_INTEGER2 = 100;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2849
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2850
// returns true on success and false on error - really an error is fatal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2851
// but this seems the normal response to library errors
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2852
static bool do_suspend(OSThread* osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2853
  assert(osthread->sr.is_running(), "thread should be running");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2854
  // mark as suspended and send signal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2855
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2856
  if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2857
    // failed to switch, state wasn't running?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2858
    ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2859
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2860
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2861
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2862
  if (sr_notify(osthread) != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2863
    // try to cancel, switch to running
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2864
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2865
    os::SuspendResume::State result = osthread->sr.cancel_suspend();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2866
    if (result == os::SuspendResume::SR_RUNNING) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2867
      // cancelled
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2868
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2869
    } else if (result == os::SuspendResume::SR_SUSPENDED) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2870
      // somehow managed to suspend
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2871
      return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2872
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2873
      ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2874
      return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2875
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2876
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2877
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2878
  // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2879
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2880
  for (int n = 0; !osthread->sr.is_suspended(); n++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2881
    for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
25477
7dad9f95fd31 8047714: Fix for JDK-6546236 made Solaris os::yield() a no-op
fparain
parents: 25468
diff changeset
  2882
      os::naked_yield();
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2883
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2884
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2885
    // timeout, try to cancel the request
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2886
    if (n >= RANDOMLY_LARGE_INTEGER) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2887
      os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2888
      if (cancelled == os::SuspendResume::SR_RUNNING) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2889
        return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2890
      } else if (cancelled == os::SuspendResume::SR_SUSPENDED) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2891
        return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2892
      } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2893
        ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2894
        return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2895
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2896
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2897
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2898
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2899
  guarantee(osthread->sr.is_suspended(), "Must be suspended");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2900
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2901
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2902
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2903
static void do_resume(OSThread* osthread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2904
  //assert(osthread->sr.is_suspended(), "thread should be suspended");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2905
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2906
  if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2907
    // failed to switch to WAKEUP_REQUEST
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2908
    ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2909
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2910
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2911
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2912
  while (!osthread->sr.is_running()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2913
    if (sr_notify(osthread) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2914
      for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2915
        for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
25477
7dad9f95fd31 8047714: Fix for JDK-6546236 made Solaris os::yield() a no-op
fparain
parents: 25468
diff changeset
  2916
          os::naked_yield();
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2917
        }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2918
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2919
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2920
      ShouldNotReachHere();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2921
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2922
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2923
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2924
  guarantee(osthread->sr.is_running(), "Must be running!");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2925
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2926
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2927
///////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2928
// signal handling (except suspend/resume)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2929
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2930
// This routine may be used by user applications as a "hook" to catch signals.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2931
// The user-defined signal handler must pass unrecognized signals to this
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2932
// routine, and if it returns true (non-zero), then the signal handler must
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2933
// return immediately. If the flag "abort_if_unrecognized" is true, then this
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2934
// routine will never retun false (zero), but instead will execute a VM panic
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2935
// routine kill the process.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2936
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2937
// If this routine returns false, it is OK to call it again. This allows
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2938
// the user-defined signal handler to perform checks either before or after
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2939
// the VM performs its own checks. Naturally, the user code would be making
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2940
// a serious error if it tried to handle an exception (such as a null check
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2941
// or breakpoint) that the VM was generating for its own correct operation.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2942
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2943
// This routine may recognize any of the following kinds of signals:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2944
//   SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2945
// It should be consulted by handlers for any of those signals.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2946
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2947
// The caller of this routine must pass in the three arguments supplied
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2948
// to the function referred to in the "sa_sigaction" (not the "sa_handler")
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2949
// field of the structure passed to sigaction(). This routine assumes that
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2950
// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2951
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2952
// Note that the VM will print warnings if it detects conflicting signal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2953
// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers".
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2954
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2955
extern "C" JNIEXPORT int
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2956
JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2957
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2958
// Set thread signal mask (for some reason on AIX sigthreadmask() seems
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2959
// to be the thing to call; documentation is not terribly clear about whether
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2960
// pthread_sigmask also works, and if it does, whether it does the same.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2961
bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2962
  const int rc = ::pthread_sigmask(how, set, oset);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2963
  // return value semantics differ slightly for error case:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2964
  // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2965
  // (so, pthread_sigmask is more theadsafe for error handling)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2966
  // But success is always 0.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2967
  return rc == 0 ? true : false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2968
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2969
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2970
// Function to unblock all signals which are, according
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2971
// to POSIX, typical program error signals. If they happen while being blocked,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2972
// they typically will bring down the process immediately.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2973
bool unblock_program_error_signals() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2974
  sigset_t set;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2975
  ::sigemptyset(&set);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2976
  ::sigaddset(&set, SIGILL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2977
  ::sigaddset(&set, SIGBUS);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2978
  ::sigaddset(&set, SIGFPE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2979
  ::sigaddset(&set, SIGSEGV);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2980
  return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2981
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2982
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2983
// Renamed from 'signalHandler' to avoid collision with other shared libs.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2984
void javaSignalHandler(int sig, siginfo_t* info, void* uc) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2985
  assert(info != NULL && uc != NULL, "it must be old kernel");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2986
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2987
  // Never leave program error signals blocked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2988
  // on all our platforms they would bring down the process immediately when
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2989
  // getting raised while being blocked.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2990
  unblock_program_error_signals();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2991
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2992
  JVM_handle_aix_signal(sig, info, uc, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2993
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2994
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2995
// This boolean allows users to forward their own non-matching signals
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2996
// to JVM_handle_aix_signal, harmlessly.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2997
bool os::Aix::signal_handlers_are_installed = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2998
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  2999
// For signal-chaining
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3000
struct sigaction os::Aix::sigact[MAXSIGNUM];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3001
unsigned int os::Aix::sigs = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3002
bool os::Aix::libjsig_is_loaded = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3003
typedef struct sigaction *(*get_signal_t)(int);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3004
get_signal_t os::Aix::get_signal_action = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3005
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3006
struct sigaction* os::Aix::get_chained_signal_action(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3007
  struct sigaction *actp = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3008
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3009
  if (libjsig_is_loaded) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3010
    // Retrieve the old signal handler from libjsig
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3011
    actp = (*get_signal_action)(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3012
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3013
  if (actp == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3014
    // Retrieve the preinstalled signal handler from jvm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3015
    actp = get_preinstalled_handler(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3016
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3017
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3018
  return actp;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3019
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3020
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3021
static bool call_chained_handler(struct sigaction *actp, int sig,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3022
                                 siginfo_t *siginfo, void *context) {
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3023
  // Call the old signal handler
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3024
  if (actp->sa_handler == SIG_DFL) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3025
    // It's more reasonable to let jvm treat it as an unexpected exception
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3026
    // instead of taking the default action.
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3027
    return false;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3028
  } else if (actp->sa_handler != SIG_IGN) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3029
    if ((actp->sa_flags & SA_NODEFER) == 0) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3030
      // automaticlly block the signal
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3031
      sigaddset(&(actp->sa_mask), sig);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3032
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3033
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3034
    sa_handler_t hand = NULL;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3035
    sa_sigaction_t sa = NULL;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3036
    bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3037
    // retrieve the chained handler
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3038
    if (siginfo_flag_set) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3039
      sa = actp->sa_sigaction;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3040
    } else {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3041
      hand = actp->sa_handler;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3042
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3043
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3044
    if ((actp->sa_flags & SA_RESETHAND) != 0) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3045
      actp->sa_handler = SIG_DFL;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3046
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3047
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3048
    // try to honor the signal mask
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3049
    sigset_t oset;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3050
    pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3051
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3052
    // call into the chained handler
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3053
    if (siginfo_flag_set) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3054
      (*sa)(sig, siginfo, context);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3055
    } else {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3056
      (*hand)(sig);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3057
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3058
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3059
    // restore the signal mask
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3060
    pthread_sigmask(SIG_SETMASK, &oset, 0);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3061
  }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3062
  // Tell jvm's signal handler the signal is taken care of.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3063
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3064
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3065
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3066
bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3067
  bool chained = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3068
  // signal-chaining
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3069
  if (UseSignalChaining) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3070
    struct sigaction *actp = get_chained_signal_action(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3071
    if (actp != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3072
      chained = call_chained_handler(actp, sig, siginfo, context);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3073
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3074
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3075
  return chained;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3076
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3077
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3078
struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3079
  if ((((unsigned int)1 << sig) & sigs) != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3080
    return &sigact[sig];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3081
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3082
  return NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3083
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3084
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3085
void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3086
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3087
  sigact[sig] = oldAct;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3088
  sigs |= (unsigned int)1 << sig;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3089
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3090
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3091
// for diagnostic
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3092
int os::Aix::sigflags[MAXSIGNUM];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3093
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3094
int os::Aix::get_our_sigflags(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3095
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3096
  return sigflags[sig];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3097
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3098
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3099
void os::Aix::set_our_sigflags(int sig, int flags) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3100
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3101
  sigflags[sig] = flags;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3102
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3103
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3104
void os::Aix::set_signal_handler(int sig, bool set_installed) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3105
  // Check for overwrite.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3106
  struct sigaction oldAct;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3107
  sigaction(sig, (struct sigaction*)NULL, &oldAct);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3108
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3109
  void* oldhand = oldAct.sa_sigaction
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3110
    ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3111
    : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3112
  // Renamed 'signalHandler' to avoid collision with other shared libs.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3113
  if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3114
      oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3115
      oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3116
    if (AllowUserSignalHandlers || !set_installed) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3117
      // Do not overwrite; user takes responsibility to forward to us.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3118
      return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3119
    } else if (UseSignalChaining) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3120
      // save the old handler in jvm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3121
      save_preinstalled_handler(sig, oldAct);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3122
      // libjsig also interposes the sigaction() call below and saves the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3123
      // old sigaction on it own.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3124
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3125
      fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3126
                    "%#lx for signal %d.", (long)oldhand, sig));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3127
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3128
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3129
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3130
  struct sigaction sigAct;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3131
  sigfillset(&(sigAct.sa_mask));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3132
  if (!set_installed) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3133
    sigAct.sa_handler = SIG_DFL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3134
    sigAct.sa_flags = SA_RESTART;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3135
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3136
    // Renamed 'signalHandler' to avoid collision with other shared libs.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3137
    sigAct.sa_sigaction = javaSignalHandler;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3138
    sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3139
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3140
  // Save flags, which are set by ours
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3141
  assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3142
  sigflags[sig] = sigAct.sa_flags;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3143
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3144
  int ret = sigaction(sig, &sigAct, &oldAct);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3145
  assert(ret == 0, "check");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3146
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3147
  void* oldhand2 = oldAct.sa_sigaction
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3148
                 ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3149
                 : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3150
  assert(oldhand2 == oldhand, "no concurrent signal handler installation");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3151
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3152
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3153
// install signal handlers for signals that HotSpot needs to
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3154
// handle in order to support Java-level exception handling.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3155
void os::Aix::install_signal_handlers() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3156
  if (!signal_handlers_are_installed) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3157
    signal_handlers_are_installed = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3158
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3159
    // signal-chaining
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3160
    typedef void (*signal_setting_t)();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3161
    signal_setting_t begin_signal_setting = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3162
    signal_setting_t end_signal_setting = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3163
    begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3164
                             dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting"));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3165
    if (begin_signal_setting != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3166
      end_signal_setting = CAST_TO_FN_PTR(signal_setting_t,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3167
                             dlsym(RTLD_DEFAULT, "JVM_end_signal_setting"));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3168
      get_signal_action = CAST_TO_FN_PTR(get_signal_t,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3169
                            dlsym(RTLD_DEFAULT, "JVM_get_signal_action"));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3170
      libjsig_is_loaded = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3171
      assert(UseSignalChaining, "should enable signal-chaining");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3172
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3173
    if (libjsig_is_loaded) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3174
      // Tell libjsig jvm is setting signal handlers
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3175
      (*begin_signal_setting)();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3176
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3177
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3178
    set_signal_handler(SIGSEGV, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3179
    set_signal_handler(SIGPIPE, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3180
    set_signal_handler(SIGBUS, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3181
    set_signal_handler(SIGILL, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3182
    set_signal_handler(SIGFPE, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3183
    set_signal_handler(SIGTRAP, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3184
    set_signal_handler(SIGXFSZ, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3185
    set_signal_handler(SIGDANGER, true);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3186
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3187
    if (libjsig_is_loaded) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3188
      // Tell libjsig jvm finishes setting signal handlers.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3189
      (*end_signal_setting)();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3190
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3191
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3192
    // We don't activate signal checker if libjsig is in place, we trust ourselves
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3193
    // and if UserSignalHandler is installed all bets are off.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3194
    // Log that signal checking is off only if -verbose:jni is specified.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3195
    if (CheckJNICalls) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3196
      if (libjsig_is_loaded) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3197
        tty->print_cr("Info: libjsig is activated, all active signal checking is disabled");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3198
        check_signals = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3199
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3200
      if (AllowUserSignalHandlers) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3201
        tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3202
        check_signals = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3203
      }
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3204
      // Need to initialize check_signal_done.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3205
      ::sigemptyset(&check_signal_done);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3206
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3207
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3208
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3209
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3210
static const char* get_signal_handler_name(address handler,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3211
                                           char* buf, int buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3212
  int offset;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3213
  bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3214
  if (found) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3215
    // skip directory names
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3216
    const char *p1, *p2;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3217
    p1 = buf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3218
    size_t len = strlen(os::file_separator());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3219
    while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3220
    // The way os::dll_address_to_library_name is implemented on Aix
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3221
    // right now, it always returns -1 for the offset which is not
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3222
    // terribly informative.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3223
    // Will fix that. For now, omit the offset.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3224
    jio_snprintf(buf, buflen, "%s", p1);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3225
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3226
    jio_snprintf(buf, buflen, PTR_FORMAT, handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3227
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3228
  return buf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3229
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3230
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3231
static void print_signal_handler(outputStream* st, int sig,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3232
                                 char* buf, size_t buflen) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3233
  struct sigaction sa;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3234
  sigaction(sig, NULL, &sa);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3235
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3236
  st->print("%s: ", os::exception_name(sig, buf, buflen));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3237
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3238
  address handler = (sa.sa_flags & SA_SIGINFO)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3239
    ? CAST_FROM_FN_PTR(address, sa.sa_sigaction)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3240
    : CAST_FROM_FN_PTR(address, sa.sa_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3241
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3242
  if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3243
    st->print("SIG_DFL");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3244
  } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3245
    st->print("SIG_IGN");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3246
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3247
    st->print("[%s]", get_signal_handler_name(handler, buf, buflen));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3248
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3249
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3250
  // Print readable mask.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3251
  st->print(", sa_mask[0]=");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3252
  os::Posix::print_signal_set_short(st, &sa.sa_mask);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3253
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3254
  address rh = VMError::get_resetted_sighandler(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3255
  // May be, handler was resetted by VMError?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3256
  if (rh != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3257
    handler = rh;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3258
    sa.sa_flags = VMError::get_resetted_sigflags(sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3259
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3260
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3261
  // Print textual representation of sa_flags.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3262
  st->print(", sa_flags=");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3263
  os::Posix::print_sa_flags(st, sa.sa_flags);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3264
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3265
  // Check: is it our handler?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3266
  if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) ||
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3267
      handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3268
    // It is our signal handler.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3269
    // Check for flags, reset system-used one!
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3270
    if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3271
      st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library",
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3272
                os::Aix::get_our_sigflags(sig));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3273
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3274
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3275
  st->cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3276
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3277
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3278
#define DO_SIGNAL_CHECK(sig) \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3279
  if (!sigismember(&check_signal_done, sig)) \
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3280
    os::Aix::check_signal_handler(sig)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3281
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3282
// This method is a periodic task to check for misbehaving JNI applications
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3283
// under CheckJNI, we can add any periodic checks here
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3284
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3285
void os::run_periodic_checks() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3286
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3287
  if (check_signals == false) return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3288
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3289
  // SEGV and BUS if overridden could potentially prevent
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3290
  // generation of hs*.log in the event of a crash, debugging
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3291
  // such a case can be very challenging, so we absolutely
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3292
  // check the following for a good measure:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3293
  DO_SIGNAL_CHECK(SIGSEGV);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3294
  DO_SIGNAL_CHECK(SIGILL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3295
  DO_SIGNAL_CHECK(SIGFPE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3296
  DO_SIGNAL_CHECK(SIGBUS);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3297
  DO_SIGNAL_CHECK(SIGPIPE);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3298
  DO_SIGNAL_CHECK(SIGXFSZ);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3299
  if (UseSIGTRAP) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3300
    DO_SIGNAL_CHECK(SIGTRAP);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3301
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3302
  DO_SIGNAL_CHECK(SIGDANGER);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3303
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3304
  // ReduceSignalUsage allows the user to override these handlers
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3305
  // see comments at the very top and jvm_solaris.h
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3306
  if (!ReduceSignalUsage) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3307
    DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3308
    DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3309
    DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3310
    DO_SIGNAL_CHECK(BREAK_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3311
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3312
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3313
  DO_SIGNAL_CHECK(SR_signum);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3314
  DO_SIGNAL_CHECK(INTERRUPT_SIGNAL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3315
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3316
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3317
typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3318
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3319
static os_sigaction_t os_sigaction = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3320
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3321
void os::Aix::check_signal_handler(int sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3322
  char buf[O_BUFLEN];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3323
  address jvmHandler = NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3324
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3325
  struct sigaction act;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3326
  if (os_sigaction == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3327
    // only trust the default sigaction, in case it has been interposed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3328
    os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3329
    if (os_sigaction == NULL) return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3330
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3331
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3332
  os_sigaction(sig, (struct sigaction*)NULL, &act);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3333
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3334
  address thisHandler = (act.sa_flags & SA_SIGINFO)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3335
    ? CAST_FROM_FN_PTR(address, act.sa_sigaction)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3336
    : CAST_FROM_FN_PTR(address, act.sa_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3337
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3338
  switch(sig) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3339
  case SIGSEGV:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3340
  case SIGBUS:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3341
  case SIGFPE:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3342
  case SIGPIPE:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3343
  case SIGILL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3344
  case SIGXFSZ:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3345
    // Renamed 'signalHandler' to avoid collision with other shared libs.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3346
    jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3347
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3348
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3349
  case SHUTDOWN1_SIGNAL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3350
  case SHUTDOWN2_SIGNAL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3351
  case SHUTDOWN3_SIGNAL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3352
  case BREAK_SIGNAL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3353
    jvmHandler = (address)user_handler();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3354
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3355
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3356
  case INTERRUPT_SIGNAL:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3357
    jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3358
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3359
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3360
  default:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3361
    if (sig == SR_signum) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3362
      jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3363
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3364
      return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3365
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3366
    break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3367
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3368
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3369
  if (thisHandler != jvmHandler) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3370
    tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3371
    tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3372
    tty->print_cr("  found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3373
    // No need to check this sig any longer
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3374
    sigaddset(&check_signal_done, sig);
23444
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22880
diff changeset
  3375
    // Running under non-interactive shell, SHUTDOWN2_SIGNAL will be reassigned SIG_IGN
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22880
diff changeset
  3376
    if (sig == SHUTDOWN2_SIGNAL && !isatty(fileno(stdin))) {
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22880
diff changeset
  3377
      tty->print_cr("Running in non-interactive shell, %s handler is replaced by shell",
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22880
diff changeset
  3378
                    exception_name(sig, buf, O_BUFLEN));
b5457261694b 6536943: Bogus -Xcheck:jni warning for SIG_INT action for SIGINT in JVM started from non-interactive shell
minqi
parents: 22880
diff changeset
  3379
    }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3380
  } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3381
    tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3382
    tty->print("expected:" PTR32_FORMAT, os::Aix::get_our_sigflags(sig));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3383
    tty->print_cr("  found:" PTR32_FORMAT, act.sa_flags);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3384
    // No need to check this sig any longer
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3385
    sigaddset(&check_signal_done, sig);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3386
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3387
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3388
  // Dump all the signal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3389
  if (sigismember(&check_signal_done, sig)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3390
    print_signal_handlers(tty, buf, O_BUFLEN);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3391
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3392
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3393
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3394
extern bool signal_name(int signo, char* buf, size_t len);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3395
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3396
const char* os::exception_name(int exception_code, char* buf, size_t size) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3397
  if (0 < exception_code && exception_code <= SIGRTMAX) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3398
    // signal
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3399
    if (!signal_name(exception_code, buf, size)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3400
      jio_snprintf(buf, size, "SIG%d", exception_code);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3401
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3402
    return buf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3403
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3404
    return NULL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3405
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3406
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3407
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3408
// To install functions for atexit system call
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3409
extern "C" {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3410
  static void perfMemory_exit_helper() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3411
    perfMemory_exit();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3412
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3413
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3414
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3415
// This is called _before_ the most of global arguments have been parsed.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3416
void os::init(void) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3417
  // This is basic, we want to know if that ever changes.
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3418
  // (Shared memory boundary is supposed to be a 256M aligned.)
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3419
  assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3420
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3421
  // First off, we need to know whether we run on AIX or PASE, and
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3422
  // the OS level we run on.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3423
  os::Aix::initialize_os_info();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3424
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3425
  // Scan environment (SPEC1170 behaviour, etc).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3426
  os::Aix::scan_environment();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3427
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3428
  // Check which pages are supported by AIX.
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3429
  query_multipage_support();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3430
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3431
  // Act like we only have one page size by eliminating corner cases which
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3432
  // we did not support very well anyway.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3433
  // We have two input conditions:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3434
  // 1) Data segment page size. This is controlled by linker setting (datapsize) on the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3435
  //    launcher, and/or by LDR_CNTRL environment variable. The latter overrules the linker
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3436
  //    setting.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3437
  //    Data segment page size is important for us because it defines the thread stack page
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3438
  //    size, which is needed for guard page handling, stack banging etc.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3439
  // 2) The ability to allocate 64k pages dynamically. If this is a given, java heap can
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3440
  //    and should be allocated with 64k pages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3441
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3442
  // So, we do the following:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3443
  // LDR_CNTRL    can_use_64K_pages_dynamically       what we do                      remarks
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3444
  // 4K           no                                  4K                              old systems (aix 5.2, as/400 v5r4) or new systems with AME activated
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3445
  // 4k           yes                                 64k (treat 4k stacks as 64k)    different loader than java and standard settings
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3446
  // 64k          no              --- AIX 5.2 ? ---
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3447
  // 64k          yes                                 64k                             new systems and standard java loader (we set datapsize=64k when linking)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3448
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3449
  // We explicitly leave no option to change page size, because only upgrading would work,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3450
  // not downgrading (if stack page size is 64k you cannot pretend its 4k).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3451
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3452
  if (g_multipage_support.datapsize == SIZE_4K) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3453
    // datapsize = 4K. Data segment, thread stacks are 4K paged.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3454
    if (g_multipage_support.can_use_64K_pages) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3455
      // .. but we are able to use 64K pages dynamically.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3456
      // This would be typical for java launchers which are not linked
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3457
      // with datapsize=64K (like, any other launcher but our own).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3458
      //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3459
      // In this case it would be smart to allocate the java heap with 64K
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3460
      // to get the performance benefit, and to fake 64k pages for the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3461
      // data segment (when dealing with thread stacks).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3462
      //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3463
      // However, leave a possibility to downgrade to 4K, using
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3464
      // -XX:-Use64KPages.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3465
      if (Use64KPages) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3466
        trcVerbose("64K page mode (faked for data segment)");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3467
        Aix::_page_size = SIZE_64K;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3468
      } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3469
        trcVerbose("4K page mode (Use64KPages=off)");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3470
        Aix::_page_size = SIZE_4K;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3471
      }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3472
    } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3473
      // .. and not able to allocate 64k pages dynamically. Here, just
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3474
      // fall back to 4K paged mode and use mmap for everything.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3475
      trcVerbose("4K page mode");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3476
      Aix::_page_size = SIZE_4K;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3477
      FLAG_SET_ERGO(bool, Use64KPages, false);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3478
    }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3479
  } else {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3480
    // datapsize = 64k. Data segment, thread stacks are 64k paged.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3481
    //   This normally means that we can allocate 64k pages dynamically.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3482
    //   (There is one special case where this may be false: EXTSHM=on.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3483
    //    but we decided to not support that mode).
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3484
    assert0(g_multipage_support.can_use_64K_pages);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3485
    Aix::_page_size = SIZE_64K;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3486
    trcVerbose("64K page mode");
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3487
    FLAG_SET_ERGO(bool, Use64KPages, true);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3488
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3489
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3490
  // Short-wire stack page size to base page size; if that works, we just remove
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3491
  // that stack page size altogether.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3492
  Aix::_stack_page_size = Aix::_page_size;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3493
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3494
  // For now UseLargePages is just ignored.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3495
  FLAG_SET_ERGO(bool, UseLargePages, false);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3496
  _page_sizes[0] = 0;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3497
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3498
  // debug trace
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3499
  trcVerbose("os::vm_page_size %s\n", describe_pagesize(os::vm_page_size()));
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3500
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3501
  // Next, we need to initialize libo4 and libperfstat libraries.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3502
  if (os::Aix::on_pase()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3503
    os::Aix::initialize_libo4();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3504
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3505
    os::Aix::initialize_libperfstat();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3506
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3507
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3508
  // Reset the perfstat information provided by ODM.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3509
  if (os::Aix::on_aix()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3510
    libperfstat::perfstat_reset();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3511
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3512
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3513
  // Now initialze basic system properties. Note that for some of the values we
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3514
  // need libperfstat etc.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3515
  os::Aix::initialize_system_info();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3516
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3517
  _initial_pid = getpid();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3518
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3519
  clock_tics_per_sec = sysconf(_SC_CLK_TCK);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3520
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3521
  init_random(1234567);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3522
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3523
  ThreadCritical::initialize();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3524
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3525
  // Main_thread points to the aboriginal thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3526
  Aix::_main_thread = pthread_self();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3527
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3528
  initial_time_count = os::elapsed_counter();
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3529
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3530
  // If the pagesize of the VM is greater than 8K determine the appropriate
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3531
  // number of initial guard pages. The user can change this with the
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3532
  // command line arguments, if needed.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3533
  if (vm_page_size() > (int)Aix::vm_default_page_size()) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3534
    StackYellowPages = 1;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3535
    StackRedPages = 1;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3536
    StackShadowPages = round_to((StackShadowPages*Aix::vm_default_page_size()), vm_page_size()) / vm_page_size();
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3537
  }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3538
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3539
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3540
// This is called _after_ the global arguments have been parsed.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3541
jint os::init_2(void) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3542
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3543
  trcVerbose("processor count: %d", os::_processor_count);
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3544
  trcVerbose("physical memory: %lu", Aix::_physical_memory);
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3545
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3546
  // Initially build up the loaded dll map.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3547
  LoadedLibraries::reload();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3548
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3549
  const int page_size = Aix::page_size();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3550
  const int map_size = page_size;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3551
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3552
  address map_address = (address) MAP_FAILED;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3553
  const int prot  = PROT_READ;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3554
  const int flags = MAP_PRIVATE|MAP_ANONYMOUS;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3555
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3556
  // Use optimized addresses for the polling page,
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3557
  // e.g. map it to a special 32-bit address.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3558
  if (OptimizePollingPageLocation) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3559
    // architecture-specific list of address wishes:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3560
    address address_wishes[] = {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3561
      // AIX: addresses lower than 0x30000000 don't seem to work on AIX.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3562
      // PPC64: all address wishes are non-negative 32 bit values where
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3563
      // the lower 16 bits are all zero. we can load these addresses
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3564
      // with a single ppc_lis instruction.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3565
      (address) 0x30000000, (address) 0x31000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3566
      (address) 0x32000000, (address) 0x33000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3567
      (address) 0x40000000, (address) 0x41000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3568
      (address) 0x42000000, (address) 0x43000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3569
      (address) 0x50000000, (address) 0x51000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3570
      (address) 0x52000000, (address) 0x53000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3571
      (address) 0x60000000, (address) 0x61000000,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3572
      (address) 0x62000000, (address) 0x63000000
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3573
    };
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3574
    int address_wishes_length = sizeof(address_wishes)/sizeof(address);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3575
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3576
    // iterate over the list of address wishes:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3577
    for (int i=0; i<address_wishes_length; i++) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3578
      // Try to map with current address wish.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3579
      // AIX: AIX needs MAP_FIXED if we provide an address and mmap will
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3580
      // fail if the address is already mapped.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3581
      map_address = (address) ::mmap(address_wishes[i] - (ssize_t)page_size,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3582
                                     map_size, prot,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3583
                                     flags | MAP_FIXED,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3584
                                     -1, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3585
      if (Verbose) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3586
        fprintf(stderr, "SafePoint Polling Page address: %p (wish) => %p\n",
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3587
                address_wishes[i], map_address + (ssize_t)page_size);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3588
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3589
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3590
      if (map_address + (ssize_t)page_size == address_wishes[i]) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3591
        // Map succeeded and map_address is at wished address, exit loop.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3592
        break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3593
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3594
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3595
      if (map_address != (address) MAP_FAILED) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3596
        // Map succeeded, but polling_page is not at wished address, unmap and continue.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3597
        ::munmap(map_address, map_size);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3598
        map_address = (address) MAP_FAILED;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3599
      }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3600
      // Map failed, continue loop.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3601
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3602
  } // end OptimizePollingPageLocation
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3603
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3604
  if (map_address == (address) MAP_FAILED) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3605
    map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3606
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3607
  guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3608
  os::set_polling_page(map_address);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3609
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3610
  if (!UseMembar) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3611
    address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3612
    guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3613
    os::set_memory_serialize_page(mem_serialize_page);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3614
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3615
#ifndef PRODUCT
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3616
    if (Verbose && PrintMiscellaneous) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3617
      tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3618
    }
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3619
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3620
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3621
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3622
  // initialize suspend/resume support - must do this before signal_sets_init()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3623
  if (SR_initialize() != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3624
    perror("SR_initialize failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3625
    return JNI_ERR;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3626
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3627
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3628
  Aix::signal_sets_init();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3629
  Aix::install_signal_handlers();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3630
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3631
  // Check minimum allowable stack size for thread creation and to initialize
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3632
  // the java system classes, including StackOverflowError - depends on page
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3633
  // size. Add a page for compiler2 recursion in main thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3634
  // Add in 2*BytesPerWord times page size to account for VM stack during
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3635
  // class initialization depending on 32 or 64 bit VM.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3636
  os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed,
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3637
            (size_t)(StackYellowPages+StackRedPages+StackShadowPages) * Aix::page_size() +
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3638
                     (2*BytesPerWord COMPILER2_PRESENT(+1)) * Aix::vm_default_page_size());
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3639
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3640
  os::Aix::min_stack_allowed = align_size_up(os::Aix::min_stack_allowed, os::Aix::page_size());
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3641
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3642
  size_t threadStackSizeInBytes = ThreadStackSize * K;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3643
  if (threadStackSizeInBytes != 0 &&
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3644
      threadStackSizeInBytes < os::Aix::min_stack_allowed) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3645
    tty->print_cr("\nThe stack size specified is too small, "
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3646
                  "Specify at least %dk",
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3647
                  os::Aix::min_stack_allowed / K);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3648
    return JNI_ERR;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3649
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3650
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3651
  // Make the stack size a multiple of the page size so that
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3652
  // the yellow/red zones can be guarded.
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  3653
  // Note that this can be 0, if no default stacksize was set.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3654
  JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size()));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3655
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3656
  Aix::libpthread_init();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3657
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3658
  if (MaxFDLimit) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3659
    // Set the number of file descriptors to max. print out error
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3660
    // if getrlimit/setrlimit fails but continue regardless.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3661
    struct rlimit nbr_files;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3662
    int status = getrlimit(RLIMIT_NOFILE, &nbr_files);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3663
    if (status != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3664
      if (PrintMiscellaneous && (Verbose || WizardMode))
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3665
        perror("os::init_2 getrlimit failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3666
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3667
      nbr_files.rlim_cur = nbr_files.rlim_max;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3668
      status = setrlimit(RLIMIT_NOFILE, &nbr_files);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3669
      if (status != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3670
        if (PrintMiscellaneous && (Verbose || WizardMode))
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3671
          perror("os::init_2 setrlimit failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3672
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3673
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3674
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3675
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3676
  if (PerfAllowAtExitRegistration) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3677
    // Only register atexit functions if PerfAllowAtExitRegistration is set.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3678
    // Atexit functions can be delayed until process exit time, which
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3679
    // can be problematic for embedded VM situations. Embedded VMs should
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3680
    // call DestroyJavaVM() to assure that VM resources are released.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3681
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  3682
    // Note: perfMemory_exit_helper atexit function may be removed in
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3683
    // the future if the appropriate cleanup code can be added to the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3684
    // VM_Exit VMOperation's doit method.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3685
    if (atexit(perfMemory_exit_helper) != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3686
      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3687
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3688
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3689
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3690
  return JNI_OK;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3691
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3692
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3693
// Mark the polling page as unreadable
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3694
void os::make_polling_page_unreadable(void) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3695
  if (!guard_memory((char*)_polling_page, Aix::page_size())) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3696
    fatal("Could not disable polling page");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3697
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3698
};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3699
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3700
// Mark the polling page as readable
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3701
void os::make_polling_page_readable(void) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3702
  // Changed according to os_linux.cpp.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3703
  if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3704
    fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3705
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3706
};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3707
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3708
int os::active_processor_count() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3709
  int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3710
  assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3711
  return online_cpus;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3712
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3713
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3714
void os::set_native_thread_name(const char *name) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3715
  // Not yet implemented.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3716
  return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3717
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3718
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3719
bool os::distribute_processes(uint length, uint* distribution) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3720
  // Not yet implemented.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3721
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3722
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3723
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3724
bool os::bind_to_processor(uint processor_id) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3725
  // Not yet implemented.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3726
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3727
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3728
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3729
void os::SuspendedThreadTask::internal_do_task() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3730
  if (do_suspend(_thread->osthread())) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3731
    SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3732
    do_task(context);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3733
    do_resume(_thread->osthread());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3734
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3735
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3736
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3737
class PcFetcher : public os::SuspendedThreadTask {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3738
public:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3739
  PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3740
  ExtendedPC result();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3741
protected:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3742
  void do_task(const os::SuspendedThreadTaskContext& context);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3743
private:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3744
  ExtendedPC _epc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3745
};
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3746
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3747
ExtendedPC PcFetcher::result() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3748
  guarantee(is_done(), "task is not done yet.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3749
  return _epc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3750
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3751
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3752
void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3753
  Thread* thread = context.thread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3754
  OSThread* osthread = thread->osthread();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3755
  if (osthread->ucontext() != NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3756
    _epc = os::Aix::ucontext_get_pc((ucontext_t *) context.ucontext());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3757
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3758
    // NULL context is unexpected, double-check this is the VMThread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3759
    guarantee(thread->is_VM_thread(), "can only be called for VMThread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3760
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3761
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3762
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3763
// Suspends the target using the signal mechanism and then grabs the PC before
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3764
// resuming the target. Used by the flat-profiler only
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3765
ExtendedPC os::get_thread_pc(Thread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3766
  // Make sure that it is called by the watcher for the VMThread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3767
  assert(Thread::current()->is_Watcher_thread(), "Must be watcher");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3768
  assert(thread->is_VM_thread(), "Can only be called for VMThread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3769
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3770
  PcFetcher fetcher(thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3771
  fetcher.run();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3772
  return fetcher.result();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3773
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3774
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3775
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3776
// debug support
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3777
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3778
static address same_page(address x, address y) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3779
  intptr_t page_bits = -os::vm_page_size();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3780
  if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3781
    return x;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3782
  else if (x > y)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3783
    return (address)(intptr_t(y) | ~page_bits) + 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3784
  else
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3785
    return (address)(intptr_t(y) & page_bits);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3786
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3787
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3788
bool os::find(address addr, outputStream* st) {
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3789
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3790
  st->print(PTR_FORMAT ": ", addr);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3791
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3792
  const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3793
  if (lib) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3794
    lib->print(st);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3795
    return true;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3796
  } else {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3797
    lib = LoadedLibraries::find_for_data_address(addr);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3798
    if (lib) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3799
      lib->print(st);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3800
      return true;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3801
    } else {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3802
      st->print_cr("(outside any module)");
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3803
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3804
  }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3805
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3806
  return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3807
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3808
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3809
////////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3810
// misc
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3811
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3812
// This does not do anything on Aix. This is basically a hook for being
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3813
// able to use structured exception handling (thread-local exception filters)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3814
// on, e.g., Win32.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3815
void
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3816
os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3817
                         JavaCallArguments* args, Thread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3818
  f(value, method, args, thread);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3819
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3820
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3821
void os::print_statistics() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3822
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3823
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3824
int os::message_box(const char* title, const char* message) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3825
  int i;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3826
  fdStream err(defaultStream::error_fd());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3827
  for (i = 0; i < 78; i++) err.print_raw("=");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3828
  err.cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3829
  err.print_raw_cr(title);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3830
  for (i = 0; i < 78; i++) err.print_raw("-");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3831
  err.cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3832
  err.print_raw_cr(message);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3833
  for (i = 0; i < 78; i++) err.print_raw("=");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3834
  err.cr();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3835
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3836
  char buf[16];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3837
  // Prevent process from exiting upon "read error" without consuming all CPU
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3838
  while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3839
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3840
  return buf[0] == 'y' || buf[0] == 'Y';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3841
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3842
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3843
int os::stat(const char *path, struct stat *sbuf) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3844
  char pathbuf[MAX_PATH];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3845
  if (strlen(path) > MAX_PATH - 1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3846
    errno = ENAMETOOLONG;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3847
    return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3848
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3849
  os::native_path(strcpy(pathbuf, path));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3850
  return ::stat(pathbuf, sbuf);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3851
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3852
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3853
bool os::check_heap(bool force) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3854
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3855
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3856
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3857
// Is a (classpath) directory empty?
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3858
bool os::dir_is_empty(const char* path) {
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3859
  DIR *dir = NULL;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3860
  struct dirent *ptr;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3861
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3862
  dir = opendir(path);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3863
  if (dir == NULL) return true;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3864
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3865
  /* Scan the directory */
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3866
  bool result = true;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3867
  char buf[sizeof(struct dirent) + MAX_PATH];
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3868
  while (result && (ptr = ::readdir(dir)) != NULL) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3869
    if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3870
      result = false;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3871
    }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3872
  }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3873
  closedir(dir);
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3874
  return result;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3875
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3876
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3877
// This code originates from JDK's sysOpen and open64_w
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3878
// from src/solaris/hpi/src/system_md.c
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3879
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3880
int os::open(const char *path, int oflag, int mode) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3881
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3882
  if (strlen(path) > MAX_PATH - 1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3883
    errno = ENAMETOOLONG;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3884
    return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3885
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3886
  int fd;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3887
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3888
  fd = ::open64(path, oflag, mode);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3889
  if (fd == -1) return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3890
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3891
  // If the open succeeded, the file might still be a directory.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3892
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3893
    struct stat64 buf64;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3894
    int ret = ::fstat64(fd, &buf64);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3895
    int st_mode = buf64.st_mode;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3896
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3897
    if (ret != -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3898
      if ((st_mode & S_IFMT) == S_IFDIR) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3899
        errno = EISDIR;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3900
        ::close(fd);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3901
        return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3902
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3903
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3904
      ::close(fd);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3905
      return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3906
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3907
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3908
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3909
  // All file descriptors that are opened in the JVM and not
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3910
  // specifically destined for a subprocess should have the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3911
  // close-on-exec flag set. If we don't set it, then careless 3rd
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3912
  // party native code might fork and exec without closing all
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3913
  // appropriate file descriptors (e.g. as we do in closeDescriptors in
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3914
  // UNIXProcess.c), and this in turn might:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3915
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3916
  // - cause end-of-file to fail to be detected on some file
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3917
  //   descriptors, resulting in mysterious hangs, or
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3918
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3919
  // - might cause an fopen in the subprocess to fail on a system
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3920
  //   suffering from bug 1085341.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3921
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3922
  // (Yes, the default setting of the close-on-exec flag is a Unix
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3923
  // design flaw.)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3924
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3925
  // See:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3926
  // 1085341: 32-bit stdio routines should support file descriptors >255
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3927
  // 4843136: (process) pipe file descriptor from Runtime.exec not being closed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3928
  // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3929
#ifdef FD_CLOEXEC
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3930
  {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3931
    int flags = ::fcntl(fd, F_GETFD);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3932
    if (flags != -1)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3933
      ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3934
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3935
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3936
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3937
  return fd;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3938
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3939
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3940
// create binary file, rewriting existing file if required
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3941
int os::create_binary_file(const char* path, bool rewrite_existing) {
22867
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3942
  int oflags = O_WRONLY | O_CREAT;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3943
  if (!rewrite_existing) {
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3944
    oflags |= O_EXCL;
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3945
  }
309bcf262a19 8031319: PPC64: Some fixes in ppc and aix coding.
goetz
parents: 22837
diff changeset
  3946
  return ::open64(path, oflags, S_IREAD | S_IWRITE);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3947
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3948
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3949
// return current position of file pointer
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3950
jlong os::current_file_offset(int fd) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3951
  return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3952
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3953
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3954
// move file pointer to the specified offset
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3955
jlong os::seek_to_file_offset(int fd, jlong offset) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3956
  return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3957
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3958
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3959
// This code originates from JDK's sysAvailable
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3960
// from src/solaris/hpi/src/native_threads/src/sys_api_td.c
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3961
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3962
int os::available(int fd, jlong *bytes) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3963
  jlong cur, end;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3964
  int mode;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3965
  struct stat64 buf64;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3966
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3967
  if (::fstat64(fd, &buf64) >= 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3968
    mode = buf64.st_mode;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3969
    if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3970
      // XXX: is the following call interruptible? If so, this might
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3971
      // need to go through the INTERRUPT_IO() wrapper as for other
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3972
      // blocking, interruptible calls in this file.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3973
      int n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3974
      if (::ioctl(fd, FIONREAD, &n) >= 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3975
        *bytes = n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3976
        return 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3977
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3978
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3979
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3980
  if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3981
    return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3982
  } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3983
    return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3984
  } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3985
    return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3986
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3987
  *bytes = end - cur;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3988
  return 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3989
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3990
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3991
// Map a block of memory.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3992
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3993
                        char *addr, size_t bytes, bool read_only,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  3994
                        bool allow_exec) {
27927
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  3995
  int prot;
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  3996
  int flags = MAP_PRIVATE;
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  3997
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  3998
  if (read_only) {
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  3999
    prot = PROT_READ;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4000
    flags = MAP_SHARED;
27927
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4001
  } else {
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4002
    prot = PROT_READ | PROT_WRITE;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4003
    flags = MAP_PRIVATE;
27927
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4004
  }
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4005
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4006
  if (allow_exec) {
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4007
    prot |= PROT_EXEC;
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4008
  }
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4009
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4010
  if (addr != NULL) {
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4011
    flags |= MAP_FIXED;
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4012
  }
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4013
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4014
  // Allow anonymous mappings if 'fd' is -1.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4015
  if (fd == -1) {
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4016
    flags |= MAP_ANONYMOUS;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4017
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4018
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4019
  char* mapped_address = (char*)::mmap(addr, (size_t)bytes, prot, flags,
27927
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4020
                                     fd, file_offset);
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4021
  if (mapped_address == MAP_FAILED) {
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4022
    return NULL;
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4023
  }
354a5ba966a9 8067015: Implement os::pd_map_memory() on AIX
simonis
parents: 27926
diff changeset
  4024
  return mapped_address;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4025
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4026
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4027
// Remap a block of memory.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4028
char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4029
                          char *addr, size_t bytes, bool read_only,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4030
                          bool allow_exec) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4031
  // same as map_memory() on this OS
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4032
  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4033
                        allow_exec);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4034
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4035
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4036
// Unmap a block of memory.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4037
bool os::pd_unmap_memory(char* addr, size_t bytes) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4038
  return munmap(addr, bytes) == 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4039
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4040
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4041
// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4042
// are used by JVM M&M and JVMTI to get user+sys or user CPU time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4043
// of a thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4044
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4045
// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4046
// the fast estimate available on the platform.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4047
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4048
jlong os::current_thread_cpu_time() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4049
  // return user + sys since the cost is the same
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4050
  const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4051
  assert(n >= 0, "negative CPU time");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4052
  return n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4053
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4054
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4055
jlong os::thread_cpu_time(Thread* thread) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4056
  // consistent with what current_thread_cpu_time() returns
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4057
  const jlong n = os::thread_cpu_time(thread, true /* user + sys */);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4058
  assert(n >= 0, "negative CPU time");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4059
  return n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4060
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4061
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4062
jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4063
  const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4064
  assert(n >= 0, "negative CPU time");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4065
  return n;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4066
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4067
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4068
static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4069
  bool error = false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4070
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4071
  jlong sys_time = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4072
  jlong user_time = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4073
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4074
  // Reimplemented using getthrds64().
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4075
  //
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4076
  // Works like this:
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4077
  // For the thread in question, get the kernel thread id. Then get the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4078
  // kernel thread statistics using that id.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4079
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4080
  // This only works of course when no pthread scheduling is used,
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4081
  // i.e. there is a 1:1 relationship to kernel threads.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4082
  // On AIX, see AIXTHREAD_SCOPE variable.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4083
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4084
  pthread_t pthtid = thread->osthread()->pthread_id();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4085
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4086
  // retrieve kernel thread id for the pthread:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4087
  tid64_t tid = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4088
  struct __pthrdsinfo pinfo;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4089
  // I just love those otherworldly IBM APIs which force me to hand down
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4090
  // dummy buffers for stuff I dont care for...
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4091
  char dummy[1];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4092
  int dummy_size = sizeof(dummy);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4093
  if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo),
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4094
                          dummy, &dummy_size) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4095
    tid = pinfo.__pi_tid;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4096
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4097
    tty->print_cr("pthread_getthrds_np failed.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4098
    error = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4099
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4100
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4101
  // retrieve kernel timing info for that kernel thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4102
  if (!error) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4103
    struct thrdentry64 thrdentry;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4104
    if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4105
      sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4106
      user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4107
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4108
      tty->print_cr("pthread_getthrds_np failed.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4109
      error = true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4110
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4111
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4112
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4113
  if (p_sys_time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4114
    *p_sys_time = sys_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4115
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4116
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4117
  if (p_user_time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4118
    *p_user_time = user_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4119
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4120
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4121
  if (error) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4122
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4123
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4124
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4125
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4126
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4127
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4128
jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4129
  jlong sys_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4130
  jlong user_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4131
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4132
  if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4133
    return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4134
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4135
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4136
  return user_sys_cpu_time ? sys_time + user_time : user_time;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4137
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4138
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4139
void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4140
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4141
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4142
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4143
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4144
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4145
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4146
void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4147
  info_ptr->max_value = ALL_64_BITS;       // will not wrap in less than 64 bits
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4148
  info_ptr->may_skip_backward = false;     // elapsed time not wall time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4149
  info_ptr->may_skip_forward = false;      // elapsed time not wall time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4150
  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;  // user+system time is returned
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4151
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4152
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4153
bool os::is_thread_cpu_time_supported() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4154
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4155
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4156
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4157
// System loadavg support. Returns -1 if load average cannot be obtained.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4158
// For now just return the system wide load average (no processor sets).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4159
int os::loadavg(double values[], int nelem) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4160
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4161
  // Implemented using libperfstat on AIX.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4162
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4163
  guarantee(nelem >= 0 && nelem <= 3, "argument error");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4164
  guarantee(values, "argument error");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4165
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4166
  if (os::Aix::on_pase()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4167
    Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4168
    return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4169
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4170
    // AIX: use libperfstat
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4171
    //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4172
    // See also:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4173
    // http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_cputot.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4174
    // /usr/include/libperfstat.h:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4175
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4176
    // Use the already AIX version independent get_cpuinfo.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4177
    os::Aix::cpuinfo_t ci;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4178
    if (os::Aix::get_cpuinfo(&ci)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4179
      for (int i = 0; i < nelem; i++) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4180
        values[i] = ci.loadavg[i];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4181
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4182
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4183
      return -1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4184
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4185
    return nelem;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4186
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4187
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4188
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4189
void os::pause() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4190
  char filename[MAX_PATH];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4191
  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4192
    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4193
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4194
    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4195
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4196
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4197
  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4198
  if (fd != -1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4199
    struct stat buf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4200
    ::close(fd);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4201
    while (::stat(filename, &buf) == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4202
      (void)::poll(NULL, 0, 100);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4203
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4204
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4205
    jio_fprintf(stderr,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4206
      "Could not open pause file '%s', continuing immediately.\n", filename);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4207
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4208
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4209
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4210
bool os::Aix::is_primordial_thread() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4211
  if (pthread_self() == (pthread_t)1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4212
    return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4213
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4214
    return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4215
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4216
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4217
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4218
// OS recognitions (PASE/AIX, OS level) call this before calling any
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4219
// one of Aix::on_pase(), Aix::os_version() static
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4220
void os::Aix::initialize_os_info() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4221
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4222
  assert(_on_pase == -1 && _os_version == -1, "already called.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4223
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4224
  struct utsname uts;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4225
  memset(&uts, 0, sizeof(uts));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4226
  strcpy(uts.sysname, "?");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4227
  if (::uname(&uts) == -1) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4228
    trc("uname failed (%d)", errno);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4229
    guarantee(0, "Could not determine whether we run on AIX or PASE");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4230
  } else {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4231
    trcVerbose("uname says: sysname \"%s\" version \"%s\" release \"%s\" "
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4232
               "node \"%s\" machine \"%s\"\n",
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4233
               uts.sysname, uts.version, uts.release, uts.nodename, uts.machine);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4234
    const int major = atoi(uts.version);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4235
    assert(major > 0, "invalid OS version");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4236
    const int minor = atoi(uts.release);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4237
    assert(minor > 0, "invalid OS release");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4238
    _os_version = (major << 8) | minor;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4239
    if (strcmp(uts.sysname, "OS400") == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4240
      Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4241
    } else if (strcmp(uts.sysname, "AIX") == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4242
      // We run on AIX. We do not support versions older than AIX 5.3.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4243
      _on_pase = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4244
      if (_os_version < 0x0503) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4245
        trc("AIX release older than AIX 5.3 not supported.");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4246
        assert(false, "AIX release too old.");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4247
      } else {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4248
        trcVerbose("We run on AIX %d.%d\n", major, minor);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4249
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4250
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4251
      assert(false, "unknown OS");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4252
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4253
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4254
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4255
  guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4256
} // end: os::Aix::initialize_os_info()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4257
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4258
// Scan environment for important settings which might effect the VM.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4259
// Trace out settings. Warn about invalid settings and/or correct them.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4260
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4261
// Must run after os::Aix::initialue_os_info().
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4262
void os::Aix::scan_environment() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4263
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4264
  char* p;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4265
  int rc;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4266
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4267
  // Warn explicity if EXTSHM=ON is used. That switch changes how
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4268
  // System V shared memory behaves. One effect is that page size of
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4269
  // shared memory cannot be change dynamically, effectivly preventing
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4270
  // large pages from working.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4271
  // This switch was needed on AIX 32bit, but on AIX 64bit the general
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4272
  // recommendation is (in OSS notes) to switch it off.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4273
  p = ::getenv("EXTSHM");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4274
  if (Verbose) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4275
    fprintf(stderr, "EXTSHM=%s.\n", p ? p : "<unset>");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4276
  }
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4277
  if (p && strcasecmp(p, "ON") == 0) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4278
    fprintf(stderr, "Unsupported setting: EXTSHM=ON. Large Page support will be disabled.\n");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4279
    _extshm = 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4280
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4281
    _extshm = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4282
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4283
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4284
  // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4285
  // Not tested, not supported.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4286
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4287
  // Note that it might be worth the trouble to test and to require it, if only to
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4288
  // get useful return codes for mprotect.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4289
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4290
  // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4291
  // exec() ? before loading the libjvm ? ....)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4292
  p = ::getenv("XPG_SUS_ENV");
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4293
  trcVerbose("XPG_SUS_ENV=%s.", p ? p : "<unset>");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4294
  if (p && strcmp(p, "ON") == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4295
    _xpg_sus_mode = 1;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4296
    trc("Unsupported setting: XPG_SUS_ENV=ON");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4297
    // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4298
    // clobber address ranges. If we ever want to support that, we have to do some
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4299
    // testing first.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4300
    guarantee(false, "XPG_SUS_ENV=ON not supported");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4301
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4302
    _xpg_sus_mode = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4303
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4304
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4305
  // Switch off AIX internal (pthread) guard pages. This has
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4306
  // immediate effect for any pthread_create calls which follow.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4307
  p = ::getenv("AIXTHREAD_GUARDPAGES");
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4308
  trcVerbose("AIXTHREAD_GUARDPAGES=%s.", p ? p : "<unset>");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4309
  rc = ::putenv("AIXTHREAD_GUARDPAGES=0");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4310
  guarantee(rc == 0, "");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4311
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4312
} // end: os::Aix::scan_environment()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4313
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4314
// PASE: initialize the libo4 library (AS400 PASE porting library).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4315
void os::Aix::initialize_libo4() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4316
  Unimplemented();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4317
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4318
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4319
// AIX: initialize the libperfstat library (we load this dynamically
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4320
// because it is only available on AIX.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4321
void os::Aix::initialize_libperfstat() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4322
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4323
  assert(os::Aix::on_aix(), "AIX only");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4324
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4325
  if (!libperfstat::init()) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4326
    trc("libperfstat initialization failed.");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4327
    assert(false, "libperfstat initialization failed");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4328
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4329
    if (Verbose) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4330
      fprintf(stderr, "libperfstat initialized.\n");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4331
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4332
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4333
} // end: os::Aix::initialize_libperfstat
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4334
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4335
/////////////////////////////////////////////////////////////////////////////
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4336
// thread stack
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4337
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4338
// Function to query the current stack size using pthread_getthrds_np.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4339
static bool query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) {
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4340
  // This only works when invoked on a pthread. As we agreed not to use
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4341
  // primordial threads anyway, I assert here.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4342
  guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4343
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4344
  // Information about this api can be found (a) in the pthread.h header and
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4345
  // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4346
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4347
  // The use of this API to find out the current stack is kind of undefined.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4348
  // But after a lot of tries and asking IBM about it, I concluded that it is safe
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4349
  // enough for cases where I let the pthread library create its stacks. For cases
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4350
  // where I create an own stack and pass this to pthread_create, it seems not to
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4351
  // work (the returned stack size in that case is 0).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4352
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4353
  pthread_t tid = pthread_self();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4354
  struct __pthrdsinfo pinfo;
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4355
  char dummy[1]; // We only need this to satisfy the api and to not get E.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4356
  int dummy_size = sizeof(dummy);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4357
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4358
  memset(&pinfo, 0, sizeof(pinfo));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4359
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4360
  const int rc = pthread_getthrds_np(&tid, PTHRDSINFO_QUERY_ALL, &pinfo,
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4361
                                     sizeof(pinfo), dummy, &dummy_size);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4362
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4363
  if (rc != 0) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4364
    assert0(false);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4365
    trcVerbose("pthread_getthrds_np failed (%d)", rc);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4366
    return false;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4367
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4368
  guarantee0(pinfo.__pi_stackend);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4369
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4370
  // The following can happen when invoking pthread_getthrds_np on a pthread running
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4371
  // on a user provided stack (when handing down a stack to pthread create, see
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4372
  // pthread_attr_setstackaddr).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4373
  // Not sure what to do here - I feel inclined to forbid this use case completely.
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4374
  guarantee0(pinfo.__pi_stacksize);
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4375
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4376
  // Note: the pthread stack on AIX seems to look like this:
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4377
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4378
  // ---------------------   real base ? at page border ?
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4379
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4380
  //     pthread internal data, like ~2K, see also
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4381
  //     http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/thread_supp_tun_params.htm
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4382
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4383
  // ---------------------   __pi_stackend - not page aligned, (xxxxF890)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4384
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4385
  //     stack
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4386
  //      ....
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4387
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4388
  //     stack
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4389
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4390
  // ---------------------   __pi_stackend  - __pi_stacksize
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4391
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4392
  //     padding due to AIX guard pages (?) see AIXTHREAD_GUARDPAGES
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4393
  // ---------------------   __pi_stackaddr  (page aligned if AIXTHREAD_GUARDPAGES > 0)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4394
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4395
  //   AIX guard pages (?)
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4396
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4397
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4398
  // So, the safe thing to do is to use the area from __pi_stackend to __pi_stackaddr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4399
  // __pi_stackend however is almost never page aligned.
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4400
  //
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4401
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4402
  if (p_stack_base) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4403
    (*p_stack_base) = (address) (pinfo.__pi_stackend);
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4404
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4405
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4406
  if (p_stack_size) {
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4407
    (*p_stack_size) = pinfo.__pi_stackend - pinfo.__pi_stackaddr;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4408
  }
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4409
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4410
  return true;
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4411
}
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4412
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4413
// Get the current stack base from the OS (actually, the pthread library).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4414
address os::current_stack_base() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4415
  address p;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4416
  query_stack_dimensions(&p, 0);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4417
  return p;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4418
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4419
30198
ec621727bd41 8075505: aix: improve handling of native memory
goetz
parents: 28737
diff changeset
  4420
// Get the current stack size from the OS (actually, the pthread library).
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4421
size_t os::current_stack_size() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4422
  size_t s;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4423
  query_stack_dimensions(0, &s);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4424
  return s;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4425
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4426
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4427
// Refer to the comments in os_solaris.cpp park-unpark.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4428
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4429
// Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4430
// hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4431
// For specifics regarding the bug see GLIBC BUGID 261237 :
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4432
//    http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4433
// Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4434
// will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4435
// is used. (The simple C test-case provided in the GLIBC bug report manifests the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4436
// hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4437
// and monitorenter when we're using 1-0 locking. All those operations may result in
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4438
// calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4439
// of libpthread avoids the problem, but isn't practical.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4440
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4441
// Possible remedies:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4442
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4443
// 1.   Establish a minimum relative wait time. 50 to 100 msecs seems to work.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4444
//      This is palliative and probabilistic, however. If the thread is preempted
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4445
//      between the call to compute_abstime() and pthread_cond_timedwait(), more
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4446
//      than the minimum period may have passed, and the abstime may be stale (in the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4447
//      past) resultin in a hang. Using this technique reduces the odds of a hang
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4448
//      but the JVM is still vulnerable, particularly on heavily loaded systems.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4449
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4450
// 2.   Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4451
//      of the usual flag-condvar-mutex idiom. The write side of the pipe is set
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4452
//      NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4453
//      reduces to poll()+read(). This works well, but consumes 2 FDs per extant
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4454
//      thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4455
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4456
// 3.   Embargo pthread_cond_timedwait() and implement a native "chron" thread
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4457
//      that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4458
//      a timeout request to the chron thread and then blocking via pthread_cond_wait().
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4459
//      This also works well. In fact it avoids kernel-level scalability impediments
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4460
//      on certain platforms that don't handle lots of active pthread_cond_timedwait()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4461
//      timers in a graceful fashion.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4462
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4463
// 4.   When the abstime value is in the past it appears that control returns
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4464
//      correctly from pthread_cond_timedwait(), but the condvar is left corrupt.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4465
//      Subsequent timedwait/wait calls may hang indefinitely. Given that, we
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4466
//      can avoid the problem by reinitializing the condvar -- by cond_destroy()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4467
//      followed by cond_init() -- after all calls to pthread_cond_timedwait().
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4468
//      It may be possible to avoid reinitialization by checking the return
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4469
//      value from pthread_cond_timedwait(). In addition to reinitializing the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4470
//      condvar we must establish the invariant that cond_signal() is only called
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4471
//      within critical sections protected by the adjunct mutex. This prevents
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4472
//      cond_signal() from "seeing" a condvar that's in the midst of being
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4473
//      reinitialized or that is corrupt. Sadly, this invariant obviates the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4474
//      desirable signal-after-unlock optimization that avoids futile context switching.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4475
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4476
//      I'm also concerned that some versions of NTPL might allocate an auxilliary
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4477
//      structure when a condvar is used or initialized. cond_destroy() would
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4478
//      release the helper structure. Our reinitialize-after-timedwait fix
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4479
//      put excessive stress on malloc/free and locks protecting the c-heap.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4480
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4481
// We currently use (4). See the WorkAroundNTPLTimedWaitHang flag.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4482
// It may be possible to refine (4) by checking the kernel and NTPL verisons
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4483
// and only enabling the work-around for vulnerable environments.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4484
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4485
// utility to compute the abstime argument to timedwait:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4486
// millis is the relative timeout time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4487
// abstime will be the absolute timeout time
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4488
// TODO: replace compute_abstime() with unpackTime()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4489
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4490
static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4491
  if (millis < 0) millis = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4492
  struct timeval now;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4493
  int status = gettimeofday(&now, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4494
  assert(status == 0, "gettimeofday");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4495
  jlong seconds = millis / 1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4496
  millis %= 1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4497
  if (seconds > 50000000) { // see man cond_timedwait(3T)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4498
    seconds = 50000000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4499
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4500
  abstime->tv_sec = now.tv_sec  + seconds;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4501
  long       usec = now.tv_usec + millis * 1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4502
  if (usec >= 1000000) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4503
    abstime->tv_sec += 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4504
    usec -= 1000000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4505
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4506
  abstime->tv_nsec = usec * 1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4507
  return abstime;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4508
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4509
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4510
// Test-and-clear _Event, always leaves _Event set to 0, returns immediately.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4511
// Conceptually TryPark() should be equivalent to park(0).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4512
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4513
int os::PlatformEvent::TryPark() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4514
  for (;;) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4515
    const int v = _Event;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4516
    guarantee ((v == 0) || (v == 1), "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4517
    if (Atomic::cmpxchg (0, &_Event, v) == v) return v;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4518
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4519
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4520
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4521
void os::PlatformEvent::park() {       // AKA "down()"
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4522
  // Invariant: Only the thread associated with the Event/PlatformEvent
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4523
  // may call park().
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4524
  // TODO: assert that _Assoc != NULL or _Assoc == Self
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4525
  int v;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4526
  for (;;) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4527
    v = _Event;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4528
    if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4529
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4530
  guarantee (v >= 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4531
  if (v == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4532
    // Do this the hard way by blocking ...
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4533
    int status = pthread_mutex_lock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4534
    assert_status(status == 0, status, "mutex_lock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4535
    guarantee (_nParked == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4536
    ++ _nParked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4537
    while (_Event < 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4538
      status = pthread_cond_wait(_cond, _mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4539
      assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4540
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4541
    -- _nParked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4542
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4543
    // In theory we could move the ST of 0 into _Event past the unlock(),
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4544
    // but then we'd need a MEMBAR after the ST.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4545
    _Event = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4546
    status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4547
    assert_status(status == 0, status, "mutex_unlock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4548
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4549
  guarantee (_Event >= 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4550
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4551
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4552
int os::PlatformEvent::park(jlong millis) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4553
  guarantee (_nParked == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4554
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4555
  int v;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4556
  for (;;) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4557
    v = _Event;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4558
    if (Atomic::cmpxchg (v-1, &_Event, v) == v) break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4559
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4560
  guarantee (v >= 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4561
  if (v != 0) return OS_OK;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4562
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4563
  // We do this the hard way, by blocking the thread.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4564
  // Consider enforcing a minimum timeout value.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4565
  struct timespec abst;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4566
  compute_abstime(&abst, millis);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4567
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4568
  int ret = OS_TIMEOUT;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4569
  int status = pthread_mutex_lock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4570
  assert_status(status == 0, status, "mutex_lock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4571
  guarantee (_nParked == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4572
  ++_nParked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4573
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4574
  // Object.wait(timo) will return because of
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4575
  // (a) notification
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4576
  // (b) timeout
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4577
  // (c) thread.interrupt
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4578
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4579
  // Thread.interrupt and object.notify{All} both call Event::set.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4580
  // That is, we treat thread.interrupt as a special case of notification.
24931
4bba680186bd 8044339: Update FilterSpuriousWakeups documentation. Review "Solaris only" vm options descriptions
iignatyev
parents: 24431
diff changeset
  4581
  // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false.
4bba680186bd 8044339: Update FilterSpuriousWakeups documentation. Review "Solaris only" vm options descriptions
iignatyev
parents: 24431
diff changeset
  4582
  // We assume all ETIME returns are valid.
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4583
  //
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4584
  // TODO: properly differentiate simultaneous notify+interrupt.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4585
  // In that case, we should propagate the notify to another waiter.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4586
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4587
  while (_Event < 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4588
    status = pthread_cond_timedwait(_cond, _mutex, &abst);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4589
    assert_status(status == 0 || status == ETIMEDOUT,
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4590
                  status, "cond_timedwait");
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4591
    if (!FilterSpuriousWakeups) break;         // previous semantics
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4592
    if (status == ETIMEDOUT) break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4593
    // We consume and ignore EINTR and spurious wakeups.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4594
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4595
  --_nParked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4596
  if (_Event >= 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4597
     ret = OS_OK;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4598
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4599
  _Event = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4600
  status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4601
  assert_status(status == 0, status, "mutex_unlock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4602
  assert (_nParked == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4603
  return ret;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4604
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4605
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4606
void os::PlatformEvent::unpark() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4607
  int v, AnyWaiters;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4608
  for (;;) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4609
    v = _Event;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4610
    if (v > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4611
      // The LD of _Event could have reordered or be satisfied
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4612
      // by a read-aside from this processor's write buffer.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4613
      // To avoid problems execute a barrier and then
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4614
      // ratify the value.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4615
      OrderAccess::fence();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4616
      if (_Event == v) return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4617
      continue;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4618
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4619
    if (Atomic::cmpxchg (v+1, &_Event, v) == v) break;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4620
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4621
  if (v < 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4622
    // Wait for the thread associated with the event to vacate
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4623
    int status = pthread_mutex_lock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4624
    assert_status(status == 0, status, "mutex_lock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4625
    AnyWaiters = _nParked;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4626
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4627
    if (AnyWaiters != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4628
      // We intentional signal *after* dropping the lock
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4629
      // to avoid a common class of futile wakeups.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4630
      status = pthread_cond_signal(_cond);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4631
      assert_status(status == 0, status, "cond_signal");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4632
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4633
    // Mutex should be locked for pthread_cond_signal(_cond).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4634
    status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4635
    assert_status(status == 0, status, "mutex_unlock");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4636
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4637
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4638
  // Note that we signal() _after dropping the lock for "immortal" Events.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4639
  // This is safe and avoids a common class of futile wakeups. In rare
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4640
  // circumstances this can cause a thread to return prematurely from
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4641
  // cond_{timed}wait() but the spurious wakeup is benign and the victim will
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4642
  // simply re-test the condition and re-park itself.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4643
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4644
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4645
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4646
// JSR166
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4647
// -------------------------------------------------------
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4648
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4649
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4650
// The solaris and linux implementations of park/unpark are fairly
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4651
// conservative for now, but can be improved. They currently use a
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4652
// mutex/condvar pair, plus a a count.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4653
// Park decrements count if > 0, else does a condvar wait. Unpark
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4654
// sets count to 1 and signals condvar. Only one thread ever waits
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4655
// on the condvar. Contention seen when trying to park implies that someone
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4656
// is unparking you, so don't wait. And spurious returns are fine, so there
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4657
// is no need to track notifications.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4658
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4659
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4660
#define MAX_SECS 100000000
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4661
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4662
// This code is common to linux and solaris and will be moved to a
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4663
// common place in dolphin.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4664
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4665
// The passed in time value is either a relative time in nanoseconds
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4666
// or an absolute time in milliseconds. Either way it has to be unpacked
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4667
// into suitable seconds and nanoseconds components and stored in the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4668
// given timespec structure.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4669
// Given time is a 64-bit value and the time_t used in the timespec is only
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4670
// a signed-32-bit value (except on 64-bit Linux) we have to watch for
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4671
// overflow if times way in the future are given. Further on Solaris versions
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4672
// prior to 10 there is a restriction (see cond_timedwait) that the specified
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4673
// number of seconds, in abstime, is less than current_time + 100,000,000.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4674
// As it will be 28 years before "now + 100000000" will overflow we can
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4675
// ignore overflow and just impose a hard-limit on seconds using the value
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4676
// of "now + 100,000,000". This places a limit on the timeout of about 3.17
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4677
// years from "now".
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4678
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4679
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4680
static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4681
  assert (time > 0, "convertTime");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4682
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4683
  struct timeval now;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4684
  int status = gettimeofday(&now, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4685
  assert(status == 0, "gettimeofday");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4686
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4687
  time_t max_secs = now.tv_sec + MAX_SECS;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4688
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4689
  if (isAbsolute) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4690
    jlong secs = time / 1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4691
    if (secs > max_secs) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4692
      absTime->tv_sec = max_secs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4693
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4694
    else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4695
      absTime->tv_sec = secs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4696
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4697
    absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4698
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4699
  else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4700
    jlong secs = time / NANOSECS_PER_SEC;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4701
    if (secs >= MAX_SECS) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4702
      absTime->tv_sec = max_secs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4703
      absTime->tv_nsec = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4704
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4705
    else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4706
      absTime->tv_sec = now.tv_sec + secs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4707
      absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4708
      if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4709
        absTime->tv_nsec -= NANOSECS_PER_SEC;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4710
        ++absTime->tv_sec; // note: this must be <= max_secs
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4711
      }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4712
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4713
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4714
  assert(absTime->tv_sec >= 0, "tv_sec < 0");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4715
  assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4716
  assert(absTime->tv_nsec >= 0, "tv_nsec < 0");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4717
  assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4718
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4719
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4720
void Parker::park(bool isAbsolute, jlong time) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4721
  // Optional fast-path check:
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4722
  // Return immediately if a permit is available.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4723
  if (_counter > 0) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4724
    _counter = 0;
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4725
    OrderAccess::fence();
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4726
    return;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4727
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4728
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4729
  Thread* thread = Thread::current();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4730
  assert(thread->is_Java_thread(), "Must be JavaThread");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4731
  JavaThread *jt = (JavaThread *)thread;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4732
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4733
  // Optional optimization -- avoid state transitions if there's an interrupt pending.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4734
  // Check interrupt before trying to wait
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4735
  if (Thread::is_interrupted(thread, false)) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4736
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4737
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4738
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4739
  // Next, demultiplex/decode time arguments
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4740
  timespec absTime;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4741
  if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4742
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4743
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4744
  if (time > 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4745
    unpackTime(&absTime, isAbsolute, time);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4746
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4747
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4748
  // Enter safepoint region
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4749
  // Beware of deadlocks such as 6317397.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4750
  // The per-thread Parker:: mutex is a classic leaf-lock.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4751
  // In particular a thread must never block on the Threads_lock while
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4752
  // holding the Parker:: mutex. If safepoints are pending both the
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4753
  // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4754
  ThreadBlockInVM tbivm(jt);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4755
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4756
  // Don't wait if cannot get lock since interference arises from
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4757
  // unblocking. Also. check interrupt before trying wait
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4758
  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4759
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4760
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4761
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4762
  int status;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4763
  if (_counter > 0) { // no wait needed
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4764
    _counter = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4765
    status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4766
    assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4767
    OrderAccess::fence();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4768
    return;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4769
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4770
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4771
#ifdef ASSERT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4772
  // Don't catch signals while blocked; let the running threads have the signals.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4773
  // (This allows a debugger to break into the running thread.)
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4774
  sigset_t oldsigs;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4775
  sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4776
  pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4777
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4778
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4779
  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4780
  jt->set_suspend_equivalent();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4781
  // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4782
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4783
  if (time == 0) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4784
    status = pthread_cond_wait (_cond, _mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4785
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4786
    status = pthread_cond_timedwait (_cond, _mutex, &absTime);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4787
    if (status != 0 && WorkAroundNPTLTimedWaitHang) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4788
      pthread_cond_destroy (_cond);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4789
      pthread_cond_init    (_cond, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4790
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4791
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4792
  assert_status(status == 0 || status == EINTR ||
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4793
                status == ETIME || status == ETIMEDOUT,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4794
                status, "cond_timedwait");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4795
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4796
#ifdef ASSERT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4797
  pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4798
#endif
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4799
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4800
  _counter = 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4801
  status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4802
  assert_status(status == 0, status, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4803
  // If externally suspended while waiting, re-suspend
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4804
  if (jt->handle_special_suspend_equivalent_condition()) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4805
    jt->java_suspend_self();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4806
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4807
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4808
  OrderAccess::fence();
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4809
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4810
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4811
void Parker::unpark() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4812
  int s, status;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4813
  status = pthread_mutex_lock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4814
  assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4815
  s = _counter;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4816
  _counter = 1;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4817
  if (s < 1) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4818
    if (WorkAroundNPTLTimedWaitHang) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4819
      status = pthread_cond_signal (_cond);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4820
      assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4821
      status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4822
      assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4823
    } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4824
      status = pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4825
      assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4826
      status = pthread_cond_signal (_cond);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4827
      assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4828
    }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4829
  } else {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4830
    pthread_mutex_unlock(_mutex);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4831
    assert (status == 0, "invariant");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4832
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4833
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4834
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4835
extern char** environ;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4836
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4837
// Run the specified command in a separate process. Return its exit value,
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4838
// or -1 on failure (e.g. can't fork a new process).
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4839
// Unlike system(), this function can be called from signal handler. It
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4840
// doesn't block SIGINT et al.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4841
int os::fork_and_exec(char* cmd) {
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4842
  char * argv[4] = {"sh", "-c", cmd, NULL};
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4843
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4844
  pid_t pid = fork();
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4845
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4846
  if (pid < 0) {
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4847
    // fork failed
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4848
    return -1;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4849
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4850
  } else if (pid == 0) {
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4851
    // child process
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4852
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4853
    // Try to be consistent with system(), which uses "/usr/bin/sh" on AIX.
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4854
    execve("/usr/bin/sh", argv, environ);
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4855
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4856
    // execve failed
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4857
    _exit(-1);
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4858
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4859
  } else {
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4860
    // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4861
    // care about the actual exit code, for now.
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4862
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4863
    int status;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4864
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4865
    // Wait for the child process to exit. This returns immediately if
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4866
    // the child has already exited. */
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4867
    while (waitpid(pid, &status, 0) < 0) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4868
      switch (errno) {
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4869
        case ECHILD: return 0;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4870
        case EINTR: break;
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4871
        default: return -1;
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4872
      }
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4873
    }
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4874
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4875
    if (WIFEXITED(status)) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4876
      // The child exited normally; get its exit code.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4877
      return WEXITSTATUS(status);
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4878
    } else if (WIFSIGNALED(status)) {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4879
      // The child exited because of a signal.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4880
      // The best value to return is 0x80 + signal number,
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4881
      // because that is what all Unix shells do, and because
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4882
      // it allows callers to distinguish between process exit and
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4883
      // process death by signal.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4884
      return 0x80 + WTERMSIG(status);
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4885
    } else {
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4886
      // Unknown exit code; pass it through.
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4887
      return status;
22837
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4888
    }
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4889
  }
feba5d4126b8 8026487: PPC64: Implement 'os::fork_and_exec' on AIX
simonis
parents: 22831
diff changeset
  4890
  return -1;
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4891
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4892
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4893
// is_headless_jre()
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4894
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4895
// Test for the existence of xawt/libmawt.so or libawt_xawt.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4896
// in order to report if we are running in a headless jre.
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4897
//
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4898
// Since JDK8 xawt/libmawt.so is moved into the same directory
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4899
// as libawt.so, and renamed libawt_xawt.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4900
bool os::is_headless_jre() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4901
  struct stat statbuf;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4902
  char buf[MAXPATHLEN];
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4903
  char libmawtpath[MAXPATHLEN];
28187
fc19df82d6ee 8066964: ppc64: argument and return type profiling, fix problem with popframe
goetz
parents: 27880
diff changeset
  4904
  const char *xawtstr = "/xawt/libmawt.so";
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4905
  const char *new_xawtstr = "/libawt_xawt.so";
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4906
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4907
  char *p;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4908
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4909
  // Get path to libjvm.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4910
  os::jvm_path(buf, sizeof(buf));
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4911
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4912
  // Get rid of libjvm.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4913
  p = strrchr(buf, '/');
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4914
  if (p == NULL) return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4915
  else *p = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4916
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4917
  // Get rid of client or server
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4918
  p = strrchr(buf, '/');
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4919
  if (p == NULL) return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4920
  else *p = '\0';
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4921
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4922
  // check xawt/libmawt.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4923
  strcpy(libmawtpath, buf);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4924
  strcat(libmawtpath, xawtstr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4925
  if (::stat(libmawtpath, &statbuf) == 0) return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4926
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4927
  // check libawt_xawt.so
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4928
  strcpy(libmawtpath, buf);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4929
  strcat(libmawtpath, new_xawtstr);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4930
  if (::stat(libmawtpath, &statbuf) == 0) return false;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4931
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4932
  return true;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4933
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4934
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4935
// Get the default path to the core file
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4936
// Returns the length of the string
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4937
int os::get_core_path(char* buffer, size_t bufferSize) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4938
  const char* p = get_current_directory(buffer, bufferSize);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4939
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4940
  if (p == NULL) {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4941
    assert(p != NULL, "failed to get current directory");
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4942
    return 0;
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4943
  }
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4944
28172
19ae5c844e75 8059586: hs_err report should treat redirected core pattern
dholmes
parents: 27927
diff changeset
  4945
  jio_snprintf(buffer, bufferSize, "%s/core or core.%d",
19ae5c844e75 8059586: hs_err report should treat redirected core pattern
dholmes
parents: 27927
diff changeset
  4946
                                               p, current_process_id());
19ae5c844e75 8059586: hs_err report should treat redirected core pattern
dholmes
parents: 27927
diff changeset
  4947
22831
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4948
  return strlen(buffer);
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4949
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4950
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4951
#ifndef PRODUCT
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4952
void TestReserveMemorySpecial_test() {
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4953
  // No tests available for this platform
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4954
}
1e2ba1d62103 8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
simonis
parents:
diff changeset
  4955
#endif