hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
author xdono
Tue, 28 Jul 2009 12:12:40 -0700
changeset 3261 c7d5aae8d3f7
parent 1 489c9b5090e2
child 5547 f4b087cbb361
permissions -rw-r--r--
6862919: Update copyright year Summary: Update copyright for files that have been modified in 2009, up to 07/09 Reviewed-by: tbell, ohair
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
     2
 * Copyright 2002-2007 Sun Microsystems, Inc.  All Rights Reserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
#include <jni.h>
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
#include "libproc.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
#if defined(x86_64) && !defined(amd64)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
#define amd64 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
static jfieldID p_ps_prochandle_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
static jfieldID threadList_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
static jfieldID loadObjectList_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
static jmethodID createClosestSymbol_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
static jmethodID createLoadObject_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
static jmethodID getThreadForThreadId_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
static jmethodID listAdd_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  return (struct ps_prochandle*)(intptr_t)ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
 * Method:    init0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
 * Signature: ()V
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_init0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  (JNIEnv *env, jclass cls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  jclass listClass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  if (init_libproc(getenv("LIBSAPROC_DEBUG")) != true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
     THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // fields we use
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // methods we use
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
                    "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
                    "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
                                                     "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // java.util.List method we call
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  listClass = (*env)->FindClass(env, "java/util/List");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getAddressSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  (JNIEnv *env, jclass cls)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
 return 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
 return 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  int n = 0, i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // add threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  n = get_num_threads(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  for (i = 0; i < n; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    jobject thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    jobject threadList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    lwpid_t lwpid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    lwpid = get_lwp_id(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
                                      (jlong)lwpid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  // add load objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  n = get_num_libs(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  for (i = 0; i < n; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
     uintptr_t base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
     const char* name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
     jobject loadObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
     jobject loadObjectList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
     base = get_lib_base(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
     name = get_lib_name(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
     loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
                                   (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
     loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
     (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
 * Method:    attach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
 * Signature: (I)V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__I
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  (JNIEnv *env, jobject this_obj, jint jpid) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  struct ps_prochandle* ph;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  if ( (ph = Pgrab(jpid)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  fillThreadsAndLoadObjects(env, this_obj, ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
 * Method:    attach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
 * Signature: (Ljava/lang/String;Ljava/lang/String;)V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  const char *execName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  const char *coreName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  struct ps_prochandle* ph;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  fillThreadsAndLoadObjects(env, this_obj, ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
 * Method:    detach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
 * Signature: ()V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_detach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  (JNIEnv *env, jobject this_obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  if (ph != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
     Prelease(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
 * Method:    lookupByName0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
 * Signature: (Ljava/lang/String;Ljava/lang/String;)J
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_lookupByName0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  const char *objectName_cstr, *symbolName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  jlong addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  objectName_cstr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  if (objectName != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  if (objectName_cstr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
 * Method:    lookupByAddress0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
 * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_lookupByAddress0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  (JNIEnv *env, jobject this_obj, jlong addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  uintptr_t offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  const char* sym = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  if (sym == NULL) return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
                          (*env)->NewStringUTF(env, sym), (jlong)offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
 * Method:    readBytesFromProcess0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
 * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  jbyteArray array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  jbyte *bufPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  ps_err_e err;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  array = (*env)->NewByteArray(env, numBytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  return (err == PS_OK)? array : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  (JNIEnv *env, jobject this_obj, jint lwp_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  struct user_regs_struct gregs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  jlongArray array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  jlong *regs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
     THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
#undef NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
#ifdef ia64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
#define NPRGREG IA64_REG_COUNT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  array = (*env)->NewLongArray(env, NPRGREG);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
#undef REG_INDEX
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  regs[REG_INDEX(SP)] = (uintptr_t) gregs.esp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  regs[REG_INDEX(EBX)] = (uintptr_t) gregs.ebx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  regs[REG_INDEX(EDX)] = (uintptr_t) gregs.edx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  regs[REG_INDEX(ECX)] = (uintptr_t) gregs.ecx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  regs[REG_INDEX(EAX)] = (uintptr_t) gregs.eax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  regs[REG_INDEX(CS)]  = (uintptr_t) gregs.xcs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  regs[REG_INDEX(SS)]  = (uintptr_t) gregs.xss;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
#endif /* i386 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
#if ia64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  for (i = 0; i < NPRGREG; i++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    regs[i] = 0xDEADDEAD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
#endif /* ia64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  regs[REG_INDEX(R15)] = gregs.r15;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  regs[REG_INDEX(R14)] = gregs.r14;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  regs[REG_INDEX(R13)] = gregs.r13;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  regs[REG_INDEX(R12)] = gregs.r12;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  regs[REG_INDEX(RBP)] = gregs.rbp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  regs[REG_INDEX(RBX)] = gregs.rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  regs[REG_INDEX(R11)] = gregs.r11;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  regs[REG_INDEX(R10)] = gregs.r10;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  regs[REG_INDEX(R9)] = gregs.r9;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  regs[REG_INDEX(R8)] = gregs.r8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  regs[REG_INDEX(RAX)] = gregs.rax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  regs[REG_INDEX(RCX)] = gregs.rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  regs[REG_INDEX(RDX)] = gregs.rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  regs[REG_INDEX(RSI)] = gregs.rsi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  regs[REG_INDEX(RDI)] = gregs.rdi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  regs[REG_INDEX(RIP)] = gregs.rip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  regs[REG_INDEX(CS)] = gregs.cs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  regs[REG_INDEX(RSP)] = gregs.rsp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  regs[REG_INDEX(SS)] = gregs.ss;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  regs[REG_INDEX(FSBASE)] = gregs.fs_base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  regs[REG_INDEX(GSBASE)] = gregs.gs_base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  regs[REG_INDEX(DS)] = gregs.ds;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  regs[REG_INDEX(ES)] = gregs.es;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  regs[REG_INDEX(FS)] = gregs.fs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  regs[REG_INDEX(GS)] = gregs.gs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
#endif /* amd64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  regs[REG_INDEX(R_PSR)] = gregs.tstate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  regs[REG_INDEX(R_PC)]  = gregs.tpc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  regs[REG_INDEX(R_nPC)] = gregs.tnpc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  regs[REG_INDEX(R_Y)]   = gregs.y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  regs[REG_INDEX(R_PSR)] = gregs.psr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  regs[REG_INDEX(R_PC)]  = gregs.pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  regs[REG_INDEX(R_nPC)] = gregs.npc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  regs[REG_INDEX(R_Y)]   = gregs.y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  regs[REG_INDEX(R_G0)]  =            0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
#endif /* sparc */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  return array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
}