annotate agent/src/os/bsd/MacosxDebuggerLocal.m @ 7416:a70c88896791

8004713: Stackoverflowerror thrown when thread stack straddles 0x80000000 Summary: use unsigned comparison when checking for stack overflow Reviewed-by: kvn, twisti Contributed-by: paul.nauman@oracle.com
author kvn
date Thu, 13 Dec 2012 17:27:55 -0800
parents 5a98bf7d847b
children 758935f7c23f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
1 /*
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
4 *
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
7 * published by the Free Software Foundation.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
8 *
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
13 * accompanied this code).
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
14 *
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
18 *
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
21 * questions.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
22 *
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
23 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
24
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
25 #include <objc/objc-runtime.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
26 #import <Foundation/Foundation.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
27 #import <JavaNativeFoundation/JavaNativeFoundation.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
28
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
29 #include <JavaVM/jni.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
30
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
31 #import <mach/mach.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
32 #import <mach/mach_types.h>
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
33 #import <sys/sysctl.h>
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
34 #import <stdio.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
35 #import <stdarg.h>
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
36 #import <stdlib.h>
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
37 #import <strings.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
38 #import <dlfcn.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
39 #import <limits.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
40 #import <errno.h>
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
41
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
42 jboolean debug = JNI_FALSE;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
43
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
44 static jfieldID symbolicatorID = 0; // set in _init0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
45 static jfieldID taskID = 0; // set in _init0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
46
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
47 static void putSymbolicator(JNIEnv *env, jobject this_obj, id symbolicator) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
48 (*env)->SetLongField(env, this_obj, symbolicatorID, (jlong)(intptr_t)symbolicator);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
49 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
50
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
51 static id getSymbolicator(JNIEnv *env, jobject this_obj) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
52 jlong ptr = (*env)->GetLongField(env, this_obj, symbolicatorID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
53 return (id)(intptr_t)ptr;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
54 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
55
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
56 static void putTask(JNIEnv *env, jobject this_obj, task_t task) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
57 (*env)->SetLongField(env, this_obj, taskID, (jlong)task);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
58 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
59
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
60 static task_t getTask(JNIEnv *env, jobject this_obj) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
61 jlong ptr = (*env)->GetLongField(env, this_obj, taskID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
62 return (task_t)ptr;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
63 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
64
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
65 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
66 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
67 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
68 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
69 #define CHECK_EXCEPTION_CLEAR if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
70 #define CHECK_EXCEPTION_CLEAR_VOID if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return; }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
71 #define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
72
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
73 static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
74 (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
75 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
76
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
77 #if defined(__i386__)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
78 #define hsdb_thread_state_t x86_thread_state32_t
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
79 #define hsdb_float_state_t x86_float_state32_t
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
80 #define HSDB_THREAD_STATE x86_THREAD_STATE32
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
81 #define HSDB_FLOAT_STATE x86_FLOAT_STATE32
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
82 #define HSDB_THREAD_STATE_COUNT x86_THREAD_STATE32_COUNT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
83 #define HSDB_FLOAT_STATE_COUNT x86_FLOAT_STATE32_COUNT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
84 #elif defined(__x86_64__)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
85 #define hsdb_thread_state_t x86_thread_state64_t
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
86 #define hsdb_float_state_t x86_float_state64_t
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
87 #define HSDB_THREAD_STATE x86_THREAD_STATE64
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
88 #define HSDB_FLOAT_STATE x86_FLOAT_STATE64
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
89 #define HSDB_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
90 #define HSDB_FLOAT_STATE_COUNT x86_FLOAT_STATE64_COUNT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
91 #else
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
92 #error "Unsupported architecture"
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
93 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
94
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
95 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
96 * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
97 * Method: init0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
98 * Signature: ()V
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
99 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
100 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
101 symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
102 taskID = (*env)->GetFieldID(env, cls, "task", "J");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
103 CHECK_EXCEPTION;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
104 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
105
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
106 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
107 * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
108 * Method: lookupByName0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
109 * Signature: (Ljava/lang/String;Ljava/lang/String;)J
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
110 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
111 JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0(JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
112 jlong address = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
113
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
114 JNF_COCOA_ENTER(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
115 NSString *symbolNameString = JNFJavaToNSString(env, symbolName);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
116
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
117 if (debug) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
118 printf("lookupInProcess called for %s\n", [symbolNameString UTF8String]);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
119 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
120
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
121 id symbolicator = getSymbolicator(env, this_obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
122 if (symbolicator != nil) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
123 uint64_t (*dynamicCall)(id, SEL, NSString *) = (uint64_t (*)(id, SEL, NSString *))&objc_msgSend;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
124 address = (jlong) dynamicCall(symbolicator, @selector(addressForSymbol:), symbolNameString);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
125 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
126
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
127 if (debug) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
128 printf("address of symbol %s = %llx\n", [symbolNameString UTF8String], address);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
129 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
130 JNF_COCOA_EXIT(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
131
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
132 return address;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
133 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
134
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
135 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
136 * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
137 * Method: readBytesFromProcess0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
138 * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
139 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
140 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0(JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
141 if (debug) printf("readBytesFromProcess called. addr = %llx numBytes = %lld\n", addr, numBytes);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
142
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
143 // must allocate storage instead of using former parameter buf
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
144 jboolean isCopy;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
145 jbyteArray array;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
146 jbyte *bufPtr;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
147
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
148 array = (*env)->NewByteArray(env, numBytes);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
149 CHECK_EXCEPTION_(0);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
150
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
151 unsigned long alignedAddress;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
152 unsigned long alignedLength;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
153 kern_return_t result;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
154 vm_offset_t *pages;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
155 int *mapped;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
156 long pageCount;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
157 uint byteCount;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
158 int i;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
159 unsigned long remaining;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
160
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
161 alignedAddress = trunc_page(addr);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
162 if (addr != alignedAddress) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
163 alignedLength += addr - alignedAddress;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
164 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
165 alignedLength = round_page(numBytes);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
166 pageCount = alignedLength/vm_page_size;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
167
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
168 // Allocate storage for pages and flags.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
169 pages = malloc(pageCount * sizeof(vm_offset_t));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
170 mapped = calloc(pageCount, sizeof(int));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
171
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
172 task_t gTask = getTask(env, this_obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
173 // Try to read each of the pages.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
174 for (i = 0; i < pageCount; i++) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
175 result = vm_read(gTask, alignedAddress + i*vm_page_size, vm_page_size,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
176 &pages[i], &byteCount);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
177 mapped[i] = (result == KERN_SUCCESS);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
178 // assume all failures are unmapped pages
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
179 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
180
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
181 if (debug) fprintf(stderr, "%ld pages\n", pageCount);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
182
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
183 remaining = numBytes;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
184
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
185 for (i = 0; i < pageCount; i++) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
186 unsigned long len = vm_page_size;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
187 unsigned long start = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
188
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
189 if (i == 0) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
190 start = addr - alignedAddress;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
191 len = vm_page_size - start;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
192 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
193
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
194 if (i == (pageCount - 1)) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
195 len = remaining;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
196 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
197
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
198 if (mapped[i]) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
199 if (debug) fprintf(stderr, "page %d mapped (len %ld start %ld)\n", i, len, start);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
200 (*env)->SetByteArrayRegion(env, array, 0, len, ((jbyte *) pages[i] + start));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
201 vm_deallocate(mach_task_self(), pages[i], vm_page_size);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
202 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
203
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
204 remaining -= len;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
205 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
206
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
207 free (pages);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
208 free (mapped);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
209 return array;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
210 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
211
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
212 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
213 * Class: sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
214 * Method: getThreadIntegerRegisterSet0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
215 * Signature: (I)[J
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
216 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
217 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0(JNIEnv *env, jobject this_obj, jint lwp_id) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
218 if (debug)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
219 printf("getThreadRegisterSet0 called\n");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
220
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
221 kern_return_t result;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
222 thread_t tid;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
223 mach_msg_type_number_t count = HSDB_THREAD_STATE_COUNT;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
224 hsdb_thread_state_t state;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
225 unsigned int *r;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
226 int i;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
227 jlongArray registerArray;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
228 jlong *primitiveArray;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
229
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
230 tid = lwp_id;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
231
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
232 result = thread_get_state(tid, HSDB_THREAD_STATE, (thread_state_t)&state, &count);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
233
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
234 if (result != KERN_SUCCESS) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
235 if (debug)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
236 printf("getregs: thread_get_state(%d) failed (%d)\n", tid, result);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
237 return NULL;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
238 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
239
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
240 // 40 32-bit registers on ppc, 16 on x86.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
241 // Output order is the same as the order in the ppc_thread_state/i386_thread_state struct.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
242 #if defined(__i386__)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
243 r = (unsigned int *)&state;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
244 registerArray = (*env)->NewLongArray(env, 8);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
245 primitiveArray = (*env)->GetLongArrayElements(env, registerArray, NULL);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
246 primitiveArray[0] = r[0]; // eax
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
247 primitiveArray[1] = r[2]; // ecx
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
248 primitiveArray[2] = r[3]; // edx
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
249 primitiveArray[3] = r[1]; // ebx
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
250 primitiveArray[4] = r[7]; // esp
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
251 primitiveArray[5] = r[6]; // ebp
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
252 primitiveArray[6] = r[5]; // esi
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
253 primitiveArray[7] = r[4]; // edi
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
254 (*env)->ReleaseLongArrayElements(env, registerArray, primitiveArray, 0);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
255 #elif defined(__x86_64__)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
256 /* From AMD64ThreadContext.java
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
257 public static final int R15 = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
258 public static final int R14 = 1;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
259 public static final int R13 = 2;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
260 public static final int R12 = 3;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
261 public static final int R11 = 4;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
262 public static final int R10 = 5;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
263 public static final int R9 = 6;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
264 public static final int R8 = 7;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
265 public static final int RDI = 8;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
266 public static final int RSI = 9;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
267 public static final int RBP = 10;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
268 public static final int RBX = 11;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
269 public static final int RDX = 12;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
270 public static final int RCX = 13;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
271 public static final int RAX = 14;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
272 public static final int TRAPNO = 15;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
273 public static final int ERR = 16;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
274 public static final int RIP = 17;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
275 public static final int CS = 18;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
276 public static final int RFL = 19;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
277 public static final int RSP = 20;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
278 public static final int SS = 21;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
279 public static final int FS = 22;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
280 public static final int GS = 23;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
281 public static final int ES = 24;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
282 public static final int DS = 25;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
283 public static final int FSBASE = 26;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
284 public static final int GSBASE = 27;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
285 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
286 // 64 bit
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
287 if (debug) printf("Getting threads for a 64-bit process\n");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
288 registerArray = (*env)->NewLongArray(env, 28);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
289 primitiveArray = (*env)->GetLongArrayElements(env, registerArray, NULL);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
290
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
291 primitiveArray[0] = state.__r15;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
292 primitiveArray[1] = state.__r14;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
293 primitiveArray[2] = state.__r13;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
294 primitiveArray[3] = state.__r12;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
295 primitiveArray[4] = state.__r11;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
296 primitiveArray[5] = state.__r10;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
297 primitiveArray[6] = state.__r9;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
298 primitiveArray[7] = state.__r8;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
299 primitiveArray[8] = state.__rdi;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
300 primitiveArray[9] = state.__rsi;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
301 primitiveArray[10] = state.__rbp;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
302 primitiveArray[11] = state.__rbx;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
303 primitiveArray[12] = state.__rdx;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
304 primitiveArray[13] = state.__rcx;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
305 primitiveArray[14] = state.__rax;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
306 primitiveArray[15] = 0; // trapno ?
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
307 primitiveArray[16] = 0; // err ?
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
308 primitiveArray[17] = state.__rip;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
309 primitiveArray[18] = state.__cs;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
310 primitiveArray[19] = state.__rflags;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
311 primitiveArray[20] = state.__rsp;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
312 primitiveArray[21] = 0; // We don't have SS
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
313 primitiveArray[22] = state.__fs;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
314 primitiveArray[23] = state.__gs;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
315 primitiveArray[24] = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
316 primitiveArray[25] = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
317 primitiveArray[26] = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
318 primitiveArray[27] = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
319
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
320 if (debug) printf("set registers\n");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
321
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
322 (*env)->ReleaseLongArrayElements(env, registerArray, primitiveArray, 0);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
323 #else
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
324 #error Unsupported architecture
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
325 #endif
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
326
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
327 return registerArray;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
328 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
329
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
330 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
331 * Class: sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
332 * Method: translateTID0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
333 * Signature: (I)I
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
334 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
335 JNIEXPORT jint JNICALL
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
336 Java_sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal_translateTID0(JNIEnv *env, jobject this_obj, jint tid) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
337 if (debug)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
338 printf("translateTID0 called on tid = 0x%x\n", (int)tid);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
339
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
340 kern_return_t result;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
341 thread_t foreign_tid, usable_tid;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
342 mach_msg_type_name_t type;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
343
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
344 foreign_tid = tid;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
345
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
346 task_t gTask = getTask(env, this_obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
347 result = mach_port_extract_right(gTask, foreign_tid,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
348 MACH_MSG_TYPE_COPY_SEND,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
349 &usable_tid, &type);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
350 if (result != KERN_SUCCESS)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
351 return -1;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
352
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
353 if (debug)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
354 printf("translateTID0: 0x%x -> 0x%x\n", foreign_tid, usable_tid);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
355
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
356 return (jint) usable_tid;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
357 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
358
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
359 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
360 * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
361 * Method: attach0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
362 * Signature: (I)V
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
363 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
364 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I(JNIEnv *env, jobject this_obj, jint jpid) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
365 JNF_COCOA_ENTER(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
366 if (getenv("JAVA_SAPROC_DEBUG") != NULL)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
367 debug = JNI_TRUE;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
368 else
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
369 debug = JNI_FALSE;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
370 if (debug) printf("attach0 called for jpid=%d\n", (int)jpid);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
371
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
372 kern_return_t result;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
373 task_t gTask = 0;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
374 result = task_for_pid(mach_task_self(), jpid, &gTask);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
375 if (result != KERN_SUCCESS) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
376 fprintf(stderr, "attach: task_for_pid(%d) failed (%d)\n", (int)jpid, result);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
377 THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
378 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
379 putTask(env, this_obj, gTask);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
380
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
381 id symbolicator = nil;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
382 id jrsSymbolicator = objc_lookUpClass("JRSSymbolicator");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
383 if (jrsSymbolicator != nil) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
384 id (*dynamicCall)(id, SEL, pid_t) = (id (*)(id, SEL, pid_t))&objc_msgSend;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
385 symbolicator = dynamicCall(jrsSymbolicator, @selector(symbolicatorForPid:), (pid_t)jpid);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
386 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
387 if (symbolicator != nil) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
388 CFRetain(symbolicator); // pin symbolicator while in java heap
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
389 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
390
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
391 putSymbolicator(env, this_obj, symbolicator);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
392 if (symbolicator == nil) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
393 THROW_NEW_DEBUGGER_EXCEPTION("Can't attach symbolicator to the process");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
394 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
395
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
396 JNF_COCOA_EXIT(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
397 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
398
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
399 /*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
400 * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
401 * Method: detach0
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
402 * Signature: ()V
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
403 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
404 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0(JNIEnv *env, jobject this_obj) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
405 JNF_COCOA_ENTER(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
406 if (debug) printf("detach0 called\n");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
407
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
408 task_t gTask = getTask(env, this_obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
409 mach_port_deallocate(mach_task_self(), gTask);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
410 id symbolicator = getSymbolicator(env, this_obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
411 if (symbolicator != nil) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
412 CFRelease(symbolicator);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
413 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
414 JNF_COCOA_EXIT(env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents:
diff changeset
415 }
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
416
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
417 /*
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
418 * Class: sun_jvm_hotspot_asm_Disassembler
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
419 * Method: load_library
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
420 * Signature: (Ljava/lang/String;)L
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
421 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
422 JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_asm_Disassembler_load_1library(JNIEnv * env,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
423 jclass disclass,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
424 jstring jrepath_s,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
425 jstring libname_s) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
426 uintptr_t func = 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
427 const char* error_message = NULL;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
428 const char* java_home;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
429 jboolean isCopy;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
430 uintptr_t *handle = NULL;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
431
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
432 const char * jrepath = (*env)->GetStringUTFChars(env, jrepath_s, &isCopy); // like $JAVA_HOME/jre/lib/sparc/
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
433 const char * libname = (*env)->GetStringUTFChars(env, libname_s, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
434 char buffer[128];
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
435
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
436 /* Load the hsdis library */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
437 void* hsdis_handle;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
438 hsdis_handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
439 if (hsdis_handle == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
440 snprintf(buffer, sizeof(buffer), "%s%s", jrepath, libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
441 hsdis_handle = dlopen(buffer, RTLD_LAZY | RTLD_GLOBAL);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
442 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
443 if (hsdis_handle != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
444 func = (uintptr_t)dlsym(hsdis_handle, "decode_instructions_virtual");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
445 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
446 if (func == 0) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
447 error_message = dlerror();
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
448 fprintf(stderr, "%s\n", error_message);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
449 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
450
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
451 (*env)->ReleaseStringUTFChars(env, libname_s, libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
452 (*env)->ReleaseStringUTFChars(env, jrepath_s, jrepath);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
453
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
454 if (func == 0) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
455 /* Couldn't find entry point. error_message should contain some
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
456 * platform dependent error message.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
457 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
458 THROW_NEW_DEBUGGER_EXCEPTION(error_message);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
459 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
460 return (jlong)func;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
461 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
462
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
463 /* signature of decode_instructions_virtual from hsdis.h */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
464 typedef void* (*decode_func)(uintptr_t start_va, uintptr_t end_va,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
465 unsigned char* start, uintptr_t length,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
466 void* (*event_callback)(void*, const char*, void*),
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
467 void* event_stream,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
468 int (*printf_callback)(void*, const char*, ...),
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
469 void* printf_stream,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
470 const char* options);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
471
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
472 /* container for call back state when decoding instructions */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
473 typedef struct {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
474 JNIEnv* env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
475 jobject dis;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
476 jobject visitor;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
477 jmethodID handle_event;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
478 jmethodID raw_print;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
479 char buffer[4096];
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
480 } decode_env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
481
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
482
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
483 /* event callback binding to Disassembler.handleEvent */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
484 static void* event_to_env(void* env_pv, const char* event, void* arg) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
485 decode_env* denv = (decode_env*)env_pv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
486 JNIEnv* env = denv->env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
487 jstring event_string = (*env)->NewStringUTF(env, event);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
488 jlong result = (*env)->CallLongMethod(env, denv->dis, denv->handle_event, denv->visitor,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
489 event_string, (jlong) (uintptr_t)arg);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
490 /* ignore exceptions for now */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
491 CHECK_EXCEPTION_CLEAR_((void *)0);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
492 return (void*)(uintptr_t)result;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
493 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
494
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
495 /* printing callback binding to Disassembler.rawPrint */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
496 static int printf_to_env(void* env_pv, const char* format, ...) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
497 jstring output;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
498 va_list ap;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
499 int cnt;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
500 decode_env* denv = (decode_env*)env_pv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
501 JNIEnv* env = denv->env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
502 size_t flen = strlen(format);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
503 const char* raw = NULL;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
504
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
505 if (flen == 0) return 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
506 if (flen < 2 ||
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
507 strchr(format, '%') == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
508 raw = format;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
509 } else if (format[0] == '%' && format[1] == '%' &&
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
510 strchr(format+2, '%') == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
511 // happens a lot on machines with names like %foo
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
512 flen--;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
513 raw = format+1;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
514 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
515 if (raw != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
516 jstring output = (*env)->NewStringUTF(env, raw);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
517 (*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
518 CHECK_EXCEPTION_CLEAR;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
519 return (int) flen;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
520 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
521 va_start(ap, format);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
522 cnt = vsnprintf(denv->buffer, sizeof(denv->buffer), format, ap);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
523 va_end(ap);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
524
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
525 output = (*env)->NewStringUTF(env, denv->buffer);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
526 (*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
527 CHECK_EXCEPTION_CLEAR;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
528 return cnt;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
529 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
530
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
531 /*
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
532 * Class: sun_jvm_hotspot_asm_Disassembler
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
533 * Method: decode
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
534 * Signature: (Lsun/jvm/hotspot/asm/InstructionVisitor;J[BLjava/lang/String;J)V
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
535 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
536 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_asm_Disassembler_decode(JNIEnv * env,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
537 jobject dis,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
538 jobject visitor,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
539 jlong startPc,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
540 jbyteArray code,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
541 jstring options_s,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
542 jlong decode_instructions_virtual) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
543 jboolean isCopy;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
544 jbyte* start = (*env)->GetByteArrayElements(env, code, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
545 jbyte* end = start + (*env)->GetArrayLength(env, code);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
546 const char * options = (*env)->GetStringUTFChars(env, options_s, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
547 jclass disclass = (*env)->GetObjectClass(env, dis);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
548
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
549 decode_env denv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
550 denv.env = env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
551 denv.dis = dis;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
552 denv.visitor = visitor;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
553
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
554 /* find Disassembler.handleEvent callback */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
555 denv.handle_event = (*env)->GetMethodID(env, disclass, "handleEvent",
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
556 "(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;J)J");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
557 CHECK_EXCEPTION_CLEAR_VOID
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
558
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
559 /* find Disassembler.rawPrint callback */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
560 denv.raw_print = (*env)->GetMethodID(env, disclass, "rawPrint",
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
561 "(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;)V");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
562 CHECK_EXCEPTION_CLEAR_VOID
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
563
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
564 /* decode the buffer */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
565 (*(decode_func)(uintptr_t)decode_instructions_virtual)(startPc,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
566 startPc + end - start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
567 (unsigned char*)start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
568 end - start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
569 &event_to_env, (void*) &denv,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
570 &printf_to_env, (void*) &denv,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
571 options);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
572
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
573 /* cleanup */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
574 (*env)->ReleaseByteArrayElements(env, code, start, JNI_ABORT);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
575 (*env)->ReleaseStringUTFChars(env, options_s, options);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents: 4006
diff changeset
576 }