ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / x86_64 / kernel / suspend_asm.S
1 /* originally gcc generated, but now changed. don't overwrite. */
2         
3         .text
4 #include <linux/linkage.h>
5 #include <asm/segment.h>
6 #include <asm/page.h>
7
8 /* Input:
9  * rdi  resume flag 
10  */     
11                         
12 ENTRY(do_magic)
13 .LFB5:
14         subq    $8, %rsp
15 .LCFI2:
16         testl   %edi, %edi
17         jne     .L90
18         call    do_magic_suspend_1
19         call    save_processor_state
20
21         movq %rsp, saved_context_esp(%rip)
22         movq %rax, saved_context_eax(%rip)
23         movq %rbx, saved_context_ebx(%rip)
24         movq %rcx, saved_context_ecx(%rip)
25         movq %rdx, saved_context_edx(%rip)
26         movq %rbp, saved_context_ebp(%rip)
27         movq %rsi, saved_context_esi(%rip)
28         movq %rdi, saved_context_edi(%rip)
29         movq %r8,  saved_context_r08(%rip)
30         movq %r9,  saved_context_r09(%rip)
31         movq %r10, saved_context_r10(%rip)
32         movq %r11, saved_context_r11(%rip)
33         movq %r12, saved_context_r12(%rip)
34         movq %r13, saved_context_r13(%rip)
35         movq %r14, saved_context_r14(%rip)
36         movq %r15, saved_context_r15(%rip)
37         pushfq ; popq saved_context_eflags(%rip)
38
39         addq    $8, %rsp
40         jmp     do_magic_suspend_2
41 .L90:
42         /* set up cr3 */        
43         leaq    init_level4_pgt(%rip),%rax
44         subq    $__START_KERNEL_map,%rax
45         movq %rax,%cr3
46
47         movq    mmu_cr4_features(%rip), %rax
48         movq    %rax, %rdx
49         
50         andq    $~(1<<7), %rdx  # PGE
51         movq %rdx, %cr4;  # turn off PGE     
52         movq %cr3, %rcx;  # flush TLB        
53         movq %rcx, %cr3;                     
54         movq %rax, %cr4;  # turn PGE back on 
55
56         call    do_magic_resume_1
57         movl    nr_copy_pages(%rip), %eax
58         xorl    %ecx, %ecx
59         movq    $0, loop(%rip)
60         testl   %eax, %eax
61         je      .L108
62 .L105:
63         xorl    %esi, %esi
64         movq    $0, loop2(%rip)
65         jmp     .L104
66         .p2align 4,,7
67 .L111:
68         movq    loop(%rip), %rcx
69 .L104:
70         movq    pagedir_nosave(%rip), %rdx
71         movq    %rcx, %rax
72         salq    $5, %rax
73         movq    8(%rdx,%rax), %rcx
74         movq    (%rdx,%rax), %rax
75         movzbl  (%rsi,%rax), %eax
76         movb    %al, (%rsi,%rcx)
77
78         movq %cr3, %rax;  # flush TLB 
79         movq %rax, %cr3;              
80
81         movq    loop2(%rip), %rax
82         incq    %rax
83         cmpq    $4095, %rax
84         movq    %rax, %rsi
85         movq    %rax, loop2(%rip)
86         jbe     .L111
87         movq    loop(%rip), %rax
88         incq    %rax
89         movq    %rax, %rcx
90         movq    %rax, loop(%rip)
91         mov     nr_copy_pages(%rip), %eax
92         cmpq    %rax, %rcx
93         jb      .L105
94 .L108:
95         .align 4
96         movl    $24, %eax
97
98         movl %eax, %ds
99         movq saved_context_esp(%rip), %rsp
100         movq saved_context_ebp(%rip), %rbp
101         movq saved_context_eax(%rip), %rax
102         movq saved_context_ebx(%rip), %rbx
103         movq saved_context_ecx(%rip), %rcx
104         movq saved_context_edx(%rip), %rdx
105         movq saved_context_esi(%rip), %rsi
106         movq saved_context_edi(%rip), %rdi
107         movq saved_context_r08(%rip), %r8
108         movq saved_context_r09(%rip), %r9
109         movq saved_context_r10(%rip), %r10
110         movq saved_context_r11(%rip), %r11
111         movq saved_context_r12(%rip), %r12
112         movq saved_context_r13(%rip), %r13
113         movq saved_context_r14(%rip), %r14
114         movq saved_context_r15(%rip), %r15
115         pushq saved_context_eflags(%rip) ; popfq
116         call    restore_processor_state
117         addq    $8, %rsp
118         jmp     do_magic_resume_2
119
120         .section .data.nosave
121 loop:
122         .quad 0
123 loop2:  
124         .quad 0         
125         .previous