< prev index next >

agent/src/os/linux/LinuxDebuggerLocal.c

Print this page




  32 #include <stdlib.h>
  33 #include <string.h>
  34 #include <limits.h>
  35 
  36 #if defined(x86_64) && !defined(amd64)
  37 #define amd64 1
  38 #endif
  39 
  40 #ifdef i386
  41 #include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
  42 #endif
  43 
  44 #ifdef amd64
  45 #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
  46 #endif
  47 
  48 #if defined(sparc) || defined(sparcv9)
  49 #include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
  50 #endif
  51 




  52 static jfieldID p_ps_prochandle_ID = 0;
  53 static jfieldID threadList_ID = 0;
  54 static jfieldID loadObjectList_ID = 0;
  55 
  56 static jmethodID createClosestSymbol_ID = 0;
  57 static jmethodID createLoadObject_ID = 0;
  58 static jmethodID getThreadForThreadId_ID = 0;
  59 static jmethodID listAdd_ID = 0;
  60 
  61 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
  62 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
  63 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
  64 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
  65 
  66 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
  67   (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
  68 }
  69 
  70 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
  71   jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);


 316  * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
 317  */
 318 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
 319   (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
 320 
 321   jboolean isCopy;
 322   jbyteArray array;
 323   jbyte *bufPtr;
 324   ps_err_e err;
 325 
 326   array = (*env)->NewByteArray(env, numBytes);
 327   CHECK_EXCEPTION_(0);
 328   bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
 329   CHECK_EXCEPTION_(0);
 330 
 331   err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
 332   (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
 333   return (err == PS_OK)? array : 0;
 334 }
 335 
 336 #if defined(i386) || defined(amd64) || defined(sparc) || defined(sparcv9)
 337 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
 338   (JNIEnv *env, jobject this_obj, jint lwp_id) {
 339 
 340   struct user_regs_struct gregs;
 341   jboolean isCopy;
 342   jlongArray array;
 343   jlong *regs;
 344   int i;
 345 
 346   struct ps_prochandle* ph = get_proc_handle(env, this_obj);
 347   if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
 348      THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
 349   }
 350 
 351 #undef NPRGREG
 352 #ifdef i386
 353 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
 354 #endif
 355 #ifdef amd64
 356 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
 357 #endif



 358 #if defined(sparc) || defined(sparcv9)
 359 #define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
 360 #endif
 361 
 362   array = (*env)->NewLongArray(env, NPRGREG);
 363   CHECK_EXCEPTION_(0);
 364   regs = (*env)->GetLongArrayElements(env, array, &isCopy);
 365 
 366 #undef REG_INDEX
 367 
 368 #ifdef i386
 369 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
 370 
 371   regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
 372   regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
 373   regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
 374   regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
 375   regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
 376   regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
 377   regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;


 432   regs[REG_INDEX(R_nPC)] = gregs.npc;
 433   regs[REG_INDEX(R_Y)]   = gregs.y;
 434 #endif
 435   regs[REG_INDEX(R_G0)]  =            0 ;
 436   regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
 437   regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
 438   regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
 439   regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
 440   regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
 441   regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
 442   regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
 443   regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
 444   regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
 445   regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
 446   regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
 447   regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
 448   regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
 449   regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
 450   regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
 451 #endif /* sparc */













 452 
 453 
 454   (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
 455   return array;
 456 }
 457 #endif


  32 #include <stdlib.h>
  33 #include <string.h>
  34 #include <limits.h>
  35 
  36 #if defined(x86_64) && !defined(amd64)
  37 #define amd64 1
  38 #endif
  39 
  40 #ifdef i386
  41 #include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
  42 #endif
  43 
  44 #ifdef amd64
  45 #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
  46 #endif
  47 
  48 #if defined(sparc) || defined(sparcv9)
  49 #include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
  50 #endif
  51 
  52 #ifdef aarch64
  53 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
  54 #endif
  55 
  56 static jfieldID p_ps_prochandle_ID = 0;
  57 static jfieldID threadList_ID = 0;
  58 static jfieldID loadObjectList_ID = 0;
  59 
  60 static jmethodID createClosestSymbol_ID = 0;
  61 static jmethodID createLoadObject_ID = 0;
  62 static jmethodID getThreadForThreadId_ID = 0;
  63 static jmethodID listAdd_ID = 0;
  64 
  65 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
  66 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
  67 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
  68 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
  69 
  70 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
  71   (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
  72 }
  73 
  74 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
  75   jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);


 320  * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
 321  */
 322 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
 323   (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
 324 
 325   jboolean isCopy;
 326   jbyteArray array;
 327   jbyte *bufPtr;
 328   ps_err_e err;
 329 
 330   array = (*env)->NewByteArray(env, numBytes);
 331   CHECK_EXCEPTION_(0);
 332   bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
 333   CHECK_EXCEPTION_(0);
 334 
 335   err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
 336   (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
 337   return (err == PS_OK)? array : 0;
 338 }
 339 
 340 #if defined(i386) || defined(amd64) || defined(sparc) || defined(sparcv9) || defined(aarch64)
 341 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
 342   (JNIEnv *env, jobject this_obj, jint lwp_id) {
 343 
 344   struct user_regs_struct gregs;
 345   jboolean isCopy;
 346   jlongArray array;
 347   jlong *regs;
 348   int i;
 349 
 350   struct ps_prochandle* ph = get_proc_handle(env, this_obj);
 351   if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
 352      THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
 353   }
 354 
 355 #undef NPRGREG
 356 #ifdef i386
 357 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
 358 #endif
 359 #ifdef amd64
 360 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
 361 #endif
 362 #ifdef aarch64
 363 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
 364 #endif
 365 #if defined(sparc) || defined(sparcv9)
 366 #define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
 367 #endif
 368 
 369   array = (*env)->NewLongArray(env, NPRGREG);
 370   CHECK_EXCEPTION_(0);
 371   regs = (*env)->GetLongArrayElements(env, array, &isCopy);
 372 
 373 #undef REG_INDEX
 374 
 375 #ifdef i386
 376 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
 377 
 378   regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
 379   regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
 380   regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
 381   regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
 382   regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
 383   regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
 384   regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;


 439   regs[REG_INDEX(R_nPC)] = gregs.npc;
 440   regs[REG_INDEX(R_Y)]   = gregs.y;
 441 #endif
 442   regs[REG_INDEX(R_G0)]  =            0 ;
 443   regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
 444   regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
 445   regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
 446   regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
 447   regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
 448   regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
 449   regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
 450   regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
 451   regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
 452   regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
 453   regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
 454   regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
 455   regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
 456   regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
 457   regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
 458 #endif /* sparc */
 459 
 460 #if defined(aarch64)
 461 
 462 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
 463 
 464   {
 465     int i;
 466     for (i = 0; i < 31; i++)
 467       regs[i] = gregs.regs[i];
 468     regs[REG_INDEX(SP)] = gregs.sp;
 469     regs[REG_INDEX(PC)] = gregs.pc;
 470   }
 471 #endif /* aarch64 */
 472 
 473 
 474   (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
 475   return array;
 476 }
 477 #endif
< prev index next >