summaryrefslogtreecommitdiff
path: root/sys/arch/mvme68k
diff options
context:
space:
mode:
authorchuck <chuck@cvs.openbsd.org>1996-05-28 15:16:58 +0000
committerchuck <chuck@cvs.openbsd.org>1996-05-28 15:16:58 +0000
commit141f24e05e3e6461b39907d3bfebb165d7a7ef4e (patch)
treeb5950a9858313eb7b6be24deea25722abe7fd0f5 /sys/arch/mvme68k
parent699bb8377b3bf0c754f90fef4169a9aad4281acf (diff)
new version of bootst (from sun3 tapeboot)
Diffstat (limited to 'sys/arch/mvme68k')
-rw-r--r--sys/arch/mvme68k/stand/bootst/boot.c75
-rw-r--r--sys/arch/mvme68k/stand/bootst/conf.c20
-rw-r--r--sys/arch/mvme68k/stand/bootst/dev_tape.c163
-rw-r--r--sys/arch/mvme68k/stand/bootst/dev_tape.h6
-rw-r--r--sys/arch/mvme68k/stand/bootst/rawfs.c180
-rw-r--r--sys/arch/mvme68k/stand/bootst/rawfs.h15
-rw-r--r--sys/arch/mvme68k/stand/bootst/version.c8
7 files changed, 467 insertions, 0 deletions
diff --git a/sys/arch/mvme68k/stand/bootst/boot.c b/sys/arch/mvme68k/stand/bootst/boot.c
new file mode 100644
index 00000000000..25e577d23b1
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/boot.c
@@ -0,0 +1,75 @@
+/* $NetBSD: boot.c,v 1.2 1995/10/17 22:58:14 gwr 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 <machine/prom.h>
+
+#include "stand.h"
+#include "libsa.h"
+
+int debug;
+int errno;
+
+extern char *version;
+char defname[32] = "2";
+char line[80];
+
+
+main()
+{
+ char *cp, *file;
+ int io, flag;
+
+ printf(">> BSD MVME%x tapeboot [%s]\n", bugargs.cputyp, version);
+
+ parse_args(&file, &flag);
+ file = defname; /* override */
+
+ if (flag & RB_ASKNAME) {
+ printf("tapeboot: segment? [%s] ", defname);
+ gets(line);
+ if (line[0])
+ file = line;
+ }
+
+ exec_mvme(file, flag);
+
+ printf("tapeboot: %s: %s\n", file, strerror(errno));
+ return(0);
+}
diff --git a/sys/arch/mvme68k/stand/bootst/conf.c b/sys/arch/mvme68k/stand/bootst/conf.c
new file mode 100644
index 00000000000..941ef65a7d4
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/conf.c
@@ -0,0 +1,20 @@
+/* $NetBSD: conf.c,v 1.2 1995/10/17 22:58:17 gwr Exp $ */
+
+#include <stand.h>
+#include <rawfs.h>
+#include <dev_tape.h>
+
+struct fs_ops file_system[] = {
+ {
+ rawfs_open, rawfs_close, rawfs_read,
+ rawfs_write, rawfs_seek, rawfs_stat,
+ },
+};
+int nfsys = 1;
+
+struct devsw devsw[] = {
+ { "tape", tape_strategy, tape_open, tape_close, tape_ioctl },
+};
+int ndevs = 1;
+
+int debug;
diff --git a/sys/arch/mvme68k/stand/bootst/dev_tape.c b/sys/arch/mvme68k/stand/bootst/dev_tape.c
new file mode 100644
index 00000000000..9286f00b0aa
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/dev_tape.c
@@ -0,0 +1,163 @@
+/* $NetBSD: dev_tape.c,v 1.2 1995/10/17 22:58:20 gwr Exp $ */
+
+/*
+ * Copyright (c) 1993 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 module implements a "raw device" interface suitable for
+ * use by the stand-alone I/O library UFS file-system code, and
+ * possibly for direct access (i.e. boot from tape).
+ */
+
+#include <sys/types.h>
+#include <machine/prom.h>
+
+#include "stand.h"
+#include "libsa.h"
+
+
+extern int debug;
+
+struct mvmeprom_dskio tape_ioreq;
+
+/*
+ * This is a special version of devopen() for tape boot.
+ * In this version, the file name is a numeric string of
+ * one digit, which is passed to the device open so it
+ * can open the appropriate tape segment.
+ */
+int
+devopen(f, fname, file)
+ struct open_file *f;
+ const char *fname; /* normally "1" */
+ char **file;
+{
+ struct devsw *dp;
+ int error;
+
+ *file = (char*)fname;
+ dp = &devsw[0];
+ f->f_dev = dp;
+
+ /* The following will call tape_open() */
+ return (dp->dv_open(f, fname));
+}
+
+int
+tape_open(f, fname)
+ struct open_file *f;
+ char *fname; /* partition number, i.e. "1" */
+{
+ int error, part;
+ struct mvmeprom_dskio *ti;
+
+ /*
+ * Set the tape segment number to the one indicated
+ * by the single digit fname passed in above.
+ */
+ if ((fname[0] < '0') && (fname[0] > '9')) {
+ return ENOENT;
+ }
+ part = fname[0] - '0';
+
+ /*
+ * Setup our part of the saioreq.
+ * (determines what gets opened)
+ */
+ ti = &tape_ioreq;
+ bzero((caddr_t)ti, sizeof(*ti));
+
+ ti->ctrl_lun = bugargs.ctrl_lun;
+ ti->dev_lun = bugargs.dev_lun;
+ ti->status = 0;
+ ti->pbuffer = NULL;
+ ti->blk_num = part;
+ ti->blk_cnt = 0;
+ ti->flag = 0;
+ ti->addr_mod = 0;
+
+ f->f_devdata = ti;
+
+ return (error);
+}
+
+int
+tape_close(f)
+ struct open_file *f;
+{
+ struct mvmeprom_dskio *ti;
+
+
+ ti = f->f_devdata;
+ f->f_devdata = NULL;
+ return 0;
+}
+
+#define MVMEPROM_SCALE (512/MVMEPROM_BLOCK_SIZE)
+
+int
+tape_strategy(devdata, flag, dblk, size, buf, rsize)
+ void *devdata;
+ int flag;
+ daddr_t dblk;
+ u_int size;
+ char *buf;
+ u_int *rsize;
+{
+ struct mvmeprom_dskio *ti;
+ int ret;
+
+ ti = devdata;
+
+ if (flag != F_READ)
+ return(EROFS);
+
+ ti->status = 0;
+ ti->pbuffer = buf;
+ /* don't change block #, set in open */
+ ti->blk_cnt = size / (512 / MVMEPROM_SCALE);
+
+ ret = mvmeprom_diskrd(ti);
+
+ if (ret != 0)
+ return (EIO);
+
+ *rsize = (ti->blk_cnt / MVMEPROM_SCALE) * 512;
+ ti->flag |= IGNORE_FILENUM; /* ignore next time */
+
+ return (0);
+}
+
+int
+tape_ioctl()
+{
+ return EIO;
+}
+
diff --git a/sys/arch/mvme68k/stand/bootst/dev_tape.h b/sys/arch/mvme68k/stand/bootst/dev_tape.h
new file mode 100644
index 00000000000..ab794284b82
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/dev_tape.h
@@ -0,0 +1,6 @@
+
+int tape_open __P((struct open_file *, ...));
+int tape_close __P((struct open_file *));
+int tape_strategy __P((void *, int, daddr_t, size_t, void *, size_t *));
+int tape_ioctl();
+
diff --git a/sys/arch/mvme68k/stand/bootst/rawfs.c b/sys/arch/mvme68k/stand/bootst/rawfs.c
new file mode 100644
index 00000000000..6603527aa75
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/rawfs.c
@@ -0,0 +1,180 @@
+/* $NetBSD: rawfs.c,v 1.1 1995/10/17 22:58:27 gwr 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;
+
+#define RAWFS_BSIZE 512
+
+/*
+ * 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;
+
+ 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;
+
+ 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 */
+{
+ return (EROFS);
+}
+
+off_t rawfs_seek(f, offset, where)
+ struct open_file *f;
+ off_t offset;
+ int where;
+{
+ return (EFTYPE);
+}
+
+int rawfs_stat(f, sb)
+ struct open_file *f;
+ struct stat *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);
+}
+
diff --git a/sys/arch/mvme68k/stand/bootst/rawfs.h b/sys/arch/mvme68k/stand/bootst/rawfs.h
new file mode 100644
index 00000000000..b177413a013
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/rawfs.h
@@ -0,0 +1,15 @@
+/* $NetBSD: rawfs.h,v 1.1 1995/10/17 22:58:29 gwr 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));
diff --git a/sys/arch/mvme68k/stand/bootst/version.c b/sys/arch/mvme68k/stand/bootst/version.c
new file mode 100644
index 00000000000..eb7bcbbf8f6
--- /dev/null
+++ b/sys/arch/mvme68k/stand/bootst/version.c
@@ -0,0 +1,8 @@
+/* $OpenBSD: version.c,v 1.1 1996/05/28 15:16:55 chuck Exp $ */
+
+/*
+ * make a random change to this file when you want the bootblock
+ * revision to increase. like change this x to a z, or something.
+ */
+
+char *version = "$Revision: 1.1 $";