SysIII/usr/src/uts/vax/io/mba.c

Compare this file to the similar file:
Show the results in this format:

#include "sys/param.h"
#include "sys/buf.h"
#include "sys/systm.h"
#include "sys/dir.h"
#include "sys/user.h"
#include "sys/proc.h"
#include "sys/seg.h"
#include "sys/var.h"
#include "sys/page.h"
#include "sys/mba.h"

#define	MBAWCOM	0x30
#define	MBARCOM	0x38
extern struct mba mba0vad, mba1vad;
#define	GO	01

int mbaboff;

mbastart(bp, adcr, mba)
register struct buf *bp;
int *adcr;
register struct mba *mba;
{
	int vaddr, com;
	register int *io, num;
	register int *pt, i;
	int pf;
	extern mbautl[], Mbamap[];

	if ( (bp->b_flags & B_PHYS) == 0 ) {
		vaddr = (bp->b_un.b_addr - (char *)buffers) + mbaboff;
	} else {
		ptaccess(bp->b_proc, Mbamap, mbautl);	/* get to u-area & page tables */
		io = &mba->mba_map[128];
		vaddr = (128 << 9) | ((int)bp->b_un.b_addr & 0x1ff);
		pf = (int)bp->b_un.b_addr >> 9;
		num = (((int)bp->b_un.b_addr + bp->b_bcount - 1) >> 9) - pf +1;
		if ((bp -> b_flags & B_UAREA) != 0)  {	/* u-area should be part of the I/O */
			for(i=0; i<UPAGES; i++) {
			    if ((*io++ = PG_V | bp->b_proc->p_addr[i])==PG_V)
				panic("mba, zero u-page");
			}
			num -= UPAGES;
		}
		if (pf & 0x200000) {	/* I/O to stack */
			i = ((struct user *)mbautl)->u_pcb.pcb_szpt;
			pf = i*128 + pf - 0x400000;
		}
		pt = mbautl + UPAGES*128 + pf;
		while ( num-->0) {
			if ((*io++ = *pt++ | PG_V)==PG_V)
				panic("mba, zero entry");
		}
		*io = 0;
	}
	mba->mba_ireg.mba_regs.mba_sr = -1;	/* clear status (error) bits */
	mba->mba_ireg.mba_regs.mba_bcr = -bp->b_bcount;
	mba->mba_ireg.mba_regs.mba_var = vaddr;
	if (bp->b_flags & B_READ)
		com = MBARCOM | GO;
	else
		com = MBAWCOM | GO;
	if (pwr_act >= 0)
		*adcr = com;	/* start command */
}

mbainit()
{
	mbaclr();
	mbaboff = (int)buffers & 0x1ff;
}

mbaclr()
{
	register int *io0, *io1, *b, t, j;
	extern int Sysmap[];

	io0 = mba0vad.mba_map;
	io1 = mba1vad.mba_map;
	b = Sysmap + ((((int) buffers)>>9)&PG_PFNUM);
	j = v.v_buf + 1;
	do {
		t = PG_V | (*b++ & PG_PFNUM);
		*io0++ = t;
		*io1++ = t;
	} while (--j>0);
	*io0 = 0;		/* invalidate next entry */
	*io1 = 0;
}