]>
Commit | Line | Data |
---|---|---|
767a67b0 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
1da177e4 LT |
2 | .text |
3 | #include <linux/linkage.h> | |
aeb818fc | 4 | #include <linux/objtool.h> |
1da177e4 | 5 | #include <asm/segment.h> |
0341c14d JF |
6 | #include <asm/pgtable_types.h> |
7 | #include <asm/page_types.h> | |
1da177e4 | 8 | #include <asm/msr.h> |
0de80bcc | 9 | #include <asm/asm-offsets.h> |
13523309 | 10 | #include <asm/frame.h> |
f83d1a01 | 11 | #include <asm/nospec-branch.h> |
1da177e4 | 12 | |
767a67b0 | 13 | # Copyright 2003 Pavel Machek <pavel@suse.cz |
1da177e4 LT |
14 | |
15 | .code64 | |
1da177e4 | 16 | /* |
e44b7b75 | 17 | * Hooray, we are in Long 64-bit mode (but still running in low memory) |
1da177e4 | 18 | */ |
6dcc5627 | 19 | SYM_FUNC_START(wakeup_long64) |
e44b7b75 PM |
20 | movq saved_magic, %rax |
21 | movq $0x123456789abcdef0, %rdx | |
22 | cmpq %rdx, %rax | |
559ceeed | 23 | je 2f |
d8e1baf1 | 24 | |
559ceeed JS |
25 | /* stop here on a saved_magic mismatch */ |
26 | movq $0xbad6d61676963, %rcx | |
27 | 1: | |
28 | jmp 1b | |
29 | 2: | |
1da177e4 LT |
30 | movw $__KERNEL_DS, %ax |
31 | movw %ax, %ss | |
32 | movw %ax, %ds | |
33 | movw %ax, %es | |
34 | movw %ax, %fs | |
35 | movw %ax, %gs | |
7db681d7 | 36 | movq saved_rsp, %rsp |
1da177e4 | 37 | |
7db681d7 VG |
38 | movq saved_rbx, %rbx |
39 | movq saved_rdi, %rdi | |
40 | movq saved_rsi, %rsi | |
41 | movq saved_rbp, %rbp | |
1da177e4 | 42 | |
7db681d7 | 43 | movq saved_rip, %rax |
f83d1a01 | 44 | ANNOTATE_RETPOLINE_SAFE |
1da177e4 | 45 | jmp *%rax |
6dcc5627 | 46 | SYM_FUNC_END(wakeup_long64) |
1da177e4 | 47 | |
6dcc5627 | 48 | SYM_FUNC_START(do_suspend_lowlevel) |
13523309 | 49 | FRAME_BEGIN |
1da177e4 LT |
50 | subq $8, %rsp |
51 | xorl %eax, %eax | |
52 | call save_processor_state | |
53 | ||
0de80bcc | 54 | movq $saved_context, %rax |
65ea5b03 PA |
55 | movq %rsp, pt_regs_sp(%rax) |
56 | movq %rbp, pt_regs_bp(%rax) | |
57 | movq %rsi, pt_regs_si(%rax) | |
58 | movq %rdi, pt_regs_di(%rax) | |
59 | movq %rbx, pt_regs_bx(%rax) | |
60 | movq %rcx, pt_regs_cx(%rax) | |
61 | movq %rdx, pt_regs_dx(%rax) | |
0de80bcc RW |
62 | movq %r8, pt_regs_r8(%rax) |
63 | movq %r9, pt_regs_r9(%rax) | |
64 | movq %r10, pt_regs_r10(%rax) | |
65 | movq %r11, pt_regs_r11(%rax) | |
66 | movq %r12, pt_regs_r12(%rax) | |
67 | movq %r13, pt_regs_r13(%rax) | |
68 | movq %r14, pt_regs_r14(%rax) | |
69 | movq %r15, pt_regs_r15(%rax) | |
70 | pushfq | |
65ea5b03 | 71 | popq pt_regs_flags(%rax) |
1da177e4 | 72 | |
c0f6feba | 73 | movq $.Lresume_point, saved_rip(%rip) |
1da177e4 | 74 | |
0de80bcc RW |
75 | movq %rsp, saved_rsp |
76 | movq %rbp, saved_rbp | |
77 | movq %rbx, saved_rbx | |
78 | movq %rdi, saved_rdi | |
79 | movq %rsi, saved_rsi | |
1da177e4 LT |
80 | |
81 | addq $8, %rsp | |
3b6961ba LB |
82 | movl $3, %edi |
83 | xorl %eax, %eax | |
40bce100 | 84 | call x86_acpi_enter_sleep_state |
6defa2fe | 85 | /* in case something went wrong, restore the machine status and go on */ |
c0f6feba | 86 | jmp .Lresume_point |
0de80bcc | 87 | |
e6bd6760 | 88 | .align 4 |
c0f6feba | 89 | .Lresume_point: |
0de80bcc RW |
90 | /* We don't restore %rax, it must be 0 anyway */ |
91 | movq $saved_context, %rax | |
92 | movq saved_context_cr4(%rax), %rbx | |
93 | movq %rbx, %cr4 | |
94 | movq saved_context_cr3(%rax), %rbx | |
95 | movq %rbx, %cr3 | |
96 | movq saved_context_cr2(%rax), %rbx | |
97 | movq %rbx, %cr2 | |
98 | movq saved_context_cr0(%rax), %rbx | |
99 | movq %rbx, %cr0 | |
65ea5b03 | 100 | pushq pt_regs_flags(%rax) |
0de80bcc | 101 | popfq |
65ea5b03 PA |
102 | movq pt_regs_sp(%rax), %rsp |
103 | movq pt_regs_bp(%rax), %rbp | |
104 | movq pt_regs_si(%rax), %rsi | |
105 | movq pt_regs_di(%rax), %rdi | |
106 | movq pt_regs_bx(%rax), %rbx | |
107 | movq pt_regs_cx(%rax), %rcx | |
108 | movq pt_regs_dx(%rax), %rdx | |
0de80bcc RW |
109 | movq pt_regs_r8(%rax), %r8 |
110 | movq pt_regs_r9(%rax), %r9 | |
111 | movq pt_regs_r10(%rax), %r10 | |
112 | movq pt_regs_r11(%rax), %r11 | |
113 | movq pt_regs_r12(%rax), %r12 | |
114 | movq pt_regs_r13(%rax), %r13 | |
115 | movq pt_regs_r14(%rax), %r14 | |
116 | movq pt_regs_r15(%rax), %r15 | |
1da177e4 | 117 | |
d56a9ef8 | 118 | #if defined(CONFIG_KASAN) && CONFIG_KASAN_STACK |
b53f40db JP |
119 | /* |
120 | * The suspend path may have poisoned some areas deeper in the stack, | |
121 | * which we now need to unpoison. | |
122 | */ | |
123 | movq %rsp, %rdi | |
124 | call kasan_unpoison_task_stack_below | |
125 | #endif | |
126 | ||
1da177e4 LT |
127 | xorl %eax, %eax |
128 | addq $8, %rsp | |
13523309 | 129 | FRAME_END |
1da177e4 | 130 | jmp restore_processor_state |
6dcc5627 | 131 | SYM_FUNC_END(do_suspend_lowlevel) |
aeb818fc | 132 | STACK_FRAME_NON_STANDARD do_suspend_lowlevel |
e6bd6760 | 133 | |
1da177e4 | 134 | .data |
5a064d39 JS |
135 | saved_rbp: .quad 0 |
136 | saved_rsi: .quad 0 | |
137 | saved_rdi: .quad 0 | |
138 | saved_rbx: .quad 0 | |
1da177e4 | 139 | |
5a064d39 JS |
140 | saved_rip: .quad 0 |
141 | saved_rsp: .quad 0 | |
1da177e4 | 142 | |
37503f73 | 143 | SYM_DATA(saved_magic, .quad 0) |