1 # 2 # $NetBSD: iskeletn.s,v 1.2 2024/05/13 00:10:06 msaitoh Exp $ 3 # 4 5 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 # MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP 7 # M68000 Hi-Performance Microprocessor Division 8 # M68060 Software Package Production Release 9 # 10 # M68060 Software Package Copyright (C) 1993, 1994, 1995, 1996 Motorola Inc. 11 # All rights reserved. 12 # 13 # THE SOFTWARE is provided on an "AS IS" basis and without warranty. 14 # To the maximum extent permitted by applicable law, 15 # MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, 16 # INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS 17 # FOR A PARTICULAR PURPOSE and any warranty against infringement with 18 # regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) 19 # and any accompanying written materials. 20 # 21 # To the maximum extent permitted by applicable law, 22 # IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER 23 # (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 24 # BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) 25 # ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. 26 # 27 # Motorola assumes no responsibility for the maintenance and support 28 # of the SOFTWARE. 29 # 30 # You are hereby granted a copyright license to use, modify, and distribute the 31 # SOFTWARE so long as this entire notice is retained without alteration 32 # in any modified and/or redistributed versions, and that such modified 33 # versions are clearly identified as such. 34 # No licenses are granted by implication, estoppel or otherwise under any 35 # patents or trademarks of Motorola, Inc. 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 38 # 39 # iskeleton.s 40 # 41 # This file contains: 42 # (1) example "Call-out"s 43 # (2) example package entry code 44 # (3) example "Call-out" table 45 # 46 47 48 ################################# 49 # (1) EXAMPLE CALL-OUTS # 50 # # 51 # _060_isp_done() # 52 # _060_real_chk() # 53 # _060_real_divbyzero() # 54 # # 55 # _060_real_cas() # 56 # _060_real_cas2() # 57 # _060_real_lock_page() # 58 # _060_real_unlock_page() # 59 ################################# 60 61 # 62 # _060_isp_done(): 63 # 64 # This is and example main exit point for the Unimplemented Integer 65 # Instruction exception handler. For a normal exit, the 66 # _isp_unimp() branches to here so that the operating system 67 # can do any clean-up desired. The stack frame is the 68 # Unimplemented Integer Instruction stack frame with 69 # the PC pointing to the instruction following the instruction 70 # just emulated. 71 # To simply continue execution at the next instruction, just 72 # do an "rte". 73 # 74 global _060_isp_done 75 _060_isp_done: 76 rte 77 78 # 79 # _060_real_chk(): 80 # 81 # This is an alternate exit point for the Unimplemented Integer 82 # Instruction exception handler. If the instruction was a "chk2" 83 # and the operand was out of bounds, then _isp_unimp() creates 84 # a CHK exception stack frame from the Unimplemented Integer Instruction 85 # stack frame and branches to this routine. 86 # 87 global _060_real_chk 88 _060_real_chk: 89 tst.b (%sp) # is tracing enabled? 90 bpl.b real_chk_end # no 91 92 # 93 # CHK FRAME TRACE FRAME 94 # ***************** ***************** 95 # * Current PC * * Current PC * 96 # ***************** ***************** 97 # * 0x2 * 0x018 * * 0x2 * 0x024 * 98 # ***************** ***************** 99 # * Next * * Next * 100 # * PC * * PC * 101 # ***************** ***************** 102 # * SR * * SR * 103 # ***************** ***************** 104 # 105 mov.b &0x24,0x7(%sp) # set trace vecno 106 bra.l _060_real_trace 107 108 real_chk_end: 109 rte 110 111 # 112 # _060_real_divbyzero: 113 # 114 # This is an alternate exit point for the Unimplemented Integer 115 # Instruction exception handler isp_unimp(). If the instruction is a 64-bit 116 # integer divide where the source operand is a zero, then the _isp_unimp() 117 # creates a Divide-by-zero exception stack frame from the Unimplemented 118 # Integer Instruction stack frame and branches to this routine. 119 # 120 # Remember that a trace exception may be pending. The code below performs 121 # no action associated with the "chk" exception. If tracing is enabled, 122 # then it create a Trace exception stack frame from the "chk" exception 123 # stack frame and branches to the _real_trace() entry point. 124 # 125 global _060_real_divbyzero 126 _060_real_divbyzero: 127 tst.b (%sp) # is tracing enabled? 128 bpl.b real_divbyzero_end # no 129 130 # 131 # DIVBYZERO FRAME TRACE FRAME 132 # ***************** ***************** 133 # * Current PC * * Current PC * 134 # ***************** ***************** 135 # * 0x2 * 0x014 * * 0x2 * 0x024 * 136 # ***************** ***************** 137 # * Next * * Next * 138 # * PC * * PC * 139 # ***************** ***************** 140 # * SR * * SR * 141 # ***************** ***************** 142 # 143 mov.b &0x24,0x7(%sp) # set trace vecno 144 bra.l _060_real_trace 145 146 real_divbyzero_end: 147 rte 148 149 ########################### 150 151 # 152 # _060_real_cas(): 153 # 154 # Entry point for the selected cas emulation code implementation. 155 # If the implementation provided by the 68060ISP is sufficient, 156 # then this routine simply re-enters the package through _isp_cas. 157 # 158 global _060_real_cas 159 _060_real_cas: 160 bra.l _I_CALL_TOP+0x80+0x08 161 162 # 163 # _060_real_cas2(): 164 # 165 # Entry point for the selected cas2 emulation code implementation. 166 # If the implementation provided by the 68060ISP is sufficient, 167 # then this routine simply re-enters the package through _isp_cas2. 168 # 169 global _060_real_cas2 170 _060_real_cas2: 171 bra.l _I_CALL_TOP+0x80+0x10 172 173 # 174 # _060_lock_page(): 175 # 176 # Entry point for the operating system's routine to "lock" a page 177 # from being paged out. This routine is needed by the cas/cas2 178 # algorithms so that no page faults occur within the "core" code 179 # region. Note: the routine must lock two pages if the operand 180 # spans two pages. 181 # NOTE: THE ROUTINE SHOULD RETURN AN FSLW VALUE IN D0 ON FAILURE 182 # SO THAT THE 060SP CAN CREATE A PROPER ACCESS ERROR FRAME. 183 # Arguments: 184 # a0 = operand address 185 # d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user 186 # d1 = `xxxxxxff -> longword; `xxxxxx00 -> word 187 # Expected outputs: 188 # d0 = 0 -> success; non-zero -> failure 189 # 190 global _060_real_lock_page 191 _060_real_lock_page: 192 clr.l %d0 193 rts 194 195 # 196 # _060_unlock_page(): 197 # 198 # Entry point for the operating system's routine to "unlock" a 199 # page that has been "locked" previously with _real_lock_page. 200 # Note: the routine must unlock two pages if the operand spans 201 # two pages. 202 # Arguments: 203 # a0 = operand address 204 # d0 = `xxxxxxff -> supervisor; `xxxxxx00 -> user 205 # d1 = `xxxxxxff -> longword; `xxxxxx00 -> word 206 # 207 global _060_real_unlock_page 208 _060_real_unlock_page: 209 clr.l %d0 210 rts 211 212 ############################################################################ 213 214 ################################## 215 # (2) EXAMPLE PACKAGE ENTRY CODE # 216 ################################## 217 218 global _060_isp_unimp 219 _060_isp_unimp: 220 bra.l _I_CALL_TOP+0x80+0x00 221 222 global _060_isp_cas 223 _060_isp_cas: 224 bra.l _I_CALL_TOP+0x80+0x08 225 226 global _060_isp_cas2 227 _060_isp_cas2: 228 bra.l _I_CALL_TOP+0x80+0x10 229 230 global _060_isp_cas_finish 231 _060_isp_cas_finish: 232 bra.l _I_CALL_TOP+0x80+0x18 233 234 global _060_isp_cas2_finish 235 _060_isp_cas2_finish: 236 bra.l _I_CALL_TOP+0x80+0x20 237 238 global _060_isp_cas_inrange 239 _060_isp_cas_inrange: 240 bra.l _I_CALL_TOP+0x80+0x28 241 242 global _060_isp_cas_terminate 243 _060_isp_cas_terminate: 244 bra.l _I_CALL_TOP+0x80+0x30 245 246 global _060_isp_cas_restart 247 _060_isp_cas_restart: 248 bra.l _I_CALL_TOP+0x80+0x38 249 250 ############################################################################ 251 252 ################################ 253 # (3) EXAMPLE CALL-OUT SECTION # 254 ################################ 255 256 # The size of this section MUST be 128 bytes!!! 257 258 global _I_CALL_TOP 259 _I_CALL_TOP: 260 long _060_real_chk - _I_CALL_TOP 261 long _060_real_divbyzero - _I_CALL_TOP 262 long _060_real_trace - _I_CALL_TOP 263 long _060_real_access - _I_CALL_TOP 264 long _060_isp_done - _I_CALL_TOP 265 266 long _060_real_cas - _I_CALL_TOP 267 long _060_real_cas2 - _I_CALL_TOP 268 long _060_real_lock_page - _I_CALL_TOP 269 long _060_real_unlock_page - _I_CALL_TOP 270 271 long 0x00000000, 0x00000000, 0x00000000, 0x00000000 272 long 0x00000000, 0x00000000, 0x00000000 273 274 long _060_imem_read - _I_CALL_TOP 275 long _060_dmem_read - _I_CALL_TOP 276 long _060_dmem_write - _I_CALL_TOP 277 long _060_imem_read_word - _I_CALL_TOP 278 long _060_imem_read_long - _I_CALL_TOP 279 long _060_dmem_read_byte - _I_CALL_TOP 280 long _060_dmem_read_word - _I_CALL_TOP 281 long _060_dmem_read_long - _I_CALL_TOP 282 long _060_dmem_write_byte - _I_CALL_TOP 283 long _060_dmem_write_word - _I_CALL_TOP 284 long _060_dmem_write_long - _I_CALL_TOP 285 286 long 0x00000000 287 long 0x00000000, 0x00000000, 0x00000000, 0x00000000 288 289 ############################################################################ 290 291 # 060 INTEGER KERNEL PACKAGE MUST GO HERE!!! 292