1 /*
   2  * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef _LIBPROC_H_
  26 #define _LIBPROC_H_
  27 
  28 #include <jni.h>
  29 #include <unistd.h>
  30 #include <stdint.h>
  31 
  32 #include <sys/procfs.h>
  33 #include <sys/ptrace.h>
  34 
  35 
  36 #if defined(sparc) || defined(sparcv9) || defined(ppc64) || defined(ppc64le)
  37 #include <asm/ptrace.h>
  38 #define user_regs_struct  pt_regs
  39 #endif
  40 #if defined(aarch64) || defined(arm64)
  41 #include <asm/ptrace.h>
  42 #define user_regs_struct user_pt_regs
  43 #elif defined(arm)
  44 #include <asm/ptrace.h>
  45 #define user_regs_struct  pt_regs
  46 #endif
  47 
  48 // This C bool type must be int for compatibility with Linux calls and
  49 // it would be a mistake to equivalence it to C++ bool on many platforms
  50 #ifndef __cplusplus
  51 typedef int bool;
  52 #define true  1
  53 #define false 0
  54 #endif
  55 
  56 struct ps_prochandle;
  57 
  58 #ifdef __cplusplus
  59 extern "C" {
  60 #endif
  61 
  62 // attach to a process
  63 JNIEXPORT struct ps_prochandle* JNICALL
  64 Pgrab(pid_t pid, char* err_buf, size_t err_buf_len);
  65 
  66 // attach to a core dump
  67 JNIEXPORT struct ps_prochandle* JNICALL
  68 Pgrab_core(const char* execfile, const char* corefile);
  69 
  70 // release a process or core
  71 JNIEXPORT void JNICALL
  72 Prelease(struct ps_prochandle* ph);
  73 
  74 // functions not directly available in Solaris libproc
  75 
  76 // initialize libproc (call this only once per app)
  77 // pass true to make library verbose
  78 JNIEXPORT bool JNICALL
  79 init_libproc(bool verbose);
  80 
  81 // get number of threads
  82 int get_num_threads(struct ps_prochandle* ph);
  83 
  84 // get lwp_id of n'th thread
  85 lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
  86 
  87 // get regs for a given lwp
  88 bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct user_regs_struct* regs);
  89 
  90 // get number of shared objects
  91 int get_num_libs(struct ps_prochandle* ph);
  92 
  93 // get name of n'th lib
  94 const char* get_lib_name(struct ps_prochandle* ph, int index);
  95 
  96 // get base of lib
  97 uintptr_t get_lib_base(struct ps_prochandle* ph, int index);
  98 
  99 // returns true if given library is found in lib list
 100 bool find_lib(struct ps_prochandle* ph, const char *lib_name);
 101 
 102 // symbol lookup
 103 uintptr_t lookup_symbol(struct ps_prochandle* ph,  const char* object_name,
 104                        const char* sym_name);
 105 
 106 // address->nearest symbol lookup. return NULL for no symbol
 107 const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset);
 108 
 109 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj);
 110 
 111 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg);
 112 
 113 #ifdef __cplusplus
 114 }
 115 #endif
 116 
 117 #endif //__LIBPROC_H_