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