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 * 848812Swilliam * %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*49085Sbostic static char sccsid[] = "@(#)boot.c 7.3 (Berkeley) 05/04/91"; 1941068Swilliam #endif /* not lint */ 2041068Swilliam 2148812Swilliam #include "param.h" 2248812Swilliam #include "reboot.h" 2341068Swilliam #include <a.out.h> 2448812Swilliam #include <setjmp.h> 2541068Swilliam #include "saio.h" 2641068Swilliam 2741068Swilliam /* 2848812Swilliam * 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 char line[100] = UNIX; 3448812Swilliam extern int opendev, bootdev, cyloffset; 3541068Swilliam int retry = 0; 36*49085Sbostic extern jmp_buf exception; 3741068Swilliam 3848812Swilliam main(howto, dev, off) 3941068Swilliam { 4041068Swilliam int io; 4141068Swilliam 4248812Swilliam if((dev&B_MAGICMASK) == B_DEVMAGIC) { 4348812Swilliam bootdev = dev; 4448812Swilliam cyloffset = off; 4548812Swilliam } else goto again; 4648812Swilliam 4748812Swilliam if(_setjmp(exception)) { 4848812Swilliam close(io); 4948812Swilliam printf("- load aborted\n"); 5048812Swilliam again: 5148812Swilliam howto = RB_SINGLE|RB_ASKNAME; 5248812Swilliam cyloffset = 0; 5348812Swilliam } 5448812Swilliam 5541068Swilliam for (;;) { 5641068Swilliam if (howto & RB_ASKNAME) { 5748812Swilliam char *cp; 5848812Swilliam 5941068Swilliam printf("Boot: "); 6041068Swilliam gets(line); 6148812Swilliam 6248812Swilliam /* process additional flags if any */ 6348812Swilliam if(cp = (char *)index(line, ' ')) { 6448812Swilliam howto = strtol (cp, 0, 0); 6548812Swilliam *cp = '\0'; 6648812Swilliam } 6748812Swilliam cyloffset = 0; 6841068Swilliam } else 6941068Swilliam printf("Boot: %s\n", line); 7048812Swilliam 7141068Swilliam if (line[0] == 0) { 7241068Swilliam strcpy(line, UNIX); 7341068Swilliam printf("Boot: %s\n", line); 7441068Swilliam } 7541068Swilliam 7641068Swilliam io = open(line, 0); 7741068Swilliam if (io >= 0) { 7848812Swilliam copyunix(io, howto); 7948812Swilliam goto again; 8048812Swilliam } else if (++retry > 2) 8148812Swilliam goto again; 8241068Swilliam } 8341068Swilliam } 8441068Swilliam 8541068Swilliam /*ARGSUSED*/ 8648812Swilliam copyunix(io, howto) 8741068Swilliam register io; 8841068Swilliam { 8941068Swilliam struct exec x; 9041068Swilliam int i; 9148812Swilliam char *addr,c; 9241068Swilliam 9341068Swilliam i = read(io, (char *)&x, sizeof x); 9441068Swilliam if (i != sizeof x || 9548812Swilliam (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { 9648812Swilliam printf("Bad format\n"); 9748812Swilliam return; 9848812Swilliam } 9948812Swilliam 10041068Swilliam printf("%d", x.a_text); 10141068Swilliam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 10241068Swilliam goto shread; 10341068Swilliam if (read(io, (char *)0, x.a_text) != x.a_text) 10441068Swilliam goto shread; 10548812Swilliam 10641068Swilliam addr = (char *)x.a_text; 10741068Swilliam if (x.a_magic == 0413 || x.a_magic == 0410) 10841068Swilliam while ((int)addr & CLOFSET) 10941068Swilliam *addr++ = 0; 11041068Swilliam printf("+%d", x.a_data); 11141068Swilliam if (read(io, addr, x.a_data) != x.a_data) 11241068Swilliam goto shread; 11348812Swilliam 11441068Swilliam addr += x.a_data; 11541068Swilliam printf("+%d", x.a_bss); 11641068Swilliam x.a_bss += 128*512; /* slop */ 11741068Swilliam for (i = 0; i < x.a_bss; i++) 11841068Swilliam *addr++ = 0; 11948812Swilliam 12048812Swilliam /* mask high order bits corresponding to relocated system base */ 12148812Swilliam x.a_entry &= 0xfff00000; 12241068Swilliam printf(" start 0x%x\n", x.a_entry); 12348812Swilliam 12448812Swilliam if(c=scankbd()) 12548812Swilliam _longjmp(&exception,1); 12648812Swilliam 12748812Swilliam i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset); 12848812Swilliam 12941068Swilliam if (i) printf("exit %d\n", i) ; 13041068Swilliam return; 13141068Swilliam shread: 13248812Swilliam printf("Short read\n"); 13348812Swilliam return; 13441068Swilliam } 135