* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)boot.c 7.11 (Berkeley) %G%
* Boot program... arguments passed in r10 and r11 determine
* whether boot stops to ask for system name and which device
register unsigned howto
, devtype
; /* howto=r11, devtype=r10 */
howto
= RB_ASKNAME
|RB_SINGLE
;
if ((howto
& RB_ASKNAME
) == 0) {
type
= (devtype
>> B_TYPESHIFT
) & B_TYPEMASK
;
if ((unsigned)type
< ndevs
&& devsw
[type
].dv_name
)
howto
|= RB_SINGLE
|RB_ASKNAME
;
if (howto
& RB_ASKNAME
) {
copyunix(howto
, opendev
, io
);
howto
|= RB_SINGLE
|RB_ASKNAME
;
howto
|= RB_SINGLE
|RB_ASKNAME
;
copyunix(howto
, devtype
, aio
)
register howto
, devtype
; /* howto=r11, devtype=r10 */
register int esym
; /* must be r9 */
register int io
= aio
, i
;
if (read(io
, (char *)&x
, sizeof(x
)) != sizeof(x
) || N_BADMAG(x
)) {
if (x
.a_magic
== ZMAGIC
&& lseek(io
, 0x400, L_SET
) == -1)
if (read(io
, (char *)0, x
.a_text
) != x
.a_text
)
if (x
.a_magic
== ZMAGIC
|| x
.a_magic
== NMAGIC
)
while ((int)addr
& CLOFSET
)
if (read(io
, addr
, x
.a_data
) != x
.a_data
)
for (i
= 0; i
< x
.a_bss
; i
++)
if (howto
& RB_KDB
&& x
.a_syms
) {
*(int *)addr
= x
.a_syms
; /* symbol table size */
printf("[+%d", x
.a_syms
);
if (read(io
, addr
, x
.a_syms
) != x
.a_syms
)
if (read(io
, addr
, sizeof (int)) != sizeof (int))
i
= *(int *)addr
- sizeof (int); /* string table size */
if (read(io
, addr
, i
) != i
)
esym
= roundup((int)addr
, sizeof (int));
for (i
= 0; i
< 128*512; i
++) /* slop */
printf(" start 0x%x\n", x
.a_entry
);
(*((int (*)()) x
.a_entry
))();
/* 750 Patchable Control Store magic */
#define PCS_BITCNT 0x2000 /* number of patchbits */
#define PCS_MICRONUM 0x400 /* number of ucode locs */
#define PCS_PATCHADDR 0xf00000 /* start addr of patchbits */
#define PCS_PCSADDR (PCS_PATCHADDR+0x8000) /* start addr of pcs */
#define PCS_PATCHBIT (PCS_PATCHADDR+0xc000) /* patchbits enable reg */
#define PCS_ENABLE 0xfff00000 /* enable bits for pcs */
register int *ip
; /* known to be r11 below */
register int i
; /* known to be r10 below */
register int *jp
; /* known to be r9 below */
if (sid
.cpuany
.cp_type
!=VAX_750
|| sid
.cpu750
.cp_urev
<95 || pcsdone
)
printf("Updating 11/750 microcode: ");
for (cp
= line
; *cp
; cp
++)
if (*cp
== ')' || *cp
== ':')
strcpy(pcs
+ i
, "pcs750.bin");
* We ask for more than we need to be sure we get only what we expect.
* locs 0 - 1023 packed patchbits
* 1024 - 11264 packed microcode
if (read(i
, (char *)0, 23*512) != 22*512) {
printf("Error reading %s\n", pcs
);
* Enable patchbit loading and load the bits one at a time.
*((int *)PCS_PATCHBIT
) = 1;
ip
= (int *)PCS_PATCHADDR
;
for (i
=0; i
< PCS_BITCNT
; i
++) {
asm(" extzv r10,$1,(r9),(r11)+");
*((int *)PCS_PATCHBIT
) = 0;
* Load PCS microcode 20 bits at a time.
for (i
=j
=0; j
< PCS_MICRONUM
* 4; i
+=20, j
++) {
asm(" extzv r10,$20,(r9),(r11)+");
i
= *jp
; /* get 1st 20 bits of microcode again */
i
|= PCS_ENABLE
; /* reload these bits with PCS enable set */
*((int *)PCS_PCSADDR
) = i
;
printf("new rev level=%d\n", sid
.cpu750
.cp_urev
);