summaryrefslogtreecommitdiff
path: root/sys/src/boot
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-04-20 13:19:06 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-04-20 13:19:06 +0000
commiteeb0a660244d28067d92660bd4bde598d64805b5 (patch)
tree2808c4ed6d6b03a0acea6d503072da8e96fd18ba /sys/src/boot
parent999cc5fd21233eff058377a58db6839a245225f0 (diff)
9boot: oops, it all was just a20 gate not being enabled
Diffstat (limited to 'sys/src/boot')
-rw-r--r--sys/src/boot/pc/a20.s8
-rw-r--r--sys/src/boot/pc/pxe.c10
-rw-r--r--sys/src/boot/pc/sub.c17
3 files changed, 18 insertions, 17 deletions
diff --git a/sys/src/boot/pc/a20.s b/sys/src/boot/pc/a20.s
index 53b7af5cb..0455a5952 100644
--- a/sys/src/boot/pc/a20.s
+++ b/sys/src/boot/pc/a20.s
@@ -14,6 +14,14 @@ TEXT a20(SB), $0
_biosfail:
CALL16(pmode32(SB))
+ /* fast a20 */
+ MOVL $0x92, DX
+ INB
+ ANDB $0xFE, AX
+ ORB $0x02, AX
+ OUTB
+
+ /* slow a20 */
CALL a20wait(SB)
MOVL $0x64, DX
MOVB $0xAD, AL
diff --git a/sys/src/boot/pc/pxe.c b/sys/src/boot/pc/pxe.c
index 5fefd72b0..a950b2579 100644
--- a/sys/src/boot/pc/pxe.c
+++ b/sys/src/boot/pc/pxe.c
@@ -113,8 +113,14 @@ unload(void)
uchar status[2];
uchar junk[10];
} buf;
- memset(&buf, 0, sizeof(buf));
- pxecall(0x70, &buf);
+ static uchar shutdown[] = { 0x05, 0x070, 0x02, 0 };
+ uchar *o;
+
+ for(o = shutdown; *o; o++){
+ memset(&buf, 0, sizeof(buf));
+ if(pxecall(*o, &buf))
+ break;
+ }
}
static int
diff --git a/sys/src/boot/pc/sub.c b/sys/src/boot/pc/sub.c
index 40a77fd3b..02d75aed5 100644
--- a/sys/src/boot/pc/sub.c
+++ b/sys/src/boot/pc/sub.c
@@ -212,30 +212,17 @@ bootkern(void *f)
if(beswal(ex.magic) != I_MAGIC)
return "bad magic";
- /* load address */
e = (uchar*)(beswal(ex.entry) & ~0xF0000000UL);
-
- /*
- * the kernels load addess (entry) might overlap
- * with some bios memory (pxe) that is needed to load
- * it. so we read it to this address and after
- * we finished, move it to final location.
- */
- t = (uchar*)0x200000;
-
+ t = e;
n = beswal(ex.text);
if(readn(f, t, n) != n)
goto Error;
- d = t + ((uchar*)PGROUND((ulong)e + n) - e);
+ d = (uchar*)PGROUND((ulong)t + n);
n = beswal(ex.data);
if(readn(f, d, n) != n)
goto Error;
close(f);
-
unload();
-
- n = (d + n) - t;
- memmove(e, t, n);
jump(e);
Error:
return "i/o error";