* 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>
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 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) */
- "options", "packages", "openprom", "memory", "virtual-memory",
- "interrupt-enable", NULL
+ "aliases",
+ "interrupt-enable",
+ "memory",
+ "openprom",
+ "options",
+ "packages",
+ "virtual-memory",
+ NULL
};
printf("\n");
return (promvec->pv_nodeops->no_nextnode(node));
}
+#ifdef RCONSOLE
/* Pass a string to the FORTH PROM to be interpreted */
void
rominterpret(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()
{
return (dv);
}
-static struct device *
+struct device *
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;
- 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;
- 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);
panic("parsedisk");
mindev = (dv->dv_unit << PARTITIONSHIFT) + part;
*devp = makedev(majdev, mindev);
- return (dv);
+ break;
}
+ }
- return (NULL);
+ *cp = c;
+ return (dv);
}
/*
#ifdef NFS
case DV_IFNET:
mountroot = nfs_mountroot;
-#ifdef LBL
- lbl_diskless_setup();
-#endif
return;
#endif