-# $OpenBSD: Makefile,v 1.4 1996/10/30 22:40:26 niklas Exp $
-# $NetBSD: Makefile,v 1.4 1996/09/23 04:28:23 cgd Exp $
+# $OpenBSD: Makefile,v 1.5 1997/05/05 06:01:44 millert Exp $
+# $NetBSD: Makefile,v 1.7 1997/04/10 23:03:38 cgd Exp $
-SUBDIR= boot bootxx installboot netboot
+SUBDIR= boot bootxx installboot netboot setnetbootinfo
.include <bsd.subdir.mk>
-# $OpenBSD: Makefile.inc,v 1.3 1996/10/30 22:40:27 niklas Exp $
-# $NetBSD: Makefile.inc,v 1.3 1996/10/06 18:32:22 cgd Exp $
+# $OpenBSD: Makefile.inc,v 1.4 1997/05/05 06:01:45 millert Exp $
+# $NetBSD: Makefile.inc,v 1.8 1997/04/06 08:39:38 cgd Exp $
.include <bsd.own.mk> # for ELF_TOOLCHAIN definition
BINDIR= /usr/mdec
-PRIMARY_LOAD_ADDRESS= 20000000
-SECONDARY_LOAD_ADDRESS= 20020000
+# For descriptions of regions available to bootstrap programs, see
+# section 3.4.1.2 (pp. III 3-14 - III 3-18) of the second edition of
+# the Alpha AXP Architecture Reference Manual.
+
+PRIMARY_LOAD_ADDRESS= 20000000 # "Region 1 start"
+SECONDARY_LOAD_ADDRESS= 20004000 # "Region 1 start" + 32k
+HEAP_LIMIT= 20040000 # "Region 1 start" + 256k
CPPFLAGS+= -DPRIMARY_LOAD_ADDRESS="0x${PRIMARY_LOAD_ADDRESS}"
CPPFLAGS+= -DSECONDARY_LOAD_ADDRESS="0x${SECONDARY_LOAD_ADDRESS}"
+XCPPFLAGS+= -DHEAP_LIMIT="0x${HEAP_LIMIT}"
+
.if !defined(ELF_TOOLCHAIN)
CPPFLAGS+= -DECOFF_COMPAT
.endif
-
-/* $OpenBSD: bbinfo.h,v 1.4 1996/10/30 22:40:28 niklas Exp $ */
-/* $NetBSD: bbinfo.h,v 1.2 1996/04/12 06:09:34 cgd Exp $ */
+/* $OpenBSD: bbinfo.h,v 1.5 1997/05/05 06:01:45 millert Exp $ */
+/* $NetBSD: bbinfo.h,v 1.2 1997/04/06 08:40:57 cgd Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
*/
struct bbinfoloc {
- u_int64_t magic1;
- u_int64_t start;
- u_int64_t end;
- u_int64_t magic2;
+ u_int64_t magic1;
+ u_int64_t start;
+ u_int64_t end;
+ u_int64_t pad1[4];
+ u_int64_t magic2;
};
struct bbinfo {
- int32_t cksum;
- int32_t nblocks;
- int32_t bsize;
- int32_t blocks[1];
+ int32_t cksum;
+ int32_t nblocks;
+ int32_t bsize;
+ int32_t pad1[8];
+ int32_t blocks[1];
+};
+
+struct netbbinfo {
+ u_int64_t magic1;
+ u_int8_t set;
+ u_int8_t ether_addr[6];
+ u_int8_t force;
+ u_int64_t pad1[4];
+ u_int64_t cksum;
+ u_int64_t magic2;
};
-# $OpenBSD: Makefile,v 1.7 1997/04/05 04:26:54 millert Exp $
-# $NetBSD: Makefile,v 1.10 1996/10/18 06:01:41 thorpej Exp $
+# $OpenBSD: Makefile,v 1.8 1997/05/05 06:01:50 millert Exp $
+# $NetBSD: Makefile,v 1.17 1997/04/17 07:27:46 thorpej Exp $
-.PATH: ${.CURDIR}/.. ${.CURDIR}/../../../../lib/libsa
+S= ${.CURDIR}/../../../..
-BOOT_PROG = boot
-BOOT_RELOC = ${SECONDARY_LOAD_ADDRESS}
+.PATH: ${.CURDIR}/..
-BOOT_SRCS = start.S boot.c loadfile.c disk.c conf.c prom.c prom_disp.S OSFpal.c
+PROG = boot
-BOOT_SRCS+= alloc.c bzero.c close.c dev.c devopen.c disklabel.c dkcksum.c
-BOOT_SRCS+= getfile.c gets.c ioctl.c lseek.c open.c printf.c read.c
-BOOT_SRCS+= strcmp.c ufs.c write.c filesystem.c strlen.c
-BOOT_SRCS+= ntohl.c prom_swpal.S
-BOOT_OBJS = ${BOOT_SRCS:N*.h:R:S/$/.o/g}
+SRCS = start.S boot.c loadfile.c disk.c conf.c prom.c prom_disp.S OSFpal.c
+SRCS+= devopen.c filesystem.c prom_swpal.S
+NOMAN=
+INSTALL_STRIP=
+BINMODE= 444
+BOOT_RELOC = ${SECONDARY_LOAD_ADDRESS}
HEADERSIZE_PROG = headersize
+CLEANFILES+= vers.c vers.o ${PROG}.sym ${PROG}.nosym ${HEADERSIZE_PROG}
+
DEFNS= -DCOMPAT_UFS -DALPHA_BOOT_ECOFF # -DALPHA_BOOT_ELF
AFLAGS += -DASSEMBLER ${DEFNS}
-CPPFLAGS += -I${.CURDIR}/../.. -I${.CURDIR}/../../../.. -I${.CURDIR}/../../../../lib/libsa
-CFLAGS = -Werror -mno-fp-regs -g ${DEFNS}
+CPPFLAGS += -I${.CURDIR}/../.. -I${S} ${DEFNS}
+CFLAGS = -Werror -mno-fp-regs
+
+${PROG}.nosym: ${PROG}.sym
+ cp ${PROG}.sym ${PROG}.nosym
+ strip ${PROG}.nosym
+
+${PROG}: ${PROG}.nosym ${HEADERSIZE_PROG}
+ dd if=${PROG}.nosym of=${PROG} \
+ bs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${PROG}.nosym` skip=1
+
+# no lint here (yet?)
+lint:
+
+.include <bsd.prog.mk>
-CLEANFILES+= vers.c vers.o
+### find out what to use for libkern
+KERN_AS= library
+KERNDST= ${.CURDIR}/../libkern/${__objdir}
+.include "${.CURDIR}/../libkern/Makefile.inc"
+LIBKERN= ${KERNLIB}
-.PATH: ${.CURDIR}/../../../../lib/libkern
+### find out what to use for libz
+Z_AS= library
+ZDST= ${.CURDIR}/../libz/${__objdir}
+.include "${.CURDIR}/../libz/Makefile.inc"
+LIBZ= ${ZLIB}
-all: ${BOOT_PROG}
+### find out what to use for libsa
+SA_AS= library
+SADST= ${.CURDIR}/../libsa/${__objdir}
+SAREL=
+SA_ZLIB= yes
+.include "${.CURDIR}/../libsa/Makefile.inc"
+LIBSA= ${SALIB}
-${BOOT_PROG}: ${BOOT_OBJS} ${HEADERSIZE_PROG}
+${PROG}.sym: ${OBJS} ${LIBSA} ${LIBZ} ${LIBKERN}
sh ${.CURDIR}/newvers.sh ${.CURDIR}/version
${COMPILE.c} vers.c
- ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${BOOT_PROG}.hdr \
- ${BOOT_OBJS} vers.o -lc # XXX
- size ${BOOT_PROG}.hdr
- strip ${BOOT_PROG}.hdr
- dd if=${BOOT_PROG}.hdr of=${BOOT_PROG} \
- bs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${BOOT_PROG}.hdr` skip=1
-
-install:
- ${INSTALL} -c -o bin -g bin -m 444 ${BOOT_PROG} \
- ${DESTDIR}${BINDIR}/${BOOT_PROG}
-
-clean: _SUBDIRUSE
- rm -f a.out [Ee]rrs mklog core *.core \
- ${BOOT_PROG} ${BOOT_OBJS} ${CLEANFILES} \
- ${BOOT_PROG}.hdr ${HEADERSIZE_PROG}
-
-cleandir: _SUBDIRUSE clean
-
-.include "${.CURDIR}/../Makefile.inc"
-.include <bsd.obj.mk>
-.include <bsd.dep.mk>
-.include <bsd.subdir.mk>
+ ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${PROG}.sym \
+ ${OBJS} vers.o ${LIBSA} ${LIBZ} ${LIBSA} ${LIBKERN}
+ size ${PROG}.sym
-/* $OpenBSD: boot.c,v 1.8 1996/11/27 19:54:52 niklas Exp $ */
-/* $NetBSD: boot.c,v 1.8 1996/09/17 22:00:26 cgd Exp $ */
+/* $OpenBSD: boot.c,v 1.9 1997/05/05 06:01:51 millert Exp $ */
+/* $NetBSD: boot.c,v 1.10 1997/01/18 01:58:33 cgd Exp $ */
/*
* Copyright (c) 1992, 1993
vm_offset_t ffp_save, ptbr_save;
+int debug;
+
+char *kernelnames[] = {
+ "bsd",
+ "bsd.bak",
+ "bsd.old",
+ "obsd",
+ NULL
+};
+
void
main()
{
+ char *name, **namep;
u_int64_t entry;
+ int win;
/* Init prom callback vector. */
init_prom_calls();
prom_getenv(PROM_E_BOOTED_FILE, boot_file, sizeof(boot_file));
prom_getenv(PROM_E_BOOTED_OSFLAGS, boot_flags, sizeof(boot_flags));
- if (boot_file[0] == '\0')
- bcopy("bsd", boot_file, sizeof "bsd");
+ if (boot_file[0] != 0)
+ (void)printf("Boot file: %s\n", boot_file);
+ (void)printf("Boot flags: %s\n", boot_flags);
- (void)printf("Boot: %s %s\n", boot_file, boot_flags);
+ if (boot_file[0] != '\0')
+ win = (loadfile(name = boot_file, &entry) == 0);
+ else
+ for (namep = kernelnames, win = 0; *namep != NULL && !win;
+ namep++)
+ win = (loadfile(name = *namep, &entry) == 0);
- if (!loadfile(boot_file, &entry)) {
- (void)printf("Entering kernel at 0x%lx...\n", entry);
+ printf("\n");
+ if (win) {
+ (void)printf("Entering %s at 0x%lx...\n", name, entry);
(*(void (*)())entry)(ffp_save, ptbr_save, 0);
}
-/* $OpenBSD: devopen.c,v 1.3 1996/10/30 22:40:41 niklas Exp $ */
+/* $OpenBSD: devopen.c,v 1.4 1997/05/05 06:01:51 millert Exp $ */
/* $NetBSD: devopen.c,v 1.1 1995/11/23 02:39:37 cgd Exp $ */
/*-
cp++;
}
*ncp = '\0';
- /*
- * XXX
- * pulling strchr from the C library, should pull from libkern.
- */
} else if (strchr(cp, '(')) {
/* expect a string like 'rz(0,0,0)vmunix' */
while ((c = *cp) != '\0') {
-/* $OpenBSD: disk.c,v 1.6 1997/04/07 06:23:10 millert Exp $ */
-/* $NetBSD: disk.c,v 1.3 1995/11/23 02:39:40 cgd Exp $ */
+/* $OpenBSD: disk.c,v 1.7 1997/05/05 06:01:52 millert Exp $ */
+/* $NetBSD: disk.c,v 1.6 1997/04/06 08:40:33 cgd Exp $ */
/*
* Copyright (c) 1992, 1993
size_t cnt;
int devlen, i;
char *msg, buf[DEV_BSIZE], devname[32];
- static struct disk_softc *sc;
-
- if (sc != NULL) {
- f->f_devdata = (void *)sc;
- return 0;
- }
+ struct disk_softc *sc;
if (unit >= 8 || part >= MAXPARTITIONS)
return (ENXIO);
if (i || cnt != DEV_BSIZE) {
printf("disk%d: error reading disk label\n", unit);
goto bad;
+ } else if (lp->d_magic != DISKMAGIC) {
+ /* No label at all. Fake all partitions as whole disk. */
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ lp->d_partitions[part].p_offset = 0;
+ lp->d_partitions[part].p_size = 0x7fffffff;
+ }
} else {
msg = getdisklabel(buf, lp);
if (msg) {
-/* $OpenBSD: filesystem.c,v 1.3 1996/10/30 22:40:43 niklas Exp $ */
-/* $NetBSD: filesystem.c,v 1.1 1995/11/23 02:39:46 cgd Exp $ */
+/* $OpenBSD: filesystem.c,v 1.4 1997/05/05 06:01:52 millert Exp $ */
+/* $NetBSD: filesystem.c,v 1.3 1997/04/06 08:40:35 cgd Exp $ */
/*
* Copyright (c) 1993 Philip A. Nelson.
#include <lib/libsa/stand.h>
#include <lib/libsa/ufs.h>
+#include <lib/libsa/cd9660.h>
struct fs_ops file_system[] = {
{ ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat },
+ { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, cd9660_stat },
};
int nfsys = sizeof(file_system)/sizeof(struct fs_ops);
-
-$OpenBSD: version,v 1.5 1996/10/30 22:40:47 niklas Exp $
-$NetBSD: version,v 1.6 1996/06/14 20:03:07 cgd Exp $
+$OpenBSD: version,v 1.6 1997/05/05 06:01:53 millert Exp $
+$NetBSD: version,v 1.9 1997/01/23 23:10:38 cgd Exp $
1.1: Initial version
1.2: don't forget the Id string!
1.6: Don't pass arguments to the kernel, trim unnecessary environment
calls, kill 'ask' loop (i.e. if boot fails, halt), seperate
ECOFF and a.out support into seperate options.
+1.7: Use libsa and libkern rather than building the objects locally.
+1.8: Search for a kernel, if none specified.
+1.9: Add support for gzipped kernels.
-/* $OpenBSD: bootxx.c,v 1.6 1996/11/27 19:54:47 niklas Exp $ */
-/* $NetBSD: bootxx.c,v 1.3 1996/06/14 20:04:45 cgd Exp $ */
+/* $OpenBSD: bootxx.c,v 1.7 1997/05/05 06:01:46 millert Exp $ */
+/* $NetBSD: bootxx.c,v 1.4 1997/01/18 00:28:59 cgd Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
0xbabefacedeadbeef,
(u_int64_t)&start,
(u_int64_t)&_end,
+ { 0, },
0xdeadbeeffacebabe
};
puts("invalid number of blocks in boot program description\n");
return 0;
}
- if (bbinfop->bsize < 4096 || bbinfop->bsize > MAXBSIZE) {
+ if (bbinfop->bsize < DEV_BSIZE || bbinfop->bsize > MAXBSIZE) {
puts("invalid block size in boot program description\n");
return 0;
}
-# $OpenBSD: Makefile,v 1.4 1996/10/30 22:40:48 niklas Exp $
-# $NetBSD: Makefile,v 1.6 1996/10/18 06:02:02 thorpej Exp $
+# $OpenBSD: Makefile,v 1.5 1997/05/05 06:01:53 millert Exp $
+# $NetBSD: Makefile,v 1.12 1997/04/17 07:27:49 thorpej Exp $
-.PATH: ${.CURDIR}/.. ${.CURDIR}/../../../../lib/libsa
+S= ${.CURDIR}/../../../..
-BOOT_PROG = bootxx
-BOOT_RELOC = ${PRIMARY_LOAD_ADDRESS}
+.PATH: ${.CURDIR}/..
+
+PROG = bootxx
-BOOT_SRCS = start.S bootxx.c prom.c prom_disp.S bzero.c puts.c
-BOOT_OBJS = ${BOOT_SRCS:N*.h:R:S/$/.o/g}
+SRCS = start.S bootxx.c prom.c prom_disp.S puts.c
+NOMAN=
+INSTALL_STRIP=
+BINMODE= 444
+BOOT_RELOC = ${PRIMARY_LOAD_ADDRESS}
HEADERSIZE_PROG = headersize
-AFLAGS += -DASSEMBLER
-CPPFLAGS += -I${.CURDIR}/../.. -I${.CURDIR}/../../../.. -DPRIMARY_BOOTBLOCK
-CFLAGS = -Werror -mno-fp-regs -g
+CLEANFILES+= ${PROG}.sym ${PROG}.nosym ${HEADERSIZE_PROG}
+
+DEFNS= -DPRIMARY_BOOTBLOCK
-.PATH: ${.CURDIR}/../../../../lib/libkern
+AFLAGS += -DASSEMBLER ${DEFNS}
+CPPFLAGS += -I${.CURDIR}/../.. -I${S} ${DEFNS}
+CFLAGS = -Werror -mno-fp-regs
-all: ${BOOT_PROG}
+${PROG}.nosym: ${PROG}.sym
+ cp ${PROG}.sym ${PROG}.nosym
+ strip ${PROG}.nosym
-${BOOT_PROG}: ${BOOT_OBJS} ${HEADERSIZE_PROG}
- ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${BOOT_PROG}.hdr \
- ${BOOT_OBJS}
- size ${BOOT_PROG}.hdr
- strip ${BOOT_PROG}.hdr
- dd if=${BOOT_PROG}.hdr of=${BOOT_PROG}.nohdr \
- bs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${BOOT_PROG}.hdr` skip=1
- dd if=${BOOT_PROG}.nohdr of=${BOOT_PROG} bs=`expr 15 \* 512` conv=sync
+${PROG}: ${PROG}.nosym ${HEADERSIZE_PROG}
+ dd if=${PROG}.nosym of=${PROG} \
+ ibs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${PROG}.nosym` skip=1 \
+ obs=`expr 15 \* 512` conv=osync
-install:
- ${INSTALL} -c -o bin -g bin -m 444 ${BOOT_PROG} \
- ${DESTDIR}${BINDIR}/${BOOT_PROG}
+# no lint here (yet?)
+lint:
-clean: _SUBDIRUSE
- rm -f a.out [Ee]rrs mklog core *.core \
- ${BOOT_PROG} ${BOOT_OBJS} ${CLEANFILES} \
- ${BOOT_PROG}.hdr ${BOOT_PROG}.nohdr ${HEADERSIZE_PROG}
+.include <bsd.prog.mk>
-cleandir: _SUBDIRUSE clean
+### find out what to use for libkern
+KERN_AS= library
+KERNDST= ${.CURDIR}/../libkern/${__objdir}
+.include "${.CURDIR}/../libkern/Makefile.inc"
+LIBKERN= ${KERNLIB}
-.include "${.CURDIR}/../Makefile.inc"
-.include <bsd.obj.mk>
-.include <bsd.dep.mk>
-.include <bsd.subdir.mk>
+${PROG}.sym: ${OBJS} ${LIBKERN}
+ ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${PROG}.sym ${OBJS} \
+ ${LIBKERN}
+ size ${PROG}.sym
-.\" $OpenBSD: installboot.8,v 1.2 1997/04/07 05:23:33 millert Exp $
-.\" $NetBSD: installboot.8,v 1.1 1996/11/06 23:07:55 cgd Exp $
+.\" $OpenBSD: installboot.8,v 1.3 1997/05/05 06:01:47 millert Exp $
+.\" $NetBSD: installboot.8,v 1.2 1997/04/06 08:41:11 cgd Exp $
.\"
-.\" Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
+.\" Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved.
.\" Copyright (c) 1995 Paul Kranenburg
.\" All rights reserved.
.\"
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd November 6, 1996
+.Dd January 16, 1997
.Dt INSTALLBOOT 8
.Os
.Sh NAME
.Nm installboot
-.Nd install bootstrap software on an FFS partition
+.Nd install disk bootstrap software
.Sh SYNOPSIS
.Nm installboot
.Op Fl nv
.Ar boot
.Ar bootxx
-.Ar device
+.Ar rawdiskdevice
.Sh DESCRIPTION
The
.Nm installboot
-utility prepares an FFS partition for bootstrapping.
+utility prepares a disk for bootstrapping.
.Pp
The OpenBSD/alpha disk bootstrap software is split into two parts:
a small first-stage boot program that is written into the disklabel
.El
.Pp
The arguments are:
-.Bl -tag -width bootxx
+.Bl -tag -width rawdiskdevice
.It Ar boot
The name of the second-stage boot program in the file system
where the first-stage boot program is to be installed.
.It Ar bootxx
The name of the prototype file for the first-stage boot program.
-.It Ar device
-The name of the raw device in which the first-stage boot program
-is to be installed.
-This should be the raw device containing the file system
-which holds
-.Ar boot .
+.It Ar rawdiskdevice
+The name of the device corresponding to the raw whole-disk partition (the
+.Dq raw partition )
+of the disk on which the first-stage boot program is to be installed.
.El
.Sh EXAMPLES
-The following command will install the first-stage boot program in the
-root filesystem
-.Pq assumed to be mounted from Dq sd0a
-using the file
-.Pa /boot
-as the second-stage boot program:
+.Pa boot
+resides in the FFS file system mounted on
+.Pa /
+from
+.Dq sd0a ,
+you would install the first-stage boot program on the disk
+(and therefore make the disk bootable) by using the command:
.Bd -literal -offset indent
-installboot /boot /usr/mdec/bootxx /dev/rsd0a
+installboot /boot /usr/mdec/bootxx /dev/rsd0c
.Ed
.Sh BUGS
-OpenBSD/alpha systems are only capable of booting off of disks'
+The OpenBSD/alpha boot blocks can only load kernels from disks'
.Dq a
-partitions, and bootable partitions must start at the beginning
-of the disk.
+partitions. (However, the second-stage boot
+program may be located on any FFS file system partition
+on the disk.)
.Pp
.Nm Installboot
requires simultaneous access to the mounted file system and
-the raw device.
+the disks' raw partition.
That is not allowed with the kernel
.Dv securelevel
variable
see
.Xr sysctl 8
.Pc
-set to a value greater than zero, so
-.Nm installboot
-only works when the system is in
-an insecure mode (e.g. single-user mode; see
-.Xr init 8 ).
-Alternately, one can use the ``c'' partition of
-the target device which avoids this problem since
-the ``c'' partition spans the entire disk and
-should not be mounted.
+set to a value greater than one, or with
+.Dv securelevel
+set to one if the
+.Dq boot
+program resides in a file system on the disk's raw partition.
.Sh "SEE ALSO"
.Xr disklabel 8 ,
.Xr init 8 ,
-/* $OpenBSD: installboot.c,v 1.6 1997/04/09 05:09:35 deraadt Exp $ */
-/* $NetBSD: installboot.c,v 1.2 1995/12/20 00:17:49 cgd Exp $ */
+/* $OpenBSD: installboot.c,v 1.7 1997/05/05 06:01:48 millert Exp $ */
+/* $NetBSD: installboot.c,v 1.2 1997/04/06 08:41:12 cgd Exp $ */
/*
+ * Copyright (c) 1997 Christopher G. Demetriou. All rights reserved.
* Copyright (c) 1994 Paul Kranenburg
* All rights reserved.
*
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
#include <err.h>
+#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <util.h>
#include "bbinfo.h"
char *loadprotoblocks __P((char *, long *));
-int loadblocknums __P((char *, int));
+int loadblocknums __P((char *, int, unsigned long));
static void devread __P((int, void *, daddr_t, size_t, char *));
static void usage __P((void));
int main __P((int, char *[]));
static void
usage()
{
- fprintf(stderr,
+ (void)fprintf(stderr,
"usage: installboot [-n] [-v] <boot> <proto> <device>\n");
exit(1);
}
long protosize;
int mib[2];
size_t size;
+ struct stat disksb, bootsb;
+ struct disklabel dl;
+ unsigned long partoffset;
- while ((c = getopt(argc, argv, "vn")) != -1) {
+ while ((c = getopt(argc, argv, "vn")) != EOF) {
switch (c) {
case 'n':
/* Do not actually write the bootblock to disk */
dev = argv[optind + 2];
if (verbose) {
- printf("boot: %s\n", boot);
- printf("proto: %s\n", proto);
- printf("device: %s\n", dev);
+ (void)printf("boot: %s\n", boot);
+ (void)printf("proto: %s\n", proto);
+ (void)printf("device: %s\n", dev);
}
/* Load proto blocks into core */
/* Open and check raw disk device */
if ((devfd = open(dev, O_RDONLY, 0)) < 0)
err(1, "open: %s", dev);
+ if (fstat(devfd, &disksb) == -1)
+ err(1, "fstat: %s", dev);
+ if (!S_ISCHR(disksb.st_mode))
+ errx(1, "%s must be a character device node", dev);
+ if ((minor(disksb.st_rdev) % getmaxpartitions()) != getrawpartition())
+ errx(1, "%s must be the raw partition", dev);
/* Extract and load block numbers */
- if (loadblocknums(boot, devfd) != 0)
+ if (stat(boot, &bootsb) == -1)
+ err(1, "stat: %s", boot);
+ if (!S_ISREG(bootsb.st_mode))
+ errx(1, "%s must be a regular file", boot);
+ if ((minor(disksb.st_rdev) / getmaxpartitions()) !=
+ (minor(bootsb.st_dev) / getmaxpartitions()))
+ errx(1, "%s must be somewhere on %s", boot, dev);
+
+ /*
+ * Find the offset of the secondary boot block's partition
+ * into the disk. If disklabels not supported, assume zero.
+ */
+ if (ioctl(devfd, DIOCGDINFO, &dl) != -1) {
+ partoffset = dl.d_partitions[minor(bootsb.st_dev) %
+ getmaxpartitions()].p_offset;
+ } else {
+ if (errno != ENOTTY)
+ err(1, "read disklabel: %s", dev);
+ warnx("couldn't read label from %s, using part offset of 0",
+ dev);
+ partoffset = 0;
+ }
+ if (verbose)
+ (void)printf("%s partition offset = 0x%lx\n", boot, partoffset);
+
+ /* Sync filesystems (make sure boot's block numbers are stable) */
+ sync();
+ sleep(2);
+ sync();
+ sleep(2);
+
+ if (loadblocknums(boot, devfd, partoffset) != 0)
exit(1);
(void)close(devfd);
if (lseek(devfd, DEV_BSIZE, SEEK_SET) != DEV_BSIZE)
err(1, "lseek bootstrap");
- /* Sync filesystems (to clean in-memory superblock?) */
- sync();
- sleep(3);
-
if (write(devfd, protostore, protosize) != protosize)
err(1, "write bootstrap");
((char *)bbinfop->blocks - bp) / sizeof (bbinfop->blocks[0]);
if (verbose) {
- printf("boot block info locator at offset 0x%x\n",
+ (void)printf("boot block info locator at offset 0x%x\n",
(char *)bbinfolocp - bp);
- printf("boot block info at offset 0x%x\n",
+ (void)printf("boot block info at offset 0x%x\n",
(char *)bbinfop - bp);
- printf("max number of blocks: %d\n", max_block_count);
+ (void)printf("max number of blocks: %d\n", max_block_count);
}
*size = sz;
static char sblock[SBSIZE];
int
-loadblocknums(boot, devfd)
-char *boot;
-int devfd;
+loadblocknums(boot, devfd, partoffset)
+ char *boot;
+ int devfd;
+ unsigned long partoffset;
{
int i, fd;
struct stat statbuf;
close(fd);
/* Read superblock */
- devread(devfd, sblock, btodb(SBOFF), SBSIZE, "superblock");
+ devread(devfd, sblock, btodb(SBOFF) + partoffset, SBSIZE,
+ "superblock");
fs = (struct fs *)sblock;
/* Read inode */
errx(1, "No memory for filesystem block");
blk = fsbtodb(fs, ino_to_fsba(fs, statbuf.st_ino));
- devread(devfd, buf, blk, fs->fs_bsize, "inode");
+ devread(devfd, buf, blk + partoffset, fs->fs_bsize, "inode");
ip = (struct dinode *)(buf) + ino_to_fsbo(fs, statbuf.st_ino);
/*
bbinfop->nblocks = ndb;
if (verbose)
- printf("%s: block numbers: ", boot);
+ (void)printf("%s: block numbers: ", boot);
ap = ip->di_db;
for (i = 0; i < NDADDR && *ap && ndb; i++, ap++, ndb--) {
blk = fsbtodb(fs, *ap);
- bbinfop->blocks[i] = blk;
+ bbinfop->blocks[i] = blk + partoffset;
if (verbose)
- printf("%d ", blk);
+ (void)printf("%d ", bbinfop->blocks[i]);
}
if (verbose)
- printf("\n");
+ (void)printf("\n");
if (ndb == 0)
goto checksum;
* for more in the 1st-level bootblocks anyway.
*/
if (verbose)
- printf("%s: block numbers (indirect): ", boot);
+ (void)printf("%s: block numbers (indirect): ", boot);
blk = ip->di_ib[0];
- devread(devfd, buf, blk, fs->fs_bsize, "indirect block");
+ devread(devfd, buf, blk + partoffset, fs->fs_bsize,
+ "indirect block");
ap = (daddr_t *)buf;
for (; i < NINDIR(fs) && *ap && ndb; i++, ap++, ndb--) {
blk = fsbtodb(fs, *ap);
- bbinfop->blocks[i] = blk;
+ bbinfop->blocks[i] = blk + partoffset;
if (verbose)
- printf("%d ", blk);
+ (void)printf("%d ", bbinfop->blocks[i]);
}
if (verbose)
- printf("\n");
+ (void)printf("\n");
if (ndb)
errx(1, "%s: Too many blocks", boot);
-# $OpenBSD: Makefile,v 1.4 1996/12/08 00:20:54 niklas Exp $
+# $OpenBSD: Makefile,v 1.5 1997/05/05 06:01:54 millert Exp $
# $NetBSD: Makefile,v 1.2 1996/11/06 23:09:13 cgd Exp $
.PATH: ${.CURDIR}/..
MAN= installboot.8
MANSUBDIR=/alpha
-CFLAGS+= -g
+DPADD+= ${LIBUTIL}
+LDADD+= -lutil
.include <bsd.prog.mk>
--- /dev/null
+# $OpenBSD: Makefile,v 1.1 1997/05/05 06:01:55 millert Exp $
+
+.include <bsd.obj.mk>
+.include <bsd.dep.mk>
+.include <bsd.subdir.mk>
--- /dev/null
+# $OpenBSD: Makefile.inc,v 1.1 1997/05/05 06:01:56 millert Exp $
+# $NetBSD: Makefile.inc,v 1.22 1996/09/30 15:54:35 ws Exp $
+#
+# NOTE: $S must correspond to the top of the 'sys' tree
+
+KERNDIR= $S/lib/libkern
+
+KERNDST?= ${.OBJDIR}/lib/kern
+KERN_AS?= obj
+
+.if (${KERN_AS} == "library")
+KERNLIB= ${KERNDST}/libkern.a
+KERNLIB_PROF= ${KERNDST}/libkern_p.a
+.else
+KERNLIB= ${KERNDST}/libkern.o
+KERNLIB_PROF= ${KERNDST}/libkern.po
+.endif
+
+KERNMAKE= \
+ cd ${KERNDIR} && MAKEOBJDIR=${KERNDST} ${MAKE} \
+ CC='${CC}' CFLAGS='${CFLAGS}' \
+ AS='${AS}' AFLAGS='${AFLAGS}' \
+ LD='${LD}' STRIP='${STRIP}' \
+ MACHINE='${MACHINE}' MACHINE_ARCH='${MACHINE_ARCH}' \
+ KERNCPPFLAGS='${CPPFLAGS:S@^-I.@-I../../.@g}'
+
+${KERNLIB}: .NOTMAIN __always_make_kernlib
+ @echo making sure the kern library is up to date...
+.if (${KERN_AS} == "library")
+ @${KERNMAKE} libkern.a
+.else
+ @${KERNMAKE} libkern.o
+.endif
+
+${KERNLIB_PROF}: .NOTMAIN __always_make_kernlib
+ @echo making sure the profiled kern library is up to date...
+.if (${KERN_AS} == "library")
+ @${KERNMAKE} libkern_p.a
+.else
+ @${KERNMAKE} libkern.po
+.endif
+
+clean: .NOTMAIN __always_make_kernlib
+ @echo cleaning the kern library objects
+ @${KERNMAKE} clean
+
+depend: .NOTMAIN __always_make_kernlib
+ @echo depending the kern library objects
+ @${KERNMAKE} depend
+
+__always_make_kernlib: .NOTMAIN
+ @mkdir -p ${KERNDST}
--- /dev/null
+# $OpenBSD: Makefile,v 1.1 1997/05/05 06:01:57 millert Exp $
+
+.include <bsd.obj.mk>
+.include <bsd.dep.mk>
+.include <bsd.subdir.mk>
--- /dev/null
+# $OpenBSD: Makefile.inc,v 1.1 1997/05/05 06:01:57 millert Exp $
+# $NetBSD: Makefile.inc,v 1.5 1996/09/30 16:01:18 ws Exp $
+#
+# NOTE: $S must correspond to the top of the 'sys' tree
+SADIR= $S/lib/libsa
+
+SADST?= lib/sa
+SAREL?= ../../
+SALIB?= ${SADST}/libsa.a
+
+SAMAKE= \
+ cd ${SADST} && ${MAKE} -f ${SAREL}${SADIR}/Makefile \
+ CC="${CC}" XCFLAGS="${CFLAGS}" \
+ AS='${AS}' XAFLAGS='${AFLAGS}' \
+ LD='${LD}' \
+ XCPPFLAGS="${CPPFLAGS}" \
+ SAREL="${SAREL}" \
+ SADIR="${SADIR}" \
+ EXTRACFLAGS="${EXTRACFLAGS}"
+.if defined(NO_NET)
+SAMAKE+= NO_NET=""
+.endif
+.if defined(SA_ZLIB)
+SAMAKE+= SA_ZLIB=""
+.endif
+
+${SALIB}: .NOTMAIN __always_make_salib
+ @echo making sure the stand-alone library is up to date...
+ @${SAMAKE} libsa.a
+
+clean: .NOTMAIN __always_make_salib
+ @echo cleaning the stand-alone library objects
+ @${SAMAKE} clean
+
+depend: .NOTMAIN __always_make_salib
+ @echo depending the standalone library objects
+ @${SAMAKE} depend
+
+__always_make_salib: .NOTMAIN
+ @([ -d ${SADST} ] || mkdir -p ${SADST})
+
--- /dev/null
+# $OpenBSD: Makefile,v 1.1 1997/05/05 06:01:58 millert Exp $
+
+.include <bsd.obj.mk>
+.include <bsd.dep.mk>
+.include <bsd.subdir.mk>
--- /dev/null
+# $OpenBSD: Makefile.inc,v 1.1 1997/05/05 06:01:58 millert Exp $
+# $NetBSD: Makefile.inc,v 1.2 1997/01/23 22:29:09 cgd Exp $
+#
+# Configuration variables (default values are below):
+#
+# S must be set to the top of the 'sys' tree.
+# ZDST may be set to the location of the directory where library
+# objects are to be built. Defaults to ${.OBJDIR}/lib/z.
+# Z_AS may be set to 'obj' to build a object from the library's
+# object files. (Otherwise, a library will be built.)
+# Defaults to 'library'.
+# ZMISCMAKEFLAGS
+# Miscellaneous flags to be passed to the library's Makefile when
+# building. See library's Makefile for more details about
+# supported flags and their default values.
+
+# Default values:
+ZDST?= ${.OBJDIR}/lib/z
+Z_AS?= library
+
+ZDIR= $S/lib/libz
+.if (${Z_AS} == "obj")
+ZLIB= ${ZDST}/libz.o
+ZLIB_PROF= ${ZDST}/libz.po
+.else
+ZLIB= ${ZDST}/libz.a
+ZLIB_PROF= ${ZDST}/libz_p.a
+.endif
+
+ZMAKE= \
+ cd ${ZDIR} && MAKEOBJDIR=${ZDST} ${MAKE} \
+ CC="${CC}" CFLAGS="${CFLAGS}" \
+ AS=${AS} AFLAGS="${AFLAGS}" \
+ LD=${LD} STRIP=${STRIP} \
+ MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} \
+ ZCPPFLAGS="${CPPFLAGS:S@^-I.@-I../../.@g}" \
+ ${ZMISCMAKEFLAGS}
+
+${ZLIB}: .NOTMAIN __always_make_zlib
+ @echo making sure the z library is up to date...
+.if (${Z_AS} == "library")
+ ${ZMAKE} libz.a
+.else
+ @${ZMAKE} libz.o
+.endif
+
+${ZLIB_PROF}: .NOTMAIN __always_make_zlib
+ @echo making sure the profiled z library is up to date...
+.if (${Z_AS} == "library")
+ @${ZMAKE} libz_p.a
+.else
+ @${ZMAKE} libz.po
+.endif
+
+clean: .NOTMAIN cleanzlib
+cleanzlib: .NOTMAIN __always_make_zlib
+ @echo cleaning the z library objects
+ @${ZMAKE} clean
+
+cleandir: .NOTMAIN cleandirzlib
+cleandirzlib: .NOTMAIN __always_make_zlib
+ @echo cleandiring the z library objects
+ @${ZMAKE} cleandir
+
+depend: .NOTMAIN dependzlib
+dependzlib: .NOTMAIN __always_make_zlib
+ @echo depending the z library objects
+ @${ZMAKE} depend
+
+__always_make_zlib: .NOTMAIN
+ @mkdir -p ${ZDST}
-/* $OpenBSD: loadfile.c,v 1.2 1996/11/27 19:54:48 niklas Exp $ */
-/* $NetBSD: loadfile.c,v 1.3 1996/09/23 04:32:44 cgd Exp $ */
+/* $OpenBSD: loadfile.c,v 1.3 1997/05/05 06:01:49 millert Exp $ */
+/* $NetBSD: loadfile.c,v 1.3 1997/04/06 08:40:59 cgd Exp $ */
/*
* Copyright (c) 1992, 1993
ssize_t nr;
int fd, rval;
+ (void)printf("\nLoading %s...\n", fname);
+
/* Open the file. */
rval = 1;
if ((fd = open(fname, 0)) < 0) {
- (void)printf("open %s: error %d\n", fname, errno);
+ (void)printf("open %s: %s\n", fname, strerror(errno));
goto err;
}
/* Read the exec header. */
if ((nr = read(fd, &hdr, sizeof(hdr))) != sizeof(hdr)) {
- (void)printf("read header: error %d\n", errno);
+ (void)printf("read header: %s\n", strerror(errno));
goto err;
}
(void)lseek(fd, ECOFF_TXTOFF(coff), 0);
if (read(fd, (void *)coff->a.text_start, coff->a.tsize) !=
coff->a.tsize) {
- (void)printf("read text: %d\n", errno);
+ (void)printf("read text: %s\n", strerror(errno));
return (1);
}
(void)printf("+%lu", coff->a.dsize);
if (read(fd, (void *)coff->a.data_start, coff->a.dsize) !=
coff->a.dsize) {
- (void)printf("read data: %d\n", errno);
+ (void)printf("read data: %s\n", strerror(errno));
return (1);
}
}
Elf_Phdr phdr;
(void)lseek(fd, elf->e_phoff + sizeof(phdr) * i, 0);
if (read(fd, (void *)&phdr, sizeof(phdr)) != sizeof(phdr)) {
- (void)printf("read phdr: %d\n", errno);
+ (void)printf("read phdr: %s\n", strerror(errno));
return (1);
}
if (phdr.p_type != Elf_pt_load ||
(void)lseek(fd, phdr.p_offset, 0);
if (read(fd, (void *)phdr.p_vaddr, phdr.p_filesz) !=
phdr.p_filesz) {
- (void)printf("read text: %d\n", errno);
+ (void)printf("read text: %s\n", strerror(errno));
return (1);
}
if (first || ffp_save < phdr.p_vaddr + phdr.p_memsz)
-# $OpenBSD: Makefile,v 1.2 1996/11/27 19:54:54 niklas Exp $
-# $NetBSD: Makefile,v 1.3 1996/10/18 06:02:24 thorpej Exp $
+# $OpenBSD: Makefile,v 1.3 1997/05/05 06:01:59 millert Exp $
+# $NetBSD: Makefile,v 1.11 1997/04/17 07:27:50 thorpej Exp $
-.PATH: ${.CURDIR}/.. ${.CURDIR}/../../../../lib/libsa
+S= ${.CURDIR}/../../../..
+
+.PATH: ${.CURDIR}/.. ${.CURDIR}/../boot
+
+PROG = netboot
+
+SRCS = start.S boot.c prom.c prom_disp.S OSFpal.c prom_swpal.S
+SRCS+= rpcc.S
+SRCS+= dev_net.c conf.c devopen.c
+SRCS+= if_prom.c loadfile.c getsecs.c
+NOMAN=
+INSTALL_STRIP=
+BINMODE= 444
-BOOT_PROG = netboot
BOOT_RELOC = ${PRIMARY_LOAD_ADDRESS}
+HEADERSIZE_PROG = headersize
-BOOT_SRCS = start.S netboot.c prom.c prom_disp.S OSFpal.c prom_swpal.S
-BOOT_SRCS+= printf.c bzero.c rpcc.S
+CLEANFILES+= vers.c vers.o ${PROG}.sym ${PROG}.nosym ${HEADERSIZE_PROG}
-BOOT_SRCS+= dev_net.c conf.c devopen.c
-BOOT_SRCS+= nfs.c rpc.c alloc.c ntohl.c htonl.c ntohs.c htons.c net.c bootp.c
-BOOT_SRCS+= strlen.c dev.c bcmp.c strerror.c rarp.c read.c lseek.c
-BOOT_SRCS+= in_cksum.c exit.c closeall.c arp.c strncpy.c globals.c open.c
-BOOT_SRCS+= close.c ether.c netif.c
+DEFNS= -DPRIMARY_BOOTBLOCK -DALPHA_BOOT_ECOFF # -DALPHA_BOOT_ELF
-BOOT_SRCS+= if_prom.c loadfile.c getsecs.c
+AFLAGS += -DASSEMBLER ${DEFNS}
+CPPFLAGS += -I${.CURDIR}/../.. -I${S} ${DEFNS}
+CFLAGS = -Werror -mno-fp-regs
-BOOT_OBJS = ${BOOT_SRCS:N*.h:R:S/$/.o/g}
+${PROG}.nosym: ${PROG}.sym
+ cp ${PROG}.sym ${PROG}.nosym
+ strip ${PROG}.nosym
-HEADERSIZE_PROG = headersize
+${PROG}: ${PROG}.nosym ${HEADERSIZE_PROG}
+ dd if=${PROG}.nosym of=${PROG} \
+ bs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${PROG}.nosym` skip=1
+
+# no lint here (yet?)
+lint:
-AFLAGS += -DASSEMBLER
-CPPFLAGS += -I${.CURDIR}/../../../../ \
- -I${.CURDIR}/../../../../lib/libsa \
- -I${.CURDIR}/../.. -DPRIMARY_BOOTBLOCK \
- -DALPHA_BOOT_ECOFF # -DALPHA_BOOT_ELF
-CFLAGS = -Werror -mno-fp-regs -g
+.include <bsd.prog.mk>
-CLEANFILES+= vers.c vers.o
+### find out what to use for libkern
+KERN_AS= library
+KERNDST= ${.CURDIR}/../libkern/${__objdir}
+.include "${.CURDIR}/../libkern/Makefile.inc"
+LIBKERN= ${KERNLIB}
-.PATH: ${.CURDIR} ${.CURDIR}/../../../../lib/libkern ${.CURDIR}/../boot
+### find out what to use for libz
+Z_AS= library
+ZDST= ${.CURDIR}/../libz/${__objdir}
+.include "${.CURDIR}/../libz/Makefile.inc"
+LIBZ= ${ZLIB}
-all: ${BOOT_PROG}
+### find out what to use for libsa
+SA_AS= library
+SADST= ${.CURDIR}/../libsa/${__objdir}
+SAREL=
+SA_ZLIB= yes
+.include "${.CURDIR}/../libsa/Makefile.inc"
+LIBSA= ${SALIB}
-${BOOT_PROG}: ${BOOT_OBJS} ${HEADERSIZE_PROG}
+${PROG}.sym: ${OBJS} ${LIBSA} ${LIBZ} ${LIBKERN}
sh ${.CURDIR}/newvers.sh ${.CURDIR}/version
${COMPILE.c} vers.c
- ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${BOOT_PROG}.hdr \
- ${BOOT_OBJS} vers.o -lc # XXX
- size ${BOOT_PROG}.hdr
- strip ${BOOT_PROG}.hdr
- dd if=${BOOT_PROG}.hdr of=${BOOT_PROG} \
- bs=`./${HEADERSIZE_PROG} ${BOOT_RELOC} ${BOOT_PROG}.hdr` skip=1
-
-install:
- ${INSTALL} -c -o bin -g bin -m 444 ${BOOT_PROG} \
- ${DESTDIR}${BINDIR}/${BOOT_PROG}
-
-clean: _SUBDIRUSE
- rm -f a.out [Ee]rrs mklog core *.core \
- ${BOOT_PROG} ${BOOT_OBJS} ${CLEANFILES} \
- ${BOOT_PROG}.hdr ${BOOT_PROG}.nohdr ${HEADERSIZE_PROG}
-
-cleandir: _SUBDIRUSE clean
-
-.include "${.CURDIR}/../Makefile.inc"
-.include <bsd.obj.mk>
-.include <bsd.dep.mk>
-.include <bsd.subdir.mk>
+ ${LD} -Ttext ${BOOT_RELOC} -N -e start -o ${PROG}.sym \
+ ${OBJS} vers.o ${LIBSA} ${LIBZ} ${LIBSA} ${LIBKERN}
+ size ${PROG}.sym
-/* $OpenBSD: conf.c,v 1.1 1996/10/30 22:40:52 niklas Exp $ */
-/* $NetBSD: conf.c,v 1.2 1996/10/02 21:18:45 cgd Exp $ */
+/* $OpenBSD: conf.c,v 1.2 1997/05/05 06:01:59 millert Exp $ */
+/* $NetBSD: conf.c,v 1.4 1997/04/06 08:41:23 cgd Exp $ */
#include <sys/types.h>
#include <netinet/in.h>
-#include "stand.h"
-#include "nfs.h"
+#include <lib/libsa/stand.h>
+#include <lib/libsa/nfs.h>
#include "dev_net.h"
struct fs_ops file_system[] = {
-/* $OpenBSD: dev_net.c,v 1.1 1996/10/30 22:40:53 niklas Exp $ */
-/* $NetBSD: dev_net.c,v 1.1 1996/09/18 20:03:07 cgd Exp $ */
+/* $OpenBSD: dev_net.c,v 1.2 1997/05/05 06:02:00 millert Exp $ */
+/* $NetBSD: dev_net.c,v 1.4 1997/04/06 08:41:24 cgd Exp $ */
/*
* Copyright (c) 1995 Gordon W. Ross
#include <netinet/if_ether.h>
#include <netinet/in_systm.h>
-#include "stand.h"
-#include "net.h"
-#include "netif.h"
-#include "bootparam.h"
+#include <lib/libsa/stand.h>
+#include <lib/libsa/net.h>
+#include <lib/libsa/netif.h>
+#include <lib/libsa/bootparam.h>
#include "dev_net.h"
extern int debug;
-/* $OpenBSD: devopen.c,v 1.1 1996/10/30 22:40:54 niklas Exp $ */
-/* $NetBSD: devopen.c,v 1.1 1996/09/18 20:03:09 cgd Exp $ */
+/* $OpenBSD: devopen.c,v 1.2 1997/05/05 06:02:00 millert Exp $ */
+/* $NetBSD: devopen.c,v 1.3 1997/04/06 08:41:25 cgd Exp $ */
/*-
* Copyright (c) 1992, 1993
* @(#)devopen.c 8.1 (Berkeley) 6/10/93
*/
-#include <stand.h>
+#include <lib/libsa/stand.h>
/*
* Decode the string 'fname', open the device and return the remaining
-/* $OpenBSD: if_prom.c,v 1.2 1996/11/27 19:54:55 niklas Exp $ */
-/* $NetBSD: if_prom.c,v 1.4 1996/10/02 21:18:49 cgd Exp $ */
+/* $OpenBSD: if_prom.c,v 1.3 1997/05/05 06:02:01 millert Exp $ */
+/* $NetBSD: if_prom.c,v 1.9 1997/04/06 08:41:26 cgd Exp $ */
/*
- * Copyright (c) 1993 Adam Glass
- * All rights reserved.
+ * Copyright (c) 1997 Christopher G. Demetriou. All rights reserved.
+ * Copyright (c) 1993 Adam Glass. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
#include <netinet/in.h>
#include <netinet/in_systm.h>
-#include "netif.h"
-#include "include/rpb.h"
-#include "include/prom.h"
-#include "lib/libkern/libkern.h"
-#include "lib/libsa/stand.h"
+#include <include/rpb.h>
+#include <include/prom.h>
+
+#include <lib/libkern/libkern.h>
+#include <lib/libsa/netif.h>
+#include <lib/libsa/stand.h>
+
+#include "stand/bbinfo.h"
int prom_probe();
int prom_match();
struct netif_stats prom_stats[NENTS(prom_ifs)];
+struct netbbinfo netbbinfo = {
+ 0xfeedbabedeadbeef, /* magic number */
+ 0, /* set */
+ 0, 0, 0, 0, 0, 0, /* ether address */
+ 0, /* force */
+ { 0, }, /* pad2 */
+ 0, /* cksum */
+ 0xfeedbeefdeadbabe, /* magic number */
+};
+
struct netif_driver prom_netif_driver = {
"prom", /* netif_bname */
prom_match, /* netif_match */
NENTS(prom_ifs) /* netif_nifs */
};
-int netfd;
+int netfd, broken_firmware;
int
prom_match(nif, machdep_hint)
t = getsecs();
cc = 0;
while (((getsecs() - t) < timeout) && !cc) {
- ret.bits = prom_read(netfd, sizeof hate, hate, 0);
+ if (broken_firmware)
+ ret.bits = prom_read(netfd, 0, hate, 0);
+ else
+ ret.bits = prom_read(netfd, sizeof hate, hate, 0);
if (ret.u.status == 0)
- cc += ret.u.retval;
+ cc = ret.u.retval;
}
- cc = len;
+ if (broken_firmware)
+ cc = min(cc, len);
+ else
+ cc = len;
bcopy(hate, pkt, cc);
return cc;
{
prom_return_t ret;
char devname[64];
- int devlen, i;
+ int devlen, i, netbbinfovalid;
char *enet_addr;
+ u_int64_t *qp, csum;
+
+ broken_firmware = 0;
+
+ csum = 0;
+ for (i = 0, qp = (u_int64_t *)&netbbinfo;
+ i < (sizeof netbbinfo / sizeof (u_int64_t)); i++, qp++)
+ csum += *qp;
+ netbbinfovalid = (csum == 0);
+ if (netbbinfovalid)
+ netbbinfovalid = netbbinfo.set;
+
+#if 0
+ printf("netbbinfo ");
+ if (!netbbinfovalid)
+ printf("invalid\n");
+ else
+ printf("valid: force = %d, ea = %s\n", netbbinfo.force,
+ ether_sprintf(netbbinfo.ether_addr));
+#endif
ret.bits = prom_getenv(PROM_E_BOOTED_DEV, devname, sizeof(devname));
devlen = ret.u.retval;
for (i = 0; i < 8; i++) {
enet_addr = strchr(enet_addr, ' ');
if (enet_addr == NULL) {
- printf("Boot device name does not contain ethernet address.\n");
+ printf("boot: boot device name does not contain ethernet address.\n");
goto punt;
}
enet_addr++;
enet_addr++;
if (hv == -1 || lv == -1) {
- printf("Bogus ethernet address.\n");
+ printf("boot: boot device name contains bogus ethernet address.\n");
goto punt;
}
#undef dval
}
+ if (netbbinfovalid && netbbinfo.force) {
+ printf("boot: using hard-coded ethernet address (forced).\n");
+ bcopy(netbbinfo.ether_addr, desc->myea, sizeof desc->myea);
+ }
+
+gotit:
printf("boot: ethernet address: %s\n", ether_sprintf(desc->myea));
ret.bits = prom_open(devname, devlen + 1);
if (ret.u.status) {
printf("prom_init: open failed: %d\n", ret.u.status);
- goto punt;
+ goto reallypunt;
}
netfd = ret.u.retval;
return;
punt:
+ broken_firmware = 1;
+ if (netbbinfovalid) {
+ printf("boot: using hard-coded ethernet address.\n");
+ bcopy(netbbinfo.ether_addr, desc->myea, sizeof desc->myea);
+ goto gotit;
+ }
+
+reallypunt:
+ printf("\n");
printf("Boot device name was: \"%s\"\n", devname);
printf("\n");
- printf("Your firmware may be too old to network-boot OpenBSD/Alpha.\n");
+ printf("Your firmware may be too old to network-boot OpenBSD/Alpha,\n");
+ printf("or you might have to hard-code an ethernet address into\n");
+ printf("your network boot block with setnetbootinfo(8).\n");
halt();
}
-$OpenBSD: version,v 1.1 1996/10/30 22:41:00 niklas Exp $
-$NetBSD: version,v 1.2 1996/10/02 21:26:17 cgd Exp $
+$OpenBSD: version,v 1.2 1997/05/05 06:02:02 millert Exp $
+$NetBSD: version,v 1.6 1997/01/23 23:10:41 cgd Exp $
-1.1 Initial version
-1.2 Cleaned and polished a bit
+1.1: Initial version
+1.2: Cleaned and polished a bit
+1.3: Use libsa and libkern rather than building the objects locally.
+1.4: Allow ethernet address to be hardcoded with setnetbootinfo(8).
+1.5: Search for a kernel, if none specified.
+1.6: Add support for gzipped kernels.
--- /dev/null
+# $OpenBSD: Makefile,v 1.1 1997/05/05 06:02:02 millert Exp $
+# $NetBSD: Makefile,v 1.4 1997/04/06 08:41:36 cgd Exp $
+
+.PATH: ${.CURDIR}/..
+
+PROG= setnetbootinfo
+BINDIR= /usr/mdec
+
+MAN= setnetbootinfo.8
+MANSUBDIR=/alpha
+
+CFLAGS+= -I${.CURDIR}/..
+LDSTATIC=-static
+
+.include <bsd.prog.mk>
--- /dev/null
+.\" $OpenBSD: setnetbootinfo.8,v 1.1 1997/05/05 06:02:03 millert Exp $
+.\" $NetBSD: setnetbootinfo.8,v 1.2 1997/04/06 08:41:36 cgd Exp $
+.\"
+.\" Copyright (c) 1997 Christopher G. Demetriou. 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 Christopher G. Demetriou
+.\" for the NetBSD Project.
+.\" 3. The name of the author may not be used to endorse or promote products
+.\" derived from this software without specific prior written permission
+.\"
+.\" 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.
+.\"
+.Dd January 20, 1997
+.Dt SETNETBOOTINFO 8
+.Os
+.Sh NAME
+.Nm setnetbootinfo
+.Nd configure network bootstrap program
+.Sh SYNOPSIS
+.Nm setnetbootinfo
+.Op Fl vf
+.Op Fl o Ar infile
+.Oo
+.Fl a Ar ether-address | Fl h Ar ether-host
+.Oc
+.Ar netboot
+.Nm setnetbootinfo
+.Op Fl v
+.Fl u o Ar outfile Ar infile
+.Sh DESCRIPTION
+The
+.Nm setnetbootinfo
+utility configures the OpenBSD/alpha network bootstrap program so
+that it can be used to bootstrap systems with old firmware revisions.
+.Pp
+The OpenBSD/alpha network bootstrap program needs to have the ethernet
+address of the interface being used to boot the system available when
+querying other hosts on the network for bootstrapping information.
+Alpha systems with old firmware revisions provide no way for
+network bootstrap programs to determine the ethernet address of
+the interface that they are booting from, and so the OpenBSD/alpha
+network bootstrap program must find that information in another way.
+(Newer firmware revisions include the ethernet address in the name of
+the device that is being booted from.)
+The
+.Nm
+utility encodes an ethernet address (and other information) directly
+into the network bootstrap program.
+.Pp
+The options recognized by
+.Nm
+are as follows:
+.Bl -tag -width flag
+.It Fl a Ar ether-address
+Encode the given ethernet address into the network bootstrap program.
+(This option and the
+.Fl h
+option are mutually exclusive.)
+.It Fl f
+Force the address information being encoded in the bootstrap
+program to be used regardless of whether or not the bootstrap
+program can get address information from the booting system's
+firmware.
+.It Fl h Ar ether-host
+Encode the ethernet address of the specified host into the network
+bootstrap program. The host's name is translated to an ethernet
+address using the
+.Xr ether_hostton 3
+function.
+(This option and the
+.Fl a
+option are mutually exclusive.)
+.It Fl o Ar outfile
+Output the resulting bootstrap program into the file named by
+.Ar outfile ,
+replacing it if it already exists. If the
+.Fl o
+flag is not specified, the output file name will be
+the name of the input bootstrap program concatenated with a
+period and the digits of the ethernet address being encoded.
+For instance, if the input file is named
+.Pa /usr/mdec/netboot
+and is being configured to encode the ethernet address
+.Li 08:00:2b:bd:5d:fd ,
+then the default output file name would be
+.Pa /usr/mdec/netboot.08002bbd5dfd .
+It is safe to set the output file name to be the same as the
+input file name; the input file is read in its entirety before
+the output file is modified.
+.It Fl u
+Remove configuration information from the specified network
+bootstrap program. If this option is used, an output file name must be
+specified with the
+.Fl o
+option, and neither the
+.Fl a
+or the
+.Fl h
+options may be specified.
+.It Fl v
+Verbose mode.
+.El
+.Sh "SEE ALSO"
+.Xr bootpd 8
+.Sh HISTORY
+The alpha
+.Nm
+command first appeared in
+.Nx 1.2b .
--- /dev/null
+/* $OpenBSD: setnetbootinfo.c,v 1.1 1997/05/05 06:02:03 millert Exp $ */
+/* $NetBSD: setnetbootinfo.c,v 1.5 1997/04/06 08:41:37 cgd Exp $ */
+
+/*
+ * Copyright (c) 1997 Christopher G. Demetriou
+ * 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 Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * 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.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/fcntl.h>
+#include <sys/stat.h>
+#include <sys/socket.h> /* XXX */
+#include <net/if.h> /* XXX */
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+
+#include "bbinfo.h"
+
+int verbose, force, unset;
+char *netboot, *outfile, *addr, *host;
+
+char *outfilename;
+
+struct ether_addr *ether_addr, _ether_addr;
+
+static void
+usage()
+{
+
+ (void)fprintf(stderr, "usage:\n");
+ (void)fprintf(stderr, "\tsetnetboot [-v] [-f] [-o outfile] \\\n");
+ (void)fprintf(stderr, "\t [-a ether-address | -h ether-host] infile\n");
+ (void)fprintf(stderr, "\tsetnetboot [-v] -u -o outfile infile\n");
+ exit(1);
+}
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ struct netbbinfo *netbbinfop;
+ struct stat sb;
+ u_int64_t *qp, csum;
+ char *netbb;
+ int c, fd, i;
+
+ while ((c = getopt(argc, argv, "a:fh:o:uv")) != -1) {
+ switch (c) {
+ case 'a':
+ /* use the argument as an ethernet address */
+ addr = optarg;
+ break;
+ case 'f':
+ /* set force flag in network boot block */
+ force = 1;
+ break;
+ case 'h':
+ /* use the argument as a host to find in /etc/ethers */
+ host = optarg;
+ break;
+ case 'o':
+ /* use the argument as the output file name */
+ outfile = optarg;
+ break;
+ case 'u':
+ /* remove configuration information */
+ unset = 1;
+ break;
+ case 'v':
+ /* Chat */
+ verbose = 1;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ if ((argc - optind) != 1)
+ usage();
+ netboot = argv[optind];
+
+ if (unset && (force || host != NULL || addr != NULL))
+ errx(1, "-u can't be used with -f, -h, or -a");
+
+ if (unset) {
+ if (force || host != NULL || addr != NULL)
+ errx(1, "-u can't be used with -f, -h, or -a");
+ if (outfile == NULL)
+ errx(1, "-u cannot be used without -o");
+ } else {
+ if ((host == NULL && addr == NULL) ||
+ (host != NULL && addr != NULL))
+ usage();
+
+ if (host != NULL) {
+ if (ether_hostton(host, &_ether_addr) == -1)
+ errx(1, "ethernet address couldn't be found for \"%s\"",
+ host);
+ ether_addr = &_ether_addr;
+ } else { /* addr != NULL */
+ ether_addr = ether_aton(addr);
+ if (ether_addr == NULL)
+ errx(1, "ethernet address \"%s\" is invalid",
+ addr);
+ }
+ }
+
+ if (outfile != NULL)
+ outfilename = outfile;
+ else {
+ /* name + 12 for enet addr + '.' before enet addr + NUL */
+ outfilename = malloc(strlen(netboot) + 14);
+ if (outfilename == NULL)
+ err(1, "malloc of output file name failed");
+ sprintf(outfilename, "%s.%02x%02x%02x%02x%02x%02x", netboot,
+ ether_addr->ether_addr_octet[0],
+ ether_addr->ether_addr_octet[1],
+ ether_addr->ether_addr_octet[2],
+ ether_addr->ether_addr_octet[3],
+ ether_addr->ether_addr_octet[4],
+ ether_addr->ether_addr_octet[5]);
+ }
+
+ if (verbose) {
+ printf("netboot: %s\n", netboot);
+ if (unset)
+ printf("unsetting configuration\n");
+ else
+ printf("ethernet address: %s (%s), force = %d\n",
+ ether_ntoa(ether_addr), host ? host : addr, force);
+ printf("output netboot: %s\n", outfilename);
+ }
+
+
+ if (verbose)
+ printf("opening %s...\n", netboot);
+ if ((fd = open(netboot, O_RDONLY, 0)) == -1)
+ err(1, "open: %s", netboot);
+ if (fstat(fd, &sb) == -1)
+ err(1, "fstat: %s", netboot);
+ if (!S_ISREG(sb.st_mode))
+ errx(1, "%s must be a regular file", netboot);
+
+ if (verbose)
+ printf("reading %s...\n", netboot);
+ netbb = malloc(sb.st_size);
+ if (netbb == NULL)
+ err(1, "malloc of %lu for %s failed",
+ (unsigned long)sb.st_size, netboot);
+ if (read(fd, netbb, sb.st_size) != sb.st_size)
+ err(1, "read of %lu from %s failed",
+ (unsigned long)sb.st_size, netboot);
+
+ if (verbose)
+ printf("closing %s...\n", netboot);
+ close(fd);
+
+ if (verbose)
+ printf("looking for netbbinfo...\n");
+ netbbinfop = NULL;
+ for (qp = (u_int64_t *)netbb; qp < (u_int64_t *)(netbb + sb.st_size);
+ qp++) {
+ if (((struct netbbinfo *)qp)->magic1 == 0xfeedbabedeadbeef &&
+ ((struct netbbinfo *)qp)->magic2 == 0xfeedbeefdeadbabe) {
+ netbbinfop = (struct netbbinfo *)qp;
+ break;
+ }
+ }
+ if (netbbinfop == NULL)
+ errx(1, "netboot information structure not found in %s",
+ netboot);
+ if (verbose)
+ printf("found netbbinfo structure at offset 0x%lx.\n",
+ (unsigned long)((char *)netbbinfop - netbb));
+
+ if (verbose)
+ printf("setting netbbinfo structure...\n");
+ bzero(netbbinfop, sizeof *netbbinfop);
+ netbbinfop->magic1 = 0xfeedbabedeadbeef;
+ netbbinfop->magic2 = 0xfeedbeefdeadbabe;
+ netbbinfop->set = unset ? 0 : 1;
+ if (netbbinfop->set) {
+ for (i = 0; i < 6; i++)
+ netbbinfop->ether_addr[i] =
+ ether_addr->ether_addr_octet[i];
+ netbbinfop->force = force;
+ }
+ netbbinfop->cksum = 0;
+
+ if (verbose)
+ printf("setting netbbinfo checksum...\n");
+ csum = 0;
+ for (i = 0, qp = (u_int64_t *)netbbinfop;
+ i < (sizeof *netbbinfop / sizeof (u_int64_t)); i++, qp++)
+ csum += *qp;
+ netbbinfop->cksum = -csum;
+
+ if (verbose)
+ printf("opening %s...\n", outfilename);
+ if ((fd = open(outfilename, O_WRONLY | O_CREAT, 0666)) == -1)
+ err(1, "open: %s", outfilename);
+
+ if (verbose)
+ printf("writing %s...\n", outfilename);
+ if (write(fd, netbb, sb.st_size) != sb.st_size)
+ err(1, "write of %lu to %s failed",
+ (unsigned long)sb.st_size, outfilename);
+
+ if (verbose)
+ printf("closing %s...\n", outfilename);
+ close(fd);
+
+ free(netbb);
+ if (outfile == NULL)
+ free(outfilename);
+
+ exit (0);
+}