diff options
author | Steve Murphree <smurph@cvs.openbsd.org> | 2001-06-26 21:58:11 +0000 |
---|---|---|
committer | Steve Murphree <smurph@cvs.openbsd.org> | 2001-06-26 21:58:11 +0000 |
commit | 416f561c78b0eca90fdb484e72a96080b0825dca (patch) | |
tree | d310db0254b85229b90b9d90e79cabfbbcb6101a /sys/arch/mvmeppc/stand/bootxx | |
parent | 77682e0d8d22531ed2952aaab30aae7c69483b3d (diff) |
Initial import of mvmeppc.
Diffstat (limited to 'sys/arch/mvmeppc/stand/bootxx')
-rw-r--r-- | sys/arch/mvmeppc/stand/bootxx/Makefile | 33 | ||||
-rw-r--r-- | sys/arch/mvmeppc/stand/bootxx/bootxx.c | 142 | ||||
-rw-r--r-- | sys/arch/mvmeppc/stand/bootxx/version.c | 8 |
3 files changed, 183 insertions, 0 deletions
diff --git a/sys/arch/mvmeppc/stand/bootxx/Makefile b/sys/arch/mvmeppc/stand/bootxx/Makefile new file mode 100644 index 00000000000..1f5fdf5af01 --- /dev/null +++ b/sys/arch/mvmeppc/stand/bootxx/Makefile @@ -0,0 +1,33 @@ +# from: @(#)Makefile 8.1 (Berkeley) 6/10/93 +# $OpenBSD: Makefile,v 1.1 2001/06/26 21:58:01 smurph Exp $ + +S= ${.CURDIR}/../../../.. +DEFS=-DSTAGE2_RELOC=${STAGE2_RELOC} +INCPATH=-I${.CURDIR} -I${.CURDIR}/../libsa -I${.CURDIR}/../libbug \ + -I${.CURDIR}/../../include -I${S} -I${S}/lib/libsa +CFLAGS=-O0 ${INCPATH} ${DEFS} ${COPTS} +CLEANFILES+=bootxx + +.include "${S}/arch/mvmeppc/stand/bugcrt/Makefile.inc" +.include "${S}/arch/mvmeppc/stand/libbug/Makefile.inc" +.include "${S}/arch/mvmeppc/stand/libsa/Makefile.inc" +.include "${S}/arch/mvmeppc/stand/libz/Makefile.inc" + +SRCS= bootxx.c version.c + +LIBS= ${LIBSA} ${LIBBUG} ${LIBZ} ${LIBGCC} + +OBJS= ${SRCS:N*.h:R:S/$/.o/g} + +BOOTS= bootxx +ALL= ${BOOTS} + +all: ${ALL} + +bootxx: ${OBJS} ${STAGE1} ${LIBS} + ${LD} -X -N -Ttext ${STAGE1_RELOC} ${STAGE1} ${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/mvmeppc/stand/bootxx/bootxx.c b/sys/arch/mvmeppc/stand/bootxx/bootxx.c new file mode 100644 index 00000000000..451ae40de97 --- /dev/null +++ b/sys/arch/mvmeppc/stand/bootxx/bootxx.c @@ -0,0 +1,142 @@ +/* $OpenBSD: bootxx.c,v 1.1 2001/06/26 21:58:01 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. + */ + +/* 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; + + bootdev_type = BUGDEV_DISK; + + 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*)STAGE2_RELOC; + 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/mvmeppc/stand/bootxx/version.c b/sys/arch/mvmeppc/stand/bootxx/version.c new file mode 100644 index 00000000000..1dca3531fee --- /dev/null +++ b/sys/arch/mvmeppc/stand/bootxx/version.c @@ -0,0 +1,8 @@ +/* $OpenBSD: version.c,v 1.1 2001/06/26 21:58:01 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 $"; |