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 static jfieldID p_ps_prochandle_ID = 0;
53 static jfieldID threadList_ID = 0;
54 static jfieldID loadObjectList_ID = 0;
55
56 static jmethodID createClosestSymbol_ID = 0;
57 static jmethodID createLoadObject_ID = 0;
58 static jmethodID getThreadForThreadId_ID = 0;
59 static jmethodID listAdd_ID = 0;
60
61 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
62 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
63 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
64 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
65
66 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
67 (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
68 }
69
70 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
71 jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
316 * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
317 */
318 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
319 (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
320
321 jboolean isCopy;
322 jbyteArray array;
323 jbyte *bufPtr;
324 ps_err_e err;
325
326 array = (*env)->NewByteArray(env, numBytes);
327 CHECK_EXCEPTION_(0);
328 bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
329 CHECK_EXCEPTION_(0);
330
331 err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
332 (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
333 return (err == PS_OK)? array : 0;
334 }
335
336 #if defined(i386) || defined(amd64) || defined(sparc) || defined(sparcv9)
337 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
338 (JNIEnv *env, jobject this_obj, jint lwp_id) {
339
340 struct user_regs_struct gregs;
341 jboolean isCopy;
342 jlongArray array;
343 jlong *regs;
344 int i;
345
346 struct ps_prochandle* ph = get_proc_handle(env, this_obj);
347 if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
348 THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
349 }
350
351 #undef NPRGREG
352 #ifdef i386
353 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
354 #endif
355 #ifdef amd64
356 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
357 #endif
358 #if defined(sparc) || defined(sparcv9)
359 #define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
360 #endif
361
362 array = (*env)->NewLongArray(env, NPRGREG);
363 CHECK_EXCEPTION_(0);
364 regs = (*env)->GetLongArrayElements(env, array, &isCopy);
365
366 #undef REG_INDEX
367
368 #ifdef i386
369 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
370
371 regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
372 regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
373 regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
374 regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds;
375 regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
376 regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
377 regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
432 regs[REG_INDEX(R_nPC)] = gregs.npc;
433 regs[REG_INDEX(R_Y)] = gregs.y;
434 #endif
435 regs[REG_INDEX(R_G0)] = 0 ;
436 regs[REG_INDEX(R_G1)] = gregs.u_regs[0];
437 regs[REG_INDEX(R_G2)] = gregs.u_regs[1];
438 regs[REG_INDEX(R_G3)] = gregs.u_regs[2];
439 regs[REG_INDEX(R_G4)] = gregs.u_regs[3];
440 regs[REG_INDEX(R_G5)] = gregs.u_regs[4];
441 regs[REG_INDEX(R_G6)] = gregs.u_regs[5];
442 regs[REG_INDEX(R_G7)] = gregs.u_regs[6];
443 regs[REG_INDEX(R_O0)] = gregs.u_regs[7];
444 regs[REG_INDEX(R_O1)] = gregs.u_regs[8];
445 regs[REG_INDEX(R_O2)] = gregs.u_regs[ 9];
446 regs[REG_INDEX(R_O3)] = gregs.u_regs[10];
447 regs[REG_INDEX(R_O4)] = gregs.u_regs[11];
448 regs[REG_INDEX(R_O5)] = gregs.u_regs[12];
449 regs[REG_INDEX(R_O6)] = gregs.u_regs[13];
450 regs[REG_INDEX(R_O7)] = gregs.u_regs[14];
451 #endif /* sparc */
452
453
454 (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
455 return array;
456 }
457 #endif
|
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 aarch64
53 #include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
54 #endif
55
56 static jfieldID p_ps_prochandle_ID = 0;
57 static jfieldID threadList_ID = 0;
58 static jfieldID loadObjectList_ID = 0;
59
60 static jmethodID createClosestSymbol_ID = 0;
61 static jmethodID createLoadObject_ID = 0;
62 static jmethodID getThreadForThreadId_ID = 0;
63 static jmethodID listAdd_ID = 0;
64
65 #define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
66 #define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
67 #define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
68 #define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
69
70 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
71 (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
72 }
73
74 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
75 jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
320 * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
321 */
322 JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_readBytesFromProcess0
323 (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
324
325 jboolean isCopy;
326 jbyteArray array;
327 jbyte *bufPtr;
328 ps_err_e err;
329
330 array = (*env)->NewByteArray(env, numBytes);
331 CHECK_EXCEPTION_(0);
332 bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
333 CHECK_EXCEPTION_(0);
334
335 err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
336 (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
337 return (err == PS_OK)? array : 0;
338 }
339
340 #if defined(i386) || defined(amd64) || defined(sparc) || defined(sparcv9) || defined(aarch64)
341 JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0
342 (JNIEnv *env, jobject this_obj, jint lwp_id) {
343
344 struct user_regs_struct gregs;
345 jboolean isCopy;
346 jlongArray array;
347 jlong *regs;
348 int i;
349
350 struct ps_prochandle* ph = get_proc_handle(env, this_obj);
351 if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
352 THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
353 }
354
355 #undef NPRGREG
356 #ifdef i386
357 #define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
358 #endif
359 #ifdef amd64
360 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
361 #endif
362 #ifdef aarch64
363 #define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
364 #endif
365 #if defined(sparc) || defined(sparcv9)
366 #define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
367 #endif
368
369 array = (*env)->NewLongArray(env, NPRGREG);
370 CHECK_EXCEPTION_(0);
371 regs = (*env)->GetLongArrayElements(env, array, &isCopy);
372
373 #undef REG_INDEX
374
375 #ifdef i386
376 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
377
378 regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
379 regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
380 regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
381 regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds;
382 regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
383 regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
384 regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
439 regs[REG_INDEX(R_nPC)] = gregs.npc;
440 regs[REG_INDEX(R_Y)] = gregs.y;
441 #endif
442 regs[REG_INDEX(R_G0)] = 0 ;
443 regs[REG_INDEX(R_G1)] = gregs.u_regs[0];
444 regs[REG_INDEX(R_G2)] = gregs.u_regs[1];
445 regs[REG_INDEX(R_G3)] = gregs.u_regs[2];
446 regs[REG_INDEX(R_G4)] = gregs.u_regs[3];
447 regs[REG_INDEX(R_G5)] = gregs.u_regs[4];
448 regs[REG_INDEX(R_G6)] = gregs.u_regs[5];
449 regs[REG_INDEX(R_G7)] = gregs.u_regs[6];
450 regs[REG_INDEX(R_O0)] = gregs.u_regs[7];
451 regs[REG_INDEX(R_O1)] = gregs.u_regs[8];
452 regs[REG_INDEX(R_O2)] = gregs.u_regs[ 9];
453 regs[REG_INDEX(R_O3)] = gregs.u_regs[10];
454 regs[REG_INDEX(R_O4)] = gregs.u_regs[11];
455 regs[REG_INDEX(R_O5)] = gregs.u_regs[12];
456 regs[REG_INDEX(R_O6)] = gregs.u_regs[13];
457 regs[REG_INDEX(R_O7)] = gregs.u_regs[14];
458 #endif /* sparc */
459
460 #if defined(aarch64)
461
462 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
463
464 {
465 int i;
466 for (i = 0; i < 31; i++)
467 regs[i] = gregs.regs[i];
468 regs[REG_INDEX(SP)] = gregs.sp;
469 regs[REG_INDEX(PC)] = gregs.pc;
470 }
471 #endif /* aarch64 */
472
473
474 (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
475 return array;
476 }
477 #endif
|