rm bootxx conversion (now all same), use CFLAGS
[unix-history] / usr / src / sys / vax / stand / boot.c
CommitLineData
8ae0e4b4 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
8ae0e4b4
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
97b95718 6 * @(#)boot.c 7.4 (Berkeley) %G%
8ae0e4b4 7 */
b7e60356 8
1cf5763d
MK
9#include "param.h"
10#include "inode.h"
11#include "fs.h"
12#include "vm.h"
b7e60356
BJ
13#include <a.out.h>
14#include "saio.h"
1cf5763d 15#include "reboot.h"
b7e60356 16
8da76047
BJ
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
80c81fbf 23#define UNIX "/vmunix"
018dc60b 24char line[100];
b7e60356 25
a889f9b7 26int retry = 0;
80c81fbf 27extern unsigned opendev;
a889f9b7 28
b7e60356
BJ
29main()
30{
24a62d66 31 register unsigned howto, devtype; /* howto=r11, devtype=r10 */
80c81fbf 32 int io, type;
b7e60356 33
610c6f01
BJ
34#ifdef lint
35 howto = 0; devtype = 0;
36#endif
018dc60b 37 printf("\nBoot\n");
0bd37f37 38#ifdef JUSTASK
aaa709c3 39 howto = RB_ASKNAME|RB_SINGLE;
0bd37f37 40#else
24a62d66 41 if ((howto & RB_ASKNAME) == 0) {
80c81fbf
MK
42 type = (devtype >> B_TYPESHIFT) & B_TYPEMASK;
43 if ((unsigned)type < ndevs && devsw[type].dv_name[0])
44 strcpy(line, UNIX);
45 else
1cf5763d 46 howto |= RB_SINGLE|RB_ASKNAME;
8da76047 47 }
0bd37f37 48#endif
8da76047
BJ
49 for (;;) {
50 if (howto & RB_ASKNAME) {
51 printf(": ");
52 gets(line);
80c81fbf
MK
53 if (line[0] == 0) {
54 strcpy(line, UNIX);
55 printf(": %s\n", line);
56 }
8da76047
BJ
57 } else
58 printf(": %s\n", line);
59 io = open(line, 0);
e559a17c 60 if (io >= 0) {
1c915156 61 loadpcs();
80c81fbf 62 copyunix(howto, opendev, io);
f834e141 63 close(io);
1cf5763d 64 howto |= RB_SINGLE|RB_ASKNAME;
e559a17c 65 }
8da76047 66 if (++retry > 2)
1cf5763d 67 howto |= RB_SINGLE|RB_ASKNAME;
8da76047 68 }
b7e60356
BJ
69}
70
a889f9b7 71/*ARGSUSED*/
97b95718
MK
72copyunix(howto, devtype, aio)
73 register howto, devtype; /* howto=r11, devtype=r10 */
74 int aio;
b7e60356 75{
97b95718 76 register int esym; /* must be r9 */
b7e60356 77 struct exec x;
97b95718 78 register int io = aio, i;
b7e60356
BJ
79 char *addr;
80
81 i = read(io, (char *)&x, sizeof x);
06254255 82 if (i != sizeof x ||
1cf5763d
MK
83 (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410)) {
84 printf("Bad format\n");
85 return;
86 }
b7e60356 87 printf("%d", x.a_text);
b5d17f4d 88 if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
06254255 89 goto shread;
b7e60356
BJ
90 if (read(io, (char *)0, x.a_text) != x.a_text)
91 goto shread;
92 addr = (char *)x.a_text;
06254255
KM
93 if (x.a_magic == 0413 || x.a_magic == 0410)
94 while ((int)addr & CLOFSET)
95 *addr++ = 0;
b7e60356
BJ
96 printf("+%d", x.a_data);
97 if (read(io, addr, x.a_data) != x.a_data)
98 goto shread;
99 addr += x.a_data;
100 printf("+%d", x.a_bss);
b7e60356
BJ
101 for (i = 0; i < x.a_bss; i++)
102 *addr++ = 0;
1cf5763d
MK
103 if (howto & RB_KDB && x.a_syms) {
104 *(int *)addr = x.a_syms; /* symbol table size */
105 addr += sizeof (int);
106 printf("[+%d", x.a_syms);
107 if (read(io, addr, x.a_syms) != x.a_syms)
108 goto shread;
109 addr += x.a_syms;
110 if (read(io, addr, sizeof (int)) != sizeof (int))
111 goto shread;
112 i = *(int *)addr - sizeof (int); /* string table size */
113 addr += sizeof (int);
114 printf("+%d]", i);
115 if (read(io, addr, i) != i)
116 goto shread;
117 addr += i;
118 esym = roundup((int)addr, sizeof (int));
119 x.a_bss = 0;
120 } else
121 howto &= ~RB_KDB;
122 for (i = 0; i < 128*512; i++) /* slop */
123 *addr++ = 0;
b7e60356
BJ
124 x.a_entry &= 0x7fffffff;
125 printf(" start 0x%x\n", x.a_entry);
126 (*((int (*)()) x.a_entry))();
f834e141 127 return;
b7e60356 128shread:
1cf5763d
MK
129 printf("Short read\n");
130 return;
b7e60356 131}
e559a17c
TF
132
133/* 750 Patchable Control Store magic */
134
135#include "../vax/mtpr.h"
136#include "../vax/cpu.h"
137#define PCS_BITCNT 0x2000 /* number of patchbits */
138#define PCS_MICRONUM 0x400 /* number of ucode locs */
139#define PCS_PATCHADDR 0xf00000 /* start addr of patchbits */
140#define PCS_PCSADDR (PCS_PATCHADDR+0x8000) /* start addr of pcs */
141#define PCS_PATCHBIT (PCS_PATCHADDR+0xc000) /* patchbits enable reg */
142#define PCS_ENABLE 0xfff00000 /* enable bits for pcs */
143
144loadpcs()
145{
146 register int *ip; /* known to be r11 below */
147 register int i; /* known to be r10 below */
148 register int *jp; /* known to be r9 below */
149 register int j;
1c915156 150 static int pcsdone = 0;
e559a17c
TF
151 union cpusid sid;
152 char pcs[100];
5af1bd7a
JB
153 char *closeparen;
154 char *index();
e559a17c
TF
155
156 sid.cpusid = mfpr(SID);
1c915156 157 if (sid.cpuany.cp_type!=VAX_750 || sid.cpu750.cp_urev<95 || pcsdone)
e559a17c
TF
158 return;
159 printf("Updating 11/750 microcode: ");
5af1bd7a
JB
160 strncpy(pcs, line, 99);
161 pcs[99] = 0;
162 closeparen = index(pcs, ')');
163 if (closeparen)
164 *(++closeparen) = 0;
165 else
166 return;
e559a17c
TF
167 strcat(pcs, "pcs750.bin");
168 i = open(pcs, 0);
169 if (i < 0)
170 return;
171 /*
172 * We ask for more than we need to be sure we get only what we expect.
173 * After read:
174 * locs 0 - 1023 packed patchbits
175 * 1024 - 11264 packed microcode
176 */
177 if (read(i, (char *)0, 23*512) != 22*512) {
178 printf("Error reading %s\n", pcs);
179 close(i);
180 return;
181 }
182 close(i);
183
184 /*
185 * Enable patchbit loading and load the bits one at a time.
186 */
187 *((int *)PCS_PATCHBIT) = 1;
188 ip = (int *)PCS_PATCHADDR;
189 jp = (int *)0;
190 for (i=0; i < PCS_BITCNT; i++) {
191 asm(" extzv r10,$1,(r9),(r11)+");
192 }
193 *((int *)PCS_PATCHBIT) = 0;
194
195 /*
196 * Load PCS microcode 20 bits at a time.
197 */
198 ip = (int *)PCS_PCSADDR;
199 jp = (int *)1024;
200 for (i=j=0; j < PCS_MICRONUM * 4; i+=20, j++) {
201 asm(" extzv r10,$20,(r9),(r11)+");
202 }
203
204 /*
205 * Enable PCS.
206 */
207 i = *jp; /* get 1st 20 bits of microcode again */
208 i &= 0xfffff;
209 i |= PCS_ENABLE; /* reload these bits with PCS enable set */
210 *((int *)PCS_PCSADDR) = i;
211
212 sid.cpusid = mfpr(SID);
213 printf("new rev level=%d\n", sid.cpu750.cp_urev);
1c915156 214 pcsdone = 1;
e559a17c 215}