2.11BSD/sys/pdp/net_mbuf.s
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)net_mbuf.s 2.0 (2.11BSD GTE) 3/13/93
*/
#include "DEFS.h"
#include "../machine/mch_iopage.h"
/*
* mbcopyin(click, off, ptr, len)
* u_short click; / address of external DMA buffer
* u_short off; / offset into click of start of buffer
* caddr_t ptr; / address of internal buffer
* short len; / bytes to copy from click/off to ptr
*
* mbcopyout(ptr, click, off, len)
* caddr_t ptr; / address of internal buffer
* u_short click; / address of external DMA buffer
* u_short off; / offset into click of start of buffer
* short len; / bytes to copy from ptr to click/off
*
* Used for copying data from/to the UNIBUS DMA pages to/from the
* in-address-space mbufs. Cannot copy data to or from the stack. Len
* cannot exceed 8Kbytes.
*
* We remap SDSA6 to do the copy and run at SPL7.
*/
ENTRY(mbcopyin)
jsr r5,csv
mov 012(r5),r0 / grab byte count
ble 3f / nothing to do if len <= 0 ...
mov 06(r5),r1 / grab offset and computer pointer
add $140000,r1 / to mapped in source data
mov 010(r5),r2 / grab ptr (destination address)
mov PS,-(sp) / save PS since we lock out interrupts
SPL7
mov SDSA6,r3 / save mapping for stack / u. area
mov 04(r5),SDSA6 / map in source data
br 0f
ENTRY(mbcopyout)
jsr r5,csv
mov 012(r5),r0 / grab byte count
ble 3f / nothing to do if len <= 0 ...
mov 04(r5),r1 / grab ptr (source address)
mov 010(r5),r2 / grab offset and compute pointer
add $140000,r2 / to mapped destination address
mov PS,-(sp) / save PS since we lock out interrupts
SPL7
mov SDSA6,r3 / save mapping for stack / u. area
mov 06(r5),SDSA6 / map in destination address data
/*
* Common loop and return for mbcopyin and mbcopyout. Copy from (r1) to
* (r2) for r0 bytes. r3 contains old seg6 address descriptor.
*/
0:
cmp r0,$8192. / too big?
bge 2f / yes, ignore it
cmp r0,$10. / if (length >= 10)
bhi 4f / try words
1:
movb (r1)+,(r2)+ / do *dst++ = *src++
sob r0,1b / while (--length)
2:
mov r3,SDSA6 / map back in stack / u. area
mov (sp)+,PS / restore original priority
3:
jmp cret
/*
* The length of the copy justifies trying a word by word copy. If src and
* dst are of the same parity, we can do a word copy by handling any leading
* and trailing odd bytes separately. NOTE: r4 is used to hold the odd byte
* indicator because the stack is invalid (mapped out).
*/
4:
bit $1,r1 / if (src&1 != dst&1)
beq 5f / do bytes
bit $1,r2
beq 1b / (src odd, dst even - do bytes)
movb (r1)+,(r2)+ / copy leading odd byte
dec r0
br 6f
5:
bit $1,r2
bne 1b / (src even, dst odd - do bytes)
6:
mov r0,r4 / save trailing byte indicator
asr r0 / length >>= 1 (unsigned)
asr r0 / if (length >>= 1, wasodd(length))
bcc 7f / handle leading non multiple of four
mov (r1)+,(r2)+
7:
asr r0 / if (length >>= 1, wasodd(length))
bcc 8f / handle leading non multiple of eight
mov (r1)+,(r2)+
mov (r1)+,(r2)+
8:
mov (r1)+,(r2)+ / do
mov (r1)+,(r2)+ / move eight bytes
mov (r1)+,(r2)+
mov (r1)+,(r2)+
sob r0,8b / while (--length)
asr r4 / if (odd trailing byte)
bcc 2b
movb (r1)+,(r2)+ / copy it
br 2b / and return