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