e820: support new format

This commit is contained in:
cinap_lenrek 2012-06-21 04:57:27 +02:00
parent 447b37d838
commit ba7374508e

View file

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