changeset 12857:cc42cd3f45d0 tip

Revert to main OpenJDK repository
author Greg Lewis <glewis@eyesbeyond.com>
date Sat, 07 Oct 2017 16:42:07 -0700
parents 5585f972ef1d
children
files make/mapfiles/libsaproc/mapfile-bsd src/jdk.hotspot.agent/bsd/native/libsaproc/BsdDebuggerLocal.c src/jdk.hotspot.agent/bsd/native/libsaproc/StubDebuggerLocal.c src/jdk.hotspot.agent/bsd/native/libsaproc/elfmacros.h src/jdk.hotspot.agent/bsd/native/libsaproc/libproc.h src/jdk.hotspot.agent/bsd/native/libsaproc/libproc_impl.c src/jdk.hotspot.agent/bsd/native/libsaproc/libproc_impl.h src/jdk.hotspot.agent/bsd/native/libsaproc/ps_core.c src/jdk.hotspot.agent/bsd/native/libsaproc/ps_proc.c src/jdk.hotspot.agent/bsd/native/libsaproc/salibelf.c src/jdk.hotspot.agent/bsd/native/libsaproc/salibelf.h src/jdk.hotspot.agent/bsd/native/libsaproc/symtab.c src/jdk.hotspot.agent/bsd/native/libsaproc/symtab.h src/jdk.hotspot.agent/bsd/native/libsaproc/test.c src/os/bsd/vm/decoder_bsd.cpp
diffstat 15 files changed, 0 insertions(+), 4323 deletions(-) [+]
line wrap: on
line diff
--- a/make/mapfiles/libsaproc/mapfile-bsd	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#
-
-#
-# Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#  
-#
-
-# Define public interface.
-
-SUNWprivate_1.1 {
-        global:
-
-		# native methods of BsdDebuggerLocal class
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0;
-		Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0;
-	
-		# proc_service.h functions - to be used by libthread_db
-		ps_getpid;
-		ps_pglobal_lookup;
-		ps_pread;
-		ps_pwrite;
-		ps_lsetfpregs;
-		ps_lsetregs;
-		ps_lgetfpregs;
-		ps_lgetregs;
-		ps_lcontinue;
-		ps_lgetxmmregs;
-		ps_lsetxmmregs;
-		ps_lstop;
-		ps_linfo;
-
-                # used by attach test program
-                init_libproc;
-                Pgrab;
-                Pgrab_core;
-                Prelease;
-	
-	local:
-		*;
-};
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/BsdDebuggerLocal.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-#include "libproc.h"
-
-#if defined(x86_64) && !defined(amd64)
-#define amd64 1
-#endif
-
-#ifdef i386
-#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
-#endif
-
-#ifdef amd64
-#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
-#endif
-
-#if defined(sparc) || defined(sparcv9)
-#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
-#endif
-
-static jfieldID p_ps_prochandle_ID = 0;
-static jfieldID threadList_ID = 0;
-static jfieldID loadObjectList_ID = 0;
-
-static jmethodID createClosestSymbol_ID = 0;
-static jmethodID createLoadObject_ID = 0;
-static jmethodID getThreadForThreadId_ID = 0;
-static jmethodID listAdd_ID = 0;
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
-  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
-  jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
-  return (struct ps_prochandle*)(intptr_t)ptr;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
-  (JNIEnv *env, jclass cls) {
-  jclass listClass;
-
-  if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
-     THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
-  }
-
-  // fields we use
-  p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
-  CHECK_EXCEPTION;
-  threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
-  CHECK_EXCEPTION;
-  loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
-  CHECK_EXCEPTION;
-
-  // methods we use
-  createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
-                    "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
-  CHECK_EXCEPTION;
-  createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
-                    "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
-  CHECK_EXCEPTION;
-  getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
-                                                     "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
-  CHECK_EXCEPTION;
-  // java.util.List method we call
-  listClass = (*env)->FindClass(env, "java/util/List");
-  CHECK_EXCEPTION;
-  listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
-  CHECK_EXCEPTION;
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
-  (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-
-static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
-  int n = 0, i = 0;
-
-  // add threads
-  n = get_num_threads(ph);
-  for (i = 0; i < n; i++) {
-    jobject thread;
-    jobject threadList;
-    lwpid_t lwpid;
-
-    lwpid = get_lwp_id(ph, i);
-    thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
-                                      (jlong)lwpid);
-    CHECK_EXCEPTION;
-    threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
-    CHECK_EXCEPTION;
-    (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
-    CHECK_EXCEPTION;
-  }
-
-  // add load objects
-  n = get_num_libs(ph);
-  for (i = 0; i < n; i++) {
-     uintptr_t base;
-     const char* name;
-     jobject loadObject;
-     jobject loadObjectList;
-
-     base = get_lib_base(ph, i);
-     name = get_lib_name(ph, i);
-     loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
-                                   (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
-     CHECK_EXCEPTION;
-     loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
-     CHECK_EXCEPTION;
-     (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
-     CHECK_EXCEPTION;
-  }
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
-  (JNIEnv *env, jobject this_obj, jint jpid) {
-
-  struct ps_prochandle* ph;
-  if ( (ph = Pgrab(jpid)) == NULL) {
-    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
-  }
-  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
-  fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
-  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
-  const char *execName_cstr;
-  const char *coreName_cstr;
-  jboolean isCopy;
-  struct ps_prochandle* ph;
-
-  execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
-  CHECK_EXCEPTION;
-  coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
-  CHECK_EXCEPTION;
-
-  if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
-    (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
-    (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
-    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
-  }
-  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
-  (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
-  (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
-  fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
-  (JNIEnv *env, jobject this_obj) {
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  if (ph != NULL) {
-     Prelease(ph);
-  }
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
-  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
-  const char *objectName_cstr, *symbolName_cstr;
-  jlong addr;
-  jboolean isCopy;
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-
-  objectName_cstr = NULL;
-  if (objectName != NULL) {
-    objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
-    CHECK_EXCEPTION_(0);
-  }
-  symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
-  CHECK_EXCEPTION_(0);
-
-  addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
-
-  if (objectName_cstr != NULL) {
-    (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
-  }
-  (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
-  return addr;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
-  (JNIEnv *env, jobject this_obj, jlong addr) {
-  uintptr_t offset;
-  const char* sym = NULL;
-
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
-  if (sym == NULL) return 0;
-  return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
-                          (*env)->NewStringUTF(env, sym), (jlong)offset);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
-  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
-
-  jboolean isCopy;
-  jbyteArray array;
-  jbyte *bufPtr;
-  ps_err_e err;
-
-  array = (*env)->NewByteArray(env, numBytes);
-  CHECK_EXCEPTION_(0);
-  bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
-  CHECK_EXCEPTION_(0);
-
-  err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
-  (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
-  return (err == PS_OK)? array : 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
-  (JNIEnv *env, jobject this_obj, jint lwp_id) {
-
-  struct reg gregs;
-  jboolean isCopy;
-  jlongArray array;
-  jlong *regs;
-
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
-     THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
-  }
-
-#undef NPRGREG
-#ifdef i386
-#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
-#endif
-#ifdef ia64
-#define NPRGREG IA64_REG_COUNT
-#endif
-#ifdef amd64
-#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
-#endif
-#if defined(sparc) || defined(sparcv9)
-#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
-#endif
-
-  array = (*env)->NewLongArray(env, NPRGREG);
-  CHECK_EXCEPTION_(0);
-  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
-
-#undef REG_INDEX
-
-#ifdef i386
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
-
-  regs[REG_INDEX(GS)]  = (uintptr_t) gregs.r_gs;
-  regs[REG_INDEX(FS)]  = (uintptr_t) gregs.r_fs;
-  regs[REG_INDEX(ES)]  = (uintptr_t) gregs.r_es;
-  regs[REG_INDEX(DS)]  = (uintptr_t) gregs.r_ds;
-  regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi;
-  regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi;
-  regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp;
-  regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp;
-  regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx;
-  regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx;
-  regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx;
-  regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax;
-  regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip;
-  regs[REG_INDEX(CS)]  = (uintptr_t) gregs.r_cs;
-  regs[REG_INDEX(SS)]  = (uintptr_t) gregs.r_ss;
-
-#endif /* i386 */
-
-#if ia64
-  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
-  int i;
-  for (i = 0; i < NPRGREG; i++ ) {
-    regs[i] = 0xDEADDEAD;
-  }
-#endif /* ia64 */
-
-#ifdef amd64
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
-
-  regs[REG_INDEX(R15)] = gregs.r_r15;
-  regs[REG_INDEX(R14)] = gregs.r_r14;
-  regs[REG_INDEX(R13)] = gregs.r_r13;
-  regs[REG_INDEX(R12)] = gregs.r_r12;
-  regs[REG_INDEX(RBP)] = gregs.r_rbp;
-  regs[REG_INDEX(RBX)] = gregs.r_rbx;
-  regs[REG_INDEX(R11)] = gregs.r_r11;
-  regs[REG_INDEX(R10)] = gregs.r_r10;
-  regs[REG_INDEX(R9)] = gregs.r_r9;
-  regs[REG_INDEX(R8)] = gregs.r_r8;
-  regs[REG_INDEX(RAX)] = gregs.r_rax;
-  regs[REG_INDEX(RCX)] = gregs.r_rcx;
-  regs[REG_INDEX(RDX)] = gregs.r_rdx;
-  regs[REG_INDEX(RSI)] = gregs.r_rsi;
-  regs[REG_INDEX(RDI)] = gregs.r_rdi;
-  regs[REG_INDEX(RIP)] = gregs.r_rip;
-  regs[REG_INDEX(CS)] = gregs.r_cs;
-  regs[REG_INDEX(RSP)] = gregs.r_rsp;
-  regs[REG_INDEX(SS)] = gregs.r_ss;
-//  regs[REG_INDEX(FSBASE)] = gregs.fs_base;
-//  regs[REG_INDEX(GSBASE)] = gregs.gs_base;
-//  regs[REG_INDEX(DS)] = gregs.ds;
-//  regs[REG_INDEX(ES)] = gregs.es;
-//  regs[REG_INDEX(FS)] = gregs.fs;
-//  regs[REG_INDEX(GS)] = gregs.gs;
-
-#endif /* amd64 */
-
-#if defined(sparc) || defined(sparcv9)
-
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
-
-#ifdef _LP64
-  regs[REG_INDEX(R_PSR)] = gregs.tstate;
-  regs[REG_INDEX(R_PC)]  = gregs.tpc;
-  regs[REG_INDEX(R_nPC)] = gregs.tnpc;
-  regs[REG_INDEX(R_Y)]   = gregs.y;
-#else
-  regs[REG_INDEX(R_PSR)] = gregs.psr;
-  regs[REG_INDEX(R_PC)]  = gregs.pc;
-  regs[REG_INDEX(R_nPC)] = gregs.npc;
-  regs[REG_INDEX(R_Y)]   = gregs.y;
-#endif
-  regs[REG_INDEX(R_G0)]  =            0 ;
-  regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
-  regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
-  regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
-  regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
-  regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
-  regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
-  regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
-  regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
-  regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
-  regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
-  regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
-  regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
-  regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
-  regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
-  regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
-#endif /* sparc */
-
-
-  (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
-  return array;
-}
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/StubDebuggerLocal.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
-  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
-  (JNIEnv *env, jclass cls) {
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
-  (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
-  (JNIEnv *env, jobject this_obj, jint jpid) {
-
-  THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
-  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
-  THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
-  (JNIEnv *env, jobject this_obj) {
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
-  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
-  return 0;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
-  (JNIEnv *env, jobject this_obj, jlong addr) {
-  return 0;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
-  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
-  return 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
-  (JNIEnv *env, jobject this_obj, jint lwp_id) {
-  return 0;
-}
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/elfmacros.h	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _ELFMACROS_H_
-#define _ELFMACROS_H_
-
-#define ELF_NHDR        Elf_Note
-
-#if defined(_LP64)
-#define ELF_EHDR        Elf64_Ehdr
-#define ELF_SHDR        Elf64_Shdr
-#define ELF_PHDR        Elf64_Phdr
-#define ELF_SYM         Elf64_Sym
-#define ELF_DYN         Elf64_Dyn
-#define ELF_ADDR        Elf64_Addr
-
-#ifndef ELF_ST_TYPE
-#define ELF_ST_TYPE     ELF64_ST_TYPE
-#endif
-
-#else
-
-#define ELF_EHDR        Elf32_Ehdr
-#define ELF_SHDR        Elf32_Shdr
-#define ELF_PHDR        Elf32_Phdr
-#define ELF_SYM         Elf32_Sym
-#define ELF_DYN         Elf32_Dyn
-#define ELF_ADDR        Elf32_Addr
-
-#ifndef ELF_ST_TYPE
-#define ELF_ST_TYPE     ELF32_ST_TYPE
-#endif
-
-#endif
-
-
-#endif /* _ELFMACROS_H_ */
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/libproc.h	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _LIBPROC_H_
-#define _LIBPROC_H_
-
-#include <unistd.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-
-#ifdef __APPLE__
-typedef enum ps_err_e {
-  PS_OK, PS_ERR, PS_BADPID, PS_BADLID,
-  PS_BADADDR, PS_NOSYM, PS_NOFREGS
-} ps_err_e;
-
-#ifndef psaddr_t
-#define psaddr_t uintptr_t
-#endif
-
-#ifndef bool
-typedef int bool;
-#define true  1
-#define false 0
-#endif  // bool
-
-#ifndef lwpid_t
-#define lwpid_t uintptr_t
-#endif
-
-#include <mach/thread_status.h>
-#else   // __APPLE__
-#include <elf.h>
-#include <link.h>
-#include <machine/reg.h>
-#include <proc_service.h>
-#if defined(sparc) || defined(sparcv9)
-/*
-  If _LP64 is defined ptrace.h should be taken from /usr/include/asm-sparc64
-  otherwise it should be from /usr/include/asm-sparc
-  These two files define pt_regs structure differently
-*/
-#ifdef _LP64
-#include "asm-sparc64/ptrace.h"
-#else
-#include "asm-sparc/ptrace.h"
-#endif
-
-#endif //sparc or sparcv9
-
-// This C bool type must be int for compatibility with BSD calls and
-// it would be a mistake to equivalence it to C++ bool on many platforms
-typedef int bool;
-#define true  1
-#define false 0
-
-#endif // __APPLE__
-
-/************************************************************************************
-
-0. This is very minimal subset of Solaris libproc just enough for current application.
-Please note that the bulk of the functionality is from proc_service interface. This
-adds Pgrab__ and some missing stuff. We hide the difference b/w live process and core
-file by this interface.
-
-1. pthread_id is unique. We store this in OSThread::_pthread_id in JVM code.
-
-2. All threads see the same pid when they call getpid().
-We used to save the result of ::getpid() call in OSThread::_thread_id.
-Because gettid returns actual pid of thread (lwp id), this is
-unique again. We therefore use OSThread::_thread_id as unique identifier.
-
-3. There is a unique LWP id under both thread libraries. libthread_db  maps pthread_id
-to its underlying lwp_id under both the thread libraries. thread_info.lwp_id stores
-lwp_id of the thread. The lwp id is nothing but the actual pid of clone'd processes. But
-unfortunately libthread_db does not work very well for core dumps. So, we get pthread_id
-only for processes. For core dumps, we don't use libthread_db at all (like gdb).
-
-4. ptrace operates on this LWP id under both the thread libraries. When we say 'pid' for
-ptrace call, we refer to lwp_id of the thread.
-
-5. for core file, we parse ELF files and read data from them. For processes we  use
-combination of ptrace and /proc calls.
-
-*************************************************************************************/
-
-struct reg;
-struct ps_prochandle;
-
-// attach to a process
-struct ps_prochandle* Pgrab(pid_t pid);
-
-// attach to a core dump
-struct ps_prochandle* Pgrab_core(const char* execfile, const char* corefile);
-
-// release a process or core
-void Prelease(struct ps_prochandle* ph);
-
-// functions not directly available in Solaris libproc
-
-// initialize libproc (call this only once per app)
-// pass true to make library verbose
-bool init_libproc(bool verbose);
-
-// get number of threads
-int get_num_threads(struct ps_prochandle* ph);
-
-// get lwp_id of n'th thread
-lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
-
-// get regs for a given lwp
-bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct reg* regs);
-
-// get number of shared objects
-int get_num_libs(struct ps_prochandle* ph);
-
-// get name of n'th lib
-const char* get_lib_name(struct ps_prochandle* ph, int index);
-
-// get base of lib
-uintptr_t get_lib_base(struct ps_prochandle* ph, int index);
-
-// returns true if given library is found in lib list
-bool find_lib(struct ps_prochandle* ph, const char *lib_name);
-
-// symbol lookup
-uintptr_t lookup_symbol(struct ps_prochandle* ph,  const char* object_name,
-                       const char* sym_name);
-
-// address->nearest symbol lookup. return NULL for no symbol
-const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset);
-
-#endif //__LIBPROC_H_
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/libproc_impl.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,560 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-#include "libproc_impl.h"
-
-static const char* alt_root = NULL;
-static int alt_root_len = -1;
-
-#define SA_ALTROOT "SA_ALTROOT"
-
-off_t ltell(int fd) {
-  return lseek(fd, 0, SEEK_CUR);
-}
-
-static void init_alt_root() {
-  if (alt_root_len == -1) {
-    alt_root = getenv(SA_ALTROOT);
-    if (alt_root) {
-      alt_root_len = strlen(alt_root);
-    } else {
-      alt_root_len = 0;
-    }
-  }
-}
-
-int pathmap_open(const char* name) {
-  int fd;
-  char alt_path[PATH_MAX + 1];
-
-  init_alt_root();
-
-  if (alt_root_len > 0) {
-    strcpy(alt_path, alt_root);
-    strcat(alt_path, name);
-    fd = open(alt_path, O_RDONLY);
-    if (fd >= 0) {
-      print_debug("path %s substituted for %s\n", alt_path, name);
-      return fd;
-    }
-
-    if (strrchr(name, '/')) {
-      strcpy(alt_path, alt_root);
-      strcat(alt_path, strrchr(name, '/'));
-      fd = open(alt_path, O_RDONLY);
-      if (fd >= 0) {
-        print_debug("path %s substituted for %s\n", alt_path, name);
-        return fd;
-      }
-    }
-  } else {
-    fd = open(name, O_RDONLY);
-    if (fd >= 0) {
-      return fd;
-    }
-  }
-  return -1;
-}
-
-static bool _libsaproc_debug;
-
-void print_debug(const char* format,...) {
-  if (_libsaproc_debug) {
-    va_list alist;
-
-    va_start(alist, format);
-    fputs("libsaproc DEBUG: ", stderr);
-    vfprintf(stderr, format, alist);
-    va_end(alist);
-  }
-}
-
-void print_error(const char* format,...) {
-  va_list alist;
-  va_start(alist, format);
-  fputs("ERROR: ", stderr);
-  vfprintf(stderr, format, alist);
-  va_end(alist);
-}
-
-bool is_debug() {
-  return _libsaproc_debug;
-}
-
-#ifdef __APPLE__
-// get arch offset in file
-bool get_arch_off(int fd, cpu_type_t cputype, off_t *offset) {
-  struct fat_header fatheader;
-  struct fat_arch fatarch;
-  off_t img_start = 0;
-
-  off_t pos = ltell(fd);
-  if (read(fd, (void *)&fatheader, sizeof(struct fat_header)) != sizeof(struct fat_header)) {
-    return false;
-  }
-  if (fatheader.magic == FAT_CIGAM) {
-    int i;
-    for (i = 0; i < ntohl(fatheader.nfat_arch); i++) {
-      if (read(fd, (void *)&fatarch, sizeof(struct fat_arch)) != sizeof(struct fat_arch)) {
-        return false;
-      }
-      if (ntohl(fatarch.cputype) == cputype) {
-        print_debug("fat offset=%x\n", ntohl(fatarch.offset));
-        img_start = ntohl(fatarch.offset);
-        break;
-      }
-    }
-    if (img_start == 0) {
-      return false;
-    }
-  }
-  lseek(fd, pos, SEEK_SET);
-  *offset = img_start;
-  return true;
-}
-
-bool is_macho_file(int fd) {
-  mach_header_64 fhdr;
-  off_t x86_64_off;
-
-  if (fd < 0) {
-    print_debug("Invalid file handle passed to is_macho_file\n");
-    return false;
-  }
-
-  off_t pos = ltell(fd);
-  // check fat header
-  if (!get_arch_off(fd, CPU_TYPE_X86_64, &x86_64_off)) {
-    print_debug("failed to get fat header\n");
-    return false;
-  }
-  lseek(fd, x86_64_off, SEEK_SET);
-  if (read(fd, (void *)&fhdr, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
-     return false;
-  }
-  lseek(fd, pos, SEEK_SET);               // restore
-  print_debug("fhdr.magic %x\n", fhdr.magic);
-  return (fhdr.magic == MH_MAGIC_64 || fhdr.magic == MH_CIGAM_64);
-}
-
-#endif //__APPLE__
-
-// initialize libproc
-bool init_libproc(bool debug) {
-   _libsaproc_debug = debug;
-#ifndef __APPLE__
-   // initialize the thread_db library
-   if (td_init() != TD_OK) {
-     print_debug("libthread_db's td_init failed\n");
-     return false;
-   }
-#endif // __APPLE__
-   return true;
-}
-
-void destroy_lib_info(struct ps_prochandle* ph) {
-  lib_info* lib = ph->libs;
-  while (lib) {
-    lib_info* next = lib->next;
-    if (lib->symtab) {
-      destroy_symtab(lib->symtab);
-    }
-    free(lib);
-    lib = next;
-  }
-}
-
-void destroy_thread_info(struct ps_prochandle* ph) {
-  sa_thread_info* thr = ph->threads;
-  while (thr) {
-    sa_thread_info* n = thr->next;
-    free(thr);
-    thr = n;
-  }
-}
-
-// ps_prochandle cleanup
-void Prelease(struct ps_prochandle* ph) {
-  // do the "derived class" clean-up first
-  ph->ops->release(ph);
-  destroy_lib_info(ph);
-  destroy_thread_info(ph);
-  free(ph);
-}
-
-lib_info* add_lib_info(struct ps_prochandle* ph, const char* libname, uintptr_t base) {
-  return add_lib_info_fd(ph, libname, -1, base);
-}
-
-lib_info* add_lib_info_fd(struct ps_prochandle* ph, const char* libname, int fd, uintptr_t base) {
-   lib_info* newlib;
-  print_debug("add_lib_info_fd %s\n", libname);
-
-  if ( (newlib = (lib_info*) calloc(1, sizeof(struct lib_info))) == NULL) {
-    print_debug("can't allocate memory for lib_info\n");
-    return NULL;
-  }
-
-  strncpy(newlib->name, libname, sizeof(newlib->name));
-  newlib->base = base;
-
-  if (fd == -1) {
-    if ( (newlib->fd = pathmap_open(newlib->name)) < 0) {
-      print_debug("can't open shared object %s\n", newlib->name);
-      free(newlib);
-      return NULL;
-    }
-  } else {
-    newlib->fd = fd;
-  }
-
-#ifdef __APPLE__
-  // check whether we have got an Macho file.
-  if (is_macho_file(newlib->fd) == false) {
-    close(newlib->fd);
-    free(newlib);
-    print_debug("not a mach-o file\n");
-    return NULL;
-  }
-#else
-  // check whether we have got an ELF file. /proc/<pid>/map
-  // gives out all file mappings and not just shared objects
-  if (is_elf_file(newlib->fd) == false) {
-    close(newlib->fd);
-    free(newlib);
-    return NULL;
-  }
-#endif // __APPLE__
-
-  newlib->symtab = build_symtab(newlib->fd);
-  if (newlib->symtab == NULL) {
-    print_debug("symbol table build failed for %s\n", newlib->name);
-  } else {
-    print_debug("built symbol table for %s\n", newlib->name);
-  }
-
-  // even if symbol table building fails, we add the lib_info.
-  // This is because we may need to read from the ELF file or MachO file for core file
-  // address read functionality. lookup_symbol checks for NULL symtab.
-  if (ph->libs) {
-    ph->lib_tail->next = newlib;
-    ph->lib_tail = newlib;
-  }  else {
-    ph->libs = ph->lib_tail = newlib;
-  }
-  ph->num_libs++;
-  return newlib;
-}
-
-// lookup for a specific symbol
-uintptr_t lookup_symbol(struct ps_prochandle* ph,  const char* object_name,
-                       const char* sym_name) {
-  // ignore object_name. search in all libraries
-  // FIXME: what should we do with object_name?? The library names are obtained
-  // by parsing /proc/<pid>/maps, which may not be the same as object_name.
-  // What we need is a utility to map object_name to real file name, something
-  // dlopen() does by looking at LD_LIBRARY_PATH and /etc/ld.so.cache. For
-  // now, we just ignore object_name and do a global search for the symbol.
-
-  lib_info* lib = ph->libs;
-  while (lib) {
-    if (lib->symtab) {
-      uintptr_t res = search_symbol(lib->symtab, lib->base, sym_name, NULL);
-      if (res) return res;
-    }
-    lib = lib->next;
-  }
-
-  print_debug("lookup failed for symbol '%s' in obj '%s'\n",
-                          sym_name, object_name);
-  return (uintptr_t) NULL;
-}
-
-const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset) {
-  const char* res = NULL;
-  lib_info* lib = ph->libs;
-  while (lib) {
-    if (lib->symtab && addr >= lib->base) {
-      res = nearest_symbol(lib->symtab, addr - lib->base, poffset);
-      if (res) return res;
-    }
-    lib = lib->next;
-  }
-  return NULL;
-}
-
-// add a thread to ps_prochandle
-sa_thread_info* add_thread_info(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
-  sa_thread_info* newthr;
-  if ( (newthr = (sa_thread_info*) calloc(1, sizeof(sa_thread_info))) == NULL) {
-    print_debug("can't allocate memory for thread_info\n");
-    return NULL;
-  }
-
-  // initialize thread info
-  newthr->pthread_id = pthread_id;
-  newthr->lwp_id = lwp_id;
-
-  // add new thread to the list
-  newthr->next = ph->threads;
-  ph->threads = newthr;
-  ph->num_threads++;
-  return newthr;
-}
-
-#ifndef __APPLE__
-// struct used for client data from thread_db callback
-struct thread_db_client_data {
-  struct ps_prochandle* ph;
-  thread_info_callback callback;
-};
-
-// callback function for libthread_db
-static int thread_db_callback(const td_thrhandle_t *th_p, void *data) {
-  struct thread_db_client_data* ptr = (struct thread_db_client_data*) data;
-  td_thrinfo_t ti;
-  td_err_e err;
-
-  memset(&ti, 0, sizeof(ti));
-  err = td_thr_get_info(th_p, &ti);
-  if (err != TD_OK) {
-    print_debug("libthread_db : td_thr_get_info failed, can't get thread info\n");
-    return err;
-  }
-
-  print_debug("thread_db : pthread %d (lwp %d)\n", ti.ti_tid, ti.ti_lid);
-
-  if (ptr->callback(ptr->ph, (pthread_t)ti.ti_tid, ti.ti_lid) != true)
-    return TD_ERR;
-
-  return TD_OK;
-}
-
-// read thread_info using libthread_db
-bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb) {
-  struct thread_db_client_data mydata;
-  td_thragent_t* thread_agent = NULL;
-  if (td_ta_new(ph, &thread_agent) != TD_OK) {
-     print_debug("can't create libthread_db agent\n");
-     return false;
-  }
-
-  mydata.ph = ph;
-  mydata.callback = cb;
-
-  // we use libthread_db iterator to iterate thru list of threads.
-  if (td_ta_thr_iter(thread_agent, thread_db_callback, &mydata,
-                 TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
-                 TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS) != TD_OK) {
-     td_ta_delete(thread_agent);
-     return false;
-  }
-
-  // delete thread agent
-  td_ta_delete(thread_agent);
-  return true;
-}
-
-#endif // __APPLE__
-
-// get number of threads
-int get_num_threads(struct ps_prochandle* ph) {
-   return ph->num_threads;
-}
-
-// get lwp_id of n'th thread
-lwpid_t get_lwp_id(struct ps_prochandle* ph, int index) {
-  int count = 0;
-  sa_thread_info* thr = ph->threads;
-  while (thr) {
-    if (count == index) {
-      return thr->lwp_id;
-    }
-    count++;
-    thr = thr->next;
-  }
-  return 0;
-}
-
-#ifdef __APPLE__
-// set lwp_id of n'th thread
-bool set_lwp_id(struct ps_prochandle* ph, int index, lwpid_t lwpid) {
-  int count = 0;
-  sa_thread_info* thr = ph->threads;
-  while (thr) {
-    if (count == index) {
-      thr->lwp_id = lwpid;
-      return true;
-    }
-    count++;
-    thr = thr->next;
-  }
-  return false;
-}
-
-// get regs of n-th thread, only used in fillThreads the first time called
-bool get_nth_lwp_regs(struct ps_prochandle* ph, int index, struct reg* regs) {
-  int count = 0;
-  sa_thread_info* thr = ph->threads;
-  while (thr) {
-    if (count == index) {
-      break;
-    }
-    count++;
-    thr = thr->next;
-  }
-  if (thr != NULL) {
-    memcpy(regs, &thr->regs, sizeof(struct reg));
-    return true;
-  }
-  return false;
-}
-
-#endif // __APPLE__
-
-// get regs for a given lwp
-bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs) {
-  return ph->ops->get_lwp_regs(ph, lwp_id, regs);
-}
-
-// get number of shared objects
-int get_num_libs(struct ps_prochandle* ph) {
-  return ph->num_libs;
-}
-
-// get name of n'th solib
-const char* get_lib_name(struct ps_prochandle* ph, int index) {
-  int count = 0;
-  lib_info* lib = ph->libs;
-  while (lib) {
-    if (count == index) {
-      return lib->name;
-    }
-    count++;
-    lib = lib->next;
-  }
-  return NULL;
-}
-
-// get base address of a lib
-uintptr_t get_lib_base(struct ps_prochandle* ph, int index) {
-  int count = 0;
-  lib_info* lib = ph->libs;
-  while (lib) {
-    if (count == index) {
-      return lib->base;
-    }
-    count++;
-    lib = lib->next;
-  }
-  return (uintptr_t)NULL;
-}
-
-bool find_lib(struct ps_prochandle* ph, const char *lib_name) {
-  lib_info *p = ph->libs;
-  while (p) {
-    if (strcmp(p->name, lib_name) == 0) {
-      return true;
-    }
-    p = p->next;
-  }
-  return false;
-}
-
-//--------------------------------------------------------------------------
-// proc service functions
-
-// ps_pglobal_lookup() looks up the symbol sym_name in the symbol table
-// of the load object object_name in the target process identified by ph.
-// It returns the symbol's value as an address in the target process in
-// *sym_addr.
-
-ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name,
-                    const char *sym_name, psaddr_t *sym_addr) {
-  *sym_addr = (psaddr_t) lookup_symbol(ph, object_name, sym_name);
-  return (*sym_addr ? PS_OK : PS_NOSYM);
-}
-
-// read "size" bytes info "buf" from address "addr"
-ps_err_e ps_pread(struct ps_prochandle *ph, psaddr_t  addr,
-                  void *buf, size_t size) {
-  return ph->ops->p_pread(ph, (uintptr_t) addr, buf, size)? PS_OK: PS_ERR;
-}
-
-// write "size" bytes of data to debuggee at address "addr"
-ps_err_e ps_pwrite(struct ps_prochandle *ph, psaddr_t addr,
-                   const void *buf, size_t size) {
-  return ph->ops->p_pwrite(ph, (uintptr_t)addr, buf, size)? PS_OK: PS_ERR;
-}
-
-// fill in ptrace_lwpinfo for lid
-ps_err_e ps_linfo(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-  return ph->ops->get_lwp_info(ph, lwp_id, linfo)? PS_OK: PS_ERR;
-}
-
-// needed for when libthread_db is compiled with TD_DEBUG defined
-void
-ps_plog (const char *format, ...)
-{
-  va_list alist;
-
-  va_start(alist, format);
-  vfprintf(stderr, format, alist);
-  va_end(alist);
-}
-
-#ifndef __APPLE__
-// ------------------------------------------------------------------------
-// Functions below this point are not yet implemented. They are here only
-// to make the linker happy.
-
-ps_err_e ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lid, const prfpregset_t *fpregs) {
-  print_debug("ps_lsetfpregs not implemented\n");
-  return PS_OK;
-}
-
-ps_err_e ps_lsetregs(struct ps_prochandle *ph, lwpid_t lid, const prgregset_t gregset) {
-  print_debug("ps_lsetregs not implemented\n");
-  return PS_OK;
-}
-
-ps_err_e  ps_lgetfpregs(struct  ps_prochandle  *ph,  lwpid_t lid, prfpregset_t *fpregs) {
-  print_debug("ps_lgetfpregs not implemented\n");
-  return PS_OK;
-}
-
-ps_err_e ps_lgetregs(struct ps_prochandle *ph, lwpid_t lid, prgregset_t gregset) {
-  print_debug("ps_lgetfpregs not implemented\n");
-  return PS_OK;
-}
-
-ps_err_e ps_lstop(struct ps_prochandle *ph, lwpid_t lid) {
-  print_debug("ps_lstop not implemented\n");
-  return PS_OK;
-}
-
-ps_err_e ps_pcontinue(struct ps_prochandle *ph) {
-  print_debug("ps_pcontinue not implemented\n");
-  return PS_OK;
-}
-#endif // __APPLE__
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/libproc_impl.h	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _LIBPROC_IMPL_H_
-#define _LIBPROC_IMPL_H_
-
-#include <unistd.h>
-#include <limits.h>
-#include "libproc.h"
-#include "symtab.h"
-
-#ifdef __APPLE__
-#include <inttypes.h>     // for PRIx64, 32, ...
-#include <pthread.h>
-#include <mach-o/loader.h>
-#include <mach-o/nlist.h>
-#include <mach-o/fat.h>
-
-#ifndef register_t
-#define register_t uint64_t
-#endif
-
-/*** registers copied from bsd/amd64 */
-typedef struct reg {
-  register_t      r_r15;
-  register_t      r_r14;
-  register_t      r_r13;
-  register_t      r_r12;
-  register_t      r_r11;
-  register_t      r_r10;
-  register_t      r_r9;
-  register_t      r_r8;
-  register_t      r_rdi;
-  register_t      r_rsi;
-  register_t      r_rbp;
-  register_t      r_rbx;
-  register_t      r_rdx;
-  register_t      r_rcx;
-  register_t      r_rax;
-  uint32_t        r_trapno;      // not used
-  uint16_t        r_fs;
-  uint16_t        r_gs;
-  uint32_t        r_err;         // not used
-  uint16_t        r_es;          // not used
-  uint16_t        r_ds;          // not used
-  register_t      r_rip;
-  register_t      r_cs;
-  register_t      r_rflags;
-  register_t      r_rsp;
-  register_t      r_ss;          // not used
-} reg;
-
-// convenient defs
-typedef struct mach_header_64 mach_header_64;
-typedef struct load_command load_command;
-typedef struct segment_command_64 segment_command_64;
-typedef struct thread_command thread_command;
-typedef struct dylib_command dylib_command;
-typedef struct symtab_command symtab_command;
-typedef struct nlist_64 nlist_64;
-#else
-#include <thread_db.h>
-#include "salibelf.h"
-#endif //  __APPLE__
-
-// data structures in this file mimic those of Solaris 8.0 - libproc's Pcontrol.h
-
-#define BUF_SIZE     (PATH_MAX + NAME_MAX + 1)
-
-// list of shared objects
-typedef struct lib_info {
-  char             name[BUF_SIZE];
-  uintptr_t        base;
-  struct symtab*   symtab;
-  int              fd;        // file descriptor for lib
-  struct lib_info* next;
-} lib_info;
-
-// list of threads
-typedef struct sa_thread_info {
-   lwpid_t                  lwp_id;     // same as pthread_t
-   pthread_t                pthread_id; //
-   struct reg               regs;       // not for process, core uses for caching regset
-   struct sa_thread_info*   next;
-} sa_thread_info;
-
-// list of virtual memory maps
-typedef struct map_info {
-   int              fd;       // file descriptor
-   off_t            offset;   // file offset of this mapping
-   uintptr_t        vaddr;    // starting virtual address
-   size_t           memsz;    // size of the mapping
-   struct map_info* next;
-} map_info;
-
-// vtable for ps_prochandle
-typedef struct ps_prochandle_ops {
-   // "derived class" clean-up
-   void (*release)(struct ps_prochandle* ph);
-   // read from debuggee
-   bool (*p_pread)(struct ps_prochandle *ph,
-            uintptr_t addr, char *buf, size_t size);
-   // write into debuggee
-   bool (*p_pwrite)(struct ps_prochandle *ph,
-            uintptr_t addr, const char *buf , size_t size);
-   // get integer regset of a thread
-   bool (*get_lwp_regs)(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs);
-   // get info on thread
-   bool (*get_lwp_info)(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo);
-} ps_prochandle_ops;
-
-// the ps_prochandle
-
-struct core_data {
-   int                core_fd;   // file descriptor of core file
-   int                exec_fd;   // file descriptor of exec file
-   int                interp_fd; // file descriptor of interpreter (ld-elf.so.1)
-   // part of the class sharing workaround
-   int                classes_jsa_fd; // file descriptor of class share archive
-   uintptr_t          dynamic_addr;  // address of dynamic section of a.out
-   uintptr_t          ld_base_addr;  // base address of ld.so
-   size_t             num_maps;  // number of maps.
-   map_info*          maps;      // maps in a linked list
-   // part of the class sharing workaround
-   map_info*          class_share_maps;// class share maps in a linked list
-   map_info**         map_array; // sorted (by vaddr) array of map_info pointers
-   char               exec_path[4096];  // file name java
-};
-
-struct ps_prochandle {
-   ps_prochandle_ops* ops;       // vtable ptr
-   pid_t              pid;
-   int                num_libs;
-   lib_info*          libs;      // head of lib list
-   lib_info*          lib_tail;  // tail of lib list - to append at the end
-   int                num_threads;
-   sa_thread_info*    threads;   // head of thread list
-   struct core_data*  core;      // data only used for core dumps, NULL for process
-};
-
-int pathmap_open(const char* name);
-void print_debug(const char* format,...);
-void print_error(const char* format,...);
-bool is_debug();
-
-typedef bool (*thread_info_callback)(struct ps_prochandle* ph, pthread_t pid, lwpid_t lwpid);
-
-// reads thread info using libthread_db and calls above callback for each thread
-bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb);
-
-// adds a new shared object to lib list, returns NULL on failure
-lib_info* add_lib_info(struct ps_prochandle* ph, const char* libname, uintptr_t base);
-
-// adds a new shared object to lib list, supply open lib file descriptor as well
-lib_info* add_lib_info_fd(struct ps_prochandle* ph, const char* libname, int fd,
-                          uintptr_t base);
-
-sa_thread_info* add_thread_info(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id);
-// a test for ELF signature without using libelf
-
-#ifdef __APPLE__
-// a test for Mach-O signature
-bool is_macho_file(int fd);
-// skip fat head to get image start offset of cpu_type_t
-// return false if any error happens, else value in offset.
-bool get_arch_off(int fd, cpu_type_t cputype, off_t *offset);
-#else
-bool is_elf_file(int fd);
-#endif // __APPLE__
-
-lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
-bool set_lwp_id(struct ps_prochandle* ph, int index, lwpid_t lwpid);
-bool get_nth_lwp_regs(struct ps_prochandle* ph, int index, struct reg* regs);
-
-// ps_pglobal_lookup() looks up the symbol sym_name in the symbol table
-// of the load object object_name in the target process identified by ph.
-// It returns the symbol's value as an address in the target process in
-// *sym_addr.
-
-ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name,
-                    const char *sym_name, psaddr_t *sym_addr);
-
-// read "size" bytes info "buf" from address "addr"
-ps_err_e ps_pread(struct ps_prochandle *ph, psaddr_t  addr,
-                  void *buf, size_t size);
-
-// write "size" bytes of data to debuggee at address "addr"
-ps_err_e ps_pwrite(struct ps_prochandle *ph, psaddr_t addr,
-                   const void *buf, size_t size);
-
-// fill in ptrace_lwpinfo for lid
-ps_err_e ps_linfo(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo);
-
-// needed for when libthread_db is compiled with TD_DEBUG defined
-void ps_plog (const char *format, ...);
-
-// untility, tells the position in file
-off_t ltell(int fd);
-#endif //_LIBPROC_IMPL_H_
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/ps_core.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1524 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <jni.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include "libproc_impl.h"
-
-#ifdef __APPLE__
-#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
-#endif
-
-// This file has the libproc implementation to read core files.
-// For live processes, refer to ps_proc.c. Portions of this is adapted
-// /modelled after Solaris libproc.so (in particular Pcore.c)
-
-//----------------------------------------------------------------------
-// ps_prochandle cleanup helper functions
-
-// close all file descriptors
-static void close_files(struct ps_prochandle* ph) {
-  lib_info* lib = NULL;
-
-  // close core file descriptor
-  if (ph->core->core_fd >= 0)
-    close(ph->core->core_fd);
-
-  // close exec file descriptor
-  if (ph->core->exec_fd >= 0)
-    close(ph->core->exec_fd);
-
-  // close interp file descriptor
-  if (ph->core->interp_fd >= 0)
-    close(ph->core->interp_fd);
-
-  // close class share archive file
-  if (ph->core->classes_jsa_fd >= 0)
-    close(ph->core->classes_jsa_fd);
-
-  // close all library file descriptors
-  lib = ph->libs;
-  while (lib) {
-    int fd = lib->fd;
-    if (fd >= 0 && fd != ph->core->exec_fd) {
-      close(fd);
-    }
-    lib = lib->next;
-  }
-}
-
-// clean all map_info stuff
-static void destroy_map_info(struct ps_prochandle* ph) {
-  map_info* map = ph->core->maps;
-  while (map) {
-    map_info* next = map->next;
-    free(map);
-    map = next;
-  }
-
-  if (ph->core->map_array) {
-    free(ph->core->map_array);
-  }
-
-  // Part of the class sharing workaround
-  map = ph->core->class_share_maps;
-  while (map) {
-    map_info* next = map->next;
-    free(map);
-    map = next;
-  }
-}
-
-// ps_prochandle operations
-static void core_release(struct ps_prochandle* ph) {
-  if (ph->core) {
-    close_files(ph);
-    destroy_map_info(ph);
-    free(ph->core);
-  }
-}
-
-static map_info* allocate_init_map(int fd, off_t offset, uintptr_t vaddr, size_t memsz) {
-  map_info* map;
-  if ( (map = (map_info*) calloc(1, sizeof(map_info))) == NULL) {
-    print_debug("can't allocate memory for map_info\n");
-    return NULL;
-  }
-
-  // initialize map
-  map->fd     = fd;
-  map->offset = offset;
-  map->vaddr  = vaddr;
-  map->memsz  = memsz;
-  return map;
-}
-
-// add map info with given fd, offset, vaddr and memsz
-static map_info* add_map_info(struct ps_prochandle* ph, int fd, off_t offset,
-                             uintptr_t vaddr, size_t memsz) {
-  map_info* map;
-  if ((map = allocate_init_map(fd, offset, vaddr, memsz)) == NULL) {
-    return NULL;
-  }
-
-  // add this to map list
-  map->next  = ph->core->maps;
-  ph->core->maps   = map;
-  ph->core->num_maps++;
-
-  return map;
-}
-
-// Part of the class sharing workaround
-static map_info* add_class_share_map_info(struct ps_prochandle* ph, off_t offset,
-                             uintptr_t vaddr, size_t memsz) {
-  map_info* map;
-  if ((map = allocate_init_map(ph->core->classes_jsa_fd,
-                               offset, vaddr, memsz)) == NULL) {
-    return NULL;
-  }
-
-  map->next = ph->core->class_share_maps;
-  ph->core->class_share_maps = map;
-  return map;
-}
-
-// Return the map_info for the given virtual address.  We keep a sorted
-// array of pointers in ph->map_array, so we can binary search.
-static map_info* core_lookup(struct ps_prochandle *ph, uintptr_t addr) {
-  int mid, lo = 0, hi = ph->core->num_maps - 1;
-  map_info *mp;
-
-  while (hi - lo > 1) {
-    mid = (lo + hi) / 2;
-    if (addr >= ph->core->map_array[mid]->vaddr) {
-      lo = mid;
-    } else {
-      hi = mid;
-    }
-  }
-
-  if (addr < ph->core->map_array[hi]->vaddr) {
-    mp = ph->core->map_array[lo];
-  } else {
-    mp = ph->core->map_array[hi];
-  }
-
-  if (addr >= mp->vaddr && addr < mp->vaddr + mp->memsz) {
-    return (mp);
-  }
-
-
-  // Part of the class sharing workaround
-  // Unfortunately, we have no way of detecting -Xshare state.
-  // Check out the share maps atlast, if we don't find anywhere.
-  // This is done this way so to avoid reading share pages
-  // ahead of other normal maps. For eg. with -Xshare:off we don't
-  // want to prefer class sharing data to data from core.
-  mp = ph->core->class_share_maps;
-  if (mp) {
-    print_debug("can't locate map_info at 0x%lx, trying class share maps\n", addr);
-  }
-  while (mp) {
-    if (addr >= mp->vaddr && addr < mp->vaddr + mp->memsz) {
-      print_debug("located map_info at 0x%lx from class share maps\n", addr);
-      return (mp);
-    }
-    mp = mp->next;
-  }
-
-  print_debug("can't locate map_info at 0x%lx\n", addr);
-  return (NULL);
-}
-
-//---------------------------------------------------------------
-// Part of the class sharing workaround:
-//
-// With class sharing, pages are mapped from classes.jsa file.
-// The read-only class sharing pages are mapped as MAP_SHARED,
-// PROT_READ pages. These pages are not dumped into core dump.
-// With this workaround, these pages are read from classes.jsa.
-
-// FIXME: !HACK ALERT!
-// The format of sharing achive file header is needed to read shared heap
-// file mappings. For now, I am hard coding portion of FileMapHeader here.
-// Refer to filemap.hpp.
-
-// FileMapHeader describes the shared space data in the file to be
-// mapped.  This structure gets written to a file.  It is not a class,
-// so that the compilers don't add any compiler-private data to it.
-
-#define NUM_SHARED_MAPS 4
-
-// Refer to FileMapInfo::_current_version in filemap.hpp
-#define CURRENT_ARCHIVE_VERSION 1
-
-struct FileMapHeader {
-  int   _magic;              // identify file type.
-  int   _version;            // (from enum, above.)
-  size_t _alignment;         // how shared archive should be aligned
-
-  struct space_info {
-    int    _file_offset;     // sizeof(this) rounded to vm page size
-    char*  _base;            // copy-on-write base address
-    size_t _capacity;        // for validity checking
-    size_t _used;            // for setting space top on read
-
-    // 4991491 NOTICE These are C++ bool's in filemap.hpp and must match up with
-    // the C type matching the C++ bool type on any given platform.
-    // We assume the corresponding C type is char but licensees
-    // may need to adjust the type of these fields.
-    char   _read_only;       // read only space?
-    char   _allow_exec;      // executable code in space?
-
-  } _space[NUM_SHARED_MAPS];
-
-  // Ignore the rest of the FileMapHeader. We don't need those fields here.
-};
-
-static bool read_jboolean(struct ps_prochandle* ph, uintptr_t addr, jboolean* pvalue) {
-  jboolean i;
-  if (ps_pread(ph, (psaddr_t) addr, &i, sizeof(i)) == PS_OK) {
-    *pvalue = i;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-static bool read_pointer(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* pvalue) {
-  uintptr_t uip;
-  if (ps_pread(ph, (psaddr_t) addr, (char *)&uip, sizeof(uip)) == PS_OK) {
-    *pvalue = uip;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-// used to read strings from debuggee
-static bool read_string(struct ps_prochandle* ph, uintptr_t addr, char* buf, size_t size) {
-  size_t i = 0;
-  char  c = ' ';
-
-  while (c != '\0') {
-    if (ps_pread(ph, (psaddr_t) addr, &c, sizeof(char)) != PS_OK) {
-      return false;
-    }
-    if (i < size - 1) {
-      buf[i] = c;
-    } else {
-      // smaller buffer
-      return false;
-    }
-    i++; addr++;
-  }
-  buf[i] = '\0';
-  return true;
-}
-
-#ifdef __APPLE__
-#define USE_SHARED_SPACES_SYM "_UseSharedSpaces"
-// mangled name of Arguments::SharedArchivePath
-#define SHARED_ARCHIVE_PATH_SYM "_ZN9Arguments17SharedArchivePathE"
-#define LIBJVM_NAME "/libjvm.dylib"
-#else
-#define USE_SHARED_SPACES_SYM "UseSharedSpaces"
-// mangled name of Arguments::SharedArchivePath
-#define SHARED_ARCHIVE_PATH_SYM "__ZN9Arguments17SharedArchivePathE"
-#define LIBJVM_NAME "/libjvm.so"
-#endif // __APPLE_
-
-static bool init_classsharing_workaround(struct ps_prochandle* ph) {
-  int m;
-  size_t n;
-  lib_info* lib = ph->libs;
-  while (lib != NULL) {
-    // we are iterating over shared objects from the core dump. look for
-    // libjvm.so.
-    const char *jvm_name = 0;
-    if ((jvm_name = strstr(lib->name, LIBJVM_NAME)) != 0) {
-      char classes_jsa[PATH_MAX];
-      struct FileMapHeader header;
-      int fd = -1;
-      uintptr_t base = 0, useSharedSpacesAddr = 0;
-      uintptr_t sharedArchivePathAddrAddr = 0, sharedArchivePathAddr = 0;
-      jboolean useSharedSpaces = 0;
-
-      memset(classes_jsa, 0, sizeof(classes_jsa));
-      jvm_name = lib->name;
-      useSharedSpacesAddr = lookup_symbol(ph, jvm_name, USE_SHARED_SPACES_SYM);
-      if (useSharedSpacesAddr == 0) {
-        print_debug("can't lookup 'UseSharedSpaces' flag\n");
-        return false;
-      }
-
-      // Hotspot vm types are not exported to build this library. So
-      // using equivalent type jboolean to read the value of
-      // UseSharedSpaces which is same as hotspot type "bool".
-      if (read_jboolean(ph, useSharedSpacesAddr, &useSharedSpaces) != true) {
-        print_debug("can't read the value of 'UseSharedSpaces' flag\n");
-        return false;
-      }
-
-      if ((int)useSharedSpaces == 0) {
-        print_debug("UseSharedSpaces is false, assuming -Xshare:off!\n");
-        return true;
-      }
-
-      sharedArchivePathAddrAddr = lookup_symbol(ph, jvm_name, SHARED_ARCHIVE_PATH_SYM);
-      if (sharedArchivePathAddrAddr == 0) {
-        print_debug("can't lookup shared archive path symbol\n");
-        return false;
-      }
-
-      if (read_pointer(ph, sharedArchivePathAddrAddr, &sharedArchivePathAddr) != true) {
-        print_debug("can't read shared archive path pointer\n");
-        return false;
-      }
-
-      if (read_string(ph, sharedArchivePathAddr, classes_jsa, sizeof(classes_jsa)) != true) {
-        print_debug("can't read shared archive path value\n");
-        return false;
-      }
-
-      print_debug("looking for %s\n", classes_jsa);
-      // open the class sharing archive file
-      fd = pathmap_open(classes_jsa);
-      if (fd < 0) {
-        print_debug("can't open %s!\n", classes_jsa);
-        ph->core->classes_jsa_fd = -1;
-        return false;
-      } else {
-        print_debug("opened %s\n", classes_jsa);
-      }
-
-      // read FileMapHeader from the file
-      memset(&header, 0, sizeof(struct FileMapHeader));
-      if ((n = read(fd, &header, sizeof(struct FileMapHeader)))
-           != sizeof(struct FileMapHeader)) {
-        print_debug("can't read shared archive file map header from %s\n", classes_jsa);
-        close(fd);
-        return false;
-      }
-
-      // check file magic
-      if (header._magic != 0xf00baba2) {
-        print_debug("%s has bad shared archive file magic number 0x%x, expecing 0xf00baba2\n",
-                     classes_jsa, header._magic);
-        close(fd);
-        return false;
-      }
-
-      // check version
-      if (header._version != CURRENT_ARCHIVE_VERSION) {
-        print_debug("%s has wrong shared archive file version %d, expecting %d\n",
-                     classes_jsa, header._version, CURRENT_ARCHIVE_VERSION);
-        close(fd);
-        return false;
-      }
-
-      ph->core->classes_jsa_fd = fd;
-      // add read-only maps from classes.jsa to the list of maps
-      for (m = 0; m < NUM_SHARED_MAPS; m++) {
-        if (header._space[m]._read_only) {
-          base = (uintptr_t) header._space[m]._base;
-          // no need to worry about the fractional pages at-the-end.
-          // possible fractional pages are handled by core_read_data.
-          add_class_share_map_info(ph, (off_t) header._space[m]._file_offset,
-                                   base, (size_t) header._space[m]._used);
-          print_debug("added a share archive map at 0x%lx\n", base);
-        }
-      }
-      return true;
-   }
-   lib = lib->next;
-  }
-  return true;
-}
-
-//---------------------------------------------------------------------------
-// functions to handle map_info
-
-// Order mappings based on virtual address.  We use this function as the
-// callback for sorting the array of map_info pointers.
-static int core_cmp_mapping(const void *lhsp, const void *rhsp)
-{
-  const map_info *lhs = *((const map_info **)lhsp);
-  const map_info *rhs = *((const map_info **)rhsp);
-
-  if (lhs->vaddr == rhs->vaddr) {
-    return (0);
-  }
-
-  return (lhs->vaddr < rhs->vaddr ? -1 : 1);
-}
-
-// we sort map_info by starting virtual address so that we can do
-// binary search to read from an address.
-static bool sort_map_array(struct ps_prochandle* ph) {
-  size_t num_maps = ph->core->num_maps;
-  map_info* map = ph->core->maps;
-  int i = 0;
-
-  // allocate map_array
-  map_info** array;
-  if ( (array = (map_info**) malloc(sizeof(map_info*) * num_maps)) == NULL) {
-    print_debug("can't allocate memory for map array\n");
-    return false;
-  }
-
-  // add maps to array
-  while (map) {
-    array[i] = map;
-    i++;
-    map = map->next;
-  }
-
-  // sort is called twice. If this is second time, clear map array
-  if (ph->core->map_array) {
-    free(ph->core->map_array);
-  }
-  ph->core->map_array = array;
-  // sort the map_info array by base virtual address.
-  qsort(ph->core->map_array, ph->core->num_maps, sizeof (map_info*),
-        core_cmp_mapping);
-
-  // print map
-  if (is_debug()) {
-    int j = 0;
-    print_debug("---- sorted virtual address map ----\n");
-    for (j = 0; j < ph->core->num_maps; j++) {
-      print_debug("base = 0x%lx\tsize = %d\n", ph->core->map_array[j]->vaddr,
-                  ph->core->map_array[j]->memsz);
-    }
-  }
-
-  return true;
-}
-
-#ifndef MIN
-#define MIN(x, y) (((x) < (y))? (x): (y))
-#endif
-
-static bool core_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
-   ssize_t resid = size;
-   int page_size=sysconf(_SC_PAGE_SIZE);
-   while (resid != 0) {
-      map_info *mp = core_lookup(ph, addr);
-      uintptr_t mapoff;
-      ssize_t len, rem;
-      off_t off;
-      int fd;
-
-      if (mp == NULL) {
-         break;  /* No mapping for this address */
-      }
-
-      fd = mp->fd;
-      mapoff = addr - mp->vaddr;
-      len = MIN(resid, mp->memsz - mapoff);
-      off = mp->offset + mapoff;
-
-      if ((len = pread(fd, buf, len, off)) <= 0) {
-         break;
-      }
-
-      resid -= len;
-      addr += len;
-      buf = (char *)buf + len;
-
-      // mappings always start at page boundary. But, may end in fractional
-      // page. fill zeros for possible fractional page at the end of a mapping.
-      rem = mp->memsz % page_size;
-      if (rem > 0) {
-         rem = page_size - rem;
-         len = MIN(resid, rem);
-         resid -= len;
-         addr += len;
-         // we are not assuming 'buf' to be zero initialized.
-         memset(buf, 0, len);
-         buf += len;
-      }
-   }
-
-   if (resid) {
-      print_debug("core read failed for %d byte(s) @ 0x%lx (%d more bytes)\n",
-              size, addr, resid);
-      return false;
-   } else {
-      return true;
-   }
-}
-
-// null implementation for write
-static bool core_write_data(struct ps_prochandle* ph,
-                             uintptr_t addr, const char *buf , size_t size) {
-   return false;
-}
-
-static bool core_get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id,
-                          struct reg* regs) {
-   // for core we have cached the lwp regs after segment parsed
-   sa_thread_info* thr = ph->threads;
-   while (thr) {
-     if (thr->lwp_id == lwp_id) {
-       memcpy(regs, &thr->regs, sizeof(struct reg));
-       return true;
-     }
-     thr = thr->next;
-   }
-   return false;
-}
-
-static bool core_get_lwp_info(struct ps_prochandle *ph, lwpid_t id, void *info) {
-   print_debug("core_get_lwp_info not implemented\n");
-   return false;
-}
-
-static ps_prochandle_ops core_ops = {
-   .release=  core_release,
-   .p_pread=  core_read_data,
-   .p_pwrite= core_write_data,
-   .get_lwp_regs= core_get_lwp_regs,
-   .get_lwp_info= core_get_lwp_info
-};
-
-// from this point, mainly two blocks divided by def __APPLE__
-// one for Macosx, the other for regular Bsd
-
-#ifdef __APPLE__
-
-void print_thread(sa_thread_info *threadinfo) {
-  print_debug("thread added: %d\n", threadinfo->lwp_id);
-  print_debug("registers:\n");
-  print_debug("  r_r15: 0x%" PRIx64 "\n", threadinfo->regs.r_r15);
-  print_debug("  r_r14: 0x%" PRIx64 "\n", threadinfo->regs.r_r14);
-  print_debug("  r_r13: 0x%" PRIx64 "\n", threadinfo->regs.r_r13);
-  print_debug("  r_r12: 0x%" PRIx64 "\n", threadinfo->regs.r_r12);
-  print_debug("  r_r11: 0x%" PRIx64 "\n", threadinfo->regs.r_r11);
-  print_debug("  r_r10: 0x%" PRIx64 "\n", threadinfo->regs.r_r10);
-  print_debug("  r_r9:  0x%" PRIx64 "\n", threadinfo->regs.r_r9);
-  print_debug("  r_r8:  0x%" PRIx64 "\n", threadinfo->regs.r_r8);
-  print_debug("  r_rdi: 0x%" PRIx64 "\n", threadinfo->regs.r_rdi);
-  print_debug("  r_rsi: 0x%" PRIx64 "\n", threadinfo->regs.r_rsi);
-  print_debug("  r_rbp: 0x%" PRIx64 "\n", threadinfo->regs.r_rbp);
-  print_debug("  r_rbx: 0x%" PRIx64 "\n", threadinfo->regs.r_rbx);
-  print_debug("  r_rdx: 0x%" PRIx64 "\n", threadinfo->regs.r_rdx);
-  print_debug("  r_rcx: 0x%" PRIx64 "\n", threadinfo->regs.r_rcx);
-  print_debug("  r_rax: 0x%" PRIx64 "\n", threadinfo->regs.r_rax);
-  print_debug("  r_fs:  0x%" PRIx32 "\n", threadinfo->regs.r_fs);
-  print_debug("  r_gs:  0x%" PRIx32 "\n", threadinfo->regs.r_gs);
-  print_debug("  r_rip  0x%" PRIx64 "\n", threadinfo->regs.r_rip);
-  print_debug("  r_cs:  0x%" PRIx64 "\n", threadinfo->regs.r_cs);
-  print_debug("  r_rsp: 0x%" PRIx64 "\n", threadinfo->regs.r_rsp);
-  print_debug("  r_rflags: 0x%" PRIx64 "\n", threadinfo->regs.r_rflags);
-}
-
-// read all segments64 commands from core file
-// read all thread commands from core file
-static bool read_core_segments(struct ps_prochandle* ph) {
-  int i = 0;
-  int num_threads = 0;
-  int fd = ph->core->core_fd;
-  off_t offset = 0;
-  mach_header_64      fhead;
-  load_command        lcmd;
-  segment_command_64  segcmd;
-  // thread_command      thrcmd;
-
-  lseek(fd, offset, SEEK_SET);
-  if(read(fd, (void *)&fhead, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
-     goto err;
-  }
-  print_debug("total commands: %d\n", fhead.ncmds);
-  offset += sizeof(mach_header_64);
-  for (i = 0; i < fhead.ncmds; i++) {
-    lseek(fd, offset, SEEK_SET);
-    if (read(fd, (void *)&lcmd, sizeof(load_command)) != sizeof(load_command)) {
-      goto err;
-    }
-    offset += lcmd.cmdsize;    // next command position
-    if (lcmd.cmd == LC_SEGMENT_64) {
-      lseek(fd, -sizeof(load_command), SEEK_CUR);
-      if (read(fd, (void *)&segcmd, sizeof(segment_command_64)) != sizeof(segment_command_64)) {
-        print_debug("failed to read LC_SEGMENT_64 i = %d!\n", i);
-        goto err;
-      }
-      if (add_map_info(ph, fd, segcmd.fileoff, segcmd.vmaddr, segcmd.vmsize) == NULL) {
-        print_debug("Failed to add map_info at i = %d\n", i);
-        goto err;
-      }
-      print_debug("segment added: %" PRIu64 " 0x%" PRIx64 " %d\n",
-                   segcmd.fileoff, segcmd.vmaddr, segcmd.vmsize);
-    } else if (lcmd.cmd == LC_THREAD || lcmd.cmd == LC_UNIXTHREAD) {
-      typedef struct thread_fc {
-        uint32_t  flavor;
-        uint32_t  count;
-      } thread_fc;
-      thread_fc fc;
-      uint32_t size = sizeof(load_command);
-      while (size < lcmd.cmdsize) {
-        if (read(fd, (void *)&fc, sizeof(thread_fc)) != sizeof(thread_fc)) {
-          printf("Reading flavor, count failed.\n");
-          goto err;
-        }
-        size += sizeof(thread_fc);
-        if (fc.flavor == x86_THREAD_STATE) {
-          x86_thread_state_t thrstate;
-          if (read(fd, (void *)&thrstate, sizeof(x86_thread_state_t)) != sizeof(x86_thread_state_t)) {
-            printf("Reading flavor, count failed.\n");
-            goto err;
-          }
-          size += sizeof(x86_thread_state_t);
-          // create thread info list, update lwp_id later
-          sa_thread_info* newthr = add_thread_info(ph, (pthread_t) -1, (lwpid_t) num_threads++);
-          if (newthr == NULL) {
-            printf("create thread_info failed\n");
-            goto err;
-          }
-
-          // note __DARWIN_UNIX03 depengs on other definitions
-#if __DARWIN_UNIX03
-#define get_register_v(regst, regname) \
-  regst.uts.ts64.__##regname
-#else
-#define get_register_v(regst, regname) \
-  regst.uts.ts64.##regname
-#endif // __DARWIN_UNIX03
-          newthr->regs.r_rax = get_register_v(thrstate, rax);
-          newthr->regs.r_rbx = get_register_v(thrstate, rbx);
-          newthr->regs.r_rcx = get_register_v(thrstate, rcx);
-          newthr->regs.r_rdx = get_register_v(thrstate, rdx);
-          newthr->regs.r_rdi = get_register_v(thrstate, rdi);
-          newthr->regs.r_rsi = get_register_v(thrstate, rsi);
-          newthr->regs.r_rbp = get_register_v(thrstate, rbp);
-          newthr->regs.r_rsp = get_register_v(thrstate, rsp);
-          newthr->regs.r_r8  = get_register_v(thrstate, r8);
-          newthr->regs.r_r9  = get_register_v(thrstate, r9);
-          newthr->regs.r_r10 = get_register_v(thrstate, r10);
-          newthr->regs.r_r11 = get_register_v(thrstate, r11);
-          newthr->regs.r_r12 = get_register_v(thrstate, r12);
-          newthr->regs.r_r13 = get_register_v(thrstate, r13);
-          newthr->regs.r_r14 = get_register_v(thrstate, r14);
-          newthr->regs.r_r15 = get_register_v(thrstate, r15);
-          newthr->regs.r_rip = get_register_v(thrstate, rip);
-          newthr->regs.r_rflags = get_register_v(thrstate, rflags);
-          newthr->regs.r_cs  = get_register_v(thrstate, cs);
-          newthr->regs.r_fs  = get_register_v(thrstate, fs);
-          newthr->regs.r_gs  = get_register_v(thrstate, gs);
-          print_thread(newthr);
-        } else if (fc.flavor == x86_FLOAT_STATE) {
-          x86_float_state_t flstate;
-          if (read(fd, (void *)&flstate, sizeof(x86_float_state_t)) != sizeof(x86_float_state_t)) {
-            print_debug("Reading flavor, count failed.\n");
-            goto err;
-          }
-          size += sizeof(x86_float_state_t);
-        } else if (fc.flavor == x86_EXCEPTION_STATE) {
-          x86_exception_state_t excpstate;
-          if (read(fd, (void *)&excpstate, sizeof(x86_exception_state_t)) != sizeof(x86_exception_state_t)) {
-            printf("Reading flavor, count failed.\n");
-            goto err;
-          }
-          size += sizeof(x86_exception_state_t);
-        }
-      }
-    }
-  }
-  return true;
-err:
-  return false;
-}
-
-/**local function **/
-bool exists(const char *fname)
-{
-  int fd;
-  if ((fd = open(fname, O_RDONLY)) > 0) {
-    close(fd);
-    return true;
-  }
-  return false;
-}
-
-// we check: 1. lib
-//           2. lib/server
-//           3. jre/lib
-//           4. jre/lib/server
-// from: 1. exe path
-//       2. JAVA_HOME
-//       3. DYLD_LIBRARY_PATH
-static bool get_real_path(struct ps_prochandle* ph, char *rpath) {
-  /** check if they exist in JAVA ***/
-  char* execname = ph->core->exec_path;
-  char  filepath[4096];
-  char* filename = strrchr(rpath, '/');               // like /libjvm.dylib
-  if (filename == NULL) {
-    return false;
-  }
-
-  char* posbin = strstr(execname, "/bin/java");
-  if (posbin != NULL) {
-    memcpy(filepath, execname, posbin - execname);    // not include trailing '/'
-    filepath[posbin - execname] = '\0';
-  } else {
-    char* java_home = getenv("JAVA_HOME");
-    if (java_home != NULL) {
-      strcpy(filepath, java_home);
-    } else {
-      char* dyldpath = getenv("DYLD_LIBRARY_PATH");
-      char* dypath = strtok(dyldpath, ":");
-      while (dypath != NULL) {
-        strcpy(filepath, dypath);
-        strcat(filepath, filename);
-        if (exists(filepath)) {
-           strcpy(rpath, filepath);
-           return true;
-        }
-        dypath = strtok(dyldpath, ":");
-      }
-      // not found
-      return false;
-    }
-  }
-  // for exec and java_home, jdkpath now is filepath
-  size_t filepath_base_size = strlen(filepath);
-
-  // first try /lib/ and /lib/server
-  strcat(filepath, "/lib");
-  strcat(filepath, filename);
-  if (exists(filepath)) {
-    strcpy(rpath, filepath);
-    return true;
-  }
-  char* pos = strstr(filepath, filename);    // like /libjvm.dylib
-  *pos = '\0';
-  strcat(filepath, "/server");
-  strcat(filepath, filename);
-  if (exists(filepath)) {
-    strcpy(rpath, filepath);
-    return true;
-  }
-
-  // then try /jre/lib/ and /jre/lib/server
-  filepath[filepath_base_size] = '\0';
-  strcat(filepath, "/jre/lib");
-  strcat(filepath, filename);
-  if (exists(filepath)) {
-    strcpy(rpath, filepath);
-    return true;
-  }
-  pos = strstr(filepath, filename);
-  *pos = '\0';
-  strcat(filepath, "/server");
-  strcat(filepath, filename);
-  if (exists(filepath)) {
-    strcpy(rpath, filepath);
-    return true;
-  }
-
-  return false;
-}
-
-static bool read_shared_lib_info(struct ps_prochandle* ph) {
-  static int pagesize = 0;
-  int fd = ph->core->core_fd;
-  int i = 0, j;
-  uint32_t  v;
-  mach_header_64 header;        // used to check if a file header in segment
-  load_command lcmd;
-  dylib_command dylibcmd;
-
-  char name[BUF_SIZE];  // use to store name
-
-  if (pagesize == 0) {
-    pagesize = getpagesize();
-    print_debug("page size is %d\n", pagesize);
-  }
-  for (j = 0; j < ph->core->num_maps; j++) {
-    map_info *iter = ph->core->map_array[j];   // head
-    off_t fpos = iter->offset;
-    if (iter->fd != fd) {
-      // only search core file!
-      continue;
-    }
-    print_debug("map_info %d: vmaddr = 0x%016" PRIx64 "  fileoff = %" PRIu64 "  vmsize = %" PRIu64 "\n",
-                           j, iter->vaddr, iter->offset, iter->memsz);
-    lseek(fd, fpos, SEEK_SET);
-    // we assume .dylib loaded at segment address --- which is true for JVM libraries
-    // multiple files may be loaded in one segment.
-    // if first word is not a magic word, means this segment does not contain lib file.
-    if (read(fd, (void *)&v, sizeof(uint32_t)) == sizeof(uint32_t)) {
-      if (v != MH_MAGIC_64) {
-        continue;
-      }
-    } else {
-      // may be encountered last map, which is not readable
-      continue;
-    }
-    while (ltell(fd) - iter->offset < iter->memsz) {
-      lseek(fd, fpos, SEEK_SET);
-      if (read(fd, (void *)&v, sizeof(uint32_t)) != sizeof(uint32_t)) {
-        break;
-      }
-      if (v != MH_MAGIC_64) {
-        fpos = (ltell(fd) + pagesize -1)/pagesize * pagesize;
-        continue;
-      }
-      lseek(fd, -sizeof(uint32_t), SEEK_CUR);
-      // this is the file begining to core file.
-      if (read(fd, (void *)&header, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
-        goto err;
-      }
-      fpos = ltell(fd);
-
-      // found a mach-o file in this segment
-      for (i = 0; i < header.ncmds; i++) {
-        // read commands in this "file"
-        // LC_ID_DYLIB is the file itself for a .dylib
-        lseek(fd, fpos, SEEK_SET);
-        if (read(fd, (void *)&lcmd, sizeof(load_command)) != sizeof(load_command)) {
-          return false;   // error
-        }
-        fpos += lcmd.cmdsize;  // next command position
-        // make sure still within seg size.
-        if (fpos  - lcmd.cmdsize - iter->offset > iter->memsz) {
-          print_debug("Warning: out of segement limit: %ld \n", fpos  - lcmd.cmdsize - iter->offset);
-          break;  // no need to iterate all commands
-        }
-        if (lcmd.cmd == LC_ID_DYLIB) {
-          lseek(fd, -sizeof(load_command), SEEK_CUR);
-          if (read(fd, (void *)&dylibcmd, sizeof(dylib_command)) != sizeof(dylib_command)) {
-            return false;
-          }
-          /**** name stored at dylib_command.dylib.name.offset, is a C string  */
-          lseek(fd, dylibcmd.dylib.name.offset - sizeof(dylib_command), SEEK_CUR);
-          int j = 0;
-          while (j < BUF_SIZE) {
-            read(fd, (void *)(name + j), sizeof(char));
-            if (name[j] == '\0') break;
-            j++;
-          }
-          print_debug("%s\n", name);
-          // changed name from @rpath/xxxx.dylib to real path
-          if (strrchr(name, '@')) {
-            get_real_path(ph, name);
-            print_debug("get_real_path returned: %s\n", name);
-          }
-          add_lib_info(ph, name, iter->vaddr);
-          break;
-        }
-      }
-      // done with the file, advanced to next page to search more files
-      fpos = (ltell(fd) + pagesize - 1) / pagesize * pagesize;
-    }
-  }
-  return true;
-err:
-  return false;
-}
-
-bool read_macho64_header(int fd, mach_header_64* core_header) {
-  bool is_macho = false;
-  if (fd < 0) return false;
-  off_t pos = ltell(fd);
-  lseek(fd, 0, SEEK_SET);
-  if (read(fd, (void *)core_header, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
-    is_macho = false;
-  } else {
-    is_macho = (core_header->magic ==  MH_MAGIC_64 || core_header->magic ==  MH_CIGAM_64);
-  }
-  lseek(fd, pos, SEEK_SET);
-  return is_macho;
-}
-
-// the one and only one exposed stuff from this file
-struct ps_prochandle* Pgrab_core(const char* exec_file, const char* core_file) {
-  mach_header_64 core_header;
-  mach_header_64 exec_header;
-
-  struct ps_prochandle* ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle));
-  if (ph == NULL) {
-    print_debug("cant allocate ps_prochandle\n");
-    return NULL;
-  }
-
-  if ((ph->core = (struct core_data*) calloc(1, sizeof(struct core_data))) == NULL) {
-    free(ph);
-    print_debug("can't allocate ps_prochandle\n");
-    return NULL;
-  }
-
-  // initialize ph
-  ph->ops = &core_ops;
-  ph->core->core_fd   = -1;
-  ph->core->exec_fd   = -1;
-  ph->core->interp_fd = -1;
-
-  print_debug("exec: %s   core: %s", exec_file, core_file);
-
-  strncpy(ph->core->exec_path, exec_file, sizeof(ph->core->exec_path));
-
-  // open the core file
-  if ((ph->core->core_fd = open(core_file, O_RDONLY)) < 0) {
-    print_error("can't open core file\n");
-    goto err;
-  }
-
-  // read core file header
-  if (read_macho64_header(ph->core->core_fd, &core_header) != true || core_header.filetype != MH_CORE) {
-    print_debug("core file is not a valid Mach-O file\n");
-    goto err;
-  }
-
-  if ((ph->core->exec_fd = open(exec_file, O_RDONLY)) < 0) {
-    print_error("can't open executable file\n");
-    goto err;
-  }
-
-  if (read_macho64_header(ph->core->exec_fd, &exec_header) != true ||
-                          exec_header.filetype != MH_EXECUTE) {
-    print_error("executable file is not a valid Mach-O file\n");
-    goto err;
-  }
-
-  // process core file segments
-  if (read_core_segments(ph) != true) {
-    print_error("failed to read core segments\n");
-    goto err;
-  }
-
-  // allocate and sort maps into map_array, we need to do this
-  // here because read_shared_lib_info needs to read from debuggee
-  // address space
-  if (sort_map_array(ph) != true) {
-    print_error("failed to sort segment map array\n");
-    goto err;
-  }
-
-  if (read_shared_lib_info(ph) != true) {
-    print_error("failed to read libraries\n");
-    goto err;
-  }
-
-  // sort again because we have added more mappings from shared objects
-  if (sort_map_array(ph) != true) {
-    print_error("failed to sort segment map array\n");
-    goto err;
-  }
-
-  if (init_classsharing_workaround(ph) != true) {
-    print_error("failed to workaround classshareing\n");
-    goto err;
-  }
-
-  print_debug("Leave Pgrab_core\n");
-  return ph;
-
-err:
-  Prelease(ph);
-  return NULL;
-}
-
-#else // __APPLE__ (none macosx)
-
-// read regs and create thread from core file
-static bool core_handle_prstatus(struct ps_prochandle* ph, const char* buf, size_t nbytes) {
-   // we have to read prstatus_t from buf
-   // assert(nbytes == sizeof(prstaus_t), "size mismatch on prstatus_t");
-   prstatus_t* prstat = (prstatus_t*) buf;
-   sa_thread_info* newthr;
-   print_debug("got integer regset for lwp %d\n", prstat->pr_pid);
-   // we set pthread_t to -1 for core dump
-   if((newthr = add_thread_info(ph, (pthread_t) -1,  prstat->pr_pid)) == NULL)
-      return false;
-
-   // copy regs
-   memcpy(&newthr->regs, &prstat->pr_reg, sizeof(struct reg));
-
-   if (is_debug()) {
-      print_debug("integer regset\n");
-#ifdef i386
-      // print the regset
-      print_debug("\teax = 0x%x\n", newthr->regs.r_eax);
-      print_debug("\tebx = 0x%x\n", newthr->regs.r_ebx);
-      print_debug("\tecx = 0x%x\n", newthr->regs.r_ecx);
-      print_debug("\tedx = 0x%x\n", newthr->regs.r_edx);
-      print_debug("\tesp = 0x%x\n", newthr->regs.r_esp);
-      print_debug("\tebp = 0x%x\n", newthr->regs.r_ebp);
-      print_debug("\tesi = 0x%x\n", newthr->regs.r_esi);
-      print_debug("\tedi = 0x%x\n", newthr->regs.r_edi);
-      print_debug("\teip = 0x%x\n", newthr->regs.r_eip);
-#endif
-
-#if defined(amd64) || defined(x86_64)
-      // print the regset
-      print_debug("\tr15 = 0x%lx\n", newthr->regs.r_r15);
-      print_debug("\tr14 = 0x%lx\n", newthr->regs.r_r14);
-      print_debug("\tr13 = 0x%lx\n", newthr->regs.r_r13);
-      print_debug("\tr12 = 0x%lx\n", newthr->regs.r_r12);
-      print_debug("\trbp = 0x%lx\n", newthr->regs.r_rbp);
-      print_debug("\trbx = 0x%lx\n", newthr->regs.r_rbx);
-      print_debug("\tr11 = 0x%lx\n", newthr->regs.r_r11);
-      print_debug("\tr10 = 0x%lx\n", newthr->regs.r_r10);
-      print_debug("\tr9 = 0x%lx\n", newthr->regs.r_r9);
-      print_debug("\tr8 = 0x%lx\n", newthr->regs.r_r8);
-      print_debug("\trax = 0x%lx\n", newthr->regs.r_rax);
-      print_debug("\trcx = 0x%lx\n", newthr->regs.r_rcx);
-      print_debug("\trdx = 0x%lx\n", newthr->regs.r_rdx);
-      print_debug("\trsi = 0x%lx\n", newthr->regs.r_rsi);
-      print_debug("\trdi = 0x%lx\n", newthr->regs.r_rdi);
-      //print_debug("\torig_rax = 0x%lx\n", newthr->regs.orig_rax);
-      print_debug("\trip = 0x%lx\n", newthr->regs.r_rip);
-      print_debug("\tcs = 0x%lx\n", newthr->regs.r_cs);
-      //print_debug("\teflags = 0x%lx\n", newthr->regs.eflags);
-      print_debug("\trsp = 0x%lx\n", newthr->regs.r_rsp);
-      print_debug("\tss = 0x%lx\n", newthr->regs.r_ss);
-      //print_debug("\tfs_base = 0x%lx\n", newthr->regs.fs_base);
-      //print_debug("\tgs_base = 0x%lx\n", newthr->regs.gs_base);
-      //print_debug("\tds = 0x%lx\n", newthr->regs.ds);
-      //print_debug("\tes = 0x%lx\n", newthr->regs.es);
-      //print_debug("\tfs = 0x%lx\n", newthr->regs.fs);
-      //print_debug("\tgs = 0x%lx\n", newthr->regs.gs);
-#endif
-   }
-
-   return true;
-}
-
-#define ROUNDUP(x, y)  ((((x)+((y)-1))/(y))*(y))
-
-// read NT_PRSTATUS entries from core NOTE segment
-static bool core_handle_note(struct ps_prochandle* ph, ELF_PHDR* note_phdr) {
-   char* buf = NULL;
-   char* p = NULL;
-   size_t size = note_phdr->p_filesz;
-
-   // we are interested in just prstatus entries. we will ignore the rest.
-   // Advance the seek pointer to the start of the PT_NOTE data
-   if (lseek(ph->core->core_fd, note_phdr->p_offset, SEEK_SET) == (off_t)-1) {
-      print_debug("failed to lseek to PT_NOTE data\n");
-      return false;
-   }
-
-   // Now process the PT_NOTE structures.  Each one is preceded by
-   // an Elf{32/64}_Nhdr structure describing its type and size.
-   if ( (buf = (char*) malloc(size)) == NULL) {
-      print_debug("can't allocate memory for reading core notes\n");
-      goto err;
-   }
-
-   // read notes into buffer
-   if (read(ph->core->core_fd, buf, size) != size) {
-      print_debug("failed to read notes, core file must have been truncated\n");
-      goto err;
-   }
-
-   p = buf;
-   while (p < buf + size) {
-      ELF_NHDR* notep = (ELF_NHDR*) p;
-      char* descdata  = p + sizeof(ELF_NHDR) + ROUNDUP(notep->n_namesz, 4);
-      print_debug("Note header with n_type = %d and n_descsz = %u\n",
-                                   notep->n_type, notep->n_descsz);
-
-      if (notep->n_type == NT_PRSTATUS) {
-        if (core_handle_prstatus(ph, descdata, notep->n_descsz) != true) {
-          return false;
-        }
-      }
-      p = descdata + ROUNDUP(notep->n_descsz, 4);
-   }
-
-   free(buf);
-   return true;
-
-err:
-   if (buf) free(buf);
-   return false;
-}
-
-// read all segments from core file
-static bool read_core_segments(struct ps_prochandle* ph, ELF_EHDR* core_ehdr) {
-   int i = 0;
-   ELF_PHDR* phbuf = NULL;
-   ELF_PHDR* core_php = NULL;
-
-   if ((phbuf =  read_program_header_table(ph->core->core_fd, core_ehdr)) == NULL)
-      return false;
-
-   /*
-    * Now iterate through the program headers in the core file.
-    * We're interested in two types of Phdrs: PT_NOTE (which
-    * contains a set of saved /proc structures), and PT_LOAD (which
-    * represents a memory mapping from the process's address space).
-    *
-    * Difference b/w Solaris PT_NOTE and Linux/BSD PT_NOTE:
-    *
-    *     In Solaris there are two PT_NOTE segments the first PT_NOTE (if present)
-    *     contains /proc structs in the pre-2.6 unstructured /proc format. the last
-    *     PT_NOTE has data in new /proc format.
-    *
-    *     In Solaris, there is only one pstatus (process status). pstatus contains
-    *     integer register set among other stuff. For each LWP, we have one lwpstatus
-    *     entry that has integer regset for that LWP.
-    *
-    *     Linux threads are actually 'clone'd processes. To support core analysis
-    *     of "multithreaded" process, Linux creates more than one pstatus (called
-    *     "prstatus") entry in PT_NOTE. Each prstatus entry has integer regset for one
-    *     "thread". Please refer to Linux kernel src file 'fs/binfmt_elf.c', in particular
-    *     function "elf_core_dump".
-    */
-
-    for (core_php = phbuf, i = 0; i < core_ehdr->e_phnum; i++) {
-      switch (core_php->p_type) {
-         case PT_NOTE:
-            if (core_handle_note(ph, core_php) != true) {
-              goto err;
-            }
-            break;
-
-         case PT_LOAD: {
-            if (core_php->p_filesz != 0) {
-               if (add_map_info(ph, ph->core->core_fd, core_php->p_offset,
-                  core_php->p_vaddr, core_php->p_filesz) == NULL) goto err;
-            }
-            break;
-         }
-      }
-
-      core_php++;
-   }
-
-   free(phbuf);
-   return true;
-err:
-   free(phbuf);
-   return false;
-}
-
-// read segments of a shared object
-static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* lib_ehdr, uintptr_t lib_base) {
-  int i = 0;
-  ELF_PHDR* phbuf;
-  ELF_PHDR* lib_php = NULL;
-
-  int page_size=sysconf(_SC_PAGE_SIZE);
-
-  if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL) {
-    return false;
-  }
-
-  // we want to process only PT_LOAD segments that are not writable.
-  // i.e., text segments. The read/write/exec (data) segments would
-  // have been already added from core file segments.
-  for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
-    if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
-
-      uintptr_t target_vaddr = lib_php->p_vaddr + lib_base;
-      map_info *existing_map = core_lookup(ph, target_vaddr);
-
-      if (existing_map == NULL){
-        if (add_map_info(ph, lib_fd, lib_php->p_offset,
-                          target_vaddr, lib_php->p_filesz) == NULL) {
-          goto err;
-        }
-      } else {
-        if ((existing_map->memsz != page_size) &&
-            (existing_map->fd != lib_fd) &&
-            (existing_map->memsz != lib_php->p_filesz)){
-
-          print_debug("address conflict @ 0x%lx (size = %ld, flags = %d\n)",
-                        target_vaddr, lib_php->p_filesz, lib_php->p_flags);
-          goto err;
-        }
-
-        /* replace PT_LOAD segment with library segment */
-        print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
-                     existing_map->memsz, lib_php->p_filesz);
-
-        existing_map->fd = lib_fd;
-        existing_map->offset = lib_php->p_offset;
-        existing_map->memsz = lib_php->p_filesz;
-      }
-    }
-
-    lib_php++;
-  }
-
-  free(phbuf);
-  return true;
-err:
-  free(phbuf);
-  return false;
-}
-
-// process segments from interpreter (ld.so or ld-linux.so or ld-elf.so)
-static bool read_interp_segments(struct ps_prochandle* ph) {
-   ELF_EHDR interp_ehdr;
-
-   if (read_elf_header(ph->core->interp_fd, &interp_ehdr) != true) {
-       print_debug("interpreter is not a valid ELF file\n");
-       return false;
-   }
-
-   if (read_lib_segments(ph, ph->core->interp_fd, &interp_ehdr, ph->core->ld_base_addr) != true) {
-       print_debug("can't read segments of interpreter\n");
-       return false;
-   }
-
-   return true;
-}
-
-// process segments of a a.out
-static bool read_exec_segments(struct ps_prochandle* ph, ELF_EHDR* exec_ehdr) {
-   int i = 0;
-   ELF_PHDR* phbuf = NULL;
-   ELF_PHDR* exec_php = NULL;
-
-   if ((phbuf = read_program_header_table(ph->core->exec_fd, exec_ehdr)) == NULL)
-      return false;
-
-   for (exec_php = phbuf, i = 0; i < exec_ehdr->e_phnum; i++) {
-      switch (exec_php->p_type) {
-
-         // add mappings for PT_LOAD segments
-         case PT_LOAD: {
-            // add only non-writable segments of non-zero filesz
-            if (!(exec_php->p_flags & PF_W) && exec_php->p_filesz != 0) {
-               if (add_map_info(ph, ph->core->exec_fd, exec_php->p_offset, exec_php->p_vaddr, exec_php->p_filesz) == NULL) goto err;
-            }
-            break;
-         }
-
-         // read the interpreter and it's segments
-         case PT_INTERP: {
-            char interp_name[BUF_SIZE];
-
-            pread(ph->core->exec_fd, interp_name, MIN(exec_php->p_filesz, BUF_SIZE), exec_php->p_offset);
-            print_debug("ELF interpreter %s\n", interp_name);
-            // read interpreter segments as well
-            if ((ph->core->interp_fd = pathmap_open(interp_name)) < 0) {
-               print_debug("can't open runtime loader\n");
-               goto err;
-            }
-            break;
-         }
-
-         // from PT_DYNAMIC we want to read address of first link_map addr
-         case PT_DYNAMIC: {
-            ph->core->dynamic_addr = exec_php->p_vaddr;
-            print_debug("address of _DYNAMIC is 0x%lx\n", ph->core->dynamic_addr);
-            break;
-         }
-
-      } // switch
-      exec_php++;
-   } // for
-
-   free(phbuf);
-   return true;
-err:
-   free(phbuf);
-   return false;
-}
-
-#define FIRST_LINK_MAP_OFFSET offsetof(struct r_debug,  r_map)
-#define LD_BASE_OFFSET        offsetof(struct r_debug,  r_ldbase)
-#define LINK_MAP_ADDR_OFFSET  offsetof(struct link_map, l_addr)
-#define LINK_MAP_NAME_OFFSET  offsetof(struct link_map, l_name)
-#define LINK_MAP_NEXT_OFFSET  offsetof(struct link_map, l_next)
-
-// read shared library info from runtime linker's data structures.
-// This work is done by librtlb_db in Solaris
-static bool read_shared_lib_info(struct ps_prochandle* ph) {
-  uintptr_t addr = ph->core->dynamic_addr;
-  uintptr_t debug_base;
-  uintptr_t first_link_map_addr;
-  uintptr_t ld_base_addr;
-  uintptr_t link_map_addr;
-  uintptr_t lib_base_diff;
-  uintptr_t lib_base;
-  uintptr_t lib_name_addr;
-  char lib_name[BUF_SIZE];
-  ELF_DYN dyn;
-  ELF_EHDR elf_ehdr;
-  int lib_fd;
-
-  // _DYNAMIC has information of the form
-  //         [tag] [data] [tag] [data] .....
-  // Both tag and data are pointer sized.
-  // We look for dynamic info with DT_DEBUG. This has shared object info.
-  // refer to struct r_debug in link.h
-
-  dyn.d_tag = DT_NULL;
-  while (dyn.d_tag != DT_DEBUG) {
-    if (ps_pread(ph, (psaddr_t) addr, &dyn, sizeof(ELF_DYN)) != PS_OK) {
-      print_debug("can't read debug info from _DYNAMIC\n");
-      return false;
-    }
-    addr += sizeof(ELF_DYN);
-  }
-
-  // we have got Dyn entry with DT_DEBUG
-  debug_base = dyn.d_un.d_ptr;
-  // at debug_base we have struct r_debug. This has first link map in r_map field
-  if (ps_pread(ph, (psaddr_t) debug_base + FIRST_LINK_MAP_OFFSET,
-                 &first_link_map_addr, sizeof(uintptr_t)) != PS_OK) {
-    print_debug("can't read first link map address\n");
-    return false;
-  }
-
-  // read ld_base address from struct r_debug
-#if 0  // There is no r_ldbase member on BSD
-  if (ps_pread(ph, (psaddr_t) debug_base + LD_BASE_OFFSET, &ld_base_addr,
-                  sizeof(uintptr_t)) != PS_OK) {
-    print_debug("can't read ld base address\n");
-    return false;
-  }
-  ph->core->ld_base_addr = ld_base_addr;
-#else
-  ph->core->ld_base_addr = 0;
-#endif
-
-  print_debug("interpreter base address is 0x%lx\n", ld_base_addr);
-
-  // now read segments from interp (i.e ld.so or ld-linux.so or ld-elf.so)
-  if (read_interp_segments(ph) != true) {
-    return false;
-  }
-
-  // after adding interpreter (ld.so) mappings sort again
-  if (sort_map_array(ph) != true) {
-    return false;
-  }
-
-  print_debug("first link map is at 0x%lx\n", first_link_map_addr);
-
-  link_map_addr = first_link_map_addr;
-  while (link_map_addr != 0) {
-    // read library base address of the .so. Note that even though <sys/link.h> calls
-    // link_map->l_addr as "base address",  this is * not * really base virtual
-    // address of the shared object. This is actually the difference b/w the virtual
-    // address mentioned in shared object and the actual virtual base where runtime
-    // linker loaded it. We use "base diff" in read_lib_segments call below.
-
-    if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_ADDR_OFFSET,
-                 &lib_base_diff, sizeof(uintptr_t)) != PS_OK) {
-      print_debug("can't read shared object base address diff\n");
-      return false;
-    }
-
-    // read address of the name
-    if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_NAME_OFFSET,
-                  &lib_name_addr, sizeof(uintptr_t)) != PS_OK) {
-      print_debug("can't read address of shared object name\n");
-      return false;
-    }
-
-    // read name of the shared object
-    if (read_string(ph, (uintptr_t) lib_name_addr, lib_name, sizeof(lib_name)) != true) {
-      print_debug("can't read shared object name\n");
-      return false;
-    }
-
-    if (lib_name[0] != '\0') {
-      // ignore empty lib names
-      lib_fd = pathmap_open(lib_name);
-
-      if (lib_fd < 0) {
-        print_debug("can't open shared object %s\n", lib_name);
-        // continue with other libraries...
-      } else {
-        if (read_elf_header(lib_fd, &elf_ehdr)) {
-          lib_base = lib_base_diff + find_base_address(lib_fd, &elf_ehdr);
-          print_debug("reading library %s @ 0x%lx [ 0x%lx ]\n",
-                       lib_name, lib_base, lib_base_diff);
-          // while adding library mappings we need to use "base difference".
-          if (! read_lib_segments(ph, lib_fd, &elf_ehdr, lib_base_diff)) {
-            print_debug("can't read shared object's segments\n");
-            close(lib_fd);
-            return false;
-          }
-          add_lib_info_fd(ph, lib_name, lib_fd, lib_base);
-          // Map info is added for the library (lib_name) so
-          // we need to re-sort it before calling the p_pdread.
-          if (sort_map_array(ph) != true) {
-            return false;
-          }
-        } else {
-          print_debug("can't read ELF header for shared object %s\n", lib_name);
-          close(lib_fd);
-          // continue with other libraries...
-        }
-      }
-    }
-
-    // read next link_map address
-    if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_NEXT_OFFSET,
-                  &link_map_addr, sizeof(uintptr_t)) != PS_OK) {
-      print_debug("can't read next link in link_map\n");
-      return false;
-    }
-  }
-
-  return true;
-}
-
-// the one and only one exposed stuff from this file
-struct ps_prochandle* Pgrab_core(const char* exec_file, const char* core_file) {
-  ELF_EHDR core_ehdr;
-  ELF_EHDR exec_ehdr;
-
-  struct ps_prochandle* ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle));
-  if (ph == NULL) {
-    print_debug("can't allocate ps_prochandle\n");
-    return NULL;
-  }
-
-  if ((ph->core = (struct core_data*) calloc(1, sizeof(struct core_data))) == NULL) {
-    free(ph);
-    print_debug("can't allocate ps_prochandle\n");
-    return NULL;
-  }
-
-  // initialize ph
-  ph->ops = &core_ops;
-  ph->core->core_fd   = -1;
-  ph->core->exec_fd   = -1;
-  ph->core->interp_fd = -1;
-
-  print_debug("exec: %s   core: %s", exec_file, core_file);
-
-  // open the core file
-  if ((ph->core->core_fd = open(core_file, O_RDONLY)) < 0) {
-    print_debug("can't open core file\n");
-    goto err;
-  }
-
-  // read core file ELF header
-  if (read_elf_header(ph->core->core_fd, &core_ehdr) != true || core_ehdr.e_type != ET_CORE) {
-    print_debug("core file is not a valid ELF ET_CORE file\n");
-    goto err;
-  }
-
-  if ((ph->core->exec_fd = open(exec_file, O_RDONLY)) < 0) {
-    print_debug("can't open executable file\n");
-    goto err;
-  }
-
-  if (read_elf_header(ph->core->exec_fd, &exec_ehdr) != true || exec_ehdr.e_type != ET_EXEC) {
-    print_debug("executable file is not a valid ELF ET_EXEC file\n");
-    goto err;
-  }
-
-  // process core file segments
-  if (read_core_segments(ph, &core_ehdr) != true) {
-    goto err;
-  }
-
-  // process exec file segments
-  if (read_exec_segments(ph, &exec_ehdr) != true) {
-    goto err;
-  }
-
-  // exec file is also treated like a shared object for symbol search
-  if (add_lib_info_fd(ph, exec_file, ph->core->exec_fd,
-                      (uintptr_t)0 + find_base_address(ph->core->exec_fd, &exec_ehdr)) == NULL) {
-    goto err;
-  }
-
-  // allocate and sort maps into map_array, we need to do this
-  // here because read_shared_lib_info needs to read from debuggee
-  // address space
-  if (sort_map_array(ph) != true) {
-    goto err;
-  }
-
-  if (read_shared_lib_info(ph) != true) {
-    goto err;
-  }
-
-  // sort again because we have added more mappings from shared objects
-  if (sort_map_array(ph) != true) {
-    goto err;
-  }
-
-  if (init_classsharing_workaround(ph) != true) {
-    goto err;
-  }
-
-  print_debug("Leave Pgrab_core\n");
-  return ph;
-
-err:
-  Prelease(ph);
-  return NULL;
-}
-
-#endif // __APPLE__
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/ps_proc.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/ptrace.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <elf.h>
-#include <sys/elf_common.h>
-#include <sys/link_elf.h>
-#include <libutil.h>
-#include "libproc_impl.h"
-#include "elfmacros.h"
-
-// This file has the libproc implementation specific to live process
-// For core files, refer to ps_core.c
-
-static inline uintptr_t align(uintptr_t ptr, size_t size) {
-  return (ptr & ~(size - 1));
-}
-
-// ---------------------------------------------
-// ptrace functions
-// ---------------------------------------------
-
-// read "size" bytes of data from "addr" within the target process.
-// unlike the standard ptrace() function, process_read_data() can handle
-// unaligned address - alignment check, if required, should be done
-// before calling process_read_data.
-
-static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
-  int rslt;
-  size_t i, words;
-  uintptr_t end_addr = addr + size;
-  uintptr_t aligned_addr = align(addr, sizeof(int));
-
-  if (aligned_addr != addr) {
-    char *ptr = (char *)&rslt;
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    for (; aligned_addr != addr; aligned_addr++, ptr++);
-    for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
-        aligned_addr++)
-       *(buf++) = *(ptr++);
-  }
-
-  words = (end_addr - aligned_addr) / sizeof(int);
-
-  // assert((intptr_t)aligned_addr % sizeof(int) == 0);
-  for (i = 0; i < words; i++) {
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    *(int *)buf = rslt;
-    buf += sizeof(int);
-    aligned_addr += sizeof(int);
-  }
-
-  if (aligned_addr != end_addr) {
-    char *ptr = (char *)&rslt;
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    for (; aligned_addr != end_addr; aligned_addr++)
-       *(buf++) = *(ptr++);
-  }
-  return true;
-}
-
-// null implementation for write
-static bool process_write_data(struct ps_prochandle* ph,
-                             uintptr_t addr, const char *buf , size_t size) {
-  return false;
-}
-
-// "user" should be a pointer to a reg
-static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) {
-  // we have already attached to all thread 'pid's, just use ptrace call
-  // to get regset now. Note that we don't cache regset upfront for processes.
- if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) {
-   print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
-   return false;
- }
- return true;
-}
-
-// fill in ptrace_lwpinfo for lid
-static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-  errno = 0;
-  ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo));
-
-  return (errno == 0)? true: false;
-}
-
-static bool ptrace_continue(pid_t pid, int signal) {
-  // pass the signal to the process so we don't swallow it
-  if (ptrace(PT_CONTINUE, pid, NULL, signal) < 0) {
-    print_debug("ptrace(PTRACE_CONT, ..) failed for %d\n", pid);
-    return false;
-  }
-  return true;
-}
-
-// waits until the ATTACH has stopped the process
-// by signal SIGSTOP
-static bool ptrace_waitpid(pid_t pid) {
-  int ret;
-  int status;
-  do {
-    // Wait for debuggee to stop.
-    ret = waitpid(pid, &status, 0);
-    if (ret >= 0) {
-      if (WIFSTOPPED(status)) {
-        // Any signal will stop the thread, make sure it is SIGSTOP. Otherwise SIGSTOP
-        // will still be pending and delivered when the process is DETACHED and the process
-        // will go to sleep.
-        if (WSTOPSIG(status) == SIGSTOP) {
-          // Debuggee stopped by SIGSTOP.
-          return true;
-        }
-        if (!ptrace_continue(pid, WSTOPSIG(status))) {
-          print_error("Failed to correctly attach to VM. VM might HANG! [PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status));
-          return false;
-        }
-      } else {
-        print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
-        return false;
-      }
-    } else {
-      switch (errno) {
-        case EINTR:
-          continue;
-          break;
-        case ECHILD:
-          print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
-          break;
-        case EINVAL:
-          print_debug("waitpid() failed. Invalid options argument.\n");
-          break;
-        default:
-          print_debug("waitpid() failed. Unexpected error %d\n",errno);
-      }
-      return false;
-    }
-  } while(true);
-}
-
-// attach to a process/thread specified by "pid"
-static bool ptrace_attach(pid_t pid) {
-  if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) {
-    print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
-    return false;
-  } else {
-    return ptrace_waitpid(pid);
-  }
-}
-
-// -------------------------------------------------------
-// functions for obtaining library information
-// -------------------------------------------------------
-
-// callback for read_thread_info
-static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
-  return add_thread_info(ph, pthread_id, lwp_id) != NULL;
-}
-
-#if defined(__FreeBSD__) && __FreeBSD_version < 701000
-/*
- * TEXT_START_ADDR from binutils/ld/emulparams/<arch_spec>.sh
- * Not the most robust but good enough.
- */
-
-#if defined(amd64) || defined(x86_64)
-#define TEXT_START_ADDR 0x400000
-#elif defined(i386)
-#define TEXT_START_ADDR 0x8048000
-#else
-#error TEXT_START_ADDR not defined
-#endif
-
-#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
-
-uintptr_t linkmap_addr(struct ps_prochandle *ph) {
-  uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr;
-  ELF_EHDR ehdr;
-  ELF_PHDR *phdrs, *phdr;
-  ELF_DYN *dyns, *dyn;
-  struct r_debug dmap;
-  unsigned long hdrs_size;
-  unsigned int i;
-
-  /* read ELF_EHDR at TEXT_START_ADDR and validate */
-
-  ehdr_addr = (uintptr_t)TEXT_START_ADDR;
-
-  if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) {
-    print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr);
-    return (0);
-  }
-
-  if (!IS_ELF(ehdr) ||
-        ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS ||
-        ehdr.e_ident[EI_DATA] != ELF_TARG_DATA ||
-        ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
-        ehdr.e_phentsize != sizeof(ELF_PHDR) ||
-        ehdr.e_version != ELF_TARG_VER ||
-        ehdr.e_machine != ELF_TARG_MACH) {
-    print_debug("not an ELF_EHDR at %p\n", ehdr_addr);
-    return (0);
-  }
-
-  /* allocate space for all ELF_PHDR's and read */
-
-  phdr_addr = ehdr_addr + ehdr.e_phoff;
-  hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR);
-
-  if ((phdrs = malloc(hdrs_size)) == NULL)
-    return (0);
-
-  if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) {
-    print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr);
-    return (0);
-  }
-
-  /* find PT_DYNAMIC section */
-
-  for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) {
-    if (phdr->p_type == PT_DYNAMIC)
-      break;
-  }
-
-  if (i >= ehdr.e_phnum) {
-    print_debug("PT_DYNAMIC section not found!\n");
-    free(phdrs);
-    return (0);
-  }
-
-  /* allocate space and read in ELF_DYN headers */
-
-  dyn_addr = phdr->p_vaddr;
-  hdrs_size = phdr->p_memsz;
-  free(phdrs);
-
-  if ((dyns = malloc(hdrs_size)) == NULL)
-    return (0);
-
-  if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) {
-    print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr);
-    free(dyns);
-    return (0);
-  }
-
-  /* find DT_DEBUG */
-
-  dyn = dyns;
-  while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) {
-    dyn++;
-  }
-
-  if (dyn->d_tag != DT_DEBUG) {
-    print_debug("failed to find DT_DEBUG\n");
-    free(dyns);
-    return (0);
-  }
-
-  /* read struct r_debug into dmap */
-
-  dmap_addr = (uintptr_t)dyn->d_un.d_ptr;
-  free(dyns);
-
-  if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) {
-    print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr);
-    return (0);
-  }
-
-  lmap_addr = (uintptr_t)dmap.r_map;
-
-  return (lmap_addr);
-}
-#endif // __FreeBSD__ && __FreeBSD_version < 701000
-
-static bool read_lib_info(struct ps_prochandle* ph) {
-#if defined(__FreeBSD__) && __FreeBSD_version >= 701000
-  struct kinfo_vmentry *freep, *kve;
-  int i, cnt;
-
-  freep = kinfo_getvmmap(ph->pid, &cnt);
-  if (freep == NULL) {
-      print_debug("can't get vm map for pid\n", ph->pid);
-      return false;
-  }
-
-  for (i = 0; i < cnt; i++) {
-    kve = &freep[i];
-    if ((kve->kve_flags & KVME_FLAG_COW) &&
-        kve->kve_path != NULL &&
-        strlen(kve->kve_path) > 0) {
-
-      if (find_lib(ph, kve->kve_path) == false) {
-        lib_info* lib;
-        if ((lib = add_lib_info(ph, kve->kve_path,
-                                (uintptr_t) kve->kve_start)) == NULL)
-          continue; // ignore, add_lib_info prints error
-
-        // we don't need to keep the library open, symtab is already
-        // built. Only for core dump we need to keep the fd open.
-        close(lib->fd);
-        lib->fd = -1;
-      }
-    }
-  }
-
-  free(freep);
-
-  return true;
-#else
-  char *l_name;
-  struct link_map *lmap;
-  uintptr_t lmap_addr;
-
-  if ((l_name = malloc(BUF_SIZE)) == NULL)
-    return false;
-
-  if ((lmap = malloc(sizeof(*lmap))) == NULL) {
-    free(l_name);
-    return false;
-  }
-
-  lmap_addr = linkmap_addr(ph);
-
-  if (lmap_addr == 0) {
-    free(l_name);
-    free(lmap);
-    return false;
-  }
-
-  do {
-    if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) {
-      print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr);
-      free (l_name);
-      free (lmap);
-      return false;
-    }
-
-    if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name,
-        BUF_SIZE) != true) {
-      print_debug("process_read_data failed for lmap->l_name %p\n",
-          lmap->l_name);
-      free (l_name);
-      free (lmap);
-      return false;
-    }
-
-    if (find_lib(ph, l_name) == false) {
-      lib_info* lib;
-      if ((lib = add_lib_info(ph, l_name,
-                              (uintptr_t) lmap->l_addr)) == NULL)
-        continue; // ignore, add_lib_info prints error
-
-      // we don't need to keep the library open, symtab is already
-      // built. Only for core dump we need to keep the fd open.
-      close(lib->fd);
-      lib->fd = -1;
-    }
-    lmap_addr = (uintptr_t)lmap->l_next;
-  } while (lmap->l_next != NULL);
-
-  free (l_name);
-  free (lmap);
-
-  return true;
-#endif
-}
-
-// detach a given pid
-static bool ptrace_detach(pid_t pid) {
-  if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) {
-    print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
-    return false;
-  } else {
-    return true;
-  }
-}
-
-static void process_cleanup(struct ps_prochandle* ph) {
-  ptrace_detach(ph->pid);
-}
-
-static ps_prochandle_ops process_ops = {
-  .release=  process_cleanup,
-  .p_pread=  process_read_data,
-  .p_pwrite= process_write_data,
-  .get_lwp_regs= process_get_lwp_regs,
-  .get_lwp_info= process_get_lwp_info
-};
-
-// attach to the process. One and only one exposed stuff
-struct ps_prochandle* Pgrab(pid_t pid) {
-  struct ps_prochandle* ph = NULL;
-
-  if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) {
-     print_debug("can't allocate memory for ps_prochandle\n");
-     return NULL;
-  }
-
-  if (ptrace_attach(pid) != true) {
-     free(ph);
-     return NULL;
-  }
-
-  // initialize ps_prochandle
-  ph->pid = pid;
-
-  // initialize vtable
-  ph->ops = &process_ops;
-
-  // read library info and symbol tables, must do this before attaching threads,
-  // as the symbols in the pthread library will be used to figure out
-  // the list of threads within the same process.
-  if (read_lib_info(ph) != true) {
-     ptrace_detach(pid);
-     free(ph);
-     return NULL;
-  }
-
-  // read thread info
-  read_thread_info(ph, add_new_thread);
-
-  return ph;
-}
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/salibelf.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "salibelf.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-extern void print_debug(const char*,...);
-
-// ELF file parsing helpers. Note that we do *not* use libelf here.
-int read_elf_header(int fd, ELF_EHDR* ehdr) {
-   if (pread(fd, ehdr, sizeof (ELF_EHDR), 0) != sizeof (ELF_EHDR) ||
-            memcmp(&ehdr->e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 ||
-            ehdr->e_version != EV_CURRENT) {
-        return 0;
-   }
-   return 1;
-}
-
-bool is_elf_file(int fd) {
-   ELF_EHDR ehdr;
-   return read_elf_header(fd, &ehdr);
-}
-
-// read program header table of an ELF file
-ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr) {
-   ELF_PHDR* phbuf = 0;
-   // allocate memory for program header table
-   size_t nbytes = hdr->e_phnum * hdr->e_phentsize;
-
-   if ((phbuf = (ELF_PHDR*) malloc(nbytes)) == NULL) {
-      print_debug("can't allocate memory for reading program header table\n");
-      return NULL;
-   }
-
-   if (pread(fd, phbuf, nbytes, hdr->e_phoff) != nbytes) {
-      print_debug("ELF file is truncated! can't read program header table\n");
-      free(phbuf);
-      return NULL;
-   }
-
-   return phbuf;
-}
-
-// read section header table of an ELF file
-ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr) {
-   ELF_SHDR* shbuf = 0;
-   // allocate memory for section header table
-   size_t nbytes = hdr->e_shnum * hdr->e_shentsize;
-
-   if ((shbuf = (ELF_SHDR*) malloc(nbytes)) == NULL) {
-      print_debug("can't allocate memory for reading section header table\n");
-      return NULL;
-   }
-
-   if (pread(fd, shbuf, nbytes, hdr->e_shoff) != nbytes) {
-      print_debug("ELF file is truncated! can't read section header table\n");
-      free(shbuf);
-      return NULL;
-   }
-
-   return shbuf;
-}
-
-// read a particular section's data
-void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr) {
-  void *buf = NULL;
-  if (shdr->sh_type == SHT_NOBITS || shdr->sh_size == 0) {
-     return buf;
-  }
-  if ((buf = calloc(shdr->sh_size, 1)) == NULL) {
-     print_debug("can't allocate memory for reading section data\n");
-     return NULL;
-  }
-  if (pread(fd, buf, shdr->sh_size, shdr->sh_offset) != shdr->sh_size) {
-     free(buf);
-     print_debug("section data read failed\n");
-     return NULL;
-  }
-  return buf;
-}
-
-uintptr_t find_base_address(int fd, ELF_EHDR* ehdr) {
-  uintptr_t baseaddr = (uintptr_t)-1;
-  int cnt;
-  ELF_PHDR *phbuf, *phdr;
-
-  // read program header table
-  if ((phbuf = read_program_header_table(fd, ehdr)) == NULL) {
-    goto quit;
-  }
-
-  // the base address of a shared object is the lowest vaddr of
-  // its loadable segments (PT_LOAD)
-  for (phdr = phbuf, cnt = 0; cnt < ehdr->e_phnum; cnt++, phdr++) {
-    if (phdr->p_type == PT_LOAD && phdr->p_vaddr < baseaddr) {
-      baseaddr = phdr->p_vaddr;
-    }
-  }
-
-quit:
-  if (phbuf) free(phbuf);
-  return baseaddr;
-}
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/salibelf.h	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _SALIBELF_H_
-#define _SALIBELF_H_
-
-#include <elf.h>
-#include "elfmacros.h"
-#include "libproc_impl.h"
-
-// read ELF file header.
-int read_elf_header(int fd, ELF_EHDR* ehdr);
-
-// is given file descriptor corresponds to an ELF file?
-bool is_elf_file(int fd);
-
-// read program header table of an ELF file. caller has to
-// free the result pointer after use. NULL on failure.
-ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr);
-
-// read section header table of an ELF file. caller has to
-// free the result pointer after use. NULL on failure.
-ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr);
-
-// read a particular section's data. caller has to free the
-// result pointer after use. NULL on failure.
-void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr);
-
-// find the base address at which the library wants to load itself
-uintptr_t find_base_address(int fd, ELF_EHDR* ehdr);
-#endif /* _SALIBELF_H_ */
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/symtab.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,398 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <unistd.h>
-#include <search.h>
-#include <stdlib.h>
-#include <string.h>
-#include <db.h>
-#include <fcntl.h>
-
-#include "libproc_impl.h"
-#include "symtab.h"
-#ifndef __APPLE__
-#include "salibelf.h"
-#endif // __APPLE__
-
-
-// ----------------------------------------------------
-// functions for symbol lookups
-// ----------------------------------------------------
-
-typedef struct symtab_symbol {
-  char *name;                // name like __ZThread_...
-  uintptr_t offset;          // to loaded address
-  uintptr_t size;            // size strlen
-} symtab_symbol;
-
-typedef struct symtab {
-  char *strs;                // all symbols "__symbol1__'\0'__symbol2__...."
-  size_t num_symbols;
-  DB* hash_table;
-  symtab_symbol* symbols;
-} symtab_t;
-
-#ifdef __APPLE__
-
-void build_search_table(symtab_t *symtab) {
-  int i;
-  for (i = 0; i < symtab->num_symbols; i++) {
-    DBT key, value;
-    key.data = symtab->symbols[i].name;
-    key.size = strlen(key.data) + 1;
-    value.data = &(symtab->symbols[i]);
-    value.size = sizeof(symtab_symbol);
-    (*symtab->hash_table->put)(symtab->hash_table, &key, &value, 0);
-
-    // check result
-    if (is_debug()) {
-      DBT rkey, rvalue;
-      char* tmp = (char *)malloc(strlen(symtab->symbols[i].name) + 1);
-      strcpy(tmp, symtab->symbols[i].name);
-      rkey.data = tmp;
-      rkey.size = strlen(tmp) + 1;
-      (*symtab->hash_table->get)(symtab->hash_table, &rkey, &rvalue, 0);
-      // we may get a copy back so compare contents
-      symtab_symbol *res = (symtab_symbol *)rvalue.data;
-      if (strcmp(res->name, symtab->symbols[i].name)  ||
-          res->offset != symtab->symbols[i].offset    ||
-          res->size != symtab->symbols[i].size) {
-        print_debug("error to get hash_table value!\n");
-      }
-      free(tmp);
-    }
-  }
-}
-
-// read symbol table from given fd.
-struct symtab* build_symtab(int fd) {
-  symtab_t* symtab = NULL;
-  int i;
-  mach_header_64 header;
-  off_t image_start;
-
-  if (!get_arch_off(fd, CPU_TYPE_X86_64, &image_start)) {
-    print_debug("failed in get fat header\n");
-    return NULL;
-  }
-  lseek(fd, image_start, SEEK_SET);
-  if (read(fd, (void *)&header, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
-    print_debug("reading header failed!\n");
-    return NULL;
-  }
-  // header
-  if (header.magic != MH_MAGIC_64) {
-    print_debug("not a valid .dylib file\n");
-    return NULL;
-  }
-
-  load_command lcmd;
-  symtab_command symtabcmd;
-  nlist_64 lentry;
-
-  bool lcsymtab_exist = false;
-
-  long filepos = ltell(fd);
-  for (i = 0; i < header.ncmds; i++) {
-    lseek(fd, filepos, SEEK_SET);
-    if (read(fd, (void *)&lcmd, sizeof(load_command)) != sizeof(load_command)) {
-      print_debug("read load_command failed for file\n");
-      return NULL;
-    }
-    filepos += lcmd.cmdsize;  // next command position
-    if (lcmd.cmd == LC_SYMTAB) {
-      lseek(fd, -sizeof(load_command), SEEK_CUR);
-      lcsymtab_exist = true;
-      break;
-    }
-  }
-  if (!lcsymtab_exist) {
-    print_debug("No symtab command found!\n");
-    return NULL;
-  }
-  if (read(fd, (void *)&symtabcmd, sizeof(symtab_command)) != sizeof(symtab_command)) {
-    print_debug("read symtab_command failed for file");
-    return NULL;
-  }
-  symtab = (symtab_t *)malloc(sizeof(symtab_t));
-  if (symtab == NULL) {
-    print_debug("out of memory: allocating symtab\n");
-    return NULL;
-  }
-
-  // create hash table, we use berkeley db to
-  // manipulate the hash table.
-  symtab->hash_table = dbopen(NULL, O_CREAT | O_RDWR, 0600, DB_HASH, NULL);
-  if (symtab->hash_table == NULL)
-    goto quit;
-
-  symtab->num_symbols = symtabcmd.nsyms;
-  symtab->symbols = (symtab_symbol *)malloc(sizeof(symtab_symbol) * symtab->num_symbols);
-  symtab->strs    = (char *)malloc(sizeof(char) * symtabcmd.strsize);
-  if (symtab->symbols == NULL || symtab->strs == NULL) {
-     print_debug("out of memory: allocating symtab.symbol or symtab.strs\n");
-     goto quit;
-  }
-  lseek(fd, image_start + symtabcmd.symoff, SEEK_SET);
-  for (i = 0; i < symtab->num_symbols; i++) {
-    if (read(fd, (void *)&lentry, sizeof(nlist_64)) != sizeof(nlist_64)) {
-      print_debug("read nlist_64 failed at %i\n", i);
-      goto quit;
-    }
-    symtab->symbols[i].offset = lentry.n_value;
-    symtab->symbols[i].size  = lentry.n_un.n_strx;        // index
-  }
-
-  // string table
-  lseek(fd, image_start + symtabcmd.stroff, SEEK_SET);
-  int size = read(fd, (void *)(symtab->strs), symtabcmd.strsize * sizeof(char));
-  if (size != symtabcmd.strsize * sizeof(char)) {
-     print_debug("reading string table failed\n");
-     goto quit;
-  }
-
-  for (i = 0; i < symtab->num_symbols; i++) {
-    symtab->symbols[i].name = symtab->strs + symtab->symbols[i].size;
-    if (i > 0) {
-      // fix size
-      symtab->symbols[i - 1].size = symtab->symbols[i].size - symtab->symbols[i - 1].size;
-      print_debug("%s size = %d\n", symtab->symbols[i - 1].name, symtab->symbols[i - 1].size);
-
-    }
-
-    if (i == symtab->num_symbols - 1) {
-      // last index
-      symtab->symbols[i].size =
-            symtabcmd.strsize - symtab->symbols[i].size;
-      print_debug("%s size = %d\n", symtab->symbols[i].name, symtab->symbols[i].size);
-    }
-  }
-
-  // build a hashtable for fast query
-  build_search_table(symtab);
-  return symtab;
-quit:
-  if (symtab) destroy_symtab(symtab);
-  return NULL;
-}
-
-#else // __APPLE__
-
-struct elf_section {
-  ELF_SHDR   *c_shdr;
-  void       *c_data;
-};
-
-// read symbol table from given fd.
-struct symtab* build_symtab(int fd) {
-  ELF_EHDR ehdr;
-  struct symtab* symtab = NULL;
-
-  // Reading of elf header
-  struct elf_section *scn_cache = NULL;
-  int cnt = 0;
-  ELF_SHDR* shbuf = NULL;
-  ELF_SHDR* cursct = NULL;
-  ELF_PHDR* phbuf = NULL;
-  int symtab_found = 0;
-  int dynsym_found = 0;
-  uint32_t symsection = SHT_SYMTAB;
-
-  uintptr_t baseaddr = (uintptr_t)-1;
-
-  lseek(fd, (off_t)0L, SEEK_SET);
-  if (! read_elf_header(fd, &ehdr)) {
-    // not an elf
-    return NULL;
-  }
-
-  // read ELF header
-  if ((shbuf = read_section_header_table(fd, &ehdr)) == NULL) {
-    goto quit;
-  }
-
-  baseaddr = find_base_address(fd, &ehdr);
-
-  scn_cache = calloc(ehdr.e_shnum, sizeof(*scn_cache));
-  if (scn_cache == NULL) {
-    goto quit;
-  }
-
-  for (cursct = shbuf, cnt = 0; cnt < ehdr.e_shnum; cnt++) {
-    scn_cache[cnt].c_shdr = cursct;
-    if (cursct->sh_type == SHT_SYMTAB ||
-        cursct->sh_type == SHT_STRTAB ||
-        cursct->sh_type == SHT_DYNSYM) {
-      if ( (scn_cache[cnt].c_data = read_section_data(fd, &ehdr, cursct)) == NULL) {
-         goto quit;
-      }
-    }
-
-    if (cursct->sh_type == SHT_SYMTAB)
-       symtab_found++;
-
-    if (cursct->sh_type == SHT_DYNSYM)
-       dynsym_found++;
-
-    cursct++;
-  }
-
-  if (!symtab_found && dynsym_found)
-     symsection = SHT_DYNSYM;
-
-  for (cnt = 1; cnt < ehdr.e_shnum; cnt++) {
-    ELF_SHDR *shdr = scn_cache[cnt].c_shdr;
-
-    if (shdr->sh_type == symsection) {
-      ELF_SYM  *syms;
-      int j, n;
-      size_t size;
-
-      // FIXME: there could be multiple data buffers associated with the
-      // same ELF section. Here we can handle only one buffer. See man page
-      // for elf_getdata on Solaris.
-
-      // guarantee(symtab == NULL, "multiple symtab");
-      symtab = calloc(1, sizeof(*symtab));
-      if (symtab == NULL) {
-         goto quit;
-      }
-      // the symbol table
-      syms = (ELF_SYM *)scn_cache[cnt].c_data;
-
-      // number of symbols
-      n = shdr->sh_size / shdr->sh_entsize;
-
-      // create hash table, we use berkeley db to
-      // manipulate the hash table.
-      symtab->hash_table = dbopen(NULL, O_CREAT | O_RDWR, 0600, DB_HASH, NULL);
-      // guarantee(symtab->hash_table, "unexpected failure: dbopen");
-      if (symtab->hash_table == NULL)
-        goto bad;
-
-      // shdr->sh_link points to the section that contains the actual strings
-      // for symbol names. the st_name field in ELF_SYM is just the
-      // string table index. we make a copy of the string table so the
-      // strings will not be destroyed by elf_end.
-      size = scn_cache[shdr->sh_link].c_shdr->sh_size;
-      symtab->strs = malloc(size);
-      if (symtab->strs == NULL)
-        goto bad;
-      memcpy(symtab->strs, scn_cache[shdr->sh_link].c_data, size);
-
-      // allocate memory for storing symbol offset and size;
-      symtab->num_symbols = n;
-      symtab->symbols = calloc(n , sizeof(*symtab->symbols));
-      if (symtab->symbols == NULL)
-        goto bad;
-
-      // copy symbols info our symtab and enter them info the hash table
-      for (j = 0; j < n; j++, syms++) {
-        DBT key, value;
-        char *sym_name = symtab->strs + syms->st_name;
-
-        // skip non-object and non-function symbols
-        int st_type = ELF_ST_TYPE(syms->st_info);
-        if ( st_type != STT_FUNC && st_type != STT_OBJECT)
-           continue;
-        // skip empty strings and undefined symbols
-        if (*sym_name == '\0' || syms->st_shndx == SHN_UNDEF) continue;
-
-        symtab->symbols[j].name   = sym_name;
-        symtab->symbols[j].offset = syms->st_value - baseaddr;
-        symtab->symbols[j].size   = syms->st_size;
-
-        key.data = sym_name;
-        key.size = strlen(sym_name) + 1;
-        value.data = &(symtab->symbols[j]);
-        value.size = sizeof(symtab_symbol);
-        (*symtab->hash_table->put)(symtab->hash_table, &key, &value, 0);
-      }
-    }
-  }
-  goto quit;
-
-bad:
-  destroy_symtab(symtab);
-  symtab = NULL;
-
-quit:
-  if (shbuf) free(shbuf);
-  if (phbuf) free(phbuf);
-  if (scn_cache) {
-    for (cnt = 0; cnt < ehdr.e_shnum; cnt++) {
-      if (scn_cache[cnt].c_data != NULL) {
-        free(scn_cache[cnt].c_data);
-      }
-    }
-    free(scn_cache);
-  }
-  return symtab;
-}
-
-#endif // __APPLE__
-
-void destroy_symtab(symtab_t* symtab) {
-  if (!symtab) return;
-  free(symtab->strs);
-  free(symtab->symbols);
-  free(symtab);
-}
-
-uintptr_t search_symbol(struct symtab* symtab, uintptr_t base, const char *sym_name, int *sym_size) {
-  DBT key, value;
-  int ret;
-
-  // library does not have symbol table
-  if (!symtab || !symtab->hash_table) {
-     return 0;
-  }
-
-  key.data = (char*)(uintptr_t)sym_name;
-  key.size = strlen(sym_name) + 1;
-  ret = (*symtab->hash_table->get)(symtab->hash_table, &key, &value, 0);
-  if (ret == 0) {
-    symtab_symbol *sym = value.data;
-    uintptr_t rslt = (uintptr_t) ((char*)base + sym->offset);
-    if (sym_size) *sym_size = sym->size;
-    return rslt;
-  }
-
-  return 0;
-}
-
-const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
-                           uintptr_t* poffset) {
-  int n = 0;
-  if (!symtab) return NULL;
-  for (; n < symtab->num_symbols; n++) {
-    symtab_symbol* sym = &(symtab->symbols[n]);
-    if (sym->name != NULL &&
-      offset >= sym->offset && offset < sym->offset + sym->size) {
-      if (poffset) *poffset = (offset - sym->offset);
-      return sym->name;
-    }
-  }
-  return NULL;
-}
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/symtab.h	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef _SYMTAB_H_
-#define _SYMTAB_H_
-
-#include <stdint.h>
-
-// interface to manage ELF or MachO symbol tables
-
-struct symtab;
-
-// build symbol table for a given ELF or MachO file escriptor
-struct symtab* build_symtab(int fd);
-
-// destroy the symbol table
-void destroy_symtab(struct symtab* symtab);
-
-// search for symbol in the given symbol table. Adds offset
-// to the base uintptr_t supplied. Returns NULL if not found.
-uintptr_t search_symbol(struct symtab* symtab, uintptr_t base,
-                      const char *sym_name, int *sym_size);
-
-// look for nearest symbol for a given offset (not address - base
-// subtraction done by caller
-const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
-                      uintptr_t* poffset);
-
-#endif /*_SYMTAB_H_*/
--- a/src/jdk.hotspot.agent/bsd/native/libsaproc/test.c	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "libproc.h"
-
-int main(int argc, char** argv) {
-   struct ps_prochandle* ph;
-
-   init_libproc(true);
-   switch (argc) {
-      case 2: {
-         // process
-         ph = Pgrab(atoi(argv[1]));
-         break;
-      }
-
-      case 3: {
-        // core
-        ph = Pgrab_core(argv[1], argv[2]);
-        break;
-      }
-
-      default: {
-        fprintf(stderr, "usage %s <pid> or %s <exec file> <core file>\n", argv[0], argv[0]);
-        return 1;
-      }
-   }
-
-   if (ph) {
-      Prelease(ph);
-      return 0;
-   } else {
-      printf("can't connect to debuggee\n");
-      return 1;
-   }
-}
--- a/src/os/bsd/vm/decoder_bsd.cpp	Sat Oct 07 16:29:26 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "prims/jvm.h"
-#include "utilities/decoder_elf.hpp"
-
-#include <cxxabi.h>
-
-bool ElfDecoder::demangle(const char* symbol, char *buf, int buflen) {
-  int   status;
-  char* result;
-  size_t size = (size_t)buflen;
-
-#ifdef PPC64
-  // On PPC64 ElfDecoder::decode() may return a dot (.) prefixed name
-  // (see elfFuncDescTable.hpp for details)
-  if (symbol && *symbol == '.') symbol += 1;
-#endif
-
-  // Don't pass buf to __cxa_demangle. In case of the 'buf' is too small,
-  // __cxa_demangle will call system "realloc" for additional memory, which
-  // may use different malloc/realloc mechanism that allocates 'buf'.
-  if ((result = abi::__cxa_demangle(symbol, NULL, NULL, &status)) != NULL) {
-    jio_snprintf(buf, buflen, "%s", result);
-      // call c library's free
-      ::free(result);
-      return true;
-  }
-  return false;
-}
-