Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[pandora-kernel.git] / arch / i386 / kernel / acpi / wakeup.S
index b781b38..ed0a0f2 100644 (file)
 # cs = 0x1234, eip = 0x05
 # 
 
+#define BEEP \
+       inb     $97, %al;       \
+       outb    %al, $0x80;     \
+       movb    $3, %al;        \
+       outb    %al, $97;       \
+       outb    %al, $0x80;     \
+       movb    $-74, %al;      \
+       outb    %al, $67;       \
+       outb    %al, $0x80;     \
+       movb    $-119, %al;     \
+       outb    %al, $66;       \
+       outb    %al, $0x80;     \
+       movb    $15, %al;       \
+       outb    %al, $66;
+
 ALIGN
        .align  4096
 ENTRY(wakeup_start)
@@ -31,6 +46,11 @@ wakeup_code:
        movw    %cs, %ax
        movw    %ax, %ds                                        # Make ds:0 point to wakeup_start
        movw    %ax, %ss
+
+       testl   $4, realmode_flags - wakeup_code
+       jz      1f
+       BEEP
+1:
        mov     $(wakeup_stack - wakeup_code), %sp              # Private stack is needed for ASUS board
        movw    $0x0e00 + 'S', %fs:(0x12)
 
@@ -41,7 +61,7 @@ wakeup_code:
        cmpl    $0x12345678, %eax
        jne     bogus_real_magic
 
-       testl   $1, video_flags - wakeup_code
+       testl   $1, realmode_flags - wakeup_code
        jz      1f
        lcall   $0xc000,$3
        movw    %cs, %ax
@@ -49,7 +69,7 @@ wakeup_code:
        movw    %ax, %ss
 1:
 
-       testl   $2, video_flags - wakeup_code
+       testl   $2, realmode_flags - wakeup_code
        jz      1f
        mov     video_mode - wakeup_code, %ax
        call    mode_set
@@ -88,7 +108,11 @@ wakeup_code:
        cmpl    $0x12345678, %eax
        jne     bogus_real_magic
 
-       ljmpl   $__KERNEL_CS,$wakeup_pmode_return
+       testl   $8, realmode_flags - wakeup_code
+       jz      1f
+       BEEP
+1:
+       ljmpl   $__KERNEL_CS, $wakeup_pmode_return
 
 real_save_gdt: .word 0
                .long 0
@@ -97,7 +121,8 @@ real_save_cr3:       .long 0
 real_save_cr4: .long 0
 real_magic:    .long 0
 video_mode:    .long 0
-video_flags:   .long 0
+realmode_flags:        .long 0
+beep_flags:    .long 0
 real_efer_save_restore:        .long 0
 real_save_efer_edx:    .long 0
 real_save_efer_eax:    .long 0
@@ -230,6 +255,7 @@ bogus_magic:
 #
 ENTRY(acpi_copy_wakeup_routine)
 
+       pushl   %ebx
        sgdt    saved_gdt
        sidt    saved_idt
        sldt    saved_ldt
@@ -259,10 +285,11 @@ ENTRY(acpi_copy_wakeup_routine)
 
        movl    saved_videomode, %edx
        movl    %edx, video_mode - wakeup_start (%eax)
-       movl    acpi_video_flags, %edx
-       movl    %edx, video_flags - wakeup_start (%eax)
+       movl    acpi_realmode_flags, %edx
+       movl    %edx, realmode_flags - wakeup_start (%eax)
        movl    $0x12345678, real_magic - wakeup_start (%eax)
        movl    $0x12345678, saved_magic
+       popl    %ebx
        ret
 
 save_registers: