diff options
-rw-r--r-- | sys/arch/hp300/stand/Makefile | 20 | ||||
-rw-r--r-- | sys/arch/hp300/stand/inst.c | 666 |
2 files changed, 3 insertions, 683 deletions
diff --git a/sys/arch/hp300/stand/Makefile b/sys/arch/hp300/stand/Makefile index 04659c58037..e1577c7f2c2 100644 --- a/sys/arch/hp300/stand/Makefile +++ b/sys/arch/hp300/stand/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.9 1997/04/16 12:38:21 downsj Exp $ +# $OpenBSD: Makefile,v 1.10 1997/04/21 07:37:36 downsj Exp $ # $NetBSD: Makefile,v 1.22 1996/10/18 06:03:25 thorpej Exp $ # @(#)Makefile 8.1 (Berkeley) 6/10/93 @@ -43,8 +43,8 @@ LIBSA= ${SA_LIB} LIBS= ${OBJS} ${LIBSA} ${LIBZ} ${LIBKERN} -BOOTS= uboot.lif inst.lif -BOOTAOUTS=uboot inst +BOOTS= uboot.lif +BOOTAOUTS=uboot ALL= ${BOOTS} mkboot installboot all: ${ALL} @@ -72,16 +72,6 @@ uboot: srt0.o uboot.o tgets.o netio.o clock.o conf.o ${LIBS} @size $@ @echo $@ total size should not exceed 1044480 bytes -# miniroot installation program -inst.lif: inst mkboot - ./mkboot inst $@ - -inst: srt0.o inst.o clock.o conf.o netio.o tgets.o ${LIBS} - ${LD} -N -T ${RELOC} -e begin srt0.o inst.o clock.o conf.o netio.o \ - tgets.o ${LIBS} -o $@ - @size $@ - @echo $@ total size should not exceed 1044480 bytes - # helper program ... turns OMAGIC into LIF mkboot: ${.CURDIR}/mkboot.c ${CC} ${CFLAGS} ${.CURDIR}/mkboot.c -o $@ @@ -118,10 +108,6 @@ install: ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/bootct rm -f ${DESTDIR}/usr/mdec/rbootd/SYS_UBOOT ln ${DESTDIR}/usr/mdec/uboot.lif ${DESTDIR}/usr/mdec/rbootd/SYS_UBOOT - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 inst.lif \ - ${DESTDIR}/usr/mdec - rm -f ${DESTDIR}/usr/mdec/rbootd/SYS_INST - ln ${DESTDIR}/usr/mdec/inst.lif ${DESTDIR}/usr/mdec/rbootd/SYS_INST #obj: _SUBDIRUSE diff --git a/sys/arch/hp300/stand/inst.c b/sys/arch/hp300/stand/inst.c deleted file mode 100644 index fa9b8e3bef1..00000000000 --- a/sys/arch/hp300/stand/inst.c +++ /dev/null @@ -1,666 +0,0 @@ -/* $OpenBSD: inst.c,v 1.5 1997/04/16 12:38:22 downsj Exp $ */ -/* $NetBSD: inst.c,v 1.6 1996/12/21 21:23:43 thorpej Exp $ */ - -/* - * Copyright (c) 1995, 1996 Jason R. Thorpe. - * 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 for the NetBSD Project - * by Jason R. Thorpe. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * Portions of this program are inspired by (and have borrowed code from) - * the `editlabel' program that accompanies NetBSD/vax, which carries - * the following notice: - * - * Copyright (c) 1995 Ludd, University of Lule}, Sweden. - * 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 at Ludd, University of - * Lule}, Sweden and its contributors. - * 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. - */ - -#define DKTYPENAMES - -#include <sys/param.h> -#include <sys/reboot.h> -#include <sys/disklabel.h> -#include <machine/exec.h> -#include <a.out.h> -#include "stand.h" -#include "samachdep.h" - -char line[100]; - -extern u_int opendev; -extern char *lowram; -extern int noconsole; -extern int netio_ask; - -extern const char version[]; - -char *kernel_name = "/bsd"; - -void dsklabel __P((void)); -void miniroot __P((void)); -void bootmini __P((void)); -void resetsys __P((void)); -void gethelp __P((void)); -int opendisk __P((char *, char *, int, char, int *)); -void disklabel_edit __P((struct disklabel *)); -void disklabel_show __P((struct disklabel *)); -int disklabel_write __P((char *, int, struct open_file *)); -int a2int __P((char *)); - -struct inst_command { - char *ic_cmd; /* command name */ - char *ic_desc; /* command description */ - void (*ic_func) __P((void)); /* handling function */ -} inst_commands[] = { - { "disklabel", "place partition map on disk", dsklabel }, - { "miniroot", "place miniroot on disk", miniroot }, - { "boot", "boot from miniroot", bootmini }, - { "reset", "reset the system", resetsys }, - { "help", "display command list", gethelp }, -}; -#define NCMDS (sizeof(inst_commands) / sizeof(inst_commands[0])) - -main() -{ - int i, currname = 0; - - /* - * We want netopen() to ask for IP address, etc, rather - * that using bootparams. - */ - netio_ask = 1; - - printf("\n>> OpenBSD [%dKB] MINIROOT INSTALLATION %s HP9000/%s CPU\n", - (__LDPGSZ / 1024), version, getmachineid()); - gethelp(); - - for (;;) { - printf("sys_inst> "); - bzero(line, sizeof(line)); - gets(line); - if (line[0] == '\n' || line[0] == '\0') - continue; - - for (i = 0; i < NCMDS; ++i) - if (strcmp(line, inst_commands[i].ic_cmd) == 0) { - (*inst_commands[i].ic_func)(); - break; - } - - - if (i == NCMDS) - printf("unknown command: %s\n", line); - } -} - -void -gethelp() -{ - int i; - - printf(">> Available commands:\n"); - for (i = 0; i < NCMDS; ++i) - printf(">> %s - %s\n", inst_commands[i].ic_cmd, - inst_commands[i].ic_desc); -} - -/* - * Do all the steps necessary to place a disklabel on a disk. - * Note, this assumes 512 byte sectors. - */ -void -dsklabel() -{ - struct disklabel *lp; - struct open_file *disk_ofp; - int dfd, error; - size_t xfersize; - char block[DEV_BSIZE], diskname[64]; - extern struct open_file files[]; - - printf(" -You will be asked several questions about your disk, most of which -require prior knowledge of the disk's geometry. There is no easy way -for the system to provide this information for you. If you do not have -this information, please consult your disk's manual or another -informative source.\n\n"); - - /* Error message printed by opendisk() */ - if (opendisk("Disk to label?", diskname, sizeof(diskname), - ('a' + RAW_PART), &dfd)) - return; - - disk_ofp = &files[dfd]; - - bzero(block, sizeof(block)); - if (error = (*disk_ofp->f_dev->dv_strategy)(disk_ofp->f_devdata, - F_READ, LABELSECTOR, sizeof(block), block, &xfersize)) { - printf("cannot read disk %s, errno = %d\n", diskname, error); - return; - } - - printf("Sucessfully read %d bytes from %s\n", xfersize, diskname); - - lp = (struct disklabel *)((void *)(&block[LABELOFFSET])); - - disklabel_loop: - bzero(line, sizeof(line)); - printf("(z)ap, (e)dit, (s)how, (w)rite, (d)one > "); - gets(line); - if (line[0] == '\n' || line[0] == '\0') - goto disklabel_loop; - - switch (line[0]) { - case 'z': - case 'Z': { - char zap[DEV_BSIZE]; - bzero(zap, sizeof(zap)); - (void)(*disk_ofp->f_dev->dv_strategy)(disk_ofp->f_devdata, - F_WRITE, LABELSECTOR, sizeof(zap), zap, &xfersize); - } - goto out; - /* NOTREACHED */ - - case 'e': - case 'E': - disklabel_edit(lp); - break; - - case 's': - case 'S': - disklabel_show(lp); - break; - - case 'w': - case 'W': - /* - * Error message will be displayed by disklabel_write() - */ - if (disklabel_write(block, sizeof(block), disk_ofp)) - goto out; - else - printf("Sucessfully wrote label to %s\n", diskname); - break; - - case 'd': - case 'D': - goto out; - /* NOTREACHED */ - - default: - printf("unkown command: %s\n", line); - } - - goto disklabel_loop; - /* NOTREACHED */ - - out: - /* - * Close disk. Marks disk `not alive' so that partition - * information will be reloaded upon next open. - */ - (void)close(dfd); -} - -#define GETNUM(out, num) \ - printf((out), (num)); \ - bzero(line, sizeof(line)); \ - gets(line); \ - if (line[0]) \ - (num) = atoi(line); - -#define GETNUM2(out, num1, num2) \ - printf((out), (num1), (num2)); \ - bzero(line, sizeof(line)); \ - gets(line); \ - if (line[0]) \ - (num2) = atoi(line); - -#define GETSTR(out, str) \ - printf((out), (str)); \ - bzero(line, sizeof(line)); \ - gets(line); \ - if (line[0]) \ - strcpy((str), line); - -#define FLAGS(out, flag) \ - printf((out), lp->d_flags & (flag) ? 'y' : 'n'); \ - bzero(line, sizeof(line)); \ - gets(line); \ - if (line[0] == 'y' || line[0] == 'Y') \ - lp->d_flags |= (flag); \ - else \ - lp->d_flags &= ~(flag); - -void -disklabel_edit(lp) - struct disklabel *lp; -{ - int i; - - printf("Select disk type. Valid types:\n"); - for (i = 0; i < DKMAXTYPES; i++) - printf("%d %s\n", i, dktypenames[i]); - printf("\n"); - - GETNUM("Disk type (number)? [%d] ", lp->d_type); - GETSTR("Disk model name? [%s] ", lp->d_typename); - GETSTR("Disk pack name? [%s] ", lp->d_packname); - FLAGS("Bad sectoring? [%c] ", D_BADSECT); - FLAGS("Ecc? [%c] ", D_ECC); - FLAGS("Removable? [%c] ", D_REMOVABLE); - - printf("\n"); - - GETNUM("Interleave? [%d] ", lp->d_interleave); - GETNUM("Rpm? [%d] ", lp->d_rpm); - GETNUM("Trackskew? [%d] ", lp->d_trackskew); - GETNUM("Cylinderskew? [%d] ", lp->d_cylskew); - GETNUM("Headswitch? [%d] ", lp->d_headswitch); - GETNUM("Track-to-track? [%d] ", lp->d_trkseek); - GETNUM("Drivedata 0? [%d] ", lp->d_drivedata[0]); - GETNUM("Drivedata 1? [%d] ", lp->d_drivedata[1]); - GETNUM("Drivedata 2? [%d] ", lp->d_drivedata[2]); - GETNUM("Drivedata 3? [%d] ", lp->d_drivedata[3]); - GETNUM("Drivedata 4? [%d] ", lp->d_drivedata[4]); - - printf("\n"); - - GETNUM("Bytes/sector? [%d] ", lp->d_secsize); - GETNUM("Sectors/track? [%d] ", lp->d_nsectors); - GETNUM("Tracks/cylinder? [%d] ", lp->d_ntracks); - GETNUM("Sectors/cylinder? [%d] ", lp->d_secpercyl); - GETNUM("Cylinders? [%d] ", lp->d_ncylinders); - - printf(" -Enter partition table. Note, sizes and offsets are in sectors.\n\n"); - - lp->d_npartitions = MAXPARTITIONS; - for (i = 0; i < lp->d_npartitions; ++i) { - GETNUM2("%c partition: offset? [%d] ", ('a' + i), - lp->d_partitions[i].p_offset); - GETNUM(" size? [%d] ", lp->d_partitions[i].p_size); - } - - /* Perform magic. */ - lp->d_magic = lp->d_magic2 = DISKMAGIC; - - /* Calculate disklabel checksum. */ - lp->d_checksum = 0; - lp->d_checksum = dkcksum(lp); -} - -void -disklabel_show(lp) - struct disklabel *lp; -{ - int i, npart; - struct partition *pp; - - /* - * Check for valid disklabel. - */ - if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC) { - printf("No disklabel to show.\n"); - return; - } - - if (lp->d_npartitions > MAXPARTITIONS || dkcksum(lp) != 0) { - printf("Corrupted disklabel.\n"); - return; - } - - printf("\ndisk type %d (%s), %s: %s%s%s\n", lp->d_type, - lp->d_type < DKMAXTYPES ? dktypenames[lp->d_type] : - dktypenames[0], lp->d_typename, - (lp->d_flags & D_REMOVABLE) ? " removable" : "", - (lp->d_flags & D_ECC) ? " ecc" : "", - (lp->d_flags & D_BADSECT) ? " badsect" : ""); - - printf("interleave %d, rpm %d, trackskew %d, cylinderskew %d\n", - lp->d_interleave, lp->d_rpm, lp->d_trackskew, lp->d_cylskew); - - printf("headswitch %d, track-to-track %d, drivedata: %d %d %d %d %d\n", - lp->d_headswitch, lp->d_trkseek, lp->d_drivedata[0], - lp->d_drivedata[1], lp->d_drivedata[2], lp->d_drivedata[3], - lp->d_drivedata[4]); - - printf("\nbytes/sector: %d\n", lp->d_secsize); - printf("sectors/track: %d\n", lp->d_nsectors); - printf("tracks/cylinder: %d\n", lp->d_ntracks); - printf("sectors/cylinder: %d\n", lp->d_secpercyl); - printf("cylinders: %d\n", lp->d_ncylinders); - - printf("\n%d partitions:\n", lp->d_npartitions); - printf(" size offset\n"); - pp = lp->d_partitions; - for (i = 0; i < lp->d_npartitions; i++) { - printf("%c: %d, %d\n", 97 + i, lp->d_partitions[i].p_size, - lp->d_partitions[i].p_offset); - } - printf("\n"); -} - -int -disklabel_write(block, len, ofp) - char *block; - int len; - struct open_file *ofp; -{ - int error = 0; - size_t xfersize; - - if (error = (*ofp->f_dev->dv_strategy)(ofp->f_devdata, F_WRITE, - LABELSECTOR, len, block, &xfersize)) - printf("cannot write disklabel, errno = %d\n", error); - - return (error); -} - -int -opendisk(question, diskname, len, partition, fdp) - char *question, *diskname; - int len; - char partition; - int *fdp; -{ - char fulldiskname[64], *filename; - int i, error = 0; - - getdiskname: - printf("%s ", question); - bzero(diskname, len); - bzero(fulldiskname, sizeof(fulldiskname)); - gets(diskname); - if (diskname[0] == '\n' || diskname[0] == '\0') - goto getdiskname; - - /* - * devopen() is picky. Make sure it gets the sort of string it - * wants. - */ - bcopy(diskname, fulldiskname, - len < sizeof(fulldiskname) ? len : sizeof(fulldiskname)); - for (i = 0; fulldiskname[i + 1] != '\0'; ++i) - /* Nothing. */ ; - if (fulldiskname[i] < '0' || fulldiskname[i] > '9') { - printf("invalid disk name %s\n", diskname); - goto getdiskname; - } - fulldiskname[++i] = partition; fulldiskname[++i] = ':'; - - /* - * We always open for writing. - */ - if ((*fdp = open(fulldiskname, 1)) < 0) { - printf("cannot open %s\n", diskname); - return (1); - } - - return (0); -} - -/* - * Copy a miniroot image from an NFS server or tape to the `b' partition - * of the specified disk. Note, this assumes 512 byte sectors. - */ -void -miniroot() -{ - int sfd, dfd, i, nblks; - char diskname[64], minirootname[128]; - char block[DEV_BSIZE]; - char tapename[64]; - int fileno; - struct stat st; - size_t xfersize; - struct open_file *disk_ofp; - extern struct open_file files[]; - - /* Error message printed by opendisk() */ - if (opendisk("Disk for miniroot?", diskname, sizeof(diskname), - 'b', &dfd)) - return; - - disk_ofp = &files[dfd]; - - getsource: - printf("Source? (N)FS, (t)ape, (d)one > "); - bzero(line, sizeof(line)); - gets(line); - if (line[0] == '\0') - goto getsource; - - switch (line[0]) { - case 'n': - case 'N': - name_of_nfs_miniroot: - printf("Name of miniroot file? "); - bzero(line, sizeof(line)); - bzero(minirootname, sizeof(minirootname)); - gets(line); - if (line[0] == '\0') - goto name_of_nfs_miniroot; - (void)strcat(minirootname, "le0a:"); - (void)strcat(minirootname, line); - if ((sfd = open(minirootname, 0)) < 0) { - printf("can't open %s\n", line); - return; - } - - /* - * Find out how big the miniroot is. Make sure it's - * an even number of blocks... - */ - if (fstat(sfd, &st) < 0) { - printf("can't stat %s\n", line); - goto done; - } - if (st.st_size % DEV_BSIZE) { - printf("Miniroot size must be an even multiple of %d\n", - DEV_BSIZE); - return; - } - nblks = (int)(st.st_size / sizeof(block)); - - printf("Copying %d blocks from %s to %s...", nblks, line, - diskname); - break; - - case 't': - case 'T': - name_of_tape_miniroot: - printf("Which tape device? "); - bzero(line, sizeof(line)); - bzero(minirootname, sizeof(minirootname)); - bzero(tapename, sizeof(tapename)); - gets(line); - if (line[0] == '\0') - goto name_of_tape_miniroot; - strcat(minirootname, line); - strcat(tapename, line); - - printf("File number (first == 1)? "); - bzero(line, sizeof(line)); - gets(line); - fileno = a2int(line); - if (fileno < 1 || fileno > 8) { - printf("Invalid file number: %s\n", line); - goto getsource; - } - for (i = 0; i < sizeof(minirootname); ++i) { - if (minirootname[i] == '\0') - break; - } - if (i == sizeof(minirootname) || - (sizeof(minirootname) - i) < 8) { - printf("Invalid device name: %s\n", tapename); - goto getsource; - } - minirootname[i++] = 'a' + (fileno - 1); - minirootname[i++] = ':'; - strcat(minirootname, "XXX"); /* lameness in open() */ - - printf("Copy how many %d byte blocks? ", DEV_BSIZE); - bzero(line, sizeof(line)); - gets(line); - nblks = a2int(line); - if (nblks < 0) { - printf("Invalid block count: %s\n", line); - goto getsource; - } else if (nblks == 0) { - printf("Zero blocks? Ok, aborting.\n"); - return; - } - - if ((sfd = open(minirootname, 0)) < 0) { - printf("can't open %s file %c\n", tapename, fileno); - return; - } - - printf("Copying %s file %c to %s...", tapename, fileno, - diskname); - break; - - case 'd': - case 'D': - return; - - default: - printf("Unknown source: %s\n", line); - goto getsource; - } - - /* - * Copy loop... - * This is fairly slow... if someone wants to speed it - * up, they'll get no complaints from me. - */ - for (i = 0; i < nblks; ++i) { - if (read(sfd, block, sizeof(block)) != sizeof(block)) { - printf("Short read, errno = %d\n", errno); - goto done; - } - if ((*disk_ofp->f_dev->dv_strategy)(disk_ofp->f_devdata, - F_WRITE, i, sizeof(block), block, &xfersize) || - xfersize != sizeof(block)) { - printf("Bad write at block %d, errno = %d\n", - i, errno); - goto done; - } - } - printf("done\n"); - - printf("Successfully copied miniroot image.\n"); - - done: - close(sfd); - close(dfd); -} - -/* - * Boot the kernel from the miniroot image into single-user. - */ -void -bootmini() -{ - char diskname[64], bootname[64]; - int i; - - getdiskname: - printf("Disk to boot from? "); - bzero(diskname, sizeof(diskname)); - bzero(bootname, sizeof(bootname)); - gets(diskname); - if (diskname[0] == '\n' || diskname[0] == '\0') - goto getdiskname; - - /* - * devopen() is picky. Make sure it gets the sort of string it - * wants. - */ - (void)strcat(bootname, diskname); - for (i = 0; bootname[i + 1] != '\0'; ++i) - /* Nothing. */ ; - if (bootname[i] < '0' || bootname[i] > '9') { - printf("invalid disk name %s\n", diskname); - goto getdiskname; - } - bootname[++i] = 'b'; bootname[++i] = ':'; - (void)strcat(bootname, kernel_name); - - howto = RB_SINGLE; /* _Always_ */ - - printf("booting: %s -s\n", bootname); - exec(bootname, lowram, howto); - printf("boot: %s\n", strerror(errno)); -} - -/* - * Reset the system. - */ -void -resetsys() -{ - - call_req_reboot(); - printf("panic: can't reboot, halting\n"); - asm("stop #0x2700"); -} - -/* - * XXX Should have a generic atoi for libkern/libsa. - */ -int -a2int(cp) - char *cp; -{ - int i = 0; - - if (*cp == '\0') - return (-1); - - while (*cp != '\0') - i = i * 10 + *cp++ - '0'; - return (i); -} |