shithub: riscv

Download patch

ref: 7e2e5b7a6f17c0a705eca774d82335408308f130
parent: 1259fe5c38255786207588c4f708017c20b9e6ce
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Oct 31 11:50:25 EDT 2013

kernel: add support for multiboot memory map

--- a/sys/src/9/pc/main.c
+++ b/sys/src/9/pc/main.c
@@ -33,26 +33,60 @@
 int delaylink;
 
 static void
-options(void)
+multibootargs(void)
 {
-	long i, n;
-	char *cp, *line[MAXCONF], *p, *q;
+	char *cp, *ep;
 	ulong *m, l;
+
 	extern ulong *multiboot;
 
-	if(multiboot != nil){
-		cp = BOOTARGS;
-		*cp = 0;
-		if((*multiboot & 8) != 0 && multiboot[5] > 0){
-			m = KADDR(multiboot[6]);
-			l = m[1] - m[0];
-			m = KADDR(m[0]);
-			if(l >= BOOTARGSLEN)
-				l = BOOTARGSLEN - 1;
-			memmove(cp, m, l);
-			cp[l] = 0;
+	if(multiboot == nil)
+		return;
+
+	/* command line */
+	if((multiboot[0] & (1<<2)) != 0)
+		strncpy(BOOTLINE, KADDR(multiboot[4]), BOOTLINELEN-1);
+
+	cp = BOOTARGS;
+	ep = cp + BOOTARGSLEN-1;
+
+	/* memory map */
+	if((multiboot[0] & (1<<6)) != 0 && (l = multiboot[11]) >= 24){
+		cp = seprint(cp, ep, "*e820=");
+		m = KADDR(multiboot[12]);
+		while(m[0] >= 20 && m[0] <= l-4){
+			uvlong base, size;
+			m++;
+			base = ((uvlong)m[0] | (uvlong)m[1]<<32);
+			size = ((uvlong)m[2] | (uvlong)m[3]<<32);
+			cp = seprint(cp, ep, "%.1x %.16llux %.16llux ",
+				m[4] & 0xF, base, base+size);
+			l -= m[-1]+4;
+			m = (ulong*)((ulong)m + m[-1]);
 		}
+		cp[-1] = '\n';
 	}
+
+	/* plan9.ini passed as the first module */
+	if((multiboot[0] & (1<<3)) != 0 && multiboot[5] > 0){
+		m = KADDR(multiboot[6]);
+		l = m[1] - m[0];
+		m = KADDR(m[0]);
+		if(cp+l > ep)
+			l = ep - cp;
+		memmove(cp, m, l);
+		cp += l;
+	}
+	*cp = 0;
+}
+
+static void
+options(void)
+{
+	long i, n;
+	char *cp, *line[MAXCONF], *p, *q;
+
+	multibootargs();
 
 	/*
 	 *  parse configuration args from dos file plan9.ini
--