2000-12-20 00:47:31

by Marc Joosen

[permalink] [raw]
Subject: [PATCH] e820 memory detection fix for ThinkPad



Hi Alan, lkml-readers,

This is a tiny patch to make the int15/e820 memory mapping work on IBM
ThinkPads. Until now, I have had to give lilo a mem= option with one meg
of RAM less than I actually have, so ACPI events don't overwrite any
data. The only alternative was to use one of the patches available on
http://www.pell.portland.or.us/~orc/Memory/, but these are quite big. I
tracked down the problem, at least for the ThinkPad 600X (2645-4EU), to
arch/i386/boot/setup.S: apparently the bios doesn't retain the value of
register %edx, so after the first entry is read the ascii word `SMAP' is
lost and further entries won't be recognized. The solution is simple,
just move the assignment 6 lines down so it's inside the loop that is
done for every entry.
This patch is for 2.4.0-test7..12, but it should work for pre13
kernels and even 2.2 kernels with the memory map backport:

--- linux/arch/i386/boot/setup.S.orig Sat Dec 9 05:56:07 2000
+++ linux/arch/i386/boot/setup.S Sat Dec 9 06:43:03 2000
@@ -292,7 +292,6 @@
#

meme820:
- movl $0x534d4150, %edx # ascii `SMAP'
xorl %ebx, %ebx # continuation counter
movw $E820MAP, %di # point into the whitelist
# so we can have the bios
@@ -300,6 +299,7 @@

jmpe820:
movl $0x0000e820, %eax # e820, upper word zeroed
+ movl $0x534d4150, %edx # ascii `SMAP'
movl $20, %ecx # size of the e820rec
pushw %ds # data record.
popw %es

(I hope it came through properly... it may have been Lotus-Notified.)
My ThinkPad now shows this during boot:

Linux version 2.4.0-test12 (mjoosen@hexane) (gcc version 2.95.2 19991024 (release)) #2 Sun Dec 10 23:51:04 EST 2000
BIOS-provided physical RAM map:
BIOS-e820: 000000000009fc00 @ 0000000000000000 (usable)
BIOS-e820: 0000000000000400 @ 000000000009fc00 (reserved)
BIOS-e820: 0000000000010000 @ 00000000000f0000 (reserved)
BIOS-e820: 000000000bed0000 @ 0000000000100000 (usable)
BIOS-e820: 000000000000f000 @ 000000000bfd0000 (ACPI data)
BIOS-e820: 0000000000001000 @ 000000000bfdf000 (ACPI NVS)
BIOS-e820: 0000000000020000 @ 000000000bfe0000 (reserved)
BIOS-e820: 0000000000020000 @ 00000000fffe0000 (reserved)
Scan SMP from c0000000 for 1024 bytes.
Scan SMP from c009fc00 for 1024 bytes.
Scan SMP from c00f0000 for 65536 bytes.
Scan SMP from c009f800 for 4096 bytes.
...

and that's without a mem= option to lilo, of course. May I suggest you
try this patch in the next 2.[24]-pre kernel? Thanks!

BTW: I work for IBM, but I'm not in the PC department (or even
ThinkPad development). Unfortunately I won't be able to answer all your
IBM-related questions...
BTW2: I'm not on the linux-kernel mailing list, so please reply to
<mjoosen @ us.ibm.com> (remove anti-spam spacing).


Regards,

--
Marc Joosen
Communication Link Design
IBM T.J. Watson Research Center
Yorktown Heights, NY



2000-12-20 03:18:07

by David Weinehall

[permalink] [raw]
Subject: Re: [PATCH] e820 memory detection fix for ThinkPad

On Tue, Dec 19, 2000 at 07:16:40PM -0500, Marc Joosen wrote:
>
>
> Hi Alan, lkml-readers,
>
> This is a tiny patch to make the int15/e820 memory mapping work on IBM
> ThinkPads. Until now, I have had to give lilo a mem= option with one meg
> of RAM less than I actually have, so ACPI events don't overwrite any
> data. The only alternative was to use one of the patches available on
> http://www.pell.portland.or.us/~orc/Memory/, but these are quite big. I
> tracked down the problem, at least for the ThinkPad 600X (2645-4EU), to
> arch/i386/boot/setup.S: apparently the bios doesn't retain the value of
> register %edx, so after the first entry is read the ascii word `SMAP' is
> lost and further entries won't be recognized. The solution is simple,
> just move the assignment 6 lines down so it's inside the loop that is
> done for every entry.
> This patch is for 2.4.0-test7..12, but it should work for pre13
> kernels and even 2.2 kernels with the memory map backport:
>
> --- linux/arch/i386/boot/setup.S.orig Sat Dec 9 05:56:07 2000
> +++ linux/arch/i386/boot/setup.S Sat Dec 9 06:43:03 2000
> @@ -292,7 +292,6 @@
> #
>
> meme820:
> - movl $0x534d4150, %edx # ascii `SMAP'
> xorl %ebx, %ebx # continuation counter
> movw $E820MAP, %di # point into the whitelist
> # so we can have the bios
> @@ -300,6 +299,7 @@
>
> jmpe820:
> movl $0x0000e820, %eax # e820, upper word zeroed
> + movl $0x534d4150, %edx # ascii `SMAP'
> movl $20, %ecx # size of the e820rec
> pushw %ds # data record.
> popw %es

If this simple patch solves your problem, great! But in that case,
PLEASE add a note telling WHY the assignment is done for every
iteration; else some smarthead will probably submit a patch someday
in the future along the lines of "assigning this only once makes the
loop faster"...

Anyhow, good spotting!


Regards: David Weinehall
_ _
// David Weinehall <[email protected]> /> Northern lights wander \\
// Project MCA Linux hacker // Dance across the winter sky //
\> http://www.acc.umu.se/~tao/ </ Full colour fire </