1 1.1 is # 2 1.1 is # $NetBSD: os.s,v 1.1 2000/04/14 20:24:39 is Exp $ 3 1.1 is # 4 1.1 is 5 1.1 is #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 1.1 is # MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP 7 1.1 is # M68000 Hi-Performance Microprocessor Division 8 1.1 is # M68060 Software Package Production Release 9 1.1 is # 10 1.1 is # M68060 Software Package Copyright (C) 1993, 1994, 1995, 1996 Motorola Inc. 11 1.1 is # All rights reserved. 12 1.1 is # 13 1.1 is # THE SOFTWARE is provided on an "AS IS" basis and without warranty. 14 1.1 is # To the maximum extent permitted by applicable law, 15 1.1 is # MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, 16 1.1 is # INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS 17 1.1 is # FOR A PARTICULAR PURPOSE and any warranty against infringement with 18 1.1 is # regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) 19 1.1 is # and any accompanying written materials. 20 1.1 is # 21 1.1 is # To the maximum extent permitted by applicable law, 22 1.1 is # IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER 23 1.1 is # (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 24 1.1 is # BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) 25 1.1 is # ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE. 26 1.1 is # 27 1.1 is # Motorola assumes no responsibility for the maintenance and support 28 1.1 is # of the SOFTWARE. 29 1.1 is # 30 1.1 is # You are hereby granted a copyright license to use, modify, and distribute the 31 1.1 is # SOFTWARE so long as this entire notice is retained without alteration 32 1.1 is # in any modified and/or redistributed versions, and that such modified 33 1.1 is # versions are clearly identified as such. 34 1.1 is # No licenses are granted by implication, estoppel or otherwise under any 35 1.1 is # patents or trademarks of Motorola, Inc. 36 1.1 is #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 1.1 is 38 1.1 is # 39 1.1 is # os.s 40 1.1 is # 41 1.1 is # This file contains: 42 1.1 is # - example "Call-Out"s required by both the ISP and FPSP. 43 1.1 is # 44 1.1 is 45 1.1 is 46 1.1 is ################################# 47 1.1 is # EXAMPLE CALL-OUTS # 48 1.1 is # # 49 1.1 is # _060_dmem_write() # 50 1.1 is # _060_dmem_read() # 51 1.1 is # _060_imem_read() # 52 1.1 is # _060_dmem_read_byte() # 53 1.1 is # _060_dmem_read_word() # 54 1.1 is # _060_dmem_read_long() # 55 1.1 is # _060_imem_read_word() # 56 1.1 is # _060_imem_read_long() # 57 1.1 is # _060_dmem_write_byte() # 58 1.1 is # _060_dmem_write_word() # 59 1.1 is # _060_dmem_write_long() # 60 1.1 is # # 61 1.1 is # _060_real_trace() # 62 1.1 is # _060_real_access() # 63 1.1 is ################################# 64 1.1 is 65 1.1 is # 66 1.1 is # Each IO routine checks to see if the memory write/read is to/from user 67 1.1 is # or supervisor application space. The examples below use simple "move" 68 1.1 is # instructions for supervisor mode applications and call _copyin()/_copyout() 69 1.1 is # for user mode applications. 70 1.1 is # When installing the 060SP, the _copyin()/_copyout() equivalents for a 71 1.1 is # given operating system should be substituted. 72 1.1 is # 73 1.1 is # The addresses within the 060SP are guaranteed to be on the stack. 74 1.1 is # The result is that Unix processes are allowed to sleep as a consequence 75 1.1 is # of a page fault during a _copyout. 76 1.1 is # 77 1.1 is 78 1.1 is # 79 1.1 is # _060_dmem_write(): 80 1.1 is # 81 1.1 is # Writes to data memory while in supervisor mode. 82 1.1 is # 83 1.1 is # INPUTS: 84 1.1 is # a0 - supervisor source address 85 1.1 is # a1 - user destination address 86 1.1 is # d0 - number of bytes to write 87 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 88 1.1 is # OUTPUTS: 89 1.1 is # d1 - 0 = success, !0 = failure 90 1.1 is # 91 1.1 is global _060_dmem_write 92 1.1 is _060_dmem_write: 93 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 94 1.1 is beq.b user_write 95 1.1 is super_write: 96 1.1 is mov.b (%a0)+,(%a1)+ # copy 1 byte 97 1.1 is subq.l &0x1,%d0 # decr byte counter 98 1.1 is bne.b super_write # quit if ctr = 0 99 1.1 is clr.l %d1 # return success 100 1.1 is rts 101 1.1 is user_write: 102 1.1 is mov.l %d0,-(%sp) # pass: counter 103 1.1 is mov.l %a1,-(%sp) # pass: user dst 104 1.1 is mov.l %a0,-(%sp) # pass: supervisor src 105 1.1 is bsr.l _copyout # write byte to user mem 106 1.1 is mov.l %d0,%d1 # return success 107 1.1 is add.l &0xc, %sp # clear 3 lw params 108 1.1 is rts 109 1.1 is 110 1.1 is # 111 1.1 is # _060_imem_read(), _060_dmem_read(): 112 1.1 is # 113 1.1 is # Reads from data/instruction memory while in supervisor mode. 114 1.1 is # 115 1.1 is # INPUTS: 116 1.1 is # a0 - user source address 117 1.1 is # a1 - supervisor destination address 118 1.1 is # d0 - number of bytes to read 119 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 120 1.1 is # OUTPUTS: 121 1.1 is # d1 - 0 = success, !0 = failure 122 1.1 is # 123 1.1 is global _060_imem_read 124 1.1 is global _060_dmem_read 125 1.1 is _060_imem_read: 126 1.1 is _060_dmem_read: 127 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 128 1.1 is beq.b user_read 129 1.1 is super_read: 130 1.1 is mov.b (%a0)+,(%a1)+ # copy 1 byte 131 1.1 is subq.l &0x1,%d0 # decr byte counter 132 1.1 is bne.b super_read # quit if ctr = 0 133 1.1 is clr.l %d1 # return success 134 1.1 is rts 135 1.1 is user_read: 136 1.1 is mov.l %d0,-(%sp) # pass: counter 137 1.1 is mov.l %a1,-(%sp) # pass: super dst 138 1.1 is mov.l %a0,-(%sp) # pass: user src 139 1.1 is bsr.l _copyin # read byte from user mem 140 1.1 is mov.l %d0,%d1 # return success 141 1.1 is add.l &0xc,%sp # clear 3 lw params 142 1.1 is rts 143 1.1 is 144 1.1 is # 145 1.1 is # _060_dmem_read_byte(): 146 1.1 is # 147 1.1 is # Read a data byte from user memory. 148 1.1 is # 149 1.1 is # INPUTS: 150 1.1 is # a0 - user source address 151 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 152 1.1 is # OUTPUTS: 153 1.1 is # d0 - data byte in d0 154 1.1 is # d1 - 0 = success, !0 = failure 155 1.1 is # 156 1.1 is global _060_dmem_read_byte 157 1.1 is _060_dmem_read_byte: 158 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 159 1.1 is bne.b dmrbs # supervisor 160 1.1 is dmrbu: clr.l -(%sp) # clear space on stack for result 161 1.1 is mov.l &0x1,-(%sp) # pass: # bytes to copy 162 1.1 is pea 0x7(%sp) # pass: dst addr (stack) 163 1.1 is mov.l %a0,-(%sp) # pass: src addr (user mem) 164 1.1 is bsr.l _copyin # "copy in" the data 165 1.1 is mov.l %d0,%d1 # return success 166 1.1 is add.l &0xc,%sp # delete params 167 1.1 is mov.l (%sp)+,%d0 # put answer in d0 168 1.1 is rts 169 1.1 is dmrbs: clr.l %d0 # clear whole longword 170 1.1 is mov.b (%a0),%d0 # fetch super byte 171 1.1 is clr.l %d1 # return success 172 1.1 is rts 173 1.1 is 174 1.1 is # 175 1.1 is # _060_dmem_read_word(): 176 1.1 is # 177 1.1 is # Read a data word from user memory. 178 1.1 is # 179 1.1 is # INPUTS: 180 1.1 is # a0 - user source address 181 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 182 1.1 is # OUTPUTS: 183 1.1 is # d0 - data word in d0 184 1.1 is # d1 - 0 = success, !0 = failure 185 1.1 is # 186 1.1 is global _060_dmem_read_word 187 1.1 is _060_dmem_read_word: 188 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 189 1.1 is bne.b dmrws # supervisor 190 1.1 is dmrwu: clr.l -(%sp) # clear space on stack for result 191 1.1 is mov.l &0x2,-(%sp) # pass: # bytes to copy 192 1.1 is pea 0x6(%sp) # pass: dst addr (stack) 193 1.1 is mov.l %a0,-(%sp) # pass: src addr (user mem) 194 1.1 is bsr.l _copyin # "copy in" the data 195 1.1 is mov.l %d0,%d1 # return success 196 1.1 is add.l &0xc,%sp # delete params 197 1.1 is mov.l (%sp)+,%d0 # put answer in d0 198 1.1 is rts 199 1.1 is dmrws: clr.l %d0 # clear whole longword 200 1.1 is mov.w (%a0), %d0 # fetch super word 201 1.1 is clr.l %d1 # return success 202 1.1 is rts 203 1.1 is 204 1.1 is # 205 1.1 is # _060_dmem_read_long(): 206 1.1 is # 207 1.1 is 208 1.1 is # 209 1.1 is # INPUTS: 210 1.1 is # a0 - user source address 211 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 212 1.1 is # OUTPUTS: 213 1.1 is # d0 - data longword in d0 214 1.1 is # d1 - 0 = success, !0 = failure 215 1.1 is # 216 1.1 is global _060_dmem_read_long 217 1.1 is _060_dmem_read_long: 218 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 219 1.1 is bne.b dmrls # supervisor 220 1.1 is dmrlu: subq.l &0x4,%sp # clear space on stack for result 221 1.1 is mov.l &0x4,-(%sp) # pass: # bytes to copy 222 1.1 is pea 0x4(%sp) # pass: dst addr (stack) 223 1.1 is mov.l %a0,-(%sp) # pass: src addr (user mem) 224 1.1 is bsr.l _copyin # "copy in" the data 225 1.1 is mov.l %d0,%d1 # return success 226 1.1 is add.l &0xc,%sp # delete params 227 1.1 is mov.l (%sp)+,%d0 # put answer in d0 228 1.1 is rts 229 1.1 is dmrls: mov.l (%a0),%d0 # fetch super longword 230 1.1 is clr.l %d1 # return success 231 1.1 is rts 232 1.1 is 233 1.1 is # 234 1.1 is # _060_dmem_write_byte(): 235 1.1 is # 236 1.1 is # Write a data byte to user memory. 237 1.1 is # 238 1.1 is # INPUTS: 239 1.1 is # a0 - user destination address 240 1.1 is # d0 - data byte in d0 241 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 242 1.1 is # OUTPUTS: 243 1.1 is # d1 - 0 = success, !0 = failure 244 1.1 is # 245 1.1 is global _060_dmem_write_byte 246 1.1 is _060_dmem_write_byte: 247 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 248 1.1 is bne.b dmwbs # supervisor 249 1.1 is dmwbu: mov.l %d0,-(%sp) # put src on stack 250 1.1 is mov.l &0x1,-(%sp) # pass: # bytes to copy 251 1.1 is mov.l %a0,-(%sp) # pass: dst addr (user mem) 252 1.1 is pea 0xb(%sp) # pass: src addr (stack) 253 1.1 is bsr.l _copyout # "copy out" the data 254 1.1 is mov.l %d0,%d1 # return success 255 1.1 is add.l &0x10,%sp # delete params + src 256 1.1 is rts 257 1.1 is dmwbs: mov.b %d0,(%a0) # store super byte 258 1.1 is clr.l %d1 # return success 259 1.1 is rts 260 1.1 is 261 1.1 is # 262 1.1 is # _060_dmem_write_word(): 263 1.1 is # 264 1.1 is # Write a data word to user memory. 265 1.1 is # 266 1.1 is # INPUTS: 267 1.1 is # a0 - user destination address 268 1.1 is # d0 - data word in d0 269 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 270 1.1 is # OUTPUTS: 271 1.1 is # d1 - 0 = success, !0 = failure 272 1.1 is # 273 1.1 is global _060_dmem_write_word 274 1.1 is _060_dmem_write_word: 275 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 276 1.1 is bne.b dmwws # supervisor 277 1.1 is dmwwu: mov.l %d0,-(%sp) # put src on stack 278 1.1 is mov.l &0x2,-(%sp) # pass: # bytes to copy 279 1.1 is mov.l %a0,-(%sp) # pass: dst addr (user mem) 280 1.1 is pea 0xa(%sp) # pass: src addr (stack) 281 1.1 is bsr.l _copyout # "copy out" the data 282 1.1 is mov.l %d0,%d1 # return success 283 1.1 is add.l &0x10,%sp # delete params + src 284 1.1 is rts 285 1.1 is dmwws: mov.w %d0,(%a0) # store super word 286 1.1 is clr.l %d1 # return success 287 1.1 is rts 288 1.1 is 289 1.1 is # 290 1.1 is # _060_dmem_write_long(): 291 1.1 is # 292 1.1 is # Write a data longword to user memory. 293 1.1 is # 294 1.1 is # INPUTS: 295 1.1 is # a0 - user destination address 296 1.1 is # d0 - data longword in d0 297 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 298 1.1 is # OUTPUTS: 299 1.1 is # d1 - 0 = success, !0 = failure 300 1.1 is # 301 1.1 is global _060_dmem_write_long 302 1.1 is _060_dmem_write_long: 303 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 304 1.1 is bne.b dmwls # supervisor 305 1.1 is dmwlu: mov.l %d0,-(%sp) # put src on stack 306 1.1 is mov.l &0x4,-(%sp) # pass: # bytes to copy 307 1.1 is mov.l %a0,-(%sp) # pass: dst addr (user mem) 308 1.1 is pea 0x8(%sp) # pass: src addr (stack) 309 1.1 is bsr.l _copyout # "copy out" the data 310 1.1 is mov.l %d0,%d1 # return success 311 1.1 is add.l &0x10,%sp # delete params + src 312 1.1 is rts 313 1.1 is dmwls: mov.l %d0,(%a0) # store super longword 314 1.1 is clr.l %d1 # return success 315 1.1 is rts 316 1.1 is 317 1.1 is # 318 1.1 is # _060_imem_read_word(): 319 1.1 is # 320 1.1 is # Read an instruction word from user memory. 321 1.1 is # 322 1.1 is # INPUTS: 323 1.1 is # a0 - user source address 324 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 325 1.1 is # OUTPUTS: 326 1.1 is # d0 - instruction word in d0 327 1.1 is # d1 - 0 = success, !0 = failure 328 1.1 is # 329 1.1 is global _060_imem_read_word 330 1.1 is _060_imem_read_word: 331 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 332 1.1 is bne.b imrws # supervisor 333 1.1 is imrwu: clr.l -(%sp) # clear space on stack for result 334 1.1 is mov.l &0x2,-(%sp) # pass: # bytes to copy 335 1.1 is pea 0x6(%sp) # pass: dst addr (stack) 336 1.1 is mov.l %a0,-(%sp) # pass: src addr (user mem) 337 1.1 is bsr.l _copyin # "copy in" the data 338 1.1 is mov.l %d0,%d1 # return success 339 1.1 is add.l &0xc,%sp # delete params 340 1.1 is mov.l (%sp)+,%d0 # put answer in d0 341 1.1 is rts 342 1.1 is imrws: mov.w (%a0),%d0 # fetch super word 343 1.1 is clr.l %d1 # return success 344 1.1 is rts 345 1.1 is 346 1.1 is # 347 1.1 is # _060_imem_read_long(): 348 1.1 is # 349 1.1 is # Read an instruction longword from user memory. 350 1.1 is # 351 1.1 is # INPUTS: 352 1.1 is # a0 - user source address 353 1.1 is # 0x4(%a6),bit5 - 1 = supervisor mode, 0 = user mode 354 1.1 is # OUTPUTS: 355 1.1 is # d0 - instruction longword in d0 356 1.1 is # d1 - 0 = success, !0 = failure 357 1.1 is # 358 1.1 is global _060_imem_read_long 359 1.1 is _060_imem_read_long: 360 1.1 is btst &0x5,0x4(%a6) # check for supervisor state 361 1.1 is bne.b imrls # supervisor 362 1.1 is imrlu: subq.l &0x4,%sp # clear space on stack for result 363 1.1 is mov.l &0x4,-(%sp) # pass: # bytes to copy 364 1.1 is pea 0x4(%sp) # pass: dst addr (stack) 365 1.1 is mov.l %a0,-(%sp) # pass: src addr (user mem) 366 1.1 is bsr.l _copyin # "copy in" the data 367 1.1 is mov.l %d0,%d1 # return success 368 1.1 is add.l &0xc,%sp # delete params 369 1.1 is mov.l (%sp)+,%d0 # put answer in d0 370 1.1 is rts 371 1.1 is imrls: mov.l (%a0),%d0 # fetch super longword 372 1.1 is clr.l %d1 # return success 373 1.1 is rts 374 1.1 is 375 1.1 is ################################################ 376 1.1 is 377 1.1 is # 378 1.1 is # Use these routines if your kernel doesn't have _copyout/_copyin equivalents. 379 1.1 is # Assumes that D0/D1/A0/A1 are scratch registers. The _copyin/_copyout 380 1.1 is # below assume that the SFC/DFC have been set previously. 381 1.1 is # 382 1.1 is 383 1.1 is # 384 1.1 is # int _copyout(supervisor_addr, user_addr, nbytes) 385 1.1 is # 386 1.1 is global _copyout 387 1.1 is _copyout: 388 1.1 is mov.l 4(%sp),%a0 # source 389 1.1 is mov.l 8(%sp),%a1 # destination 390 1.1 is mov.l 12(%sp),%d0 # count 391 1.1 is moreout: 392 1.1 is mov.b (%a0)+,%d1 # fetch supervisor byte 393 1.1 is movs.b %d1,(%a1)+ # store user byte 394 1.1 is subq.l &0x1,%d0 # are we through yet? 395 1.1 is bne.w moreout # no; so, continue 396 1.1 is rts 397 1.1 is 398 1.1 is # 399 1.1 is # int _copyin(user_addr, supervisor_addr, nbytes) 400 1.1 is # 401 1.1 is global _copyin 402 1.1 is _copyin: 403 1.1 is mov.l 4(%sp),%a0 # source 404 1.1 is mov.l 8(%sp),%a1 # destination 405 1.1 is mov.l 12(%sp),%d0 # count 406 1.1 is morein: 407 1.1 is movs.b (%a0)+,%d1 # fetch user byte 408 1.1 is mov.b %d1,(%a1)+ # write supervisor byte 409 1.1 is subq.l &0x1,%d0 # are we through yet? 410 1.1 is bne.w morein # no; so, continue 411 1.1 is rts 412 1.1 is 413 1.1 is ############################################################################ 414 1.1 is 415 1.1 is # 416 1.1 is # _060_real_trace(): 417 1.1 is # 418 1.1 is # This is the exit point for the 060FPSP when an instruction is being traced 419 1.1 is # and there are no other higher priority exceptions pending for this instruction 420 1.1 is # or they have already been processed. 421 1.1 is # 422 1.1 is # The sample code below simply executes an "rte". 423 1.1 is # 424 1.1 is global _060_real_trace 425 1.1 is _060_real_trace: 426 1.1 is rte 427 1.1 is 428 1.1 is # 429 1.1 is # _060_real_access(): 430 1.1 is # 431 1.1 is # This is the exit point for the 060FPSP when an access error exception 432 1.1 is # is encountered. The routine below should point to the operating system 433 1.1 is # handler for access error exceptions. The exception stack frame is an 434 1.1 is # 8-word access error frame. 435 1.1 is # 436 1.1 is # The sample routine below simply executes an "rte" instruction which 437 1.1 is # is most likely the incorrect thing to do and could put the system 438 1.1 is # into an infinite loop. 439 1.1 is # 440 1.1 is global _060_real_access 441 1.1 is _060_real_access: 442 1.1 is rte 443