hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
author xuelei
Wed, 26 Jun 2013 06:32:40 -0700
changeset 18554 d2f655022d2d
parent 15850 0d2f541fd6ed
child 20295 a5dd1b071c32
permissions -rw-r--r--
8017049: rename property jdk.tls.rejectClientInitializedRenego Reviewed-by: vinnie, wetmore, mullan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
15850
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
     2
 * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
1
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
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
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
15850
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    28
#include <elf.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    29
#include <sys/types.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    30
#include <sys/stat.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    31
#include <fcntl.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    32
#include <string.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    33
#include <limits.h>
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
    34
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
#if defined(x86_64) && !defined(amd64)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
#define amd64 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
static jfieldID p_ps_prochandle_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
static jfieldID threadList_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
static jfieldID loadObjectList_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
static jmethodID createClosestSymbol_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
static jmethodID createLoadObject_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
static jmethodID getThreadForThreadId_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
static jmethodID listAdd_ID = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
13529
dc25e69fd16d 7154641: Servicability agent should work on platforms other than x86, sparc
bpittore
parents: 5547
diff changeset
    65
void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
13529
dc25e69fd16d 7154641: Servicability agent should work on platforms other than x86, sparc
bpittore
parents: 5547
diff changeset
    69
struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  return (struct ps_prochandle*)(intptr_t)ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
 * Method:    init0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
 * Signature: ()V
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_init0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  (JNIEnv *env, jclass cls) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  jclass listClass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  if (init_libproc(getenv("LIBSAPROC_DEBUG")) != true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
     THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // fields we use
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // methods we use
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
                    "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
                    "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
                                                     "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // java.util.List method we call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  listClass = (*env)->FindClass(env, "java/util/List");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getAddressSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  (JNIEnv *env, jclass cls)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
 return 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
 return 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  int n = 0, i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  // add threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  n = get_num_threads(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  for (i = 0; i < n; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    jobject thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    jobject threadList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    lwpid_t lwpid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    lwpid = get_lwp_id(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
                                      (jlong)lwpid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // add load objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  n = get_num_libs(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  for (i = 0; i < n; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
     uintptr_t base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
     const char* name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
     jobject loadObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
     jobject loadObjectList;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
     base = get_lib_base(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
     name = get_lib_name(ph, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
     loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
                                   (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
     loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
     (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
     CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
15850
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   164
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   165
/*
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   166
 * Verify that a named ELF binary file (core or executable) has the same
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   167
 * bitness as ourselves.
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   168
 * Throw an exception if there is a mismatch or other problem.
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   169
 *
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   170
 * If we proceed using a mismatched debugger/debuggee, the best to hope
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   171
 * for is a missing symbol, the worst is a crash searching for debug symbols.
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   172
 */
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   173
void verifyBitness(JNIEnv *env, const char *binaryName) {
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   174
  int fd = open(binaryName, O_RDONLY);
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   175
  if (fd < 0) {
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   176
    THROW_NEW_DEBUGGER_EXCEPTION("cannot open binary file");
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   177
  }
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   178
  unsigned char elf_ident[EI_NIDENT];
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   179
  int i = read(fd, &elf_ident, sizeof(elf_ident));
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   180
  close(fd);
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   181
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   182
  if (i < 0) {
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   183
    THROW_NEW_DEBUGGER_EXCEPTION("cannot read binary file");
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   184
  }
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   185
#ifndef _LP64
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   186
  if (elf_ident[EI_CLASS] == ELFCLASS64) {
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   187
    THROW_NEW_DEBUGGER_EXCEPTION("debuggee is 64 bit, use 64-bit java for debugger");
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   188
  }
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   189
#else
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   190
  if (elf_ident[EI_CLASS] != ELFCLASS64) {
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   191
    THROW_NEW_DEBUGGER_EXCEPTION("debuggee is 32 bit, use 32 bit java for debugger");
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   192
  }
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   193
#endif
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   194
}
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   195
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   196
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
 * Method:    attach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
 * Signature: (I)V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__I
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  (JNIEnv *env, jobject this_obj, jint jpid) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
15850
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   205
  // For bitness checking, locate binary at /proc/jpid/exe
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   206
  char buf[PATH_MAX];
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   207
  snprintf((char *) &buf, PATH_MAX, "/proc/%d/exe", jpid);
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   208
  verifyBitness(env, (char *) &buf);
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   209
  CHECK_EXCEPTION;
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   210
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  struct ps_prochandle* ph;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  if ( (ph = Pgrab(jpid)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  fillThreadsAndLoadObjects(env, this_obj, ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
 * Method:    attach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
 * Signature: (Ljava/lang/String;Ljava/lang/String;)V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
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
   225
  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  const char *execName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  const char *coreName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  struct ps_prochandle* ph;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  CHECK_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
15850
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   236
  verifyBitness(env, execName_cstr);
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   237
  CHECK_EXCEPTION;
0d2f541fd6ed 8008807: SA: jstack crash when target has mismatched bitness (Linux)
kevinw
parents: 15475
diff changeset
   238
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  fillThreadsAndLoadObjects(env, this_obj, ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
 * Method:    detach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
 * Signature: ()V
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_detach0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  (JNIEnv *env, jobject this_obj) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  if (ph != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
     Prelease(ph);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
 * Method:    lookupByName0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
 * Signature: (Ljava/lang/String;Ljava/lang/String;)J
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_lookupByName0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  const char *objectName_cstr, *symbolName_cstr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  jlong addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  objectName_cstr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  if (objectName != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  if (objectName_cstr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  return addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
 * Method:    lookupByAddress0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
 * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_lookupByAddress0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  (JNIEnv *env, jobject this_obj, jlong addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  uintptr_t offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  const char* sym = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  if (sym == NULL) return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
                          (*env)->NewStringUTF(env, sym), (jlong)offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
 * Class:     sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
 * Method:    readBytesFromProcess0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
 * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  jbyteArray array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  jbyte *bufPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  ps_err_e err;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  array = (*env)->NewByteArray(env, numBytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  return (err == PS_OK)? array : 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 13529
diff changeset
   332
#if defined(i386) || defined(amd64) || defined(sparc) || defined(sparcv9)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  (JNIEnv *env, jobject this_obj, jint lwp_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  struct user_regs_struct gregs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  jboolean isCopy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  jlongArray array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  jlong *regs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
     THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
#undef NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  array = (*env)->NewLongArray(env, NPRGREG);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  CHECK_EXCEPTION_(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
#undef REG_INDEX
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
#ifdef i386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  regs[REG_INDEX(SP)] = (uintptr_t) gregs.esp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  regs[REG_INDEX(EBX)] = (uintptr_t) gregs.ebx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  regs[REG_INDEX(EDX)] = (uintptr_t) gregs.edx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  regs[REG_INDEX(ECX)] = (uintptr_t) gregs.ecx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  regs[REG_INDEX(EAX)] = (uintptr_t) gregs.eax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  regs[REG_INDEX(CS)]  = (uintptr_t) gregs.xcs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  regs[REG_INDEX(SS)]  = (uintptr_t) gregs.xss;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
#endif /* i386 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
#ifdef amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  regs[REG_INDEX(R15)] = gregs.r15;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  regs[REG_INDEX(R14)] = gregs.r14;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  regs[REG_INDEX(R13)] = gregs.r13;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  regs[REG_INDEX(R12)] = gregs.r12;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  regs[REG_INDEX(RBP)] = gregs.rbp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  regs[REG_INDEX(RBX)] = gregs.rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  regs[REG_INDEX(R11)] = gregs.r11;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  regs[REG_INDEX(R10)] = gregs.r10;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  regs[REG_INDEX(R9)] = gregs.r9;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  regs[REG_INDEX(R8)] = gregs.r8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  regs[REG_INDEX(RAX)] = gregs.rax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  regs[REG_INDEX(RCX)] = gregs.rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  regs[REG_INDEX(RDX)] = gregs.rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  regs[REG_INDEX(RSI)] = gregs.rsi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  regs[REG_INDEX(RDI)] = gregs.rdi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  regs[REG_INDEX(RIP)] = gregs.rip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  regs[REG_INDEX(CS)] = gregs.cs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  regs[REG_INDEX(RSP)] = gregs.rsp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  regs[REG_INDEX(SS)] = gregs.ss;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  regs[REG_INDEX(FSBASE)] = gregs.fs_base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  regs[REG_INDEX(GSBASE)] = gregs.gs_base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  regs[REG_INDEX(DS)] = gregs.ds;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  regs[REG_INDEX(ES)] = gregs.es;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  regs[REG_INDEX(FS)] = gregs.fs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  regs[REG_INDEX(GS)] = gregs.gs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
#endif /* amd64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
#if defined(sparc) || defined(sparcv9)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  regs[REG_INDEX(R_PSR)] = gregs.tstate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  regs[REG_INDEX(R_PC)]  = gregs.tpc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  regs[REG_INDEX(R_nPC)] = gregs.tnpc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  regs[REG_INDEX(R_Y)]   = gregs.y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  regs[REG_INDEX(R_PSR)] = gregs.psr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  regs[REG_INDEX(R_PC)]  = gregs.pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  regs[REG_INDEX(R_nPC)] = gregs.npc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  regs[REG_INDEX(R_Y)]   = gregs.y;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  regs[REG_INDEX(R_G0)]  =            0 ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
#endif /* sparc */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  return array;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
}
13529
dc25e69fd16d 7154641: Servicability agent should work on platforms other than x86, sparc
bpittore
parents: 5547
diff changeset
   453
#endif