< prev index next >

src/jdk.hotspot.agent/linux/native/libsaproc/LinuxDebuggerLocal.cpp

Print this page
rev 59383 : [mq]: final


  35 #include <string.h>
  36 #include <limits.h>
  37 #include <cxxabi.h>
  38 
  39 #if defined(x86_64) && !defined(amd64)
  40 #define amd64 1
  41 #endif
  42 
  43 #if defined(i386) && !defined(i586)
  44 #define i586 1
  45 #endif
  46 
  47 #ifdef i586
  48 #include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
  49 #endif
  50 
  51 #ifdef amd64
  52 #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
  53 #endif
  54 
  55 #if defined(sparc) || defined(sparcv9)
  56 #include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
  57 #endif
  58 
  59 #if defined(ppc64) || defined(ppc64le)
  60 #include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
  61 #endif
  62 
  63 #ifdef aarch64
  64 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
  65 #endif
  66 
  67 class AutoJavaString {
  68   JNIEnv* m_env;
  69   jstring m_str;
  70   const char* m_buf;
  71 
  72 public:
  73   // check env->ExceptionOccurred() after ctor
  74   AutoJavaString(JNIEnv* env, jstring str)
  75     : m_env(env), m_str(str), m_buf(env->GetStringUTFChars(str, NULL)) {
  76   }
  77 
  78   ~AutoJavaString() {


 388  */
 389 extern "C"
 390 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
 391   (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
 392 
 393   jboolean isCopy;
 394   jbyteArray array;
 395   jbyte *bufPtr;
 396   ps_err_e err;
 397 
 398   array = env->NewByteArray(numBytes);
 399   CHECK_EXCEPTION_(0);
 400   bufPtr = env->GetByteArrayElements(array, &isCopy);
 401   CHECK_EXCEPTION_(0);
 402 
 403   err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
 404   env->ReleaseByteArrayElements(array, bufPtr, 0);
 405   return (err == PS_OK)? array : 0;
 406 }
 407 
 408 #if defined(i586) || defined(amd64) || defined(sparc) || defined(sparcv9) | defined(ppc64) || defined(ppc64le) || defined(aarch64)
 409 extern "C"
 410 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
 411   (JNIEnv *env, jobject this_obj, jint lwp_id) {
 412 
 413   struct user_regs_struct gregs;
 414   jboolean isCopy;
 415   jlongArray array;
 416   jlong *regs;
 417   int i;
 418 
 419   struct ps_prochandle* ph = get_proc_handle(env, this_obj);
 420   if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
 421      THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
 422   }
 423 
 424 #undef NPRGREG
 425 #ifdef i586
 426 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
 427 #endif
 428 #ifdef amd64
 429 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
 430 #endif
 431 #ifdef aarch64
 432 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
 433 #endif
 434 #if defined(sparc) || defined(sparcv9)
 435 #define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
 436 #endif
 437 #if defined(ppc64) || defined(ppc64le)
 438 #define NPRGREG sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_NPRGREG
 439 #endif
 440 
 441 
 442   array = env->NewLongArray(NPRGREG);
 443   CHECK_EXCEPTION_(0);
 444   regs = env->GetLongArrayElements(array, &isCopy);
 445 
 446 #undef REG_INDEX
 447 
 448 #ifdef i586
 449 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
 450 
 451   regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
 452   regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
 453   regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
 454   regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
 455   regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
 456   regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;


 479   regs[REG_INDEX(R10)] = gregs.r10;
 480   regs[REG_INDEX(R9)] = gregs.r9;
 481   regs[REG_INDEX(R8)] = gregs.r8;
 482   regs[REG_INDEX(RAX)] = gregs.rax;
 483   regs[REG_INDEX(RCX)] = gregs.rcx;
 484   regs[REG_INDEX(RDX)] = gregs.rdx;
 485   regs[REG_INDEX(RSI)] = gregs.rsi;
 486   regs[REG_INDEX(RDI)] = gregs.rdi;
 487   regs[REG_INDEX(RIP)] = gregs.rip;
 488   regs[REG_INDEX(CS)] = gregs.cs;
 489   regs[REG_INDEX(RSP)] = gregs.rsp;
 490   regs[REG_INDEX(SS)] = gregs.ss;
 491   regs[REG_INDEX(FSBASE)] = gregs.fs_base;
 492   regs[REG_INDEX(GSBASE)] = gregs.gs_base;
 493   regs[REG_INDEX(DS)] = gregs.ds;
 494   regs[REG_INDEX(ES)] = gregs.es;
 495   regs[REG_INDEX(FS)] = gregs.fs;
 496   regs[REG_INDEX(GS)] = gregs.gs;
 497 
 498 #endif /* amd64 */
 499 
 500 #if defined(sparc) || defined(sparcv9)
 501 
 502 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
 503 
 504 #ifdef _LP64
 505   regs[REG_INDEX(R_PSR)] = gregs.tstate;
 506   regs[REG_INDEX(R_PC)]  = gregs.tpc;
 507   regs[REG_INDEX(R_nPC)] = gregs.tnpc;
 508   regs[REG_INDEX(R_Y)]   = gregs.y;
 509 #else
 510   regs[REG_INDEX(R_PSR)] = gregs.psr;
 511   regs[REG_INDEX(R_PC)]  = gregs.pc;
 512   regs[REG_INDEX(R_nPC)] = gregs.npc;
 513   regs[REG_INDEX(R_Y)]   = gregs.y;
 514 #endif
 515   regs[REG_INDEX(R_G0)]  =            0 ;
 516   regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
 517   regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
 518   regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
 519   regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
 520   regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
 521   regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
 522   regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
 523   regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
 524   regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
 525   regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
 526   regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
 527   regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
 528   regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
 529   regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
 530   regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
 531 #endif /* sparc */
 532 
 533 #if defined(aarch64)
 534 
 535 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
 536 
 537   {
 538     int i;
 539     for (i = 0; i < 31; i++)
 540       regs[i] = gregs.regs[i];
 541     regs[REG_INDEX(SP)] = gregs.sp;
 542     regs[REG_INDEX(PC)] = gregs.pc;
 543   }
 544 #endif /* aarch64 */
 545 
 546 #if defined(ppc64) || defined(ppc64le)
 547 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
 548 
 549   regs[REG_INDEX(LR)] = gregs.link;
 550   regs[REG_INDEX(NIP)] = gregs.nip;
 551   regs[REG_INDEX(R0)]  = gregs.gpr[0];




  35 #include <string.h>
  36 #include <limits.h>
  37 #include <cxxabi.h>
  38 
  39 #if defined(x86_64) && !defined(amd64)
  40 #define amd64 1
  41 #endif
  42 
  43 #if defined(i386) && !defined(i586)
  44 #define i586 1
  45 #endif
  46 
  47 #ifdef i586
  48 #include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
  49 #endif
  50 
  51 #ifdef amd64
  52 #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
  53 #endif
  54 




  55 #if defined(ppc64) || defined(ppc64le)
  56 #include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
  57 #endif
  58 
  59 #ifdef aarch64
  60 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
  61 #endif
  62 
  63 class AutoJavaString {
  64   JNIEnv* m_env;
  65   jstring m_str;
  66   const char* m_buf;
  67 
  68 public:
  69   // check env->ExceptionOccurred() after ctor
  70   AutoJavaString(JNIEnv* env, jstring str)
  71     : m_env(env), m_str(str), m_buf(env->GetStringUTFChars(str, NULL)) {
  72   }
  73 
  74   ~AutoJavaString() {


 384  */
 385 extern "C"
 386 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
 387   (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
 388 
 389   jboolean isCopy;
 390   jbyteArray array;
 391   jbyte *bufPtr;
 392   ps_err_e err;
 393 
 394   array = env->NewByteArray(numBytes);
 395   CHECK_EXCEPTION_(0);
 396   bufPtr = env->GetByteArrayElements(array, &isCopy);
 397   CHECK_EXCEPTION_(0);
 398 
 399   err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
 400   env->ReleaseByteArrayElements(array, bufPtr, 0);
 401   return (err == PS_OK)? array : 0;
 402 }
 403 
 404 #if defined(i586) || defined(amd64) || defined(ppc64) || defined(ppc64le) || defined(aarch64)
 405 extern "C"
 406 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
 407   (JNIEnv *env, jobject this_obj, jint lwp_id) {
 408 
 409   struct user_regs_struct gregs;
 410   jboolean isCopy;
 411   jlongArray array;
 412   jlong *regs;
 413   int i;
 414 
 415   struct ps_prochandle* ph = get_proc_handle(env, this_obj);
 416   if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
 417      THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
 418   }
 419 
 420 #undef NPRGREG
 421 #ifdef i586
 422 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
 423 #endif
 424 #ifdef amd64
 425 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
 426 #endif
 427 #ifdef aarch64
 428 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
 429 #endif



 430 #if defined(ppc64) || defined(ppc64le)
 431 #define NPRGREG sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_NPRGREG
 432 #endif
 433 
 434 
 435   array = env->NewLongArray(NPRGREG);
 436   CHECK_EXCEPTION_(0);
 437   regs = env->GetLongArrayElements(array, &isCopy);
 438 
 439 #undef REG_INDEX
 440 
 441 #ifdef i586
 442 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
 443 
 444   regs[REG_INDEX(GS)]  = (uintptr_t) gregs.xgs;
 445   regs[REG_INDEX(FS)]  = (uintptr_t) gregs.xfs;
 446   regs[REG_INDEX(ES)]  = (uintptr_t) gregs.xes;
 447   regs[REG_INDEX(DS)]  = (uintptr_t) gregs.xds;
 448   regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
 449   regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;


 472   regs[REG_INDEX(R10)] = gregs.r10;
 473   regs[REG_INDEX(R9)] = gregs.r9;
 474   regs[REG_INDEX(R8)] = gregs.r8;
 475   regs[REG_INDEX(RAX)] = gregs.rax;
 476   regs[REG_INDEX(RCX)] = gregs.rcx;
 477   regs[REG_INDEX(RDX)] = gregs.rdx;
 478   regs[REG_INDEX(RSI)] = gregs.rsi;
 479   regs[REG_INDEX(RDI)] = gregs.rdi;
 480   regs[REG_INDEX(RIP)] = gregs.rip;
 481   regs[REG_INDEX(CS)] = gregs.cs;
 482   regs[REG_INDEX(RSP)] = gregs.rsp;
 483   regs[REG_INDEX(SS)] = gregs.ss;
 484   regs[REG_INDEX(FSBASE)] = gregs.fs_base;
 485   regs[REG_INDEX(GSBASE)] = gregs.gs_base;
 486   regs[REG_INDEX(DS)] = gregs.ds;
 487   regs[REG_INDEX(ES)] = gregs.es;
 488   regs[REG_INDEX(FS)] = gregs.fs;
 489   regs[REG_INDEX(GS)] = gregs.gs;
 490 
 491 #endif /* amd64 */

































 492 
 493 #if defined(aarch64)
 494 
 495 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
 496 
 497   {
 498     int i;
 499     for (i = 0; i < 31; i++)
 500       regs[i] = gregs.regs[i];
 501     regs[REG_INDEX(SP)] = gregs.sp;
 502     regs[REG_INDEX(PC)] = gregs.pc;
 503   }
 504 #endif /* aarch64 */
 505 
 506 #if defined(ppc64) || defined(ppc64le)
 507 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
 508 
 509   regs[REG_INDEX(LR)] = gregs.link;
 510   regs[REG_INDEX(NIP)] = gregs.nip;
 511   regs[REG_INDEX(R0)]  = gregs.gpr[0];


< prev index next >