annotate src/os_cpu/solaris_sparc/vm/thread_solaris_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 f95d63e2154a
children f34d701e952e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
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: 196
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
26 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
27 #include "thread_solaris.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // For Forte Analyzer AsyncGetCallTrace profiling support - thread is
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // currently interrupted by SIGPROF
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // NOTE: On Solaris, register windows are flushed in the signal handler
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // except for possibly the top frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
a61af66fc99e Initial load
duke
parents:
diff changeset
35 bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 void* ucontext, bool isInJava) {
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 assert(Thread::current() == this, "caller must be current thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
39 assert(this->is_Java_thread(), "must be JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 JavaThread* jt = (JavaThread *)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 if (!isInJava) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // make_walkable flushes register windows and grabs last_Java_pc
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // which can not be done if the ucontext sp matches last_Java_sp
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // stack walking utilities assume last_Java_pc set if marked flushed
a61af66fc99e Initial load
duke
parents:
diff changeset
47 jt->frame_anchor()->make_walkable(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // If we have a walkable last_Java_frame, then we should use it
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // even if isInJava == true. It should be more reliable than
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // ucontext info.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 *fr_addr = jt->pd_last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
55 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 ucontext_t* uc = (ucontext_t*) ucontext;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // At this point, we don't have a walkable last_Java_frame, so
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // we try to glean some information out of the ucontext.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 intptr_t* ret_sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 ExtendedPC addr = os::Solaris::fetch_frame_from_ucontext(this, uc,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 &ret_sp, NULL /* ret_fp only used on Solaris X86 */);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 if (addr.pc() == NULL || ret_sp == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // ucontext wasn't useful
a61af66fc99e Initial load
duke
parents:
diff changeset
67 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
70 frame ret_frame(ret_sp, frame::unpatchable, addr.pc());
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
71
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // we were running Java code when SIGPROF came in
a61af66fc99e Initial load
duke
parents:
diff changeset
73 if (isInJava) {
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
74
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
75
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
76 // If the frame we got is safe then it is most certainly valid
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
77 if (ret_frame.safe_for_sender(jt)) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
78 *fr_addr = ret_frame;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
79 return true;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
80 }
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
81
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
82 // If it isn't safe then we can try several things to try and get
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
83 // a good starting point.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
84 //
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
85 // On sparc the frames are almost certainly walkable in the sense
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
86 // of sp/fp linkages. However because of recycling of windows if
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
87 // a piece of code does multiple save's where the initial save creates
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
88 // a real frame with a return pc and the succeeding save's are used to
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
89 // simply get free registers and have no real pc then the pc linkage on these
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
90 // "inner" temporary frames will be bogus.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
91 // Since there is in general only a nesting level like
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
92 // this one deep in general we'll try and unwind such an "inner" frame
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
93 // here ourselves and see if it makes sense
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
94
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
95 frame unwind_frame(ret_frame.fp(), frame::unpatchable, addr.pc());
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
96
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
97 if (unwind_frame.safe_for_sender(jt)) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
98 *fr_addr = unwind_frame;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
99 return true;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
100 }
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
101
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
102 // Well that didn't work. Most likely we're toast on this tick
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
103 // The previous code would try this. I think it is dubious in light
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
104 // of changes to safe_for_sender and the unwind trick above but
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
105 // if it gets us a safe frame who wants to argue.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
106
0
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // If we have a last_Java_sp, then the SIGPROF signal caught us
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // right when we were transitioning from _thread_in_Java to a new
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // JavaThreadState. We use last_Java_sp instead of the sp from
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // the ucontext since it should be more reliable.
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
111
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 if (jt->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 ret_sp = jt->last_Java_sp();
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
114 frame ret_frame2(ret_sp, frame::unpatchable, addr.pc());
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
115 if (ret_frame2.safe_for_sender(jt)) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
116 *fr_addr = ret_frame2;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
117 return true;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
118 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
121 // This is the best we can do. We will only be able to decode the top frame
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
122
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 *fr_addr = ret_frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // At this point, we know we weren't running Java code. We might
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // have a last_Java_sp, but we don't have a walkable frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // However, we might still be able to construct something useful
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // if the thread was running native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (jt->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 assert(!jt->frame_anchor()->walkable(), "case covered above");
a61af66fc99e Initial load
duke
parents:
diff changeset
133
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
134 frame ret_frame(jt->last_Java_sp(), frame::unpatchable, addr.pc());
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
135 *fr_addr = ret_frame;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
136 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
139 // nothing else to try but what we found initially
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
140
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
141 *fr_addr = ret_frame;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
142 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
144
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
145 void JavaThread::cache_global_variables() { }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
146