diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-31 15:50:25 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-10-31 15:50:25 +0100 |
commit | 7e2e5b7a6f17c0a705eca774d82335408308f130 (patch) | |
tree | 5de5c1873337d69131f93663a8e5e23461104176 /sys/src/9/pc/main.c | |
parent | 1259fe5c38255786207588c4f708017c20b9e6ce (diff) |
kernel: add support for multiboot memory map
Diffstat (limited to 'sys/src/9/pc/main.c')
-rw-r--r-- | sys/src/9/pc/main.c | 62 |
1 files changed, 48 insertions, 14 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 @@ -33,26 +33,60 @@ uchar *sp; /* user stack of init proc */ int delaylink; static void -options(void) +multibootargs(void) { - long i, n; - char *cp, *line[MAXCONF], *p, *q; + char *cp, *ep; 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; + 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; + + multibootargs(); /* * parse configuration args from dos file plan9.ini |