annotate src/os_cpu/linux_zero/vm/os_linux_zero.cpp @ 5318:b5cd7bc05695

Method entry counters: Enable the flag to collect an execution profile of compiled methods and their callers. This allows to, e.g., detect methods that should be inlined because they are called frequently.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Fri, 27 Apr 2012 12:56:39 -0700
parents 1d1603768966
children da4be62fb889
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2191
diff changeset
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
1176
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
3 * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
5 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
8 * published by the Free Software Foundation.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
9 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
14 * accompanied this code).
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
15 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
19 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1522
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1522
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1522
diff changeset
22 * questions.
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
23 *
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
24 */
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
26 // no precompiled headers
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
27 #include "assembler_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
28 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
29 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
30 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
31 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
32 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
33 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
34 #include "jvm_linux.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
35 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
36 #include "mutex_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
37 #include "nativeInst_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
38 #include "os_share_linux.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
39 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
40 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
41 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
42 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
43 #include "runtime/extendedPC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
44 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
45 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
46 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
47 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
48 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
49 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
50 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
51 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
52 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
53 #include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
54 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
55 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
56 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
57 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
58 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
59 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
60 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1970
diff changeset
61 #endif
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
62
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
63 address os::current_stack_pointer() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
64 address dummy = (address) &dummy;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
65 return dummy;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
66 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
67
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
68 frame os::get_sender_for_C_frame(frame* fr) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
69 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
70 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
71
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
72 frame os::current_frame() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
73 // The only thing that calls this is the stack printing code in
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
74 // VMError::report:
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
75 // - Step 110 (printing stack bounds) uses the sp in the frame
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
76 // to determine the amount of free space on the stack. We
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
77 // set the sp to a close approximation of the real value in
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
78 // order to allow this step to complete.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
79 // - Step 120 (printing native stack) tries to walk the stack.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
80 // The frame we create has a NULL pc, which is ignored as an
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
81 // invalid frame.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
82 frame dummy = frame();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
83 dummy.set_sp((intptr_t *) current_stack_pointer());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
84 return dummy;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
85 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
86
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
87 char* os::non_memory_address_word() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
88 // Must never look like an address returned by reserve_memory,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
89 // even in its subfields (as defined by the CPU immediate fields,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
90 // if the CPU splits constants across multiple instructions).
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
91 #ifdef SPARC
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
92 // On SPARC, 0 != %hi(any real address), because there is no
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
93 // allocation in the first 1Kb of the virtual address space.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
94 return (char *) 0;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
95 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
96 // This is the value for x86; works pretty well for PPC too.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
97 return (char *) -1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
98 #endif // SPARC
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
99 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
100
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
101 void os::initialize_thread() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
102 // Nothing to do.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
103 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
104
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
105 address os::Linux::ucontext_get_pc(ucontext_t* uc) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
106 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
107 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
108
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
109 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
110 intptr_t** ret_sp,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
111 intptr_t** ret_fp) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
112 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
113 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
114
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
115 frame os::fetch_frame_from_context(void* ucVoid) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
116 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
117 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
118
2191
d70fe6ab4436 6588413: Use -fvisibility=hidden for gcc compiles
coleenp
parents: 1980
diff changeset
119 extern "C" JNIEXPORT int
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
120 JVM_handle_linux_signal(int sig,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
121 siginfo_t* info,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
122 void* ucVoid,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
123 int abort_if_unrecognized) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
124 ucontext_t* uc = (ucontext_t*) ucVoid;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
125
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
126 Thread* t = ThreadLocalStorage::get_thread_slow();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
127
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
128 SignalHandlerMark shm(t);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
129
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
130 // Note: it's not uncommon that JNI code uses signal/sigset to
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
131 // install then restore certain signal handler (e.g. to temporarily
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
132 // block SIGPIPE, or have a SIGILL handler when detecting CPU
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
133 // type). When that happens, JVM_handle_linux_signal() might be
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
134 // invoked with junk info/ucVoid. To avoid unnecessary crash when
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
135 // libjsig is not preloaded, try handle signals that do not require
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
136 // siginfo/ucontext first.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
137
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
138 if (sig == SIGPIPE || sig == SIGXFSZ) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
139 // allow chained handler to go first
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
140 if (os::Linux::chained_handler(sig, info, ucVoid)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
141 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
142 } else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
143 if (PrintMiscellaneous && (WizardMode || Verbose)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
144 char buf[64];
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
145 warning("Ignoring %s - see bugs 4229104 or 646499219",
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
146 os::exception_name(sig, buf, sizeof(buf)));
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
147 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
148 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
149 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
150 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
151
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
152 JavaThread* thread = NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
153 VMThread* vmthread = NULL;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
154 if (os::Linux::signal_handlers_are_installed) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
155 if (t != NULL ){
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
156 if(t->is_Java_thread()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
157 thread = (JavaThread*)t;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
158 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
159 else if(t->is_VM_thread()){
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
160 vmthread = (VMThread *)t;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
161 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
162 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
163 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
164
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
165 if (info != NULL && thread != NULL) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
166 // Handle ALL stack overflow variations here
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
167 if (sig == SIGSEGV) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
168 address addr = (address) info->si_addr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
169
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
170 // check if fault address is within thread stack
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
171 if (addr < thread->stack_base() &&
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
172 addr >= thread->stack_base() - thread->stack_size()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
173 // stack overflow
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
174 if (thread->in_stack_yellow_zone(addr)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
175 thread->disable_stack_yellow_zone();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
176 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
177 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
178 else if (thread->in_stack_red_zone(addr)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
179 thread->disable_stack_red_zone();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
180 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
181 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
182 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
183 // Accessing stack address below sp may cause SEGV if
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
184 // current thread has MAP_GROWSDOWN stack. This should
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
185 // only happen when current thread was created by user
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
186 // code with MAP_GROWSDOWN flag and then attached to VM.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
187 // See notes in os_linux.cpp.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
188 if (thread->osthread()->expanding_stack() == 0) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
189 thread->osthread()->set_expanding_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
190 if (os::Linux::manually_expand_stack(thread, addr)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
191 thread->osthread()->clear_expanding_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
192 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
193 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
194 thread->osthread()->clear_expanding_stack();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
195 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
196 else {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
197 fatal("recursive segv. expanding stack.");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
198 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
199 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
200 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
201 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
202
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
203 /*if (thread->thread_state() == _thread_in_Java) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
204 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
205 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
206 else*/ if (thread->thread_state() == _thread_in_vm &&
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
207 sig == SIGBUS && thread->doing_unsafe_access()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
208 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
209 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
210
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
211 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
212 // kicks in and the heap gets shrunk before the field access.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
213 /*if (sig == SIGSEGV || sig == SIGBUS) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
214 address addr = JNI_FastGetField::find_slowcase_pc(pc);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
215 if (addr != (address)-1) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
216 stub = addr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
217 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
218 }*/
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
219
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
220 // Check to see if we caught the safepoint code in the process
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
221 // of write protecting the memory serialization page. It write
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
222 // enables the page immediately after protecting it so we can
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
223 // just return to retry the write.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
224 if (sig == SIGSEGV &&
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
225 os::is_memory_serialize_page(thread, (address) info->si_addr)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
226 // Block current thread until permission is restored.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
227 os::block_on_serialize_page_trap();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
228 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
229 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
230 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
231
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
232 // signal-chaining
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
233 if (os::Linux::chained_handler(sig, info, ucVoid)) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
234 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
235 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
236
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
237 if (!abort_if_unrecognized) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
238 // caller wants another chance, so give it to him
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
239 return false;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
240 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
241
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
242 #ifndef PRODUCT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
243 if (sig == SIGSEGV) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
244 fatal("\n#"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
245 "\n# /--------------------\\"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
246 "\n# | segmentation fault |"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
247 "\n# \\---\\ /--------------/"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
248 "\n# /"
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
249 "\n# [-] |\\_/| "
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
250 "\n# (+)=C |o o|__ "
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
251 "\n# | | =-*-=__\\ "
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
252 "\n# OOO c_c_(___)");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
253 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
254 #endif // !PRODUCT
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
255
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
256 const char *fmt = "caught unhandled signal %d";
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
257 char buf[64];
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
258
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
259 sprintf(buf, fmt, sig);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
260 fatal(buf);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
261 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
262
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
263 void os::Linux::init_thread_fpu_state(void) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
264 // Nothing to do
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
265 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
266
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
267 int os::Linux::get_fpu_control_word() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
268 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
269 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
270
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
271 void os::Linux::set_fpu_control_word(int fpu) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
272 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
273 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
274
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
275 bool os::is_allocatable(size_t bytes) {
1176
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
276 #ifdef _LP64
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
277 return true;
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
278 #else
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
279 if (bytes < 2 * G) {
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
280 return true;
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
281 }
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
282
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
283 char* addr = reserve_memory(bytes, NULL);
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
284
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
285 if (addr != NULL) {
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
286 release_memory(addr, bytes);
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
287 }
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
288
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
289 return addr != NULL;
d11ce1551e8d 6917698: os::is_allocatable Zero fix for 32-bit platforms
twisti
parents: 1010
diff changeset
290 #endif // _LP64
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
291 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
292
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
293 ///////////////////////////////////////////////////////////////////////////////
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
294 // thread stack
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
295
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
296 size_t os::Linux::min_stack_allowed = 64 * K;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
297
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
298 bool os::Linux::supports_variable_stack_size() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
299 return true;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
300 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
301
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
302 size_t os::Linux::default_stack_size(os::ThreadType thr_type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
303 #ifdef _LP64
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
304 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
305 #else
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
306 size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
307 #endif // _LP64
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
308 return s;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
309 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
310
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
311 size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
312 // Only enable glibc guard pages for non-Java threads
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
313 // (Java threads have HotSpot guard pages)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
314 return (thr_type == java_thread ? 0 : page_size());
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
315 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
316
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
317 static void current_stack_region(address *bottom, size_t *size) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
318 pthread_attr_t attr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
319 int res = pthread_getattr_np(pthread_self(), &attr);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
320 if (res != 0) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
321 if (res == ENOMEM) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
322 vm_exit_out_of_memory(0, "pthread_getattr_np");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
323 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
324 else {
1522
67d74f7a15d9 6951923: some uses of fatal1 were missed by 6888954
jcoomes
parents: 1176
diff changeset
325 fatal(err_msg("pthread_getattr_np failed with errno = %d", res));
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
326 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
327 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
328
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
329 address stack_bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
330 size_t stack_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
331 res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
332 if (res != 0) {
1522
67d74f7a15d9 6951923: some uses of fatal1 were missed by 6888954
jcoomes
parents: 1176
diff changeset
333 fatal(err_msg("pthread_attr_getstack failed with errno = %d", res));
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
334 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
335 address stack_top = stack_bottom + stack_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
336
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
337 // The block of memory returned by pthread_attr_getstack() includes
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
338 // guard pages where present. We need to trim these off.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
339 size_t page_bytes = os::Linux::page_size();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
340 assert(((intptr_t) stack_bottom & (page_bytes - 1)) == 0, "unaligned stack");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
341
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
342 size_t guard_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
343 res = pthread_attr_getguardsize(&attr, &guard_bytes);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
344 if (res != 0) {
1522
67d74f7a15d9 6951923: some uses of fatal1 were missed by 6888954
jcoomes
parents: 1176
diff changeset
345 fatal(err_msg("pthread_attr_getguardsize failed with errno = %d", res));
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
346 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
347 int guard_pages = align_size_up(guard_bytes, page_bytes) / page_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
348 assert(guard_bytes == guard_pages * page_bytes, "unaligned guard");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
349
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
350 #ifdef IA64
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
351 // IA64 has two stacks sharing the same area of memory, a normal
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
352 // stack growing downwards and a register stack growing upwards.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
353 // Guard pages, if present, are in the centre. This code splits
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
354 // the stack in two even without guard pages, though in theory
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
355 // there's nothing to stop us allocating more to the normal stack
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
356 // or more to the register stack if one or the other were found
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
357 // to grow faster.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
358 int total_pages = align_size_down(stack_bytes, page_bytes) / page_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
359 stack_bottom += (total_pages - guard_pages) / 2 * page_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
360 #endif // IA64
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
361
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
362 stack_bottom += guard_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
363
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
364 pthread_attr_destroy(&attr);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
365
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
366 // The initial thread has a growable stack, and the size reported
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
367 // by pthread_attr_getstack is the maximum size it could possibly
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
368 // be given what currently mapped. This can be huge, so we cap it.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
369 if (os::Linux::is_initial_thread()) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
370 stack_bytes = stack_top - stack_bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
371
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
372 if (stack_bytes > JavaThread::stack_size_at_create())
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
373 stack_bytes = JavaThread::stack_size_at_create();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
374
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
375 stack_bottom = stack_top - stack_bytes;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
376 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
377
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
378 assert(os::current_stack_pointer() >= stack_bottom, "should do");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
379 assert(os::current_stack_pointer() < stack_top, "should do");
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
380
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
381 *bottom = stack_bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
382 *size = stack_top - stack_bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
383 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
384
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
385 address os::current_stack_base() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
386 address bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
387 size_t size;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
388 current_stack_region(&bottom, &size);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
389 return bottom + size;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
390 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
391
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
392 size_t os::current_stack_size() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
393 // stack size includes normal stack and HotSpot guard pages
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
394 address bottom;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
395 size_t size;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
396 current_stack_region(&bottom, &size);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
397 return size;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
398 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
399
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
400 /////////////////////////////////////////////////////////////////////////////
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
401 // helper functions for fatal error handler
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
402
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
403 void os::print_context(outputStream* st, void* context) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
404 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
405 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
406
1970
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1729
diff changeset
407 void os::print_register_info(outputStream *st, void *context) {
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1729
diff changeset
408 ShouldNotCallThis();
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1729
diff changeset
409 }
b675ff1ca7a3 7002129: Zero and Shark fixes, 3rd
twisti
parents: 1729
diff changeset
410
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
411 /////////////////////////////////////////////////////////////////////////////
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
412 // Stubs for things that would be in linux_zero.s if it existed.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
413 // You probably want to disassemble these monkeys to check they're ok.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
414
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
415 extern "C" {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
416 int SpinPause() {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
417 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
418
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
419 int SafeFetch32(int *adr, int errValue) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
420 int value = errValue;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
421 value = *adr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
422 return value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
423 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
424 intptr_t SafeFetchN(intptr_t *adr, intptr_t errValue) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
425 intptr_t value = errValue;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
426 value = *adr;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
427 return value;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
428 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
429
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
430 void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
431 if (from > to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
432 jshort *end = from + count;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
433 while (from < end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
434 *(to++) = *(from++);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
435 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
436 else if (from < to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
437 jshort *end = from;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
438 from += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
439 to += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
440 while (from >= end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
441 *(to--) = *(from--);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
442 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
443 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
444 void _Copy_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
445 if (from > to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
446 jint *end = from + count;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
447 while (from < end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
448 *(to++) = *(from++);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
449 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
450 else if (from < to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
451 jint *end = from;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
452 from += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
453 to += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
454 while (from >= end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
455 *(to--) = *(from--);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
456 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
457 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
458 void _Copy_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
459 if (from > to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
460 jlong *end = from + count;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
461 while (from < end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
462 os::atomic_copy64(from++, to++);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
463 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
464 else if (from < to) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
465 jlong *end = from;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
466 from += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
467 to += count - 1;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
468 while (from >= end)
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
469 os::atomic_copy64(from--, to--);
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
470 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
471 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
472
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
473 void _Copy_arrayof_conjoint_bytes(HeapWord* from,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
474 HeapWord* to,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
475 size_t count) {
1729
13b87063b4d8 6977640: Zero and Shark fixes
twisti
parents: 1552
diff changeset
476 memmove(to, from, count);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
477 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
478 void _Copy_arrayof_conjoint_jshorts(HeapWord* from,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
479 HeapWord* to,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
480 size_t count) {
1729
13b87063b4d8 6977640: Zero and Shark fixes
twisti
parents: 1552
diff changeset
481 memmove(to, from, count * 2);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
482 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
483 void _Copy_arrayof_conjoint_jints(HeapWord* from,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
484 HeapWord* to,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
485 size_t count) {
1729
13b87063b4d8 6977640: Zero and Shark fixes
twisti
parents: 1552
diff changeset
486 memmove(to, from, count * 4);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
487 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
488 void _Copy_arrayof_conjoint_jlongs(HeapWord* from,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
489 HeapWord* to,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
490 size_t count) {
1729
13b87063b4d8 6977640: Zero and Shark fixes
twisti
parents: 1552
diff changeset
491 memmove(to, from, count * 8);
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
492 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
493 };
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
494
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
495 /////////////////////////////////////////////////////////////////////////////
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
496 // Implementations of atomic operations not supported by processors.
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
497 // -- http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Atomic-Builtins.html
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
498
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
499 #ifndef _LP64
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
500 extern "C" {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
501 long long unsigned int __sync_val_compare_and_swap_8(
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
502 volatile void *ptr,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
503 long long unsigned int oldval,
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
504 long long unsigned int newval) {
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
505 ShouldNotCallThis();
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
506 }
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
507 };
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents:
diff changeset
508 #endif // !_LP64