annotate agent/src/share/classes/sun/jvm/hotspot/runtime/linux_ia64/LinuxIA64JavaThreadPDAccess.java @ 774:f1f3a2719a55

6843580: JavaThread.getStackBase throws sun.jvm.hotspot.WrongTypeException invoked by jstack Reviewed-by: phh, dice, never, swamyv
author xlu
date Fri, 22 May 2009 16:40:38 -0700
parents a61af66fc99e
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 package sun.jvm.hotspot.runtime.linux_ia64;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 import java.io.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 import java.util.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 import sun.jvm.hotspot.debugger.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 import sun.jvm.hotspot.debugger.ia64.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 import sun.jvm.hotspot.runtime.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 import sun.jvm.hotspot.runtime.ia64.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 import sun.jvm.hotspot.types.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 import sun.jvm.hotspot.utilities.*;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 public class LinuxIA64JavaThreadPDAccess implements JavaThreadPDAccess {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // private static AddressField lastJavaPCField;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // private static AddressField lastJavaFPField;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 private static AddressField lastJavaIFrameField;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 private static AddressField osThreadField;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Field from OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
43 private static CIntegerField osThreadPThreadIDField;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // This is currently unneeded but is being kept in case we change
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // the currentFrameGuess algorithm
a61af66fc99e Initial load
duke
parents:
diff changeset
47 private static final long GUESS_SCAN_RANGE = 128 * 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 static {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 VM.registerVMInitializedObserver(new Observer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 public void update(Observable o, Object data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 initialize(VM.getVM().getTypeDataBase());
a61af66fc99e Initial load
duke
parents:
diff changeset
53 }
a61af66fc99e Initial load
duke
parents:
diff changeset
54 });
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 private static synchronized void initialize(TypeDataBase db) {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 Type type = db.lookupType("JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 lastJavaIFrameField = type.getAddressField("_last_Java_iframe");
a61af66fc99e Initial load
duke
parents:
diff changeset
61 osThreadField = type.getAddressField("_osthread");
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 type = db.lookupType("OSThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
64 osThreadPThreadIDField = type.getCIntegerField("_pthread_id");
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 public Address getLastJavaIFrame(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 return lastJavaIFrameField.getValue(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 public Address getBaseOfStackPointer(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 return null;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 public Address getLastJavaFP(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 return null; // Not in 1.4.1
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 public Address getLastJavaPC(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 return null; // Not in 1.4.1
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 public boolean isInterpretedFrame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // In 1.4.1 there are only interpreted frames
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // and there is no pc
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 public Frame getLastFramePD(JavaThread thread, Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // The thread is the JavaThread that contains "this"
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // so we don't need any new accessor at the JavaThread level
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Address iframe = getLastJavaIFrame(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 Address pc = thread.getLastJavaPC();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 if (iframe == null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 return null; // no information
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return new IA64Frame(thread.getLastJavaSP(), iframe, pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 return new IA64RegisterMap(thread, updateMap);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 return getLastFramePD(thread, addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 public void printThreadIDOn(Address addr, PrintStream tty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 tty.print(getThreadProxy(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 public void printInfoOn(Address threadAddr, PrintStream tty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 tty.print("Thread id: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
116 printThreadIDOn(threadAddr, tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 tty.println("\nLastJavaIFrame: " + getLastJavaIFrame(threadAddr));
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 public Address getLastSP(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 ThreadProxy t = getThreadProxy(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 IA64ThreadContext context = (IA64ThreadContext) t.getContext();
a61af66fc99e Initial load
duke
parents:
diff changeset
123 return context.getRegisterAsAddress(IA64ThreadContext.SP);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 public ThreadProxy getThreadProxy(Address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Addr is the address of the JavaThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Fetch the OSThread (for now and for simplicity, not making a
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // separate "OSThread" class in this package)
a61af66fc99e Initial load
duke
parents:
diff changeset
130 Address osThreadAddr = osThreadField.getValue(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Get the address of the _pthread_id from the OSThread
a61af66fc99e Initial load
duke
parents:
diff changeset
132 Address pthreadIdAddr = osThreadAddr.addOffsetTo(osThreadPThreadIDField.getOffset());
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 JVMDebugger debugger = VM.getVM().getDebugger();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return debugger.getThreadForIdentifierAddress(pthreadIdAddr);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }