2.11BSD/sys/pdp/net_xxx.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_xxx.s 1.3 (2.11BSD GTE) 1/12/95
*/
#include "DEFS.h"
#include "../machine/mch_iopage.h"
/*
* delay(usec)
* long usec;
*
* Delay (approximately) usec micro-seconds. It really isn't very acurrate
* since we can be interrupted and take much longer than we intended, but
* that's alright - we just don't want to come home early ...
*
* Copied to the networking from the kernel (mch_xxx.s) so the network could
* do delays (if_qt.c).
*/
ENTRY(delay)
mov 2(sp),r0 / r0 = hiint(usec)
mov 4(sp),r1 / r1 = loint(usec)
ashc $1,r0 / sob's ~= 1/2 micro second,
beq 2f / oops, got passed a delay of 0L-leave
tst r1
/*
* If the low int of the loop counter is zero, the double sob loop
* below will perform correctly, otherwise the high byte must be
* increment.
*/
beq 1f
inc r0 / correct for looping
1:
sob r1,1b / sit on our hands for a while ...
sob r0,1b
2:
rts pc
/*
* badaddr(addr, len)
* caddr_t addr;
* int len;
*
* See if accessing addr with a len type instruction causes a memory fault.
* Len is length os access (1=byte, 2=short, 4=long). Returns 0 if the
* address is OK, -1 on error. If either the address or length is odd use
* a byte test rather than a word test.
*/
ENTRY(badaddr)
mov PS,-(sp) / save current PS and set previous
bic $30000,PS / mode = kernel
mfpd *$nofault / save current nofault and set up
mov $4f,-(sp) / our own trap
mtpd *$nofault
mov 10(sp),r0 / if the low bit of either the length
bis 6(sp),r0 / or address is
asr r0 / on then use a tstb
bcc 1f / br if word test to be used
tstb *6(sp) / yes, just do a tstb on the address
br 2f
1:
tst *6(sp) / no, try a tst ...
2:
clr r0 / we made it - return success
3:
mtpd *$nofault / restore previous fault trap
mov (sp)+,PS / and PS
rts pc / and return
4:
mov $-1,r0 / we faulted out - return failure
br 3b
/*
* locc(mask, size, str)
* u_char mask;
* u_int size;
* u_char *str;
*
* Scan through str up to (but not including str[size]) stopping when a
* character equals mask. Return number of characters left in str.
*/
ENTRY(locc)
mov 4(sp),r0 / r0 = size
beq 3f / exit early if zero
mov 6(sp),r1 / r1 = str
mov r2,-(sp) / r2 = mask
mov 2+2(sp),r2
1: / do
cmpb (r1)+,r2 / if (*str++ == mask)
beq 2f
sob r0,1b / while (--size != 0)
2:
mov (sp)+,r2 / restore registers
3:
rts pc / and return size