* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
* 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
* @(#)boot.c 7.4 (Berkeley) 5/5/91
/* XXX -- see sys/reboot.h */
#define B_MAKEDEV(a,u,p,t) \
(((a) << B_ADAPTORSHIFT) | ((u) << B_UNITSHIFT) | \
((p) << B_PARTITIONSHIFT) | ((t) << B_TYPESHIFT))
* Boot program... arguments in `devtype' and `howto' determine
* whether boot stops to ask for system name and which device
/* Types in `devtype' specifying major device */
#define MAXTYPE (sizeof(devname) / sizeof(devname[0]))
extern int howto
, devtype
;
#define MSUS (0xfffffedc)
2, /* 16 - CS/80 device on HPIB */
2, /* 17 - CS/80 device on HPIB */
register type
, part
, unit
, io
;
howto
= RB_ASKNAME
|RB_SINGLE
;
type
= (devtype
>> B_TYPESHIFT
) & B_TYPEMASK
;
unit
= (devtype
>> B_UNITSHIFT
) & B_UNITMASK
;
unit
+= 8 * ((devtype
>> B_ADAPTORSHIFT
) & B_ADAPTORMASK
);
part
= (devtype
>> B_PARTITIONSHIFT
) & B_PARTITIONMASK
;
if ((howto
& RB_ASKNAME
) == 0) {
if ((devtype
& B_MAGICMASK
) != B_DEVMAGIC
) {
* we have to map the ROM device type codes
* to Unix major device numbers.
type
= rom2mdev
[*(char *)MSUS
& 0x1f];
devtype
= (devtype
&~ (B_TYPEMASK
<< B_TYPESHIFT
))
if (type
>= 0 && type
<= MAXTYPE
&& devname
[type
][0]) {
*cp
++ = devname
[type
][0];
*cp
++ = devname
[type
][1];
howto
= RB_SINGLE
|RB_ASKNAME
;
if (!noconsole
&& (howto
& RB_ASKNAME
)) {
if (sb
.st_uid
|| (sb
.st_mode
& 2)) {
printf("non-secure file, will not load\n");
howto
= RB_SINGLE
|RB_ASKNAME
;
if (howto
& RB_ASKNAME
) {
* Build up devtype register to pass on to
for (type
= 0; type
<= MAXTYPE
; type
++)
if ((devname
[type
][0] == cp
[0]) &&
(devname
[type
][1] == cp
[1]))
if (*cp
>= '0' && *cp
<= '9')
unit
= unit
* 10 + *cp
++ - '0';
devtype
= B_MAKEDEV(unit
>> 3, unit
& 7, part
, type
);
copyunix(howto
, devtype
, io
);
howto
= RB_SINGLE
|RB_ASKNAME
;
howto
= RB_SINGLE
|RB_ASKNAME
;
copyunix(howto
, devtype
, io
)
register howto
; /* d7 contains boot flags */
register devtype
; /* d6 contains boot device */
register char *load
; /* a5 contains load addr for unix */
i
= read(io
, (char *)&x
, sizeof x
);
(x
.a_magic
!= 0407 && x
.a_magic
!= 0413 && x
.a_magic
!= 0410))
if (x
.a_magic
== 0413 && lseek(io
, 0x400, 0) == -1)
if (read(io
, (char *)addr
, 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
)
x
.a_bss
+= 128*512; /* slop */
for (i
= 0; i
< x
.a_bss
; i
++)
x
.a_entry
+= (int)lowram
;
printf(" start 0x%x\n", x
.a_entry
);
asm(" movl %0,d7" : : "m" (howto
));
asm(" movl %0,d6" : : "m" (devtype
));
asm(" movl %0,a5" : : "a" (load
));
(*((int (*)()) x
.a_entry
))();