1 /* 2 # 3 # $NetBSD: inetbsd.S,v 1.5 2024/05/13 00:10:06 msaitoh Exp $ 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 # Derived from: 38 # iskeleton.s 39 # 40 # This file contains: 41 # (1) example "Call-out"s 42 # (2) example package entry code 43 # (3) example "Call-out" table 44 # 45 46 47 ################################# 48 # (1) EXAMPLE CALL-OUTS # 49 # # 50 # _060_isp_done() # 51 # _060_real_chk() # 52 # _060_real_divbyzero() # 53 # # 54 # _060_real_cas() # 55 # _060_real_cas2() # 56 # _060_real_lock_page() # 57 # _060_real_unlock_page() # 58 ################################# 59 */ 60 61 /* 62 # 63 # _060_isp_done(): 64 # 65 # This is and example main exit point for the Unimplemented Integer 66 # Instruction exception handler. For a normal exit, the 67 # _isp_unimp() branches to here so that the operating system 68 # can do any clean-up desired. The stack frame is the 69 # Unimplemented Integer Instruction stack frame with 70 # the PC pointing to the instruction following the instruction 71 # just emulated. 72 # To simply continue execution at the next instruction, just 73 # do an "rte". 74 # 75 */ 76 ASENTRY_NOPROFILE(_060_isp_done) 77 rte 78 79 /* 80 # 81 # _060_real_chk(): 82 # 83 # This is an alternate exit point for the Unimplemented Integer 84 # Instruction exception handler. If the instruction was a "chk2" 85 # and the operand was out of bounds, then _isp_unimp() creates 86 # a CHK exception stack frame from the Unimplemented Integer Instruction 87 # stack frame and branches to this routine. 88 # 89 */ 90 ASENTRY_NOPROFILE(_060_real_chk) 91 tstb %sp@ |# is tracing enabled? 92 bpls real_chk_end |# no 93 94 /* 95 # 96 # CHK FRAME TRACE FRAME 97 # ***************** ***************** 98 # * Current PC * * Current PC * 99 # ***************** ***************** 100 # * 0x2 * 0x018 * * 0x2 * 0x024 * 101 # ***************** ***************** 102 # * Next * * Next * 103 # * PC * * PC * 104 # ***************** ***************** 105 # * SR * * SR * 106 # ***************** ***************** 107 # 108 */ 109 moveb #0x24,%sp@(0x7) |# set trace vecno 110 bral _ASM_LABEL(_060_real_trace) 111 112 real_chk_end: 113 jmp _C_LABEL(chkinst) 114 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 */ 131 ASENTRY_NOPROFILE(_060_real_divbyzero) 132 tstb %sp@ |# is tracing enabled? 133 bpls real_divbyzero_end |# no 134 135 /* 136 # 137 # DIVBYZERO FRAME TRACE FRAME 138 # ***************** ***************** 139 # * Current PC * * Current PC * 140 # ***************** ***************** 141 # * 0x2 * 0x014 * * 0x2 * 0x024 * 142 # ***************** ***************** 143 # * Next * * Next * 144 # * PC * * PC * 145 # ***************** ***************** 146 # * SR * * SR * 147 # ***************** ***************** 148 # 149 */ 150 moveb #0x24,%sp@(0x7) |# set trace vecno 151 bral _ASM_LABEL(_060_real_trace) 152 153 real_divbyzero_end: 154 jmp _C_LABEL(zerodiv) 155 156 |########################### 157 158 /* 159 # 160 # _060_real_cas(): 161 # 162 # Entry point for the selected cas emulation code implementation. 163 # If the implementation provided by the 68060ISP is sufficient, 164 # then this routine simply re-enters the package through _isp_cas. 165 # 166 */ 167 ASENTRY_NOPROFILE(_060_real_cas) 168 bral _C_LABEL(I_CALL_TOP)+0x80+0x08 169 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 */ 179 ASENTRY_NOPROFILE(_060_real_cas2) 180 bral _C_LABEL(I_CALL_TOP)+0x80+0x10 181 182 /* 183 # 184 # _060_lock_page(): 185 # 186 # Entry point for the operating system's routine to "lock" a page 187 # from being paged out. This routine is needed by the cas/cas2 188 # algorithms so that no page faults occur within the "core" code 189 # region. Note: the routine must lock two pages if the operand 190 # spans two pages. 191 # NOTE: THE ROUTINE SHOULD RETURN AN FSLW VALUE IN D0 ON FAILURE 192 # SO THAT THE 060SP CAN CREATE A PROPER ACCESS ERROR FRAME. 193 # Arguments: 194 # a0 = operand address 195 # d0 = `xxxxxxff -> supervisor| `xxxxxx00 -> user 196 # d1 = `xxxxxxff -> longword| `xxxxxx00 -> word 197 # Expected outputs: 198 # d0 = 0 -> success| non-zero -> failure 199 # 200 */ 201 ASENTRY_NOPROFILE(_060_real_lock_page) 202 clrl %d0 203 rts 204 205 /* 206 # 207 # _060_unlock_page(): 208 # 209 # Entry point for the operating system's routine to "unlock" a 210 # page that has been "locked" previously with _real_lock_page. 211 # Note: the routine must unlock two pages if the operand spans 212 # two pages. 213 # Arguments: 214 # a0 = operand address 215 # d0 = `xxxxxxff -> supervisor| `xxxxxx00 -> user 216 # d1 = `xxxxxxff -> longword| `xxxxxx00 -> word 217 # 218 */ 219 ASENTRY_NOPROFILE(_060_real_unlock_page) 220 clrl %d0 221 rts 222 223 |############################################################################ 224 /* 225 ################################## 226 # (2) EXAMPLE PACKAGE ENTRY CODE # 227 ################################## 228 */ 229 230 ASENTRY_NOPROFILE(_060_isp_unimp) 231 bral _C_LABEL(I_CALL_TOP)+0x80+0x00 232 233 ASENTRY_NOPROFILE(_060_isp_cas) 234 bral _C_LABEL(I_CALL_TOP)+0x80+0x08 235 236 ASENTRY_NOPROFILE(_060_isp_cas2) 237 bral _C_LABEL(I_CALL_TOP)+0x80+0x10 238 239 ASENTRY_NOPROFILE(_060_isp_cas_finish) 240 bral _C_LABEL(I_CALL_TOP)+0x80+0x18 241 242 ASENTRY_NOPROFILE(_060_isp_cas2_finish) 243 bral _C_LABEL(I_CALL_TOP)+0x80+0x20 244 245 ASENTRY_NOPROFILE(_060_isp_cas_inrange) 246 bral _C_LABEL(I_CALL_TOP)+0x80+0x28 247 248 ASENTRY_NOPROFILE(_060_isp_cas_terminate) 249 bral _C_LABEL(I_CALL_TOP)+0x80+0x30 250 251 ASENTRY_NOPROFILE(_060_isp_cas_restart) 252 bral _C_LABEL(I_CALL_TOP)+0x80+0x38 253 254 |############################################################################ 255 256 /* 257 ################################ 258 # (3) EXAMPLE CALL-OUT SECTION # 259 ################################ 260 261 # The size of this section MUST be 128 bytes!!! 262 */ 263 264 GLOBAL(I_CALL_TOP) 265 .long _ASM_LABEL(_060_real_chk)-_C_LABEL(I_CALL_TOP) 266 .long _ASM_LABEL(_060_real_divbyzero)-_C_LABEL(I_CALL_TOP) 267 .long _ASM_LABEL(_060_real_trace)-_C_LABEL(I_CALL_TOP) 268 .long _ASM_LABEL(_060_real_access)-_C_LABEL(I_CALL_TOP) 269 .long _ASM_LABEL(_060_isp_done)-_C_LABEL(I_CALL_TOP) 270 271 .long _ASM_LABEL(_060_real_cas)-_C_LABEL(I_CALL_TOP) 272 .long _ASM_LABEL(_060_real_cas2)-_C_LABEL(I_CALL_TOP) 273 .long _ASM_LABEL(_060_real_lock_page)-_C_LABEL(I_CALL_TOP) 274 .long _ASM_LABEL(_060_real_unlock_page)-_C_LABEL(I_CALL_TOP) 275 276 .long 0x00000000,0x00000000,0x00000000,0x00000000 277 .long 0x00000000,0x00000000,0x00000000 278 279 .long _ASM_LABEL(_060_imem_read)-_C_LABEL(I_CALL_TOP) 280 .long _ASM_LABEL(_060_dmem_read)-_C_LABEL(I_CALL_TOP) 281 .long _ASM_LABEL(_060_dmem_write)-_C_LABEL(I_CALL_TOP) 282 .long _ASM_LABEL(_060_imem_read_word)-_C_LABEL(I_CALL_TOP) 283 .long _ASM_LABEL(_060_imem_read_long)-_C_LABEL(I_CALL_TOP) 284 .long _ASM_LABEL(_060_dmem_read_byte)-_C_LABEL(I_CALL_TOP) 285 .long _ASM_LABEL(_060_dmem_read_word)-_C_LABEL(I_CALL_TOP) 286 .long _ASM_LABEL(_060_dmem_read_long)-_C_LABEL(I_CALL_TOP) 287 .long _ASM_LABEL(_060_dmem_write_byte)-_C_LABEL(I_CALL_TOP) 288 .long _ASM_LABEL(_060_dmem_write_word)-_C_LABEL(I_CALL_TOP) 289 .long _ASM_LABEL(_060_dmem_write_long)-_C_LABEL(I_CALL_TOP) 290 291 .long 0x00000000 292 .long 0x00000000,0x00000000,0x00000000,0x00000000 293 294 /* 295 ############################################################################ 296 297 # 060 INTEGER KERNEL PACKAGE MUST GO HERE!!! 298 */ 299 300 #include "isp.S" 301