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

📄 rf.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#/* * RF disk driver */#include "../h/param.h"#include "../h/systm.h"#include "../h/buf.h"#include "../h/conf.h"#include "../h/dir.h"#include "../h/user.h"struct device {	int	rfcs;	int	rfwc;	char	*rfba;	int	rfda;	int	rfdae;};struct	buf	rftab;struct	buf	rrfbuf;#define	NRFBLK	1024#define RFADDR ((struct device *)0177460)#define	GO	01#define	RCOM	04#define	WCOM	02#define	CTLCLR	0400#define	IENABLE	0100/* * Monitoring device number */#define	DK_N	0rfstrategy(bp)register struct buf *bp;{	if(bp->b_flags&B_PHYS)		mapalloc(bp);	if (bp->b_blkno >= NRFBLK*(minor(bp->b_dev)+1)) {		bp->b_flags |= B_ERROR;		iodone(bp);		return;	}	bp->av_forw = 0;	spl5();	if (rftab.b_actf == NULL)		rftab.b_actf = bp;	else		rftab.b_actl->av_forw = bp;	rftab.b_actl = bp;	if (rftab.b_active == NULL)		rfstart();	spl0();}rfstart(){	register struct buf *bp;	register int com;	if ((bp = rftab.b_actf) == NULL)		return;	rftab.b_active++;	RFADDR->rfda = (int)(bp->b_blkno<<8)&0177777;	RFADDR->rfdae = (int)(bp->b_blkno>>8)&037;	RFADDR->rfba = bp->b_un.b_addr;	RFADDR->rfwc = -(bp->b_bcount>>1);	com = (bp->b_xmem&3) << 4;	com |= (bp->b_flags & B_READ) ? RCOM+GO+IENABLE : WCOM+GO+IENABLE;	RFADDR->rfcs = com;	dk_busy |= 1<<DK_N;	dk_numb[DK_N] += 1;	com = (-bp->b_bcount>>5) & 03777;	dk_wds[DK_N] += com;}rfintr(){	register struct buf *bp;	if (rftab.b_active == NULL)		return;	dk_busy &= ~(1<<DK_N);	bp = rftab.b_actf;	rftab.b_active = NULL;	if (RFADDR->rfcs < 0) {		/* error bit */		deverror(bp, RFADDR->rfcs, RFADDR->rfdae);		RFADDR->rfcs = CTLCLR;		if (++rftab.b_errcnt <= 10) {			rfstart();			return;		}		bp->b_flags |= B_ERROR;	}	rftab.b_errcnt = 0;	rftab.b_actf = bp->av_forw;	bp->b_resid = 0;	iodone(bp);	rfstart();}rfread(dev){	physio(rfstrategy, &rrfbuf, dev, B_READ);}rfwrite(dev){	physio(rfstrategy, &rrfbuf, dev, B_WRITE);}

⌨️ 快捷键说明

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