Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=829157be590af1c2555fb74c3c4db3327e3201fc
Commit:     829157be590af1c2555fb74c3c4db3327e3201fc
Parent:     4cd20952d74323df06e438c0c3273b5be89d6bfd
Author:     H. Peter Anvin <[EMAIL PROTECTED]>
AuthorDate: Wed Feb 13 11:16:46 2008 -0800
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Tue Feb 26 12:55:52 2008 +0100

    x86: handle BIOSes which terminate e820 with CF=1 and no SMAP
    
    The proper way to terminate the e820 chain is with %ebx == 0 on the
    last legitimate memory block.  However, several BIOSes don't do that
    and instead return error (CF = 1) when trying to read off the end of
    the list.  For this error return, %eax doesn't necessarily return the
    SMAP signature -- correctly so, since %ah should contain an error code
    in this case.
    
    To deal with some particularly broken BIOSes, we clear the entire e820
    chain if the SMAP signature is missing in the middle, indicating a
    plain insane e820 implementation.  However, we need to make the test
    for CF = 1 before the SMAP check.
    
    This fixes at least one HP laptop (nc6400) for which none of the
    memory-probing methods (e820, e801, 88) functioned fully according to
    spec.
    
    Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
---
 arch/x86/boot/memory.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c
index 3783539..e77d89f 100644
--- a/arch/x86/boot/memory.c
+++ b/arch/x86/boot/memory.c
@@ -37,6 +37,12 @@ static int detect_memory_e820(void)
                      "=m" (*desc)
                    : "D" (desc), "d" (SMAP), "a" (0xe820));
 
+               /* BIOSes which terminate the chain with CF = 1 as opposed
+                  to %ebx = 0 don't always report the SMAP signature on
+                  the final, failing, probe. */
+               if (err)
+                       break;
+
                /* Some BIOSes stop returning SMAP in the middle of
                   the search loop.  We don't know exactly how the BIOS
                   screwed up the map at that point, we might have a
@@ -47,9 +53,6 @@ static int detect_memory_e820(void)
                        break;
                }
 
-               if (err)
-                       break;
-
                count++;
                desc++;
        } while (next && count < E820MAX);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to