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

source code of linux/arch/x86/platform/olpc/xo1-wakeup.S