kernel: add support for multiboot memory map

This commit is contained in:
cinap_lenrek 2013-10-31 15:50:25 +01:00
parent 1259fe5c38
commit 7e2e5b7a6f

View file

@ -32,27 +32,61 @@ int nconf;
uchar *sp; /* user stack of init proc */
int delaylink;
static void
multibootargs(void)
{
char *cp, *ep;
ulong *m, l;
extern ulong *multiboot;
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;
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;
}
}
multibootargs();
/*
* parse configuration args from dos file plan9.ini