|
|
1.1 ! root 1: / $Header: /usr/src/sys/i8086/drv/RCS/ipcas.s,v 2.1 88/09/03 13:06:24 src Exp $ ! 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: /usr/src/sys/i8086/drv/RCS/ipcas.s,v $ ! 23: / Revision 2.1 88/09/03 13:06:24 src ! 24: / *** empty log message *** ! 25: / ! 26: / Revision 1.1 88/03/24 17:05:05 src ! 27: / Initial revision ! 28: / ! 29: / ! 30: / 85/07/19 Allan Cornish ! 31: / Inserted code to check user address for validity. ! 32: / Functions ufcopy and fucopy now return 0 if user address is invalid. ! 33: / Replaced 'jnc .+2;movsb' with 'rcl cx,$1;rep movsb' to improve pipelining. ! 34: / ! 35: / 85/07/03 Allan Cornish ! 36: / Functions renamed: uoscopy --> ufcopy, osucopy --> fucopy (f = far). ! 37: / Module moved from msgas.s to ipcas.s, to reflect its shared use. ! 38: / ! 39: //////// ! 40: ! 41: .globl ufcopy_ ! 42: .globl fucopy_ ! 43: ! 44: //////// ! 45: / ! 46: / ufcopy( base, off, sel, n ) -- copy n bytes from user base to sel:off. ! 47: / ! 48: / Input: base = offset in user memory to copy from ! 49: / off = offset in the destination segment ! 50: / sel = selector to access the destination segment ! 51: / n = number of bytes to copy ! 52: / ! 53: / Action: Copy 'n' bytes of data from offset 'base' in user memory ! 54: / to offset 'off' in the segment accessed by selector 'sel'. ! 55: / ! 56: / Return: Number of bytes copied, or 0 if invalid user address. ! 57: / ! 58: //////// ! 59: ! 60: ufcopy_: / ufcopy( base, off, sel, n ) ! 61: push si / ! 62: push di / unsigned base; ! 63: push bp / unsigned off; ! 64: mov bp, sp / saddr_t sel; ! 65: push ds / unsigned n; ! 66: push es / ! 67: / { ! 68: mov ax, 8(bp) / Validate user address. ! 69: dec ax / ! 70: add ax, 14(bp) / Wrap-around error? ! 71: jc fuerr / ! 72: cmp ax, udl_ / Address out of bounds error? ! 73: ja fuerr / ! 74: / ! 75: mov bx, uds_ / Map DS:SI into user (source) addr ! 76: mov ds, bx / ! 77: mov si, 8(bp) / ! 78: les di, 10(bp) / Map ES:DI into segment (dest) addr ! 79: mov cx, 14(bp) / Transfer count ! 80: / ! 81: cld / Auto Increment ! 82: clc / ! 83: rcr cx, $1 / Change byte count into word count ! 84: rep / Transfer data words ! 85: movsw / ! 86: rcl cx, $1 / If residual byte count ! 87: rep / Transfer last data byte. ! 88: movsb / ! 89: / ! 90: mov ax, 14(bp) / Return transfer count. ! 91: pop es / } ! 92: pop ds ! 93: pop bp ! 94: pop di ! 95: pop si ! 96: ret ! 97: ! 98: fuerr: sub ax, ax ! 99: pop es ! 100: pop ds ! 101: pop bp ! 102: pop di ! 103: pop si ! 104: ret ! 105: ! 106: //////// ! 107: / ! 108: / fucopy( off, sel, base, n ) -- copy n bytes from sel:off to user base. ! 109: / ! 110: / Input: off = offset is the source segment ! 111: / sel = selector to access the source segment ! 112: / base = offset in user memory to copy to ! 113: / n = number of bytes to copy ! 114: / ! 115: / Action: Copy 'n' bytes of data from offset 'off' in the segment ! 116: / accessed by selector 'sel' to offset 'base' in user memory. ! 117: / ! 118: / Return: Number of bytes copied, or 0 if invalid user address. ! 119: / ! 120: //////// ! 121: ! 122: fucopy_: / fucopy( off, sel, base, n ) ! 123: push si / ! 124: push di / unsigned off; ! 125: push bp / saddr_t sel; ! 126: mov bp, sp / unsigned base; ! 127: push ds / unsigned n; ! 128: push es / ! 129: / { ! 130: mov ax, 12(bp) / Validate user address. ! 131: dec ax / ! 132: add ax, 14(bp) / Wrap-around error? ! 133: jc fuerr / ! 134: cmp ax, udl_ / Address out of bounds error? ! 135: ja fuerr / ! 136: / ! 137: mov es, uds_ / Map ES:DI into user (dest) address ! 138: mov di, 12(bp) / ! 139: lds si, 8(bp) / Map DS:SI into segment (source) addr ! 140: mov cx, 14(bp) / Transfer count ! 141: / ! 142: cld / Auto Increment ! 143: clc / ! 144: rcr cx, $1 / Change byte count into word count ! 145: rep / ! 146: movsw / Transfer data words ! 147: rcl cx, $1 / If residual byte count ! 148: rep / Transfer last data byte. ! 149: movsb / ! 150: / ! 151: mov ax, 14(bp) / Return transfer count. ! 152: pop es / } ! 153: pop ds ! 154: pop bp ! 155: pop di ! 156: pop si ! 157: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.