acpi_wakeup_low.S revision 1.2 1 1.2 jmcneill /* $NetBSD: acpi_wakeup_low.S,v 1.2 2007/12/09 20:27:42 jmcneill Exp $ */
2 1.2 jmcneill
3 1.2 jmcneill /*-
4 1.2 jmcneill * Copyright (c) 2007 Joerg Sonnenberger <joerg (at) netbsd.org>
5 1.2 jmcneill * Copyright (c) 2001 Takanori Watanabe <takawata (at) jp.freebsd.org>
6 1.2 jmcneill * Copyright (c) 2001 Mitsuru IWASAKI <iwasaki (at) jp.freebsd.org>
7 1.2 jmcneill * All rights reserved.
8 1.2 jmcneill *
9 1.2 jmcneill * Redistribution and use in source and binary forms, with or without
10 1.2 jmcneill * modification, are permitted provided that the following conditions
11 1.2 jmcneill * are met:
12 1.2 jmcneill * 1. Redistributions of source code must retain the above copyright
13 1.2 jmcneill * notice, this list of conditions and the following disclaimer.
14 1.2 jmcneill * 2. Redistributions in binary form must reproduce the above copyright
15 1.2 jmcneill * notice, this list of conditions and the following disclaimer in the
16 1.2 jmcneill * documentation and/or other materials provided with the distribution.
17 1.2 jmcneill *
18 1.2 jmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 1.2 jmcneill * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 1.2 jmcneill * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 1.2 jmcneill * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 1.2 jmcneill * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 1.2 jmcneill * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 1.2 jmcneill * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 1.2 jmcneill * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 1.2 jmcneill * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 1.2 jmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 1.2 jmcneill * SUCH DAMAGE.
29 1.2 jmcneill */
30 1.2 jmcneill
31 1.2 jmcneill #include "assym.h"
32 1.2 jmcneill #include <machine/asm.h>
33 1.2 jmcneill #include <machine/specialreg.h>
34 1.2 jmcneill
35 1.2 jmcneill .text
36 1.2 jmcneill .p2align 2, 0x90
37 1.2 jmcneill .globl acpi_md_sleep_exit
38 1.2 jmcneill acpi_md_sleep_exit:
39 1.2 jmcneill lgdt r_gdt
40 1.2 jmcneill
41 1.2 jmcneill xorw %ax,%ax
42 1.2 jmcneill movw %ax,%fs
43 1.2 jmcneill movw %ax,%gs
44 1.2 jmcneill
45 1.2 jmcneill movl $MSR_EFER,%ecx
46 1.2 jmcneill movl r_msr_efer,%eax
47 1.2 jmcneill wrmsr
48 1.2 jmcneill
49 1.2 jmcneill movl $MSR_FSBASE,%ecx
50 1.2 jmcneill movl r_fs_base_l,%eax
51 1.2 jmcneill movl r_fs_base_h,%edx
52 1.2 jmcneill wrmsr
53 1.2 jmcneill
54 1.2 jmcneill movl $MSR_GSBASE,%ecx
55 1.2 jmcneill movl r_gs_base_l,%eax
56 1.2 jmcneill movl r_gs_base_h,%edx
57 1.2 jmcneill wrmsr
58 1.2 jmcneill
59 1.2 jmcneill movl $MSR_KERNELGSBASE,%ecx
60 1.2 jmcneill movl r_gs_kernelbase_l,%eax
61 1.2 jmcneill movl r_gs_kernelbase_h,%edx
62 1.2 jmcneill wrmsr
63 1.2 jmcneill
64 1.2 jmcneill movq r_cr8,%rax
65 1.2 jmcneill movq %rax,%cr8
66 1.2 jmcneill movq r_cr4,%rax
67 1.2 jmcneill movq %rax,%cr4
68 1.2 jmcneill movq r_cr3,%rax
69 1.2 jmcneill movq %rax,%cr3
70 1.2 jmcneill movq r_cr2,%rax
71 1.2 jmcneill movq %rax,%cr2
72 1.2 jmcneill movq r_cr0,%rax
73 1.2 jmcneill movq %rax,%cr0
74 1.2 jmcneill
75 1.2 jmcneill jmp 1f
76 1.2 jmcneill 1:
77 1.2 jmcneill
78 1.2 jmcneill movq CPUVAR(GDT),%rax
79 1.2 jmcneill movq %rax, r_save_gdt
80 1.2 jmcneill movzwq r_tr,%rdx
81 1.2 jmcneill andq $~0x0200,4(%rax,%rdx, 1)
82 1.2 jmcneill
83 1.2 jmcneill ltr %dx
84 1.2 jmcneill lldt r_ldt
85 1.2 jmcneill lidt r_idt
86 1.2 jmcneill
87 1.2 jmcneill movq r_rsp,%rsp
88 1.2 jmcneill
89 1.2 jmcneill movq r_rbx,%rbx
90 1.2 jmcneill movq r_rbp,%rbp
91 1.2 jmcneill movq r_r12,%r12
92 1.2 jmcneill movq r_r13,%r13
93 1.2 jmcneill movq r_r14,%r14
94 1.2 jmcneill movq r_r15,%r15
95 1.2 jmcneill
96 1.2 jmcneill movq ret_addr,%rax
97 1.2 jmcneill movq %rax,(%rsp)
98 1.2 jmcneill xorq %rax,%rax
99 1.2 jmcneill
100 1.2 jmcneill pushq r_rfl
101 1.2 jmcneill popfq
102 1.2 jmcneill ret
103 1.2 jmcneill
104 1.2 jmcneill .p2align 2, 0x90
105 1.2 jmcneill .type acpi_md_sleep_prepare, @function
106 1.2 jmcneill .globl acpi_md_sleep_prepare
107 1.2 jmcneill acpi_md_sleep_prepare:
108 1.2 jmcneill movq %rbx,r_rbx
109 1.2 jmcneill movq %rbp,r_rbp
110 1.2 jmcneill movq %r12,r_r12
111 1.2 jmcneill movq %r13,r_r13
112 1.2 jmcneill movq %r14,r_r14
113 1.2 jmcneill movq %r15,r_r15
114 1.2 jmcneill
115 1.2 jmcneill movq %cr0,%rax
116 1.2 jmcneill movq %rax,r_cr0
117 1.2 jmcneill movq %cr2,%rax
118 1.2 jmcneill movq %rax,r_cr2
119 1.2 jmcneill movq %cr3,%rax
120 1.2 jmcneill movq %rax,r_cr3
121 1.2 jmcneill movq %cr4,%rax
122 1.2 jmcneill movq %rax,r_cr4
123 1.2 jmcneill movq %cr8,%rax
124 1.2 jmcneill movq %rax,r_cr8
125 1.2 jmcneill
126 1.2 jmcneill pushfq
127 1.2 jmcneill popq r_rfl
128 1.2 jmcneill
129 1.2 jmcneill movq %rsp,r_rsp
130 1.2 jmcneill
131 1.2 jmcneill movl $MSR_FSBASE,%ecx
132 1.2 jmcneill rdmsr
133 1.2 jmcneill movl %eax,r_fs_base_l
134 1.2 jmcneill movl %edx,r_fs_base_h
135 1.2 jmcneill
136 1.2 jmcneill movl $MSR_GSBASE,%ecx
137 1.2 jmcneill rdmsr
138 1.2 jmcneill movl %eax,r_gs_base_l
139 1.2 jmcneill movl %edx,r_gs_base_h
140 1.2 jmcneill
141 1.2 jmcneill movl $MSR_KERNELGSBASE,%ecx
142 1.2 jmcneill rdmsr
143 1.2 jmcneill movl %eax,r_gs_kernelbase_l
144 1.2 jmcneill movl %edx,r_gs_kernelbase_h
145 1.2 jmcneill
146 1.2 jmcneill movl $MSR_EFER,%ecx
147 1.2 jmcneill rdmsr
148 1.2 jmcneill movl %eax,r_msr_efer
149 1.2 jmcneill
150 1.2 jmcneill sgdt r_gdt
151 1.2 jmcneill sidt r_idt
152 1.2 jmcneill sldt r_ldt
153 1.2 jmcneill str r_tr
154 1.2 jmcneill
155 1.2 jmcneill movq (%rsp),%rax
156 1.2 jmcneill movq %rax,ret_addr
157 1.2 jmcneill
158 1.2 jmcneill call acpi_md_sleep_enter
159 1.2 jmcneill /* acpi_md_sleep_enter only returns on failure. */
160 1.2 jmcneill movl $-1,%eax
161 1.2 jmcneill ret
162 1.2 jmcneill
163 1.2 jmcneill .data
164 1.2 jmcneill .align 16
165 1.2 jmcneill
166 1.2 jmcneill r_tr: .word 0
167 1.2 jmcneill r_ldt: .word 0
168 1.2 jmcneill
169 1.2 jmcneill r_fs_base_l:
170 1.2 jmcneill .long 0
171 1.2 jmcneill r_fs_base_h:
172 1.2 jmcneill .long 0
173 1.2 jmcneill r_gs_base_l:
174 1.2 jmcneill .long 0
175 1.2 jmcneill r_gs_base_h:
176 1.2 jmcneill .long 0
177 1.2 jmcneill r_gs_kernelbase_l:
178 1.2 jmcneill .long 0
179 1.2 jmcneill r_gs_kernelbase_h:
180 1.2 jmcneill .long 0
181 1.2 jmcneill r_msr_efer:
182 1.2 jmcneill .long 0
183 1.2 jmcneill r_rbx: .quad 0
184 1.2 jmcneill r_rbp: .quad 0
185 1.2 jmcneill r_rsp: .quad 0
186 1.2 jmcneill r_r12: .quad 0
187 1.2 jmcneill r_r13: .quad 0
188 1.2 jmcneill r_r14: .quad 0
189 1.2 jmcneill r_r15: .quad 0
190 1.2 jmcneill r_rfl: .quad 0
191 1.2 jmcneill
192 1.2 jmcneill r_cr0: .quad 0
193 1.2 jmcneill r_cr2: .quad 0
194 1.2 jmcneill r_cr3: .quad 0
195 1.2 jmcneill r_cr4: .quad 0
196 1.2 jmcneill r_cr8: .quad 0
197 1.2 jmcneill
198 1.2 jmcneill r_gdt: .word 0
199 1.2 jmcneill .quad 0
200 1.2 jmcneill r_idt: .word 0
201 1.2 jmcneill .quad 0
202 1.2 jmcneill
203 1.2 jmcneill ret_addr: .quad 0
204 1.2 jmcneill r_save_gdt: .quad 0
205