acpi_wakeup_low.S revision 1.2 1 1.2 jmcneill /* $NetBSD: acpi_wakeup_low.S,v 1.2 2007/12/09 20:27:44 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
34 1.2 jmcneill .text
35 1.2 jmcneill .p2align 2, 0x90
36 1.2 jmcneill .globl acpi_md_sleep_exit
37 1.2 jmcneill acpi_md_sleep_exit:
38 1.2 jmcneill movw r_es,%ax
39 1.2 jmcneill movw %ax,%es
40 1.2 jmcneill movw r_fs,%ax
41 1.2 jmcneill movw %ax,%fs
42 1.2 jmcneill movw r_gs,%ax
43 1.2 jmcneill movw %ax,%gs
44 1.2 jmcneill movw r_ss,%ax
45 1.2 jmcneill movw %ax,%ss
46 1.2 jmcneill
47 1.2 jmcneill movl r_cr2,%eax
48 1.2 jmcneill movl %eax,%cr2
49 1.2 jmcneill movl r_cr4,%eax
50 1.2 jmcneill movl %eax,%cr4
51 1.2 jmcneill movl r_cr3,%eax
52 1.2 jmcneill movl %eax,%cr3
53 1.2 jmcneill
54 1.2 jmcneill jmp 1f
55 1.2 jmcneill 1:
56 1.2 jmcneill
57 1.2 jmcneill lidt r_idt
58 1.2 jmcneill lldt r_ldt
59 1.2 jmcneill
60 1.2 jmcneill movl CPUVAR(GDT),%eax
61 1.2 jmcneill movzwl r_tr,%edx
62 1.2 jmcneill andl $~0x0200,4(%eax,%edx, 1)
63 1.2 jmcneill ltr %dx
64 1.2 jmcneill
65 1.2 jmcneill movl r_esp,%esp
66 1.2 jmcneill
67 1.2 jmcneill movl r_ebx,%ebx
68 1.2 jmcneill movl r_ecx,%ecx
69 1.2 jmcneill movl r_edx,%edx
70 1.2 jmcneill movl r_ebp,%ebp
71 1.2 jmcneill movl r_esi,%esi
72 1.2 jmcneill movl r_edi,%edi
73 1.2 jmcneill
74 1.2 jmcneill pushl r_efl
75 1.2 jmcneill popfl
76 1.2 jmcneill
77 1.2 jmcneill movl ret_addr,%eax
78 1.2 jmcneill movl %eax,(%esp)
79 1.2 jmcneill xorl %eax,%eax
80 1.2 jmcneill
81 1.2 jmcneill ret
82 1.2 jmcneill
83 1.2 jmcneill .p2align 2, 0x90
84 1.2 jmcneill .type acpi_md_sleep_prepare, @function
85 1.2 jmcneill .globl acpi_md_sleep_prepare
86 1.2 jmcneill acpi_md_sleep_prepare:
87 1.2 jmcneill movw %ds,r_ds
88 1.2 jmcneill movw %es,r_es
89 1.2 jmcneill movw %fs,r_fs
90 1.2 jmcneill movw %gs,r_gs
91 1.2 jmcneill movw %ss,r_ss
92 1.2 jmcneill
93 1.2 jmcneill movl %ebx,r_ebx
94 1.2 jmcneill movl %ecx,r_ecx
95 1.2 jmcneill movl %edx,r_edx
96 1.2 jmcneill movl %ebp,r_ebp
97 1.2 jmcneill movl %esi,r_esi
98 1.2 jmcneill movl %edi,r_edi
99 1.2 jmcneill
100 1.2 jmcneill movl %cr0,%eax
101 1.2 jmcneill movl %eax,r_cr0
102 1.2 jmcneill movl %cr2,%eax
103 1.2 jmcneill movl %eax,r_cr2
104 1.2 jmcneill movl %cr3,%eax
105 1.2 jmcneill movl %eax,r_cr3
106 1.2 jmcneill movl %cr4,%eax
107 1.2 jmcneill movl %eax,r_cr4
108 1.2 jmcneill
109 1.2 jmcneill pushfl
110 1.2 jmcneill popl r_efl
111 1.2 jmcneill
112 1.2 jmcneill movl %esp,r_esp
113 1.2 jmcneill
114 1.2 jmcneill sgdt r_gdt
115 1.2 jmcneill sidt r_idt
116 1.2 jmcneill sldt r_ldt
117 1.2 jmcneill str r_tr
118 1.2 jmcneill
119 1.2 jmcneill movl (%esp),%eax
120 1.2 jmcneill movl %eax,ret_addr
121 1.2 jmcneill movl 4(%esp),%eax
122 1.2 jmcneill pushl %eax
123 1.2 jmcneill call acpi_md_sleep_enter
124 1.2 jmcneill /* acpi_md_sleep_enter only returns on failure. */
125 1.2 jmcneill popl %eax
126 1.2 jmcneill movl $-1,%eax
127 1.2 jmcneill ret
128 1.2 jmcneill
129 1.2 jmcneill .data
130 1.2 jmcneill .align 16
131 1.2 jmcneill .globl acpi_wakeup_ds
132 1.2 jmcneill acpi_wakeup_ds:
133 1.2 jmcneill r_ds: .word 0
134 1.2 jmcneill r_es: .word 0
135 1.2 jmcneill r_fs: .word 0
136 1.2 jmcneill r_gs: .word 0
137 1.2 jmcneill r_ss: .word 0
138 1.2 jmcneill r_tr: .word 0
139 1.2 jmcneill r_ldt: .word 0
140 1.2 jmcneill
141 1.2 jmcneill r_ebx: .long 0
142 1.2 jmcneill r_ecx: .long 0
143 1.2 jmcneill r_edx: .long 0
144 1.2 jmcneill r_ebp: .long 0
145 1.2 jmcneill r_esi: .long 0
146 1.2 jmcneill r_edi: .long 0
147 1.2 jmcneill r_esp: .long 0
148 1.2 jmcneill r_efl: .long 0
149 1.2 jmcneill
150 1.2 jmcneill .globl acpi_wakeup_cr0
151 1.2 jmcneill acpi_wakeup_cr0:
152 1.2 jmcneill r_cr0: .long 0
153 1.2 jmcneill r_cr2: .long 0
154 1.2 jmcneill r_cr3: .long 0
155 1.2 jmcneill .globl acpi_wakeup_cr4
156 1.2 jmcneill acpi_wakeup_cr4:
157 1.2 jmcneill r_cr4: .long 0
158 1.2 jmcneill
159 1.2 jmcneill .globl acpi_wakeup_gdt
160 1.2 jmcneill acpi_wakeup_gdt:
161 1.2 jmcneill r_gdt: .word 0
162 1.2 jmcneill .long 0
163 1.2 jmcneill r_idt: .word 0
164 1.2 jmcneill .long 0
165 1.2 jmcneill
166 1.2 jmcneill ret_addr: .long 0
167