* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* %sccs.include.redist.c%
* @(#)bootxx.c 7.2 (Berkeley) %G%
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
);