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