Subversion Repositories Kolibri OS

Rev

Rev 5363 | Rev 7121 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6244 serge 3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;  Shutdown for Menuet                                         ;;
7
;;                                                              ;;
8
;;  Distributed under General Public License                    ;;
9
;;  See file COPYING for details.                               ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
14
$Revision: 6244 $
15
 
6244 serge 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
57
.no_shutdown_cpus:
58
 
5032 clevermous 59
        cli
6244 serge 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]
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
195
        lidt    [.idt]
196
        lgdt    [.gdt]
5032 clevermous 197
        jmp     8:@f
6244 serge 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
220
        dd 0
221
org $ - 0x50000
5032 clevermous 222
use16
223
@@:
224
        mov     ax, 10h
225
        mov     ds, ax
226
        mov     es, ax
227
        mov     fs, ax
228
        mov     gs, ax
229
        mov     ss, ax
6244 serge 230
 
5032 clevermous 231
        mov     eax, cr0
232
        and     eax, not 80000001h
233
        mov     cr0, eax
6244 serge 234
        jmp     0x5000:.real_mode
2288 clevermous 235
 
6244 serge 236
align 4
237
.real_mode:
2288 clevermous 238
 
239
; setup stack
6244 serge 240
 
241
        mov     ax, (TMP_STACK_TOP and 0xF0000) shr 4
2288 clevermous 242
        mov     ss, ax
6244 serge 243
        mov     esp, TMP_STACK_TOP and 0xFFFF
2288 clevermous 244
 
245
;remap IRQs
246
        mov     al, 0x11
247
        out     0x20, al
248
        out     0xA0, al
249
 
250
        mov     al, 0x08
251
        out     0x21, al
252
        mov     al, 0x70
253
        out     0xA1, al
254
 
255
        mov     al, 0x04
256
        out     0x21, al
257
        mov     al, 0x02
258
        out     0xA1, al
259
 
260
        mov     al, 0x01
261
        out     0x21, al
262
        out     0xA1, al
263
 
264
        mov     al, 0xB8
265
        out     0x21, al
266
        mov     al, 0xBD
267
        out     0xA1, al
268
 
6244 serge 269
        mov     al, 00110100b
270
        out     43h, al
271
        mov     al, 0xFF
272
        out     40h, al
273
        out     40h, al
274
 
2288 clevermous 275
        xor     ax, ax
6244 serge 276
        mov     ds, ax
277
        mov     al, [0x9030]
278
        cmp     al, SYSTEM_RESTART
279
        je      .restart
2288 clevermous 280
 
6244 serge 281
        cmp     al, SYSTEM_SHUTDOWN
282
        je      .APM_PowerOff
2288 clevermous 283
 
6244 serge 284
        mov     word[0x0472], 0x1234
2288 clevermous 285
        jmp     0xF000:0xFFF0
286
 
6244 serge 287
.APM_PowerOff:
2288 clevermous 288
        mov     ax, 5304h
289
        xor     bx, bx
290
        int     15h
291
;!!!!!!!!!!!!!!!!!!!!!!!!
292
        mov     ax, 0x5300
293
        xor     bx, bx
294
        int     0x15
295
        push    ax
296
 
297
        mov     ax, 0x5301
298
        xor     bx, bx
299
        int     0x15
300
 
301
        mov     ax, 0x5308
302
        mov     bx, 1
303
        mov     cx, bx
304
        int     0x15
305
 
306
        mov     ax, 0x530E
307
        xor     bx, bx
308
        pop     cx
309
        int     0x15
310
 
311
        mov     ax, 0x530D
312
        mov     bx, 1
313
        mov     cx, bx
314
        int     0x15
315
 
316
        mov     ax, 0x530F
317
        mov     bx, 1
318
        mov     cx, bx
319
        int     0x15
320
 
321
        mov     ax, 0x5307
322
        mov     bx, 1
323
        mov     cx, 3
324
        int     0x15
325
;!!!!!!!!!!!!!!!!!!!!!!!!
6244 serge 326
        jmp     $
2288 clevermous 327
 
6244 serge 328
.restart:
2288 clevermous 329
 
330
; (hint by Black_mirror)
331
; We must read data from keyboard port,
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)
6244 serge 335
 
336
        mov     cx, 16
337
@@:
338
        in      al, 0x64
339
        test    al, 1
340
        jz      @F
2288 clevermous 341
        in      al, 0x60
6244 serge 342
        loop    @B
343
@@:
2288 clevermous 344
 
345
; bootloader interface
346
        push    0x1000
347
        pop     ds
348
        mov     si, kernel_restart_bootblock
349
        mov     ax, 'KL'
350
        jmp     0x1000:0000
351
 
6244 serge 352
align 4
353
org restart_code_start + $
354
restart_code_end:
355
 
356
org $+OS_BASE
357
use32