1 /*
2 * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2019, 2021, NTT DATA.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
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(str == NULL ? NULL : env->GetStringUTFChars(str, NULL)) {
72 }
73
74 ~AutoJavaString() {
75 if (m_buf) {
76 m_env->ReleaseStringUTFChars(m_str, m_buf);
77 }
78 }
79
80 operator const char* () const {
81 return m_buf;
82 }
391 */
392 extern "C"
393 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
394 (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
395
396 jboolean isCopy;
397 jbyteArray array;
398 jbyte *bufPtr;
399 ps_err_e err;
400
401 array = env->NewByteArray(numBytes);
402 CHECK_EXCEPTION_(0);
403 bufPtr = env->GetByteArrayElements(array, &isCopy);
404 CHECK_EXCEPTION_(0);
405
406 err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
407 env->ReleaseByteArrayElements(array, bufPtr, 0);
408 return (err == PS_OK)? array : 0;
409 }
410
411 #if defined(i586) || defined(amd64) || defined(ppc64) || defined(ppc64le) || defined(aarch64)
412 extern "C"
413 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
414 (JNIEnv *env, jobject this_obj, jint lwp_id) {
415
416 struct user_regs_struct gregs;
417 jboolean isCopy;
418 jlongArray array;
419 jlong *regs;
420 int i;
421
422 struct ps_prochandle* ph = get_proc_handle(env, this_obj);
423 if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
424 // This is not considered fatal and does happen on occassion, usually with an
425 // ESRCH error. The root cause is not fully understood, but by ignoring this error
426 // and returning NULL, stacking walking code will get null registers and fallback
427 // to using the "last java frame" if setup.
428 fprintf(stdout, "WARNING: getThreadIntegerRegisterSet0: get_lwp_regs failed for lwp (%d)\n", lwp_id);
429 fflush(stdout);
430 return NULL;
431 }
432
433 #undef NPRGREG
434 #ifdef i586
435 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
436 #endif
437 #ifdef amd64
438 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
439 #endif
440 #ifdef aarch64
441 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
442 #endif
443 #if defined(ppc64) || defined(ppc64le)
444 #define NPRGREG sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_NPRGREG
445 #endif
446
447
448 array = env->NewLongArray(NPRGREG);
449 CHECK_EXCEPTION_(0);
450 regs = env->GetLongArrayElements(array, &isCopy);
451
452 #undef REG_INDEX
453
454 #ifdef i586
455 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
456
457 regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
458 regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
459 regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
460 regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds;
461 regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
462 regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
499 regs[REG_INDEX(DS)] = gregs.ds;
500 regs[REG_INDEX(ES)] = gregs.es;
501 regs[REG_INDEX(FS)] = gregs.fs;
502 regs[REG_INDEX(GS)] = gregs.gs;
503
504 #endif /* amd64 */
505
506 #if defined(aarch64)
507
508 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
509
510 {
511 int i;
512 for (i = 0; i < 31; i++)
513 regs[i] = gregs.regs[i];
514 regs[REG_INDEX(SP)] = gregs.sp;
515 regs[REG_INDEX(PC)] = gregs.pc;
516 }
517 #endif /* aarch64 */
518
519 #if defined(ppc64) || defined(ppc64le)
520 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
521
522 regs[REG_INDEX(LR)] = gregs.link;
523 regs[REG_INDEX(NIP)] = gregs.nip;
524 regs[REG_INDEX(R0)] = gregs.gpr[0];
525 regs[REG_INDEX(R1)] = gregs.gpr[1];
526 regs[REG_INDEX(R2)] = gregs.gpr[2];
527 regs[REG_INDEX(R3)] = gregs.gpr[3];
528 regs[REG_INDEX(R4)] = gregs.gpr[4];
529 regs[REG_INDEX(R5)] = gregs.gpr[5];
530 regs[REG_INDEX(R6)] = gregs.gpr[6];
531 regs[REG_INDEX(R7)] = gregs.gpr[7];
532 regs[REG_INDEX(R8)] = gregs.gpr[8];
533 regs[REG_INDEX(R9)] = gregs.gpr[9];
534 regs[REG_INDEX(R10)] = gregs.gpr[10];
535 regs[REG_INDEX(R11)] = gregs.gpr[11];
536 regs[REG_INDEX(R12)] = gregs.gpr[12];
537 regs[REG_INDEX(R13)] = gregs.gpr[13];
538 regs[REG_INDEX(R14)] = gregs.gpr[14];
|
1 /*
2 * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2019, 2021, NTT DATA.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
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 #ifdef riscv64
64 #include "sun_jvm_hotspot_debugger_riscv64_RISCV64ThreadContext.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(str == NULL ? NULL : env->GetStringUTFChars(str, NULL)) {
76 }
77
78 ~AutoJavaString() {
79 if (m_buf) {
80 m_env->ReleaseStringUTFChars(m_str, m_buf);
81 }
82 }
83
84 operator const char* () const {
85 return m_buf;
86 }
395 */
396 extern "C"
397 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
398 (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
399
400 jboolean isCopy;
401 jbyteArray array;
402 jbyte *bufPtr;
403 ps_err_e err;
404
405 array = env->NewByteArray(numBytes);
406 CHECK_EXCEPTION_(0);
407 bufPtr = env->GetByteArrayElements(array, &isCopy);
408 CHECK_EXCEPTION_(0);
409
410 err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
411 env->ReleaseByteArrayElements(array, bufPtr, 0);
412 return (err == PS_OK)? array : 0;
413 }
414
415 #if defined(i586) || defined(amd64) || defined(ppc64) || defined(ppc64le) || defined(aarch64) || defined(riscv64)
416 extern "C"
417 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
418 (JNIEnv *env, jobject this_obj, jint lwp_id) {
419
420 struct user_regs_struct gregs;
421 jboolean isCopy;
422 jlongArray array;
423 jlong *regs;
424 int i;
425
426 struct ps_prochandle* ph = get_proc_handle(env, this_obj);
427 if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
428 // This is not considered fatal and does happen on occassion, usually with an
429 // ESRCH error. The root cause is not fully understood, but by ignoring this error
430 // and returning NULL, stacking walking code will get null registers and fallback
431 // to using the "last java frame" if setup.
432 fprintf(stdout, "WARNING: getThreadIntegerRegisterSet0: get_lwp_regs failed for lwp (%d)\n", lwp_id);
433 fflush(stdout);
434 return NULL;
435 }
436
437 #undef NPRGREG
438 #ifdef i586
439 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
440 #endif
441 #ifdef amd64
442 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
443 #endif
444 #ifdef aarch64
445 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
446 #endif
447 #ifdef riscv64
448 #define NPRGREG sun_jvm_hotspot_debugger_riscv64_RISCV64ThreadContext_NPRGREG
449 #endif
450 #if defined(ppc64) || defined(ppc64le)
451 #define NPRGREG sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_NPRGREG
452 #endif
453
454
455 array = env->NewLongArray(NPRGREG);
456 CHECK_EXCEPTION_(0);
457 regs = env->GetLongArrayElements(array, &isCopy);
458
459 #undef REG_INDEX
460
461 #ifdef i586
462 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
463
464 regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
465 regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
466 regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
467 regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds;
468 regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
469 regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
506 regs[REG_INDEX(DS)] = gregs.ds;
507 regs[REG_INDEX(ES)] = gregs.es;
508 regs[REG_INDEX(FS)] = gregs.fs;
509 regs[REG_INDEX(GS)] = gregs.gs;
510
511 #endif /* amd64 */
512
513 #if defined(aarch64)
514
515 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
516
517 {
518 int i;
519 for (i = 0; i < 31; i++)
520 regs[i] = gregs.regs[i];
521 regs[REG_INDEX(SP)] = gregs.sp;
522 regs[REG_INDEX(PC)] = gregs.pc;
523 }
524 #endif /* aarch64 */
525
526 #if defined(riscv64)
527 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_riscv64_RISCV64ThreadContext_##reg
528
529 regs[REG_INDEX(PC)] = gregs.pc;
530 regs[REG_INDEX(LR)] = gregs.ra;
531 regs[REG_INDEX(SP)] = gregs.sp;
532 regs[REG_INDEX(R3)] = gregs.gp;
533 regs[REG_INDEX(R4)] = gregs.tp;
534 regs[REG_INDEX(R5)] = gregs.t0;
535 regs[REG_INDEX(R6)] = gregs.t1;
536 regs[REG_INDEX(R7)] = gregs.t2;
537 regs[REG_INDEX(R8)] = gregs.s0;
538 regs[REG_INDEX(R9)] = gregs.s1;
539 regs[REG_INDEX(R10)] = gregs.a0;
540 regs[REG_INDEX(R11)] = gregs.a1;
541 regs[REG_INDEX(R12)] = gregs.a2;
542 regs[REG_INDEX(R13)] = gregs.a3;
543 regs[REG_INDEX(R14)] = gregs.a4;
544 regs[REG_INDEX(R15)] = gregs.a5;
545 regs[REG_INDEX(R16)] = gregs.a6;
546 regs[REG_INDEX(R17)] = gregs.a7;
547 regs[REG_INDEX(R18)] = gregs.s2;
548 regs[REG_INDEX(R19)] = gregs.s3;
549 regs[REG_INDEX(R20)] = gregs.s4;
550 regs[REG_INDEX(R21)] = gregs.s5;
551 regs[REG_INDEX(R22)] = gregs.s6;
552 regs[REG_INDEX(R23)] = gregs.s7;
553 regs[REG_INDEX(R24)] = gregs.s8;
554 regs[REG_INDEX(R25)] = gregs.s9;
555 regs[REG_INDEX(R26)] = gregs.s10;
556 regs[REG_INDEX(R27)] = gregs.s11;
557 regs[REG_INDEX(R28)] = gregs.t3;
558 regs[REG_INDEX(R29)] = gregs.t4;
559 regs[REG_INDEX(R30)] = gregs.t5;
560 regs[REG_INDEX(R31)] = gregs.t6;
561
562 #endif /* riscv64 */
563
564 #if defined(ppc64) || defined(ppc64le)
565 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext_##reg
566
567 regs[REG_INDEX(LR)] = gregs.link;
568 regs[REG_INDEX(NIP)] = gregs.nip;
569 regs[REG_INDEX(R0)] = gregs.gpr[0];
570 regs[REG_INDEX(R1)] = gregs.gpr[1];
571 regs[REG_INDEX(R2)] = gregs.gpr[2];
572 regs[REG_INDEX(R3)] = gregs.gpr[3];
573 regs[REG_INDEX(R4)] = gregs.gpr[4];
574 regs[REG_INDEX(R5)] = gregs.gpr[5];
575 regs[REG_INDEX(R6)] = gregs.gpr[6];
576 regs[REG_INDEX(R7)] = gregs.gpr[7];
577 regs[REG_INDEX(R8)] = gregs.gpr[8];
578 regs[REG_INDEX(R9)] = gregs.gpr[9];
579 regs[REG_INDEX(R10)] = gregs.gpr[10];
580 regs[REG_INDEX(R11)] = gregs.gpr[11];
581 regs[REG_INDEX(R12)] = gregs.gpr[12];
582 regs[REG_INDEX(R13)] = gregs.gpr[13];
583 regs[REG_INDEX(R14)] = gregs.gpr[14];
|