1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <inttypes.h>
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dump the fixed-purpose ARM registers, along with some other info.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function MUST be compiled in ARM mode -- THUMB will yield bogus
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * results.
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This will NOT preserve r0-r3/ip.
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmMterpDumpArmRegs(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3)
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
1395b0899ad3412596baa600b22ea2ecd7dd1acc43Evgeniy Stepanov  // TODO: Clang does not support asm declaration syntax.
1495b0899ad3412596baa600b22ea2ecd7dd1acc43Evgeniy Stepanov#ifndef __clang__
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    register uint32_t rPC       asm("r4");
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    register uint32_t rFP       asm("r5");
179f601a917c8878204482c37aec7005054b6776fabuzbee    register uint32_t rSELF     asm("r6");
181da12167d913efde56ec3b40491524b051679f2cAndy McFadden    register uint32_t rINST     asm("r7");
191da12167d913efde56ec3b40491524b051679f2cAndy McFadden    register uint32_t rIBASE    asm("r8");
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    register uint32_t r9        asm("r9");
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    register uint32_t r10       asm("r10");
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23fbdcfb9ea9e2a78f295834424c3f24986ea45dacBrian Carlstrom    //extern char dvmAsmInstructionStart[];
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("REGS: r0=%08x r1=%08x r2=%08x r3=%08x\n", r0, r1, r2, r3);
269f601a917c8878204482c37aec7005054b6776fabuzbee    printf("    : rPC=%08x rFP=%08x rSELF=%08x rINST=%08x\n",
279f601a917c8878204482c37aec7005054b6776fabuzbee        rPC, rFP, rSELF, rINST);
281da12167d913efde56ec3b40491524b051679f2cAndy McFadden    printf("    : rIBASE=%08x r9=%08x r10=%08x\n", rIBASE, r9, r10);
2995b0899ad3412596baa600b22ea2ecd7dd1acc43Evgeniy Stepanov#endif
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f601a917c8878204482c37aec7005054b6776fabuzbee    //Thread* self = (Thread*) rSELF;
329f601a917c8878204482c37aec7005054b6776fabuzbee    //const Method* method = self->method;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("    + self is %p\n", dvmThreadSelf());
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //printf("    + currently in %s.%s %s\n",
3585745e148153894aac52ad3d7f6a36a7767b45a0Mike Lockwood    //    method->clazz->descriptor, method->name, method->shorty);
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //printf("    + dvmAsmInstructionStart = %p\n", dvmAsmInstructionStart);
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //printf("    + next handler for 0x%02x = %p\n",
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //    rINST & 0xff, dvmAsmInstructionStart + (rINST & 0xff) * 64);
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dump the StackSaveArea for the specified frame pointer.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpFp(void* fp, StackSaveArea* otherSaveArea)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    StackSaveArea* saveArea = SAVEAREA_FROM_FP(fp);
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("StackSaveArea for fp %p [%p/%p]:\n", fp, saveArea, otherSaveArea);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("  prevSave=%p, prevFrame=%p savedPc=%p meth=%p curPc=%p\n",
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        saveArea->prevSave, saveArea->prevFrame, saveArea->savedPc,
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        saveArea->method, saveArea->xtra.currentPc);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("  prevFrame=%p savedPc=%p meth=%p curPc=%p fp[0]=0x%08x\n",
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        saveArea->prevFrame, saveArea->savedPc,
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        saveArea->method, saveArea->xtra.currentPc,
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        *(u4*)fp);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Does the bulk of the work for common_printMethod().
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmMterpPrintMethod(Method* method)
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It is a direct (non-virtual) method if it is static, private,
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or a constructor.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
69a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden    bool isDirect =
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ((method->accessFlags & (ACC_STATIC|ACC_PRIVATE)) != 0) ||
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (method->name[0] == '<');
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char* desc = dexProtoCopyMethodDescriptor(&method->prototype);
74a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    printf("<%c:%s.%s %s> ",
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            isDirect ? 'D' : 'V',
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method->clazz->descriptor,
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method->name,
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            desc);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    free(desc);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
83