Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
  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.  
  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.  
  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]
  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]
  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
  220.         dd 0
  221. org $ - 0x50000
  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
  230.  
  231.         mov     eax, cr0
  232.         and     eax, not 80000001h
  233.         mov     cr0, eax
  234.         jmp     0x5000:.real_mode
  235.  
  236. align 4
  237. .real_mode:
  238.  
  239. ; setup stack
  240.  
  241.         mov     ax, (TMP_STACK_TOP and 0xF0000) shr 4
  242.         mov     ss, ax
  243.         mov     esp, TMP_STACK_TOP and 0xFFFF
  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.  
  269.         mov     al, 00110100b
  270.         out     43h, al
  271.         mov     al, 0xFF
  272.         out     40h, al
  273.         out     40h, al
  274.  
  275.         xor     ax, ax
  276.         mov     ds, ax
  277.         mov     al, [0x9030]
  278.         cmp     al, SYSTEM_RESTART
  279.         je      .restart
  280.  
  281.         cmp     al, SYSTEM_SHUTDOWN
  282.         je      .APM_PowerOff
  283.  
  284.         mov     word[0x0472], 0x1234
  285.         jmp     0xF000:0xFFF0
  286.  
  287. .APM_PowerOff:
  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. ;!!!!!!!!!!!!!!!!!!!!!!!!
  326.         jmp     $
  327.  
  328. .restart:
  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)
  335.  
  336.         mov     cx, 16
  337. @@:
  338.         in      al, 0x64
  339.         test    al, 1
  340.         jz      @F
  341.         in      al, 0x60
  342.         loop    @B
  343. @@:
  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.  
  352. align 4
  353. org restart_code_start + $
  354. restart_code_end:
  355.  
  356. org $+OS_BASE
  357. use32
  358.