git: 9front

Download patch

ref: 987bb78b8d0bc1930615ade1b3d91ddf5648f060
parent: 7e87c3f791a92346dc2105db95f834178291ce1b
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Jun 21 00:57:27 EDT 2012

e820: support new format

--- a/sys/src/9/pc/memory.c
+++ b/sys/src/9/pc/memory.c
@@ -513,10 +513,11 @@
 typedef struct Emap Emap;
 struct Emap
 {
+	int type;
 	uvlong base;
 	uvlong len;
 };
-static Emap emap[16];
+static Emap emap[128];
 int nemap;
 
 static int
@@ -654,15 +655,23 @@
 		if((s = getconf("e820")) == nil)
 			return -1;
 	for(nemap = 0; nemap < nelem(emap); nemap++){
+		while(*s == ' ')
+			s++;
 		if(*s == 0)
 			break;
 		e = emap + nemap;
+		e->type = 1;
+		if(s[1] == ' '){	/* new format */
+			e->type = s[0] - '0';
+			s += 2;
+		}
 		e->base = strtoull(s, &s, 16);
 		if(*s != ' ')
 			break;
-		e->len = strtoull(s, &s, 16) - e->base;
-		if(*s != ' ' && *s != 0 || e->len >= 1ull<<32 || e->len == 0)
+		e->len = strtoull(s, &s, 16);
+		if(*s != ' ' && *s != 0 || e->len <= e->base)
 			break;
+		e->len -= e->base;
 	}
 	if(nemap == 0)
 		return -1;
@@ -686,7 +695,7 @@
 		if(last < e->base)
 			map(last, e->base-last, MemUPA);
 		last = base+len;
-		map(base, len, MemRAM);
+		map(base, len, (e->type == 1) ? MemRAM : MemReserved);
 	}
 	if(last < (1LL<<32))
 		map(last, (u32int)-last, MemUPA);
--