1 /* 2 # 3 # $NetBSD: netbsd060sp.S,v 1.8 2024/09/08 09:36:49 rillig 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 # 38 # Derived from: 39 # os.s 40 # 41 # This file contains: 42 # - example "Call-Out"s required by both the ISP and FPSP. 43 # 44 */ 45 46 #include <machine/asm.h> 47 48 #include "assym.h" 49 50 /* 51 # 52 # make the copyright notice appear in the binary: 53 # 54 */ 55 #include "copyright.S" 56 57 /* 58 ################################# 59 # EXAMPLE CALL-OUTS # 60 # # 61 # _060_dmem_write() # 62 # _060_dmem_read() # 63 # _060_imem_read() # 64 # _060_dmem_read_byte() # 65 # _060_dmem_read_word() # 66 # _060_dmem_read_long() # 67 # _060_imem_read_word() # 68 # _060_imem_read_long() # 69 # _060_dmem_write_byte() # 70 # _060_dmem_write_word() # 71 # _060_dmem_write_long() # 72 # # 73 # _060_real_trace() # 74 # _060_real_access() # 75 ################################# 76 */ 77 78 /* 79 # 80 # Each IO routine checks to see if the memory write/read is to/from user 81 # or supervisor application space. The examples below use simple "move" 82 # instructions for supervisor mode applications and call _copyin()/_copyout() 83 # for user mode applications. 84 # When installing the 060SP, the _copyin()/_copyout() equivalents for a 85 # given operating system should be substituted. 86 # 87 # The addresses within the 060SP are guaranteed to be on the stack. 88 # The result is that Unix processes are allowed to sleep as a consequence 89 # of a page fault during a _copyout. 90 # 91 */ 92 93 /* 94 # 95 # _060_dmem_write(): 96 # 97 # Writes to data memory while in supervisor mode. 98 # 99 # INPUTS: 100 # a0 - supervisor source address 101 # a1 - user destination address 102 # d0 - number of bytes to write 103 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 104 # OUTPUTS: 105 # d1 - 0 = success, !0 = failure 106 # 107 */ 108 ASENTRY_NOPROFILE(_060_dmem_write) 109 btst #0x5,%a6@(0x4) |# check for supervisor state 110 beqs user_write 111 super_write: 112 moveb %a0@+,%a1@+ |# copy 1 byte 113 subql #0x1,%d0 |# decr byte counter 114 bnes super_write |# quit if ctr = 0 115 clrl %d1 |# return success 116 rts 117 user_write: 118 movel %d0,%sp@- |# pass: counter 119 movel %a1,%sp@- |# pass: user dst 120 movel %a0,%sp@- |# pass: supervisor src 121 bsrl _C_LABEL(copyout) |# write byte to user mem 122 movel %d0,%d1 |# return success 123 addl #0xc,%sp |# clear 3 lw params 124 rts 125 126 /* 127 # 128 # _060_imem_read(), _060_dmem_read(): 129 # 130 # Reads from data/instruction memory while in supervisor mode. 131 # 132 # INPUTS: 133 # a0 - user source address 134 # a1 - supervisor destination address 135 # d0 - number of bytes to read 136 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 137 # OUTPUTS: 138 # d1 - 0 = success, !0 = failure 139 # 140 */ 141 ASENTRY_NOPROFILE(_060_imem_read) 142 ASENTRY_NOPROFILE(_060_dmem_read) 143 btst #0x5,%a6@(0x4) |# check for supervisor state 144 beqs user_read 145 super_read: 146 moveb %a0@+,%a1@+ |# copy 1 byte 147 subql #0x1,%d0 |# decr byte counter 148 bnes super_read |# quit if ctr = 0 149 clrl %d1 |# return success 150 rts 151 user_read: 152 movel %d0,%sp@- |# pass: counter 153 movel %a1,%sp@- |# pass: super dst 154 movel %a0,%sp@- |# pass: user src 155 bsrl _C_LABEL(copyin) |# read byte from user mem 156 movel %d0,%d1 |# return success 157 addl #0xc,%sp |# clear 3 lw params 158 rts 159 160 /* 161 # 162 # _060_dmem_read_byte(): 163 # 164 # Read a data byte from user memory. 165 # 166 # INPUTS: 167 # a0 - user source address 168 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 169 # OUTPUTS: 170 # d0 - data byte in d0 171 # d1 - 0 = success, !0 = failure 172 # 173 */ 174 ASENTRY_NOPROFILE(_060_dmem_read_byte) 175 clrl %d1 |# return success 176 clrl %d0 |# clear whole longword 177 btst #0x5,%a6@(0x4) |# check for supervisor state 178 bnes dmrbs |# supervisor 179 dmrbu: 180 movl _C_LABEL(curpcb),%a1 | fault handler 181 movl #Lferr,%a1@(PCB_ONFAULT)| set it 182 movsb %a0@,%d0 183 bra Lfdone 184 185 dmrbs: 186 moveb %a0@,%d0 |# fetch super byte 187 rts 188 189 /* 190 # 191 # _060_imem_read_word(): 192 # Read an instruction word from user memory. 193 # 194 # _060_dmem_read_word(): 195 # Read a data word from user memory. 196 # 197 # INPUTS: 198 # a0 - user source address 199 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 200 # OUTPUTS: 201 # d0 - data word in d0 202 # d1 - 0 = success, !0 = failure 203 # 204 */ 205 ASENTRY_NOPROFILE(_060_imem_read_word) 206 ASENTRY_NOPROFILE(_060_dmem_read_word) 207 clrl %d1 |# return success 208 clrl %d0 |# clear whole longword 209 btst #0x5,%a6@(0x4) |# check for supervisor state 210 bnes dmrws |# supervisor 211 dmrwu: 212 movl _C_LABEL(curpcb),%a1 | fault handler 213 movl #Lferr,%a1@(PCB_ONFAULT)| set it 214 movsw %a0@,%d0 215 bra Lfdone 216 dmrws: 217 movew %a0@,%d0 |# fetch super word 218 rts 219 220 /* 221 # 222 # _060_imem_read_long(): 223 # Read an instruction longword from user memory. 224 # 225 # _060_dmem_read_long(): 226 # Read a data longword from user memory. 227 # 228 # 229 # INPUTS: 230 # a0 - user source address 231 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 232 # OUTPUTS: 233 # d0 - data longword in d0 234 # d1 - 0 = success, !0 = failure 235 # 236 */ 237 ASENTRY_NOPROFILE(_060_imem_read_long) 238 ASENTRY_NOPROFILE(_060_dmem_read_long) 239 clrl %d1 |# return success 240 btst #0x5,%a6@(0x4) |# check for supervisor state 241 bnes dmrls |# supervisor 242 dmrlu: 243 movl _C_LABEL(curpcb),%a1 | fault handler 244 movl #Lferr,%a1@(PCB_ONFAULT)| set it 245 movsl %a0@,%d0 246 bra Lfdone 247 dmrls: 248 movel %a0@,%d0 |# fetch super longword 249 rts 250 251 /* 252 # 253 # _060_dmem_write_byte(): 254 # 255 # Write a data byte to user memory. 256 # 257 # INPUTS: 258 # a0 - user destination address 259 # d0 - data byte in d0 260 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 261 # OUTPUTS: 262 # d1 - 0 = success, !0 = failure 263 # 264 */ 265 ASENTRY_NOPROFILE(_060_dmem_write_byte) 266 clrl %d1 |# return success 267 btst #0x5,%a6@(0x4) |# check for supervisor state 268 bnes dmwbs |# supervisor 269 dmwbu: 270 movl _C_LABEL(curpcb),%a1 | fault handler 271 movl #Lferr,%a1@(PCB_ONFAULT)| set it 272 movsb %d0,%a0@ 273 bra Lfdone 274 dmwbs: 275 moveb %d0,%a0@ |# store super byte 276 rts 277 278 /* 279 # 280 # _060_dmem_write_word(): 281 # 282 # Write a data word to user memory. 283 # 284 # INPUTS: 285 # a0 - user destination address 286 # d0 - data word in d0 287 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 288 # OUTPUTS: 289 # d1 - 0 = success, !0 = failure 290 # 291 */ 292 ASENTRY_NOPROFILE(_060_dmem_write_word) 293 clrl %d1 |# return success 294 btst #0x5,%a6@(0x4) |# check for supervisor state 295 bnes dmwws |# supervisor 296 dmwwu: 297 movl _C_LABEL(curpcb),%a1 | fault handler 298 movl #Lferr,%a1@(PCB_ONFAULT)| set it 299 movsw %d0,%a0@ 300 bra Lfdone 301 dmwws: 302 movew %d0,%a0@ |# store super word 303 rts 304 305 /* 306 # 307 # _060_dmem_write_long(): 308 # 309 # Write a data longword to user memory. 310 # 311 # INPUTS: 312 # a0 - user destination address 313 # d0 - data longword in d0 314 # a6@(0x4),bit5 - 1 = supervisor mode, 0 = user mode 315 # OUTPUTS: 316 # d1 - 0 = success, !0 = failure 317 # 318 */ 319 ASENTRY_NOPROFILE(_060_dmem_write_long) 320 clrl %d1 |# return success 321 btst #0x5,%a6@(0x4) |# check for supervisor state 322 bnes dmwls |# supervisor 323 dmwlu: 324 movl _C_LABEL(curpcb),%a1 | fault handler 325 movl #Lferr,%a1@(PCB_ONFAULT)| set it 326 movsl %d0,%a0@ 327 bra Lfdone 328 dmwls: 329 movel %d0,%a0@ |# store super longword 330 rts 331 332 |############################################################################ 333 Lferr: 334 moveq #-1,%d1 335 Lfdone: 336 clrl %a1@(PCB_ONFAULT) | clear fault handler 337 rts 338 339 |############################################################################ 340 341 /* 342 # 343 # _060_real_trace(): 344 # 345 # This is the exit point for the 060FPSP when an instruction is being traced 346 # and there are no other higher priority exceptions pending for this instruction 347 # or they have already been processed. 348 # 349 # The sample code below simply executes an "rte". 350 # 351 */ 352 ASENTRY_NOPROFILE(_060_real_trace) 353 jra _C_LABEL(trace) 354 355 /* 356 # 357 # _060_real_access(): 358 # 359 # This is the exit point for the 060FPSP when an access error exception 360 # is encountered. The routine below should point to the operating system 361 # handler for access error exceptions. The exception stack frame is an 362 # 8-word access error frame. 363 # 364 # We jump directly to the 68060 buserr handler. 365 # If we had a sane ld, we could use use that entry point directly... 366 # 367 */ 368 ASENTRY_NOPROFILE(_060_real_access) 369 jra _C_LABEL(buserr60) 370 371 #include "inetbsd.S" 372 #include "fnetbsd.S" 373