* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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
* @(#)bootxx.c 5.2 (Berkeley) 4/28/91
char *bootprog
= "/boot";
extern int opendev
, bootdev
, cyloffset
;
extern struct disklabel disklabel
;
* Boot program... loads /boot out of filesystem indicated by arguements.
* We assume an autoboot unless we detect a misconfiguration.
register struct disklabel
*lp
;
register int io
, partition
, howto
;
/* are we a disk, if so look at disklabel and do things */
if (lp
->d_magic
== DISKMAGIC
) {
* Synthesize bootdev from dev, unit, type and partition
* information from the block 0 bootstrap.
* It's dirty work, but someone's got to do it.
* This will be used by the filesystem primatives, and
* drivers. Ultimately, opendev will be created corresponding
* to which drive to pass to top level bootstrap.
for (io
= 0; io
< 8; io
++)
if (lp
->d_type
== DTYPE_SCSI
) {
if (lp
->d_partitions
[io
].p_offset
== off
)
if (lp
->d_partitions
[io
].p_offset
== off
*lp
->d_secpercyl
)
if (io
== 8) goto screwed
;
/* probably a bad or non-existant disklabel */
howto
|= RB_SINGLE
|RB_ASKNAME
;
/* currently, PC has no way of booting off alternate controllers */
bootdev
= MAKEBOOTDEV(/*i_dev*/ dev
, /*i_adapt*/0, /*i_ctlr*/0,
printf("loading %s\n", bootprog
);
i
= read(io
, (char *)&x
, sizeof x
);
(x
.a_magic
!= 0407 && x
.a_magic
!= 0413 && x
.a_magic
!= 0410))
if ((x
.a_magic
== 0413 || x
.a_magic
== 0410) &&
lseek(io
, 0x400, 0) == -1)
if (read(io
, (char *)0, x
.a_text
) != x
.a_text
)
if (x
.a_magic
== 0413 || x
.a_magic
== 0410)
while ((int)addr
& CLOFSET
)
if (read(io
, addr
, x
.a_data
) != x
.a_data
)
for (i
= 0; i
< x
.a_bss
; i
++)
(*((int (*)()) x
.a_entry
))(howto
, opendev
, cyloffset
);