diff options
Diffstat (limited to 'arch/m68k/ifpsp060/iskeleton.S')
-rw-r--r-- | arch/m68k/ifpsp060/iskeleton.S | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/arch/m68k/ifpsp060/iskeleton.S b/arch/m68k/ifpsp060/iskeleton.S new file mode 100644 index 000000000000..803a6ecdda81 --- /dev/null +++ b/arch/m68k/ifpsp060/iskeleton.S | |||
@@ -0,0 +1,349 @@ | |||
1 | |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
2 | |MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP | ||
3 | |M68000 Hi-Performance Microprocessor Division | ||
4 | |M68060 Software Package | ||
5 | |Production Release P1.00 -- October 10, 1994 | ||
6 | | | ||
7 | |M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved. | ||
8 | | | ||
9 | |THE SOFTWARE is provided on an "AS IS" basis and without warranty. | ||
10 | |To the maximum extent permitted by applicable law, | ||
11 | |MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, | ||
12 | |INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE | ||
13 | |and any warranty against infringement with regard to the SOFTWARE | ||
14 | |(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials. | ||
15 | | | ||
16 | |To the maximum extent permitted by applicable law, | ||
17 | |IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER | ||
18 | |(INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, | ||
19 | |BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) | ||
20 | |ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. | ||
21 | |Motorola assumes no responsibility for the maintenance and support of the SOFTWARE. | ||
22 | | | ||
23 | |You are hereby granted a copyright license to use, modify, and distribute the SOFTWARE | ||
24 | |so long as this entire notice is retained without alteration in any modified and/or | ||
25 | |redistributed versions, and that such modified versions are clearly identified as such. | ||
26 | |No licenses are granted by implication, estoppel or otherwise under any patents | ||
27 | |or trademarks of Motorola, Inc. | ||
28 | |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
29 | | iskeleton.s | ||
30 | | | ||
31 | | This file contains: | ||
32 | | (1) example "Call-out"s | ||
33 | | (2) example package entry code | ||
34 | | (3) example "Call-out" table | ||
35 | | | ||
36 | |||
37 | #include <linux/linkage.h> | ||
38 | #include <asm/entry.h> | ||
39 | #include <asm/offsets.h> | ||
40 | |||
41 | |||
42 | |################################ | ||
43 | | (1) EXAMPLE CALL-OUTS # | ||
44 | | # | ||
45 | | _060_isp_done() # | ||
46 | | _060_real_chk() # | ||
47 | | _060_real_divbyzero() # | ||
48 | | # | ||
49 | | _060_real_cas() # | ||
50 | | _060_real_cas2() # | ||
51 | | _060_real_lock_page() # | ||
52 | | _060_real_unlock_page() # | ||
53 | |################################ | ||
54 | |||
55 | | | ||
56 | | _060_isp_done(): | ||
57 | | | ||
58 | | This is and example main exit point for the Unimplemented Integer | ||
59 | | Instruction exception handler. For a normal exit, the | ||
60 | | _isp_unimp() branches to here so that the operating system | ||
61 | | can do any clean-up desired. The stack frame is the | ||
62 | | Unimplemented Integer Instruction stack frame with | ||
63 | | the PC pointing to the instruction following the instruction | ||
64 | | just emulated. | ||
65 | | To simply continue execution at the next instruction, just | ||
66 | | do an "rte". | ||
67 | | | ||
68 | | Linux/68k: If returning to user space, check for needed reselections. | ||
69 | |||
70 | .global _060_isp_done | ||
71 | _060_isp_done: | ||
72 | btst #0x5,%sp@ | supervisor bit set in saved SR? | ||
73 | beq .Lnotkern | ||
74 | rte | ||
75 | .Lnotkern: | ||
76 | SAVE_ALL_INT | ||
77 | GET_CURRENT(%d0) | ||
78 | tstb %curptr@(TASK_NEEDRESCHED) | ||
79 | jne ret_from_exception | deliver signals, | ||
80 | | reschedule etc.. | ||
81 | RESTORE_ALL | ||
82 | |||
83 | | | ||
84 | | _060_real_chk(): | ||
85 | | | ||
86 | | This is an alternate exit point for the Unimplemented Integer | ||
87 | | Instruction exception handler. If the instruction was a "chk2" | ||
88 | | and the operand was out of bounds, then _isp_unimp() creates | ||
89 | | a CHK exception stack frame from the Unimplemented Integer Instrcution | ||
90 | | stack frame and branches to this routine. | ||
91 | | | ||
92 | | Linux/68k: commented out test for tracing | ||
93 | |||
94 | .global _060_real_chk | ||
95 | _060_real_chk: | ||
96 | | tst.b (%sp) | is tracing enabled? | ||
97 | | bpls real_chk_end | no | ||
98 | |||
99 | | | ||
100 | | CHK FRAME TRACE FRAME | ||
101 | | ***************** ***************** | ||
102 | | * Current PC * * Current PC * | ||
103 | | ***************** ***************** | ||
104 | | * 0x2 * 0x018 * * 0x2 * 0x024 * | ||
105 | | ***************** ***************** | ||
106 | | * Next * * Next * | ||
107 | | * PC * * PC * | ||
108 | | ***************** ***************** | ||
109 | | * SR * * SR * | ||
110 | | ***************** ***************** | ||
111 | | | ||
112 | | move.b #0x24,0x7(%sp) | set trace vecno | ||
113 | | bral _060_real_trace | ||
114 | |||
115 | real_chk_end: | ||
116 | bral trap | jump to trap handler | ||
117 | |||
118 | | | ||
119 | | _060_real_divbyzero: | ||
120 | | | ||
121 | | This is an alternate exit point for the Unimplemented Integer | ||
122 | | Instruction exception handler isp_unimp(). If the instruction is a 64-bit | ||
123 | | integer divide where the source operand is a zero, then the _isp_unimp() | ||
124 | | creates a Divide-by-zero exception stack frame from the Unimplemented | ||
125 | | Integer Instruction stack frame and branches to this routine. | ||
126 | | | ||
127 | | Remember that a trace exception may be pending. The code below performs | ||
128 | | no action associated with the "chk" exception. If tracing is enabled, | ||
129 | | then it create a Trace exception stack frame from the "chk" exception | ||
130 | | stack frame and branches to the _real_trace() entry point. | ||
131 | | | ||
132 | | Linux/68k: commented out test for tracing | ||
133 | |||
134 | .global _060_real_divbyzero | ||
135 | _060_real_divbyzero: | ||
136 | | tst.b (%sp) | is tracing enabled? | ||
137 | | bpls real_divbyzero_end | no | ||
138 | |||
139 | | | ||
140 | | DIVBYZERO FRAME TRACE FRAME | ||
141 | | ***************** ***************** | ||
142 | | * Current PC * * Current PC * | ||
143 | | ***************** ***************** | ||
144 | | * 0x2 * 0x014 * * 0x2 * 0x024 * | ||
145 | | ***************** ***************** | ||
146 | | * Next * * Next * | ||
147 | | * PC * * PC * | ||
148 | | ***************** ***************** | ||
149 | | * SR * * SR * | ||
150 | | ***************** ***************** | ||
151 | | | ||
152 | | move.b #0x24,0x7(%sp) | set trace vecno | ||
153 | | bral _060_real_trace | ||
154 | |||
155 | real_divbyzero_end: | ||
156 | bral trap | jump to trap handler | ||
157 | |||
158 | |########################## | ||
159 | |||
160 | | | ||
161 | | _060_real_cas(): | ||
162 | | | ||
163 | | Entry point for the selected cas emulation code implementation. | ||
164 | | If the implementation provided by the 68060ISP is sufficient, | ||
165 | | then this routine simply re-enters the package through _isp_cas. | ||
166 | | | ||
167 | .global _060_real_cas | ||
168 | _060_real_cas: | ||
169 | bral _I_CALL_TOP+0x80+0x08 | ||
170 | |||
171 | | | ||
172 | | _060_real_cas2(): | ||
173 | | | ||
174 | | Entry point for the selected cas2 emulation code implementation. | ||
175 | | If the implementation provided by the 68060ISP is sufficient, | ||
176 | | then this routine simply re-enters the package through _isp_cas2. | ||
177 | | | ||
178 | .global _060_real_cas2 | ||
179 | _060_real_cas2: | ||
180 | bral _I_CALL_TOP+0x80+0x10 | ||
181 | |||
182 | | | ||
183 | | _060_lock_page(): | ||
184 | | | ||
185 | | Entry point for the operating system`s routine to "lock" a page | ||
186 | | from being paged out. This routine is needed by the cas/cas2 | ||
187 | | algorithms so that no page faults occur within the "core" code | ||
188 | | region. Note: the routine must lock two pages if the operand | ||
189 | | spans two pages. | ||
190 | | NOTE: THE ROUTINE SHOULD RETURN AN FSLW VALUE IN D0 ON FAILURE | ||
191 | | SO THAT THE 060SP CAN CREATE A PROPER ACCESS ERROR FRAME. | ||
192 | | Arguments: | ||
193 | | a0 = operand address | ||
194 | | d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user | ||
195 | | d1 = `xxxxxxff -> longword; `xxxxxx00 -> word | ||
196 | | Expected outputs: | ||
197 | | d0 = 0 -> success; non-zero -> failure | ||
198 | | | ||
199 | | Linux/m68k: Make sure the page is properly paged in, so we use | ||
200 | | plpaw and handle any exception here. The kernel must not be | ||
201 | | preempted until _060_unlock_page(), so that the page stays mapped. | ||
202 | | | ||
203 | .global _060_real_lock_page | ||
204 | _060_real_lock_page: | ||
205 | move.l %d2,-(%sp) | ||
206 | | load sfc/dfc | ||
207 | tst.b %d0 | ||
208 | jne 1f | ||
209 | moveq #1,%d0 | ||
210 | jra 2f | ||
211 | 1: moveq #5,%d0 | ||
212 | 2: movec.l %dfc,%d2 | ||
213 | movec.l %d0,%dfc | ||
214 | movec.l %d0,%sfc | ||
215 | |||
216 | clr.l %d0 | ||
217 | | prefetch address | ||
218 | .chip 68060 | ||
219 | move.l %a0,%a1 | ||
220 | 1: plpaw (%a1) | ||
221 | addq.w #1,%a0 | ||
222 | tst.b %d1 | ||
223 | jeq 2f | ||
224 | addq.w #2,%a0 | ||
225 | 2: plpaw (%a0) | ||
226 | 3: .chip 68k | ||
227 | |||
228 | | restore sfc/dfc | ||
229 | movec.l %d2,%dfc | ||
230 | movec.l %d2,%sfc | ||
231 | move.l (%sp)+,%d2 | ||
232 | rts | ||
233 | |||
234 | .section __ex_table,"a" | ||
235 | .align 4 | ||
236 | .long 1b,11f | ||
237 | .long 2b,21f | ||
238 | .previous | ||
239 | .section .fixup,"ax" | ||
240 | .even | ||
241 | 11: move.l #0x020003c0,%d0 | ||
242 | or.l %d2,%d0 | ||
243 | swap %d0 | ||
244 | jra 3b | ||
245 | 21: move.l #0x02000bc0,%d0 | ||
246 | or.l %d2,%d0 | ||
247 | swap %d0 | ||
248 | jra 3b | ||
249 | .previous | ||
250 | |||
251 | | | ||
252 | | _060_unlock_page(): | ||
253 | | | ||
254 | | Entry point for the operating system`s routine to "unlock" a | ||
255 | | page that has been "locked" previously with _real_lock_page. | ||
256 | | Note: the routine must unlock two pages if the operand spans | ||
257 | | two pages. | ||
258 | | Arguments: | ||
259 | | a0 = operand address | ||
260 | | d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user | ||
261 | | d1 = `xxxxxxff -> longword; `xxxxxx00 -> word | ||
262 | | | ||
263 | | Linux/m68k: perhaps reenable preemption here... | ||
264 | |||
265 | .global _060_real_unlock_page | ||
266 | _060_real_unlock_page: | ||
267 | clr.l %d0 | ||
268 | rts | ||
269 | |||
270 | |########################################################################### | ||
271 | |||
272 | |################################# | ||
273 | | (2) EXAMPLE PACKAGE ENTRY CODE # | ||
274 | |################################# | ||
275 | |||
276 | .global _060_isp_unimp | ||
277 | _060_isp_unimp: | ||
278 | bral _I_CALL_TOP+0x80+0x00 | ||
279 | |||
280 | .global _060_isp_cas | ||
281 | _060_isp_cas: | ||
282 | bral _I_CALL_TOP+0x80+0x08 | ||
283 | |||
284 | .global _060_isp_cas2 | ||
285 | _060_isp_cas2: | ||
286 | bral _I_CALL_TOP+0x80+0x10 | ||
287 | |||
288 | .global _060_isp_cas_finish | ||
289 | _060_isp_cas_finish: | ||
290 | bra.l _I_CALL_TOP+0x80+0x18 | ||
291 | |||
292 | .global _060_isp_cas2_finish | ||
293 | _060_isp_cas2_finish: | ||
294 | bral _I_CALL_TOP+0x80+0x20 | ||
295 | |||
296 | .global _060_isp_cas_inrange | ||
297 | _060_isp_cas_inrange: | ||
298 | bral _I_CALL_TOP+0x80+0x28 | ||
299 | |||
300 | .global _060_isp_cas_terminate | ||
301 | _060_isp_cas_terminate: | ||
302 | bral _I_CALL_TOP+0x80+0x30 | ||
303 | |||
304 | .global _060_isp_cas_restart | ||
305 | _060_isp_cas_restart: | ||
306 | bral _I_CALL_TOP+0x80+0x38 | ||
307 | |||
308 | |########################################################################### | ||
309 | |||
310 | |############################### | ||
311 | | (3) EXAMPLE CALL-OUT SECTION # | ||
312 | |############################### | ||
313 | |||
314 | | The size of this section MUST be 128 bytes!!! | ||
315 | |||
316 | _I_CALL_TOP: | ||
317 | .long _060_real_chk - _I_CALL_TOP | ||
318 | .long _060_real_divbyzero - _I_CALL_TOP | ||
319 | .long _060_real_trace - _I_CALL_TOP | ||
320 | .long _060_real_access - _I_CALL_TOP | ||
321 | .long _060_isp_done - _I_CALL_TOP | ||
322 | |||
323 | .long _060_real_cas - _I_CALL_TOP | ||
324 | .long _060_real_cas2 - _I_CALL_TOP | ||
325 | .long _060_real_lock_page - _I_CALL_TOP | ||
326 | .long _060_real_unlock_page - _I_CALL_TOP | ||
327 | |||
328 | .long 0x00000000, 0x00000000, 0x00000000, 0x00000000 | ||
329 | .long 0x00000000, 0x00000000, 0x00000000 | ||
330 | |||
331 | .long _060_imem_read - _I_CALL_TOP | ||
332 | .long _060_dmem_read - _I_CALL_TOP | ||
333 | .long _060_dmem_write - _I_CALL_TOP | ||
334 | .long _060_imem_read_word - _I_CALL_TOP | ||
335 | .long _060_imem_read_long - _I_CALL_TOP | ||
336 | .long _060_dmem_read_byte - _I_CALL_TOP | ||
337 | .long _060_dmem_read_word - _I_CALL_TOP | ||
338 | .long _060_dmem_read_long - _I_CALL_TOP | ||
339 | .long _060_dmem_write_byte - _I_CALL_TOP | ||
340 | .long _060_dmem_write_word - _I_CALL_TOP | ||
341 | .long _060_dmem_write_long - _I_CALL_TOP | ||
342 | |||
343 | .long 0x00000000 | ||
344 | .long 0x00000000, 0x00000000, 0x00000000, 0x00000000 | ||
345 | |||
346 | |########################################################################### | ||
347 | |||
348 | | 060 INTEGER KERNEL PACKAGE MUST GO HERE!!! | ||
349 | #include "isp.sa" | ||