1.text
2#include <linux/linkage.h>
3#include <asm/segment.h>
4#include <asm/page.h>
5#include <asm/pgtable_32.h>
6
7	.macro writepost,value
8		movb $0x34, %al
9		outb %al, $0x70
10		movb $\value, %al
11		outb %al, $0x71
12	.endm
13
14wakeup_start:
15	# OFW lands us here, running in protected mode, with a
16	# kernel-compatible GDT already setup.
17
18	# Clear any dangerous flags
19	pushl $0
20	popfl
21
22	writepost 0x31
23
24	# Set up %cr3
25	movl $initial_page_table - __PAGE_OFFSET, %eax
26	movl %eax, %cr3
27
28	movl saved_cr4, %eax
29	movl %eax, %cr4
30
31	movl saved_cr0, %eax
32	movl %eax, %cr0
33
34	# Control registers were modified, pipeline resync is needed
35	jmp 1f
361:
37
38	movw    $__KERNEL_DS, %ax
39	movw    %ax, %ss
40	movw    %ax, %ds
41	movw    %ax, %es
42	movw    %ax, %fs
43	movw    %ax, %gs
44
45	lgdt    saved_gdt
46	lidt    saved_idt
47	lldt    saved_ldt
48	ljmp    $(__KERNEL_CS),$1f
491:
50	movl    %cr3, %eax
51	movl    %eax, %cr3
52	wbinvd
53
54	# Go back to the return point
55	jmp ret_point
56
57save_registers:
58	sgdt  saved_gdt
59	sidt  saved_idt
60	sldt  saved_ldt
61
62	pushl %edx
63	movl %cr4, %edx
64	movl %edx, saved_cr4
65
66	movl %cr0, %edx
67	movl %edx, saved_cr0
68
69	popl %edx
70
71	movl %ebx, saved_context_ebx
72	movl %ebp, saved_context_ebp
73	movl %esi, saved_context_esi
74	movl %edi, saved_context_edi
75
76	pushfl
77	popl saved_context_eflags
78
79	ret
80
81restore_registers:
82	movl saved_context_ebp, %ebp
83	movl saved_context_ebx, %ebx
84	movl saved_context_esi, %esi
85	movl saved_context_edi, %edi
86
87	pushl saved_context_eflags
88	popfl
89
90	ret
91
92ENTRY(do_olpc_suspend_lowlevel)
93	call	save_processor_state
94	call	save_registers
95
96	# This is the stack context we want to remember
97	movl %esp, saved_context_esp
98
99	pushl	$3
100	call	xo1_do_sleep
101
102	jmp	wakeup_start
103	.p2align 4,,7
104ret_point:
105	movl    saved_context_esp, %esp
106
107	writepost 0x32
108
109	call	restore_registers
110	call	restore_processor_state
111	ret
112
113.data
114saved_gdt:             .long   0,0
115saved_idt:             .long   0,0
116saved_ldt:             .long   0
117saved_cr4:             .long   0
118saved_cr0:             .long   0
119saved_context_esp:     .long   0
120saved_context_edi:     .long   0
121saved_context_esi:     .long   0
122saved_context_ebx:     .long   0
123saved_context_ebp:     .long   0
124saved_context_eflags:  .long   0
125