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