summaryrefslogtreecommitdiff
path: root/sys/arch/wgrisc/stand/boot/boot.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/wgrisc/stand/boot/boot.c')
-rw-r--r--sys/arch/wgrisc/stand/boot/boot.c76
1 files changed, 30 insertions, 46 deletions
diff --git a/sys/arch/wgrisc/stand/boot/boot.c b/sys/arch/wgrisc/stand/boot/boot.c
index 6892d6a6a23..2e7cf0742ff 100644
--- a/sys/arch/wgrisc/stand/boot/boot.c
+++ b/sys/arch/wgrisc/stand/boot/boot.c
@@ -1,12 +1,8 @@
-/* $NetBSD: boot.c,v 1.6 1995/06/28 10:22:32 jonathan Exp $ */
+/* $OpenBSD: boot.c,v 1.2 1997/07/21 06:58:12 pefo Exp $ */
/*
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Ralph Campbell.
- *
+ * Copyright (c) 1997 Per Fogelstrom
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -17,17 +13,16 @@
* 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 product includes software developed under OpenBSD by
+ * Per Fogelstrom.
+ * 4. The name of the author may not 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
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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
@@ -35,7 +30,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)boot.c 8.1 (Berkeley) 6/10/93
*/
#include <sys/param.h>
@@ -46,29 +40,24 @@
#include <errno.h>
-char line[1024];
void gets __P((char *));
ssize_t read __P((int, void *, size_t));
int close __P((int));
void prom_write __P((int, char *, int));
-int main __P((int, char **));
+void main __P((int, char **));
int loadfile __P((char *));
/*
- * This gets arguments from the PROM, calls other routines to open
- * and load the program to boot, and then transfers execution to that
- * new program.
- * Argv[0] should be something like "rz(0,0,0)vmunix" on a DECstation 3100.
- * Argv[0,1] should be something like "boot 5/rz0/vmunix" on a DECstation 5000.
- * The argument "-a" means vmunix should do an automatic reboot.
*/
-int
+void
main(argc, argv)
int argc;
char **argv;
{
- char *cp = 0;
+static char boot[] = {"Boot:"};
+ char *cp = boot;
int ask, entry;
+ char line[1024];
ask = 1;
@@ -78,23 +67,22 @@ main(argc, argv)
}
while(1) {
do {
- printf("Boot: ");
+ printf("%s\n", cp);
if (ask) {
gets(line);
cp = line;
argv[0] = cp;
argc = 1;
- } else
- printf("%s\n", cp);
+ }
} while(ask && line[0] == '\0');
entry = loadfile(cp);
if (entry != -1) {
- printf("Starting at 0x%x\n\n", entry);
((void (*)())entry)(argc, argv, 0, 0);
}
+ ask = 1;
+ cp = boot;
}
- return(0);
}
/*
@@ -108,9 +96,10 @@ loadfile(fname)
Elf32_Ehdr eh;
Elf32_Phdr *ph;
u_long phsize;
+ char *errs = 0;
if ((fd = oopen(fname, 0)) < 0) {
- printf("open(%s) failed: %d\n", fname, errno);
+ errs="open(%s) err: %d\n";
goto err;
}
@@ -126,24 +115,19 @@ loadfile(fname)
goto serr;
}
- for(i = 0; i < eh.e_phnum; i++) {
- switch (ph[i].p_type) {
- case PT_LOAD:
- olseek(fd, ph[i].p_offset, 0);
- if(oread(fd, (char *)ph[i].p_paddr, ph[i].p_filesz) != ph[i].p_filesz) {
+ for(i = 0; i < eh.e_phnum; i++, ph++) {
+ if(ph->p_type == PT_LOAD) {
+ olseek(fd, ph->p_offset, 0);
+ if(oread(fd, (char *)ph->p_paddr, ph->p_filesz) != ph->p_filesz) {
goto serr;
}
- break;
- default:
- break;
}
}
- (void) oclose(fd);
return(eh.e_entry);
serr:
- printf("Read size error\n");
+ errs = "rd(%s) sz err\n";
err:
- printf("Can't boot '%s'\n", fname);
- (void) oclose(fd);
+ printf(errs, fname, errno);
return (-1);
}
+