BSD 4_4_Lite1 release
[unix-history] / usr / src / sys / sparc / sparc / autoconf.c
index 0b31e57..a19038a 100644 (file)
@@ -39,9 +39,9 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)autoconf.c  8.1 (Berkeley) 6/11/93
+ *     @(#)autoconf.c  8.4 (Berkeley) 10/1/93
  *
  *
- * from: $Header: autoconf.c,v 1.32 93/05/28 03:55:59 torek Exp $ (LBL)
+ * from: $Header: autoconf.c,v 1.38 93/10/01 21:24:51 torek Exp $ (LBL)
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -81,7 +81,6 @@ void  setroot __P((void));
 static int getstr __P((char *, int));
 static int findblkmajor __P((struct dkdevice *));
 static struct device *getdisk __P((char *, int, int, dev_t *));
 static int getstr __P((char *, int));
 static int findblkmajor __P((struct dkdevice *));
 static struct device *getdisk __P((char *, int, int, dev_t *));
-static struct device *parsedisk __P((char *, int, int, dev_t *));
 
 struct bootpath bootpath[8];
 
 
 struct bootpath bootpath[8];
 
@@ -438,11 +437,20 @@ mainbus_attach(parent, dev, aux)
        struct romaux ra;
        static const char *const special[] = {
                /* find these first (end with empty string) */
        struct romaux ra;
        static const char *const special[] = {
                /* find these first (end with empty string) */
-               "memory-error", "eeprom", "counter-timer", "",
+               "memory-error", /* as early as convenient, in case of error */
+               "eeprom",
+               "counter-timer",
+               "",
 
                /* ignore these (end with NULL) */
 
                /* ignore these (end with NULL) */
-               "options", "packages", "openprom", "memory", "virtual-memory",
-               "interrupt-enable", NULL
+               "aliases",
+               "interrupt-enable",
+               "memory",
+               "openprom",
+               "options",
+               "packages",
+               "virtual-memory",
+               NULL
        };
 
        printf("\n");
        };
 
        printf("\n");
@@ -721,6 +729,7 @@ nextsibling(node)
        return (promvec->pv_nodeops->no_nextnode(node));
 }
 
        return (promvec->pv_nodeops->no_nextnode(node));
 }
 
+#ifdef RCONSOLE
 /* Pass a string to the FORTH PROM to be interpreted */
 void
 rominterpret(s)
 /* Pass a string to the FORTH PROM to be interpreted */
 void
 rominterpret(s)
@@ -733,6 +742,35 @@ rominterpret(s)
                promvec->pv_fortheval.v2_eval(s);
 }
 
                promvec->pv_fortheval.v2_eval(s);
 }
 
+/*
+ * Try to figure out where the PROM stores the cursor row & column
+ * variables.  Returns nonzero on error.
+ */
+int
+romgetcursoraddr(rowp, colp)
+       register int **rowp, **colp;
+{
+       char buf[100];
+
+       /*
+        * line# and column# are global in older proms (rom vector < 2)
+        * and in some newer proms.  They are local in version 2.9.  The
+        * correct cutoff point is unknown, as yet; we use 2.9 here.
+        */
+       if (promvec->pv_romvec_vers < 2 || promvec->pv_printrev < 0x00020009)
+               sprintf(buf,
+                   "' line# >body >user %x ! ' column# >body >user %x !",
+                   rowp, colp);
+       else
+               sprintf(buf,
+                   "stdout @ is my-self addr line# %x ! addr column# %x !",
+                   rowp, colp);
+       *rowp = *colp = NULL;
+       rominterpret(buf);
+       return (*rowp == NULL || *colp == NULL);
+}
+#endif
+
 volatile void
 romhalt()
 {
 volatile void
 romhalt()
 {
@@ -815,26 +853,27 @@ getdisk(str, len, defpart, devp)
        return (dv);
 }
 
        return (dv);
 }
 
-static struct device *
+struct device *
 parsedisk(str, len, defpart, devp)
        char *str;
        int len, defpart;
        dev_t *devp;
 {
        register struct device *dv;
 parsedisk(str, len, defpart, devp)
        char *str;
        int len, defpart;
        dev_t *devp;
 {
        register struct device *dv;
-       register char *cp;
+       register char *cp, c;
        int majdev, mindev, part;
 
        if (len == 0)
                return (NULL);
        cp = str + len - 1;
        int majdev, mindev, part;
 
        if (len == 0)
                return (NULL);
        cp = str + len - 1;
-       if (*cp >= 'a' && *cp <= 'h') {
-               part = *cp - 'a';
-               *cp-- = '\0';
+       c = *cp;
+       if (c >= 'a' && c <= 'h') {
+               part = c - 'a';
+               *cp = '\0';
        } else
                part = defpart;
 
        } else
                part = defpart;
 
-       for (dv = alldevs; dv != NULL; dv = dv->dv_next)
+       for (dv = alldevs; dv != NULL; dv = dv->dv_next) {
                if (dv->dv_class == DV_DISK &&
                    strcmp(str, dv->dv_xname) == 0) {
                        majdev = findblkmajor((struct dkdevice *)dv);
                if (dv->dv_class == DV_DISK &&
                    strcmp(str, dv->dv_xname) == 0) {
                        majdev = findblkmajor((struct dkdevice *)dv);
@@ -842,10 +881,12 @@ parsedisk(str, len, defpart, devp)
                                panic("parsedisk");
                        mindev = (dv->dv_unit << PARTITIONSHIFT) + part;
                        *devp = makedev(majdev, mindev);
                                panic("parsedisk");
                        mindev = (dv->dv_unit << PARTITIONSHIFT) + part;
                        *devp = makedev(majdev, mindev);
-                       return (dv);
+                       break;
                }
                }
+       }
 
 
-       return (NULL);
+       *cp = c;
+       return (dv);
 }
 
 /*
 }
 
 /*
@@ -920,9 +961,6 @@ gotswap:
 #ifdef NFS
        case DV_IFNET:
                mountroot = nfs_mountroot;
 #ifdef NFS
        case DV_IFNET:
                mountroot = nfs_mountroot;
-#ifdef LBL
-               lbl_diskless_setup();
-#endif
                return;
 #endif
 
                return;
 #endif