Files
Arquivotheca.SunOS-4.1.4/sys/boot/lib/common/boot_tp.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

99 lines
2.2 KiB
C

#if !defined(lint) && !defined(BOOTBLOCK)
static char sccsid[] = "@(#)boot_tp.c 1.1 94/10/31 SMI";
#endif
/*
* Copyright (c) 1989 Sun Microsystems, Inc.
*
* SAIO tape device driver using OPENPROMs ROMvec calls
*/
#include <sys/types.h>
#include <stand/saio.h>
#include "boot/conf.h"
extern int romdev, rompclose(), nullprobe(), nullboot();
int tapeopen(), tapestrategy();
struct boottab tapedriver = {
"tp", nullprobe, nullboot, tapeopen, rompclose, tapestrategy,
0, /* b_desc descriptive string */
0, /* b_devinfo memory allocation stuff */
};
int
tapeopen(sip)
register struct saioreq *sip;
{
char namebuf[50];
register struct binfo *bd;
#ifndef sun4m
extern void formatdevname();
#endif sun4m
if (prom_getversion() > 0) {
bd = (struct binfo *)sip->si_devdata;
/* get path name from si_devdata */
romdev = prom_open(bd->name);
/* save file descriptor into si_devdata */
bd->ihandle = romdev;
return (prom_seek(romdev, 0, 0));
}
#ifndef sun4m
formatdevname(namebuf, sip);
#ifdef DEBUG
printf("tapeopen(%s)\n", namebuf);
#endif DEBUG
if ((romdev = prom_open(namebuf)) < 0)
return (-1);
#ifdef DEBUG
printf("skipping %d files\n", sip->si_boff);
#endif DEBUG
return (prom_seek(romdev, sip->si_boff, 0));
#endif !sun4m
}
/*ARGSUSED*/
int
tapestrategy(sip, rw)
register struct saioreq *sip;
register int rw;
{
int i;
register struct binfo *bd;
#ifdef DEBUG
printf("tapestrategy(): %x %x %x ", sip->si_cc, sip->si_ma);
#endif DEBUG
if (prom_getversion() > 0) {
/* get file descriptor */
bd = (struct binfo *)sip->si_devdata;
romdev = bd->ihandle;
if (rw == READ)
i = (*romp->op2_read)(romdev, sip->si_ma, sip->si_cc);
else
i = (*romp->op2_write)(romdev, sip->si_ma, sip->si_cc);
#ifdef DEBUG
printf("xfered %x bytes\n", i);
#endif DEBUG
return (sip->si_cc);
}
#ifndef sun4m
/*
* XXX: so what does offset mean??
* offset from starting position? offset from current position?
* I'll give it 0 for now
*/
if (rw == READ)
i = (*romp->v_read_bytes)(romdev, sip->si_cc, 0, sip->si_ma);
else
i = (*romp->v_write_bytes)(romdev, sip->si_cc, 0, sip->si_ma);
#ifdef DEBUG
printf("xfered %x bytes\n", i);
#endif DEBUG
return (sip->si_cc);
#endif !sun4m
}