summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/main.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-10-31 15:50:25 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-10-31 15:50:25 +0100
commit7e2e5b7a6f17c0a705eca774d82335408308f130 (patch)
tree5de5c1873337d69131f93663a8e5e23461104176 /sys/src/9/pc/main.c
parent1259fe5c38255786207588c4f708017c20b9e6ce (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.c62
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