Merge tag 'driver-core-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / arch / x86 / kernel / acpi / wakeup_32.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2         .text
3 #include <linux/linkage.h>
4 #include <asm/segment.h>
5 #include <asm/page_types.h>
6
7 # Copyright 2003, 2008 Pavel Machek <pavel@suse.cz
8
9         .code32
10         ALIGN
11
12 SYM_CODE_START(wakeup_pmode_return)
13         movw    $__KERNEL_DS, %ax
14         movw    %ax, %ss
15         movw    %ax, %fs
16         movw    %ax, %gs
17
18         movw    $__USER_DS, %ax
19         movw    %ax, %ds
20         movw    %ax, %es
21
22         # reload the gdt, as we need the full 32 bit address
23         lidt    saved_idt
24         lldt    saved_ldt
25         ljmp    $(__KERNEL_CS), $1f
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
39         movl    saved_eip, %eax
40         jmp     *%eax
41 SYM_CODE_END(wakeup_pmode_return)
42
43 bogus_magic:
44         jmp     bogus_magic
45
46
47
48 save_registers:
49         sidt    saved_idt
50         sldt    saved_ldt
51         str     saved_tss
52
53         leal    4(%esp), %eax
54         movl    %eax, saved_context_esp
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
63         ret
64
65
66 restore_registers:
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
74
75 SYM_CODE_START(do_suspend_lowlevel)
76         call    save_processor_state
77         call    save_registers
78         pushl   $3
79         call    x86_acpi_enter_sleep_state
80         addl    $4, %esp
81
82 #       In case of S3 failure, we'll emerge here.  Jump
83 #       to ret_point to recover
84         jmp     ret_point
85         .p2align 4,,7
86 ret_point:
87         call    restore_registers
88         call    restore_processor_state
89         ret
90 SYM_CODE_END(do_suspend_lowlevel)
91
92 .data
93 ALIGN
94 SYM_DATA(saved_magic,   .long 0)
95 saved_eip:              .long 0
96
97 # saved registers
98 saved_idt:      .long   0,0
99 saved_ldt:      .long   0
100 saved_tss:      .long   0
101