Commit | Line | Data |
---|---|---|
767a67b0 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
ec7fd344 | 2 | .text |
1da177e4 LT |
3 | #include <linux/linkage.h> |
4 | #include <asm/segment.h> | |
0341c14d | 5 | #include <asm/page_types.h> |
1da177e4 | 6 | |
767a67b0 | 7 | # Copyright 2003, 2008 Pavel Machek <pavel@suse.cz |
1da177e4 | 8 | |
1da177e4 LT |
9 | .code32 |
10 | ALIGN | |
11 | ||
78762b0e | 12 | SYM_CODE_START(wakeup_pmode_return) |
1da177e4 LT |
13 | movw $__KERNEL_DS, %ax |
14 | movw %ax, %ss | |
1da177e4 LT |
15 | movw %ax, %fs |
16 | movw %ax, %gs | |
1da177e4 | 17 | |
ffa64eff IM |
18 | movw $__USER_DS, %ax |
19 | movw %ax, %ds | |
20 | movw %ax, %es | |
21 | ||
1da177e4 | 22 | # reload the gdt, as we need the full 32 bit address |
1da177e4 LT |
23 | lidt saved_idt |
24 | lldt saved_ldt | |
e44b7b75 | 25 | ljmp $(__KERNEL_CS), $1f |
1da177e4 LT |
26 | 1: |
27 | movl %cr3, %eax | |
28 | movl %eax, %cr3 | |
29 | wbinvd | |
30 | ||
31 | # and restore the stack ... but you need gdt for this to work | |
32 | movl saved_context_esp, %esp | |
33 | ||
34 | movl %cs:saved_magic, %eax | |
35 | cmpl $0x12345678, %eax | |
36 | jne bogus_magic | |
37 | ||
38 | # jump to place where we left off | |
e44b7b75 | 39 | movl saved_eip, %eax |
1da177e4 | 40 | jmp *%eax |
78762b0e | 41 | SYM_CODE_END(wakeup_pmode_return) |
1da177e4 LT |
42 | |
43 | bogus_magic: | |
1da177e4 LT |
44 | jmp bogus_magic |
45 | ||
46 | ||
1da177e4 | 47 | |
e44b7b75 | 48 | save_registers: |
1da177e4 LT |
49 | sidt saved_idt |
50 | sldt saved_ldt | |
51 | str saved_tss | |
52 | ||
1da177e4 LT |
53 | leal 4(%esp), %eax |
54 | movl %eax, saved_context_esp | |
e44b7b75 PM |
55 | movl %ebx, saved_context_ebx |
56 | movl %ebp, saved_context_ebp | |
57 | movl %esi, saved_context_esi | |
58 | movl %edi, saved_context_edi | |
59 | pushfl | |
60 | popl saved_context_eflags | |
61 | ||
62 | movl $ret_point, saved_eip | |
1da177e4 LT |
63 | ret |
64 | ||
65 | ||
66 | restore_registers: | |
e44b7b75 PM |
67 | movl saved_context_ebp, %ebp |
68 | movl saved_context_ebx, %ebx | |
69 | movl saved_context_esi, %esi | |
70 | movl saved_context_edi, %edi | |
71 | pushl saved_context_eflags | |
72 | popfl | |
73 | ret | |
1da177e4 | 74 | |
78762b0e | 75 | SYM_CODE_START(do_suspend_lowlevel) |
1da177e4 LT |
76 | call save_processor_state |
77 | call save_registers | |
3b6961ba | 78 | pushl $3 |
40bce100 | 79 | call x86_acpi_enter_sleep_state |
3b6961ba | 80 | addl $4, %esp |
4e6e6504 WM |
81 | |
82 | # In case of S3 failure, we'll emerge here. Jump | |
83 | # to ret_point to recover | |
84 | jmp ret_point | |
1da177e4 LT |
85 | .p2align 4,,7 |
86 | ret_point: | |
87 | call restore_registers | |
88 | call restore_processor_state | |
89 | ret | |
78762b0e | 90 | SYM_CODE_END(do_suspend_lowlevel) |
1da177e4 | 91 | |
daacf8bc | 92 | .data |
1da177e4 | 93 | ALIGN |
37503f73 | 94 | SYM_DATA(saved_magic, .long 0) |
5a064d39 | 95 | saved_eip: .long 0 |
daacf8bc | 96 | |
1da177e4 | 97 | # saved registers |
1da177e4 LT |
98 | saved_idt: .long 0,0 |
99 | saved_ldt: .long 0 | |
100 | saved_tss: .long 0 | |
101 |