agent/src/os/linux/LinuxDebuggerLocal.c

Print this page
rev 9494 : 8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling
Contributed-by: Andrew Hughes gnu.andrew@redhat.com


  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 ppc64
  53 #include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
  54 #endif
  55 
  56 #ifdef aarch64
  57 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
  58 #endif
  59 
  60 static jfieldID p_ps_prochandle_ID = 0;
  61 static jfieldID threadList_ID = 0;
  62 static jfieldID loadObjectList_ID = 0;
  63 
  64 static jmethodID createClosestSymbol_ID = 0;
  65 static jmethodID createLoadObject_ID = 0;
  66 static jmethodID getThreadForThreadId_ID = 0;
  67 static jmethodID listAdd_ID = 0;
  68 
  69 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
  70 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
  71 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
  72 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}


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


 469   regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
 470   regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
 471   regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
 472   regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
 473   regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
 474 #endif /* sparc */
 475 
 476 #if defined(aarch64)
 477 
 478 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
 479 
 480   {
 481     int i;
 482     for (i = 0; i < 31; i++)
 483       regs[i] = gregs.regs[i];
 484     regs[REG_INDEX(SP)] = gregs.sp;
 485     regs[REG_INDEX(PC)] = gregs.pc;
 486   }
 487 #endif /* aarch64 */
 488 
 489 #ifdef ppc64
 490 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
 491 
 492   regs[REG_INDEX(LR)] = gregs.link;
 493   regs[REG_INDEX(NIP)] = gregs.nip;
 494   regs[REG_INDEX(R0)]  = gregs.gpr[0];
 495   regs[REG_INDEX(R1)]  = gregs.gpr[1];
 496   regs[REG_INDEX(R2)]  = gregs.gpr[2];
 497   regs[REG_INDEX(R3)]  = gregs.gpr[3];
 498   regs[REG_INDEX(R4)]  = gregs.gpr[4];
 499   regs[REG_INDEX(R5)]  = gregs.gpr[5];
 500   regs[REG_INDEX(R6)]  = gregs.gpr[6];
 501   regs[REG_INDEX(R7)]  = gregs.gpr[7];
 502   regs[REG_INDEX(R8)]  = gregs.gpr[8];
 503   regs[REG_INDEX(R9)]  = gregs.gpr[9];
 504   regs[REG_INDEX(R10)] = gregs.gpr[10];
 505   regs[REG_INDEX(R11)] = gregs.gpr[11];
 506   regs[REG_INDEX(R12)] = gregs.gpr[12];
 507   regs[REG_INDEX(R13)] = gregs.gpr[13];
 508   regs[REG_INDEX(R14)] = gregs.gpr[14];
 509   regs[REG_INDEX(R15)] = gregs.gpr[15];




  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 #if defined(ppc64) || defined(ppc64le)
  53 #include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
  54 #endif
  55 
  56 #ifdef aarch64
  57 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
  58 #endif
  59 
  60 static jfieldID p_ps_prochandle_ID = 0;
  61 static jfieldID threadList_ID = 0;
  62 static jfieldID loadObjectList_ID = 0;
  63 
  64 static jmethodID createClosestSymbol_ID = 0;
  65 static jmethodID createLoadObject_ID = 0;
  66 static jmethodID getThreadForThreadId_ID = 0;
  67 static jmethodID listAdd_ID = 0;
  68 
  69 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
  70 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
  71 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
  72 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}


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


 469   regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
 470   regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
 471   regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
 472   regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
 473   regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
 474 #endif /* sparc */
 475 
 476 #if defined(aarch64)
 477 
 478 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
 479 
 480   {
 481     int i;
 482     for (i = 0; i < 31; i++)
 483       regs[i] = gregs.regs[i];
 484     regs[REG_INDEX(SP)] = gregs.sp;
 485     regs[REG_INDEX(PC)] = gregs.pc;
 486   }
 487 #endif /* aarch64 */
 488 
 489 #if defined(ppc64) || defined(ppc64le)
 490 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
 491 
 492   regs[REG_INDEX(LR)] = gregs.link;
 493   regs[REG_INDEX(NIP)] = gregs.nip;
 494   regs[REG_INDEX(R0)]  = gregs.gpr[0];
 495   regs[REG_INDEX(R1)]  = gregs.gpr[1];
 496   regs[REG_INDEX(R2)]  = gregs.gpr[2];
 497   regs[REG_INDEX(R3)]  = gregs.gpr[3];
 498   regs[REG_INDEX(R4)]  = gregs.gpr[4];
 499   regs[REG_INDEX(R5)]  = gregs.gpr[5];
 500   regs[REG_INDEX(R6)]  = gregs.gpr[6];
 501   regs[REG_INDEX(R7)]  = gregs.gpr[7];
 502   regs[REG_INDEX(R8)]  = gregs.gpr[8];
 503   regs[REG_INDEX(R9)]  = gregs.gpr[9];
 504   regs[REG_INDEX(R10)] = gregs.gpr[10];
 505   regs[REG_INDEX(R11)] = gregs.gpr[11];
 506   regs[REG_INDEX(R12)] = gregs.gpr[12];
 507   regs[REG_INDEX(R13)] = gregs.gpr[13];
 508   regs[REG_INDEX(R14)] = gregs.gpr[14];
 509   regs[REG_INDEX(R15)] = gregs.gpr[15];