annotate src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @ 3612:ed3ac862d22d

IdealGraphVisualizer: make Graal graph-to-text converter work again after last commit by copying properties that have the same value in the two input graphs groups to the newly created diff group's properties.
author Peter Hofer <peter.hofer@jku.at>
date Wed, 02 Nov 2011 17:27:31 +0100
parents 1d1603768966
children da4be62fb889
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
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) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
4 *
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
7 * published by the Free Software Foundation.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
8 *
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
13 * accompanied this code).
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
14 *
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
21 * questions.
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
22 *
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
23 */
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
25 // no precompiled headers
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
26 #include "assembler_sparc.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
27 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
28 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
29 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
30 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
31 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
32 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
33 #include "jvm_linux.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
34 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
35 #include "mutex_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
36 #include "nativeInst_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
37 #include "os_share_linux.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
38 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
39 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
40 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
41 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
42 #include "runtime/extendedPC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
43 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
44 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
45 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
46 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
47 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
48 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
49 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
50 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
51 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
52 #include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
53 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
54 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
55 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
56 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
57 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
58 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
59 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
60 #endif
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
61
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
62
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
63 // Linux/Sparc has rather obscure naming of registers in sigcontext
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
64 // different between 32 and 64 bits
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
65 #ifdef _LP64
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
66 #define SIG_PC(x) ((x)->sigc_regs.tpc)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
67 #define SIG_NPC(x) ((x)->sigc_regs.tnpc)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
68 #define SIG_REGS(x) ((x)->sigc_regs)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
69 #else
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
70 #define SIG_PC(x) ((x)->si_regs.pc)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
71 #define SIG_NPC(x) ((x)->si_regs.npc)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
72 #define SIG_REGS(x) ((x)->si_regs)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
73 #endif
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
74
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
75 // those are to reference registers in sigcontext
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
76 enum {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
77 CON_G0 = 0,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
78 CON_G1,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
79 CON_G2,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
80 CON_G3,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
81 CON_G4,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
82 CON_G5,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
83 CON_G6,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
84 CON_G7,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
85 CON_O0,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
86 CON_O1,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
87 CON_O2,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
88 CON_O3,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
89 CON_O4,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
90 CON_O5,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
91 CON_O6,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
92 CON_O7,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
93 };
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
94
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
95 static inline void set_cont_address(sigcontext* ctx, address addr) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
96 SIG_PC(ctx) = (intptr_t)addr;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
97 SIG_NPC(ctx) = (intptr_t)(addr+4);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
98 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
99
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
100 // For Forte Analyzer AsyncGetCallTrace profiling support - thread is
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
101 // currently interrupted by SIGPROF.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
102 // os::Solaris::fetch_frame_from_ucontext() tries to skip nested
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
103 // signal frames. Currently we don't do that on Linux, so it's the
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
104 // same as os::fetch_frame_from_context().
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
105 ExtendedPC os::Linux::fetch_frame_from_ucontext(Thread* thread,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
106 ucontext_t* uc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
107 intptr_t** ret_sp,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
108 intptr_t** ret_fp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
109 assert(thread != NULL, "just checking");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
110 assert(ret_sp != NULL, "just checking");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
111 assert(ret_fp != NULL, "just checking");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
112
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
113 return os::fetch_frame_from_context(uc, ret_sp, ret_fp);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
114 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
115
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
116 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
117 intptr_t** ret_sp,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
118 intptr_t** ret_fp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
119 ucontext_t* uc = (ucontext_t*) ucVoid;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
120 ExtendedPC epc;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
121
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
122 if (uc != NULL) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
123 epc = ExtendedPC(os::Linux::ucontext_get_pc(uc));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
124 if (ret_sp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
125 *ret_sp = os::Linux::ucontext_get_sp(uc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
126 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
127 if (ret_fp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
128 *ret_fp = os::Linux::ucontext_get_fp(uc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
129 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
130 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
131 // construct empty ExtendedPC for return value checking
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
132 epc = ExtendedPC(NULL);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
133 if (ret_sp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
134 *ret_sp = (intptr_t*) NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
135 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
136 if (ret_fp) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
137 *ret_fp = (intptr_t*) NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
138 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
139 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
140
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
141 return epc;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
142 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
143
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
144 frame os::fetch_frame_from_context(void* ucVoid) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
145 intptr_t* sp;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
146 intptr_t* fp;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
147 ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
148 return frame(sp, fp, epc.pc());
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
149 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
150
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
151 frame os::get_sender_for_C_frame(frame* fr) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
152 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
153 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
154
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
155 frame os::current_frame() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
156 fprintf(stderr, "current_frame()");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
157
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
158 intptr_t* sp = StubRoutines::Sparc::flush_callers_register_windows_func()();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
159 frame myframe(sp, frame::unpatchable,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
160 CAST_FROM_FN_PTR(address, os::current_frame));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
161 if (os::is_first_C_frame(&myframe)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
162 // stack is not walkable
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
163 return frame(NULL, frame::unpatchable, NULL);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
164 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
165 return os::get_sender_for_C_frame(&myframe);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
166 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
167 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
168
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
169 address os::current_stack_pointer() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
170 register void *sp __asm__ ("sp");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
171 return (address)sp;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
172 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
173
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
174 static void current_stack_region(address* bottom, size_t* size) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
175 if (os::Linux::is_initial_thread()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
176 // initial thread needs special handling because pthread_getattr_np()
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
177 // may return bogus value.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
178 *bottom = os::Linux::initial_thread_stack_bottom();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
179 *size = os::Linux::initial_thread_stack_size();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
180 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
181 pthread_attr_t attr;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
182
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
183 int rslt = pthread_getattr_np(pthread_self(), &attr);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
184
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
185 // JVM needs to know exact stack location, abort if it fails
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
186 if (rslt != 0) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
187 if (rslt == ENOMEM) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
188 vm_exit_out_of_memory(0, "pthread_getattr_np");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
189 } else {
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 196
diff changeset
190 fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
191 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
192 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
193
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
194 if (pthread_attr_getstack(&attr, (void**)bottom, size) != 0) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
195 fatal("Can not locate current stack attributes!");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
196 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
197
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
198 pthread_attr_destroy(&attr);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
199 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
200 assert(os::current_stack_pointer() >= *bottom &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
201 os::current_stack_pointer() < *bottom + *size, "just checking");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
202 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
203
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
204 address os::current_stack_base() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
205 address bottom;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
206 size_t size;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
207 current_stack_region(&bottom, &size);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
208 return bottom + size;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
209 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
210
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
211 size_t os::current_stack_size() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
212 // stack size includes normal stack and HotSpot guard pages
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
213 address bottom;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
214 size_t size;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
215 current_stack_region(&bottom, &size);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
216 return size;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
217 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
218
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
219 char* os::non_memory_address_word() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
220 // Must never look like an address returned by reserve_memory,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
221 // even in its subfields (as defined by the CPU immediate fields,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
222 // if the CPU splits constants across multiple instructions).
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
223 // On SPARC, 0 != %hi(any real address), because there is no
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
224 // allocation in the first 1Kb of the virtual address space.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
225 return (char*) 0;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
226 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
227
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
228 void os::initialize_thread() {}
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
229
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
230 void os::print_context(outputStream *st, void *context) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
231 if (context == NULL) return;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
232
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
233 ucontext_t* uc = (ucontext_t*)context;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
234 sigcontext* sc = (sigcontext*)context;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
235 st->print_cr("Registers:");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
236
1907
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
237 st->print_cr(" G1=" INTPTR_FORMAT " G2=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
238 " G3=" INTPTR_FORMAT " G4=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
239 SIG_REGS(sc).u_regs[CON_G1],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
240 SIG_REGS(sc).u_regs[CON_G2],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
241 SIG_REGS(sc).u_regs[CON_G3],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
242 SIG_REGS(sc).u_regs[CON_G4]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
243 st->print_cr(" G5=" INTPTR_FORMAT " G6=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
244 " G7=" INTPTR_FORMAT " Y=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
245 SIG_REGS(sc).u_regs[CON_G5],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
246 SIG_REGS(sc).u_regs[CON_G6],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
247 SIG_REGS(sc).u_regs[CON_G7],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
248 SIG_REGS(sc).y);
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
249 st->print_cr(" O0=" INTPTR_FORMAT " O1=" INTPTR_FORMAT
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
250 " O2=" INTPTR_FORMAT " O3=" INTPTR_FORMAT,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
251 SIG_REGS(sc).u_regs[CON_O0],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
252 SIG_REGS(sc).u_regs[CON_O1],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
253 SIG_REGS(sc).u_regs[CON_O2],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
254 SIG_REGS(sc).u_regs[CON_O3]);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
255 st->print_cr(" O4=" INTPTR_FORMAT " O5=" INTPTR_FORMAT
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
256 " O6=" INTPTR_FORMAT " O7=" INTPTR_FORMAT,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
257 SIG_REGS(sc).u_regs[CON_O4],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
258 SIG_REGS(sc).u_regs[CON_O5],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
259 SIG_REGS(sc).u_regs[CON_O6],
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
260 SIG_REGS(sc).u_regs[CON_O7]);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
261
1907
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
262
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
263 intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
264 st->print_cr(" L0=" INTPTR_FORMAT " L1=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
265 " L2=" INTPTR_FORMAT " L3=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
266 sp[L0->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
267 sp[L1->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
268 sp[L2->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
269 sp[L3->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
270 st->print_cr(" L4=" INTPTR_FORMAT " L5=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
271 " L6=" INTPTR_FORMAT " L7=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
272 sp[L4->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
273 sp[L5->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
274 sp[L6->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
275 sp[L7->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
276 st->print_cr(" I0=" INTPTR_FORMAT " I1=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
277 " I2=" INTPTR_FORMAT " I3=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
278 sp[I0->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
279 sp[I1->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
280 sp[I2->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
281 sp[I3->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
282 st->print_cr(" I4=" INTPTR_FORMAT " I5=" INTPTR_FORMAT
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
283 " I6=" INTPTR_FORMAT " I7=" INTPTR_FORMAT,
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
284 sp[I4->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
285 sp[I5->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
286 sp[I6->sp_offset_in_saved_window()],
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
287 sp[I7->sp_offset_in_saved_window()]);
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
288
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
289 st->print_cr(" PC=" INTPTR_FORMAT " nPC=" INTPTR_FORMAT,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
290 SIG_PC(sc),
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
291 SIG_NPC(sc));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
292 st->cr();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
293 st->cr();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
294
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
295 st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
296 print_hex_dump(st, (address)sp, (address)(sp + 32), sizeof(intptr_t));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
297 st->cr();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
298
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
299 // Note: it may be unsafe to inspect memory near pc. For example, pc may
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
300 // point to garbage if entry point in an nmethod is corrupted. Leave
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
301 // this at the end, and hope for the best.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
302 address pc = os::Linux::ucontext_get_pc(uc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
303 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
1907
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
304 print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
305 }
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
306
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
307
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
308 void os::print_register_info(outputStream *st, void *context) {
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
309 if (context == NULL) return;
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
310
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
311 ucontext_t *uc = (ucontext_t*)context;
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
312 intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
313
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
314 st->print_cr("Register to memory mapping:");
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
315 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
316
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
317 // this is only for the "general purpose" registers
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
318 st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON__G1]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
319 st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON__G2]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
320 st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON__G3]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
321 st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON__G4]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
322 st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON__G5]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
323 st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON__G6]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
324 st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON__G7]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
325 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
326
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
327 st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON__O0]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
328 st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON__O1]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
329 st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON__O2]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
330 st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON__O3]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
331 st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON__O4]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
332 st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON__O5]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
333 st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON__O6]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
334 st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON__O7]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
335 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
336
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
337 st->print("L0="); print_location(st, sp[L0->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
338 st->print("L1="); print_location(st, sp[L1->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
339 st->print("L2="); print_location(st, sp[L2->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
340 st->print("L3="); print_location(st, sp[L3->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
341 st->print("L4="); print_location(st, sp[L4->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
342 st->print("L5="); print_location(st, sp[L5->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
343 st->print("L6="); print_location(st, sp[L6->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
344 st->print("L7="); print_location(st, sp[L7->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
345 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
346
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
347 st->print("I0="); print_location(st, sp[I0->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
348 st->print("I1="); print_location(st, sp[I1->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
349 st->print("I2="); print_location(st, sp[I2->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
350 st->print("I3="); print_location(st, sp[I3->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
351 st->print("I4="); print_location(st, sp[I4->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
352 st->print("I5="); print_location(st, sp[I5->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
353 st->print("I6="); print_location(st, sp[I6->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
354 st->print("I7="); print_location(st, sp[I7->sp_offset_in_saved_window()]);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1552
diff changeset
355 st->cr();
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
356 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
357
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
358
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
359 address os::Linux::ucontext_get_pc(ucontext_t* uc) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
360 return (address) SIG_PC((sigcontext*)uc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
361 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
362
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
363 intptr_t* os::Linux::ucontext_get_sp(ucontext_t *uc) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
364 return (intptr_t*)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
365 ((intptr_t)SIG_REGS((sigcontext*)uc).u_regs[CON_O6] + STACK_BIAS);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
366 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
367
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
368 // not used on Sparc
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
369 intptr_t* os::Linux::ucontext_get_fp(ucontext_t *uc) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
370 ShouldNotReachHere();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
371 return NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
372 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
373
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
374 // Utility functions
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
375
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
376 extern "C" void Fetch32PFI();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
377 extern "C" void Fetch32Resume();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
378 extern "C" void FetchNPFI();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
379 extern "C" void FetchNResume();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
380
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
381 inline static bool checkPrefetch(sigcontext* uc, address pc) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
382 if (pc == (address) Fetch32PFI) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
383 set_cont_address(uc, address(Fetch32Resume));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
384 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
385 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
386 if (pc == (address) FetchNPFI) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
387 set_cont_address(uc, address(FetchNResume));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
388 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
389 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
390 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
391 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
392
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
393 inline static bool checkOverflow(sigcontext* uc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
394 address pc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
395 address addr,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
396 JavaThread* thread,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
397 address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
398 // check if fault address is within thread stack
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
399 if (addr < thread->stack_base() &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
400 addr >= thread->stack_base() - thread->stack_size()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
401 // stack overflow
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
402 if (thread->in_stack_yellow_zone(addr)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
403 thread->disable_stack_yellow_zone();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
404 if (thread->thread_state() == _thread_in_Java) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
405 // Throw a stack overflow exception. Guard pages will be reenabled
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
406 // while unwinding the stack.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
407 *stub =
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
408 SharedRuntime::continuation_for_implicit_exception(thread,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
409 pc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
410 SharedRuntime::STACK_OVERFLOW);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
411 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
412 // Thread was in the vm or native code. Return and try to finish.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
413 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
414 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
415 } else if (thread->in_stack_red_zone(addr)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
416 // Fatal red zone violation. Disable the guard pages and fall through
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
417 // to handle_unexpected_exception way down below.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
418 thread->disable_stack_red_zone();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
419 tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
420 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
421 // Accessing stack address below sp may cause SEGV if current
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
422 // thread has MAP_GROWSDOWN stack. This should only happen when
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
423 // current thread was created by user code with MAP_GROWSDOWN flag
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
424 // and then attached to VM. See notes in os_linux.cpp.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
425 if (thread->osthread()->expanding_stack() == 0) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
426 thread->osthread()->set_expanding_stack();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
427 if (os::Linux::manually_expand_stack(thread, addr)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
428 thread->osthread()->clear_expanding_stack();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
429 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
430 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
431 thread->osthread()->clear_expanding_stack();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
432 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
433 fatal("recursive segv. expanding stack.");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
434 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
435 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
436 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
437 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
438 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
439
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
440 inline static bool checkPollingPage(address pc, address fault, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
441 if (fault == os::get_polling_page()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
442 *stub = SharedRuntime::get_poll_stub(pc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
443 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
444 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
445 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
446 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
447
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
448 inline static bool checkByteBuffer(address pc, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
449 // BugId 4454115: A read from a MappedByteBuffer can fault
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
450 // here if the underlying file has been truncated.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
451 // Do not crash the VM in such a case.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
452 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
453 nmethod* nm = cb->is_nmethod() ? (nmethod*)cb : NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
454 if (nm != NULL && nm->has_unsafe_access()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
455 *stub = StubRoutines::handler_for_unsafe_access();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
456 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
457 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
458 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
459 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
460
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
461 inline static bool checkVerifyOops(address pc, address fault, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
462 if (pc >= MacroAssembler::_verify_oop_implicit_branch[0]
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
463 && pc < MacroAssembler::_verify_oop_implicit_branch[1] ) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
464 *stub = MacroAssembler::_verify_oop_implicit_branch[2];
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
465 warning("fixed up memory fault in +VerifyOops at address "
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
466 INTPTR_FORMAT, fault);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
467 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
468 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
469 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
470 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
471
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
472 inline static bool checkFPFault(address pc, int code,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
473 JavaThread* thread, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
474 if (code == FPE_INTDIV || code == FPE_FLTDIV) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
475 *stub =
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
476 SharedRuntime::
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
477 continuation_for_implicit_exception(thread,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
478 pc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
479 SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
480 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
481 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
482 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
483 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
484
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
485 inline static bool checkNullPointer(address pc, intptr_t fault,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
486 JavaThread* thread, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
487 if (!MacroAssembler::needs_explicit_null_check(fault)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
488 // Determination of interpreter/vtable stub/compiled code null
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
489 // exception
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
490 *stub =
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
491 SharedRuntime::
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
492 continuation_for_implicit_exception(thread, pc,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
493 SharedRuntime::IMPLICIT_NULL);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
494 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
495 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
496 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
497 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
498
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
499 inline static bool checkFastJNIAccess(address pc, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
500 address addr = JNI_FastGetField::find_slowcase_pc(pc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
501 if (addr != (address)-1) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
502 *stub = addr;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
503 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
504 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
505 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
506 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
507
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
508 inline static bool checkSerializePage(JavaThread* thread, address addr) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
509 return os::is_memory_serialize_page(thread, addr);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
510 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
511
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
512 inline static bool checkZombie(sigcontext* uc, address* pc, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
513 if (nativeInstruction_at(*pc)->is_zombie()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
514 // zombie method (ld [%g0],%o7 instruction)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
515 *stub = SharedRuntime::get_handle_wrong_method_stub();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
516
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
517 // At the stub it needs to look like a call from the caller of this
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
518 // method (not a call from the segv site).
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
519 *pc = (address)SIG_REGS(uc).u_regs[CON_O7];
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
520 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
521 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
522 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
523 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
524
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
525 inline static bool checkICMiss(sigcontext* uc, address* pc, address* stub) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
526 #ifdef COMPILER2
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
527 if (nativeInstruction_at(*pc)->is_ic_miss_trap()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
528 #ifdef ASSERT
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
529 #ifdef TIERED
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
530 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
531 assert(cb->is_compiled_by_c2(), "Wrong compiler");
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
532 #endif // TIERED
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
533 #endif // ASSERT
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
534 // Inline cache missed and user trap "Tne G0+ST_RESERVED_FOR_USER_0+2" taken.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
535 *stub = SharedRuntime::get_ic_miss_stub();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
536 // At the stub it needs to look like a call from the caller of this
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
537 // method (not a call from the segv site).
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
538 *pc = (address)SIG_REGS(uc).u_regs[CON_O7];
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
539 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
540 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
541 #endif // COMPILER2
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
542 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
543 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
544
2191
d70fe6ab4436 6588413: Use -fvisibility=hidden for gcc compiles
coleenp
parents: 1980
diff changeset
545 extern "C" JNIEXPORT int
133
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
546 JVM_handle_linux_signal(int sig,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
547 siginfo_t* info,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
548 void* ucVoid,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
549 int abort_if_unrecognized) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
550 // in fact this isn't ucontext_t* at all, but struct sigcontext*
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
551 // but Linux porting layer uses ucontext_t, so to minimize code change
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
552 // we cast as needed
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
553 ucontext_t* ucFake = (ucontext_t*) ucVoid;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
554 sigcontext* uc = (sigcontext*)ucVoid;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
555
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
556 Thread* t = ThreadLocalStorage::get_thread_slow();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
557
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
558 SignalHandlerMark shm(t);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
559
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
560 // Note: it's not uncommon that JNI code uses signal/sigset to install
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
561 // then restore certain signal handler (e.g. to temporarily block SIGPIPE,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
562 // or have a SIGILL handler when detecting CPU type). When that happens,
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
563 // JVM_handle_linux_signal() might be invoked with junk info/ucVoid. To
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
564 // avoid unnecessary crash when libjsig is not preloaded, try handle signals
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
565 // that do not require siginfo/ucontext first.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
566
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
567 if (sig == SIGPIPE || sig == SIGXFSZ) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
568 // allow chained handler to go first
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
569 if (os::Linux::chained_handler(sig, info, ucVoid)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
570 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
571 } else {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
572 if (PrintMiscellaneous && (WizardMode || Verbose)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
573 char buf[64];
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
574 warning("Ignoring %s - see bugs 4229104 or 646499219",
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
575 os::exception_name(sig, buf, sizeof(buf)));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
576 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
577 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
578 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
579 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
580
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
581 JavaThread* thread = NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
582 VMThread* vmthread = NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
583 if (os::Linux::signal_handlers_are_installed) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
584 if (t != NULL ){
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
585 if(t->is_Java_thread()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
586 thread = (JavaThread*)t;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
587 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
588 else if(t->is_VM_thread()){
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
589 vmthread = (VMThread *)t;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
590 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
591 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
592 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
593
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
594 // decide if this trap can be handled by a stub
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
595 address stub = NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
596 address pc = NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
597 address npc = NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
598
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
599 //%note os_trap_1
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
600 if (info != NULL && uc != NULL && thread != NULL) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
601 pc = address(SIG_PC(uc));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
602 npc = address(SIG_NPC(uc));
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
603
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
604 // Check to see if we caught the safepoint code in the
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
605 // process of write protecting the memory serialization page.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
606 // It write enables the page immediately after protecting it
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
607 // so we can just return to retry the write.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
608 if ((sig == SIGSEGV) && checkSerializePage(thread, (address)info->si_addr)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
609 // Block current thread until the memory serialize page permission restored.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
610 os::block_on_serialize_page_trap();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
611 return 1;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
612 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
613
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
614 if (checkPrefetch(uc, pc)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
615 return 1;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
616 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
617
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
618 // Handle ALL stack overflow variations here
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
619 if (sig == SIGSEGV) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
620 if (checkOverflow(uc, pc, (address)info->si_addr, thread, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
621 return 1;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
622 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
623 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
624
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
625 if (sig == SIGBUS &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
626 thread->thread_state() == _thread_in_vm &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
627 thread->doing_unsafe_access()) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
628 stub = StubRoutines::handler_for_unsafe_access();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
629 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
630
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
631 if (thread->thread_state() == _thread_in_Java) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
632 do {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
633 // Java thread running in Java code => find exception handler if any
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
634 // a fault inside compiled code, the interpreter, or a stub
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
635
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
636 if ((sig == SIGSEGV) && checkPollingPage(pc, (address)info->si_addr, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
637 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
638 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
639
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
640 if ((sig == SIGBUS) && checkByteBuffer(pc, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
641 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
642 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
643
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
644 if ((sig == SIGSEGV || sig == SIGBUS) &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
645 checkVerifyOops(pc, (address)info->si_addr, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
646 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
647 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
648
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
649 if ((sig == SIGSEGV) && checkZombie(uc, &pc, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
650 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
651 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
652
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
653 if ((sig == SIGILL) && checkICMiss(uc, &pc, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
654 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
655 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
656
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
657 if ((sig == SIGFPE) && checkFPFault(pc, info->si_code, thread, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
658 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
659 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
660
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
661 if ((sig == SIGSEGV) &&
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
662 checkNullPointer(pc, (intptr_t)info->si_addr, thread, &stub)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
663 break;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
664 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
665 } while (0);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
666
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
667 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
668 // and the heap gets shrunk before the field access.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
669 if ((sig == SIGSEGV) || (sig == SIGBUS)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
670 checkFastJNIAccess(pc, &stub);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
671 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
672 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
673
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
674 if (stub != NULL) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
675 // save all thread context in case we need to restore it
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
676 thread->set_saved_exception_pc(pc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
677 thread->set_saved_exception_npc(npc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
678 set_cont_address(uc, stub);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
679 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
680 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
681 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
682
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
683 // signal-chaining
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
684 if (os::Linux::chained_handler(sig, info, ucVoid)) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
685 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
686 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
687
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
688 if (!abort_if_unrecognized) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
689 // caller wants another chance, so give it to him
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
690 return false;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
691 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
692
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
693 if (pc == NULL && uc != NULL) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
694 pc = os::Linux::ucontext_get_pc((ucontext_t*)uc);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
695 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
696
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
697 // unmask current signal
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
698 sigset_t newset;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
699 sigemptyset(&newset);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
700 sigaddset(&newset, sig);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
701 sigprocmask(SIG_UNBLOCK, &newset, NULL);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
702
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
703 VMError err(t, sig, pc, info, ucVoid);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
704 err.report_and_die();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
705
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
706 ShouldNotReachHere();
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
707 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
708
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
709 void os::Linux::init_thread_fpu_state(void) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
710 // Nothing to do
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
711 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
712
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
713 int os::Linux::get_fpu_control_word() {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
714 return 0;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
715 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
716
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
717 void os::Linux::set_fpu_control_word(int fpu) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
718 // nothing
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
719 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
720
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
721 bool os::is_allocatable(size_t bytes) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
722 #ifdef _LP64
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
723 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
724 #else
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
725 if (bytes < 2 * G) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
726 return true;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
727 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
728
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
729 char* addr = reserve_memory(bytes, NULL);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
730
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
731 if (addr != NULL) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
732 release_memory(addr, bytes);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
733 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
734
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
735 return addr != NULL;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
736 #endif // _LP64
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
737 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
738
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
739 ///////////////////////////////////////////////////////////////////////////////
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
740 // thread stack
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
741
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
742 size_t os::Linux::min_stack_allowed = 128 * K;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
743
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
744 // pthread on Ubuntu is always in floating stack mode
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
745 bool os::Linux::supports_variable_stack_size() { return true; }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
746
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
747 // return default stack size for thr_type
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
748 size_t os::Linux::default_stack_size(os::ThreadType thr_type) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
749 // default stack size (compiler thread needs larger stack)
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
750 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
751 return s;
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
752 }
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
753
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
754 size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
755 // Creating guard page is very expensive. Java thread has HotSpot
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
756 // guard page, only enable glibc guard page for non-Java threads.
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
757 return (thr_type == java_thread ? 0 : page_size());
435e64505015 6693457: Open-source hotspot linux-sparc support
phh
parents:
diff changeset
758 }