fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / i386 / kernel / acpi / wakeup.S
index 2c5de1d..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,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
@@ -239,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
@@ -253,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
 
 
@@ -270,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