Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/kernel/acpi/wakeup_32.S
10820 views
1
.section .text..page_aligned
2
#include <linux/linkage.h>
3
#include <asm/segment.h>
4
#include <asm/page_types.h>
5
6
# Copyright 2003, 2008 Pavel Machek <[email protected]>, distribute under GPLv2
7
8
.code32
9
ALIGN
10
11
ENTRY(wakeup_pmode_return)
12
wakeup_pmode_return:
13
movw $__KERNEL_DS, %ax
14
movw %ax, %ss
15
movw %ax, %ds
16
movw %ax, %es
17
movw %ax, %fs
18
movw %ax, %gs
19
20
# reload the gdt, as we need the full 32 bit address
21
lgdt saved_gdt
22
lidt saved_idt
23
lldt saved_ldt
24
ljmp $(__KERNEL_CS), $1f
25
1:
26
movl %cr3, %eax
27
movl %eax, %cr3
28
wbinvd
29
30
# and restore the stack ... but you need gdt for this to work
31
movl saved_context_esp, %esp
32
33
movl %cs:saved_magic, %eax
34
cmpl $0x12345678, %eax
35
jne bogus_magic
36
37
# jump to place where we left off
38
movl saved_eip, %eax
39
jmp *%eax
40
41
bogus_magic:
42
jmp bogus_magic
43
44
45
46
save_registers:
47
sgdt saved_gdt
48
sidt saved_idt
49
sldt saved_ldt
50
str saved_tss
51
52
leal 4(%esp), %eax
53
movl %eax, saved_context_esp
54
movl %ebx, saved_context_ebx
55
movl %ebp, saved_context_ebp
56
movl %esi, saved_context_esi
57
movl %edi, saved_context_edi
58
pushfl
59
popl saved_context_eflags
60
61
movl $ret_point, saved_eip
62
ret
63
64
65
restore_registers:
66
movl saved_context_ebp, %ebp
67
movl saved_context_ebx, %ebx
68
movl saved_context_esi, %esi
69
movl saved_context_edi, %edi
70
pushl saved_context_eflags
71
popfl
72
ret
73
74
ENTRY(do_suspend_lowlevel)
75
call save_processor_state
76
call save_registers
77
pushl $3
78
call acpi_enter_sleep_state
79
addl $4, %esp
80
81
# In case of S3 failure, we'll emerge here. Jump
82
# to ret_point to recover
83
jmp ret_point
84
.p2align 4,,7
85
ret_point:
86
call restore_registers
87
call restore_processor_state
88
ret
89
90
.data
91
ALIGN
92
ENTRY(saved_magic) .long 0
93
ENTRY(saved_eip) .long 0
94
95
# saved registers
96
saved_gdt: .long 0,0
97
saved_idt: .long 0,0
98
saved_ldt: .long 0
99
saved_tss: .long 0
100
101
102