Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / arch / i386 / kernel / acpi / wakeup.S
index c43349a..b781b38 100644 (file)
@@ -56,9 +56,17 @@ wakeup_code:
 1:
 
        # set up page table
-       movl    $swapper_pg_dir-__PAGE_OFFSET, %eax
+       movl    $swsusp_pg_dir-__PAGE_OFFSET, %eax
        movl    %eax, %cr3
 
+       testl   $1, real_efer_save_restore - wakeup_code
+       jz      4f
+       # restore efer setting
+       movl    real_save_efer_edx - wakeup_code, %edx
+       movl    real_save_efer_eax - wakeup_code, %eax
+       mov     $0xc0000080, %ecx
+       wrmsr
+4:
        # make sure %cr4 is set correctly (features, etc)
        movl    real_save_cr4 - wakeup_code, %eax
        movl    %eax, %cr4
@@ -66,15 +74,9 @@ wakeup_code:
        movw    %ax,%fs
        movw    $0x0e00 + 'i', %fs:(0x12)
        
-       # need a gdt
-       #use the gdt copied in this low mem
-       lea     temp_gdt_table - wakeup_code, %eax
-       xor     %ebx, %ebx
-       movw    %ds, %bx
-       shll    $4, %ebx
-       addl    %ebx, %eax
-       movl    %eax, real_save_gdt + 2 - wakeup_code
-       lgdt    real_save_gdt - wakeup_code
+       # need a gdt -- use lgdtl to force 32-bit operands, in case
+       # the GDT is located past 16 megabytes.
+       lgdtl   real_save_gdt - wakeup_code
 
        movl    real_save_cr0 - wakeup_code, %eax
        movl    %eax, %cr0
@@ -96,7 +98,9 @@ real_save_cr4:        .long 0
 real_magic:    .long 0
 video_mode:    .long 0
 video_flags:   .long 0
-temp_gdt_table: .fill GDT_ENTRIES, 8, 0
+real_efer_save_restore:        .long 0
+real_save_efer_edx:    .long 0
+real_save_efer_eax:    .long 0
 
 bogus_real_magic:
        movw    $0x0e00 + 'B', %fs:(0x12)
@@ -231,6 +235,20 @@ ENTRY(acpi_copy_wakeup_routine)
        sldt    saved_ldt
        str     saved_tss
 
+       movl    nx_enabled, %edx
+       movl    %edx, real_efer_save_restore - wakeup_start (%eax)
+       testl   $1, real_efer_save_restore - wakeup_start (%eax)
+       jz      2f
+       # save efer setting
+       pushl   %eax
+       movl    %eax, %ebx
+       mov     $0xc0000080, %ecx
+       rdmsr
+       movl    %edx, real_save_efer_edx - wakeup_start (%ebx)
+       movl    %eax, real_save_efer_eax - wakeup_start (%ebx)
+       popl    %eax
+2:
+
        movl    %cr3, %edx
        movl    %edx, real_save_cr3 - wakeup_start (%eax)
        movl    %cr4, %edx
@@ -239,13 +257,6 @@ ENTRY(acpi_copy_wakeup_routine)
        movl    %edx, real_save_cr0 - wakeup_start (%eax)
        sgdt    real_save_gdt - wakeup_start (%eax)
 
-       # gdt wont be addressable from real mode in 4g4g split
-       # copying it to the lower mem
-       xor     %ecx, %ecx
-       movw    saved_gdt, %cx
-       movl    saved_gdt + 2, %esi     
-       lea     temp_gdt_table - wakeup_start (%eax), %edi      
-       rep movsb
        movl    saved_videomode, %edx
        movl    %edx, video_mode - wakeup_start (%eax)
        movl    acpi_video_flags, %edx
@@ -254,11 +265,6 @@ ENTRY(acpi_copy_wakeup_routine)
        movl    $0x12345678, saved_magic
        ret
 
-.data
-ALIGN
-ENTRY(saved_magic)     .long   0
-ENTRY(saved_eip)       .long   0
-
 save_registers:
        leal    4(%esp), %eax
        movl    %eax, saved_context_esp
@@ -268,7 +274,7 @@ save_registers:
        movl %edi, saved_context_edi
        pushfl ; popl saved_context_eflags
 
-       movl $ret_point,saved_eip
+       movl $ret_point, saved_eip
        ret
 
 
@@ -285,21 +291,22 @@ ENTRY(do_suspend_lowlevel)
        call    save_registers
        pushl   $3
        call    acpi_enter_sleep_state
-       addl    $4,%esp
-       ret
+       addl    $4, %esp
+
+#      In case of S3 failure, we'll emerge here.  Jump
+#      to ret_point to recover
+       jmp     ret_point
        .p2align 4,,7
 ret_point:
        call    restore_registers
        call    restore_processor_state
        ret
 
-ENTRY(do_suspend_lowlevel_s4bios)
-       call save_processor_state
-       call save_registers
-       call acpi_enter_sleep_state_s4bios
-       ret
-
+.data
 ALIGN
+ENTRY(saved_magic)     .long   0
+ENTRY(saved_eip)       .long   0
+
 # saved registers
 saved_gdt:     .long   0,0
 saved_idt:     .long   0,0