1*57081Sakito /* 2*57081Sakito * Copyright (c) 1992 OMRON Corporation. 3*57081Sakito * Copyright (c) 1992 The Regents of the University of California. 4*57081Sakito * All rights reserved. 5*57081Sakito * 6*57081Sakito * This code is derived from software contributed to Berkeley by 7*57081Sakito * OMRON Corporation. 8*57081Sakito * 9*57081Sakito * %sccs.include.redist.c% 10*57081Sakito * 11*57081Sakito * @(#)boot.c 7.1 (Berkeley) 12/13/92 12*57081Sakito */ 13*57081Sakito 14*57081Sakito /* 15*57081Sakito * boot.c -- boot program 16*57081Sakito * by A.Fujita, MAR-01-1992 17*57081Sakito */ 18*57081Sakito 19*57081Sakito #include <sys/param.h> 20*57081Sakito #include <sys/reboot.h> 21*57081Sakito #include <sys/exec.h> 22*57081Sakito #include <machine/stinger.h> 23*57081Sakito #include <luna68k/stand/saio.h> 24*57081Sakito #include <luna68k/stand/status.h> 25*57081Sakito 26*57081Sakito extern struct KernInter *kiff; 27*57081Sakito 28*57081Sakito int howto; 29*57081Sakito int devtype = MAKEBOOTDEV(4, 0, 0, 6, 0); 30*57081Sakito 31*57081Sakito char *copyunix(); 32*57081Sakito 33*57081Sakito struct exec header; 34*57081Sakito char default_file[] = "sd(0,0)vmunix"; 35*57081Sakito 36*57081Sakito char *how_to_info[] = { 37*57081Sakito "RB_ASKNAME ask for file name to reboot from", 38*57081Sakito "RB_SINGLE reboot to single user only", 39*57081Sakito "RB_NOSYNC dont sync before reboot", 40*57081Sakito "RB_HALT don't reboot, just halt", 41*57081Sakito "RB_INITNAME name given for /etc/init (unused)", 42*57081Sakito "RB_DFLTROOT use compiled-in rootdev", 43*57081Sakito "RB_KDB give control to kernel debugger", 44*57081Sakito "RB_RDONLY mount root fs read-only" 45*57081Sakito }; 46*57081Sakito 47*57081Sakito int 48*57081Sakito how_to_boot(argc, argv) 49*57081Sakito int argc; 50*57081Sakito char *argv[]; 51*57081Sakito { 52*57081Sakito int i, h = howto; 53*57081Sakito 54*57081Sakito if (argc < 2) { 55*57081Sakito printf("howto: 0x%s\n\n", hexstr(howto, 2)); 56*57081Sakito 57*57081Sakito if (h == 0) { 58*57081Sakito printf("\t%s\n", "RB_AUTOBOOT flags for system auto-booting itself"); 59*57081Sakito } else { 60*57081Sakito for (i = 0; i < 8; i++, h >>= 1) { 61*57081Sakito if (h & 0x01) { 62*57081Sakito printf("\t%s\n", how_to_info[i]); 63*57081Sakito } 64*57081Sakito } 65*57081Sakito } 66*57081Sakito 67*57081Sakito printf("\n"); 68*57081Sakito } 69*57081Sakito } 70*57081Sakito 71*57081Sakito int 72*57081Sakito boot(argc, argv) 73*57081Sakito int argc; 74*57081Sakito char *argv[]; 75*57081Sakito { 76*57081Sakito register int io; 77*57081Sakito char *line; 78*57081Sakito 79*57081Sakito if (argc < 2) 80*57081Sakito line = default_file; 81*57081Sakito else 82*57081Sakito line = argv[1]; 83*57081Sakito 84*57081Sakito printf("Booting %s\n", line); 85*57081Sakito 86*57081Sakito io = open(line, 0); 87*57081Sakito if (io >= 0) { 88*57081Sakito bootunix(howto, devtype, io); 89*57081Sakito close(io); 90*57081Sakito } 91*57081Sakito } 92*57081Sakito 93*57081Sakito int 94*57081Sakito load(argc, argv) 95*57081Sakito int argc; 96*57081Sakito char *argv[]; 97*57081Sakito { 98*57081Sakito register int io; 99*57081Sakito char *line; 100*57081Sakito 101*57081Sakito if (argc < 2) 102*57081Sakito line = default_file; 103*57081Sakito else 104*57081Sakito line = argv[1]; 105*57081Sakito 106*57081Sakito printf("loading %s\n", line); 107*57081Sakito 108*57081Sakito io = open(line, 0); 109*57081Sakito if (io >= 0) { 110*57081Sakito copyunix(io); 111*57081Sakito printf("\n"); 112*57081Sakito close(io); 113*57081Sakito } 114*57081Sakito } 115*57081Sakito 116*57081Sakito int 117*57081Sakito bootunix(howto, devtype, io) 118*57081Sakito register howto; /* d7 contains boot flags */ 119*57081Sakito register devtype; /* d6 contains boot device */ 120*57081Sakito register io; 121*57081Sakito { 122*57081Sakito register char *load; /* a5 contains load addr for unix */ 123*57081Sakito 124*57081Sakito load = copyunix(io); 125*57081Sakito 126*57081Sakito printf(" start 0x%x\n", load); 127*57081Sakito asm(" movl %0,d7" : : "d" (howto)); 128*57081Sakito asm(" movl %0,d6" : : "d" (devtype)); 129*57081Sakito asm(" movl %0,a5" : : "a" (kiff)); 130*57081Sakito (*((int (*)()) load))(); 131*57081Sakito } 132*57081Sakito 133*57081Sakito char * 134*57081Sakito copyunix(io) 135*57081Sakito register io; 136*57081Sakito { 137*57081Sakito 138*57081Sakito register int i; 139*57081Sakito register char *load; /* a5 contains load addr for unix */ 140*57081Sakito register char *addr; 141*57081Sakito 142*57081Sakito /* 143*57081Sakito * Read a.out file header 144*57081Sakito */ 145*57081Sakito 146*57081Sakito i = read(io, (char *)&header, sizeof(struct exec)); 147*57081Sakito if (i != sizeof(struct exec) || 148*57081Sakito (header.a_magic != 0407 && header.a_magic != 0413 && header.a_magic != 0410)) { 149*57081Sakito printf("illegal magic number ... 0x%x\n"); 150*57081Sakito printf("Bad format\n"); 151*57081Sakito return(0); 152*57081Sakito } 153*57081Sakito 154*57081Sakito load = addr = (char *) (header.a_entry & 0x00FFFFFF); 155*57081Sakito 156*57081Sakito printf("%d", header.a_text); 157*57081Sakito if (header.a_magic == 0413 && lseek(io, 0x400, 0) == -1) 158*57081Sakito goto shread; 159*57081Sakito 160*57081Sakito /* 161*57081Sakito * Load TEXT Segment 162*57081Sakito */ 163*57081Sakito 164*57081Sakito if (read(io, (char *)addr, header.a_text) != header.a_text) 165*57081Sakito goto shread; 166*57081Sakito addr += header.a_text; 167*57081Sakito if (header.a_magic == 0413 || header.a_magic == 0410) 168*57081Sakito while ((int)addr & CLOFSET) 169*57081Sakito *addr++ = 0; 170*57081Sakito 171*57081Sakito /* 172*57081Sakito * Load DATA Segment 173*57081Sakito */ 174*57081Sakito 175*57081Sakito printf("+%d", header.a_data); 176*57081Sakito if (read(io, addr, header.a_data) != header.a_data) 177*57081Sakito goto shread; 178*57081Sakito 179*57081Sakito /* 180*57081Sakito * Clear BSS Segment 181*57081Sakito */ 182*57081Sakito 183*57081Sakito addr += header.a_data; 184*57081Sakito printf("+%d", header.a_bss); 185*57081Sakito header.a_bss += 128*512; /* slop */ 186*57081Sakito for (i = 0; i < header.a_bss; i++) 187*57081Sakito *addr++ = 0; 188*57081Sakito 189*57081Sakito return(load); 190*57081Sakito 191*57081Sakito shread: 192*57081Sakito printf(" Short read\n"); 193*57081Sakito return(0); 194*57081Sakito } 195*57081Sakito 196