Annotation of coherent/d/PS2_KERNEL/io.286/ipcas.s, revision 1.1.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.