Linux 2.6.31-rc6
[linux-2.6] / arch / x86 / kernel / acpi / wakeup_32.S
1         .section .text.page_aligned
2 #include <linux/linkage.h>
3 #include <asm/segment.h>
4 #include <asm/page_types.h>
5
6 # Copyright 2003, 2008 Pavel Machek <pavel@suse.cz>, distribute under GPLv2
7
8         .code32
9         ALIGN
10
11 ENTRY(wakeup_pmode_return)
12 wakeup_pmode_return:
13         movw    $__KERNEL_DS, %ax
14         movw    %ax, %ss
15         movw    %ax, %ds
16         movw    %ax, %es
17         movw    %ax, %fs
18         movw    %ax, %gs
19
20         # reload the gdt, as we need the full 32 bit address
21         lgdt    saved_gdt
22         lidt    saved_idt
23         lldt    saved_ldt
24         ljmp    $(__KERNEL_CS), $1f
25 1:
26         movl    %cr3, %eax
27         movl    %eax, %cr3
28         wbinvd
29
30         # and restore the stack ... but you need gdt for this to work
31         movl    saved_context_esp, %esp
32
33         movl    %cs:saved_magic, %eax
34         cmpl    $0x12345678, %eax
35         jne     bogus_magic
36
37         # jump to place where we left off
38         movl    saved_eip, %eax
39         jmp     *%eax
40
41 bogus_magic:
42         jmp     bogus_magic
43
44
45
46 save_registers:
47         sgdt    saved_gdt
48         sidt    saved_idt
49         sldt    saved_ldt
50         str     saved_tss
51
52         leal    4(%esp), %eax
53         movl    %eax, saved_context_esp
54         movl    %ebx, saved_context_ebx
55         movl    %ebp, saved_context_ebp
56         movl    %esi, saved_context_esi
57         movl    %edi, saved_context_edi
58         pushfl
59         popl    saved_context_eflags
60
61         movl    $ret_point, saved_eip
62         ret
63
64
65 restore_registers:
66         movl    saved_context_ebp, %ebp
67         movl    saved_context_ebx, %ebx
68         movl    saved_context_esi, %esi
69         movl    saved_context_edi, %edi
70         pushl   saved_context_eflags
71         popfl
72         ret
73
74 ENTRY(do_suspend_lowlevel)
75         call    save_processor_state
76         call    save_registers
77         pushl   $3
78         call    acpi_enter_sleep_state
79         addl    $4, %esp
80
81 #       In case of S3 failure, we'll emerge here.  Jump
82 #       to ret_point to recover
83         jmp     ret_point
84         .p2align 4,,7
85 ret_point:
86         call    restore_registers
87         call    restore_processor_state
88         ret
89
90 .data
91 ALIGN
92 ENTRY(saved_magic)      .long   0
93 ENTRY(saved_eip)        .long   0
94
95 # saved registers
96 saved_gdt:      .long   0,0
97 saved_idt:      .long   0,0
98 saved_ldt:      .long   0
99 saved_tss:      .long   0
100