From 7e2e5b7a6f17c0a705eca774d82335408308f130 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 31 Oct 2013 15:50:25 +0100 Subject: [PATCH] kernel: add support for multiboot memory map --- sys/src/9/pc/main.c | 64 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index c85c4f23a..3e5c3479c 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -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