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