Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / i386 / kernel / acpi / wakeup.S
index 5ae7dbe..7c74fe0 100644 (file)
@@ -59,6 +59,14 @@ wakeup_code:
        movl    $swapper_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,8 +74,9 @@ wakeup_code:
        movw    %ax,%fs
        movw    $0x0e00 + 'i', %fs:(0x12)
        
-       # need a gdt
-       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
@@ -89,6 +98,9 @@ real_save_cr4:        .long 0
 real_magic:    .long 0
 video_mode:    .long 0
 video_flags:   .long 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)
@@ -223,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
@@ -253,7 +279,7 @@ save_registers:
        movl %edi, saved_context_edi
        pushfl ; popl saved_context_eflags
 
-       movl $ret_point,saved_eip
+       movl $ret_point, saved_eip
        ret
 
 
@@ -270,6 +296,7 @@ ENTRY(do_suspend_lowlevel)
        call    save_registers
        pushl   $3
        call    acpi_enter_sleep_state
+       addl    $4, %esp
        ret
        .p2align 4,,7
 ret_point:
@@ -277,12 +304,6 @@ ret_point:
        call    restore_processor_state
        ret
 
-ENTRY(do_suspend_lowlevel_s4bios)
-       call save_processor_state
-       call save_registers
-       call acpi_enter_sleep_state_s4bios
-       ret
-
 ALIGN
 # saved registers
 saved_gdt:     .long   0,0