9boot: fix e820 scan
This commit is contained in:
parent
f72373eaff
commit
d8f42424ae
|
@ -4,17 +4,27 @@
|
||||||
TEXT e820(SB), $0
|
TEXT e820(SB), $0
|
||||||
MOVL bx+4(SP), BX
|
MOVL bx+4(SP), BX
|
||||||
MOVL p+8(SP), DI
|
MOVL p+8(SP), DI
|
||||||
|
MOVL $0xE820, AX
|
||||||
MOVL $0xe820, AX
|
|
||||||
MOVL $0x534D4150, DX
|
MOVL $0x534D4150, DX
|
||||||
CALL rmode16(SB)
|
CALL rmode16(SB)
|
||||||
LWI(24, rCX)
|
LWI(24, rCX)
|
||||||
BIOSCALL(0x15)
|
BIOSCALL(0x15)
|
||||||
JC _bad
|
JC _bad
|
||||||
CALL16(pmode32(SB))
|
CALL16(pmode32(SB))
|
||||||
|
CMPB CL, $24
|
||||||
|
JZ _ret
|
||||||
|
MOVL $1, AX
|
||||||
|
MOVL AX, 20(DI)
|
||||||
|
_ret:
|
||||||
MOVL BX, AX
|
MOVL BX, AX
|
||||||
RET
|
RET
|
||||||
_bad:
|
_bad:
|
||||||
CALL16(pmode32(SB))
|
CALL16(pmode32(SB))
|
||||||
XORL AX, AX
|
XORL AX, AX
|
||||||
|
MOVL AX, 0(DI)
|
||||||
|
MOVL AX, 4(DI)
|
||||||
|
MOVL AX, 8(DI)
|
||||||
|
MOVL AX, 12(DI)
|
||||||
|
MOVL AX, 16(DI)
|
||||||
|
MOVL AX, 20(DI)
|
||||||
RET
|
RET
|
||||||
|
|
|
@ -340,27 +340,35 @@ e820conf(void)
|
||||||
ulong bx;
|
ulong bx;
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
memset(&e, 0, sizeof(e));
|
bx=0;
|
||||||
if((bx = e820(0, &e)) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
s = confend;
|
s = confend;
|
||||||
memmove(confend, "e820=", 5);
|
|
||||||
confend += 5;
|
|
||||||
|
|
||||||
do{
|
do{
|
||||||
if(e.typ == 1 && (e.ext & 1) == 0 && e.len){
|
e.base = 0;
|
||||||
|
e.len = 0;
|
||||||
|
e.typ = 0;
|
||||||
|
e.ext = 1;
|
||||||
|
bx = e820(bx, &e);
|
||||||
|
if(e.typ == 1 && e.len != 0 && (e.ext & 3) == 1){
|
||||||
|
if(confend == s){
|
||||||
|
/* single entry <= 1MB is useless */
|
||||||
|
if(bx == 0 && e.len <= 0x100000)
|
||||||
|
break;
|
||||||
|
memmove(confend, "e820=", 5);
|
||||||
|
confend += 5;
|
||||||
|
}
|
||||||
v = e.base;
|
v = e.base;
|
||||||
addconfx("", 8, v>>32);
|
addconfx("", 8, v>>32);
|
||||||
addconfx("", 8, v&0xffffffff);
|
addconfx("", 8, v&0xffffffff);
|
||||||
v = e.base + e.len;
|
v += e.len;
|
||||||
addconfx(" ", 8, v>>32);
|
addconfx(" ", 8, v>>32);
|
||||||
addconfx("", 8, v&0xffffffff);
|
addconfx("", 8, v&0xffffffff);
|
||||||
*confend++ = ' ';
|
*confend++ = ' ';
|
||||||
}
|
}
|
||||||
|
} while(bx);
|
||||||
|
|
||||||
memset(&e, 0, sizeof(e));
|
if(confend == s)
|
||||||
} while(bx = e820(bx, &e));
|
return;
|
||||||
|
|
||||||
*confend = 0;
|
*confend = 0;
|
||||||
print(s); print(crnl);
|
print(s); print(crnl);
|
||||||
|
|
Loading…
Reference in a new issue