From 52f506e882f7de57be82c94ce060a221225bc6a1 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 27 Apr 2023 05:06:07 +0300 Subject: [PATCH] Remove multiboot2 boot code --- Architecture/i386/Bootstrap/MB2.asm | 54 --- Architecture/i386/Bootstrap/MB2Header.asm | 41 --- Architecture/i386/Bootstrap/MB2PageTable.asm | 13 - Architecture/i386/Bootstrap/Multiboot2.cpp | 355 ------------------- Architecture/i386/linker.ld | 27 +- Core/Memory/Memory.cpp | 2 +- Makefile | 2 +- 7 files changed, 17 insertions(+), 477 deletions(-) delete mode 100644 Architecture/i386/Bootstrap/MB2.asm delete mode 100644 Architecture/i386/Bootstrap/MB2Header.asm delete mode 100644 Architecture/i386/Bootstrap/MB2PageTable.asm delete mode 100644 Architecture/i386/Bootstrap/Multiboot2.cpp diff --git a/Architecture/i386/Bootstrap/MB2.asm b/Architecture/i386/Bootstrap/MB2.asm deleted file mode 100644 index 85d1c81..0000000 --- a/Architecture/i386/Bootstrap/MB2.asm +++ /dev/null @@ -1,54 +0,0 @@ -; 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/i386/Bootstrap/MB2Header.asm b/Architecture/i386/Bootstrap/MB2Header.asm deleted file mode 100644 index a0a9a71..0000000 --- a/Architecture/i386/Bootstrap/MB2Header.asm +++ /dev/null @@ -1,41 +0,0 @@ -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/i386/Bootstrap/MB2PageTable.asm b/Architecture/i386/Bootstrap/MB2PageTable.asm deleted file mode 100644 index 9989867..0000000 --- a/Architecture/i386/Bootstrap/MB2PageTable.asm +++ /dev/null @@ -1,13 +0,0 @@ -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/i386/Bootstrap/Multiboot2.cpp b/Architecture/i386/Bootstrap/Multiboot2.cpp deleted file mode 100644 index 423567e..0000000 --- a/Architecture/i386/Bootstrap/Multiboot2.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - 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 . -*/ - -#include - -#include -#include -#include - -#include "../../../kernel.h" - -BootInfo mb2binfo; - -enum VideoType -{ - VIDEO_TYPE_NONE = 0x00, - VIDEO_TYPE_COLOUR = 0x20, - VIDEO_TYPE_MONOCHROME = 0x30, -}; - -uint16_t GetBiosAreaHardware() -{ - const uint16_t *BIOSDataAreaDetectedHardware = (const uint16_t *)0x410; - return *BIOSDataAreaDetectedHardware; -} - -enum VideoType GetVideoType() { return (enum VideoType)(GetBiosAreaHardware() & 0x30); } - -void GetSMBIOS() -{ - unsigned char *SMBIOSAddress = (unsigned char *)0xF0000; - while ((unsigned int)(unsigned long)SMBIOSAddress < 0x100000) - { - if (SMBIOSAddress[0] == '_' && - SMBIOSAddress[1] == 'S' && - SMBIOSAddress[2] == 'M' && - SMBIOSAddress[3] == '_') - { - unsigned char Checksum = 0; - int Length = SMBIOSAddress[5]; - for (int i = 0; i < Length; i++) - Checksum += SMBIOSAddress[i]; - - if (Checksum == 0) - break; - } - SMBIOSAddress += 16; - } - - if ((unsigned int)(unsigned long)SMBIOSAddress == 0x100000) - { - // No SMBIOS found - } -} - -void ProcessMB2(unsigned long Info) -{ - uint8_t *VideoBuffer = (uint8_t *)0xB8F00 + 0xC0000000; - int pos = 0; - auto InfoAddress = Info; - for (auto Tag = (struct multiboot_tag *)((uint8_t *)InfoAddress + 8); - ; - Tag = (struct multiboot_tag *)((multiboot_uint8_t *)Tag + ((Tag->size + 7) & ~7))) - { - VideoBuffer[pos++] = '.'; - VideoBuffer[pos++] = 0x2; - - if (Tag->type == MULTIBOOT_TAG_TYPE_END) - { - debug("End of multiboot2 tags"); - break; - } - - switch (Tag->type) - { - case MULTIBOOT_TAG_TYPE_CMDLINE: - { - strncpy(mb2binfo.Kernel.CommandLine, - ((multiboot_tag_string *)Tag)->string, - strlen(((multiboot_tag_string *)Tag)->string)); - debug("Kernel command line: %s", mb2binfo.Kernel.CommandLine); - break; - } - case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME: - { - strncpy(mb2binfo.Bootloader.Name, - ((multiboot_tag_string *)Tag)->string, - strlen(((multiboot_tag_string *)Tag)->string)); - debug("Bootloader name: %s", mb2binfo.Bootloader.Name); - break; - } - case MULTIBOOT_TAG_TYPE_MODULE: - { - multiboot_tag_module *module = (multiboot_tag_module *)Tag; - static int module_count = 0; - mb2binfo.Modules[module_count++].Address = (void *)module->mod_start; - mb2binfo.Modules[module_count++].Size = module->size; - strncpy(mb2binfo.Modules[module_count++].Path, "(null)", 6); - strncpy(mb2binfo.Modules[module_count++].CommandLine, module->cmdline, - strlen(module->cmdline)); - debug("Module: %s", mb2binfo.Modules[module_count++].Path); - break; - } - case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: - { - multiboot_tag_basic_meminfo *meminfo = (multiboot_tag_basic_meminfo *)Tag; - fixme("basic_meminfo->[mem_lower: %#x, mem_upper: %#x]", - meminfo->mem_lower, meminfo->mem_upper); - break; - } - case MULTIBOOT_TAG_TYPE_BOOTDEV: - { - multiboot_tag_bootdev *bootdev = (multiboot_tag_bootdev *)Tag; - fixme("bootdev->[biosdev: %#x, slice: %#x, part: %#x]", - bootdev->biosdev, bootdev->slice, bootdev->part); - break; - } - case MULTIBOOT_TAG_TYPE_MMAP: - { - multiboot_tag_mmap *mmap = (multiboot_tag_mmap *)Tag; - uint32_t EntryCount = mmap->size / sizeof(multiboot_mmap_entry); - mb2binfo.Memory.Entries = EntryCount; - for (uint32_t i = 0; i < EntryCount; i++) - { - if (EntryCount > MAX_MEMORY_ENTRIES) - { - warn("Too many memory entries, skipping the rest..."); - break; - } - multiboot_mmap_entry entry = mmap->entries[i]; - mb2binfo.Memory.Size += entry.len; - switch (entry.type) - { - case MULTIBOOT_MEMORY_AVAILABLE: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = Usable; - break; - case MULTIBOOT_MEMORY_RESERVED: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = Reserved; - break; - case MULTIBOOT_MEMORY_ACPI_RECLAIMABLE: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = ACPIReclaimable; - break; - case MULTIBOOT_MEMORY_NVS: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = ACPINVS; - break; - case MULTIBOOT_MEMORY_BADRAM: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = BadMemory; - break; - default: - mb2binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr; - mb2binfo.Memory.Entry[i].Length = entry.len; - mb2binfo.Memory.Entry[i].Type = Unknown; - break; - } - debug("Memory entry: [BaseAddress: %#x, Length: %#x, Type: %d]", - mb2binfo.Memory.Entry[i].BaseAddress, - mb2binfo.Memory.Entry[i].Length, - mb2binfo.Memory.Entry[i].Type); - } - break; - } - case MULTIBOOT_TAG_TYPE_VBE: - { - multiboot_tag_vbe *vbe = (multiboot_tag_vbe *)Tag; - fixme("vbe->[vbe_mode: %#x, vbe_interface_seg: %#x, vbe_interface_off: %#x, vbe_interface_len: %#x]", - vbe->vbe_mode, vbe->vbe_interface_seg, vbe->vbe_interface_off, vbe->vbe_interface_len); - break; - } - case MULTIBOOT_TAG_TYPE_FRAMEBUFFER: - { - multiboot_tag_framebuffer *fb = (multiboot_tag_framebuffer *)Tag; - static int fb_count = 0; - mb2binfo.Framebuffer[fb_count].BaseAddress = (void *)fb->common.framebuffer_addr; - mb2binfo.Framebuffer[fb_count].Width = fb->common.framebuffer_width; - mb2binfo.Framebuffer[fb_count].Height = fb->common.framebuffer_height; - mb2binfo.Framebuffer[fb_count].Pitch = fb->common.framebuffer_pitch; - mb2binfo.Framebuffer[fb_count].BitsPerPixel = fb->common.framebuffer_bpp; - switch (fb->common.framebuffer_type) - { - case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED: - { - fixme("indexed"); - break; - } - case MULTIBOOT_FRAMEBUFFER_TYPE_RGB: - { - mb2binfo.Framebuffer[fb_count].RedMaskSize = fb->framebuffer_red_mask_size; - mb2binfo.Framebuffer[fb_count].RedMaskShift = fb->framebuffer_red_field_position; - mb2binfo.Framebuffer[fb_count].GreenMaskSize = fb->framebuffer_green_mask_size; - mb2binfo.Framebuffer[fb_count].GreenMaskShift = fb->framebuffer_green_field_position; - mb2binfo.Framebuffer[fb_count].BlueMaskSize = fb->framebuffer_blue_mask_size; - mb2binfo.Framebuffer[fb_count].BlueMaskShift = fb->framebuffer_blue_field_position; - break; - } - case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT: - { - fixme("ega_text"); - break; - } - } - debug("Framebuffer %d: %dx%d %d bpp", Tag, fb->common.framebuffer_width, fb->common.framebuffer_height, fb->common.framebuffer_bpp); - debug("More info:\nAddress: %p\nPitch: %lld\nMemoryModel: %d\nRedMaskSize: %d\nRedMaskShift: %d\nGreenMaskSize: %d\nGreenMaskShift: %d\nBlueMaskSize: %d\nBlueMaskShift: %d", - fb->common.framebuffer_addr, fb->common.framebuffer_pitch, fb->common.framebuffer_type, - fb->framebuffer_red_mask_size, fb->framebuffer_red_field_position, fb->framebuffer_green_mask_size, - fb->framebuffer_green_field_position, fb->framebuffer_blue_mask_size, fb->framebuffer_blue_field_position); - fb_count++; - break; - } - case MULTIBOOT_TAG_TYPE_ELF_SECTIONS: - { - multiboot_tag_elf_sections *elf = (multiboot_tag_elf_sections *)Tag; - fixme("elf_sections->[num=%d, size=%d, entsize=%d, shndx=%d]", - elf->num, elf->size, elf->entsize, elf->shndx); - break; - } - case MULTIBOOT_TAG_TYPE_APM: - { - multiboot_tag_apm *apm = (multiboot_tag_apm *)Tag; - fixme("apm->[version: %d, cseg: %d, offset: %d, cseg_16: %d, dseg: %d, flags: %d, cseg_len: %d, cseg_16_len: %d, dseg_len: %d]", - apm->version, apm->cseg, apm->offset, apm->cseg_16, apm->dseg, apm->flags, apm->cseg_len, apm->cseg_16_len, apm->dseg_len); - break; - } - case MULTIBOOT_TAG_TYPE_EFI32: - { - multiboot_tag_efi32 *efi32 = (multiboot_tag_efi32 *)Tag; - fixme("efi32->[pointer: %p, size: %d]", efi32->pointer, efi32->size); - break; - } - case MULTIBOOT_TAG_TYPE_EFI64: - { - multiboot_tag_efi64 *efi64 = (multiboot_tag_efi64 *)Tag; - fixme("efi64->[pointer: %p, size: %d]", efi64->pointer, efi64->size); - break; - } - case MULTIBOOT_TAG_TYPE_SMBIOS: - { - multiboot_tag_smbios *smbios = (multiboot_tag_smbios *)Tag; - fixme("smbios->[major: %d, minor: %d]", smbios->major, smbios->minor); - break; - } - case MULTIBOOT_TAG_TYPE_ACPI_OLD: - { - mb2binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_old_acpi *)Tag)->rsdp; - debug("OLD ACPI RSDP: %p", mb2binfo.RSDP); - break; - } - case MULTIBOOT_TAG_TYPE_ACPI_NEW: - { - mb2binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_new_acpi *)Tag)->rsdp; - debug("NEW ACPI RSDP: %p", mb2binfo.RSDP); - break; - } - case MULTIBOOT_TAG_TYPE_NETWORK: - { - multiboot_tag_network *net = (multiboot_tag_network *)Tag; - fixme("network->[dhcpack: %p]", net->dhcpack); - break; - } - case MULTIBOOT_TAG_TYPE_EFI_MMAP: - { - multiboot_tag_efi_mmap *efi_mmap = (multiboot_tag_efi_mmap *)Tag; - fixme("efi_mmap->[descr_size: %d, descr_vers: %d, efi_mmap: %p]", - efi_mmap->descr_size, efi_mmap->descr_vers, efi_mmap->efi_mmap); - break; - } - case MULTIBOOT_TAG_TYPE_EFI_BS: - { - fixme("efi_bs->[%p] (unknown structure)", Tag); - break; - } - case MULTIBOOT_TAG_TYPE_EFI32_IH: - { - multiboot_tag_efi32_ih *efi32_ih = (multiboot_tag_efi32_ih *)Tag; - fixme("efi32_ih->[pointer: %p]", efi32_ih->pointer); - break; - } - case MULTIBOOT_TAG_TYPE_EFI64_IH: - { - multiboot_tag_efi64_ih *efi64_ih = (multiboot_tag_efi64_ih *)Tag; - fixme("efi64_ih->[pointer: %p]", efi64_ih->pointer); - break; - } - case MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR: - { - multiboot_tag_load_base_addr *load_base_addr = (multiboot_tag_load_base_addr *)Tag; - mb2binfo.Kernel.PhysicalBase = (void *)load_base_addr->load_base_addr; - mb2binfo.Kernel.VirtualBase = (void *)(load_base_addr->load_base_addr + 0xC0000000); - debug("Kernel base: %p (physical) %p (virtual)", mb2binfo.Kernel.PhysicalBase, mb2binfo.Kernel.VirtualBase); - break; - } - default: - { - error("Unknown multiboot2 tag type: %d", Tag->type); - break; - } - } - } -} - -EXTERNC void Multiboot2Entry(unsigned long Info, unsigned int Magic) -{ - if (Info == NULL || Magic == NULL) - { - if (Magic == NULL) - error("Multiboot magic is NULL"); - if (Info == NULL) - error("Multiboot info is NULL"); - CPU::Stop(); - } - else if (Magic != MULTIBOOT2_BOOTLOADER_MAGIC) - { - error("Multiboot magic is invalid (%#x != %#x)", Magic, MULTIBOOT2_BOOTLOADER_MAGIC); - CPU::Stop(); - } - - uint64_t div = 1193180 / 1000; - outb(0x43, 0xB6); - outb(0x42, (uint8_t)div); - outb(0x42, (uint8_t)(div >> 8)); - uint8_t tmp = inb(0x61); - if (tmp != (tmp | 3)) - outb(0x61, tmp | 3); - - ProcessMB2(Info); - - tmp = inb(0x61) & 0xFC; - outb(0x61, tmp); - - CPU::Stop(); - Entry(&mb2binfo); -} diff --git a/Architecture/i386/linker.ld b/Architecture/i386/linker.ld index fa2a33c..165ea54 100644 --- a/Architecture/i386/linker.ld +++ b/Architecture/i386/linker.ld @@ -18,31 +18,33 @@ OUTPUT_FORMAT(elf32-i386) OUTPUT_ARCH(i386) -ENTRY(MB2_start) +ENTRY(_start) SECTIONS { - . = 0xC0100000; - _kernel_start = .; + . = 0xC0000000; - .text ALIGN(4096) : AT(ADDR(.text) - 0xC0000000) + _kernel_start = .; + .text : { - *(.multiboot2) *(.text .text.*) } - _kernel_text_end = .; + _kernel_text_end = ALIGN(CONSTANT(MAXPAGESIZE)); + . += CONSTANT(MAXPAGESIZE); - .data ALIGN (4096) : AT(ADDR(.data) - 0xC0000000) + .data : { *(.data .data.*) } - _kernel_data_end = .; + _kernel_data_end = ALIGN(CONSTANT(MAXPAGESIZE)); + . += CONSTANT(MAXPAGESIZE); - .rodata ALIGN (4096) : AT(ADDR(.rodata) - 0xC0000000) + .rodata : { *(.rodata .rodata.*) } - _kernel_rodata_end = .; + _kernel_rodata_end = ALIGN(CONSTANT(MAXPAGESIZE)); + . += CONSTANT(MAXPAGESIZE); .init_array : { @@ -61,12 +63,13 @@ SECTIONS } . += CONSTANT(MAXPAGESIZE); - .bss ALIGN (4096) : AT(ADDR(.bss) - 0xC0000000) + .bss : { *(COMMON) *(.bss .bss.*) } - _kernel_end = .; + . += CONSTANT(MAXPAGESIZE); + _kernel_end = ALIGN(CONSTANT(MAXPAGESIZE)); /DISCARD/ : { diff --git a/Core/Memory/Memory.cpp b/Core/Memory/Memory.cpp index 222f6b7..827bee5 100644 --- a/Core/Memory/Memory.cpp +++ b/Core/Memory/Memory.cpp @@ -275,7 +275,7 @@ NIF void InitializeMemoryManagement(BootInfo *Info) break; } - debug("%lld: %#016llx-%#016llx %s", + debug("%ld: %p-%p %s", i, Base, End, diff --git a/Makefile b/Makefile index 43362f5..fce20b2 100644 --- a/Makefile +++ b/Makefile @@ -193,4 +193,4 @@ endif $(NM) $@ clean: - rm -f *.bin *.o *.elf *.sym kernel.map kernel_dump.map kernel_dump_intel.map initrd.tar.gz $(OBJ) $(STACK_USAGE_OBJ) $(GCNO_OBJ) $(KERNEL_FILENAME) + rm -f *.bin *.o *.elf *.sym kernel.map kernel_dump.map kernel_dump_intel.map $(OBJ) $(STACK_USAGE_OBJ) $(GCNO_OBJ) $(KERNEL_FILENAME)