141068Swilliam /*- 241068Swilliam * Copyright (c) 1990 The Regents of the University of California. 341068Swilliam * All rights reserved. 441068Swilliam * 541068Swilliam * This code is derived from software contributed to Berkeley by 641068Swilliam * William Jolitz. 741068Swilliam * 8*48812Swilliam * %sccs.include.redist.c% 941068Swilliam */ 1041068Swilliam 1141068Swilliam #ifndef lint 1241068Swilliam char copyright[] = 1341068Swilliam "@(#) Copyright (c) 1990 The Regents of the University of California.\n\ 1441068Swilliam All rights reserved.\n"; 1541068Swilliam #endif /* not lint */ 1641068Swilliam 1741068Swilliam #ifndef lint 18*48812Swilliam static char sccsid[] = "@(#)boot.c 7.2 (Berkeley) 04/28/91"; 1941068Swilliam #endif /* not lint */ 2041068Swilliam 21*48812Swilliam #include "param.h" 22*48812Swilliam #include "reboot.h" 2341068Swilliam #include <a.out.h> 24*48812Swilliam #include <setjmp.h> 2541068Swilliam #include "saio.h" 2641068Swilliam 2741068Swilliam /* 28*48812Swilliam * Boot program... arguments from lower-level bootstrap determine 2941068Swilliam * whether boot stops to ask for system name and which device 3041068Swilliam * boot comes from. 3141068Swilliam */ 3241068Swilliam 3341068Swilliam #define UNIX "/vmunix" 3441068Swilliam 3541068Swilliam char line[100] = UNIX; 36*48812Swilliam extern int opendev, bootdev, cyloffset; 3741068Swilliam int retry = 0; 38*48812Swilliam jmp_buf exception; 3941068Swilliam 40*48812Swilliam main(howto, dev, off) 4141068Swilliam { 4241068Swilliam int io; 4341068Swilliam 44*48812Swilliam if((dev&B_MAGICMASK) == B_DEVMAGIC) { 45*48812Swilliam bootdev = dev; 46*48812Swilliam cyloffset = off; 47*48812Swilliam } else goto again; 48*48812Swilliam 49*48812Swilliam if(_setjmp(exception)) { 50*48812Swilliam close(io); 51*48812Swilliam printf("- load aborted\n"); 52*48812Swilliam again: 53*48812Swilliam howto = RB_SINGLE|RB_ASKNAME; 54*48812Swilliam cyloffset = 0; 55*48812Swilliam } 56*48812Swilliam 5741068Swilliam for (;;) { 5841068Swilliam if (howto & RB_ASKNAME) { 59*48812Swilliam char *cp; 60*48812Swilliam 6141068Swilliam printf("Boot: "); 6241068Swilliam gets(line); 63*48812Swilliam 64*48812Swilliam /* process additional flags if any */ 65*48812Swilliam if(cp = (char *)index(line, ' ')) { 66*48812Swilliam howto = strtol (cp, 0, 0); 67*48812Swilliam *cp = '\0'; 68*48812Swilliam } 69*48812Swilliam cyloffset = 0; 7041068Swilliam } else 7141068Swilliam printf("Boot: %s\n", line); 72*48812Swilliam 7341068Swilliam if (line[0] == 0) { 7441068Swilliam strcpy(line, UNIX); 7541068Swilliam printf("Boot: %s\n", line); 7641068Swilliam } 7741068Swilliam 7841068Swilliam io = open(line, 0); 7941068Swilliam if (io >= 0) { 80*48812Swilliam copyunix(io, howto); 81*48812Swilliam goto again; 82*48812Swilliam } else if (++retry > 2) 83*48812Swilliam goto again; 8441068Swilliam } 8541068Swilliam } 8641068Swilliam 8741068Swilliam /*ARGSUSED*/ 88*48812Swilliam copyunix(io, howto) 8941068Swilliam register io; 9041068Swilliam { 9141068Swilliam struct exec x; 9241068Swilliam int i; 93*48812Swilliam char *addr,c; 9441068Swilliam 9541068Swilliam i = read(io, (char *)&x, sizeof x); 9641068Swilliam if (i != sizeof x || 97*48812Swilliam (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { 98*48812Swilliam printf("Bad format\n"); 99*48812Swilliam return; 100*48812Swilliam } 101*48812Swilliam 10241068Swilliam printf("%d", x.a_text); 10341068Swilliam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 10441068Swilliam goto shread; 10541068Swilliam if (read(io, (char *)0, x.a_text) != x.a_text) 10641068Swilliam goto shread; 107*48812Swilliam 10841068Swilliam addr = (char *)x.a_text; 10941068Swilliam if (x.a_magic == 0413 || x.a_magic == 0410) 11041068Swilliam while ((int)addr & CLOFSET) 11141068Swilliam *addr++ = 0; 11241068Swilliam printf("+%d", x.a_data); 11341068Swilliam if (read(io, addr, x.a_data) != x.a_data) 11441068Swilliam goto shread; 115*48812Swilliam 11641068Swilliam addr += x.a_data; 11741068Swilliam printf("+%d", x.a_bss); 11841068Swilliam x.a_bss += 128*512; /* slop */ 11941068Swilliam for (i = 0; i < x.a_bss; i++) 12041068Swilliam *addr++ = 0; 121*48812Swilliam 122*48812Swilliam /* mask high order bits corresponding to relocated system base */ 123*48812Swilliam x.a_entry &= 0xfff00000; 12441068Swilliam printf(" start 0x%x\n", x.a_entry); 125*48812Swilliam 126*48812Swilliam if(c=scankbd()) 127*48812Swilliam _longjmp(&exception,1); 128*48812Swilliam 129*48812Swilliam i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset); 130*48812Swilliam 13141068Swilliam if (i) printf("exit %d\n", i) ; 13241068Swilliam return; 13341068Swilliam shread: 134*48812Swilliam printf("Short read\n"); 135*48812Swilliam return; 13641068Swilliam } 137