| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | | | 
| Jan Engelhardt | 96de0e2 | 2007-10-19 23:21:04 +0200 | [diff] [blame] | 7 | |M68060 Software Package Copyright © 1993, 1994 Motorola Inc.  All rights reserved. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> | 
| Sam Ravnborg | 0013a85 | 2005-09-09 20:57:26 +0200 | [diff] [blame] | 39 | #include <asm/asm-offsets.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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) | 
| Roman Zippel | 3b66a1e | 2005-11-13 16:06:59 -0800 | [diff] [blame] | 78 | | deliver signals, reschedule etc.. | 
|  | 79 | jra	ret_from_exception | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 80 |  | 
|  | 81 | | | 
|  | 82 | | _060_real_chk(): | 
|  | 83 | | | 
|  | 84 | | This is an alternate exit point for the Unimplemented Integer | 
|  | 85 | | Instruction exception handler. If the instruction was a "chk2" | 
|  | 86 | | and the operand was out of bounds, then _isp_unimp() creates | 
|  | 87 | | a CHK exception stack frame from the Unimplemented Integer Instrcution | 
|  | 88 | | stack frame and branches to this routine. | 
|  | 89 | | | 
|  | 90 | | Linux/68k: commented out test for tracing | 
|  | 91 |  | 
|  | 92 | .global		_060_real_chk | 
|  | 93 | _060_real_chk: | 
|  | 94 | |	tst.b		(%sp)			| is tracing enabled? | 
|  | 95 | |	bpls		real_chk_end		| no | 
|  | 96 |  | 
|  | 97 | | | 
|  | 98 | |	    CHK FRAME		   TRACE FRAME | 
|  | 99 | |	*****************	***************** | 
|  | 100 | |	*   Current PC	*	*   Current PC	* | 
|  | 101 | |	*****************	***************** | 
|  | 102 | |	* 0x2 *  0x018	*	* 0x2 *  0x024	* | 
|  | 103 | |	*****************	***************** | 
|  | 104 | |	*     Next	*	*     Next	* | 
|  | 105 | |	*      PC	*	*      PC	* | 
|  | 106 | |	*****************	***************** | 
|  | 107 | |	*      SR	*	*      SR	* | 
|  | 108 | |	*****************	***************** | 
|  | 109 | | | 
|  | 110 | |	move.b		#0x24,0x7(%sp)		| set trace vecno | 
|  | 111 | |	bral		_060_real_trace | 
|  | 112 |  | 
|  | 113 | real_chk_end: | 
|  | 114 | bral		trap			| jump to trap handler | 
|  | 115 |  | 
|  | 116 | | | 
|  | 117 | | _060_real_divbyzero: | 
|  | 118 | | | 
|  | 119 | | This is an alternate exit point for the Unimplemented Integer | 
|  | 120 | | Instruction exception handler isp_unimp(). If the instruction is a 64-bit | 
|  | 121 | | integer divide where the source operand is a zero, then the _isp_unimp() | 
|  | 122 | | creates a Divide-by-zero exception stack frame from the Unimplemented | 
|  | 123 | | Integer Instruction stack frame and branches to this routine. | 
|  | 124 | | | 
|  | 125 | | Remember that a trace exception may be pending. The code below performs | 
|  | 126 | | no action associated with the "chk" exception. If tracing is enabled, | 
|  | 127 | | then it create a Trace exception stack frame from the "chk" exception | 
|  | 128 | | stack frame and branches to the _real_trace() entry point. | 
|  | 129 | | | 
|  | 130 | | Linux/68k: commented out test for tracing | 
|  | 131 |  | 
|  | 132 | .global		_060_real_divbyzero | 
|  | 133 | _060_real_divbyzero: | 
|  | 134 | |	tst.b		(%sp)			| is tracing enabled? | 
|  | 135 | |	bpls		real_divbyzero_end	| no | 
|  | 136 |  | 
|  | 137 | | | 
|  | 138 | |	 DIVBYZERO FRAME	   TRACE FRAME | 
|  | 139 | |	*****************	***************** | 
|  | 140 | |	*   Current PC	*	*   Current PC	* | 
|  | 141 | |	*****************	***************** | 
|  | 142 | |	* 0x2 *  0x014	*	* 0x2 *  0x024	* | 
|  | 143 | |	*****************	***************** | 
|  | 144 | |	*     Next	*	*     Next	* | 
|  | 145 | |	*      PC	*	*      PC	* | 
|  | 146 | |	*****************	***************** | 
|  | 147 | |	*      SR	*	*      SR	* | 
|  | 148 | |	*****************	***************** | 
|  | 149 | | | 
|  | 150 | |	move.b		#0x24,0x7(%sp)		| set trace vecno | 
|  | 151 | |	bral		_060_real_trace | 
|  | 152 |  | 
|  | 153 | real_divbyzero_end: | 
|  | 154 | bral		trap			| jump to trap handler | 
|  | 155 |  | 
|  | 156 | |########################## | 
|  | 157 |  | 
|  | 158 | | | 
|  | 159 | | _060_real_cas(): | 
|  | 160 | | | 
|  | 161 | | Entry point for the selected cas emulation code implementation. | 
|  | 162 | | If the implementation provided by the 68060ISP is sufficient, | 
|  | 163 | | then this routine simply re-enters the package through _isp_cas. | 
|  | 164 | | | 
|  | 165 | .global		_060_real_cas | 
|  | 166 | _060_real_cas: | 
|  | 167 | bral		_I_CALL_TOP+0x80+0x08 | 
|  | 168 |  | 
|  | 169 | | | 
|  | 170 | | _060_real_cas2(): | 
|  | 171 | | | 
|  | 172 | | Entry point for the selected cas2 emulation code implementation. | 
|  | 173 | | If the implementation provided by the 68060ISP is sufficient, | 
|  | 174 | | then this routine simply re-enters the package through _isp_cas2. | 
|  | 175 | | | 
|  | 176 | .global		_060_real_cas2 | 
|  | 177 | _060_real_cas2: | 
|  | 178 | bral		_I_CALL_TOP+0x80+0x10 | 
|  | 179 |  | 
|  | 180 | | | 
|  | 181 | | _060_lock_page(): | 
|  | 182 | | | 
|  | 183 | | Entry point for the operating system`s routine to "lock" a page | 
|  | 184 | | from being paged out. This routine is needed by the cas/cas2 | 
|  | 185 | | algorithms so that no page faults occur within the "core" code | 
|  | 186 | | region. Note: the routine must lock two pages if the operand | 
|  | 187 | | spans two pages. | 
|  | 188 | | NOTE: THE ROUTINE SHOULD RETURN AN FSLW VALUE IN D0 ON FAILURE | 
|  | 189 | | SO THAT THE 060SP CAN CREATE A PROPER ACCESS ERROR FRAME. | 
|  | 190 | | Arguments: | 
|  | 191 | |	a0 = operand address | 
|  | 192 | |	d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user | 
|  | 193 | |	d1 = `xxxxxxff -> longword; `xxxxxx00 -> word | 
|  | 194 | | Expected outputs: | 
|  | 195 | |	d0 = 0 -> success; non-zero -> failure | 
|  | 196 | | | 
|  | 197 | | Linux/m68k: Make sure the page is properly paged in, so we use | 
|  | 198 | | plpaw and handle any exception here. The kernel must not be | 
|  | 199 | | preempted until _060_unlock_page(), so that the page stays mapped. | 
|  | 200 | | | 
|  | 201 | .global		_060_real_lock_page | 
|  | 202 | _060_real_lock_page: | 
|  | 203 | move.l	%d2,-(%sp) | 
|  | 204 | | load sfc/dfc | 
|  | 205 | tst.b	%d0 | 
|  | 206 | jne	1f | 
|  | 207 | moveq	#1,%d0 | 
|  | 208 | jra	2f | 
|  | 209 | 1:	moveq	#5,%d0 | 
|  | 210 | 2:	movec.l	%dfc,%d2 | 
|  | 211 | movec.l	%d0,%dfc | 
|  | 212 | movec.l	%d0,%sfc | 
|  | 213 |  | 
|  | 214 | clr.l	%d0 | 
|  | 215 | | prefetch address | 
|  | 216 | .chip	68060 | 
|  | 217 | move.l	%a0,%a1 | 
|  | 218 | 1:	plpaw	(%a1) | 
|  | 219 | addq.w	#1,%a0 | 
|  | 220 | tst.b	%d1 | 
|  | 221 | jeq	2f | 
|  | 222 | addq.w	#2,%a0 | 
|  | 223 | 2:	plpaw	(%a0) | 
|  | 224 | 3:	.chip	68k | 
|  | 225 |  | 
|  | 226 | | restore sfc/dfc | 
|  | 227 | movec.l	%d2,%dfc | 
|  | 228 | movec.l	%d2,%sfc | 
|  | 229 | move.l	(%sp)+,%d2 | 
|  | 230 | rts | 
|  | 231 |  | 
|  | 232 | .section __ex_table,"a" | 
|  | 233 | .align	4 | 
|  | 234 | .long	1b,11f | 
|  | 235 | .long	2b,21f | 
|  | 236 | .previous | 
|  | 237 | .section .fixup,"ax" | 
|  | 238 | .even | 
|  | 239 | 11:	move.l	#0x020003c0,%d0 | 
|  | 240 | or.l	%d2,%d0 | 
|  | 241 | swap	%d0 | 
|  | 242 | jra	3b | 
|  | 243 | 21:	move.l	#0x02000bc0,%d0 | 
|  | 244 | or.l	%d2,%d0 | 
|  | 245 | swap	%d0 | 
|  | 246 | jra	3b | 
|  | 247 | .previous | 
|  | 248 |  | 
|  | 249 | | | 
|  | 250 | | _060_unlock_page(): | 
|  | 251 | | | 
|  | 252 | | Entry point for the operating system`s routine to "unlock" a | 
|  | 253 | | page that has been "locked" previously with _real_lock_page. | 
|  | 254 | | Note: the routine must unlock two pages if the operand spans | 
|  | 255 | | two pages. | 
|  | 256 | | Arguments: | 
|  | 257 | |	a0 = operand address | 
|  | 258 | |	d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user | 
|  | 259 | |	d1 = `xxxxxxff -> longword; `xxxxxx00 -> word | 
|  | 260 | | | 
|  | 261 | | Linux/m68k: perhaps reenable preemption here... | 
|  | 262 |  | 
|  | 263 | .global		_060_real_unlock_page | 
|  | 264 | _060_real_unlock_page: | 
|  | 265 | clr.l		%d0 | 
|  | 266 | rts | 
|  | 267 |  | 
|  | 268 | |########################################################################### | 
|  | 269 |  | 
|  | 270 | |################################# | 
|  | 271 | | (2) EXAMPLE PACKAGE ENTRY CODE # | 
|  | 272 | |################################# | 
|  | 273 |  | 
|  | 274 | .global		_060_isp_unimp | 
|  | 275 | _060_isp_unimp: | 
|  | 276 | bral		_I_CALL_TOP+0x80+0x00 | 
|  | 277 |  | 
|  | 278 | .global		_060_isp_cas | 
|  | 279 | _060_isp_cas: | 
|  | 280 | bral		_I_CALL_TOP+0x80+0x08 | 
|  | 281 |  | 
|  | 282 | .global		_060_isp_cas2 | 
|  | 283 | _060_isp_cas2: | 
|  | 284 | bral		_I_CALL_TOP+0x80+0x10 | 
|  | 285 |  | 
|  | 286 | .global		_060_isp_cas_finish | 
|  | 287 | _060_isp_cas_finish: | 
|  | 288 | bra.l		_I_CALL_TOP+0x80+0x18 | 
|  | 289 |  | 
|  | 290 | .global		_060_isp_cas2_finish | 
|  | 291 | _060_isp_cas2_finish: | 
|  | 292 | bral		_I_CALL_TOP+0x80+0x20 | 
|  | 293 |  | 
|  | 294 | .global		_060_isp_cas_inrange | 
|  | 295 | _060_isp_cas_inrange: | 
|  | 296 | bral		_I_CALL_TOP+0x80+0x28 | 
|  | 297 |  | 
|  | 298 | .global		_060_isp_cas_terminate | 
|  | 299 | _060_isp_cas_terminate: | 
|  | 300 | bral		_I_CALL_TOP+0x80+0x30 | 
|  | 301 |  | 
|  | 302 | .global		_060_isp_cas_restart | 
|  | 303 | _060_isp_cas_restart: | 
|  | 304 | bral		_I_CALL_TOP+0x80+0x38 | 
|  | 305 |  | 
|  | 306 | |########################################################################### | 
|  | 307 |  | 
|  | 308 | |############################### | 
|  | 309 | | (3) EXAMPLE CALL-OUT SECTION # | 
|  | 310 | |############################### | 
|  | 311 |  | 
|  | 312 | | The size of this section MUST be 128 bytes!!! | 
|  | 313 |  | 
|  | 314 | _I_CALL_TOP: | 
|  | 315 | .long	_060_real_chk		- _I_CALL_TOP | 
|  | 316 | .long	_060_real_divbyzero	- _I_CALL_TOP | 
|  | 317 | .long	_060_real_trace		- _I_CALL_TOP | 
|  | 318 | .long	_060_real_access	- _I_CALL_TOP | 
|  | 319 | .long	_060_isp_done		- _I_CALL_TOP | 
|  | 320 |  | 
|  | 321 | .long	_060_real_cas		- _I_CALL_TOP | 
|  | 322 | .long	_060_real_cas2		- _I_CALL_TOP | 
|  | 323 | .long	_060_real_lock_page	- _I_CALL_TOP | 
|  | 324 | .long	_060_real_unlock_page	- _I_CALL_TOP | 
|  | 325 |  | 
|  | 326 | .long	0x00000000, 0x00000000, 0x00000000, 0x00000000 | 
|  | 327 | .long	0x00000000, 0x00000000, 0x00000000 | 
|  | 328 |  | 
|  | 329 | .long	_060_imem_read		- _I_CALL_TOP | 
|  | 330 | .long	_060_dmem_read		- _I_CALL_TOP | 
|  | 331 | .long	_060_dmem_write		- _I_CALL_TOP | 
|  | 332 | .long	_060_imem_read_word	- _I_CALL_TOP | 
|  | 333 | .long	_060_imem_read_long	- _I_CALL_TOP | 
|  | 334 | .long	_060_dmem_read_byte	- _I_CALL_TOP | 
|  | 335 | .long	_060_dmem_read_word	- _I_CALL_TOP | 
|  | 336 | .long	_060_dmem_read_long	- _I_CALL_TOP | 
|  | 337 | .long	_060_dmem_write_byte	- _I_CALL_TOP | 
|  | 338 | .long	_060_dmem_write_word	- _I_CALL_TOP | 
|  | 339 | .long	_060_dmem_write_long	- _I_CALL_TOP | 
|  | 340 |  | 
|  | 341 | .long	0x00000000 | 
|  | 342 | .long	0x00000000, 0x00000000, 0x00000000, 0x00000000 | 
|  | 343 |  | 
|  | 344 | |########################################################################### | 
|  | 345 |  | 
|  | 346 | | 060 INTEGER KERNEL PACKAGE MUST GO HERE!!! | 
|  | 347 | #include "isp.sa" |