141068Swilliam /*-
2*63368Sbostic * Copyright (c) 1990, 1993
3*63368Sbostic * The Regents of the University of California. 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
12*63368Sbostic static char copyright[] =
13*63368Sbostic "@(#) Copyright (c) 1990, 1993\n\
14*63368Sbostic The Regents of the University of California. All rights reserved.\n";
1541068Swilliam #endif /* not lint */
1641068Swilliam
1741068Swilliam #ifndef lint
18*63368Sbostic static char sccsid[] = "@(#)boot.c 8.1 (Berkeley) 06/11/93";
1941068Swilliam #endif /* not lint */
2041068Swilliam
2156514Sbostic #include <sys/param.h>
2256514Sbostic #include <sys/reboot.h>
2356514Sbostic
2441068Swilliam #include <a.out.h>
2548812Swilliam #include <setjmp.h>
2656514Sbostic #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
main(howto,dev,off)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*/
copyunix(io,howto)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