/*-
* Copyright (c) 1982, 1986 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)boot.c 7.15 (Berkeley) 5/4/91
*/
/*
* The boot block are used by 11/750, 8200, MicroVAX II/III, VS2000,
* VS3100/??, VS4000 and VAX6000/???, and only when booting from disk.
*/
void
Xmain(void)
{
union {
struct exec aout;
Elf32_Ehdr elf;
} hdr;
int io;
u_long entry;
vax_cputype = (mfpr(PR_SID) >> 24) & 0xFF;
moved = 0;
/*
*/
rpb = (void *)0xf0000; /* Safe address right now */
bqo = (void *)0xf1000;
if (from == FROMMV) {
/*
* now relocate rpb/bqo (which are used by ROM-routines)
*/
bcopy ((void *)bootregs[11], rpb, sizeof(struct rpb));
bcopy ((void*)rpb->iovec, bqo, rpb->iovecsz);
} else {
memset(rpb, 0, sizeof(struct rpb));
rpb->devtyp = bootregs[0];
rpb->unit = bootregs[3];
rpb->rpb_bootr5 = bootregs[5];
rpb->csrphy = bootregs[2];
rpb->adpphy = bootregs[1]; /* BI node on 8200 */
if (rpb->devtyp != BDEV_HP && vax_cputype == VAX_TYP_750)
rpb->adpphy =
(bootregs[1] == 0xffe000 ? 0xf30000 : 0xf32000);
}
rpb->rpb_base = rpb;
rpb->iovec = (int)bqo;
io = open("/boot.vax", 0);
if (io < 0)
io = open("/boot", 0);
if (io < 0)
__asm("halt");
if (from == FROM750)
return 0;
/*
* Reinit the VMB boot device.
*/
if (bqo->unit_init && (moved++ == 0)) {
int initfn;
initfn = rpb->iovec + bqo->unit_init;
if (rpb->devtyp == BDEV_UDA || rpb->devtyp == BDEV_TK) {
/*
* This reset do not seem to be done in the
* ROM routines, so we have to do it manually.
*/
csr = (struct udadevice *)rpb->csrphy;
csr->udaip = 0;
while ((csr->udasa & MP_STEP1) == 0)
;
}
/*
* AP (R12) have a pointer to the VMB argument list,
* wanted by bqo->unit_init.
*/
unit_init(initfn, rpb, bootregs[12]);
}
return 0;
}
extern struct disklabel romlabel;
int
romstrategy(void *sc, int func, daddr_t dblk, size_t size, void *buf, size_t *rsize)
{
int block = dblk;
int nsize = size;
char *cbuf;
cbuf = (char *)buf;
if (romlabel.d_magic == DISKMAGIC && romlabel.d_magic2 == DISKMAGIC) {
if (romlabel.d_npartitions > 1) {
block += romlabel.d_partitions[0].p_offset;
if (romlabel.d_partitions[0].p_fstype == FS_RAID) {
block += RF_PROTECTED_SECTORS;
}
}
}
/*
* The 11/750 boot ROM for Massbus disks doesn't seen to have layout info
* for all RP disks (not RP07 at least) so therefore a very small and dumb
* device driver is used. It assumes that there is a label on the disk
* already that has valid layout info. If there is no label, we can't boot
* anyway.
*/
#ifdef USE_PRINTF
void
putchar(int ch)
{
/*
* On KA88 we may get C-S/C-Q from the console.
* Must obey it.
*/
while (mfpr(PR_RXCS) & GC_DON) {
if ((mfpr(PR_RXDB) & 0x7f) == 19) {
while (1) {
while ((mfpr(PR_RXCS) & GC_DON) == 0)
;
if ((mfpr(PR_RXDB) & 0x7f) == 17)
break;
}
}
}
while ((mfpr(PR_TXCS) & GC_RDY) == 0)
;
mtpr(0, PR_TXCS);
mtpr(ch & 0377, PR_TXDB);
if (ch == 10)
putchar(13);
}
#endif