⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mba.c

📁 著名的AT&T UNIX v6 源码
💻 C
字号:
#/* */#include "../h/param.h"#include "../h/buf.h"#include "../h/conf.h"#include "../h/systm.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/proc.h"#include "../h/seg.h"#include "../h/page.h"#include "../h/uba.h"#include "../h/map.h"#include "../h/mba.h"#include "../h/mtpr.h"/* * startup routine for MBA controllers. */#define	MBAWCOM	0x30#define	MBARCOM	0x38#define	GO	01int mbaboff;mbastart(bp, adcr)register struct buf *bp;int *adcr;{	int vaddr, com;	register int *io, num;	register struct mba_regs *mbap;	register int *pt, i;	int pf;	extern int mbanum[], *mbaloc[], mbautl[], Mbamap[];	extern char buffers[][];	mbap = (struct mba_regs *)mbaloc[mbanum[major(bp->b_dev)]];	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 = (int *)mbap;		io += (MBA_MAP + 128*4)/4;		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");		}	}	mbap->mba_sr = -1;	/* clear status (error) bits */	mbap->mba_bcr = -bp->b_bcount;	mbap->mba_var = vaddr;	if (bp->b_flags & B_READ)		com = MBARCOM | GO;	else		com = MBAWCOM | GO;	*adcr = com;		/* set cmd in device control and status register */}mbainit(){	register int *io0, *io1, *b, t, j;	extern int Sysmap[], *mbaloc[];	extern char buffers[][];	io0 = mbaloc[0] + (MBA_MAP/4);	io1 = mbaloc[1] + (MBA_MAP/4);	b = Sysmap + ((((int) buffers)>>9)&PG_PFNUM);	j = NBUF + ((int)buffers & 0x1ff ? 1 : 0);	do {		t = PG_V | (*b++ & PG_PFNUM);		*io0++ = t;		*io1++ = t;	} while (--j>0);	*io0 = 0;		/* invalidate next entry */	*io1 = 0;	mbaboff = (int)buffers & 0x1ff;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -