diff options
author | chuck <chuck@cvs.openbsd.org> | 1996-05-28 15:16:58 +0000 |
---|---|---|
committer | chuck <chuck@cvs.openbsd.org> | 1996-05-28 15:16:58 +0000 |
commit | 141f24e05e3e6461b39907d3bfebb165d7a7ef4e (patch) | |
tree | b5950a9858313eb7b6be24deea25722abe7fd0f5 /sys/arch/mvme68k | |
parent | 699bb8377b3bf0c754f90fef4169a9aad4281acf (diff) |
new version of bootst (from sun3 tapeboot)
Diffstat (limited to 'sys/arch/mvme68k')
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/boot.c | 75 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/conf.c | 20 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/dev_tape.c | 163 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/dev_tape.h | 6 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/rawfs.c | 180 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/rawfs.h | 15 | ||||
-rw-r--r-- | sys/arch/mvme68k/stand/bootst/version.c | 8 |
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 $"; |