]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - arch/m68k/include/asm/entry.h
Merge remote-tracking branches 'spi/topic/omap-uwire', 'spi/topic/omap100k', 'spi...
[mirror_ubuntu-bionic-kernel.git] / arch / m68k / include / asm / entry.h
CommitLineData
61619b12
GU
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)
c6636005
MP
36 /* block out HSYNC = ipl 2 on the atari */
37#define ALLOWINT (~0x500)
49148020 38#else
61619b12
GU
39 /* portable version */
40#define ALLOWINT (~0x700)
61619b12
GU
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 */
bbc6f1ba
GU
223#ifdef CONFIG_MMU
224
61619b12
GU
225#define curptr a2
226
227#define GET_CURRENT(tmp) get_current tmp
228.macro get_current reg=%d0
229 movel %sp,\reg
bbc6f1ba 230 andl #-THREAD_SIZE,\reg
61619b12
GU
231 movel \reg,%curptr
232 movel %curptr@,%curptr
233.endm
234
bbc6f1ba
GU
235#else
236
237#define GET_CURRENT(tmp)
238
239#endif /* CONFIG_MMU */
240
61619b12
GU
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
49148020 258#endif
61619b12
GU
259
260#endif /* __M68K_ENTRY_H */