Major revamp of the boot code.
- Good bye SYS_PBOOT and SYS_NBOOT, hello SYS_UBOOT (unified boot) Currently supports booting from SCSI and HP-IB disk and network from a single boot block. Infrastructure for booting from HP-IB tape is there, but it doesn't quite work yet. - Add a slightly modified version of Gordon Ross's "rawfs", which provides a filesystem-like interface to tape devices. Still needs debugging (see above). - Rename sys_inst.c to inst.c, so that the LIF directory entry turns out right (used to look like SYS_SYS_I if loaded from tape). - Add a "netio_ask" hint to netio.c, so that a special instnetio.o doesn't have to be compiled for SYS_INST. Defaults to using bootparams, but if set, will prompt user for information usually obtained from bootparams. - General cleanup.
This commit is contained in:
parent
a63c9b84e2
commit
fc699e8440
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.19 1996/01/15 01:41:37 thorpej Exp $
|
||||
# $NetBSD: Makefile,v 1.20 1996/06/26 17:44:21 thorpej Exp $
|
||||
|
||||
# @(#)Makefile 8.1 (Berkeley) 6/10/93
|
||||
|
||||
|
@ -39,7 +39,7 @@ LIBSA= ${SA_LIB}
|
|||
|
||||
LIBS= ${OBJS} libdrive.a ${LIBSA} ${LIBKERN}
|
||||
|
||||
BOOTS= pboot netboot sys_inst dboot dcopy tboot tcopy cat #ls
|
||||
BOOTS= uboot inst
|
||||
ALL= ${BOOTS} mkboot installboot
|
||||
|
||||
all: ${ALL}
|
||||
|
@ -62,76 +62,21 @@ ite.o ite_subr.o ite_dv.o ite_gb.o ite_hy.o ite_rb.o ite_tc.o: Makefile
|
|||
srt0.o: ${.CURDIR}/srt0.s
|
||||
${CC} ${INCPATH} ${DEFS} -c ${.CURDIR}/srt0.s
|
||||
|
||||
tpsrt0.o: ${.CURDIR}/srt0.s
|
||||
${CC} ${INCPATH} ${DEFS} -DTP -c ${.CURDIR}/srt0.s -o $@
|
||||
|
||||
# new boot
|
||||
pboot: srt0.o pboot.o tgets.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o pboot.o tgets.o conf.o ${LIBS} -o $@
|
||||
# unified boot program (disk, network, tape)
|
||||
uboot: srt0.o uboot.o tgets.o netio.o clock.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o uboot.o tgets.o netio.o clock.o \
|
||||
conf.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
ls: srt0.o ls.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o ls.o conf.o ${LIBS} -o $@
|
||||
# miniroot installation program
|
||||
inst: srt0.o inst.o clock.o conf.o netio.o tgets.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o inst.o clock.o conf.o netio.o \
|
||||
tgets.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
cat: srt0.o cat.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o cat.o conf.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
# installation
|
||||
sys_inst: srt0.o sys_inst.o clock.o instconf.o inst_netio.o tgets.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o sys_inst.o clock.o instconf.o inst_netio.o tgets.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
instconf.o: ${.CURDIR}/conf.c
|
||||
${CC} ${CFLAGS} -DSYS_INST -c ${.CURDIR}/conf.c -o $@
|
||||
|
||||
inst_netio.o: ${.CURDIR}/netio.c
|
||||
${CC} ${CFLAGS} -DSYS_INST -c ${.CURDIR}/netio.c -o $@
|
||||
|
||||
# bootable from network
|
||||
|
||||
netboot: srt0.o netboot.o clock.o netconf.o netio.o tgets.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o netboot.o clock.o netconf.o netio.o tgets.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
netconf.o: ${.CURDIR}/conf.c
|
||||
${CC} ${CFLAGS} -DNETBOOT -c ${.CURDIR}/conf.c -o $@
|
||||
|
||||
# bootable from tape
|
||||
|
||||
tboot: srt0.o tboot.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o tboot.o conf.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
tboot.o: ${.CURDIR}/boot.c
|
||||
${CC} ${CFLAGS} -DJUSTASK -c ${.CURDIR}/boot.c -o $@
|
||||
|
||||
tcopy: tpsrt0.o copy.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin tpsrt0.o copy.o conf.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
# bootable from floppy or real disks
|
||||
|
||||
dboot: srt0.o boot.o tapeconf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o boot.o tapeconf.o ${LIBS} -o $@
|
||||
@size $@
|
||||
@echo $@ text+data size should not exceed 57344 bytes
|
||||
@echo $@ total size should not exceed 1044480 bytes
|
||||
|
||||
tapeconf.o: ${.CURDIR}/conf.c
|
||||
${CC} ${CFLAGS} -DTAPEBOOT -c ${.CURDIR}/conf.c -o $@
|
||||
|
||||
dcopy: srt0.o copy.o conf.o ${LIBS}
|
||||
${LD} -N -T ${RELOC} -e begin srt0.o copy.o conf.o ${LIBS} -o $@
|
||||
|
||||
# helper program ... turns OMAGIC into LIF
|
||||
mkboot: ${.CURDIR}/mkboot.c
|
||||
${CC} ${CFLAGS} ${.CURDIR}/mkboot.c -o $@
|
||||
|
||||
|
@ -142,35 +87,34 @@ installboot: ${.CURDIR}/installboot.sh
|
|||
# utilities
|
||||
|
||||
clean::
|
||||
rm -f *.o *.exe *.i errs make.out
|
||||
rm -f a.out pboot cat ls tboot tcopy
|
||||
rm -f boot[a-z]? boot[a-wyz][a-z].c conf[a-wyz][a-z].c
|
||||
rm -f core sboot
|
||||
rm -f libdrive.a mkboot dboot dcopy installboot *.lif
|
||||
rm -f *.o *.i
|
||||
rm -f a.out ${BOOTS}
|
||||
rm -f libdrive.a mkboot installboot *.lif
|
||||
|
||||
install: mkboot installboot ${ALL}
|
||||
./mkboot pboot netbsdboot.lif
|
||||
./mkboot netboot netboot.lif
|
||||
./mkboot sys_inst sys_inst.lif
|
||||
./mkboot dboot diskboot.lif
|
||||
./mkboot tboot tcopy tapeboot.lif
|
||||
./mkboot uboot uboot.lif
|
||||
./mkboot inst inst.lif
|
||||
install -d -m 755 -o ${BINOWN} -g ${BINGRP} ${DESTDIR}/usr/mdec/rbootd
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 555 installboot \
|
||||
${DESTDIR}/usr/mdec
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 444 netbsdboot.lif \
|
||||
${DESTDIR}/usr/mdec/rdboot
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 444 uboot.lif \
|
||||
${DESTDIR}/usr/mdec
|
||||
rm -f ${DESTDIR}/usr/mdec/rdboot
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/rdboot
|
||||
rm -f ${DESTDIR}/usr/mdec/bootrd
|
||||
ln ${DESTDIR}/usr/mdec/rdboot ${DESTDIR}/usr/mdec/bootrd
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/bootrd
|
||||
rm -f ${DESTDIR}/usr/mdec/sdboot
|
||||
ln ${DESTDIR}/usr/mdec/rdboot ${DESTDIR}/usr/mdec/sdboot
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/sdboot
|
||||
rm -f ${DESTDIR}/usr/mdec/bootsd
|
||||
ln ${DESTDIR}/usr/mdec/sdboot ${DESTDIR}/usr/mdec/bootsd
|
||||
install -d -m 755 -o ${BINOWN} -g ${BINGRP} ${DESTDIR}/usr/mdec/rbootd
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 444 netboot.lif \
|
||||
${DESTDIR}/usr/mdec/rbootd/SYS_NBOOT
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 444 sys_inst.lif \
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/bootsd
|
||||
rm -f ${DESTDIR}/usr/mdec/ctboot
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/ctboot
|
||||
rm -f ${DESTDIR}/usr/mdec/bootct
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/bootct
|
||||
rm -f ${DESTDIR}/usr/mdec/rbootd/SYS_UBOOT
|
||||
ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/rbootd/SYS_UBOOT
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 444 inst.lif \
|
||||
${DESTDIR}/usr/mdec/rbootd/SYS_INST
|
||||
install -c -o ${BINOWN} -g ${BINGRP} -m 644 tapeboot.lif \
|
||||
${DESTDIR}/usr/mdec/bootct
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
.include <bsd.subdir.mk>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: autoconf.c,v 1.9 1995/08/05 16:47:34 thorpej Exp $ */
|
||||
/* $NetBSD: autoconf.c,v 1.10 1996/06/26 17:44:23 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
|
@ -57,7 +57,9 @@
|
|||
* WARNING: major numbers must match bdevsw indices in hp300/conf.c.
|
||||
*/
|
||||
char rom2mdev[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-13: none */
|
||||
0, 0, /* 0-1: none */
|
||||
6, /* 2: network device; special */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3-13: none */
|
||||
4, /* 14: SCSI disk */
|
||||
0, /* 15: none */
|
||||
2, /* 16: CS/80 device on HPIB */
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
/* $NetBSD: boot.c,v 1.6 1995/02/21 09:06:13 mycroft Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)boot.c 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/reboot.h>
|
||||
#include <a.out.h>
|
||||
#include "stand.h"
|
||||
|
||||
/*
|
||||
* Boot program... bits in `howto' determine whether boot stops to
|
||||
* ask for system name. Boot device is derived from ROM provided
|
||||
* information.
|
||||
*/
|
||||
|
||||
char line[100];
|
||||
|
||||
extern u_int opendev;
|
||||
extern char *lowram;
|
||||
extern int noconsole;
|
||||
extern int howto, bootdev;
|
||||
|
||||
main()
|
||||
{
|
||||
int retry, type;
|
||||
|
||||
printf("%s CPU\nBoot\n", getmachineid());
|
||||
#ifdef JUSTASK
|
||||
howto = RB_ASKNAME|RB_SINGLE;
|
||||
#else
|
||||
if ((howto & RB_ASKNAME) == 0) {
|
||||
type = (bootdev >> B_TYPESHIFT) & B_TYPEMASK;
|
||||
if ((unsigned)type < ndevs && devsw[type].dv_name)
|
||||
strcpy(line, "/netbsd");
|
||||
else
|
||||
howto |= RB_SINGLE|RB_ASKNAME;
|
||||
}
|
||||
#endif
|
||||
for (retry = 0;;) {
|
||||
if (!noconsole && (howto & RB_ASKNAME)) {
|
||||
printf(": ");
|
||||
gets(line);
|
||||
if (line[0] == 0) {
|
||||
strcpy(line, "/netbsd");
|
||||
printf(": %s\n", line);
|
||||
}
|
||||
} else
|
||||
printf(": %s\n", line);
|
||||
exec(line, lowram, howto);
|
||||
printf("boot: %s\n", strerror(errno));
|
||||
howto |= RB_SINGLE|RB_ASKNAME;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
machdep_start(entry, howto, loadaddr, ssym, esym)
|
||||
char *entry;
|
||||
int howto;
|
||||
char *loadaddr;
|
||||
char *ssym, *esym;
|
||||
{
|
||||
|
||||
asm("movl %0,d7" : : "m" (howto));
|
||||
asm("movl %0,d6" : : "m" (opendev));
|
||||
asm("movl %0,a5" : : "a" (loadaddr));
|
||||
asm("movl %0,a4" : : "a" (esym));
|
||||
(*((int (*)())entry))();
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: conf.c,v 1.10 1995/09/23 17:28:11 thorpej Exp $ */
|
||||
/* $NetBSD: conf.c,v 1.11 1996/06/26 17:44:26 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
|
@ -39,7 +39,6 @@
|
|||
|
||||
#include "stand.h"
|
||||
|
||||
#if defined(NETBOOT) || defined(SYS_INST)
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
|
@ -47,38 +46,22 @@
|
|||
#include <netinet/in_systm.h>
|
||||
|
||||
#include "nfs.h"
|
||||
|
||||
#endif /* NETBOOT || SYS_INST */
|
||||
|
||||
#ifndef NETBOOT
|
||||
#include "rawfs.h"
|
||||
#include "ufs.h"
|
||||
#endif /* ! NETBOOT */
|
||||
|
||||
int debug = 0; /* XXX */
|
||||
|
||||
/*
|
||||
* Device configuration
|
||||
*/
|
||||
#if defined(NETBOOT) || defined(SYS_INST)
|
||||
int netstrategy __P((void *, int, daddr_t, size_t, void *, size_t *));
|
||||
int netopen __P((struct open_file *, ...));
|
||||
int netclose __P((struct open_file *));
|
||||
#define netioctl noioctl
|
||||
#endif /* NETBOOT || SYS_INST */
|
||||
|
||||
#ifndef NETBOOT
|
||||
/* XXX: no support for tapes in SYS_INST yet. */
|
||||
#ifdef TAPEBOOT
|
||||
int ctstrategy __P((void *, int, daddr_t, size_t, void *, size_t *));
|
||||
int ctopen __P((struct open_file *, ...));
|
||||
int ctclose __P((struct open_file *));
|
||||
#else
|
||||
#define ctstrategy \
|
||||
(int (*) __P((void *, int, daddr_t, size_t, void *, size_t *)))nullsys
|
||||
#define ctopen (int (*) __P((struct open_file *, ...)))nodev
|
||||
#define ctclose (int (*) __P((struct open_file *)))nullsys
|
||||
#endif /* TAPEBOOT */
|
||||
|
||||
#define ctioctl noioctl
|
||||
|
||||
int rdstrategy __P((void *, int, daddr_t, size_t, void *, size_t *));
|
||||
|
@ -96,46 +79,46 @@ int sdclose __P((struct open_file *));
|
|||
#define xxopen (int (*) __P((struct open_file *, ...)))nodev
|
||||
#define xxclose (int (*) __P((struct open_file *)))nullsys
|
||||
|
||||
#endif /* ! NETBOOT */
|
||||
|
||||
/*
|
||||
* Note: "le" isn't a major offset.
|
||||
*/
|
||||
struct devsw devsw[] = {
|
||||
#ifdef NETBOOT
|
||||
{ "le", netstrategy, netopen, netclose, netioctl }, /*0*/
|
||||
#else
|
||||
{ "ct", ctstrategy, ctopen, ctclose, ctioctl }, /*0*/
|
||||
{ "??", xxstrategy, xxopen, xxclose, noioctl }, /*1*/
|
||||
{ "rd", rdstrategy, rdopen, rdclose, rdioctl }, /*2*/
|
||||
{ "??", xxstrategy, xxopen, xxclose, noioctl }, /*3*/
|
||||
{ "sd", sdstrategy, sdopen, sdclose, sdioctl }, /*4*/
|
||||
#ifdef SYS_INST
|
||||
{ "le", netstrategy, netopen, netclose, netioctl },
|
||||
#endif /* SYS_INST */
|
||||
#endif /* NETBOOT */
|
||||
{ "??", xxstrategy, xxopen, xxclose, noioctl }, /*5*/
|
||||
{ "le", netstrategy, netopen, netclose, netioctl },/*6*/
|
||||
};
|
||||
int ndevs = (sizeof(devsw)/sizeof(devsw[0]));
|
||||
int ndevs = (sizeof(devsw) / sizeof(devsw[0]));
|
||||
|
||||
/*
|
||||
* Filesystem configuration
|
||||
*/
|
||||
struct fs_ops file_system[] = {
|
||||
#ifndef NETBOOT
|
||||
{ ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat },
|
||||
#endif /* ! NETBOOT */
|
||||
#if defined(NETBOOT) || defined(SYS_INST)
|
||||
{ nfs_open, nfs_close, nfs_read, nfs_write, nfs_seek, nfs_stat },
|
||||
#endif /* NETBOOT || SYS_INST */
|
||||
};
|
||||
|
||||
int nfsys = (sizeof(file_system) / sizeof(file_system[0]));
|
||||
|
||||
#if defined(NETBOOT) || defined(SYS_INST)
|
||||
extern struct netif_driver le_driver;
|
||||
|
||||
struct netif_driver *netif_drivers[] = {
|
||||
&le_driver,
|
||||
};
|
||||
int n_netif_drivers = sizeof(netif_drivers)/sizeof(netif_drivers[0]);
|
||||
#endif /* NETBOOT */
|
||||
int n_netif_drivers = (sizeof(netif_drivers) / sizeof(netif_drivers[0]));
|
||||
|
||||
/*
|
||||
* Filesystem configuration
|
||||
*/
|
||||
struct fs_ops file_system_rawfs[] = {
|
||||
{ rawfs_open, rawfs_close, rawfs_read, rawfs_write, rawfs_seek,
|
||||
rawfs_stat },
|
||||
};
|
||||
|
||||
struct fs_ops file_system_ufs[] = {
|
||||
{ ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat },
|
||||
};
|
||||
|
||||
struct fs_ops file_system_nfs[] = {
|
||||
{ nfs_open, nfs_close, nfs_read, nfs_write, nfs_seek, nfs_stat },
|
||||
};
|
||||
|
||||
struct fs_ops file_system[1];
|
||||
int nfsys = 1; /* we always know which one we want */
|
||||
|
||||
|
||||
/*
|
||||
* Inititalize controllers
|
||||
|
@ -144,11 +127,7 @@ int n_netif_drivers = sizeof(netif_drivers)/sizeof(netif_drivers[0]);
|
|||
*/
|
||||
void ctlrinit()
|
||||
{
|
||||
#if defined(NETBOOT) || defined(SYS_INST)
|
||||
leinit();
|
||||
#endif /* NETBOOT || SYS_INST */
|
||||
#ifndef NETBOOT
|
||||
hpibinit();
|
||||
scsiinit();
|
||||
#endif /* ! NETBOOT */
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* $NetBSD: devopen.c,v 1.5 1995/08/05 16:47:41 thorpej Exp $ */
|
||||
/* $NetBSD: devopen.c,v 1.6 1996/06/26 17:44:28 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
|
||||
* Copyright (c) 1993 John Brezak
|
||||
* All rights reserved.
|
||||
*
|
||||
|
@ -61,10 +62,38 @@ devlookup(d, len)
|
|||
struct devsw *dp = devsw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ndevs; i++, dp++)
|
||||
if (dp->dv_name && strncmp(dp->dv_name, d, len) == 0)
|
||||
return(i);
|
||||
for (i = 0; i < ndevs; i++, dp++) {
|
||||
if (dp->dv_name && strncmp(dp->dv_name, d, len) == 0) {
|
||||
/*
|
||||
* Set the filesystem and startup up according to the device
|
||||
* being opened.
|
||||
*/
|
||||
switch (i) {
|
||||
case 0: /* ct */
|
||||
bcopy(file_system_rawfs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_disk_tape;
|
||||
break;
|
||||
|
||||
case 2: /* rd */
|
||||
case 4: /* sd */
|
||||
bcopy(file_system_ufs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_disk_tape;
|
||||
break;
|
||||
|
||||
case 6: /* le */
|
||||
bcopy(file_system_nfs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_net;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Agh! What happened?! */
|
||||
goto bad;
|
||||
}
|
||||
return(i);
|
||||
}
|
||||
}
|
||||
|
||||
bad:
|
||||
printf("No such device - Configured devices are:\n");
|
||||
for (dp = devsw, i = 0; i < ndevs; i++, dp++)
|
||||
if (dp->dv_name)
|
||||
|
@ -187,7 +216,38 @@ devopen(f, fname, file)
|
|||
ctlr = B_CONTROLLER(bootdev);
|
||||
unit = B_UNIT(bootdev);
|
||||
part = B_PARTITION(bootdev);
|
||||
|
||||
|
||||
/*
|
||||
* Set up defaults for filesystem and startup, according to
|
||||
* type detetect by the BOOT ROM.
|
||||
*/
|
||||
switch (dev) {
|
||||
case 0: /* ct */
|
||||
bcopy(file_system_rawfs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_disk_tape;
|
||||
break;
|
||||
|
||||
case 2: /* rd */
|
||||
case 4: /* sd */
|
||||
bcopy(file_system_ufs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_disk_tape;
|
||||
break;
|
||||
|
||||
case 6: /* le */
|
||||
bcopy(file_system_nfs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_net;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* XXX what else should we do here? */
|
||||
printf("WARNING: BOGUS BOOT DEV TYPE 0x%x!\n", dev);
|
||||
printf("FALLING BACK ON `sd'\n");
|
||||
bcopy(file_system_ufs, file_system, sizeof(struct fs_ops));
|
||||
__machdep_start = machdep_start_disk_tape;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (error = devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file))
|
||||
return(error);
|
||||
|
||||
|
@ -197,9 +257,9 @@ devopen(f, fname, file)
|
|||
return(ENODEV);
|
||||
|
||||
opendev = MAKEBOOTDEV(dev, adapt, ctlr, unit, part);
|
||||
|
||||
|
||||
f->f_dev = dp;
|
||||
|
||||
|
||||
if ((error = (*dp->dv_open)(f, adapt, ctlr, part)) == 0)
|
||||
return(0);
|
||||
|
||||
|
@ -207,4 +267,4 @@ devopen(f, fname, file)
|
|||
adapt, ctlr, unit, part, strerror(error));
|
||||
|
||||
return(error);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: sys_inst.c,v 1.3 1995/10/04 07:24:33 thorpej Exp $ */
|
||||
/* $NetBSD: inst.c,v 1.1 1996/06/26 17:44:29 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe.
|
||||
|
@ -69,6 +69,7 @@ extern u_int opendev;
|
|||
extern char *lowram;
|
||||
extern int noconsole;
|
||||
extern int cons_scode;
|
||||
extern int netio_ask;
|
||||
|
||||
char *kernel_name = "/netbsd";
|
||||
|
||||
|
@ -99,9 +100,15 @@ main()
|
|||
{
|
||||
int i, currname = 0;
|
||||
|
||||
printf("\n>> NetBSD INSTALLATION HP9000/%s CPU\n",
|
||||
/*
|
||||
* We want netopen() to ask for IP address, etc, rather
|
||||
* that using bootparams.
|
||||
*/
|
||||
netio_ask = 1;
|
||||
|
||||
printf("\n>> NetBSD MINIROOT INSTALLATION HP9000/%s CPU\n",
|
||||
getmachineid());
|
||||
printf(">> $NetBSD: sys_inst.c,v 1.3 1995/10/04 07:24:33 thorpej Exp $\n");
|
||||
printf(">> $NetBSD: inst.c,v 1.1 1996/06/26 17:44:29 thorpej Exp $\n");
|
||||
gethelp();
|
||||
|
||||
for (;;) {
|
|
@ -1,13 +1,15 @@
|
|||
# $NetBSD: Makefile,v 1.4 1996/01/30 19:47:32 thorpej Exp $
|
||||
# $NetBSD: Makefile,v 1.5 1996/06/26 17:44:42 thorpej Exp $
|
||||
|
||||
LIB= sa
|
||||
|
||||
.PATH: ${.CURDIR}/../../../../lib/libsa
|
||||
.PATH: ${.CURDIR}/..
|
||||
|
||||
# Don't need these now...
|
||||
# DEBUGFLAGS=-DNETIF_DEBUG -DRPC_DEBUG -DNFS_DEBUG -DRARP_DEBUG -DNET_DEBUG
|
||||
|
||||
CFLAGS+=-DSTANDALONE -DCOMPAT_UFS ${DEBUGFLAGS}
|
||||
CFLAGS+=-DSTANDALONE -DCOMPAT_UFS -DNO_LSEEK ${DEBUGFLAGS}
|
||||
CFLAGS+=-I${.CURDIR}/..
|
||||
CFLAGS+=-I${.CURDIR}/../../../.. -I${.CURDIR}/../../../../lib/libsa
|
||||
|
||||
# stand routines
|
||||
|
@ -25,7 +27,7 @@ SRCS+= arp.c ether.c in_cksum.c net.c netif.c rpc.c
|
|||
SRCS+= bootp.c bootparam.c rarp.c
|
||||
|
||||
# boot filesystems
|
||||
SRCS+= ufs.c nfs.c
|
||||
SRCS+= ufs.c nfs.c rawfs.o
|
||||
|
||||
NOPROFILE=
|
||||
NOPIC=
|
||||
|
|
|
@ -1,162 +0,0 @@
|
|||
/* $NetBSD: netboot.c,v 1.10 1995/10/04 07:24:32 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)boot.c 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/reboot.h>
|
||||
#include <a.out.h>
|
||||
#include "stand.h"
|
||||
#include "samachdep.h"
|
||||
|
||||
/*
|
||||
* Boot program... bits in `howto' determine whether boot stops to
|
||||
* ask for system name. Boot device is derived from ROM provided
|
||||
* information.
|
||||
*/
|
||||
|
||||
char line[100];
|
||||
|
||||
extern u_int opendev;
|
||||
extern char *lowram;
|
||||
extern int noconsole;
|
||||
extern int cons_scode;
|
||||
|
||||
char *name;
|
||||
char *names[] = {
|
||||
"netbsd", "onetbsd", "netbsd.old",
|
||||
};
|
||||
#define NUMNAMES (sizeof(names)/sizeof(char *))
|
||||
|
||||
static int bdev, badapt, bctlr, bunit, bpart;
|
||||
|
||||
main()
|
||||
{
|
||||
int currname = 0;
|
||||
|
||||
/*
|
||||
* XXX: different versions of the HP boot rom seem to report
|
||||
* different things, so we have to compensate.
|
||||
*/
|
||||
bootdev = MAKEBOOTDEV(0, 0, 0, 0, 0);
|
||||
|
||||
printf("\n>> NetBSD NETWORK BOOT HP9000/%s CPU\n",
|
||||
getmachineid());
|
||||
printf(">> $NetBSD: netboot.c,v 1.10 1995/10/04 07:24:32 thorpej Exp $\n");
|
||||
printf(">> Enter \"reset\" to reset system.\n");
|
||||
|
||||
bdev = B_TYPE(bootdev);
|
||||
badapt = B_ADAPTOR(bootdev);
|
||||
bctlr = B_CONTROLLER(bootdev);
|
||||
bunit = B_UNIT(bootdev);
|
||||
bpart = B_PARTITION(bootdev);
|
||||
|
||||
for (;;) {
|
||||
name = names[currname++];
|
||||
if (currname == NUMNAMES)
|
||||
currname = 0;
|
||||
|
||||
if (!noconsole) {
|
||||
howto = 0;
|
||||
getbootname(&howto);
|
||||
} else
|
||||
printf(": %s\n", name);
|
||||
|
||||
exec(name, lowram, howto);
|
||||
printf("boot: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
getbootname(howto)
|
||||
int *howto;
|
||||
{
|
||||
char c, *ptr = line;
|
||||
|
||||
printf("Boot: [%s][-s][-a][-d] :- ", name);
|
||||
|
||||
if (tgets(line)) {
|
||||
if (strcmp(line, "reset") == 0) {
|
||||
call_req_reboot(); /* reset machine */
|
||||
printf("panic: can't reboot, halting\n");
|
||||
asm("stop #0x2700");
|
||||
}
|
||||
|
||||
while (c = *ptr) {
|
||||
while (c == ' ')
|
||||
c = *++ptr;
|
||||
if (!c)
|
||||
return;
|
||||
if (c == '-')
|
||||
while ((c = *++ptr) && c != ' ')
|
||||
switch (c) {
|
||||
case 'a':
|
||||
*howto |= RB_ASKNAME;
|
||||
continue;
|
||||
case 's':
|
||||
*howto |= RB_SINGLE;
|
||||
continue;
|
||||
case 'd':
|
||||
*howto |= RB_KDB;
|
||||
continue;
|
||||
case 'b':
|
||||
*howto |= RB_HALT;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
name = ptr;
|
||||
while ((c = *++ptr) && c != ' ');
|
||||
if (c)
|
||||
*ptr++ = 0;
|
||||
}
|
||||
}
|
||||
} else
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void
|
||||
machdep_start(entry, howto, loadaddr, ssym, esym)
|
||||
char *entry;
|
||||
int howto;
|
||||
char *loadaddr;
|
||||
char *ssym, *esym;
|
||||
{
|
||||
|
||||
asm("movl %0,d7" : : "m" (howto));
|
||||
asm("movl #0,d6"); /* tell setroot we've netbooted */
|
||||
asm("movl %0,d5" : : "m" (cons_scode));
|
||||
asm("movl %0,a5" : : "a" (loadaddr));
|
||||
asm("movl %0,a4" : : "a" (esym));
|
||||
(*((int (*)())entry))();
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/* $NetBSD: netio.c,v 1.2 1995/09/23 17:31:10 thorpej Exp $ */
|
||||
/* $NetBSD: netio.c,v 1.3 1996/06/26 17:44:32 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Jason R. Thorpe
|
||||
* Copyright (c) 1995, 1996 Jason R. Thorpe
|
||||
* Copyright (c) 1995 Gordon W. Ross
|
||||
* All rights reserved.
|
||||
*
|
||||
|
@ -71,9 +71,9 @@ char rootpath[FNAME_SIZE];
|
|||
int netdev_sock = -1;
|
||||
static int open_count;
|
||||
|
||||
#ifdef SYS_INST
|
||||
int netio_ask = 0; /* default to bootparam, can override */
|
||||
|
||||
static char input_line[100];
|
||||
#endif
|
||||
|
||||
/* Why be any different? */
|
||||
#define SUN_BOOTPARAMS
|
||||
|
@ -131,64 +131,68 @@ netmountroot(f, devname)
|
|||
char *devname; /* Device part of file name (or NULL). */
|
||||
{
|
||||
int error;
|
||||
#ifdef SYS_INST
|
||||
struct iodesc *d;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("netmountroot: %s\n", devname);
|
||||
#endif
|
||||
|
||||
#ifdef SYS_INST
|
||||
if (netio_ask) {
|
||||
get_my_ip:
|
||||
printf("My IP address? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((myip.s_addr = inet_addr(input_line)) == htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_my_ip;
|
||||
}
|
||||
printf("My IP address? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((myip.s_addr = inet_addr(input_line)) ==
|
||||
htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_my_ip;
|
||||
}
|
||||
|
||||
get_my_netmask:
|
||||
printf("My netmask? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((netmask = inet_addr(input_line)) == htonl(INADDR_NONE)) {
|
||||
printf("invalid netmask: %s\n", input_line);
|
||||
goto get_my_netmask;
|
||||
}
|
||||
printf("My netmask? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((netmask = inet_addr(input_line)) ==
|
||||
htonl(INADDR_NONE)) {
|
||||
printf("invalid netmask: %s\n", input_line);
|
||||
goto get_my_netmask;
|
||||
}
|
||||
|
||||
get_my_gateway:
|
||||
printf("My gateway? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((gateip.s_addr = inet_addr(input_line)) == htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_my_gateway;
|
||||
}
|
||||
printf("My gateway? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((gateip.s_addr = inet_addr(input_line)) ==
|
||||
htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_my_gateway;
|
||||
}
|
||||
|
||||
get_server_ip:
|
||||
printf("Server IP address? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((rootip.s_addr = inet_addr(input_line)) == htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_server_ip;
|
||||
}
|
||||
printf("Server IP address? ");
|
||||
bzero(input_line, sizeof(input_line));
|
||||
gets(input_line);
|
||||
if ((rootip.s_addr = inet_addr(input_line)) ==
|
||||
htonl(INADDR_NONE)) {
|
||||
printf("invalid IP address: %s\n", input_line);
|
||||
goto get_server_ip;
|
||||
}
|
||||
|
||||
get_server_path:
|
||||
printf("Server path? ");
|
||||
bzero(rootpath, sizeof(rootpath));
|
||||
gets(rootpath);
|
||||
if (rootpath[0] == '\0' || rootpath[0] == '\n')
|
||||
goto get_server_path;
|
||||
printf("Server path? ");
|
||||
bzero(rootpath, sizeof(rootpath));
|
||||
gets(rootpath);
|
||||
if (rootpath[0] == '\0' || rootpath[0] == '\n')
|
||||
goto get_server_path;
|
||||
|
||||
if ((d = socktodesc(netdev_sock)) == NULL)
|
||||
return (EMFILE);
|
||||
if ((d = socktodesc(netdev_sock)) == NULL)
|
||||
return (EMFILE);
|
||||
|
||||
d->myip = myip;
|
||||
d->myip = myip;
|
||||
|
||||
goto do_nfs_mount;
|
||||
}
|
||||
|
||||
#else /* SYS_INST */
|
||||
/*
|
||||
* Get info for NFS boot: our IP address, our hostname,
|
||||
* server IP address, and our root path on the server.
|
||||
|
@ -233,8 +237,7 @@ netmountroot(f, devname)
|
|||
|
||||
printf("root addr=%s path=%s\n", inet_ntoa(rootip), rootpath);
|
||||
|
||||
#endif /* SYS_INST */
|
||||
|
||||
do_nfs_mount:
|
||||
/* Get the NFS file handle (mount). */
|
||||
error = nfs_mount(netdev_sock, rootip, rootpath);
|
||||
|
||||
|
|
|
@ -0,0 +1,207 @@
|
|||
/* $NetBSD: rawfs.c,v 1.1 1996/06/26 17:44:35 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Gordon W. Ross
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
* 4. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Gordon W. Ross
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Raw file system - for stream devices like tapes.
|
||||
* No random access, only sequential read allowed.
|
||||
* This exists only to allow upper level code to be
|
||||
* shielded from the fact that the device must be
|
||||
* read only with whole block position and size.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <stand.h>
|
||||
#include <rawfs.h>
|
||||
|
||||
extern int debug;
|
||||
|
||||
/* Our devices are generally willing to do 8K transfers. */
|
||||
#define RAWFS_BSIZE 0x2000
|
||||
|
||||
/*
|
||||
* In-core open file.
|
||||
*/
|
||||
struct file {
|
||||
daddr_t fs_nextblk; /* block number to read next */
|
||||
int fs_len; /* amount left in f_buf */
|
||||
char * fs_ptr; /* read pointer into f_buf */
|
||||
char fs_buf[RAWFS_BSIZE];
|
||||
};
|
||||
|
||||
static int
|
||||
rawfs_get_block __P((struct open_file *));
|
||||
|
||||
int rawfs_open(path, f)
|
||||
char *path;
|
||||
struct open_file *f;
|
||||
{
|
||||
struct file *fs;
|
||||
|
||||
/*
|
||||
* The actual PROM driver has already been opened.
|
||||
* Just allocate the I/O buffer, etc.
|
||||
*/
|
||||
fs = alloc(sizeof(struct file));
|
||||
fs->fs_nextblk = 0;
|
||||
fs->fs_len = 0;
|
||||
fs->fs_ptr = fs->fs_buf;
|
||||
|
||||
#ifdef DEBUG_RAWFS
|
||||
printf("rawfs_open: fs=0x%x\n", fs);
|
||||
#endif
|
||||
|
||||
f->f_fsdata = fs;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int rawfs_close(f)
|
||||
struct open_file *f;
|
||||
{
|
||||
struct file *fs;
|
||||
|
||||
fs = (struct file *) f->f_fsdata;
|
||||
f->f_fsdata = (void *)0;
|
||||
|
||||
#ifdef DEBUG_RAWFS
|
||||
if (debug) {
|
||||
printf("rawfs_close: breakpoint...", fs->fs_buf);
|
||||
__asm (" trap #0");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (fs != (struct file *)0)
|
||||
free(fs, sizeof(*fs));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int rawfs_read(f, start, size, resid)
|
||||
struct open_file *f;
|
||||
void *start;
|
||||
u_int size;
|
||||
u_int *resid;
|
||||
{
|
||||
struct file *fs = (struct file *)f->f_fsdata;
|
||||
char *addr = start;
|
||||
int error = 0;
|
||||
size_t csize;
|
||||
|
||||
while (size != 0) {
|
||||
|
||||
if (fs->fs_len == 0)
|
||||
if ((error = rawfs_get_block(f)) != 0)
|
||||
break;
|
||||
|
||||
if (fs->fs_len <= 0)
|
||||
break; /* EOF */
|
||||
|
||||
csize = size;
|
||||
if (csize > fs->fs_len)
|
||||
csize = fs->fs_len;
|
||||
|
||||
bcopy(fs->fs_ptr, addr, csize);
|
||||
fs->fs_ptr += csize;
|
||||
fs->fs_len -= csize;
|
||||
addr += csize;
|
||||
size -= csize;
|
||||
}
|
||||
if (resid)
|
||||
*resid = size;
|
||||
return (error);
|
||||
}
|
||||
|
||||
int rawfs_write(f, start, size, resid)
|
||||
struct open_file *f;
|
||||
void *start;
|
||||
size_t size;
|
||||
size_t *resid; /* out */
|
||||
{
|
||||
#ifdef DEBUG_RAWFS
|
||||
panic("rawfs_write");
|
||||
#endif
|
||||
return (EROFS);
|
||||
}
|
||||
|
||||
off_t rawfs_seek(f, offset, where)
|
||||
struct open_file *f;
|
||||
off_t offset;
|
||||
int where;
|
||||
{
|
||||
#ifdef DEBUG_RAWFS
|
||||
panic("rawfs_seek");
|
||||
#endif
|
||||
return (EFTYPE);
|
||||
}
|
||||
|
||||
int rawfs_stat(f, sb)
|
||||
struct open_file *f;
|
||||
struct stat *sb;
|
||||
{
|
||||
#ifdef DEBUG_RAWFS
|
||||
panic("rawfs_stat");
|
||||
#endif
|
||||
/*
|
||||
* Clear out the stat buffer so that the uid check
|
||||
* won't fail. See sys/lib/libsa/exec.c
|
||||
*/
|
||||
bzero(sb, sizeof(*sb));
|
||||
|
||||
return (EFTYPE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read a block from the underlying stream device
|
||||
* (In our case, a tape drive.)
|
||||
*/
|
||||
static int
|
||||
rawfs_get_block(f)
|
||||
struct open_file *f;
|
||||
{
|
||||
struct file *fs;
|
||||
int error, len;
|
||||
|
||||
fs = (struct file *)f->f_fsdata;
|
||||
fs->fs_ptr = fs->fs_buf;
|
||||
|
||||
twiddle();
|
||||
error = f->f_dev->dv_strategy(f->f_devdata, F_READ,
|
||||
fs->fs_nextblk, RAWFS_BSIZE, fs->fs_buf, &len);
|
||||
|
||||
if (!error) {
|
||||
fs->fs_len = len;
|
||||
fs->fs_nextblk += (RAWFS_BSIZE / DEV_BSIZE);
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
/* $NetBSD: rawfs.h,v 1.1 1996/06/26 17:44:36 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Raw file system - for stream devices like tapes.
|
||||
* No random access, only sequential read allowed.
|
||||
*/
|
||||
|
||||
int rawfs_open __P((char *path, struct open_file *f));
|
||||
int rawfs_close __P((struct open_file *f));
|
||||
int rawfs_read __P((struct open_file *f, void *buf,
|
||||
u_int size, u_int *resid));
|
||||
int rawfs_write __P((struct open_file *f, void *buf,
|
||||
u_int size, u_int *resid));
|
||||
off_t rawfs_seek __P((struct open_file *f, off_t offset, int where));
|
||||
int rawfs_stat __P((struct open_file *f, struct stat *sb));
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: samachdep.h,v 1.5 1995/08/05 16:47:50 thorpej Exp $ */
|
||||
/* $NetBSD: samachdep.h,v 1.6 1996/06/26 17:44:37 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1990, 1993
|
||||
|
@ -35,6 +35,8 @@
|
|||
* @(#)samachdep.h 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#define NHPIB 4
|
||||
#define NSCSI 2
|
||||
#define NRD 8
|
||||
|
@ -71,9 +73,23 @@ extern int howto;
|
|||
extern unsigned int bootdev;
|
||||
extern char *getmachineid();
|
||||
|
||||
void machdep_start_net __P((char *, int, char *, char *, char *));
|
||||
void machdep_start_disk_tape __P((char *, int, char *, char *, char *));
|
||||
void (*__machdep_start) __P((char *, int, char *, char *, char *));
|
||||
|
||||
#define DELAY(n) { register int N = cpuspeed * (n); while (--N > 0); }
|
||||
|
||||
/* bogon grfinfo structure to keep grf_softc happy */
|
||||
struct grfinfo {
|
||||
int grf_foo;
|
||||
};
|
||||
|
||||
extern struct devsw devsw_net[];
|
||||
extern int ndevs_net;
|
||||
|
||||
extern struct devsw devsw_general[];
|
||||
extern int ndevs_general;
|
||||
|
||||
extern struct fs_ops file_system_rawfs[];
|
||||
extern struct fs_ops file_system_ufs[];
|
||||
extern struct fs_ops file_system_nfs[];
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pboot.c,v 1.10 1995/10/04 07:24:31 thorpej Exp $ */
|
||||
/* $NetBSD: uboot.c,v 1.1 1996/06/26 17:44:39 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
|
@ -54,11 +54,14 @@ extern char *lowram;
|
|||
extern int noconsole;
|
||||
extern int cons_scode;
|
||||
|
||||
/*
|
||||
* XXX UFS accepts a /, NFS doesn't.
|
||||
*/
|
||||
char *name;
|
||||
char *names[] = {
|
||||
"/netbsd", "/onetbsd", "/netbsd.old",
|
||||
"netbsd", "onetbsd", "netbsd.old",
|
||||
};
|
||||
#define NUMNAMES (sizeof(names)/sizeof(char *))
|
||||
#define NUMNAMES (sizeof(names) / sizeof(char *))
|
||||
|
||||
static int bdev, badapt, bctlr, bunit, bpart;
|
||||
|
||||
|
@ -66,9 +69,9 @@ main()
|
|||
{
|
||||
int currname = 0;
|
||||
|
||||
printf("\n>> NetBSD BOOT HP9000/%s CPU\n",
|
||||
printf("\n>> NetBSD UNIFIED BOOT HP9000/%s CPU\n",
|
||||
getmachineid());
|
||||
printf(">> $NetBSD: pboot.c,v 1.10 1995/10/04 07:24:31 thorpej Exp $\n");
|
||||
printf(">> $NetBSD: uboot.c,v 1.1 1996/06/26 17:44:39 thorpej Exp $\n");
|
||||
printf(">> Enter \"reset\" to reset system.\n");
|
||||
|
||||
bdev = B_TYPE(bootdev);
|
||||
|
@ -88,11 +91,6 @@ main()
|
|||
} else
|
||||
printf(": %s\n", name);
|
||||
|
||||
#if 0
|
||||
printf("Booting %s%d%c:%s @ 0x%x\n",
|
||||
devsw[dev].dv_name, ctlr + (8 * adapt), 'a' + part, name, x.a_entry);
|
||||
#endif
|
||||
|
||||
exec(name, lowram, howto);
|
||||
printf("boot: %s\n", strerror(errno));
|
||||
}
|
||||
|
@ -145,7 +143,23 @@ getbootdev(howto)
|
|||
}
|
||||
|
||||
void
|
||||
machdep_start(entry, howto, loadaddr, ssym, esym)
|
||||
machdep_start_net(entry, howto, loadaddr, ssym, esym)
|
||||
char *entry;
|
||||
int howto;
|
||||
char *loadaddr;
|
||||
char *ssym, *esym;
|
||||
{
|
||||
|
||||
asm("movl %0,d7" : : "m" (howto));
|
||||
asm("movl #0,d6"); /* tell setroot we've netbooted */
|
||||
asm("movl %0,d5" : : "m" (cons_scode));
|
||||
asm("movl %0,a5" : : "a" (loadaddr));
|
||||
asm("movl %0,a4" : : "a" (esym));
|
||||
(*((int (*)())entry))();
|
||||
}
|
||||
|
||||
void
|
||||
machdep_start_disk_tape(entry, howto, loadaddr, ssym, esym)
|
||||
char *entry;
|
||||
int howto;
|
||||
char *loadaddr;
|
||||
|
@ -159,3 +173,14 @@ machdep_start(entry, howto, loadaddr, ssym, esym)
|
|||
asm("movl %0,a4" : : "a" (esym));
|
||||
(*((int (*)())entry))();
|
||||
}
|
||||
|
||||
void
|
||||
machdep_start(entry, howto, loadaddr, ssym, esym)
|
||||
char *entry;
|
||||
int howto;
|
||||
char *loadaddr;
|
||||
char *ssym, *esym;
|
||||
{
|
||||
|
||||
(*__machdep_start)(entry, howto, loadaddr, ssym, esym);
|
||||
}
|
Loading…
Reference in New Issue