Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/m68k/include/asm/entry.h
26481 views
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 __ASSEMBLER__
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 __ASSEMBLER__
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 */
262
263