vserver 1.9.3
[linux-2.6.git] / arch / x86_64 / kernel / suspend_asm.S
1 /* Originally gcc generated, modified by hand
2  *
3  * This may not use any stack, nor any variable that is not "NoSave":
4  *
5  * Its rewriting one kernel image with another. What is stack in "old"
6  * image could very well be data page in "new" image, and overwriting
7  * your own stack under you is bad idea.
8  */
9         
10         .text
11 #include <linux/linkage.h>
12 #include <asm/segment.h>
13 #include <asm/page.h>
14
15 ENTRY(swsusp_arch_suspend)
16
17         movq %rsp, saved_context_esp(%rip)
18         movq %rax, saved_context_eax(%rip)
19         movq %rbx, saved_context_ebx(%rip)
20         movq %rcx, saved_context_ecx(%rip)
21         movq %rdx, saved_context_edx(%rip)
22         movq %rbp, saved_context_ebp(%rip)
23         movq %rsi, saved_context_esi(%rip)
24         movq %rdi, saved_context_edi(%rip)
25         movq %r8,  saved_context_r08(%rip)
26         movq %r9,  saved_context_r09(%rip)
27         movq %r10, saved_context_r10(%rip)
28         movq %r11, saved_context_r11(%rip)
29         movq %r12, saved_context_r12(%rip)
30         movq %r13, saved_context_r13(%rip)
31         movq %r14, saved_context_r14(%rip)
32         movq %r15, saved_context_r15(%rip)
33         pushfq ; popq saved_context_eflags(%rip)
34
35         call swsusp_save
36         ret
37
38 ENTRY(swsusp_arch_resume)
39         /* set up cr3 */        
40         leaq    init_level4_pgt(%rip),%rax
41         subq    $__START_KERNEL_map,%rax
42         movq    %rax,%cr3
43
44         movq    mmu_cr4_features(%rip), %rax
45         movq    %rax, %rdx
46         andq    $~(1<<7), %rdx  # PGE
47         movq    %rdx, %cr4;  # turn off PGE
48         movq    %cr3, %rcx;  # flush TLB
49         movq    %rcx, %cr3;
50         movq    %rax, %cr4;  # turn PGE back on
51
52         movl    nr_copy_pages(%rip), %eax
53         xorl    %ecx, %ecx
54         movq    $0, %r10
55         testl   %eax, %eax
56         jz      done
57 .L105:
58         xorl    %esi, %esi
59         movq    $0, %r11
60         jmp     .L104
61         .p2align 4,,7
62 copy_one_page:
63         movq    %r10, %rcx
64 .L104:
65         movq    pagedir_nosave(%rip), %rdx
66         movq    %rcx, %rax
67         salq    $5, %rax
68         movq    8(%rdx,%rax), %rcx
69         movq    (%rdx,%rax), %rax
70         movzbl  (%rsi,%rax), %eax
71         movb    %al, (%rsi,%rcx)
72
73         movq    %cr3, %rax;  # flush TLB
74         movq    %rax, %cr3;
75
76         movq    %r11, %rax
77         incq    %rax
78         cmpq    $4095, %rax
79         movq    %rax, %rsi
80         movq    %rax, %r11
81         jbe     copy_one_page
82         movq    %r10, %rax
83         incq    %rax
84         movq    %rax, %rcx
85         movq    %rax, %r10
86         mov     nr_copy_pages(%rip), %eax
87         cmpq    %rax, %rcx
88         jb      .L105
89 done:
90         movl    $24, %eax
91         movl    %eax, %ds
92
93         movq saved_context_esp(%rip), %rsp
94         movq saved_context_ebp(%rip), %rbp
95         movq saved_context_eax(%rip), %rax
96         movq saved_context_ebx(%rip), %rbx
97         movq saved_context_ecx(%rip), %rcx
98         movq saved_context_edx(%rip), %rdx
99         movq saved_context_esi(%rip), %rsi
100         movq saved_context_edi(%rip), %rdi
101         movq saved_context_r08(%rip), %r8
102         movq saved_context_r09(%rip), %r9
103         movq saved_context_r10(%rip), %r10
104         movq saved_context_r11(%rip), %r11
105         movq saved_context_r12(%rip), %r12
106         movq saved_context_r13(%rip), %r13
107         movq saved_context_r14(%rip), %r14
108         movq saved_context_r15(%rip), %r15
109         pushq saved_context_eflags(%rip) ; popfq
110         call    swsusp_restore
111         ret