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