Blackfin: add support for kgdb
[platform/kernel/u-boot.git] / lib_blackfin / __kgdb.S
1
2 #include <asm/linkage.h>
3
4 /* save stack context for non-local goto
5  * int kgdb_setjmp(long *buf)
6  */
7
8 ENTRY(_kgdb_setjmp)
9         [--SP] = p0;    /* Save P0 */
10         p0 = r0;
11         r0 = [SP++];    /* Load P0 into R0 */
12
13         [p0 + 0x00] = r0;       /* GP address registers */
14         [p0 + 0x04] = p1;
15         [p0 + 0x08] = p2;
16         [p0 + 0x0C] = p3;
17         [p0 + 0x10] = p4;
18         [p0 + 0x14] = p5;
19         [p0 + 0x18] = FP;       /* frame pointer */
20         [p0 + 0x1C] = SP;       /* stack pointer */
21
22         [p0 + 0x20] = p0;       /* data regs */
23         [p0 + 0x24] = r1;
24         [p0 + 0x28] = r2;
25         [p0 + 0x2C] = r3;
26         [p0 + 0x30] = r4;
27         [p0 + 0x34] = r5;
28         [p0 + 0x38] = r6;
29         [p0 + 0x3C] = r7;
30
31         r0 = ASTAT;     [p0 + 0x40] = r0;
32
33         /* loop counters */
34         r0 = LC0;       [p0 + 0x44] = r0;
35         r0 = LC1;       [p0 + 0x48] = r0;
36
37         /* Accumulator */
38         r0 = A0.w;      [p0 + 0x4C] = r0;
39         r0.l = A0.x;    [p0 + 0x50] = r0;
40         r0 = A1.w;      [p0 + 0x54] = r0;
41         r0.l = A1.x;    [p0 + 0x58] = r0;
42
43         /* index registers */
44         r0 = i0;        [p0 + 0x5C] = r0;
45         r0 = i1;        [p0 + 0x60] = r0;
46         r0 = i2;        [p0 + 0x64] = r0;
47         r0 = i3;        [p0 + 0x68] = r0;
48
49         /* modifier registers */
50         r0 = m0;        [p0 + 0x6C] = r0;
51         r0 = m1;        [p0 + 0x70] = r0;
52         r0 = m2;        [p0 + 0x74] = r0;
53         r0 = m3;        [p0 + 0x78] = r0;
54
55         /* length registers */
56         r0 = l0;        [p0 + 0x7C] = r0;
57         r0 = l1;        [p0 + 0x80] = r0;
58         r0 = l2;        [p0 + 0x84] = r0;
59         r0 = l3;        [p0 + 0x88] = r0;
60
61         /* base registers */
62         r0 = b0;        [p0 + 0x8C] = r0;
63         r0 = b1;        [p0 + 0x90] = r0;
64         r0 = b2;        [p0 + 0x94] = r0;
65         r0 = b3;        [p0 + 0x98] = r0;
66
67         /* store return address */
68         r0 = RETS;      [p0 + 0x9C] = r0;
69
70         R0 = 0;
71         RTS;
72 ENDPROC(_kgdb_setjmp)
73
74 /*
75  * non-local jump to a saved stack context
76  * longjmp(long *buf, int val)
77  */
78
79 ENTRY(_kgdb_longjmp)
80         p0 = r0;
81         r0 = [p0 + 0x00];
82         [--sp] = r0;
83
84         /* GP address registers - skip p0 for now*/
85         p1 = [p0 + 0x04];
86         p2 = [p0 + 0x08];
87         p3 = [p0 + 0x0C];
88         p4 = [p0 + 0x10];
89         p5 = [p0 + 0x14];
90         /* frame pointer */
91         fp = [p0 + 0x18];
92         /* stack pointer */
93         r0 = [sp++];
94         sp = [p0 + 0x1C];
95         [--sp] = r0;
96         [--sp] = r1;
97
98         /* data regs */
99         r0 = [p0 + 0x20];
100         r1 = [p0 + 0x24];
101         r2 = [p0 + 0x28];
102         r3 = [p0 + 0x2C];
103         r4 = [p0 + 0x30];
104         r5 = [p0 + 0x34];
105         r6 = [p0 + 0x38];
106         r7 = [p0 + 0x3C];
107
108         r0 = [p0 + 0x40];       ASTAT = r0;
109
110         /* loop counters */
111         r0 = [p0 + 0x44];       LC0 = r0;
112         r0 = [p0 + 0x48];       LC1 = r0;
113
114         /* Accumulator */
115         r0 = [p0 + 0x4C];       A0.w = r0;
116         r0 = [p0 + 0x50];       A0.x = r0;
117         r0 = [p0 + 0x54];       A1.w = r0;
118         r0 = [p0 + 0x58];       A1.x = r0;
119
120         /* index registers */
121         r0 = [p0 + 0x5C];       i0 = r0;
122         r0 = [p0 + 0x60];       i1 = r0;
123         r0 = [p0 + 0x64];       i2 = r0;
124         r0 = [p0 + 0x68];       i3 = r0;
125
126         /* modifier registers */
127         r0 = [p0 + 0x6C];       m0 = r0;
128         r0 = [p0 + 0x70];       m1 = r0;
129         r0 = [p0 + 0x74];       m2 = r0;
130         r0 = [p0 + 0x78];       m3 = r0;
131
132         /* length registers */
133         r0 = [p0 + 0x7C];       l0 = r0;
134         r0 = [p0 + 0x80];       l1 = r0;
135         r0 = [p0 + 0x84];       l2 = r0;
136         r0 = [p0 + 0x88];       l3 = r0;
137
138         /* base registers */
139         r0 = [p0 + 0x8C];       b0 = r0;
140         r0 = [p0 + 0x90];       b1 = r0;
141         r0 = [p0 + 0x94];       b2 = r0;
142         r0 = [p0 + 0x98];       b3 = r0;
143
144         /* store return address */
145         r0 = [p0 + 0x9C];       RETS = r0;
146
147         /* fixup R0 & P0 */
148         r0 = [sp++];
149         p0 = [sp++];
150         CC = R0 == 0;
151         IF !CC JUMP .Lfinished;
152         R0 = 1;
153 .Lfinished:
154         RTS;
155 ENDPROC(_kgdb_longjmp)