Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / arch / i386 / kernel / acpi / wakeup.S
index c43349a..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,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
@@ -268,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
 
 
@@ -285,7 +296,7 @@ ENTRY(do_suspend_lowlevel)
        call    save_registers
        pushl   $3
        call    acpi_enter_sleep_state
-       addl    $4,%esp
+       addl    $4, %esp
        ret
        .p2align 4,,7
 ret_point:
@@ -293,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