Rev 7734 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7734 | Rev 8111 | ||
---|---|---|---|
Line 9... | Line 9... | ||
9 | ;; See file COPYING for details. ;; |
9 | ;; See file COPYING for details. ;; |
10 | ;; Copyright 2003 Ville Turjanmaa ;; |
10 | ;; Copyright 2003 Ville Turjanmaa ;; |
11 | ;; ;; |
11 | ;; ;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 13... | Line 13... | ||
13 | 13 | ||
14 | $Revision: 7734 $ |
- | |
15 | - | ||
16 | ; ACPI Generic Address Structure |
- | |
17 | struct GAS |
- | |
18 | asid db ? ; address space id |
- | |
19 | bit_width db ? |
- | |
20 | bit_offset db ? |
- | |
21 | access_size db ? |
- | |
22 | address DQ ? |
- | |
23 | ends |
- | |
24 | - | ||
25 | ASID.SYSTEM_MEMORY = 0 |
- | |
26 | ASID.SYSTEM_IO = 1 |
- | |
27 | ASID.PCI_CONFIG = 2 |
- | |
28 | ASID.PCI_EC = 3 |
- | |
29 | ASID.PCI_SMBUS = 4 |
- | |
30 | - | ||
31 | ACCESS_SIZE.UNDEFINED = 0 |
- | |
32 | ACCESS_SIZE.BYTE = 1 |
- | |
33 | ACCESS_SIZE.WORD = 2 |
- | |
34 | ACCESS_SIZE.DWORD = 3 |
- | |
Line 35... | Line 14... | ||
35 | ACCESS_SIZE.QWORD = 4 |
14 | $Revision: 8111 $ |
36 | 15 | ||
Line 37... | Line 16... | ||
37 | align 4 |
16 | align 4 |
38 | system_shutdown: ; shut down the system |
17 | system_shutdown: ; shut down the system |
39 | 18 | ||
40 | cmp byte [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
19 | cmp [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
41 | jb @F |
20 | jb @F |
42 | cmp byte [BOOT.shutdown_type], SYSTEM_RESTART |
21 | cmp [BOOT.shutdown_type], SYSTEM_RESTART |
43 | jbe .valid |
22 | jbe .valid |
44 | @@: |
23 | @@: |
Line 81... | Line 60... | ||
81 | .no_shutdown_cpus: |
60 | .no_shutdown_cpus: |
Line 82... | Line 61... | ||
82 | 61 | ||
83 | cli |
62 | cli |
Line 84... | Line 63... | ||
84 | call IRQ_mask_all |
63 | call IRQ_mask_all |
85 | 64 | ||
86 | mov eax, dword[BOOT.shutdown_type] |
65 | movzx eax, [BOOT.shutdown_type] |
Line 87... | Line 66... | ||
87 | cmp al, SYSTEM_RESTART |
66 | cmp al, SYSTEM_RESTART |
88 | jne @F |
67 | jne @F |
Line 96... | Line 75... | ||
96 | mov esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0 |
75 | mov esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0 |
97 | mov edi, OS_BASE+0x50000 |
76 | mov edi, OS_BASE+0x50000 |
98 | mov ecx, (restart_code_end - restart_code_start)/4 |
77 | mov ecx, (restart_code_end - restart_code_start)/4 |
99 | rep movsd |
78 | rep movsd |
Line 100... | Line -... | ||
100 | - | ||
101 | call create_trampoline_pgmap |
- | |
102 | mov cr3, eax |
- | |
103 | jmp @F |
- | |
104 | org $-OS_BASE |
- | |
105 | @@: |
- | |
106 | - | ||
107 | ;disable paging |
- | |
108 | - | ||
109 | mov eax, cr0 |
- | |
110 | and eax, 0x7FFFFFFF |
- | |
111 | mov cr0, eax |
- | |
112 | mov eax, cr3 |
- | |
113 | mov cr3, eax |
- | |
114 | 79 | ||
115 | cmp byte [BOOT_LO.shutdown_type], SYSTEM_SHUTDOWN |
80 | cmp [BOOT.shutdown_type], SYSTEM_SHUTDOWN |
Line 116... | Line 81... | ||
116 | jne no_acpi_power_off |
81 | jne not_power_off |
Line 117... | Line 82... | ||
117 | 82 | ||
- | 83 | ; system_power_off |
|
- | 84 | ||
118 | ; system_power_off |
85 | mov ebx, [acpi_fadt_base] |
119 | 86 | test ebx, ebx |
|
120 | mov ebx, [acpi_fadt_base-OS_BASE] |
87 | jz no_acpi |
- | 88 | cmp [ebx+ACPI_TABLE.Signature], 'FACP' |
|
- | 89 | jne no_acpi |
|
121 | cmp dword [ebx], 'FACP' |
90 | mov esi, [acpi_ssdt_base] ; first SSDT is DSDT |
122 | jne no_acpi_power_off |
91 | test esi, esi |
123 | mov esi, [acpi_dsdt_base-OS_BASE] |
92 | jz no_acpi |
124 | cmp dword [esi], 'DSDT' |
93 | cmp [esi+ACPI_TABLE.Signature], 'DSDT' |
125 | jne no_acpi_power_off |
94 | jne no_acpi |
126 | mov eax, [esi+4] ; DSDT length |
95 | mov eax, [esi+ACPI_TABLE.Length] |
127 | sub eax, 36+4 |
96 | sub eax, 36+4 |
128 | jbe no_acpi_power_off |
97 | jbe no_acpi |
129 | add esi, 36 |
98 | add esi, 36 |
130 | .scan_dsdt: |
99 | .scan_dsdt: |
Line 141... | Line 110... | ||
141 | lea esi, [esi+7] |
110 | lea esi, [esi+7] |
142 | xor ecx, ecx |
111 | xor ecx, ecx |
143 | cmp byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx |
112 | cmp byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx |
144 | jz @f |
113 | jz @f |
145 | cmp byte [esi], 0xA |
114 | cmp byte [esi], 0xA |
146 | jnz no_acpi_power_off |
115 | jnz no_acpi |
147 | inc esi |
116 | inc esi |
148 | mov cl, [esi] |
117 | mov cl, [esi] |
149 | @@: |
118 | @@: |
150 | inc esi |
119 | inc esi |
151 | cmp dl, 2 |
120 | cmp dl, 2 |
152 | jb @f |
121 | jb @f |
153 | cmp byte [esi], 0 |
122 | cmp byte [esi], 0 |
154 | jz @f |
123 | jz @f |
155 | cmp byte [esi], 0xA |
124 | cmp byte [esi], 0xA |
156 | jnz no_acpi_power_off |
125 | jnz no_acpi |
157 | inc esi |
126 | inc esi |
158 | mov ch, [esi] |
127 | mov ch, [esi] |
159 | @@: |
128 | @@: |
160 | jmp do_acpi_power_off |
129 | jmp do_acpi_power_off |
161 | .scan_dsdt_cont: |
130 | .scan_dsdt_cont: |
162 | inc esi |
131 | inc esi |
163 | dec eax |
132 | dec eax |
164 | jnz .scan_dsdt |
133 | jnz .scan_dsdt |
165 | jmp no_acpi_power_off |
134 | jmp no_acpi |
166 | do_acpi_power_off: |
135 | do_acpi_power_off: |
167 | mov edx, [ebx+48] |
136 | mov edx, [ebx+ACPI_FADT.SMI_CMD] |
168 | test edx, edx |
137 | test edx, edx |
169 | jz .nosmi |
138 | jz .nosmi |
170 | mov al, [ebx+52] |
139 | mov al, [ebx+ACPI_FADT.ACPI_ENABLE] |
171 | out dx, al |
140 | out dx, al |
172 | mov edx, [ebx+64] |
141 | mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
173 | @@: |
142 | @@: |
174 | in ax, dx |
143 | in ax, dx |
175 | test al, 1 |
144 | test al, 1 |
176 | jz @b |
145 | jz @b |
177 | .nosmi: |
146 | .nosmi: |
178 | and cx, 0x0707 |
147 | and cx, 0x0707 |
179 | shl cx, 2 |
148 | shl cx, 2 |
180 | or cx, 0x2020 |
149 | or cx, 0x2020 |
181 | mov edx, [ebx+64] |
150 | mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
182 | in ax, dx |
151 | in ax, dx |
183 | and ax, 203h |
152 | and ax, 203h |
184 | or ah, cl |
153 | or ah, cl |
185 | out dx, ax |
154 | out dx, ax |
186 | mov edx, [ebx+68] |
155 | mov edx, [ebx+ACPI_FADT.PM1b_CNT_BLK] |
187 | test edx, edx |
156 | test edx, edx |
188 | jz @f |
157 | jz @f |
189 | in ax, dx |
158 | in ax, dx |
190 | and ax, 203h |
159 | and ax, 203h |
191 | or ah, ch |
160 | or ah, ch |
192 | out dx, ax |
161 | out dx, ax |
193 | @@: |
162 | @@: |
194 | jmp $ |
163 | jmp no_acpi |
Line 195... | Line 164... | ||
195 | 164 | ||
196 | no_acpi_power_off: |
165 | not_power_off: |
197 | cmp byte[BOOT_LO.shutdown_type], SYSTEM_REBOOT |
166 | cmp [BOOT.shutdown_type], SYSTEM_REBOOT |
198 | jnz no_acpi_reboot |
167 | jnz not_reboot |
199 | ; try to reboot via ACPI fixed features |
168 | ; try to reboot via ACPI fixed features |
200 | mov ebx, [acpi_fadt_base-OS_BASE] |
169 | mov ebx, [acpi_fadt_base] |
- | 170 | test ebx, ebx |
|
- | 171 | jz no_acpi |
|
201 | cmp dword[ebx], 'FACP' |
172 | cmp [ebx+ACPI_TABLE.Signature], 'FACP' |
- | 173 | jne no_acpi |
|
- | 174 | cmp [ebx+ACPI_FADT.Length], ACPI_FADT.RESET_VALUE |
|
202 | jne no_acpi_power_off |
175 | jbe no_acpi |
203 | test dword[ebx+0x70], 1 SHL 10 ; RESET_REG_SUP |
176 | test [ebx+ACPI_FADT.Flags], 1 SHL 10 ; reset_reg_supported |
204 | jz no_acpi_reboot |
177 | jz no_acpi |
205 | cmp [ebx+0x74+GAS.asid], ASID.SYSTEM_IO |
178 | cmp [ebx+ACPI_FADT.RESET_REG.ASID], ASID.SYSTEM_IO |
206 | jnz no_acpi_reboot |
179 | jnz no_acpi |
207 | cmp [ebx+0x74+GAS.bit_width], 8 |
180 | cmp [ebx+ACPI_FADT.RESET_REG.BitWidth], 8 |
208 | jnz no_acpi_reboot |
181 | jnz no_acpi |
209 | cmp [ebx+0x74+GAS.bit_offset], 0 |
182 | cmp [ebx+ACPI_FADT.RESET_REG.BitOffset], 0 |
210 | jnz no_acpi_reboot |
183 | jnz no_acpi |
211 | cmp [ebx+0x74+GAS.access_size], ACCESS_SIZE.BYTE |
184 | cmp [ebx+ACPI_FADT.RESET_REG.AccessSize], ACCESS_SIZE.BYTE |
212 | ja no_acpi_reboot |
185 | ja no_acpi |
213 | cmp [ebx+0x74+GAS.address.hi], 0 |
186 | cmp [ebx+ACPI_FADT.RESET_REG.Address.hi], 0 |
- | 187 | jnz no_acpi |
|
214 | jnz no_acpi_reboot |
188 | ; 'enable' ACPI |
215 | mov edx, [ebx+0x74+GAS.address.lo] |
189 | mov edx, [ebx+ACPI_FADT.SMI_CMD] |
- | 190 | test edx, edx |
|
- | 191 | jz .nosmi |
|
216 | movzx eax, byte[ebx+0x80] |
192 | mov al, [ebx+ACPI_FADT.ACPI_ENABLE] |
- | 193 | out dx, al |
|
- | 194 | mov edx, [ebx+ACPI_FADT.PM1a_CNT_BLK] |
|
- | 195 | @@: |
|
- | 196 | in ax, dx |
|
217 | out dx, al |
197 | test al, 1 |
- | 198 | jz @b |
|
- | 199 | .nosmi: |
|
- | 200 | ||
- | 201 | mov edx, [ebx+ACPI_FADT.RESET_REG.Address.lo] |
|
- | 202 | movzx eax, [ebx+ACPI_FADT.RESET_VALUE] |
|
218 | jmp $ |
203 | out dx, al |
- | 204 | jmp no_acpi |
|
219 | ; unreachable |
205 | |
- | 206 | not_reboot: |
|
- | 207 | no_acpi: |
|
- | 208 | call create_trampoline_pgmap |
|
- | 209 | mov cr3, eax |
|
- | 210 | jmp @F |
|
- | 211 | org $-OS_BASE |
|
- | 212 | @@: |
|
- | 213 | ||
- | 214 | ;disable paging |
|
- | 215 | ||
- | 216 | mov eax, cr0 |
|
- | 217 | and eax, 0x7FFFFFFF |
|
- | 218 | mov cr0, eax |
|
- | 219 | mov eax, cr3 |
|
- | 220 | mov cr3, eax |
|
220 | no_acpi_reboot: |
221 | |
Line 221... | Line 222... | ||
221 | jmp 0x50000 |
222 | jmp 0x50000 |
222 | 223 | ||
223 | align 4 |
224 | align 4 |
Line 224... | Line 225... | ||
224 | restart_code_start: |
225 | restart_code_start: |
225 | org 0x50000 |
226 | org 0x50000 |
Line 226... | Line 227... | ||
226 | 227 | ||
227 | cmp byte [BOOT_LO.shutdown_type], SYSTEM_RESTART |
228 | cmp [BOOT_LO.shutdown_type], SYSTEM_RESTART |
228 | jne @F |
229 | jne @F |