Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/kernel/acpi/wakeup_32.S
26489 views
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 <[email protected]
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
102
103