2021-10-11 18:37:13 -03:00

91 lines
2.1 KiB
C

#ifndef lint
static char sccsid[] = "@(#)simdisk.c 1.1 94/10/31";
#endif
/*
* Copyright (c) 1988 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
*/
#include <stand/saio.h>
#include <stand/param.h>
#include <sys/file.h>
#include <sas_simdef.h>
struct simdisk {
int fdes;
int size;
char *name;
} simdunits[] = {
-1, SIMD_RSIZE, SIMD_RDEV,
-1, SIMD_SSIZE, SIMD_SDEV,
};
#define MAXSIMDUNITS (sizeof (simdunits) / sizeof (struct simdisk))
simdopen(sip)
register struct saioreq *sip;
{
register int unit = sip->si_unit;
if (unit >= MAXSIMDUNITS) {
printf("Illegal simulated disk unit.\n");
return (-1);
}
/*
* We may be called to open a device more than once
* (e.g., mount -o remount re-opens the root)
* but since we always open the real file for read/write anyway
* we really don't need to obtain a new file descriptor.
*/
if ((simdunits[unit].fdes == -1) &&
(simdunits[unit].fdes = s_open(simdunits[unit].name, O_RDWR)) == -1) {
printf("Couldn't open %s\n", simdunits[unit].name);
return (-1);
}
return(0);
}
simdstrategy(sip, rw)
register struct saioreq *sip;
register int rw;
{
register int unit; /* unit number */
register int fdes; /* file descriptor */
register int cnt; /* completed transfer count */
unit = minor(sip->si_unit);
if (unit >= MAXSIMDUNITS) {
printf("simd%d: simdstrategy: invalid unit\n", unit);
return(-1);
}
fdes = simdunits[unit].fdes;
if (s_lseek(fdes, sip->si_bn << DEV_BSHIFT, L_SET) == -1) {
printf("simd%d: can't seek %s\n", unit, simdunits[unit].name);
return(-1);
} else if (sip->si_cc & (DEV_BSIZE - 1)) {
printf("simd%d: non-block size i/o request\n", unit);
return(-1);
} else if (rw != WRITE) {
if ((cnt=s_read(fdes, sip->si_ma, sip->si_cc)) == -1) {
printf("simd%d: error reading block %d\n",
unit, sip->si_bn);
return(-1);
}
} else {
if ((cnt=s_write(fdes, sip->si_ma, sip->si_cc)) == -1) {
printf("simd%d: error writing block %d\n",
unit, sip->si_bn);
return(-1);
}
}
return(sip->si_cc - cnt);
}