ref: 649cb3123140ce354c34f3be50d19dc7536a5425
parent: 24973780c7f0b00cb334474d58913aa923bfff4b
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Jun 22 23:16:59 EDT 2012
9boot: change to new *e820= format, support for 64bit kernels
--- a/sys/src/boot/pc/sub.c
+++ b/sys/src/boot/pc/sub.c
@@ -330,19 +330,20 @@
do{bx = e820(bx, &e);
- if(e.typ == 1 && e.len != 0 && (e.ext & 3) == 1){+ if(e.len != 0 && (e.ext & 3) == 1){ if(confend == s){/* single entry <= 1MB is useless */
- if(bx == 0 && e.len <= 0x100000)
+ if(bx == 0 && e.typ == 1 && e.len <= 0x100000)
break;
- memmove(confend, "e820=", 5);
- confend += 5;
+ memmove(confend, "*e820=", 6);
+ confend += 6;
}
+ addconfx("", 1, e.typ);v = e.base;
- addconfx("", 8, v>>32);+ addconfx(" 0x", 8, v>>32); addconfx("", 8, v&0xffffffff);v += e.len;
- addconfx(" ", 8, v>>32);+ addconfx(" 0x", 8, v>>32); addconfx("", 8, v&0xffffffff);*confend++ = ' ';
}
@@ -358,21 +359,10 @@
*confend = 0;
}
-static ushort
-beswab(ushort s)
-{- uchar *p;
-
- p = (uchar*)&s;
- return (p[0]<<8) | p[1];
-}
-
static ulong
beswal(ulong l)
{- uchar *p;
-
- p = (uchar*)&l;
+ uchar *p = (uchar*)&l;
return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
}
@@ -388,20 +378,33 @@
if(readn(f, &ex, sizeof(ex)) != sizeof(ex))
return "bad header";
- if(beswal(ex.magic) != I_MAGIC)
- return "bad magic";
e = (uchar*)(beswal(ex.entry) & ~0xF0000000UL);
+ switch(beswal(ex.magic)){+ case S_MAGIC:
+ if(readn(f, e, 8) != 8)
+ goto Error;
+ case I_MAGIC:
+ break;
+ default:
+ return "bad magic";
+ }
+
t = e;
n = beswal(ex.text);
-
if(readn(f, t, n) != n)
goto Error;
- d = (uchar*)PGROUND((ulong)t + n);
+ t += n;
+ d = (uchar*)PGROUND((ulong)t);
+ memset(t, 0, d - t);
n = beswal(ex.data);
-
if(readn(f, d, n) != n)
goto Error;
+ d += n;
+ t = (uchar*)PGROUND((ulong)d);
+ t += PGROUND(beswal(ex.bss));
+ memset(d, 0, t - d);
+
close(f);
unload();
--
⑨