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*56514Sbostic static char sccsid[] = "@(#)boot.c 7.5 (Berkeley) 10/11/92"; 1941068Swilliam #endif /* not lint */ 2041068Swilliam 21*56514Sbostic #include <sys/param.h> 22*56514Sbostic #include <sys/reboot.h> 23*56514Sbostic 2441068Swilliam #include <a.out.h> 2548812Swilliam #include <setjmp.h> 26*56514Sbostic #include <stand/saio.h> 2741068Swilliam 2841068Swilliam /* 2948812Swilliam * Boot program... arguments from lower-level bootstrap determine 3041068Swilliam * whether boot stops to ask for system name and which device 3141068Swilliam * boot comes from. 3241068Swilliam */ 3341068Swilliam 3441068Swilliam char line[100] = UNIX; 3548812Swilliam extern int opendev, bootdev, cyloffset; 3641068Swilliam int retry = 0; 3749085Sbostic extern jmp_buf exception; 3841068Swilliam 3948812Swilliam main(howto, dev, off) 4041068Swilliam { 4141068Swilliam int io; 4241068Swilliam 4348812Swilliam if((dev&B_MAGICMASK) == B_DEVMAGIC) { 4448812Swilliam bootdev = dev; 4548812Swilliam cyloffset = off; 4648812Swilliam } else goto again; 4748812Swilliam 4848812Swilliam if(_setjmp(exception)) { 4948812Swilliam close(io); 5048812Swilliam printf("- load aborted\n"); 5148812Swilliam again: 5248812Swilliam howto = RB_SINGLE|RB_ASKNAME; 5348812Swilliam cyloffset = 0; 5448812Swilliam } 5548812Swilliam 5641068Swilliam for (;;) { 5741068Swilliam if (howto & RB_ASKNAME) { 5848812Swilliam char *cp; 5948812Swilliam 6041068Swilliam printf("Boot: "); 6141068Swilliam gets(line); 6248812Swilliam 6348812Swilliam /* process additional flags if any */ 6448812Swilliam if(cp = (char *)index(line, ' ')) { 6548812Swilliam howto = strtol (cp, 0, 0); 6648812Swilliam *cp = '\0'; 6748812Swilliam } 6848812Swilliam cyloffset = 0; 6941068Swilliam } else 7041068Swilliam printf("Boot: %s\n", line); 7148812Swilliam 7241068Swilliam if (line[0] == 0) { 7341068Swilliam strcpy(line, UNIX); 7441068Swilliam printf("Boot: %s\n", line); 7541068Swilliam } 7641068Swilliam 7741068Swilliam io = open(line, 0); 7841068Swilliam if (io >= 0) { 7948812Swilliam copyunix(io, howto); 8048812Swilliam goto again; 8148812Swilliam } else if (++retry > 2) 8248812Swilliam goto again; 8341068Swilliam } 8441068Swilliam } 8541068Swilliam 8641068Swilliam /*ARGSUSED*/ 8748812Swilliam copyunix(io, howto) 8841068Swilliam register io; 8941068Swilliam { 9041068Swilliam struct exec x; 9141068Swilliam int i; 9248812Swilliam char *addr,c; 9341068Swilliam 9441068Swilliam i = read(io, (char *)&x, sizeof x); 9541068Swilliam if (i != sizeof x || 9648812Swilliam (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) { 9748812Swilliam printf("Bad format\n"); 9848812Swilliam return; 9948812Swilliam } 10048812Swilliam 10141068Swilliam printf("%d", x.a_text); 10241068Swilliam if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 10341068Swilliam goto shread; 10441068Swilliam if (read(io, (char *)0, x.a_text) != x.a_text) 10541068Swilliam goto shread; 10648812Swilliam 10741068Swilliam addr = (char *)x.a_text; 10841068Swilliam if (x.a_magic == 0413 || x.a_magic == 0410) 10941068Swilliam while ((int)addr & CLOFSET) 11041068Swilliam *addr++ = 0; 11141068Swilliam printf("+%d", x.a_data); 11241068Swilliam if (read(io, addr, x.a_data) != x.a_data) 11341068Swilliam goto shread; 11448812Swilliam 11541068Swilliam addr += x.a_data; 11641068Swilliam printf("+%d", x.a_bss); 11741068Swilliam x.a_bss += 128*512; /* slop */ 11841068Swilliam for (i = 0; i < x.a_bss; i++) 11941068Swilliam *addr++ = 0; 12048812Swilliam 12148812Swilliam /* mask high order bits corresponding to relocated system base */ 12252350Sbostic x.a_entry &= 0x000fffff; 12341068Swilliam printf(" start 0x%x\n", x.a_entry); 12448812Swilliam 12548812Swilliam if(c=scankbd()) 12648812Swilliam _longjmp(&exception,1); 12748812Swilliam 12848812Swilliam i = (*((int (*)()) x.a_entry))(howto, opendev, 0, cyloffset); 12948812Swilliam 13041068Swilliam if (i) printf("exit %d\n", i) ; 13141068Swilliam return; 13241068Swilliam shread: 13348812Swilliam printf("Short read\n"); 13448812Swilliam return; 13541068Swilliam } 136