X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/3fd40431350cbec9e75f3a83fc69b462f3be5d71..3f4b8ae4c8257f1967cbae33010b11310a136d36:/usr/src/sys/i386/stand/boot.c diff --git a/usr/src/sys/i386/stand/boot.c b/usr/src/sys/i386/stand/boot.c index 3ea1d61cff..ed23533683 100644 --- a/usr/src/sys/i386/stand/boot.c +++ b/usr/src/sys/i386/stand/boot.c @@ -5,7 +5,7 @@ * This code is derived from software contributed to Berkeley by * William Jolitz. * - * %sccs.include.noredist.c% + * %sccs.include.redist.c% */ #ifndef lint @@ -15,80 +15,94 @@ char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)boot.c 7.1 (Berkeley) %G%"; +static char sccsid[] = "@(#)boot.c 7.3 (Berkeley) %G%"; #endif /* not lint */ -#include "../h/param.h" -#include "../h/inode.h" -#include "../h/fs.h" -#include "../h/dir.h" -#include "../h/reboot.h" -#include "../h/disk.h" +#include "param.h" +#include "reboot.h" #include +#include #include "saio.h" /* - * Boot program... arguments passed in r6 and r7 determine + * Boot program... arguments from lower-level bootstrap determine * whether boot stops to ask for system name and which device * boot comes from. */ -#define UNIX "/vmunix" - char line[100] = UNIX; -char line2[100] = "/stand/"; -extern int howto, bootdev, unit, cyloffset, boottype; -extern int opendev, openfirst; +extern int opendev, bootdev, cyloffset; int retry = 0; +extern jmp_buf exception; -main() +main(howto, dev, off) { int io; -howto = RB_SINGLE|RB_ASKNAME; + if((dev&B_MAGICMASK) == B_DEVMAGIC) { + bootdev = dev; + cyloffset = off; + } else goto again; + + if(_setjmp(exception)) { + close(io); + printf("- load aborted\n"); +again: + howto = RB_SINGLE|RB_ASKNAME; + cyloffset = 0; + } + for (;;) { if (howto & RB_ASKNAME) { + char *cp; + printf("Boot: "); gets(line); + + /* process additional flags if any */ + if(cp = (char *)index(line, ' ')) { + howto = strtol (cp, 0, 0); + *cp = '\0'; + } + cyloffset = 0; } else printf("Boot: %s\n", line); + if (line[0] == 0) { strcpy(line, UNIX); printf("Boot: %s\n", line); } io = open(line, 0); - /*if (io < 0) { - strcat(line2,line) ; - io = open(line2, 0); - }*/ if (io >= 0) { - bootdev = opendev; - copyunix(io); - } - openfirst = 1; - if (++retry > 2) - howto = RB_SINGLE|RB_ASKNAME; + copyunix(io, howto); + goto again; + } else if (++retry > 2) + goto again; } } /*ARGSUSED*/ -copyunix(io) +copyunix(io, howto) register io; { struct exec x; int i; - char *addr; + char *addr,c; i = read(io, (char *)&x, sizeof x); if (i != sizeof x || - (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) - _stop("Bad format\n"); + (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { + printf("Bad format\n"); + return; + } + printf("%d", x.a_text); if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) goto shread; if (read(io, (char *)0, x.a_text) != x.a_text) goto shread; + addr = (char *)x.a_text; if (x.a_magic == 0413 || x.a_magic == 0410) while ((int)addr & CLOFSET) @@ -96,16 +110,25 @@ copyunix(io) printf("+%d", x.a_data); if (read(io, addr, x.a_data) != x.a_data) goto shread; + addr += x.a_data; printf("+%d", x.a_bss); x.a_bss += 128*512; /* slop */ for (i = 0; i < x.a_bss; i++) *addr++ = 0; + + /* mask high order bits corresponding to relocated system base */ + x.a_entry &= 0xfff00000; printf(" start 0x%x\n", x.a_entry); - setregs() ; - i = (*((int (*)()) x.a_entry))(); + + if(c=scankbd()) + _longjmp(&exception,1); + + i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset); + if (i) printf("exit %d\n", i) ; return; shread: - _stop("Short read\n"); + printf("Short read\n"); + return; }