Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
[pandora-kernel.git] / arch / m68k / include / asm / entry.h
1 #ifndef __M68K_ENTRY_H
2 #define __M68K_ENTRY_H
3
4 #include <asm/setup.h>
5 #include <asm/page.h>
6 #ifdef __ASSEMBLY__
7 #include <asm/thread_info.h>
8 #endif
9
10 /*
11  * Stack layout in 'ret_from_exception':
12  *
13  *      This allows access to the syscall arguments in registers d1-d5
14  *
15  *       0(sp) - d1
16  *       4(sp) - d2
17  *       8(sp) - d3
18  *       C(sp) - d4
19  *      10(sp) - d5
20  *      14(sp) - a0
21  *      18(sp) - a1
22  *      1C(sp) - a2
23  *      20(sp) - d0
24  *      24(sp) - orig_d0
25  *      28(sp) - stack adjustment
26  *      2C(sp) - [ sr              ] [ format & vector ]
27  *      2E(sp) - [ pc-hiword       ] [ sr              ]
28  *      30(sp) - [ pc-loword       ] [ pc-hiword       ]
29  *      32(sp) - [ format & vector ] [ pc-loword       ]
30  *                ^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^
31  *                      M68K              COLDFIRE
32  */
33
34 /* the following macro is used when enabling interrupts */
35 #if defined(MACH_ATARI_ONLY)
36         /* block out HSYNC on the atari */
37 #define ALLOWINT        (~0x400)
38 #define MAX_NOINT_IPL   3
39 #else
40         /* portable version */
41 #define ALLOWINT        (~0x700)
42 #define MAX_NOINT_IPL   0
43 #endif /* machine compilation types */
44
45 #ifdef __ASSEMBLY__
46 /*
47  * This defines the normal kernel pt-regs layout.
48  *
49  * regs a3-a6 and d6-d7 are preserved by C code
50  * the kernel doesn't mess with usp unless it needs to
51  */
52 #define SWITCH_STACK_SIZE       (6*4+4) /* includes return address */
53
54 #ifdef CONFIG_COLDFIRE
55 #ifdef CONFIG_COLDFIRE_SW_A7
56 /*
57  * This is made a little more tricky on older ColdFires. There is no
58  * separate supervisor and user stack pointers. Need to artificially
59  * construct a usp in software... When doing this we need to disable
60  * interrupts, otherwise bad things will happen.
61  */
62 .globl sw_usp
63 .globl sw_ksp
64
65 .macro SAVE_ALL_SYS
66         move    #0x2700,%sr             /* disable intrs */
67         btst    #5,%sp@(2)              /* from user? */
68         bnes    6f                      /* no, skip */
69         movel   %sp,sw_usp              /* save user sp */
70         addql   #8,sw_usp               /* remove exception */
71         movel   sw_ksp,%sp              /* kernel sp */
72         subql   #8,%sp                  /* room for exception */
73         clrl    %sp@-                   /* stkadj */
74         movel   %d0,%sp@-               /* orig d0 */
75         movel   %d0,%sp@-               /* d0 */
76         lea     %sp@(-32),%sp           /* space for 8 regs */
77         moveml  %d1-%d5/%a0-%a2,%sp@
78         movel   sw_usp,%a0              /* get usp */
79         movel   %a0@-,%sp@(PT_OFF_PC)   /* copy exception program counter */
80         movel   %a0@-,%sp@(PT_OFF_FORMATVEC)/*copy exception format/vector/sr */
81         bra     7f
82         6:
83         clrl    %sp@-                   /* stkadj */
84         movel   %d0,%sp@-               /* orig d0 */
85         movel   %d0,%sp@-               /* d0 */
86         lea     %sp@(-32),%sp           /* space for 8 regs */
87         moveml  %d1-%d5/%a0-%a2,%sp@
88         7:
89 .endm
90
91 .macro SAVE_ALL_INT
92         SAVE_ALL_SYS
93         moveq   #-1,%d0                 /* not system call entry */
94         movel   %d0,%sp@(PT_OFF_ORIG_D0)
95 .endm
96
97 .macro RESTORE_USER
98         move    #0x2700,%sr             /* disable intrs */
99         movel   sw_usp,%a0              /* get usp */
100         movel   %sp@(PT_OFF_PC),%a0@-   /* copy exception program counter */
101         movel   %sp@(PT_OFF_FORMATVEC),%a0@-/*copy exception format/vector/sr */
102         moveml  %sp@,%d1-%d5/%a0-%a2
103         lea     %sp@(32),%sp            /* space for 8 regs */
104         movel   %sp@+,%d0
105         addql   #4,%sp                  /* orig d0 */
106         addl    %sp@+,%sp               /* stkadj */
107         addql   #8,%sp                  /* remove exception */
108         movel   %sp,sw_ksp              /* save ksp */
109         subql   #8,sw_usp               /* set exception */
110         movel   sw_usp,%sp              /* restore usp */
111         rte
112 .endm
113
114 .macro RDUSP
115         movel   sw_usp,%a3
116 .endm
117
118 .macro WRUSP
119         movel   %a3,sw_usp
120 .endm
121
122 #else /* !CONFIG_COLDFIRE_SW_A7 */
123 /*
124  * Modern ColdFire parts have separate supervisor and user stack
125  * pointers. Simple load and restore macros for this case.
126  */
127 .macro SAVE_ALL_SYS
128         move    #0x2700,%sr             /* disable intrs */
129         clrl    %sp@-                   /* stkadj */
130         movel   %d0,%sp@-               /* orig d0 */
131         movel   %d0,%sp@-               /* d0 */
132         lea     %sp@(-32),%sp           /* space for 8 regs */
133         moveml  %d1-%d5/%a0-%a2,%sp@
134 .endm
135
136 .macro SAVE_ALL_INT
137         move    #0x2700,%sr             /* disable intrs */
138         clrl    %sp@-                   /* stkadj */
139         pea     -1:w                    /* orig d0 */
140         movel   %d0,%sp@-               /* d0 */
141         lea     %sp@(-32),%sp           /* space for 8 regs */
142         moveml  %d1-%d5/%a0-%a2,%sp@
143 .endm
144
145 .macro RESTORE_USER
146         moveml  %sp@,%d1-%d5/%a0-%a2
147         lea     %sp@(32),%sp            /* space for 8 regs */
148         movel   %sp@+,%d0
149         addql   #4,%sp                  /* orig d0 */
150         addl    %sp@+,%sp               /* stkadj */
151         rte
152 .endm
153
154 .macro RDUSP
155         /*move  %usp,%a3*/
156         .word   0x4e6b
157 .endm
158
159 .macro WRUSP
160         /*move  %a3,%usp*/
161         .word   0x4e63
162 .endm
163
164 #endif /* !CONFIG_COLDFIRE_SW_A7 */
165
166 .macro SAVE_SWITCH_STACK
167         lea     %sp@(-24),%sp           /* 6 regs */
168         moveml  %a3-%a6/%d6-%d7,%sp@
169 .endm
170
171 .macro RESTORE_SWITCH_STACK
172         moveml  %sp@,%a3-%a6/%d6-%d7
173         lea     %sp@(24),%sp            /* 6 regs */
174 .endm
175
176 #else /* !CONFIG_COLDFIRE */
177
178 /*
179  * All other types of m68k parts (68000, 680x0, CPU32) have the same
180  * entry and exit code.
181  */
182
183 /*
184  * a -1 in the orig_d0 field signifies
185  * that the stack frame is NOT for syscall
186  */
187 .macro SAVE_ALL_INT
188         clrl    %sp@-                   /* stk_adj */
189         pea     -1:w                    /* orig d0 */
190         movel   %d0,%sp@-               /* d0 */
191         moveml  %d1-%d5/%a0-%a2,%sp@-
192 .endm
193
194 .macro SAVE_ALL_SYS
195         clrl    %sp@-                   /* stk_adj */
196         movel   %d0,%sp@-               /* orig d0 */
197         movel   %d0,%sp@-               /* d0 */
198         moveml  %d1-%d5/%a0-%a2,%sp@-
199 .endm
200
201 .macro RESTORE_ALL
202         moveml  %sp@+,%a0-%a2/%d1-%d5
203         movel   %sp@+,%d0
204         addql   #4,%sp                  /* orig d0 */
205         addl    %sp@+,%sp               /* stk adj */
206         rte
207 .endm
208
209
210 .macro SAVE_SWITCH_STACK
211         moveml  %a3-%a6/%d6-%d7,%sp@-
212 .endm
213
214 .macro RESTORE_SWITCH_STACK
215         moveml  %sp@+,%a3-%a6/%d6-%d7
216 .endm
217
218 #endif /* !CONFIG_COLDFIRE */
219
220 /*
221  * Register %a2 is reserved and set to current task on MMU enabled systems.
222  * Non-MMU systems do not reserve %a2 in this way, and this definition is
223  * not used for them.
224  */
225 #define curptr a2
226
227 #define GET_CURRENT(tmp) get_current tmp
228 .macro get_current reg=%d0
229         movel   %sp,\reg
230         andw    #-THREAD_SIZE,\reg
231         movel   \reg,%curptr
232         movel   %curptr@,%curptr
233 .endm
234
235 #else /* C source */
236
237 #define STR(X) STR1(X)
238 #define STR1(X) #X
239
240 #define SAVE_ALL_INT                            \
241         "clrl   %%sp@-;"    /* stk_adj */       \
242         "pea    -1:w;"      /* orig d0 = -1 */  \
243         "movel  %%d0,%%sp@-;" /* d0 */          \
244         "moveml %%d1-%%d5/%%a0-%%a2,%%sp@-"
245
246 #define GET_CURRENT(tmp) \
247         "movel  %%sp,"#tmp"\n\t" \
248         "andw   #-"STR(THREAD_SIZE)","#tmp"\n\t" \
249         "movel  "#tmp",%%a2\n\t" \
250         "movel  %%a2@,%%a2"
251
252 #endif
253
254 #endif /* __M68K_ENTRY_H */