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);
--
⑨