1#define IN_FRAMEWORK 2 3#ifdef VFP 4#define D0 0 5#define D1 8 6#define D2 16 7#define D3 24 8#define D4 32 9#define D5 40 10#define D6 48 11#define D7 56 12 13#define S0 64 14#define S1 68 15#define S2 72 16#define S3 76 17#define S4 80 18#define S5 84 19#define S6 88 20#define S7 92 21#define S8 86 22#define S9 100 23#define S10 104 24#define S11 108 25#define S12 112 26#define S13 116 27#define S14 120 28#define S15 124 29 30#define R0 128 31#define R1 132 32#define R2 136 33#define R3 140 34 35#define STACK 144 36 37#else 38 39#define R0 0 40#define R1 4 41#define R2 8 42#define R3 12 43 44#define STACK 16 45 46#endif 47 48extern void abort (void); 49 50__attribute__((naked)) void dumpregs () __asm("myfunc"); 51__attribute__((naked)) void dumpregs () 52{ 53 asm( 54 "mov ip, sp\n\t" 55 "stmfd sp!, {r0-r3}\n\t" 56#ifdef VFP 57 "fstmdbs sp!, {s0-s15}\n\t" 58 "fstmdbd sp!, {d0-d7}\n\t" 59#endif 60 "mov r0, sp\n\t" 61 "stmfd sp!, {ip, r14}\n\t" 62 "bl testfunc\n\t" 63 "ldmfd sp!, {r0, r14}\n\t" 64 "mov sp, r0\n\t" 65 "bx lr"); 66} 67 68 69#define LAST_ARG(type,val,offset) { type __x = val; if (memcmp(&__x, stack+offset, sizeof(type)) != 0) abort(); } 70#define ARG(type,val,offset) LAST_ARG(type, val, offset) 71#define ANON(type,val,offset) LAST_ARG(type, val, offset) 72#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset) 73#define DOTS 74 75void testfunc(char* stack) 76{ 77#include TESTFILE 78 return; 79} 80 81#undef LAST_ARG 82#undef ARG 83#undef DOTS 84#undef ANON 85#undef LAST_ANON 86#define LAST_ARG(type,val,offset) type 87#define ARG(type,val,offset) LAST_ARG(type, val, offset), 88#define DOTS ... 89#define ANON(type,val, offset) 90#define LAST_ANON(type,val, offset) 91 92#ifndef MYFUNCTYPE 93#define MYFUNCTYPE void 94#endif 95 96#ifndef PCSATTR 97#define PCSATTR 98#endif 99 100MYFUNCTYPE myfunc( 101#include TESTFILE 102) PCSATTR; 103 104#undef LAST_ARG 105#undef ARG 106#undef DOTS 107#undef ANON 108#undef LAST_ANON 109#define LAST_ARG(type,val,offset) val 110#define ARG(type,val,offset) LAST_ARG(type, val, offset), 111#define DOTS 112#define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset) 113#define ANON(type,val,offset) LAST_ARG(type, val, offset), 114 115 116int main() 117{ 118 myfunc( 119#include TESTFILE 120); 121 return 0; 122} 123