summaryrefslogtreecommitdiffstats
path: root/arch/i386/boot
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/boot')
-rw-r--r--arch/i386/boot/setup.S68
1 files changed, 29 insertions, 39 deletions
diff --git a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S
index 32d852efc..7553ce943 100644
--- a/arch/i386/boot/setup.S
+++ b/arch/i386/boot/setup.S
@@ -26,6 +26,10 @@
!
! Video handling moved to video.S by Martin Mares, March 1996
! <mj@k332.feld.cvut.cz>
+!
+! Extended memory detection scheme retwiddled by orc@pell.chi.il.us (david
+! parsons) to avoid loadlin confusion, July 1997
+!
#define __ASSEMBLY__
#include <linux/config.h>
@@ -241,53 +245,39 @@ loader_panic_mess:
loader_ok:
! Get memory size (extended mem, kB)
-#ifdef STANDARD_MEMORY_BIOS_CALL
- mov ah,#0x88
- int 0x15
- mov [2],ax
-#else
- push ax
- push cx
- push dx
- ! which bootloader ?
- seg cs
- mov al,byte ptr type_of_loader
- and al,#0xf0
- cmp al,#0x10
- jne try_xe801 ! not Loadlin
- seg cs
- cmp byte ptr type_of_loader,#0x16
- jbe oldstylemem ! Loadlin <= 1.6 don't like that
-try_xe801:
- mov ax,#0xe801
- int 0x15
- jc oldstylemem
+#ifndef STANDARD_MEMORY_BIOS_CALL
+ push ebx
+
+ xor ebx,ebx ! preload new memory slot with 0k
+ mov [0x1e0], ebx
+
+ mov ax,#0xe801
+ int 0x15
+ jc oldstylemem
-! memory size is (ax+(64*bx)) * 1024; we store bx+(ax/64)
+! memory size is in 1k chunksizes, to avoid confusing loadlin.
+! we store the 0xe801 memory size in a completely different place,
+! because it will most likely be longer than 16 bits.
+! (use 1e0 because that's what Larry Augustine uses in his
+! alternative new memory detection scheme, and it's sensible
+! to write everything into the same place.)
- mov [2],bx ! store extended memory size
- xor dx,dx
- mov cx,#64 ! convert lower memory size from K into
- div cx ! 64k chunks.
+ and ebx, #0xffff ! clear sign extend
+ shl ebx, 6 ! and go from 64k to 1k chunks
+ mov [0x1e0],ebx ! store extended memory size
- add [2],ax ! add lower memory into total size.
- jmp gotmem
+ and eax, #0xffff ! clear sign extend
+ add [0x1e0],eax ! and add lower memory into total size.
+
+ ! and fall into the old memory detection code to populate the
+ ! compatability slot.
+ pop ebx
oldstylemem:
+#endif
mov ah,#0x88
int 0x15
- or ax,ax ! some BIOSes report ZERO for 64meg
- mov word ptr [2],#0x400
- jz gotmem
- mov cx,#64 ! got memory size in kbytes, so we need to
- xor dx,dx ! adjust to 64k chunks for the system.
- div cx
mov [2],ax
-gotmem:
- pop dx
- pop cx
- pop ax
-#endif
! Set the keyboard repeat rate to the max