]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - include/asm-blackfin/entry.h
Initial revision
[karo-tx-uboot.git] / include / asm-blackfin / entry.h
1 /*
2  * U-boot - entry.h Routines for context saving and restoring
3  *
4  * Copyright (c) 2005 blackfin.uclinux.org
5  *
6  * See file CREDITS for list of people who contributed to this
7  * project.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation; either version 2 of
12  * the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22  * MA 02111-1307 USA
23  */
24
25 #ifndef __BLACKFIN_ENTRY_H
26 #define __BLACKFIN_ENTRY_H
27
28 #include <linux/config.h>
29 #include <asm/setup.h>
30 #include <asm/page.h>
31
32 /*
33  * Stack layout in 'ret_from_exception':
34  *
35  */
36
37 /*
38  * Register %p2 is now set to the current task throughout
39  * the whole kernel.
40  */
41
42 #ifdef __ASSEMBLY__
43
44 #define LFLUSH_I_AND_D  0x00000808
45 #define LSIGTRAP        5
46
47 /* process bits for task_struct.flags */
48 #define PF_TRACESYS_OFF 3
49 #define PF_TRACESYS_BIT 5
50 #define PF_PTRACED_OFF  3
51 #define PF_PTRACED_BIT  4
52 #define PF_DTRACE_OFF   1
53 #define PF_DTRACE_BIT   5
54
55 #define NEW_PT_REGS
56
57 #if defined(NEW_PT_REGS)
58
59 #define SAVE_ALL_INT            save_context_no_interrupts
60 #define SAVE_ALL_SYS            save_context_no_interrupts
61 #define SAVE_CONTEXT            save_context_with_interrupts
62
63 #define RESTORE_ALL             restore_context_no_interrupts
64 #define RESTORE_ALL_SYS         restore_context_no_interrupts
65 #define RESTORE_CONTEXT         restore_context_with_interrupts
66
67 #else
68
69 #define SAVE_ALL_INT            save_all_int
70 #define SAVE_ALL_SYS            save_all_sys
71 #define SAVE_CONTEXT            save_context
72 #define RESTORE_ALL             restore_context
73 #define RESTORE_CONTEXT         restore_context
74
75 #endif
76
77 /*
78  * Code to save processor context.
79  * We even save the register which are preserved by a function call
80  * - r4, r5, r6, r7, p3, p4, p5
81  */
82 .macro save_context_with_interrupts
83         [--sp] = R0;
84         [--sp] = ( R7:0, P5:0 );
85         [--sp] = fp;
86         [--sp] = usp;
87
88         [--sp] = i0;
89         [--sp] = i1;
90         [--sp] = i2;
91         [--sp] = i3;
92
93         [--sp] = m0;
94         [--sp] = m1;
95         [--sp] = m2;
96         [--sp] = m3;
97
98         [--sp] = l0;
99         [--sp] = l1;
100         [--sp] = l2;
101         [--sp] = l3;
102
103         [--sp] = b0;
104         [--sp] = b1;
105         [--sp] = b2;
106         [--sp] = b3;
107         [--sp] = a0.x;
108         [--sp] = a0.w;
109         [--sp] = a1.x;
110         [--sp] = a1.w;
111
112         [--sp] = LC0;
113         [--sp] = LC1;
114         [--sp] = LT0;
115         [--sp] = LT1;
116         [--sp] = LB0;
117         [--sp] = LB1;
118
119         [--sp] = ASTAT;
120
121         [--sp] = r0;    /* Skip reserved */
122         [--sp] = RETS;
123         [--sp] = RETI;
124         [--sp] = RETX;
125         [--sp] = RETN;
126         [--sp] = RETE;
127         [--sp] = SEQSTAT;
128         [--sp] = SYSCFG;
129         [--sp] = r0;    /* Skip IPEND as well. */
130 .endm
131
132 .macro save_context_no_interrupts
133         [--sp] = R0;
134         [--sp] = ( R7:0, P5:0 );
135         [--sp] = fp;
136         [--sp] = usp;
137
138         [--sp] = i0;
139         [--sp] = i1;
140         [--sp] = i2;
141         [--sp] = i3;
142
143         [--sp] = m0;
144         [--sp] = m1;
145         [--sp] = m2;
146         [--sp] = m3;
147
148         [--sp] = l0;
149         [--sp] = l1;
150         [--sp] = l2;
151         [--sp] = l3;
152
153         [--sp] = b0;
154         [--sp] = b1;
155         [--sp] = b2;
156         [--sp] = b3;
157         [--sp] = a0.x;
158         [--sp] = a0.w;
159         [--sp] = a1.x;
160         [--sp] = a1.w;
161
162         [--sp] = LC0;
163         [--sp] = LC1;
164         [--sp] = LT0;
165         [--sp] = LT1;
166         [--sp] = LB0;
167         [--sp] = LB1;
168
169         [--sp] = ASTAT;
170
171         [--sp] = r0;    /* Skip reserved */
172         [--sp] = RETS;
173         r0 = RETI;
174         [--sp] = r0;
175         [--sp] = RETX;
176         [--sp] = RETN;
177         [--sp] = RETE;
178         [--sp] = SEQSTAT;
179         [--sp] = SYSCFG;
180         [--sp] = r0;    /* Skip IPEND as well. */
181 .endm
182
183 .macro restore_context_no_interrupts
184         sp += 4;
185         SYSCFG = [sp++];
186         SEQSTAT = [sp++];
187         RETE = [sp++];
188         RETN = [sp++];
189         RETX = [sp++];
190         r0 = [sp++];
191         RETI = r0;
192         RETS = [sp++];
193
194         sp += 4;
195
196         ASTAT = [sp++];
197
198         LB1 = [sp++];
199         LB0 = [sp++];
200         LT1 = [sp++];
201         LT0 = [sp++];
202         LC1 = [sp++];
203         LC0 = [sp++];
204
205         a1.w = [sp++];
206         a1.x = [sp++];
207         a0.w = [sp++];
208         a0.x = [sp++];
209         b3 = [sp++];
210         b2 = [sp++];
211         b1 = [sp++];
212         b0 = [sp++];
213
214         l3 = [sp++];
215         l2 = [sp++];
216         l1 = [sp++];
217         l0 = [sp++];
218
219         m3 = [sp++];
220         m2 = [sp++];
221         m1 = [sp++];
222         m0 = [sp++];
223
224         i3 = [sp++];
225         i2 = [sp++];
226         i1 = [sp++];
227         i0 = [sp++];
228
229         sp += 4;
230         fp = [sp++];
231
232         ( R7 : 0, P5 : 0) = [ SP ++ ];
233         sp += 4;
234 .endm
235
236 .macro restore_context_with_interrupts
237         sp += 4;
238         SYSCFG = [sp++];
239         SEQSTAT = [sp++];
240         RETE = [sp++];
241         RETN = [sp++];
242         RETX = [sp++];
243         RETI = [sp++];
244         RETS = [sp++];
245
246         sp += 4;
247
248         ASTAT = [sp++];
249
250         LB1 = [sp++];
251         LB0 = [sp++];
252         LT1 = [sp++];
253         LT0 = [sp++];
254         LC1 = [sp++];
255         LC0 = [sp++];
256
257         a1.w = [sp++];
258         a1.x = [sp++];
259         a0.w = [sp++];
260         a0.x = [sp++];
261         b3 = [sp++];
262         b2 = [sp++];
263         b1 = [sp++];
264         b0 = [sp++];
265
266         l3 = [sp++];
267         l2 = [sp++];
268         l1 = [sp++];
269         l0 = [sp++];
270
271         m3 = [sp++];
272         m2 = [sp++];
273         m1 = [sp++];
274         m0 = [sp++];
275
276         i3 = [sp++];
277         i2 = [sp++];
278         i1 = [sp++];
279         i0 = [sp++];
280
281         sp += 4;
282         fp = [sp++];
283
284         ( R7 : 0, P5 : 0) = [ SP ++ ];
285         sp += 4;
286 .endm
287
288 #if !defined(NEW_PT_REGS)
289 /*
290  * a -1 in the orig_r0 field signifies
291  * that the stack frame is NOT for syscall
292  */
293 .macro  save_all_int
294 /* reserved and disable the single step of SYSCFG, by Steven Chen 03/07/10 */
295         [--sp] = r0;
296         r0.l = 0x30;            /* Errata for BF533 */
297         r0.h = 0x0;
298         syscfg = r0;            /* disable single step flag in SYSCFG */
299         r0 = [sp++];
300         [--sp] = syscfg;        /* store SYSCFG */
301
302         [--sp] = r0;    /* Reserved for IPEND */
303         [--sp] = fp;
304         [--sp] = usp;
305         [--sp] = r0;
306
307         [--sp] = r0;
308         r0 = [sp + 8];
309         [--sp] = a0.x;
310         [--sp] = a1.x;
311         [--sp] = a0.w;
312         [--sp] = a1.w;
313         [--sp] = rets;
314         [--sp] = astat;
315         [--sp] = seqstat;
316         [--sp] = retx;  /* current pc when exception happens */
317         [--sp] = ( r7:5, p5:0 );
318         [--sp] = r1;
319         [--sp] = r2;
320         [--sp] = r4;
321         [--sp] = r3;
322 .endm
323
324 .macro  save_all_sys
325         [--sp] = r0;
326         [--sp] = r0;
327         [--sp] = a0.x;
328         [--sp] = a1.x;
329         [--sp] = a0.w;
330         [--sp] = a1.w;
331         [--sp] = rets;
332         [--sp] = astat;
333         [--sp] = seqstat;
334         [--sp] = retx;  /* current pc when exception happens */
335         [--sp] = ( r7:5, p5:0 );
336         [--sp] = r1;
337         [--sp] = r2;
338         [--sp] = r4;
339         [--sp] = r3;
340 .endm
341
342 .macro  restore_all
343         r3 = [sp++];
344         r4 = [sp++];
345         r2 = [sp++];
346         r1 = [sp++];
347         ( r7:5, p5:0 ) = [sp++];
348         retx = [sp++];
349         seqstat = [sp++];
350         astat = [sp++];
351         rets = [sp++];
352         a1.w = [sp++];
353         a0.w = [sp++];
354         a1.x = [sp++];
355         a0.x = [sp++];
356         sp += 4;        /* orig r0 */
357         r0 = [sp++];
358
359         sp += 4;
360         fp = [sp++];
361         sp +=4;         /* Skip the IPEND */
362
363         syscfg = [sp++];
364
365 .endm
366
367 #endif
368
369 #define STR(X)                  STR1(X)
370 #define STR1(X)                 #X
371
372 #if defined(NEW_PT_REGS)
373
374 #define PT_OFF_ORIG_R0          208
375 #define PT_OFF_SR               8
376
377 #else
378
379 #define PT_OFF_ORIG_R0          0x54
380 #define PT_OFF_SR               0x38    /* seqstat in pt_regs */
381
382 #endif
383 #endif
384
385 #endif