Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/bebox/stand/boot Change format of path for device. ...



details:   https://anonhg.NetBSD.org/src/rev/5774f646c3dc
branches:  trunk
changeset: 758025:5774f646c3dc
user:      kiyohara <kiyohara%NetBSD.org@localhost>
date:      Thu Oct 14 06:39:52 2010 +0000

description:
Change format of path for device.  A current form strangely feels dissatisfied.
This new format looks like the format of BootROM of BeBox.

diffstat:

 sys/arch/bebox/stand/boot/boot.c    |    9 +-
 sys/arch/bebox/stand/boot/conf.c    |   18 +-
 sys/arch/bebox/stand/boot/devopen.c |  197 ++++++++++++++++++-----------------
 sys/arch/bebox/stand/boot/fd.c      |    7 +-
 4 files changed, 119 insertions(+), 112 deletions(-)

diffs (truncated from 330 to 300 lines):

diff -r 3e4b645f65ca -r 5774f646c3dc sys/arch/bebox/stand/boot/boot.c
--- a/sys/arch/bebox/stand/boot/boot.c  Thu Oct 14 06:23:27 2010 +0000
+++ b/sys/arch/bebox/stand/boot/boot.c  Thu Oct 14 06:39:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: boot.c,v 1.20 2010/10/14 06:17:57 kiyohara Exp $       */
+/*     $NetBSD: boot.c,v 1.21 2010/10/14 06:39:52 kiyohara Exp $       */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -42,10 +42,9 @@
 #include "boot.h"
 
 char *names[] = {
-       "in()",
-       "fd(0,1,0)netbsd", "fd(0,1,0)netbsd.gz",
-       "fd(0,1,0)netbsd.old", "fd(0,1,0)netbsd.old.gz",
-       "fd(0,1,0)onetbsd", "fd(0,1,0)onetbsd.gz"
+       "/dev/disk/floppy:netbsd",      "/dev/disk/floppy:netbsd.gz",
+       "/dev/disk/floppy:onetbsd",     "/dev/disk/floppy:onetbsd.gz"
+       "in",
 };
 #define        NUMNAMES (sizeof (names) / sizeof (names[0]))
 
diff -r 3e4b645f65ca -r 5774f646c3dc sys/arch/bebox/stand/boot/conf.c
--- a/sys/arch/bebox/stand/boot/conf.c  Thu Oct 14 06:23:27 2010 +0000
+++ b/sys/arch/bebox/stand/boot/conf.c  Thu Oct 14 06:39:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: conf.c,v 1.6 2005/12/11 12:17:04 christos Exp $        */
+/*     $NetBSD: conf.c,v 1.7 2010/10/14 06:39:52 kiyohara Exp $        */
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993
@@ -34,17 +34,19 @@
 #include <sys/param.h>
 #include <lib/libsa/stand.h>
 
-int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
-int fdopen(struct open_file *, ...);
-int fdclose(struct open_file *);
+extern int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
+extern int fdopen(struct open_file *, ...);
+extern int fdclose(struct open_file *);
 
-int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
-int inopen(struct open_file *, ...);
-int inclose(struct open_file *);
+extern int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
+extern int inopen(struct open_file *, ...);
+extern int inclose(struct open_file *);
 
 struct devsw devsw[] = {
        { "fd", fdstrategy, fdopen, fdclose, noioctl },
-       { "in", instrategy, inopen, inclose, noioctl },
+
+       { NULL, NULL,       NULL,   NULL,    NULL },
 };
+struct devsw pseudo_devsw = { "in", instrategy, inopen, inclose, noioctl };
 
 int ndevs = sizeof(devsw) / sizeof(devsw[0]);
diff -r 3e4b645f65ca -r 5774f646c3dc sys/arch/bebox/stand/boot/devopen.c
--- a/sys/arch/bebox/stand/boot/devopen.c       Thu Oct 14 06:23:27 2010 +0000
+++ b/sys/arch/bebox/stand/boot/devopen.c       Thu Oct 14 06:39:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: devopen.c,v 1.9 2008/05/26 16:28:39 kiyohara Exp $     */
+/*     $NetBSD: devopen.c,v 1.10 2010/10/14 06:39:52 kiyohara Exp $    */
 
 /*-
  *  Copyright (c) 1993 John Brezak
@@ -33,125 +33,132 @@
 #include <sys/param.h>
 #include <sys/reboot.h>
 
-#define        ispart(c)       ((c) >= 'a' && (c) <= 'h')
-
-static int atoi(char *);
-static int devlookup(char *);
 static int devparse(const char *, int *, int *, int *, int *, int *, char **);
 
 
-static int
-atoi(char *cp)
-{
-       int val = 0;
-
-       while (isdigit(*cp))
-               val = val * 10 + (*cp++ - '0');
-       return val;
-}
-
-static int
-devlookup(char *d)
-{
-       struct devsw *dp = devsw;
-       int i;
-
-       for (i = 0; i < ndevs; i++, dp++)
-               if (dp->dv_name && strcmp(dp->dv_name, d) == 0)
-                       return i;
-
-       printf("No such device - Configured devices are:\n");
-       for (dp = devsw, i = 0; i < ndevs; i++, dp++)
-               if (dp->dv_name)
-                       printf(" %s", dp->dv_name);
-       printf("\n");
-       return -1;
-}
-
 /*
- * Parse a device spec in one of two forms.
- *   dev(ctlr, unit, part)file
+ * Parse a device spec.
+ *   i.e.
+ *     /dev/disk/floppy
+ *     /dev/disk/ide/0/master/0
+ *     /dev/disk/ide/0/slave/0
+ *     /dev/disk/scsi/0/0/0
+ *     /dev/disk/scsi/0/3/0
  */
 static int
-devparse(const char *fname, int *dev, int *adapt, int *ctlr, int *unit,
+devparse(const char *fname, int *dev, int *ctlr, int *unit, int *lunit,
         int *part, char **file)
 {
-       int argc, flag;
-       char *s, *args[3];
-       extern char nametmp[];
+       int i;
+       char devdir[] = "/dev/disk/";
+       char floppy[] = "floppy";
+       char ide[] = "ide";
+       char scsi[] = "scsi";
+       char *p;
+
+       if (strncmp(fname, devdir, strlen(devdir)) != 0)
+               return EINVAL;
+       p = __UNCONST(fname) + strlen(devdir);
 
-       /* get device name and make lower case */
-       strcpy(nametmp, (char *)fname);
-       for (s = nametmp; *s && *s != '('; s++)
-               if (isupper(*s)) *s = tolower(*s);
-
-       if (*s == '(') {
-               /* lookup device and get index */
-               *s = NULL;
-               if ((*dev = devlookup(nametmp)) < 0)
-                   goto baddev;
+       if (strncmp(p, floppy, strlen(floppy)) == 0) {
+               p += strlen(floppy);
+               for (i = 0; devsw[i].dv_name != NULL; i++)
+                       if (strcmp(devsw[i].dv_name, "fd") == 0) {
+                               *dev = i;
+                               *ctlr = 0;
+                               *unit = 1;
+                               *lunit = 0;
+                               break;
+                       }
+       } else if (strncmp(p, ide, strlen(ide)) == 0) {
+               char master[] = "master";
+               char slave[] = "slave";
 
-               /* tokenize device ident */
-               for (++s, flag = 0, argc = 0; *s && *s != ')'; s++) {
-                       if (*s != ',') {
-                               if (!flag) {
-                                       flag++;
-                                       args[argc++] = s;
-                               }
-                       } else {
-                               if (flag) {
-                                       *s = NULL;
-                                       flag = 0;
-                               }
+               p += strlen(ide);
+               if (*p++ != '/' ||
+                   !isdigit(*p++) ||
+                   *p++ != '/')
+                       return EINVAL;
+               *ctlr = *(p - 2) - '0';
+               if (strncmp(p, master, strlen(master)) == 0) {
+                       *unit = 0;
+                       p += strlen(master);
+               } else if (strncmp(p, slave, strlen(slave)) == 0) {
+                       *unit = 1;
+                       p += strlen(slave);
+               } else
+                       return EINVAL;
+               if (*p++ != '/' ||
+                   !isdigit(*p++) ||
+                   *p++ != '_' ||
+                   !isdigit(*p++))
+                       return EINVAL;
+               *lunit = *(p - 3) - '0';
+               *part = *(p - 1) - '0';
+               for (i = 0; devsw[i].dv_name != NULL; i++)
+                       if (strcmp(devsw[i].dv_name, "wd") == 0) {
+                               *dev = i;
+                               break;
                        }
-               }
-               if (*s == ')')
-                       *s = NULL;
+               if (devsw[i].dv_name == NULL)
+                       return EINVAL;
+       } else if (strncmp(p, scsi, strlen(scsi)) == 0) {
+               p += strlen(scsi);
+               if (*p++ != '/' ||
+                   !isdigit(*p++) ||
+                   *p++ != '/' ||
+                   !isdigit(*p++) ||
+                   *p++ != '/' ||
+                   !isdigit(*p++) ||
+                   *p++ != '_' ||
+                   !isdigit(*p++))
+                       return EINVAL;
+               *ctlr = *(p - 7) - '0';
+               *unit = *(p - 5) - '0';
+               *lunit = *(p - 3) - '0';
+               *part = *(p - 1) - '0';
+               for (i = 0; devsw[i].dv_name != NULL; i++)
+                       if (strcmp(devsw[i].dv_name, "sd") == 0) {
+                               *dev = i;
+                               break;
+                       }
+               if (devsw[i].dv_name == NULL)
+                       return EINVAL;
+       }
 
-               switch (argc) {
-               case 3:
-                       *part = atoi(args[2]);
-                       /* FALLTHROUGH */
-               case 2:
-                       *unit = atoi(args[1]);
-                       /* FALLTHROUGH */
-               case 1:
-                       *ctlr = atoi(args[0]);
-                       break;
-               }
-               *file = ++s;
-       } else {
-               /* no device present */
-               *file = (char *)fname;
-       }
+       if (*p++ != ':')
+               return EINVAL;
+       *file = p;
        return 0;
-
-baddev:
-       return EINVAL;
 }
 
 int
 devopen(struct open_file *f, const char *fname, char **file)
 {
        int error;
-       int dev = 0, ctlr = 0, unit = 0, part = 0;
-       int adapt = 0;
+       int dev = 0, ctlr = 0, unit = 0, lunit = 0, part = 0;
        struct devsw *dp = &devsw[0];
+       extern struct devsw pseudo_devsw;
 
-       if ((error =
-           devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file)) != 0)
-               return error;
-
-       dp = &devsw[dev];
-       if (!dp->dv_open)
-               return ENODEV;
+       **file = '\0';
+       error = devparse(fname, &dev, &ctlr, &unit, &lunit, &part, file);
+       if (error == 0) {
+               dp = &devsw[dev];
+               if (!dp->dv_open)
+                       return ENODEV;
+       } else {
+               if (strcmp(fname, "in") == 0)
+                       /* special case: kernel in memory */
+                       dp = &pseudo_devsw;
+               else
+                       return error;
+       }
 
        f->f_dev = dp;
-       if ((error = (*dp->dv_open)(f, ctlr, unit, part)) == 0)
+       if ((error = (*dp->dv_open)(f, ctlr, unit, lunit, part)) == 0)
                return 0;
 
-       printf("%s(%d,%d,%d): %s\n", devsw[dev].dv_name,
-               ctlr, unit, part, strerror(error));
+       printf("%s %s\n", fname, strerror(error));
 
        return error;
 }
diff -r 3e4b645f65ca -r 5774f646c3dc sys/arch/bebox/stand/boot/fd.c
--- a/sys/arch/bebox/stand/boot/fd.c    Thu Oct 14 06:23:27 2010 +0000
+++ b/sys/arch/bebox/stand/boot/fd.c    Thu Oct 14 06:39:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fd.c,v 1.9 2009/03/18 10:22:27 cegger Exp $    */



Home | Main Index | Thread Index | Old Index