odd addresses, counts, and iomove.

dove at mit-cipg dove at mit-cipg
Sun Sep 12 14:13:02 AEST 1982


From: dove at mit-cipg at mit-mc
I changed rdwri.c and the machine code handling to allow iomove to
be efficient with odd addresses and byte counts.  This was necessary because
the local network software frequently used them.
----rdwri.c
/*
 * Move n bytes at byte location
 * &bp->b_un.b_addr[o] to/from (flag) the
 * user/kernel (u.segflg) area starting at u.base.
 * Update all the arguments by the number
 * of bytes moved.
 *
 * if #bytes>#bytes_per_word, xfer bytes until user address is an even
 * word boundary.  Then call copyin/copyout to transfer  the remaining
 * full words.  Finally, use cpass/passc to transfer remaining bytes.
 * All this assumes that copyin/copyiin/copyout/copyiout support
 * even #byte xfers from odd kernel addresses to even user addresses.
 * THIS IS NOT TRUE OF MOST UNIX KERNELS; SO WATCH OUT!
 */
iomove(cp, nbytes, flag)
register caddr_t cp;
int nbytes;
{
	register t;
	register unsigned n=nbytes;

	if(n==0)
		return;

	while(((int)u.u_base&(NBPW-1))!=0 && n>0)
	{
		/* align to user wd bdry */
		if(flag==B_WRITE)
		{
			if((t=cpass())<0)
				return;
			*cp++ = t;
			n--;
		}
		else
		{
			if(passc(*cp++)<0)
				return;
			n--;
		}
	}

	if (n==0)
		return;

	nbytes = n;
		
	if(u.u_segflg!=1 &&	/* user space xfer */
	  n>(NBPW-1))		/* >1 full word	*/
	{
		n &= ~(NBPW-1);		/* #bytes of full wds */
		if(flag==B_WRITE)
			if(u.u_segflg==0)
				t = copyin(u.u_base, (caddr_t)cp, n);
			else
				t = copyiin(u.u_base, (caddr_t)cp, n);
		else
			if(u.u_segflg==0)
				t = copyout((caddr_t)cp, u.u_base, n);
			else
				t = copyiout((caddr_t)cp, u.u_base, n);
		if(t)
		{
			u.u_error = EFAULT;
			return;
		}
		u.u_base += n;
		cp += n;		/* in case there is more to come */
		u.u_offset += n;
		u.u_count -= n;
		n = nbytes-n;		/* remaining bytes  */
		if(n==0)
			return;
	}
	if(flag==B_WRITE)
	{
		do{
			if((t=cpass())<0)
				return;
			*cp++ = t;
		}while(--n);
	}
	else
	{
		do{
			if(passc(*cp++)<0)
				return;
		}while(--n);
	}
}
----- mch.c
/ 9/12/82 dove
/ changed to allow odd kernel buffer address.  Use byte moves onto stack
/
.globl	_copyin, _copyout
.globl	_copyiin, _copyiout
_copyin:
#ifndef	NONSEPARATE
	jsr	pc,copsu
1:
	mfpd	(r0)+
	movb	(sp),(r1)+
	movb	1(sp),(r1)+
	tst	(sp)+
	sob	r2,1b
	br	2f
#endif

_copyiin:
	jsr	pc,copsu
1:
	mfpi	(r0)+
	movb	(sp),(r1)+
	movb	1(sp),(r1)+
	tst	(sp)+
	sob	r2,1b
	br	2f

_copyout:
#ifndef	NONSEPARATE
	jsr	pc,copsu
1:
	tst	-(sp)
	movb	(r0)+,(sp)
	movb	(r0)+,1(sp)
	mtpd	(r1)+
	sob	r2,1b
	br	2f
#endif

_copyiout:
	jsr	pc,copsu
1:
	tst	-(sp)
	movb	(r0)+,(sp)
	movb	(r0)+,1(sp)
	mtpi	(r1)+
	sob	r2,1b
2:
	mov	(sp)+,nofault
	mov	(sp)+,r2
	clr	r0
	rts	pc

copsu:
	mov	(sp)+,r0
	mov	r2,-(sp)
	mov	nofault,-(sp)
	mov	r0,-(sp)
	mov	10(sp),r0
	mov	12(sp),r1
	mov	14(sp),r2
	asr	r2
	mov	$1f,nofault
	rts	pc

1:
	mov	(sp)+,nofault
	mov	(sp)+,r2
	mov	$-1,r0
	rts	pc




More information about the Comp.bugs.2bsd mailing list