Subversion Repositories Kolibri OS

Rev

Rev 7129 | Rev 7734 | 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: 7132 $
15
 
6244 serge 16
align 4
17
system_shutdown:          ; shut down the system
18
 
7132 dunkaist 19
        cmp     byte [BOOT.shutdown_type], SYSTEM_SHUTDOWN
7121 dunkaist 20
        jb      @F
7132 dunkaist 21
        cmp     byte [BOOT.shutdown_type], SYSTEM_RESTART
7121 dunkaist 22
        jbe     .valid
23
@@:
6244 serge 24
        ret
7121 dunkaist 25
.valid:
6244 serge 26
        call    stop_all_services
27
 
28
yes_shutdown_param:
29
; Shutdown other CPUs, if initialized
30
        cmp     [ap_initialized], 0
31
        jz      .no_shutdown_cpus
32
        mov     edi, [LAPIC_BASE]
33
        add     edi, 300h
34
        mov     esi, smpt+4
35
        mov     ebx, [cpu_count]
36
        dec     ebx
37
.shutdown_cpus_loop:
38
        lodsd
39
        push    esi
40
        xor     esi, esi
41
        inc     esi
42
        shl     eax, 24
43
        mov     [edi+10h], eax
44
; assert INIT IPI
45
        mov     dword [edi], 0C500h
46
        call    delay_ms
47
@@:
48
        test    dword [edi], 1000h
49
        jnz     @b
50
; deassert INIT IPI
51
        mov     dword [edi], 8500h
52
        call    delay_ms
53
@@:
54
        test    dword [edi], 1000h
55
        jnz     @b
56
; don't send STARTUP IPI: let other CPUs be in wait-for-startup state
57
        pop     esi
58
        dec     ebx
59
        jnz     .shutdown_cpus_loop
60
.no_shutdown_cpus:
61
 
5032 clevermous 62
        cli
6244 serge 63
        call    IRQ_mask_all
64
 
7132 dunkaist 65
        mov     eax, dword[BOOT.shutdown_type]
6244 serge 66
        cmp     al, SYSTEM_RESTART
67
        jne     @F
68
 
69
; load kernel.mnt to _CLEAN_ZONE
70
        mov     ebx, kernel_file_load
71
        pushad
72
        call    file_system_lfn
73
        popad
74
@@:
75
        mov     esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0
76
        mov     edi, OS_BASE+0x50000
77
        mov     ecx, (restart_code_end - restart_code_start)/4
78
        rep movsd
79
 
80
        call    create_trampoline_pgmap
81
        mov     cr3, eax
82
        jmp     @F
83
org $-OS_BASE
84
@@:
85
 
86
;disable paging
87
 
88
        mov     eax, cr0
89
        and     eax, 0x7FFFFFFF
90
        mov     cr0, eax
91
        mov     eax, cr3
92
        mov     cr3, eax
93
 
7132 dunkaist 94
        cmp     byte [BOOT_LO.shutdown_type], SYSTEM_SHUTDOWN
6244 serge 95
        jne     no_acpi_power_off
96
 
97
; system_power_off
98
 
99
        mov     ebx, [acpi_fadt_base-OS_BASE]
100
        cmp     dword [ebx], 'FACP'
101
        jne     no_acpi_power_off
102
        mov     esi, [acpi_dsdt_base-OS_BASE]
103
        cmp     dword [esi], 'DSDT'
104
        jne     no_acpi_power_off
105
        mov     eax, [esi+4] ; DSDT length
106
        sub     eax, 36+4
107
        jbe     no_acpi_power_off
108
        add     esi, 36
109
.scan_dsdt:
110
        cmp     dword [esi], '_S5_'
111
        jnz     .scan_dsdt_cont
112
        cmp     byte [esi+4], 12h ; DefPackage opcode
113
        jnz     .scan_dsdt_cont
114
        mov     dl, [esi+6]
115
        cmp     dl, 4 ; _S5_ package must contain 4 bytes
116
                      ; ...in theory; in practice, VirtualBox has 2 bytes
117
        ja      .scan_dsdt_cont
118
        cmp     dl, 1
119
        jb      .scan_dsdt_cont
120
        lea     esi, [esi+7]
121
        xor     ecx, ecx
122
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
123
        jz      @f
124
        cmp     byte [esi], 0xA
125
        jnz     no_acpi_power_off
126
        inc     esi
127
        mov     cl, [esi]
128
@@:
129
        inc     esi
130
        cmp     dl, 2
131
        jb      @f
132
        cmp     byte [esi], 0
133
        jz      @f
134
        cmp     byte [esi], 0xA
135
        jnz     no_acpi_power_off
136
        inc     esi
137
        mov     ch, [esi]
138
@@:
139
        jmp     do_acpi_power_off
140
.scan_dsdt_cont:
141
        inc     esi
142
        dec     eax
143
        jnz     .scan_dsdt
144
        jmp     no_acpi_power_off
145
do_acpi_power_off:
146
        mov     edx, [ebx+48]
147
        test    edx, edx
148
        jz      .nosmi
149
        mov     al, [ebx+52]
150
        out     dx, al
151
        mov     edx, [ebx+64]
152
@@:
153
        in      ax, dx
154
        test    al, 1
155
        jz      @b
156
.nosmi:
157
        and     cx, 0x0707
158
        shl     cx, 2
159
        or      cx, 0x2020
160
        mov     edx, [ebx+64]
161
        in      ax, dx
162
        and     ax, 203h
163
        or      ah, cl
164
        out     dx, ax
165
        mov     edx, [ebx+68]
166
        test    edx, edx
167
        jz      @f
168
        in      ax, dx
169
        and     ax, 203h
170
        or      ah, ch
171
        out     dx, ax
172
@@:
173
        jmp     $
174
 
175
no_acpi_power_off:
176
        jmp     0x50000
177
 
178
align 4
179
restart_code_start:
180
org 0x50000
181
 
7132 dunkaist 182
        cmp     byte [BOOT_LO.shutdown_type], SYSTEM_RESTART
6244 serge 183
        jne     @F
184
 
185
        mov     esi, _CLEAN_ZONE-OS_BASE
186
        mov     edi, 0x10000
187
        mov     ecx, 0x31000/4
188
        cld
189
        rep movsd
190
@@:
191
 
192
        xor     ebx, ebx
193
        xor     edx, edx
194
        xor     ecx, ecx
195
        xor     esi, esi
196
        xor     edi, edi
197
        xor     ebp, ebp
198
        lidt    [.idt]
199
        lgdt    [.gdt]
5032 clevermous 200
        jmp     8:@f
6244 serge 201
align 8
202
.gdt:
203
; selector 0 - not used
204
        dw      23
205
        dd      .gdt
206
        dw      0
207
; selector 8 - code from 5000:0000 to 1000:FFFF
208
        dw      0FFFFh
209
        dw      0
210
        db      5
211
        db      10011011b
212
        db      00000000b
213
        db      0
214
; selector 10h - data from 1000:0000 to 1000:FFFF
215
        dw      0FFFFh
216
        dw      0
217
        db      1
218
        db      10010011b
219
        db      00000000b
220
        db      0
221
.idt:
222
        dw 256*4
223
        dd 0
224
org $ - 0x50000
5032 clevermous 225
use16
226
@@:
227
        mov     ax, 10h
228
        mov     ds, ax
229
        mov     es, ax
230
        mov     fs, ax
231
        mov     gs, ax
232
        mov     ss, ax
6244 serge 233
 
5032 clevermous 234
        mov     eax, cr0
235
        and     eax, not 80000001h
236
        mov     cr0, eax
6244 serge 237
        jmp     0x5000:.real_mode
2288 clevermous 238
 
6244 serge 239
align 4
240
.real_mode:
2288 clevermous 241
 
242
; setup stack
6244 serge 243
 
244
        mov     ax, (TMP_STACK_TOP and 0xF0000) shr 4
2288 clevermous 245
        mov     ss, ax
6244 serge 246
        mov     esp, TMP_STACK_TOP and 0xFFFF
2288 clevermous 247
 
248
;remap IRQs
249
        mov     al, 0x11
250
        out     0x20, al
251
        out     0xA0, al
252
 
253
        mov     al, 0x08
254
        out     0x21, al
255
        mov     al, 0x70
256
        out     0xA1, al
257
 
258
        mov     al, 0x04
259
        out     0x21, al
260
        mov     al, 0x02
261
        out     0xA1, al
262
 
263
        mov     al, 0x01
264
        out     0x21, al
265
        out     0xA1, al
266
 
267
        mov     al, 0xB8
268
        out     0x21, al
269
        mov     al, 0xBD
270
        out     0xA1, al
271
 
6244 serge 272
        mov     al, 00110100b
273
        out     43h, al
274
        mov     al, 0xFF
275
        out     40h, al
276
        out     40h, al
277
 
2288 clevermous 278
        xor     ax, ax
6244 serge 279
        mov     ds, ax
7132 dunkaist 280
        mov     al, [BOOT_LO.shutdown_type]
6244 serge 281
        cmp     al, SYSTEM_RESTART
282
        je      .restart
2288 clevermous 283
 
6244 serge 284
        cmp     al, SYSTEM_SHUTDOWN
285
        je      .APM_PowerOff
2288 clevermous 286
 
6244 serge 287
        mov     word[0x0472], 0x1234
2288 clevermous 288
        jmp     0xF000:0xFFF0
289
 
6244 serge 290
.APM_PowerOff:
2288 clevermous 291
        mov     ax, 5304h
292
        xor     bx, bx
293
        int     15h
294
;!!!!!!!!!!!!!!!!!!!!!!!!
295
        mov     ax, 0x5300
296
        xor     bx, bx
297
        int     0x15
298
        push    ax
299
 
300
        mov     ax, 0x5301
301
        xor     bx, bx
302
        int     0x15
303
 
304
        mov     ax, 0x5308
305
        mov     bx, 1
306
        mov     cx, bx
307
        int     0x15
308
 
309
        mov     ax, 0x530E
310
        xor     bx, bx
311
        pop     cx
312
        int     0x15
313
 
314
        mov     ax, 0x530D
315
        mov     bx, 1
316
        mov     cx, bx
317
        int     0x15
318
 
319
        mov     ax, 0x530F
320
        mov     bx, 1
321
        mov     cx, bx
322
        int     0x15
323
 
324
        mov     ax, 0x5307
325
        mov     bx, 1
326
        mov     cx, 3
327
        int     0x15
328
;!!!!!!!!!!!!!!!!!!!!!!!!
6244 serge 329
        jmp     $
2288 clevermous 330
 
6244 serge 331
.restart:
2288 clevermous 332
 
333
; (hint by Black_mirror)
334
; We must read data from keyboard port,
335
; because there may be situation when previous keyboard interrupt is lost
336
; (due to return to real mode and IRQ reprogramming)
337
; and next interrupt will not be generated (as keyboard waits for handling)
6244 serge 338
 
339
        mov     cx, 16
340
@@:
341
        in      al, 0x64
342
        test    al, 1
343
        jz      @F
2288 clevermous 344
        in      al, 0x60
6244 serge 345
        loop    @B
346
@@:
2288 clevermous 347
 
348
; bootloader interface
349
        push    0x1000
350
        pop     ds
7129 dunkaist 351
        push    0
352
        pop     es
7132 dunkaist 353
        mov     si, [es:BOOT_LO.kernel_restart]
2288 clevermous 354
        mov     ax, 'KL'
355
        jmp     0x1000:0000
356
 
6244 serge 357
align 4
358
org restart_code_start + $
359
restart_code_end:
360
 
361
org $+OS_BASE
362
use32