Annotation of coherent/d/PS2_KERNEL/io.286/ipcas.s, revision 1.1

1.1     ! root        1: / $Header: /kernel/kersrc/io.286/ipcas.s,v 1.1 92/07/17 15:24:15 bin Exp Locker: bin $
        !             2: /
        !             3: /      The  information  contained herein  is a trade secret  of INETCO
        !             4: /      Systems, and is confidential information.   It is provided under
        !             5: /      a license agreement,  and may be copied or disclosed  only under
        !             6: /      the terms of that agreement.   Any reproduction or disclosure of
        !             7: /      this  material  without  the express  written  authorization  of
        !             8: /      INETCO Systems or persuant to the license agreement is unlawful.
        !             9: /
        !            10: /      Copyright (c) 1985, 1984
        !            11: /      An unpublished work by INETCO Systems, Ltd.
        !            12: /      All rights reserved.
        !            13: /
        !            14: 
        !            15: ////////
        !            16: /
        !            17: / System V Compatible Inter-Process Communication - Assembler Support
        !            18: /
        !            19: / ufcopy( base, off, sel, n ) -- copy n bytes from user base to sel:off.
        !            20: / fucopy( off, sel, base, n ) -- copy n bytes from sel:off to user base.
        !            21: /
        !            22: / $Log:        ipcas.s,v $
        !            23: / Revision 1.1  92/07/17  15:24:15  bin
        !            24: / Initial revision
        !            25: /
        !            26: / Revision 2.1 88/09/03  13:06:24      src
        !            27: / *** empty log message ***
        !            28: / 
        !            29: / Revision 1.1 88/03/24  17:05:05      src
        !            30: / Initial revision
        !            31: / 
        !            32: /
        !            33: / 85/07/19     Allan Cornish
        !            34: / Inserted code to check user address for validity.
        !            35: / Functions ufcopy and fucopy now return 0 if user address is invalid.
        !            36: / Replaced 'jnc .+2;movsb' with 'rcl cx,$1;rep movsb' to improve pipelining.
        !            37: /
        !            38: / 85/07/03     Allan Cornish
        !            39: / Functions renamed: uoscopy --> ufcopy, osucopy --> fucopy (f = far).
        !            40: / Module moved from msgas.s to ipcas.s, to reflect its shared use.
        !            41: /
        !            42: ////////
        !            43: 
        !            44:        .globl  ufcopy_
        !            45:        .globl  fucopy_
        !            46: 
        !            47: ////////
        !            48: /
        !            49: / ufcopy( base, off, sel, n )  -- copy n bytes from user base to sel:off.
        !            50: /
        !            51: /      Input:  base = offset in user memory to copy from
        !            52: /              off  = offset in the destination segment
        !            53: /              sel  = selector to access the destination segment
        !            54: /              n    = number of bytes to copy
        !            55: /
        !            56: /      Action: Copy 'n' bytes of data from offset 'base' in user memory
        !            57: /              to offset 'off' in the segment accessed by selector 'sel'.
        !            58: /
        !            59: /      Return: Number of bytes copied, or 0 if invalid user address.
        !            60: /
        !            61: ////////
        !            62: 
        !            63: ufcopy_:                       / ufcopy( base, off, sel, n )
        !            64:        push    si              /
        !            65:        push    di              / unsigned base;
        !            66:        push    bp              / unsigned off;
        !            67:        mov     bp, sp          / saddr_t sel;
        !            68:        push    ds              / unsigned n;
        !            69:        push    es              /
        !            70:                                / {
        !            71:        mov     ax, 8(bp)       /       Validate user address.
        !            72:        dec     ax              /
        !            73:        add     ax, 14(bp)      /       Wrap-around error?
        !            74:        jc      fuerr           /
        !            75:        cmp     ax, udl_        /       Address out of bounds error?
        !            76:        ja      fuerr           /
        !            77:                                /
        !            78:        mov     bx, uds_        /       Map DS:SI into user (source) addr
        !            79:        mov     ds, bx          /
        !            80:        mov     si, 8(bp)       /
        !            81:        les     di, 10(bp)      /       Map ES:DI into segment (dest) addr
        !            82:        mov     cx, 14(bp)      /       Transfer count
        !            83:                                /
        !            84:        cld                     /       Auto Increment
        !            85:        clc                     /
        !            86:        rcr     cx, $1          /       Change byte count into word count
        !            87:        rep                     /       Transfer data words
        !            88:        movsw                   /
        !            89:        rcl     cx, $1          /       If residual byte count
        !            90:        rep                     /               Transfer last data byte.
        !            91:        movsb                   /
        !            92:                                /
        !            93:        mov     ax, 14(bp)      /       Return transfer count.
        !            94:        pop     es              / }
        !            95:        pop     ds
        !            96:        pop     bp
        !            97:        pop     di
        !            98:        pop     si
        !            99:        ret
        !           100: 
        !           101: fuerr: sub     ax, ax
        !           102:        pop     es
        !           103:        pop     ds
        !           104:        pop     bp
        !           105:        pop     di
        !           106:        pop     si
        !           107:        ret
        !           108: 
        !           109: ////////
        !           110: /
        !           111: / fucopy( off, sel, base, n )  -- copy n bytes from sel:off to user base.
        !           112: /
        !           113: /      Input:  off  = offset is the source segment
        !           114: /              sel  = selector to access the source segment
        !           115: /              base = offset in user memory to copy to
        !           116: /              n    = number of bytes to copy
        !           117: /
        !           118: /      Action: Copy 'n' bytes of data from offset 'off' in the segment
        !           119: /              accessed by selector 'sel' to offset 'base' in user memory.
        !           120: /
        !           121: /      Return: Number of bytes copied, or 0 if invalid user address.
        !           122: /
        !           123: ////////
        !           124: 
        !           125: fucopy_:                       / fucopy( off, sel, base, n )
        !           126:        push    si              /
        !           127:        push    di              / unsigned off;
        !           128:        push    bp              / saddr_t  sel;
        !           129:        mov     bp, sp          / unsigned base;
        !           130:        push    ds              / unsigned n;
        !           131:        push    es              /
        !           132:                                / {
        !           133:        mov     ax, 12(bp)      /       Validate user address.
        !           134:        dec     ax              /
        !           135:        add     ax, 14(bp)      /       Wrap-around error?
        !           136:        jc      fuerr           /
        !           137:        cmp     ax, udl_        /       Address out of bounds error?
        !           138:        ja      fuerr           /
        !           139:                                /
        !           140:        mov     es, uds_        /       Map ES:DI into user (dest) address
        !           141:        mov     di, 12(bp)      /
        !           142:        lds     si, 8(bp)       /       Map DS:SI into segment (source) addr
        !           143:        mov     cx, 14(bp)      /       Transfer count
        !           144:                                /
        !           145:        cld                     /       Auto Increment
        !           146:        clc                     /
        !           147:        rcr     cx, $1          /       Change byte count into word count
        !           148:        rep                     /
        !           149:        movsw                   /       Transfer data words
        !           150:        rcl     cx, $1          /       If residual byte count
        !           151:        rep                     /               Transfer last data byte.
        !           152:        movsb                   /
        !           153:                                /
        !           154:        mov     ax, 14(bp)      /       Return transfer count.
        !           155:        pop     es              / }
        !           156:        pop     ds
        !           157:        pop     bp
        !           158:        pop     di
        !           159:        pop     si
        !           160:        ret

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.