1*315Sbill /* boot.c 1.1 06/28/80 */ 2*315Sbill 3*315Sbill #include "../h/param.h" 4*315Sbill #include "../h/ino.h" 5*315Sbill #include "../h/inode.h" 6*315Sbill #include "../h/filsys.h" 7*315Sbill #include "../h/dir.h" 8*315Sbill #include "../h/vm.h" 9*315Sbill #include <a.out.h> 10*315Sbill #include "saio.h" 11*315Sbill 12*315Sbill char line[100]; 13*315Sbill 14*315Sbill main() 15*315Sbill { 16*315Sbill int i; 17*315Sbill 18*315Sbill printf("\nBoot\n"); 19*315Sbill do { 20*315Sbill printf(": "); gets(line); 21*315Sbill i = open(line,0); 22*315Sbill } while (i < 0); 23*315Sbill 24*315Sbill copyunix(i); 25*315Sbill } 26*315Sbill 27*315Sbill copyunix(io) 28*315Sbill register io; 29*315Sbill { 30*315Sbill struct exec x; 31*315Sbill register int i; 32*315Sbill char *addr; 33*315Sbill 34*315Sbill i = read(io, (char *)&x, sizeof x); 35*315Sbill if (i != sizeof x || x.a_magic != 0410) 36*315Sbill _stop("Bad format\n"); 37*315Sbill printf("%d", x.a_text); 38*315Sbill if (read(io, (char *)0, x.a_text) != x.a_text) 39*315Sbill goto shread; 40*315Sbill addr = (char *)x.a_text; 41*315Sbill while ((int)addr & CLOFSET) 42*315Sbill *addr++ = 0; 43*315Sbill printf("+%d", x.a_data); 44*315Sbill if (read(io, addr, x.a_data) != x.a_data) 45*315Sbill goto shread; 46*315Sbill addr += x.a_data; 47*315Sbill printf("+%d", x.a_bss); 48*315Sbill x.a_bss += 128*512; /* slop */ 49*315Sbill for (i = 0; i < x.a_bss; i++) 50*315Sbill *addr++ = 0; 51*315Sbill x.a_entry &= 0x7fffffff; 52*315Sbill printf(" start 0x%x\n", x.a_entry); 53*315Sbill (*((int (*)()) x.a_entry))(); 54*315Sbill _exit(); 55*315Sbill shread: 56*315Sbill _stop("Short read\n"); 57*315Sbill } 58