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