agent/src/os/linux/LinuxDebuggerLocal.c

Print this page
rev 9708 : 8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling
Summary: Set LIBARCH to ppc64le, make SA and hsdis work, have os.arch return ppc64le on PowerPC64 LE
Reviewed-by: david.holmes@oracle.com, magnus.ihse.bursie@oracle.com
Contributed-by: Andrew Hughes gnu.andrew@redhat.com, Alexander Smundak asmundak@google.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;}


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


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


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


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