[BACK]Return to netbsd.S CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / 060sp

Annotation of sys/arch/m68k/060sp/netbsd.S, Revision 1.1.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