Subversion Repositories Kolibri OS

Rev

Rev 6240 | Rev 6246 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6240 Rev 6242
Line 69... Line 69...
69
format binary as "mnt"
69
format binary as "mnt"
Line 70... Line 70...
70
 
70
 
71
include 'macros.inc'
71
include 'macros.inc'
Line 72... Line 72...
72
include 'struct.inc'
72
include 'struct.inc'
Line 73... Line 73...
73
 
73
 
74
$Revision: 6240 $
74
$Revision: 6242 $
Line 303... Line 303...
303
        jmp     pword os_code:high_code
303
        jmp     pword os_code:high_code
Line 304... Line 304...
304
 
304
 
305
align 4
305
align 4
306
bios32_entry    dd ?
306
bios32_entry    dd ?
307
tmp_page_tabs   dd ?
-
 
308
 
307
tmp_page_tabs   dd ?
309
use16
-
 
310
org $-0x10000
-
 
311
include "boot/shutdown.inc" ; shutdown or restart
-
 
312
org $+0x10000
-
 
313
 
308
use16
314
ap_init16:
309
ap_init16:
315
        cli
310
        cli
316
        lgdt    [cs:gdts_ap-ap_init16]
311
        lgdt    [cs:gdts_ap-ap_init16]
317
        mov     eax, [cs:cr3_ap-ap_init16]
312
        mov     eax, [cs:cr3_ap-ap_init16]
Line 5720... Line 5715...
5720
 
5715
 
5721
undefined_syscall:                      ; Undefined system call
5716
undefined_syscall:                      ; Undefined system call
5722
        mov     [esp + 32], dword -1
5717
        mov     [esp + 32], dword -1
Line 5723... Line -...
5723
        ret
-
 
5724
 
-
 
5725
align 4
-
 
5726
system_shutdown:          ; shut down the system
-
 
5727
 
-
 
5728
        cmp     byte [BOOT_VARS+0x9030], 1
-
 
5729
        jne     @F
-
 
5730
        ret
-
 
5731
@@:
-
 
5732
        call    stop_all_services
-
 
5733
 
-
 
5734
yes_shutdown_param:
-
 
5735
; Shutdown other CPUs, if initialized
-
 
5736
        cmp     [ap_initialized], 0
-
 
5737
        jz      .no_shutdown_cpus
-
 
5738
        mov     edi, [LAPIC_BASE]
-
 
5739
        add     edi, 300h
-
 
5740
        mov     esi, smpt+4
-
 
5741
        mov     ebx, [cpu_count]
-
 
5742
        dec     ebx
-
 
5743
.shutdown_cpus_loop:
-
 
5744
        lodsd
-
 
5745
        push    esi
-
 
5746
        xor     esi, esi
-
 
5747
        inc     esi
-
 
5748
        shl     eax, 24
-
 
5749
        mov     [edi+10h], eax
-
 
5750
; assert INIT IPI
-
 
5751
        mov     dword [edi], 0C500h
-
 
5752
        call    delay_ms
-
 
5753
@@:
-
 
5754
        test    dword [edi], 1000h
-
 
5755
        jnz     @b
-
 
5756
; deassert INIT IPI
-
 
5757
        mov     dword [edi], 8500h
-
 
5758
        call    delay_ms
-
 
5759
@@:
-
 
5760
        test    dword [edi], 1000h
-
 
5761
        jnz     @b
-
 
5762
; don't send STARTUP IPI: let other CPUs be in wait-for-startup state
-
 
5763
        pop     esi
-
 
5764
        dec     ebx
-
 
5765
        jnz     .shutdown_cpus_loop
-
 
5766
.no_shutdown_cpus:
-
 
5767
 
-
 
5768
        cli
-
 
5769
        call    IRQ_mask_all
-
 
5770
 
-
 
5771
        mov     eax, [OS_BASE + 0x9030]
-
 
5772
        cmp     al, SYSTEM_RESTART
-
 
5773
        jne     @F
-
 
5774
 
-
 
5775
; load kernel.mnt to _CLEAN_ZONE
-
 
5776
        mov     ebx, kernel_file_load
-
 
5777
        pushad
-
 
5778
        call    file_system_lfn
-
 
5779
        popad
-
 
5780
 
-
 
5781
        mov     esi, OS_BASE+restart_kernel_5000 ; move kernel re-starter to 0x5000:0
-
 
5782
        mov     edi, OS_BASE+0x50000
-
 
5783
        mov     ecx, (restart_code_end - restart_kernel_5000)/4
-
 
5784
        rep movsd
-
 
5785
 
-
 
5786
@@:
-
 
5787
;disable paging
-
 
5788
 
-
 
5789
        call    create_trampoline_pgmap
-
 
5790
        mov     cr3, eax
-
 
5791
        jmp     @F
-
 
5792
org $-OS_BASE
-
 
5793
@@:
-
 
5794
        mov     eax, cr0
-
 
5795
        and     eax, 0x7FFFFFFF
-
 
5796
        mov     cr0, eax
-
 
5797
        mov     eax, cr3
-
 
5798
        mov     cr3, eax
-
 
5799
 
-
 
5800
        cmp     byte [0x9030], SYSTEM_SHUTDOWN
-
 
5801
        jne     no_acpi_power_off
-
 
5802
 
-
 
5803
; system_power_off
-
 
5804
 
-
 
5805
        mov     ebx, [acpi_fadt_base-OS_BASE]
-
 
5806
        cmp     dword [ebx], 'FACP'
-
 
5807
        jne     no_acpi_power_off
-
 
5808
        mov     esi, [acpi_dsdt_base-OS_BASE]
-
 
5809
        cmp     dword [esi], 'DSDT'
-
 
5810
        jne     no_acpi_power_off
-
 
5811
        mov     eax, [esi+4] ; DSDT length
-
 
5812
        sub     eax, 36+4
-
 
5813
        jbe     no_acpi_power_off
-
 
5814
        add     esi, 36
-
 
5815
.scan_dsdt:
-
 
5816
        cmp     dword [esi], '_S5_'
-
 
5817
        jnz     .scan_dsdt_cont
-
 
5818
        cmp     byte [esi+4], 12h ; DefPackage opcode
-
 
5819
        jnz     .scan_dsdt_cont
-
 
5820
        mov     dl, [esi+6]
-
 
5821
        cmp     dl, 4 ; _S5_ package must contain 4 bytes
-
 
5822
                      ; ...in theory; in practice, VirtualBox has 2 bytes
-
 
5823
        ja      .scan_dsdt_cont
-
 
5824
        cmp     dl, 1
-
 
5825
        jb      .scan_dsdt_cont
-
 
5826
        lea     esi, [esi+7]
-
 
5827
        xor     ecx, ecx
-
 
5828
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
-
 
5829
        jz      @f
-
 
5830
        cmp     byte [esi], 0xA
-
 
5831
        jnz     no_acpi_power_off
-
 
5832
        inc     esi
-
 
5833
        mov     cl, [esi]
-
 
5834
@@:
-
 
5835
        inc     esi
-
 
5836
        cmp     dl, 2
-
 
5837
        jb      @f
-
 
5838
        cmp     byte [esi], 0
-
 
5839
        jz      @f
-
 
5840
        cmp     byte [esi], 0xA
-
 
5841
        jnz     no_acpi_power_off
-
 
5842
        inc     esi
-
 
5843
        mov     ch, [esi]
-
 
5844
@@:
-
 
5845
        jmp     do_acpi_power_off
-
 
5846
.scan_dsdt_cont:
-
 
5847
        inc     esi
-
 
5848
        dec     eax
-
 
5849
        jnz     .scan_dsdt
-
 
5850
        jmp     no_acpi_power_off
-
 
5851
do_acpi_power_off:
-
 
5852
        mov     edx, [ebx+48]
-
 
5853
        test    edx, edx
-
 
5854
        jz      .nosmi
-
 
5855
        mov     al, [ebx+52]
-
 
5856
        out     dx, al
-
 
5857
        mov     edx, [ebx+64]
-
 
5858
@@:
-
 
5859
        in      ax, dx
-
 
5860
        test    al, 1
-
 
5861
        jz      @b
-
 
5862
.nosmi:
-
 
5863
        and     cx, 0x0707
-
 
5864
        shl     cx, 2
-
 
5865
        or      cx, 0x2020
-
 
5866
        mov     edx, [ebx+64]
-
 
5867
        in      ax, dx
-
 
5868
        and     ax, 203h
-
 
5869
        or      ah, cl
-
 
5870
        out     dx, ax
-
 
5871
        mov     edx, [ebx+68]
-
 
5872
        test    edx, edx
-
 
5873
        jz      @f
-
 
5874
        in      ax, dx
-
 
5875
        and     ax, 203h
-
 
5876
        or      ah, ch
-
 
5877
        out     dx, ax
-
 
5878
@@:
-
 
5879
        jmp     $
-
 
5880
 
-
 
5881
no_acpi_power_off:
-
 
5882
 
-
 
5883
        jmp     0x50000
-
 
5884
 
-
 
5885
align 4
-
 
5886
restart_kernel_5000:
-
 
5887
org 0x50000
-
 
5888
 
-
 
5889
        cmp     byte [0x9030], SYSTEM_RESTART
-
 
5890
        jne     @F
-
 
5891
 
-
 
5892
        xchg    bx, bx
-
 
5893
 
-
 
5894
        mov     esi, _CLEAN_ZONE-OS_BASE
-
 
5895
        mov     edi, 0x10000
-
 
5896
        mov     ecx, 0x31000/4
-
 
5897
        cld
-
 
5898
        rep     movsd
-
 
5899
@@:
-
 
5900
 
-
 
5901
        xor     ebx, ebx
-
 
5902
        xor     edx, edx
-
 
5903
        xor     ecx, ecx
-
 
5904
        xor     esi, esi
-
 
5905
        xor     edi, edi
-
 
5906
        xor     ebp, ebp
-
 
5907
        lidt    [.idt]
-
 
5908
        lgdt    [.gdt]
-
 
5909
        jmp     8:@f
-
 
5910
align 8
-
 
5911
.gdt:
-
 
5912
; selector 0 - not used
-
 
5913
        dw      23
-
 
5914
        dd      .gdt
-
 
5915
        dw      0
-
 
5916
; selector 8 - code from 5000:0000 to 1000:FFFF
-
 
5917
        dw      0FFFFh
-
 
5918
        dw      0
-
 
5919
        db      5
-
 
5920
        db      10011011b
-
 
5921
        db      00000000b
-
 
5922
        db      0
-
 
5923
; selector 10h - data from 1000:0000 to 1000:FFFF
-
 
5924
        dw      0FFFFh
-
 
5925
        dw      0
-
 
5926
        db      1
-
 
5927
        db      10010011b
-
 
5928
        db      00000000b
-
 
5929
        db      0
-
 
5930
.idt:
-
 
5931
        dw 256*4
-
 
5932
        dd 0
-
 
5933
org $ - 0x50000
-
 
5934
use16
-
 
5935
@@:
-
 
5936
        mov     ax, 10h
-
 
5937
        mov     ds, ax
-
 
5938
        mov     es, ax
-
 
5939
        mov     fs, ax
-
 
5940
        mov     gs, ax
-
 
5941
        mov     ss, ax
-
 
5942
 
-
 
5943
        mov     eax, cr0
-
 
5944
        and     eax, not 80000001h
-
 
5945
        mov     cr0, eax
-
 
5946
        jmp     0x5000:.real_mode
-
 
5947
 
-
 
5948
align 4
-
 
5949
.real_mode:
-
 
5950
 
-
 
5951
; setup stack
-
 
5952
 
-
 
5953
        mov     ax, (TMP_STACK_TOP and 0xF0000) shr 4
-
 
5954
        mov     ss, ax
-
 
5955
        mov     esp, TMP_STACK_TOP and 0xFFFF
-
 
5956
 
-
 
5957
;remap IRQs
-
 
5958
        mov     al, 0x11
-
 
5959
        out     0x20, al
-
 
5960
        out     0xA0, al
-
 
5961
 
-
 
5962
        mov     al, 0x08
-
 
5963
        out     0x21, al
-
 
5964
        mov     al, 0x70
-
 
5965
        out     0xA1, al
-
 
5966
 
-
 
5967
        mov     al, 0x04
-
 
5968
        out     0x21, al
-
 
5969
        mov     al, 0x02
-
 
5970
        out     0xA1, al
-
 
5971
 
-
 
5972
        mov     al, 0x01
-
 
5973
        out     0x21, al
-
 
5974
        out     0xA1, al
-
 
5975
 
-
 
5976
        mov     al, 0xB8
-
 
5977
        out     0x21, al
-
 
5978
        mov     al, 0xBD
-
 
5979
        out     0xA1, al
-
 
5980
 
-
 
5981
        mov     al, 00110100b
-
 
5982
        out     43h, al
-
 
5983
        mov     al, 0xFF
-
 
5984
        out     40h, al
-
 
5985
        out     40h, al
-
 
5986
 
-
 
5987
        mov     al, byte [es:0x9030]
-
 
5988
        cmp     al, SYSTEM_RESTART
-
 
5989
        je      .do_restart
-
 
5990
 
-
 
5991
        jmp $
-
 
5992
 
-
 
5993
.do_restart:
-
 
5994
 
-
 
5995
        mov     ax, 0x0003     ; set text mode for screen
-
 
5996
        int     0x10
-
 
5997
        sti
-
 
5998
 
-
 
5999
; (hint by Black_mirror)
-
 
6000
; We must read data from keyboard port,
-
 
6001
; because there may be situation when previous keyboard interrupt is lost
-
 
6002
; (due to return to real mode and IRQ reprogramming)
-
 
6003
; and next interrupt will not be generated (as keyboard waits for handling)
-
 
6004
        in      al, 0x60
-
 
6005
 
-
 
6006
; bootloader interface
-
 
6007
        push    0x1000
-
 
6008
        pop     ds
-
 
6009
        mov     si, kernel_restart_bootblock
-
 
6010
        mov     ax, 'KL'
-
 
6011
        jmp     0x1000:0000
-
 
6012
 
-
 
6013
 
-
 
6014
align 4
-
 
6015
org restart_kernel_5000 + $
-
 
6016
restart_code_end:
-
 
6017
 
-
 
6018
iglobal
-
 
6019
align 4
-
 
6020
realmode_gdt:
-
 
6021
; selector 0 - not used
-
 
6022
        dw      23
-
 
6023
        dd      realmode_gdt-OS_BASE
-
 
6024
        dw      0
-
 
6025
; selector 8 - code from 1000:0000 to 1000:FFFF
-
 
6026
        dw      0FFFFh
-
 
6027
        dw      0
-
 
6028
        db      5
-
 
6029
        db      10011011b
-
 
6030
        db      00000000b
-
 
6031
        db      0
-
 
6032
; selector 10h - data from 1000:0000 to 1000:FFFF
-
 
6033
        dw      0FFFFh
-
 
6034
        dw      0
-
 
6035
        db      1
-
 
6036
        db      10010011b
-
 
6037
        db      00000000b
-
 
6038
        db      0
-
 
6039
endg
-
 
Line 6040... Line 5718...
6040
 
5718
        ret
6041
org $+OS_BASE
5719
 
6042
 
5720