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