summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Murphree <smurph@cvs.openbsd.org>1998-08-22 08:27:09 +0000
committerSteve Murphree <smurph@cvs.openbsd.org>1998-08-22 08:27:09 +0000
commit40e92a9b193ae6946e51d01ebccc6d71a84c80e0 (patch)
tree622986f592f452d980fad5c18ae3aaee10ad1224
parentddb7d152e6d219dba67c0db680b099c420708f8f (diff)
Initial import of bootxx.
-rw-r--r--sys/arch/mvme88k/stand/bootxx/Makefile35
-rw-r--r--sys/arch/mvme88k/stand/bootxx/bootxx.c142
-rw-r--r--sys/arch/mvme88k/stand/bootxx/conf.c14
-rw-r--r--sys/arch/mvme88k/stand/bootxx/version.c8
4 files changed, 199 insertions, 0 deletions
diff --git a/sys/arch/mvme88k/stand/bootxx/Makefile b/sys/arch/mvme88k/stand/bootxx/Makefile
new file mode 100644
index 00000000000..abe5050b657
--- /dev/null
+++ b/sys/arch/mvme88k/stand/bootxx/Makefile
@@ -0,0 +1,35 @@
+# from: @(#)Makefile 8.1 (Berkeley) 6/10/93
+# $OpenBSD: Makefile,v 1.1 1998/08/22 08:27:07 smurph Exp $
+
+RELOC=0x3F0000
+
+S= ${.CURDIR}/../../../..
+DEFS=
+INCPATH=-I${.CURDIR} -I${.CURDIR}/../libsa -I${.CURDIR}/../libbug \
+ -I${.CURDIR}/../../include -I${S} -I${S}/lib/libsa
+CFLAGS= -O2 ${INCPATH} ${DEFS} ${COPTS}
+CLEANFILES+=bootxx
+
+.include "${S}/arch/mvme88k/stand/bugcrt/Makefile.inc"
+.include "${S}/arch/mvme88k/stand/libbug/Makefile.inc"
+.include "${S}/arch/mvme88k/stand/libsa/Makefile.inc"
+.include "${S}/arch/mvme88k/stand/libz/Makefile.inc"
+
+SRCS= bootxx.c conf.c version.c
+
+LIBS= ${LIBSA} ${LIBBUG} ${LIBZ} libgcc.a
+
+OBJS= ${SRCS:N*.h:R:S/$/.o/g}
+
+BOOTS= bootxx
+ALL= ${BOOTS}
+
+all: ${ALL}
+
+bootxx: ${OBJS} ${BUGCRT} ${LIBS}
+ ${LD} -N -T ${RELOC} ${BUGCRT} ${OBJS} ${LIBS} -o $@
+
+install:
+ install -c -m 555 -g bin -o bin ${BOOTS} ${DESTDIR}${MDEC_DIR}
+
+.include <bsd.prog.mk>
diff --git a/sys/arch/mvme88k/stand/bootxx/bootxx.c b/sys/arch/mvme88k/stand/bootxx/bootxx.c
new file mode 100644
index 00000000000..5f488b616ec
--- /dev/null
+++ b/sys/arch/mvme88k/stand/bootxx/bootxx.c
@@ -0,0 +1,142 @@
+/* $OpenBSD: bootxx.c,v 1.1 1998/08/22 08:27:08 smurph Exp $ */
+
+/*
+ * Copyright (c) 1994 Paul Kranenburg
+ * 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 Paul Kranenburg.
+ * 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.
+ */
+
+/*
+ * This is a generic "first-stage" boot program.
+ *
+ * Note that this program has absolutely no filesystem knowledge!
+ *
+ * Instead, this uses a table of disk block numbers that are
+ * filled in by the installboot program such that this program
+ * can load the "second-stage" boot program.
+ */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/exec.h>
+#include <machine/prom.h>
+
+#include "stand.h"
+#include "libsa.h"
+
+/*
+ * Boot device is derived from ROM provided information.
+ */
+#define LOADADDR 0x11000 /* where to load level 2 bootstrap */
+ /* (l2 must relocate itself) */
+
+/* This determines the largest boot program we can load. */
+#define MAXBLOCKNUM 64
+
+/*
+ * These three names are known by installboot.
+ * The block_table contains starting block numbers,
+ * in terms of 512-byte blocks. Each non-zero value
+ * will result in a read of block_size bytes.
+ */
+int block_size = 512; /* default */
+int block_count = MAXBLOCKNUM; /* length of table */
+daddr_t block_table[MAXBLOCKNUM] = { 0 };
+
+extern char *version;
+
+
+main()
+{
+ struct open_file f;
+ char *addr;
+ int n, error;
+
+ printf("Boot: bug device: ctrl=%d, dev=%d\n",
+ bugargs.ctrl_lun, bugargs.dev_lun);
+ printf("\nbootxx: first level bootstrap program [%s]\n\n", version);
+
+ f.f_flags = F_RAW;
+ if (devopen(&f, 0, &addr)) {
+ printf("bootxx: open failed\n");
+ _rtt();
+ }
+
+ addr = (char*)LOADADDR;
+ error = copyboot(&f, addr);
+ f.f_dev->dv_close(&f);
+ if (!error) {
+ bugexec((void (*)())addr);
+ }
+ /* copyboot had a problem... */
+ _rtt();
+}
+
+int
+copyboot(fp, addr)
+ struct open_file *fp;
+ char *addr;
+{
+ int n, i, blknum;
+ struct exec *x;
+
+ addr -= sizeof(struct exec); /* assume OMAGIC, verify below */
+ x = (struct exec *)addr;
+
+ if (!block_count) {
+ printf("bootxx: no data!?!\n");
+ return -1;
+ }
+
+ for (i = 0; i < block_count; i++) {
+
+ if ((blknum = block_table[i]) == 0)
+ break;
+
+#ifdef DEBUG
+ printf("bootxx: read block # %d = %d\n", i, blknum);
+#endif
+ if ((fp->f_dev->dv_strategy)(fp->f_devdata, F_READ,
+ blknum, block_size, addr, &n))
+ {
+ printf("bootxx: read failed\n");
+ return -1;
+ }
+ if (n != block_size) {
+ printf("bootxx: short read\n");
+ return -1;
+ }
+ addr += block_size;
+ }
+
+ if (N_GETMAGIC(*x) != OMAGIC) {
+ printf("bootxx: secondary bootstrap isn't in OMAGIC format\n");
+ return(-1);
+ }
+
+ return 0;
+}
diff --git a/sys/arch/mvme88k/stand/bootxx/conf.c b/sys/arch/mvme88k/stand/bootxx/conf.c
new file mode 100644
index 00000000000..c4545664577
--- /dev/null
+++ b/sys/arch/mvme88k/stand/bootxx/conf.c
@@ -0,0 +1,14 @@
+/* $OpenBSD: conf.c,v 1.1 1998/08/22 08:27:08 smurph Exp $ */
+
+#include <sys/types.h>
+#include <machine/prom.h>
+
+#include "stand.h"
+#include "libsa.h"
+
+struct devsw devsw[] = {
+ { "bugsc", bugscstrategy, bugscopen, bugscclose, bugscioctl },
+};
+int ndevs = (sizeof(devsw)/sizeof(devsw[0]));
+
+int debug;
diff --git a/sys/arch/mvme88k/stand/bootxx/version.c b/sys/arch/mvme88k/stand/bootxx/version.c
new file mode 100644
index 00000000000..b4c2a49ba7b
--- /dev/null
+++ b/sys/arch/mvme88k/stand/bootxx/version.c
@@ -0,0 +1,8 @@
+/* $OpenBSD: version.c,v 1.1 1998/08/22 08:27:08 smurph Exp $ */
+
+/*
+ * make a random change to this file when you want the bootblock
+ * revision to increase. like change this y to an x, or something.
+ */
+
+char *version = "$Revision: 1.1 $";