|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)boot.c 7.1 (Berkeley) 6/5/86 ! 7: */ ! 8: ! 9: #include "../h/param.h" ! 10: #include "../h/inode.h" ! 11: #include "../h/fs.h" ! 12: #include "../h/vm.h" ! 13: #include <a.out.h> ! 14: #include "saio.h" ! 15: #include "../h/reboot.h" ! 16: ! 17: /* ! 18: * Boot program... arguments passed in r10 and r11 determine ! 19: * whether boot stops to ask for system name and which device ! 20: * boot comes from. ! 21: */ ! 22: ! 23: /* Types in r10 specifying major device */ ! 24: char devname[][2] = { ! 25: 'h','p', /* 0 = hp */ ! 26: 0,0, /* 1 = ht */ ! 27: 'u','p', /* 2 = up */ ! 28: 'h','k', /* 3 = hk */ ! 29: 0,0, /* 4 = sw */ ! 30: 0,0, /* 5 = tm */ ! 31: 0,0, /* 6 = ts */ ! 32: 0,0, /* 7 = mt */ ! 33: 0,0, /* 8 = tu */ ! 34: 'r','a', /* 9 = ra */ ! 35: 'u','t', /* 10 = ut */ ! 36: 'r','b', /* 11 = rb */ ! 37: 0,0, /* 12 = uu */ ! 38: 0,0, /* 13 = rx */ ! 39: 'r','l', /* 14 = rl */ ! 40: }; ! 41: #define MAXTYPE (sizeof(devname) / sizeof(devname[0])) ! 42: ! 43: #define UNIX "vmunix" ! 44: char line[100]; ! 45: ! 46: int retry = 0; ! 47: ! 48: main() ! 49: { ! 50: register unsigned howto, devtype; /* howto=r11, devtype=r10 */ ! 51: int io, i; ! 52: register type, part, unit; ! 53: register char *cp; ! 54: long atol(); ! 55: ! 56: #ifdef lint ! 57: howto = 0; devtype = 0; ! 58: #endif ! 59: printf("\nBoot\n"); ! 60: #ifdef JUSTASK ! 61: howto = RB_ASKNAME|RB_SINGLE; ! 62: #else ! 63: type = (devtype >> B_TYPESHIFT) & B_TYPEMASK; ! 64: unit = (devtype >> B_UNITSHIFT) & B_UNITMASK; ! 65: unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK); ! 66: part = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK; ! 67: if ((howto & RB_ASKNAME) == 0) { ! 68: if (type >= 0 && type <= MAXTYPE && devname[type][0]) { ! 69: cp = line; ! 70: *cp++ = devname[type][0]; ! 71: *cp++ = devname[type][1]; ! 72: *cp++ = '('; ! 73: if (unit >= 10) ! 74: *cp++ = unit / 10 + '0'; ! 75: *cp++ = unit % 10 + '0'; ! 76: *cp++ = ','; ! 77: *cp++ = part + '0'; ! 78: *cp++ = ')'; ! 79: strcpy(cp, UNIX); ! 80: } else ! 81: howto = RB_SINGLE|RB_ASKNAME; ! 82: } ! 83: #endif ! 84: for (;;) { ! 85: if (howto & RB_ASKNAME) { ! 86: printf(": "); ! 87: gets(line); ! 88: } else ! 89: printf(": %s\n", line); ! 90: io = open(line, 0); ! 91: if (io >= 0) { ! 92: if (howto & RB_ASKNAME) { ! 93: /* ! 94: * Build up devtype register to pass on to ! 95: * booted program. ! 96: */ ! 97: cp = line; ! 98: for (i = 0; i <= MAXTYPE; i++) ! 99: if ((devname[i][0] == cp[0]) && ! 100: (devname[i][1] == cp[1])) ! 101: break; ! 102: if (i <= MAXTYPE) { ! 103: devtype = i << B_TYPESHIFT; ! 104: cp += 3; ! 105: i = *cp++ - '0'; ! 106: if (*cp >= '0' && *cp <= '9') ! 107: i = i * 10 + *cp++ - '0'; ! 108: cp++; ! 109: devtype |= ((i % 8) << B_UNITSHIFT); ! 110: devtype |= ((i / 8) << B_ADAPTORSHIFT); ! 111: devtype |= atol(cp) << B_PARTITIONSHIFT; ! 112: } ! 113: } ! 114: devtype |= B_DEVMAGIC; ! 115: loadpcs(); ! 116: copyunix(howto, devtype, io); ! 117: close(io); ! 118: howto = RB_SINGLE|RB_ASKNAME; ! 119: } ! 120: if (++retry > 2) ! 121: howto = RB_SINGLE|RB_ASKNAME; ! 122: } ! 123: } ! 124: ! 125: /*ARGSUSED*/ ! 126: copyunix(howto, devtype, io) ! 127: register howto, devtype, io; /* howto=r11, devtype=r10 */ ! 128: { ! 129: struct exec x; ! 130: register int i; ! 131: char *addr; ! 132: ! 133: i = read(io, (char *)&x, sizeof x); ! 134: if (i != sizeof x || ! 135: (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) ! 136: _stop("Bad format\n"); ! 137: printf("%d", x.a_text); ! 138: if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1) ! 139: goto shread; ! 140: if (read(io, (char *)0, x.a_text) != x.a_text) ! 141: goto shread; ! 142: addr = (char *)x.a_text; ! 143: if (x.a_magic == 0413 || x.a_magic == 0410) ! 144: while ((int)addr & CLOFSET) ! 145: *addr++ = 0; ! 146: printf("+%d", x.a_data); ! 147: if (read(io, addr, x.a_data) != x.a_data) ! 148: goto shread; ! 149: addr += x.a_data; ! 150: printf("+%d", x.a_bss); ! 151: x.a_bss += 128*512; /* slop */ ! 152: for (i = 0; i < x.a_bss; i++) ! 153: *addr++ = 0; ! 154: x.a_entry &= 0x7fffffff; ! 155: printf(" start 0x%x\n", x.a_entry); ! 156: (*((int (*)()) x.a_entry))(); ! 157: return; ! 158: shread: ! 159: _stop("Short read\n"); ! 160: } ! 161: ! 162: /* 750 Patchable Control Store magic */ ! 163: ! 164: #include "../vax/mtpr.h" ! 165: #include "../vax/cpu.h" ! 166: #define PCS_BITCNT 0x2000 /* number of patchbits */ ! 167: #define PCS_MICRONUM 0x400 /* number of ucode locs */ ! 168: #define PCS_PATCHADDR 0xf00000 /* start addr of patchbits */ ! 169: #define PCS_PCSADDR (PCS_PATCHADDR+0x8000) /* start addr of pcs */ ! 170: #define PCS_PATCHBIT (PCS_PATCHADDR+0xc000) /* patchbits enable reg */ ! 171: #define PCS_ENABLE 0xfff00000 /* enable bits for pcs */ ! 172: ! 173: loadpcs() ! 174: { ! 175: register int *ip; /* known to be r11 below */ ! 176: register int i; /* known to be r10 below */ ! 177: register int *jp; /* known to be r9 below */ ! 178: register int j; ! 179: static int pcsdone = 0; ! 180: union cpusid sid; ! 181: char pcs[100]; ! 182: char *closeparen; ! 183: char *index(); ! 184: ! 185: sid.cpusid = mfpr(SID); ! 186: if (sid.cpuany.cp_type!=VAX_750 || sid.cpu750.cp_urev<95 || pcsdone) ! 187: return; ! 188: printf("Updating 11/750 microcode: "); ! 189: strncpy(pcs, line, 99); ! 190: pcs[99] = 0; ! 191: closeparen = index(pcs, ')'); ! 192: if (closeparen) ! 193: *(++closeparen) = 0; ! 194: else ! 195: return; ! 196: strcat(pcs, "pcs750.bin"); ! 197: i = open(pcs, 0); ! 198: if (i < 0) ! 199: return; ! 200: /* ! 201: * We ask for more than we need to be sure we get only what we expect. ! 202: * After read: ! 203: * locs 0 - 1023 packed patchbits ! 204: * 1024 - 11264 packed microcode ! 205: */ ! 206: if (read(i, (char *)0, 23*512) != 22*512) { ! 207: printf("Error reading %s\n", pcs); ! 208: close(i); ! 209: return; ! 210: } ! 211: close(i); ! 212: ! 213: /* ! 214: * Enable patchbit loading and load the bits one at a time. ! 215: */ ! 216: *((int *)PCS_PATCHBIT) = 1; ! 217: ip = (int *)PCS_PATCHADDR; ! 218: jp = (int *)0; ! 219: for (i=0; i < PCS_BITCNT; i++) { ! 220: asm(" extzv r10,$1,(r9),(r11)+"); ! 221: } ! 222: *((int *)PCS_PATCHBIT) = 0; ! 223: ! 224: /* ! 225: * Load PCS microcode 20 bits at a time. ! 226: */ ! 227: ip = (int *)PCS_PCSADDR; ! 228: jp = (int *)1024; ! 229: for (i=j=0; j < PCS_MICRONUM * 4; i+=20, j++) { ! 230: asm(" extzv r10,$20,(r9),(r11)+"); ! 231: } ! 232: ! 233: /* ! 234: * Enable PCS. ! 235: */ ! 236: i = *jp; /* get 1st 20 bits of microcode again */ ! 237: i &= 0xfffff; ! 238: i |= PCS_ENABLE; /* reload these bits with PCS enable set */ ! 239: *((int *)PCS_PCSADDR) = i; ! 240: ! 241: sid.cpusid = mfpr(SID); ! 242: printf("new rev level=%d\n", sid.cpu750.cp_urev); ! 243: pcsdone = 1; ! 244: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.