Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=91c4b8cb5ab8cc3e8352739e35699c0487a6b6f3
Commit:     91c4b8cb5ab8cc3e8352739e35699c0487a6b6f3
Parent:     3f662b3f6e422a15fefcbaf4bdd21f97e6bcf32d
Author:     H. Peter Anvin <[EMAIL PROTECTED]>
AuthorDate: Thu Sep 13 14:16:37 2007 -0700
Committer:  H. Peter Anvin <[EMAIL PROTECTED]>
CommitDate: Thu Sep 20 11:06:58 2007 -0700

    [acpi] Correct the decoding of video mode numbers in wakeup.S
    
    wakeup.S looks at the video mode number from the setup header and
    looks to see if it is a VESA mode.  Unfortunately, the decoding is
    done incorrectly and it will attempt to frob the VESA BIOS for any
    mode number 0x0200 or larger.  Correct this, and remove a bunch of #if
    0'd code.
    
    Massive thanks to Jeff Chua for reporting the bug, and suffering
    though a large number of experiments in order to track this problem
    down.
    
    Cc: Pavel Machek <[EMAIL PROTECTED]>
    Signed-off-by: H. Peter Anvin <[EMAIL PROTECTED]>
---
 arch/i386/kernel/acpi/wakeup.S   |   41 ++++++++-------------------------
 arch/x86_64/kernel/acpi/wakeup.S |   47 ++++++++++---------------------------
 2 files changed, 23 insertions(+), 65 deletions(-)

diff --git a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S
index ed0a0f2..f22ba85 100644
--- a/arch/i386/kernel/acpi/wakeup.S
+++ b/arch/i386/kernel/acpi/wakeup.S
@@ -151,51 +151,30 @@ bogus_real_magic:
 #define VIDEO_FIRST_V7 0x0900
 
 # Setting of user mode (AX=mode ID) => CF=success
+
+# For now, we only handle VESA modes (0x0200..0x03ff).  To handle other
+# modes, we should probably compile in the video code from the boot
+# directory.
 mode_set:
        movw    %ax, %bx
-#if 0
-       cmpb    $0xff, %ah
-       jz      setalias
-
-       testb   $VIDEO_RECALC>>8, %ah
-       jnz     _setrec
-
-       cmpb    $VIDEO_FIRST_RESOLUTION>>8, %ah
-       jnc     setres
-       
-       cmpb    $VIDEO_FIRST_SPECIAL>>8, %ah
-       jz      setspc
-
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
-#endif
-       
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesa
-#if 0  
-       orb     %ah, %ah
-       jz      setmenu
-#endif
-       
-       decb    %ah
-#      jz      setbios                           Add bios modes later
+       subb    $VIDEO_FIRST_VESA>>8, %bh
+       cmpb    $2, %bh
+       jb      check_vesa
 
-setbad:        clc
+setbad:
+       clc
        ret
 
 check_vesa:
-       subb    $VIDEO_FIRST_VESA>>8, %bh
        orw     $0x4000, %bx                    # Use linear frame buffer
        movw    $0x4f02, %ax                    # VESA BIOS mode set call
        int     $0x10
        cmpw    $0x004f, %ax                    # AL=4f if implemented
-       jnz     _setbad                         # AH=0 if OK
+       jnz     setbad                          # AH=0 if OK
 
        stc
        ret
 
-_setbad: jmp setbad
-
        .code32
        ALIGN
 
diff --git a/arch/x86_64/kernel/acpi/wakeup.S b/arch/x86_64/kernel/acpi/wakeup.S
index 13f1480..a06f2bc 100644
--- a/arch/x86_64/kernel/acpi/wakeup.S
+++ b/arch/x86_64/kernel/acpi/wakeup.S
@@ -81,7 +81,7 @@ wakeup_code:
        testl   $2, realmode_flags - wakeup_code
        jz      1f
        mov     video_mode - wakeup_code, %ax
-       call    mode_seta
+       call    mode_set
 1:
 
        movw    $0xb800, %ax
@@ -291,52 +291,31 @@ no_longmode:
 #define VIDEO_FIRST_V7 0x0900
 
 # Setting of user mode (AX=mode ID) => CF=success
+
+# For now, we only handle VESA modes (0x0200..0x03ff).  To handle other
+# modes, we should probably compile in the video code from the boot
+# directory.
 .code16
-mode_seta:
+mode_set:
        movw    %ax, %bx
-#if 0
-       cmpb    $0xff, %ah
-       jz      setalias
-
-       testb   $VIDEO_RECALC>>8, %ah
-       jnz     _setrec
-
-       cmpb    $VIDEO_FIRST_RESOLUTION>>8, %ah
-       jnc     setres
-       
-       cmpb    $VIDEO_FIRST_SPECIAL>>8, %ah
-       jz      setspc
-
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
-#endif
-       
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesaa
-#if 0  
-       orb     %ah, %ah
-       jz      setmenu
-#endif
-       
-       decb    %ah
-#      jz      setbios                           Add bios modes later
+       subb    $VIDEO_FIRST_VESA>>8, %bh
+       cmpb    $2, %bh
+       jb      check_vesa
 
-setbada:       clc
+setbad:
+       clc
        ret
 
-check_vesaa:
-       subb    $VIDEO_FIRST_VESA>>8, %bh
+check_vesa:
        orw     $0x4000, %bx                    # Use linear frame buffer
        movw    $0x4f02, %ax                    # VESA BIOS mode set call
        int     $0x10
        cmpw    $0x004f, %ax                    # AL=4f if implemented
-       jnz     _setbada                                # AH=0 if OK
+       jnz     setbad                          # AH=0 if OK
 
        stc
        ret
 
-_setbada: jmp setbada
-
 wakeup_stack_begin:    # Stack grows down
 
 .org   0xff0
-
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