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 |