From f9fe2f96ed42a44c6fcf2a62da9940fcbb9096ca Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 20 Aug 2021 18:28:51 +0200 Subject: [PATCH] misc: Bug fixes --- stage23/lib/blib.c | 3 +-- stage23/lib/print.s2.c | 11 +++++++---- stage23/mm/pmm.s2.c | 28 +++++++--------------------- stage23/protos/linux.32.c | 3 ++- stage23/protos/linux.c | 17 +++++++---------- stage23/protos/multiboot1.32.c | 3 +-- 6 files changed, 25 insertions(+), 40 deletions(-) diff --git a/stage23/lib/blib.c b/stage23/lib/blib.c index b8811a35..12e2e276 100644 --- a/stage23/lib/blib.c +++ b/stage23/lib/blib.c @@ -129,14 +129,13 @@ bool efi_exit_boot_services(void) { EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * efi_desc_size; uint64_t base = entry->PhysicalStart; - uint64_t length = entry->NumberOfPages * 4096; // Find for a match in the untouched memory map for (size_t j = 0; j < untouched_memmap_entries; j++) { if (untouched_memmap[j].type != MEMMAP_USABLE) continue; - if (untouched_memmap[j].base == base && untouched_memmap[j].length == length) { + if (untouched_memmap[j].base == base) { // It's a match! entry->Type = EfiConventionalMemory; break; diff --git a/stage23/lib/print.s2.c b/stage23/lib/print.s2.c index 8f83e83e..62d4036e 100644 --- a/stage23/lib/print.s2.c +++ b/stage23/lib/print.s2.c @@ -121,11 +121,11 @@ void vprint(const char *fmt, va_list args) { // Init com1 outb(0x3F8 + 1, 0x00); outb(0x3F8 + 3, 0x80); - outb(0x3F8 + 0, 0x01); + outb(0x3F8 + 0, 0x0c); // 9600 baud outb(0x3F8 + 1, 0x00); outb(0x3F8 + 3, 0x03); - outb(0x3F8 + 2, 0xC7); - outb(0x3F8 + 4, 0x0B); + outb(0x3F8 + 2, 0xc7); + outb(0x3F8 + 4, 0x0b); com_initialised = true; } @@ -191,8 +191,11 @@ out: outb(0xe9, print_buf[i]); } if (COM_OUTPUT) { - if (print_buf[i] == '\n') + if (print_buf[i] == '\n') { + while ((inb(0x3f8 + 5) & 0x20) == 0); outb(0x3f8, '\r'); + } + while ((inb(0x3f8 + 5) & 0x20) == 0); outb(0x3f8, print_buf[i]); } } diff --git a/stage23/mm/pmm.s2.c b/stage23/mm/pmm.s2.c index c9989cf3..cb74d057 100644 --- a/stage23/mm/pmm.s2.c +++ b/stage23/mm/pmm.s2.c @@ -376,33 +376,18 @@ void pmm_reclaim_uefi_mem(void) { } struct e820_entry_t recl; - size_t efi_mmap_recl_begin; - size_t efi_mmap_entry_count = efi_mmap_size / efi_desc_size; for (size_t i = 0; ; i++) { - if (memmap[i].type != MEMMAP_EFI_RECLAIMABLE) - continue; - - recl = memmap[i]; - - // Go through EFI memmap and find an entry that starts at our base - for (efi_mmap_recl_begin = 0; - efi_mmap_recl_begin < efi_mmap_entry_count; efi_mmap_recl_begin++) { - EFI_MEMORY_DESCRIPTOR *entry = - (void *)efi_mmap + efi_mmap_recl_begin * efi_desc_size; - - if (entry->PhysicalStart != memmap[i].base) - continue; - + if (memmap[i].type == MEMMAP_EFI_RECLAIMABLE) { + recl = memmap[i]; break; } - - break; } // Punch holes in our EFI reclaimable entry for every EFI area which is // boot services or conventional that fits within - for (size_t i = efi_mmap_recl_begin; i < efi_mmap_entry_count; i++) { + size_t efi_mmap_entry_count = efi_mmap_size / efi_desc_size; + for (size_t i = 0; i < efi_mmap_entry_count; i++) { EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * efi_desc_size; uintptr_t base = recl.base; @@ -426,14 +411,13 @@ void pmm_reclaim_uefi_mem(void) { efi_top = top; } + // Sanity check if (!(efi_base >= base && efi_base < top && efi_top > base && efi_top <= top)) continue; uint32_t our_type; switch (entry->Type) { - default: - our_type = MEMMAP_RESERVED; break; case EfiBootServicesCode: case EfiBootServicesData: case EfiConventionalMemory: @@ -442,6 +426,8 @@ void pmm_reclaim_uefi_mem(void) { our_type = MEMMAP_ACPI_RECLAIMABLE; break; case EfiACPIMemoryNVS: our_type = MEMMAP_ACPI_NVS; break; + default: + our_type = MEMMAP_RESERVED; break; } memmap_alloc_range(efi_base, efi_size, our_type, false, true, false, true); diff --git a/stage23/protos/linux.32.c b/stage23/protos/linux.32.c index ca4269cd..c5a9daaf 100644 --- a/stage23/protos/linux.32.c +++ b/stage23/protos/linux.32.c @@ -33,8 +33,9 @@ __attribute__((noreturn)) void linux_spinup(void *entry, void *boot_params) { "pushl $0x10\n\t" "call 1f\n\t" "1:\n\t" - "addl $5, (%%esp)\n\t" + "addl $2f-1b, (%%esp)\n\t" "lret\n\t" + "2:\n\t" "movl $0x18, %%eax\n\t" "movl %%eax, %%ds\n\t" diff --git a/stage23/protos/linux.c b/stage23/protos/linux.c index d8dc1038..668fdf98 100644 --- a/stage23/protos/linux.c +++ b/stage23/protos/linux.c @@ -498,7 +498,8 @@ void linux_load(char *config, char *cmdline) { if (!fb_init(&fbinfo, req_width, req_height, req_bpp)) panic("linux: Unable to set video mode"); - screen_info->capabilities = VIDEO_CAPABILITY_64BIT_BASE; + screen_info->capabilities = VIDEO_CAPABILITY_64BIT_BASE | VIDEO_CAPABILITY_SKIP_QUIRKS; + screen_info->flags = VIDEO_FLAGS_NOCURSOR; screen_info->lfb_base = (uint32_t)fbinfo.framebuffer_addr; screen_info->ext_lfb_base = (uint32_t)(fbinfo.framebuffer_addr >> 32); screen_info->lfb_size = fbinfo.framebuffer_pitch * fbinfo.framebuffer_height; @@ -537,15 +538,11 @@ void linux_load(char *config, char *cmdline) { #if uefi == 1 efi_exit_boot_services(); - { - const char *efi_signature; - #if defined (__i386__) - efi_signature = "EL32"; - #elif defined (__x86_64__) - efi_signature = "EL64"; - #endif - memcpy(&boot_params->efi_info.efi_loader_signature, efi_signature, 4); - } + #if defined (__i386__) + memcpy(&boot_params->efi_info.efi_loader_signature, "EL32", 4); + #elif defined (__x86_64__) + memcpy(&boot_params->efi_info.efi_loader_signature, "EL64", 4); + #endif boot_params->efi_info.efi_systab = (uint32_t)(uint64_t)(uintptr_t)gST; boot_params->efi_info.efi_systab_hi = (uint32_t)((uint64_t)(uintptr_t)gST >> 32); diff --git a/stage23/protos/multiboot1.32.c b/stage23/protos/multiboot1.32.c index c67337a6..45d81ce8 100644 --- a/stage23/protos/multiboot1.32.c +++ b/stage23/protos/multiboot1.32.c @@ -8,13 +8,12 @@ __attribute__((noreturn)) void multiboot1_spinup_32( asm volatile ( "cld\n\t" - "pushfl\n\t" "pushl $0x18\n\t" "pushl %%edi\n\t" "movl $0x2BADB002, %%eax\n\t" - "iretl\n\t" + "lret\n\t" : : "D" (entry_point), "b" (multiboot1_info)