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 
  51 typedef int bool;
  52 #define true  1
  53 #define false 0
  54 
  55 struct ps_prochandle;
  56 
  57 // attach to a process
  58 JNIEXPORT struct ps_prochandle* JNICALL
  59 Pgrab(pid_t pid, char* err_buf, size_t err_buf_len);
  60 
  61 // attach to a core dump
  62 JNIEXPORT struct ps_prochandle* JNICALL
  63 Pgrab_core(const char* execfile, const char* corefile);
  64 
  65 // release a process or core
  66 JNIEXPORT void JNICALL
  67 Prelease(struct ps_prochandle* ph);
  68 
  69 // functions not directly available in Solaris libproc
  70 
  71 // initialize libproc (call this only once per app)
  72 // pass true to make library verbose
  73 JNIEXPORT bool JNICALL
  74 init_libproc(bool verbose);
  75 
  76 // get number of threads
  77 int get_num_threads(struct ps_prochandle* ph);
  78 
  79 // get lwp_id of n'th thread
  80 lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
  81 
  82 // get regs for a given lwp
  83 bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct user_regs_struct* regs);
  84 
  85 // get number of shared objects
  86 int get_num_libs(struct ps_prochandle* ph);
  87 
  88 // get name of n'th lib
  89 const char* get_lib_name(struct ps_prochandle* ph, int index);
  90 
  91 // get base of lib
  92 uintptr_t get_lib_base(struct ps_prochandle* ph, int index);
  93 
  94 // returns true if given library is found in lib list
  95 bool find_lib(struct ps_prochandle* ph, const char *lib_name);
  96 
  97 // symbol lookup
  98 uintptr_t lookup_symbol(struct ps_prochandle* ph,  const char* object_name,
  99                        const char* sym_name);
 100 
 101 // address->nearest symbol lookup. return NULL for no symbol
 102 const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset);
 103 
 104 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj);
 105 
 106 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg);
 107 
 108 #endif //__LIBPROC_H_