xref: /openbmc/linux/arch/x86/kernel/acpi/wakeup_32.S (revision c819e2cf)
1	.text
2#include <linux/linkage.h>
3#include <asm/segment.h>
4#include <asm/page_types.h>
5
6# Copyright 2003, 2008 Pavel Machek <pavel@suse.cz>, distribute under GPLv2
7
8	.code32
9	ALIGN
10
11ENTRY(wakeup_pmode_return)
12wakeup_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	lidt	saved_idt
22	lldt	saved_ldt
23	ljmp	$(__KERNEL_CS), $1f
241:
25	movl	%cr3, %eax
26	movl	%eax, %cr3
27	wbinvd
28
29	# and restore the stack ... but you need gdt for this to work
30	movl	saved_context_esp, %esp
31
32	movl	%cs:saved_magic, %eax
33	cmpl	$0x12345678, %eax
34	jne	bogus_magic
35
36	# jump to place where we left off
37	movl	saved_eip, %eax
38	jmp	*%eax
39
40bogus_magic:
41	jmp	bogus_magic
42
43
44
45save_registers:
46	sidt	saved_idt
47	sldt	saved_ldt
48	str	saved_tss
49
50	leal	4(%esp), %eax
51	movl	%eax, saved_context_esp
52	movl	%ebx, saved_context_ebx
53	movl	%ebp, saved_context_ebp
54	movl	%esi, saved_context_esi
55	movl	%edi, saved_context_edi
56	pushfl
57	popl	saved_context_eflags
58
59	movl	$ret_point, saved_eip
60	ret
61
62
63restore_registers:
64	movl	saved_context_ebp, %ebp
65	movl	saved_context_ebx, %ebx
66	movl	saved_context_esi, %esi
67	movl	saved_context_edi, %edi
68	pushl	saved_context_eflags
69	popfl
70	ret
71
72ENTRY(do_suspend_lowlevel)
73	call	save_processor_state
74	call	save_registers
75	pushl	$3
76	call	x86_acpi_enter_sleep_state
77	addl	$4, %esp
78
79#	In case of S3 failure, we'll emerge here.  Jump
80# 	to ret_point to recover
81	jmp	ret_point
82	.p2align 4,,7
83ret_point:
84	call	restore_registers
85	call	restore_processor_state
86	ret
87
88.data
89ALIGN
90ENTRY(saved_magic)	.long	0
91ENTRY(saved_eip)	.long	0
92
93# saved registers
94saved_idt:	.long	0,0
95saved_ldt:	.long	0
96saved_tss:	.long	0
97
98