simdisk.c

来自「操作系统SunOS 4.1.3版本的源码」· C语言 代码 · 共 143 行

C
143
字号
#ifndef lintstatic	char sccsid[] = "@(#)simdisk.c 1.1 92/07/30";#endif/* * Copyright (c) 1987 by Sun Microsystems, Inc. *//* * Dummy driver for sparc simulated disks. *	uses systems calls via simulator to accomplish *	base level open, seek, read, and write operations */int errno;#include <sys/param.h>#include <sys/systm.h>#include <sys/dk.h>#include <sys/buf.h>#include <sys/conf.h>#include <sys/dir.h>#include <sys/user.h>#include <sys/map.h>#include <sys/vmmac.h>#include <sys/ioctl.h>#include <sys/uio.h>#include <sys/kernel.h>#include <sys/dkbad.h>#include <sys/file.h>#include <machine/pte.h>#include <machine/psl.h>#include <machine/mmu.h>#include <machine/cpu.h>#include <sun/dklabel.h>#include <sun/dkio.h>#include <sundev/mbvar.h>#include <sas_simdef.h>	/* Defintions for real devices used by simulator *//* * XXX below should be defined as options to config */struct simdisk {	int	fdes;	int	flag;	int 	size;	char	*name;} simdunits[] = {	0, 0, SIMD_RSIZE, SIMD_RDEV,	0, 0, SIMD_SSIZE, SIMD_SDEV,	0, 0, SIMD_USIZE, SIMD_UDEV};#define MAXSIMDUNITS (sizeof (simdunits) / sizeof (simdunits[0]))/* * Attach device (boot time). */simdattach(md)	register struct mb_device *md;{ }simdopen(dev, flag)	register dev_t dev;	register int flag;{	register int unit;	register char *name;	unit = minor(dev);	if (unit >= MAXSIMDUNITS) {		printf("Illegal simulated disk unit.\n");		return (ENXIO);	}	simdunits[unit].flag = flag;	name = simdunits[unit].name;	if ((simdunits[unit].fdes = s_open(name, O_RDWR)) == -1 ) {		 printf("Couldn't open %s\n", simdunits[unit].name);		return (ENXIO);	}	return(0);}simdsize(dev)	register dev_t dev;{	return (simdunits[minor(dev)].size);}simdstrategy(bp)	register struct buf *bp;{	register daddr_t bn;		/* block number */	register int unit;		/* unit number */	register int fdes;		/* file descriptor */	register int cnt;		/* completed transfer count */	unit = minor(bp->b_dev);	if (unit >= MAXSIMDUNITS) {		printf("simd%d: simdstrategy: invalid unit\n", unit);		bp->b_flags |= B_ERROR;		iodone(bp);		return;	}	bn = dkblock(bp);	fdes = simdunits[unit].fdes;	bp_mapin(bp);	if (s_lseek(fdes, bn << DEV_BSHIFT, L_SET) == -1) {		/* avoid a problem in sas by trying the seek once more */		if (s_lseek(fdes, bn << DEV_BSHIFT, L_SET) == -1) {		  printf("simd%d: can't seek %s\n", unit, simdunits[unit].name);		  printf("block number = 0x%x\n", bn);		  bp->b_flags |= B_ERROR;		}	} else if (bp->b_bcount & (DEV_BSIZE - 1)) {		printf("simd%d: non-block size i/o request\n", unit);		bp->b_flags |= B_ERROR;	} else if (bp->b_flags & B_READ) {		if ((cnt=s_read(fdes, bp->b_un.b_addr, bp->b_bcount)) == -1) {			printf("simd%d: error reading block %d\n", unit, bn);			bp->b_flags |= B_ERROR;		}	} else {		if ((cnt=s_write(fdes, bp->b_un.b_addr, bp->b_bcount)) == -1) {			printf("simd%d: error writing block %d\n", unit, bn);			bp->b_flags |= B_ERROR;		}	}	bp_mapout(bp);	if ((bp->b_flags & B_ERROR) == 0)		bp->b_resid = bp->b_bcount - cnt;	iodone(bp);}

⌨️ 快捷键说明

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