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

Annotation of sys/arch/m68k/060sp/os.s, Revision 1.1

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

CVSweb