diff options
Diffstat (limited to 'sys/arch/wgrisc/stand/boot/boot.c')
-rw-r--r-- | sys/arch/wgrisc/stand/boot/boot.c | 76 |
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); } + |