Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc/stand/boot * Use fdloadfile() to avoid openin...



details:   https://anonhg.NetBSD.org/src/rev/07843d43a5eb
branches:  trunk
changeset: 543437:07843d43a5eb
user:      pk <pk%NetBSD.org@localhost>
date:      Tue Feb 25 08:09:30 2003 +0000

description:
* Use fdloadfile() to avoid opening the the underlying device twice.
* Cleanup old stuff.

diffstat:

 sys/arch/sparc/stand/boot/boot.c |  92 +++++++++++++++++++++------------------
 1 files changed, 50 insertions(+), 42 deletions(-)

diffs (174 lines):

diff -r 3999b16bcab6 -r 07843d43a5eb sys/arch/sparc/stand/boot/boot.c
--- a/sys/arch/sparc/stand/boot/boot.c  Tue Feb 25 08:06:29 2003 +0000
+++ b/sys/arch/sparc/stand/boot/boot.c  Tue Feb 25 08:09:30 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: boot.c,v 1.13 2002/12/11 10:35:06 pk Exp $ */
+/*     $NetBSD: boot.c,v 1.14 2003/02/25 08:09:30 pk Exp $ */
 
 /*-
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -51,18 +51,15 @@
 extern void    prom_patch __P((void)); /* prompatch.c */
 
 static int     bootoptions __P((char *));
-#if 0
-static void    promsyms __P((int, struct exec *));
-#endif
 
-int debug;
-int netif_debug;
+int    boothowto;
+int    debug;
+int    netif_debug;
+
+char   fbuf[80], dbuf[128];
+u_long maxkernsize;
 
 extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
-unsigned long          esym;
-char                   *strtab;
-int                    strtablen;
-char                   fbuf[80], dbuf[128];
 
 int    main __P((void));
 typedef void (*entry_t)__P((caddr_t, int, int, int, long, long));
@@ -107,16 +104,44 @@
        return (v);
 }
 
+static int
+loadk(char *kernel, u_long *marks)
+{
+       int fd, error;
+       u_long size;
+
+       if ((fd = open(kernel, 0)) < 0)
+               return (errno ? errno : ENOENT);
+
+       marks[MARK_START] = 0;
+       if ((error = fdloadfile(fd, marks, COUNT_KERNEL)) != 0)
+               goto out;
+
+       size = marks[MARK_END] - marks[MARK_START];
+       if (size > maxkernsize) {
+               printf("kernel too large: %lu"
+                       " (maximum kernel size is %lu)\n",
+                       marks[MARK_END] - marks[MARK_START],
+                       maxkernsize);
+               error = EFBIG;
+               goto out;
+       }
+
+       marks[MARK_START] = 0;
+       error = fdloadfile(fd, marks, LOAD_KERNEL);
+out:
+       close(fd);
+       return (error);
+}
+
 int
 main()
 {
-       int     io, i;
+       int     error, i;
        char    *kernel;
-       int     how;
        u_long  marks[MARK_MAX], bootinfo;
        struct btinfo_symtab bi_sym;
        void    *arg;
-       u_long  maxkernsize;
 
 #ifdef HEAP_VARIABLE
        {
@@ -147,7 +172,7 @@
         */
        prom_bootdevice = prom_getbootpath();
        kernel = prom_getbootfile();
-       how = bootoptions(prom_getbootargs());
+       boothowto = bootoptions(prom_getbootargs());
 
        if (kernel != NULL && *kernel != '\0') {
                i = -1; /* not using the kernels */
@@ -160,7 +185,7 @@
                /*
                 * ask for a kernel first ..
                 */
-               if (how & RB_ASKNAME) {
+               if (boothowto & RB_ASKNAME) {
                        printf("device[%s] (\"halt\" to halt): ",
                                        prom_bootdevice);
                        gets(dbuf);
@@ -173,29 +198,19 @@
                        if (fbuf[0])
                                kernel = fbuf;
                        else {
-                               how &= ~RB_ASKNAME;
+                               boothowto &= ~RB_ASKNAME;
                                i = 0;
                                kernel = kernels[i];
                        }
                }
 
-               marks[MARK_START] = 0;
                printf("Booting %s\n", kernel);
-               if ((io = loadfile(kernel, marks, COUNT_KERNEL)) != -1) {
-                       close(io);
-                       if (marks[MARK_END] - marks[MARK_START] > maxkernsize) {
-                               printf("kernel too large: %lu"
-                                       " (maximum kernel size is %lu)\n",
-                                       marks[MARK_END] - marks[MARK_START],
-                                       maxkernsize);
-                               how |= RB_ASKNAME;
-                               continue;
-                       }
-                       marks[MARK_START] = 0;
-                       if ((io = loadfile(kernel, marks, LOAD_KERNEL)) != -1) {
-                               close(io);
-                               break;
-                       }
+               if ((error = loadk(kernel, marks)) == 0)
+                       break;
+
+               if (error != ENOENT) {
+                       printf("Cannot load %s: error=%d\n", kernel, error);
+                       boothowto |= RB_ASKNAME;
                }
 
                /*
@@ -203,25 +218,20 @@
                 * prom bootfile, try the next one (if it exits).  otherwise,
                 * go into askname mode.
                 */
-               if ((how & RB_ASKNAME) == 0 &&
+               if ((boothowto & RB_ASKNAME) == 0 &&
                    i != -1 && kernels[++i]) {
                        kernel = kernels[i];
                        printf(": trying %s...\n", kernel);
                } else {
                        printf("\n");
-                       how |= RB_ASKNAME;
+                       boothowto |= RB_ASKNAME;
                }
        }
 
        marks[MARK_END] = (((u_long)marks[MARK_END] + sizeof(int) - 1)) &
            (-sizeof(int));
        arg = (prom_version() == PROM_OLDMON) ? (caddr_t)PROM_LOADADDR : romp;
-#if 0
-       /* Old style cruft; works only with a.out */
-       marks[MARK_END] |= 0xf0000000;
-       (*(entry_t)marks[MARK_ENTRY])(arg, 0, 0, 0, marks[MARK_END],
-           DDB_MAGIC1);
-#else
+
        /* Should work with both a.out and ELF, but somehow ELF is busted */
        bootinfo = bi_init(marks[MARK_END]);
 
@@ -245,7 +255,5 @@
        }
 
        (*(entry_t)marks[MARK_ENTRY])(arg, 0, 0, 0, bootinfo, DDB_MAGIC2);
-#endif
-
        _rtt();
 }



Home | Main Index | Thread Index | Old Index