mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
118 lines
2.1 KiB
Plaintext
118 lines
2.1 KiB
Plaintext
/*
|
|
This file is part of Fennix Kernel.
|
|
|
|
Fennix Kernel is free software: you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation, either version 3 of
|
|
the License, or (at your option) any later version.
|
|
|
|
Fennix Kernel is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
.intel_syntax noprefix
|
|
|
|
.code32
|
|
.equ KERNEL_STACK_SIZE, 0x4000 /* 16KB */
|
|
|
|
.extern DetectCPUID
|
|
.extern Detect64Bit
|
|
.extern DetectPSE
|
|
.extern DetectPAE
|
|
.extern multiboot_main
|
|
.extern LoadGDT32
|
|
.extern BootPageTable
|
|
.extern UpdatePageTable
|
|
.extern GDT64.Ptr
|
|
.extern GDT64.Code
|
|
.extern GDT64.Data
|
|
|
|
.section .bootstrap.data
|
|
MB_HeaderMagic:
|
|
.quad 0
|
|
|
|
MB_HeaderInfo:
|
|
.quad 0
|
|
|
|
.section .bootstrap.text
|
|
|
|
.global Multiboot2_start
|
|
Multiboot2_start:
|
|
cli
|
|
|
|
mov [MB_HeaderMagic], eax
|
|
mov [MB_HeaderInfo], ebx
|
|
|
|
call DetectCPUID
|
|
cmp eax, 0
|
|
je $
|
|
|
|
call Detect64Bit
|
|
cmp eax, 0
|
|
je $
|
|
|
|
call DetectPSE
|
|
cmp eax, 0
|
|
je $
|
|
|
|
call DetectPAE
|
|
cmp eax, 0
|
|
je $
|
|
|
|
mov ecx, cr4
|
|
or ecx, 0x00000010 /* Set PSE in CR4 */
|
|
or ecx, 0x00000020 /* Set PAE in CR4 */
|
|
mov cr4, ecx
|
|
|
|
call LoadGDT32
|
|
call UpdatePageTable
|
|
|
|
mov ecx, BootPageTable
|
|
mov cr3, ecx
|
|
|
|
mov ecx, 0xC0000080 /* EFER */
|
|
rdmsr
|
|
or eax, 0x800 | 0x100 | 0x1 /* Set LME, LMA, SCE */
|
|
wrmsr
|
|
|
|
mov ecx, cr0
|
|
or ecx, 0x80000001 /* Set PG and PE in CR0 */
|
|
mov cr0, ecx
|
|
|
|
lgdt [GDT64.Ptr]
|
|
jmp GDT64.Code:HigherHalfStart
|
|
|
|
.extern UpdatePageTable64
|
|
|
|
.code64
|
|
HigherHalfStart:
|
|
mov ax, GDT64.Data
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov ss, ax
|
|
|
|
call UpdatePageTable64
|
|
|
|
mov rsp, KernelStack + KERNEL_STACK_SIZE
|
|
mov rbp, 0
|
|
mov rdi, [MB_HeaderMagic]
|
|
mov rsi, [MB_HeaderInfo]
|
|
push rsi
|
|
push rdi
|
|
call multiboot_main
|
|
.Hang:
|
|
hlt
|
|
jmp .Hang
|
|
|
|
.section .bootstrap.bss
|
|
.align 16
|
|
KernelStack:
|
|
.space KERNEL_STACK_SIZE
|