Rev 5363 | Rev 7121 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5363 | Rev 6244 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; Shutdown for Menuet ;; |
6 | ;; Shutdown for Menuet ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Distributed under General Public License ;; |
8 | ;; Distributed under General Public License ;; |
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: 6244 $ |
|
- | 15 | ||
- | 16 | align 4 |
|
- | 17 | system_shutdown: ; shut down the system |
|
- | 18 | ||
- | 19 | cmp byte [BOOT_VARS+0x9030], 1 |
|
- | 20 | jne @F |
|
- | 21 | ret |
|
- | 22 | @@: |
|
- | 23 | call stop_all_services |
|
- | 24 | ||
- | 25 | yes_shutdown_param: |
|
- | 26 | ; Shutdown other CPUs, if initialized |
|
- | 27 | cmp [ap_initialized], 0 |
|
- | 28 | jz .no_shutdown_cpus |
|
- | 29 | mov edi, [LAPIC_BASE] |
|
- | 30 | add edi, 300h |
|
- | 31 | mov esi, smpt+4 |
|
- | 32 | mov ebx, [cpu_count] |
|
- | 33 | dec ebx |
|
- | 34 | .shutdown_cpus_loop: |
|
- | 35 | lodsd |
|
- | 36 | push esi |
|
- | 37 | xor esi, esi |
|
- | 38 | inc esi |
|
- | 39 | shl eax, 24 |
|
- | 40 | mov [edi+10h], eax |
|
- | 41 | ; assert INIT IPI |
|
- | 42 | mov dword [edi], 0C500h |
|
- | 43 | call delay_ms |
|
- | 44 | @@: |
|
- | 45 | test dword [edi], 1000h |
|
- | 46 | jnz @b |
|
- | 47 | ; deassert INIT IPI |
|
- | 48 | mov dword [edi], 8500h |
|
- | 49 | call delay_ms |
|
- | 50 | @@: |
|
- | 51 | test dword [edi], 1000h |
|
- | 52 | jnz @b |
|
- | 53 | ; don't send STARTUP IPI: let other CPUs be in wait-for-startup state |
|
- | 54 | pop esi |
|
- | 55 | dec ebx |
|
- | 56 | jnz .shutdown_cpus_loop |
|
Line 14... | Line -... | ||
14 | $Revision: 5363 $ |
- | |
15 | - | ||
16 | use32 |
57 | .no_shutdown_cpus: |
- | 58 | ||
- | 59 | cli |
|
- | 60 | call IRQ_mask_all |
|
- | 61 | ||
- | 62 | mov eax, [OS_BASE + 0x9030] |
|
- | 63 | cmp al, SYSTEM_RESTART |
|
- | 64 | jne @F |
|
- | 65 | ||
- | 66 | ; load kernel.mnt to _CLEAN_ZONE |
|
- | 67 | mov ebx, kernel_file_load |
|
- | 68 | pushad |
|
- | 69 | call file_system_lfn |
|
- | 70 | popad |
|
- | 71 | @@: |
|
- | 72 | mov esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0 |
|
- | 73 | mov edi, OS_BASE+0x50000 |
|
- | 74 | mov ecx, (restart_code_end - restart_code_start)/4 |
|
- | 75 | rep movsd |
|
- | 76 | ||
- | 77 | call create_trampoline_pgmap |
|
- | 78 | mov cr3, eax |
|
- | 79 | jmp @F |
|
- | 80 | org $-OS_BASE |
|
- | 81 | @@: |
|
- | 82 | ||
- | 83 | ;disable paging |
|
- | 84 | ||
- | 85 | mov eax, cr0 |
|
- | 86 | and eax, 0x7FFFFFFF |
|
- | 87 | mov cr0, eax |
|
- | 88 | mov eax, cr3 |
|
- | 89 | mov cr3, eax |
|
- | 90 | ||
- | 91 | cmp byte [0x9030], SYSTEM_SHUTDOWN |
|
- | 92 | jne no_acpi_power_off |
|
- | 93 | ||
- | 94 | ; system_power_off |
|
- | 95 | ||
- | 96 | mov ebx, [acpi_fadt_base-OS_BASE] |
|
17 | become_real: |
97 | cmp dword [ebx], 'FACP' |
- | 98 | jne no_acpi_power_off |
|
- | 99 | mov esi, [acpi_dsdt_base-OS_BASE] |
|
- | 100 | cmp dword [esi], 'DSDT' |
|
- | 101 | jne no_acpi_power_off |
|
- | 102 | mov eax, [esi+4] ; DSDT length |
|
- | 103 | sub eax, 36+4 |
|
- | 104 | jbe no_acpi_power_off |
|
- | 105 | add esi, 36 |
|
- | 106 | .scan_dsdt: |
|
- | 107 | cmp dword [esi], '_S5_' |
|
- | 108 | jnz .scan_dsdt_cont |
|
- | 109 | cmp byte [esi+4], 12h ; DefPackage opcode |
|
- | 110 | jnz .scan_dsdt_cont |
|
- | 111 | mov dl, [esi+6] |
|
- | 112 | cmp dl, 4 ; _S5_ package must contain 4 bytes |
|
- | 113 | ; ...in theory; in practice, VirtualBox has 2 bytes |
|
- | 114 | ja .scan_dsdt_cont |
|
- | 115 | cmp dl, 1 |
|
- | 116 | jb .scan_dsdt_cont |
|
- | 117 | lea esi, [esi+7] |
|
- | 118 | xor ecx, ecx |
|
- | 119 | cmp byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx |
|
- | 120 | jz @f |
|
- | 121 | cmp byte [esi], 0xA |
|
- | 122 | jnz no_acpi_power_off |
|
- | 123 | inc esi |
|
- | 124 | mov cl, [esi] |
|
- | 125 | @@: |
|
- | 126 | inc esi |
|
- | 127 | cmp dl, 2 |
|
- | 128 | jb @f |
|
- | 129 | cmp byte [esi], 0 |
|
- | 130 | jz @f |
|
- | 131 | cmp byte [esi], 0xA |
|
- | 132 | jnz no_acpi_power_off |
|
- | 133 | inc esi |
|
- | 134 | mov ch, [esi] |
|
- | 135 | @@: |
|
- | 136 | jmp do_acpi_power_off |
|
- | 137 | .scan_dsdt_cont: |
|
- | 138 | inc esi |
|
- | 139 | dec eax |
|
- | 140 | jnz .scan_dsdt |
|
- | 141 | jmp no_acpi_power_off |
|
- | 142 | do_acpi_power_off: |
|
- | 143 | mov edx, [ebx+48] |
|
- | 144 | test edx, edx |
|
- | 145 | jz .nosmi |
|
- | 146 | mov al, [ebx+52] |
|
- | 147 | out dx, al |
|
- | 148 | mov edx, [ebx+64] |
|
- | 149 | @@: |
|
- | 150 | in ax, dx |
|
- | 151 | test al, 1 |
|
- | 152 | jz @b |
|
- | 153 | .nosmi: |
|
- | 154 | and cx, 0x0707 |
|
- | 155 | shl cx, 2 |
|
- | 156 | or cx, 0x2020 |
|
- | 157 | mov edx, [ebx+64] |
|
- | 158 | in ax, dx |
|
- | 159 | and ax, 203h |
|
- | 160 | or ah, cl |
|
- | 161 | out dx, ax |
|
- | 162 | mov edx, [ebx+68] |
|
- | 163 | test edx, edx |
|
- | 164 | jz @f |
|
- | 165 | in ax, dx |
|
- | 166 | and ax, 203h |
|
- | 167 | or ah, ch |
|
- | 168 | out dx, ax |
|
- | 169 | @@: |
|
- | 170 | jmp $ |
|
- | 171 | ||
- | 172 | no_acpi_power_off: |
|
- | 173 | jmp 0x50000 |
|
- | 174 | ||
- | 175 | align 4 |
|
- | 176 | restart_code_start: |
|
- | 177 | org 0x50000 |
|
- | 178 | ||
- | 179 | cmp byte [0x9030], SYSTEM_RESTART |
|
- | 180 | jne @F |
|
- | 181 | ||
- | 182 | mov esi, _CLEAN_ZONE-OS_BASE |
|
- | 183 | mov edi, 0x10000 |
|
- | 184 | mov ecx, 0x31000/4 |
|
- | 185 | cld |
|
- | 186 | rep movsd |
|
- | 187 | @@: |
|
- | 188 | ||
- | 189 | xor ebx, ebx |
|
- | 190 | xor edx, edx |
|
- | 191 | xor ecx, ecx |
|
- | 192 | xor esi, esi |
|
- | 193 | xor edi, edi |
|
- | 194 | xor ebp, ebp |
|
18 | cli |
195 | lidt [.idt] |
- | 196 | lgdt [.gdt] |
|
- | 197 | jmp 8:@f |
|
- | 198 | align 8 |
|
- | 199 | .gdt: |
|
- | 200 | ; selector 0 - not used |
|
- | 201 | dw 23 |
|
- | 202 | dd .gdt |
|
- | 203 | dw 0 |
|
- | 204 | ; selector 8 - code from 5000:0000 to 1000:FFFF |
|
- | 205 | dw 0FFFFh |
|
- | 206 | dw 0 |
|
- | 207 | db 5 |
|
- | 208 | db 10011011b |
|
- | 209 | db 00000000b |
|
- | 210 | db 0 |
|
- | 211 | ; selector 10h - data from 1000:0000 to 1000:FFFF |
|
- | 212 | dw 0FFFFh |
|
- | 213 | dw 0 |
|
- | 214 | db 1 |
|
- | 215 | db 10010011b |
|
- | 216 | db 00000000b |
|
- | 217 | db 0 |
|
- | 218 | .idt: |
|
- | 219 | dw 256*4 |
|
19 | lgdt [realmode_gdt-OS_BASE] |
220 | dd 0 |
20 | jmp 8:@f |
221 | org $ - 0x50000 |
21 | use16 |
222 | use16 |
22 | @@: |
223 | @@: |
23 | mov ax, 10h |
224 | mov ax, 10h |
24 | mov ds, ax |
225 | mov ds, ax |
25 | mov es, ax |
226 | mov es, ax |
26 | mov fs, ax |
227 | mov fs, ax |
- | 228 | mov gs, ax |
|
27 | mov gs, ax |
229 | mov ss, ax |
28 | mov ss, ax |
230 | |
29 | mov eax, cr0 |
231 | mov eax, cr0 |
30 | and eax, not 80000001h |
232 | and eax, not 80000001h |
Line -... | Line 233... | ||
- | 233 | mov cr0, eax |
|
31 | mov cr0, eax |
234 | jmp 0x5000:.real_mode |
Line 32... | Line 235... | ||
32 | jmp 0x1000:pr_mode_exit |
235 | |
- | 236 | align 4 |
|
33 | 237 | .real_mode: |
|
34 | pr_mode_exit: |
238 | |
35 | 239 | ; setup stack |
|
36 | ; setup stack |
- | |
37 | mov ax, 0x3000 |
- | |
38 | mov ss, ax |
- | |
Line 39... | Line -... | ||
39 | mov esp, 0x0EC00 |
- | |
40 | ; setup ds |
240 | |
41 | push cs |
241 | mov ax, (TMP_STACK_TOP and 0xF0000) shr 4 |
42 | pop ds |
242 | mov ss, ax |
43 | - | ||
44 | lidt [old_ints_h] |
243 | mov esp, TMP_STACK_TOP and 0xFFFF |
45 | ;remap IRQs |
- | |
Line 46... | Line 244... | ||
46 | mov al, 0x11 |
244 | |
47 | out 0x20, al |
245 | ;remap IRQs |
48 | call rdelay |
- | |
49 | out 0xA0, al |
246 | mov al, 0x11 |
50 | call rdelay |
247 | out 0x20, al |
51 | - | ||
Line 52... | Line 248... | ||
52 | mov al, 0x08 |
248 | out 0xA0, al |
53 | out 0x21, al |
249 | |
54 | call rdelay |
- | |
55 | mov al, 0x70 |
250 | mov al, 0x08 |
56 | out 0xA1, al |
251 | out 0x21, al |
57 | call rdelay |
- | |
Line 58... | Line 252... | ||
58 | 252 | mov al, 0x70 |
|
59 | mov al, 0x04 |
253 | out 0xA1, al |
60 | out 0x21, al |
- | |
61 | call rdelay |
254 | |
62 | mov al, 0x02 |
- | |
Line 63... | Line 255... | ||
63 | out 0xA1, al |
255 | mov al, 0x04 |
64 | call rdelay |
256 | out 0x21, al |
65 | - | ||
66 | mov al, 0x01 |
257 | mov al, 0x02 |
67 | out 0x21, al |
258 | out 0xA1, al |
68 | call rdelay |
- | |
Line -... | Line 259... | ||
- | 259 | ||
- | 260 | mov al, 0x01 |
|
- | 261 | out 0x21, al |
|
- | 262 | out 0xA1, al |
|
69 | out 0xA1, al |
263 | |
- | 264 | mov al, 0xB8 |
|
70 | call rdelay |
265 | out 0x21, al |
71 | 266 | mov al, 0xBD |
|
72 | mov al, 0xB8 |
267 | out 0xA1, al |
73 | out 0x21, al |
268 | |
74 | call rdelay |
269 | mov al, 00110100b |
75 | mov al, 0xBD |
- | |
76 | out 0xA1, al |
- | |
Line 77... | Line -... | ||
77 | sti |
- | |
78 | - | ||
79 | temp_3456: |
- | |
80 | xor ax, ax |
- | |
81 | mov es, ax |
- | |
82 | mov al, byte [es:0x9030] |
- | |
83 | cmp al, 1 |
- | |
84 | jl nbw |
- | |
85 | cmp al, 4 |
- | |
86 | jle nbw32 |
270 | out 43h, al |
87 | - | ||
88 | nbw: |
- | |
89 | in al, 0x60 |
- | |
90 | cmp al, 6 |
- | |
91 | jae nbw |
- | |
92 | mov bl, al |
- | |
93 | nbw2: |
- | |
94 | in al, 0x60 |
- | |
95 | cmp al, bl |
- | |
96 | je nbw2 |
- | |
97 | cmp al, 240;ax,240 |
- | |
98 | jne nbw31 |
- | |
99 | mov al, bl |
- | |
100 | dec ax |
- | |
101 | jmp nbw32 |
- | |
102 | nbw31: |
271 | mov al, 0xFF |
103 | add bl, 128 |
- | |
104 | cmp al, bl |
- | |
Line 105... | Line -... | ||
105 | jne nbw |
- | |
106 | sub al, 129 |
- | |
107 | - | ||
108 | nbw32: |
- | |
109 | - | ||
110 | dec ax |
- | |
111 | dec ax ; 2 = power off |
272 | out 40h, al |
112 | jnz no_apm_off |
273 | out 40h, al |
Line 113... | Line -... | ||
113 | call APM_PowerOff |
- | |
114 | jmp $ |
- | |
115 | no_apm_off: |
- | |
116 | - | ||
117 | if ~ defined extended_primary_loader ; kernel restarting is not supported |
274 | |
118 | dec ax ; 3 = reboot |
275 | xor ax, ax |
119 | jnz restart_kernel ; 4 = restart kernel |
276 | mov ds, ax |
120 | end if |
277 | mov al, [0x9030] |
121 | push 0x40 |
278 | cmp al, SYSTEM_RESTART |
122 | pop ds |
279 | je .restart |
Line 164... | Line 321... | ||
164 | mov ax, 0x5307 |
321 | mov ax, 0x5307 |
165 | mov bx, 1 |
322 | mov bx, 1 |
166 | mov cx, 3 |
323 | mov cx, 3 |
167 | int 0x15 |
324 | int 0x15 |
168 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
325 | ;!!!!!!!!!!!!!!!!!!!!!!!! |
169 | ret |
- | |
170 | - | ||
171 | if ~ defined extended_primary_loader |
- | |
172 | restart_kernel: |
- | |
173 | - | ||
174 | mov ax, 0x0003 ; set text mode for screen |
- | |
175 | int 0x10 |
- | |
176 | jmp 0x4000:0000 |
- | |
177 | - | ||
178 | restart_kernel_4000: |
- | |
179 | cli |
- | |
180 | - | ||
181 | push ds |
- | |
182 | pop es |
326 | jmp $ |
183 | mov cx, 0x8000 |
- | |
184 | push cx |
- | |
185 | push 0x7100 |
- | |
186 | pop ds |
- | |
187 | xor si, si |
- | |
188 | xor di, di |
- | |
189 | rep movsw |
- | |
190 | pop cx |
- | |
191 | mov ds, cx |
- | |
192 | push 0x2000 |
- | |
193 | pop es |
- | |
194 | rep movsw |
- | |
195 | push 0x9000 |
- | |
196 | pop ds |
- | |
197 | push 0x3000 |
- | |
198 | pop es |
- | |
199 | mov cx, 0xE000/2 |
- | |
200 | rep movsw |
- | |
201 | - | ||
202 | wbinvd ; write and invalidate cache |
- | |
Line 203... | Line -... | ||
203 | - | ||
204 | mov al, 00110100b |
- | |
205 | out 43h, al |
- | |
206 | jcxz $+2 |
- | |
207 | mov al, 0xFF |
- | |
208 | out 40h, al |
- | |
209 | jcxz $+2 |
- | |
210 | out 40h, al |
- | |
211 | jcxz $+2 |
327 | |
Line 212... | Line 328... | ||
212 | sti |
328 | .restart: |
213 | 329 | ||
214 | ; (hint by Black_mirror) |
330 | ; (hint by Black_mirror) |
215 | ; We must read data from keyboard port, |
331 | ; We must read data from keyboard port, |
216 | ; because there may be situation when previous keyboard interrupt is lost |
332 | ; because there may be situation when previous keyboard interrupt is lost |
- | 333 | ; (due to return to real mode and IRQ reprogramming) |
|
- | 334 | ; and next interrupt will not be generated (as keyboard waits for handling) |
|
- | 335 | ||
- | 336 | mov cx, 16 |
|
- | 337 | @@: |
|
- | 338 | in al, 0x64 |
|
217 | ; (due to return to real mode and IRQ reprogramming) |
339 | test al, 1 |
- | 340 | jz @F |
|
- | 341 | in al, 0x60 |
|
Line 218... | Line 342... | ||
218 | ; and next interrupt will not be generated (as keyboard waits for handling) |
342 | loop @B |
219 | in al, 0x60 |
343 | @@: |
220 | 344 | ||
221 | ; bootloader interface |
345 | ; bootloader interface |
222 | push 0x1000 |
346 | push 0x1000 |
223 | pop ds |
347 | pop ds |
224 | mov si, kernel_restart_bootblock |
- | |
Line -... | Line 348... | ||
- | 348 | mov si, kernel_restart_bootblock |
|
- | 349 | mov ax, 'KL' |
|
- | 350 | jmp 0x1000:0000 |
|
- | 351 | ||
- | 352 | align 4 |
|
- | 353 | org restart_code_start + $ |