code: plan9front

Download patch

ref: 65bd53b9b89b0a84d0f16db4adc3f53fa6ab3a3a
parent: cd64b7129c81102c811b3df9a32ceb4004420f54
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jul 10 12:40:36 EDT 2022

imx8: load a plan9.ini at CONFADDR 0x40010000

--- a/sys/src/9/imx8/main.c
+++ b/sys/src/9/imx8/main.c
@@ -14,6 +14,114 @@
 
 Conf conf;
 
+#define	MAXCONF 64
+static char *confname[MAXCONF];
+static char *confval[MAXCONF];
+static int nconf;
+
+void
+bootargsinit(void)
+{
+	int i, j, n;
+	char *cp, *line[MAXCONF], *p, *q;
+
+	/*
+	 *  parse configuration args from dos file plan9.ini
+	 */
+	cp = BOOTARGS;	/* where b.com leaves its config */
+	cp[BOOTARGSLEN-1] = 0;
+
+	/*
+	 * Strip out '\r', change '\t' -> ' '.
+	 */
+	p = cp;
+	for(q = cp; *q; q++){
+		if(*q == -1)
+			break;
+		if(*q == '\r')
+			continue;
+		if(*q == '\t')
+			*q = ' ';
+		*p++ = *q;
+	}
+	*p = 0;
+
+	n = getfields(cp, line, MAXCONF, 1, "\n");
+	for(i = 0; i < n; i++){
+		if(*line[i] == '#')
+			continue;
+		cp = strchr(line[i], '=');
+		if(cp == nil)
+			continue;
+		*cp++ = '\0';
+		for(j = 0; j < nconf; j++){
+			if(cistrcmp(confname[j], line[i]) == 0)
+				break;
+		}
+		confname[j] = line[i];
+		confval[j] = cp;
+		if(j == nconf)
+			nconf++;
+	}
+}
+
+char*
+getconf(char *name)
+{
+	int i;
+
+	for(i = 0; i < nconf; i++)
+		if(cistrcmp(confname[i], name) == 0)
+			return confval[i];
+	return nil;
+}
+
+void
+setconfenv(void)
+{
+	int i;
+
+	for(i = 0; i < nconf; i++){
+		if(confname[i][0] != '*')
+			ksetenv(confname[i], confval[i], 0);
+		ksetenv(confname[i], confval[i], 1);
+	}
+}
+
+void
+writeconf(void)
+{
+	char *p, *q;
+	int n;
+
+	p = getconfenv();
+	if(waserror()) {
+		free(p);
+		nexterror();
+	}
+
+	/* convert to name=value\n format */
+	for(q=p; *q; q++) {
+		q += strlen(q);
+		*q = '=';
+		q += strlen(q);
+		*q = '\n';
+	}
+	n = q - p + 1;
+	if(n >= BOOTARGSLEN)
+		error("kernel configuration too large");
+	memmove(BOOTARGS, p, n);
+	memset(BOOTARGS+n, 0, BOOTARGSLEN-n);
+	poperror();
+	free(p);
+}
+
+int
+isaconfig(char *, int, ISAConf *)
+{
+	return 0;
+}
+
 /*
  *  starting place for first process
  */
@@ -31,6 +139,7 @@
 		else
 			ksetenv("service", "terminal", 0);
 		ksetenv("console", "0", 0);
+		setconfenv();
 		poperror();
 	}
 	kproc("alarm", alarmkproc, 0);
@@ -161,6 +270,7 @@
 		return;
 	}
 	quotefmtinstall();
+	bootargsinit();
 	meminit();
 	confinit();
 	xinit();
@@ -198,23 +308,6 @@
 	if(m->machno == 0)
 		u.r0 = 0x84000009;	/* SYSTEM RESET */
 	smccall(&u);
-}
-
-int
-isaconfig(char *, int, ISAConf *)
-{
-	return 0;
-}
-
-char*
-getconf(char *)
-{
-	return nil;
-}
-
-void
-writeconf(void)
-{
 }
 
 static void
--- a/sys/src/9/imx8/mem.h
+++ b/sys/src/9/imx8/mem.h
@@ -64,6 +64,10 @@
 #define MACHADDR(n)	(KTZERO-((n)+1)*MACHSIZE)
 
 #define CONFADDR	(VDRAM + 0x10000)	/* 0x40010000 */
+
+#define BOOTARGS	((char*)CONFADDR)
+#define BOOTARGSLEN	0x10000
+
 #define	REBOOTADDR	(VDRAM-KZERO + 0x20000)	/* 0x40020000 */
 
 #define	UZERO		0ULL			/* user segment */
--- a/sys/src/boot/reform/boot.txt
+++ b/sys/src/boot/reform/boot.txt
@@ -1,2 +1,4 @@
-load ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} ${prefix}9reform.u
-bootm ${kernel_addr_r}
+mw.b 0x40010000 0x0 0x10000
+load ${devtype} ${devnum}:${bootpart} 0x40010000 ${prefix}plan9.ini
+load ${devtype} ${devnum}:${bootpart} 0x40100000 ${prefix}9reform.u
+bootm 0x40100000