summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-06-21 04:57:27 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-06-21 04:57:27 +0200
commitba7374508e1174ec71f86476fc7fa4f573d6890f (patch)
tree9bd1f2a238701dad40ec8e12023140fb42f85cdd
parent447b37d8387c1890df993336c441b116ada81e7b (diff)
downloadplan9front-ba7374508e1174ec71f86476fc7fa4f573d6890f.tar.xz
e820: support new format
-rw-r--r--sys/src/9/pc/memory.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/src/9/pc/memory.c b/sys/src/9/pc/memory.c
index c9f9d1e4e..c14dda4d6 100644
--- a/sys/src/9/pc/memory.c
+++ b/sys/src/9/pc/memory.c
@@ -513,10 +513,11 @@ ramscan(ulong maxmem)
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 @@ e820scan(void)
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 @@ e820scan(void)
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);