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];
|