From 8ff3623ee4cf199600208c6c0f57e1a1a90c7dd9 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 19 Mar 2023 21:59:38 +0200 Subject: [PATCH] Move bootloader code to a separate directory --- Architecture/amd64/{ => Bootstrap}/Limine.c | 4 +- Architecture/amd64/runtime/crt1.c | 1 - Architecture/i686/Bootstrap/MB2.asm | 54 +++++++++ Architecture/i686/Bootstrap/MB2Header.asm | 41 +++++++ Architecture/i686/Bootstrap/MB2PageTable.asm | 13 +++ .../i686/{ => Bootstrap}/Multiboot2.cpp | 4 +- Architecture/i686/linker.ld | 2 +- Architecture/i686/runtime/crt1.asm | 104 ------------------ Architecture/i686/runtime/crt1.c | 15 +++ 9 files changed, 128 insertions(+), 110 deletions(-) rename Architecture/amd64/{ => Bootstrap}/Limine.c (99%) create mode 100644 Architecture/i686/Bootstrap/MB2.asm create mode 100644 Architecture/i686/Bootstrap/MB2Header.asm create mode 100644 Architecture/i686/Bootstrap/MB2PageTable.asm rename Architecture/i686/{ => Bootstrap}/Multiboot2.cpp (99%) delete mode 100644 Architecture/i686/runtime/crt1.asm create mode 100644 Architecture/i686/runtime/crt1.c diff --git a/Architecture/amd64/Limine.c b/Architecture/amd64/Bootstrap/Limine.c similarity index 99% rename from Architecture/amd64/Limine.c rename to Architecture/amd64/Bootstrap/Limine.c index 3456654..40acbfd 100644 --- a/Architecture/amd64/Limine.c +++ b/Architecture/amd64/Bootstrap/Limine.c @@ -3,8 +3,8 @@ #include #include -#include "../../../tools/limine/limine.h" -#include "../../kernel.h" +#include "../../../../tools/limine/limine.h" +#include "../../../kernel.h" void init_limine(); diff --git a/Architecture/amd64/runtime/crt1.c b/Architecture/amd64/runtime/crt1.c index 17a6144..bcc936a 100644 --- a/Architecture/amd64/runtime/crt1.c +++ b/Architecture/amd64/runtime/crt1.c @@ -13,4 +13,3 @@ void _start(void *Raw) Entry(NULL); return; } -// C stuff \ No newline at end of file diff --git a/Architecture/i686/Bootstrap/MB2.asm b/Architecture/i686/Bootstrap/MB2.asm new file mode 100644 index 0000000..85d1c81 --- /dev/null +++ b/Architecture/i686/Bootstrap/MB2.asm @@ -0,0 +1,54 @@ +; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones +; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones_(Backup) + +KERNEL_VIRTUAL_BASE equ 0xC0000000 ; 3GB +KERNEL_STACK_SIZE equ 0x4000 ; 16KB + +extern Multiboot2Entry +extern BootPageTable +global MB2_start + +section .text +MB2_start: + cli + mov word [0xb8F00], 0x072E ; . + + mov ecx, (BootPageTable - KERNEL_VIRTUAL_BASE) + mov cr3, ecx + + mov word [0xb8F02], 0x072E ; . + + mov ecx, cr4 + or ecx, 0x00000010 ; Set PSE in CR4 + mov cr4, ecx + + mov word [0xb8F04], 0x072E ; . + + mov ecx, cr0 + or ecx, 0x80000000 ; Set PG in CR0 + mov cr0, ecx + + mov word [0xb8F06], 0x072E ; . + + lea ecx, [HigherHalfStart] + jmp ecx + +HigherHalfStart: + mov word [0xb8F08], 0x072E ; . + mov dword [BootPageTable], 0 + invlpg [0] + + mov esp, KernelStack + KERNEL_STACK_SIZE + + push eax ; Multiboot2 Magic + add ebx, KERNEL_VIRTUAL_BASE + push ebx ; Multiboot2 Header + call Multiboot2Entry +Loop: + hlt + jmp Loop + +section .bss +align 16 +KernelStack: + resb KERNEL_STACK_SIZE diff --git a/Architecture/i686/Bootstrap/MB2Header.asm b/Architecture/i686/Bootstrap/MB2Header.asm new file mode 100644 index 0000000..a0a9a71 --- /dev/null +++ b/Architecture/i686/Bootstrap/MB2Header.asm @@ -0,0 +1,41 @@ +section .multiboot2 +align 4096 +HEADER_START: + dd 0xE85250D6 + dd 0 + dd (HEADER_END - HEADER_START) + dd 0x100000000 - (HEADER_END - HEADER_START) - 0 - 0xE85250D6 +align 8 +MB2_INFO_REQUEST_TAG_START: + dw 1 + dw 0 + dd MB2_INFO_REQUEST_TAG_END - MB2_INFO_REQUEST_TAG_START + dd 1 ; Command Line + dd 2 ; Boot Loader Name + dd 3 ; Module + dd 4 ; Basic Memory Information + dd 5 ; BIOS Boot Device + dd 6 ; Memory Map + dd 7 ; VBE + dd 8 ; Framebuffer + dd 9 ; ELF Sections + dd 10 ; APM Table + dd 11 ; EFI 32-bit System Table Pointer + dd 12 ; EFI 64-bit System Table Pointer + ; dd 13 ; SMBIOS + dd 14 ; ACPI Old + dd 15 ; ACPI New + dd 16 ; Network + dd 17 ; EFI Memory Map + dd 18 ; EFI Boot Services Notifier + dd 19 ; EFI 32-bit Image Handle Pointer + dd 20 ; EFI 64-bit Image Handle Pointer + dd 21 ; Load Base Address +MB2_INFO_REQUEST_TAG_END: +align 8 +MB2_TAG_START: + dw 0 + dw 0 + dd MB2_TAG_END - MB2_TAG_START +MB2_TAG_END: +HEADER_END: diff --git a/Architecture/i686/Bootstrap/MB2PageTable.asm b/Architecture/i686/Bootstrap/MB2PageTable.asm new file mode 100644 index 0000000..9989867 --- /dev/null +++ b/Architecture/i686/Bootstrap/MB2PageTable.asm @@ -0,0 +1,13 @@ +KERNEL_VIRTUAL_BASE equ 0xC0000000 ; 3GB +KERNEL_PAGE_NUMBER equ (KERNEL_VIRTUAL_BASE >> 22) ; 768 + +section .data +global BootPageTable +align 0x1000 +BootPageTable: + dd 0x00000083 + dd 0x00000083 + times (KERNEL_PAGE_NUMBER - 2) dd 0 + dd 0x00000083 + dd 0x00000083 + times (1024 - KERNEL_PAGE_NUMBER - 2) dd 0 diff --git a/Architecture/i686/Multiboot2.cpp b/Architecture/i686/Bootstrap/Multiboot2.cpp similarity index 99% rename from Architecture/i686/Multiboot2.cpp rename to Architecture/i686/Bootstrap/Multiboot2.cpp index 0fe6fab..99ed39a 100644 --- a/Architecture/i686/Multiboot2.cpp +++ b/Architecture/i686/Bootstrap/Multiboot2.cpp @@ -4,7 +4,7 @@ #include #include -#include "../../kernel.h" +#include "../../../kernel.h" BootInfo mb2binfo; @@ -305,7 +305,7 @@ void ProcessMB2(unsigned long Info) } } -EXTERNC void x32Multiboot2Entry(unsigned long Info, unsigned int Magic) +EXTERNC void Multiboot2Entry(unsigned long Info, unsigned int Magic) { if (Info == NULL || Magic == NULL) { diff --git a/Architecture/i686/linker.ld b/Architecture/i686/linker.ld index 1917158..a1a6e94 100644 --- a/Architecture/i686/linker.ld +++ b/Architecture/i686/linker.ld @@ -1,7 +1,7 @@ OUTPUT_FORMAT(elf32-i386) OUTPUT_ARCH(i386) -ENTRY(_start) +ENTRY(MB2_start) SECTIONS { diff --git a/Architecture/i686/runtime/crt1.asm b/Architecture/i686/runtime/crt1.asm deleted file mode 100644 index 42dddbc..0000000 --- a/Architecture/i686/runtime/crt1.asm +++ /dev/null @@ -1,104 +0,0 @@ -; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones -; https://wiki.osdev.org/Higher_Half_x86_Bare_Bones_(Backup) -section .multiboot2 -align 4096 -HEADER_START: - dd 0xE85250D6 - dd 0 - dd (HEADER_END - HEADER_START) - dd 0x100000000 - (HEADER_END - HEADER_START) - 0 - 0xE85250D6 -align 8 -MB2_INFO_REQUEST_TAG_START: - dw 1 - dw 0 - dd MB2_INFO_REQUEST_TAG_END - MB2_INFO_REQUEST_TAG_START - dd 1 ; Command Line - dd 2 ; Boot Loader Name - dd 3 ; Module - dd 4 ; Basic Memory Information - dd 5 ; BIOS Boot Device - dd 6 ; Memory Map - dd 7 ; VBE - dd 8 ; Framebuffer - dd 9 ; ELF Sections - dd 10 ; APM Table - dd 11 ; EFI 32-bit System Table Pointer - dd 12 ; EFI 64-bit System Table Pointer - ; dd 13 ; SMBIOS - dd 14 ; ACPI Old - dd 15 ; ACPI New - dd 16 ; Network - dd 17 ; EFI Memory Map - dd 18 ; EFI Boot Services Notifier - dd 19 ; EFI 32-bit Image Handle Pointer - dd 20 ; EFI 64-bit Image Handle Pointer - dd 21 ; Load Base Address -MB2_INFO_REQUEST_TAG_END: -align 8 -MB2_TAG_START: - dw 0 - dw 0 - dd MB2_TAG_END - MB2_TAG_START -MB2_TAG_END: -HEADER_END: - -KERNEL_VIRTUAL_BASE equ 0xC0000000 ; 3GB -KERNEL_PAGE_NUMBER equ (KERNEL_VIRTUAL_BASE >> 22) ; 768 -KERNEL_STACK_SIZE equ 0x4000 ; 16KB - -extern x32Multiboot2Entry -global _start - -section .data -align 0x1000 -BootPageTable: - dd 0x00000083 - dd 0x00000083 - times (KERNEL_PAGE_NUMBER - 2) dd 0 - dd 0x00000083 - dd 0x00000083 - times (1024 - KERNEL_PAGE_NUMBER - 2) dd 0 - -section .text -_start: - mov word [0xb8F00], 0x072E ; . - - mov ecx, (BootPageTable - KERNEL_VIRTUAL_BASE) - mov cr3, ecx - - mov word [0xb8F02], 0x072E ; . - - mov ecx, cr4 - or ecx, 0x00000010 ; Set PSE in CR4 - mov cr4, ecx - - mov word [0xb8F04], 0x072E ; . - - mov ecx, cr0 - or ecx, 0x80000000 ; Set PG in CR0 - mov cr0, ecx - - mov word [0xb8F06], 0x072E ; . - - lea ecx, [HigherHalfStart] - jmp ecx - -HigherHalfStart: - mov word [0xb8F08], 0x072E ; . - mov dword [BootPageTable], 0 - invlpg [0] - - mov esp, KernelStack + KERNEL_STACK_SIZE - - push eax ; Multiboot2 Magic - add ebx, KERNEL_VIRTUAL_BASE - push ebx ; Multiboot2 Header - call x32Multiboot2Entry -Loop: - hlt - jmp Loop - -section .bss -align 16 -KernelStack : - resb KERNEL_STACK_SIZE diff --git a/Architecture/i686/runtime/crt1.c b/Architecture/i686/runtime/crt1.c new file mode 100644 index 0000000..bcc936a --- /dev/null +++ b/Architecture/i686/runtime/crt1.c @@ -0,0 +1,15 @@ +#include + +#include + +int Entry(void *Info); + +void _start(void *Raw) +{ + UNUSED(Raw); + error("ERROR! INVALID BOOT PROTOCOL!"); + while (1) + asmv("hlt"); + Entry(NULL); + return; +}