SCCS-vsn: sys/i386/stand/boot.c 7.2
* This code is derived from software contributed to Berkeley by
* William Jolitz.
*
* This code is derived from software contributed to Berkeley by
* William Jolitz.
*
- * %sccs.include.noredist.c%
+ * %sccs.include.redist.c%
#endif /* not lint */
#ifndef lint
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)boot.c 7.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)boot.c 7.2 (Berkeley) %G%";
-#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"
- * 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.
*/
* whether boot stops to ask for system name and which device
* boot comes from.
*/
#define UNIX "/vmunix"
char line[100] = UNIX;
#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;
-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) {
for (;;) {
if (howto & RB_ASKNAME) {
printf("Boot: ");
gets(line);
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);
} else
printf("Boot: %s\n", line);
if (line[0] == 0) {
strcpy(line, UNIX);
printf("Boot: %s\n", line);
}
io = open(line, 0);
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);
- }*/
- 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;
register io;
{
struct exec x;
int i;
register io;
{
struct exec x;
int i;
i = read(io, (char *)&x, sizeof x);
if (i != sizeof x ||
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;
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)
addr = (char *)x.a_text;
if (x.a_magic == 0413 || x.a_magic == 0410)
while ((int)addr & CLOFSET)
printf("+%d", x.a_data);
if (read(io, addr, x.a_data) != x.a_data)
goto shread;
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;
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);
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:
if (i) printf("exit %d\n", i) ;
return;
shread:
+ printf("Short read\n");
+ return;