/* 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 . */ .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