From 7832665e4793fbb8d175a961103e5db60926a4ef Mon Sep 17 00:00:00 2001 From: portasynthinca3 Date: Sun, 22 Dec 2019 19:33:06 +0300 Subject: [PATCH] Make the system fuly UEFI-compatible; interrupts still need to be done --- build/neutron.img | Bin 1474560 -> 1474560 bytes src/drivers/acpi.c | 25 +++++---- src/drivers/acpi.h | 4 +- src/drivers/gfx.c | 8 +-- src/quark.c | 13 +++-- src/stdlib.c | 128 +++++++++++++++++++++++++-------------------- 6 files changed, 99 insertions(+), 79 deletions(-) diff --git a/build/neutron.img b/build/neutron.img index 0fda5ba3660c8c207b287cb4ac34183ac2990056..4ebf1c8d542df2af26e48ac01190f1cb8edd78de 100644 GIT binary patch delta 19670 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 IcU~L&f8{}etpET3 delta 19156 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 XfFIxw1OS2ME5^4ejKS}4PKf^xqxIVp diff --git a/src/drivers/acpi.c b/src/drivers/acpi.c index 7ad542f..8aa42e9 100644 --- a/src/drivers/acpi.c +++ b/src/drivers/acpi.c @@ -1,11 +1,16 @@ //Neutron project //ACPI driver +#include +#include + #include "./acpi.h" #include "./pit.h" #include "../stdlib.h" #include "./gfx.h" +EFI_SYSTEM_TABLE* quark_get_efi_systable(void); + uint32_t acpi_smi_cmd; uint8_t acpi_en; uint8_t acpi_dis; @@ -21,7 +26,6 @@ uint8_t acpi_pm1_ctl_len; * Initializes ACPI */ uint32_t acpi_init(void){ - gfx_verbose_println("Initializing ACPI"); //Find the RSDP acpi_rsdp_t* rsdp = acpi_find_rsdp(); //If no RSDP was found, return @@ -31,7 +35,7 @@ uint32_t acpi_init(void){ } //Fetch RSDT from RSDP - acpi_rsdt_t* rsdt = (acpi_rsdt_t*)rsdp->rsdt_ptr; + acpi_rsdt_t* rsdt = (acpi_rsdt_t*)(uint64_t)rsdp->rsdt_ptr; //Check if it's valid if(!acpi_sdt_checksum(&rsdt->hdr)){ gfx_verbose_println("Error: RSDP is not valid"); @@ -93,6 +97,7 @@ uint32_t acpi_init(void){ gfx_verbose_println("Sending enable commands (this might take a while)"); //Enable ACPI outb(acpi_smi_cmd, acpi_en); + /* uint32_t start = pit_ticks(); while((pit_ticks() - start <= 1500) && ((inw(acpi_pm1a_ctl) & acpi_sci_en) == 0)); @@ -101,6 +106,7 @@ uint32_t acpi_init(void){ while((pit_ticks() - start <= 1500) && ((inw(acpi_pm1b_ctl) & acpi_sci_en) == 0)); } + */ gfx_verbose_println("ACPI successfully initialized"); @@ -147,14 +153,13 @@ uint8_t acpi_sdt_checksum(acpi_sdt_hdr_t* rsdt){ * Finds ACPI RSDT pointer (RSDP) in memory */ acpi_rsdp_t* acpi_find_rsdp(void){ - //Go through addresses 0xE0000 - 0xFFFFF - for(void* ptr = (void*)0xE0000; ptr <= (void*)0xFFFFF; ptr++){ - //Check the signature - //Note that we use memcmp as the signature is not zero-terminated - if(memcmp(((acpi_rsdp_t*)ptr)->signature, "RSD PTR ", 8) == 0) - return ptr; + //Search for the pointer in the UEFI config table + EFI_CONFIGURATION_TABLE* config_table = quark_get_efi_systable()->ConfigurationTable; + for(uint32_t i = 0; i < quark_get_efi_systable()->NumberOfTableEntries; i++){ + //If the GUID is ACPI 1.0 RSDP pointer GUID, return it + if(memcmp(&(config_table[i].VendorGuid), &(EFI_GUID)ACPI_TABLE_GUID, sizeof(EFI_GUID)) == 0) + return config_table[i].VendorTable; } - //Return null if no RSDP was found return NULL; } @@ -167,7 +172,7 @@ void* rsdt_find(acpi_rsdt_t* rsdt, char* table){ //Cycle through each entry for(uint32_t e = 0; e < rsdt_entries; e++){ //Get the SDT header - acpi_sdt_hdr_t* hdr = (acpi_sdt_hdr_t*)(rsdt->ptrs + e); + acpi_sdt_hdr_t* hdr = (acpi_sdt_hdr_t*)(uint64_t)(rsdt->ptrs + e); //Compare its signature with the desired one if(*(uint32_t*)(hdr) == *(uint32_t*)(table)) return (void*)hdr; diff --git a/src/drivers/acpi.h b/src/drivers/acpi.h index 089be7c..8aca17e 100644 --- a/src/drivers/acpi.h +++ b/src/drivers/acpi.h @@ -19,7 +19,7 @@ typedef struct { //ACPI RSDT table typedef struct { acpi_sdt_hdr_t hdr; - acpi_sdt_hdr_t** ptrs; + uint32_t ptrs; } __attribute__((packed)) acpi_rsdt_t; //ACPI RSDP structure @@ -28,7 +28,7 @@ typedef struct { uint8_t checksum; char oem[6]; uint8_t rev; - acpi_sdt_hdr_t* rsdt_ptr; + uint32_t rsdt_ptr; } __attribute__((packed)) acpi_rsdp_t; //ACPI Generic Address Structure (GAS) diff --git a/src/drivers/gfx.c b/src/drivers/gfx.c index cfb0204..9d39e76 100644 --- a/src/drivers/gfx.c +++ b/src/drivers/gfx.c @@ -55,7 +55,7 @@ void gfx_init(void){ //If it hadn't been found, print an error if(graphics_output == NULL){ quark_get_efi_systable()->ConOut->OutputString(quark_get_efi_systable()->ConOut, - (CHAR16*)L"Unable to find the graphics output protocol\r\n"); + (CHAR16*)L"Error: Unable to find the graphics output protocol\r\n"); while(1); } else { quark_get_efi_systable()->ConOut->OutputString(quark_get_efi_systable()->ConOut, @@ -68,7 +68,7 @@ void gfx_init(void){ res_y = graphics_output->Mode->Info->VerticalResolution; vbe_buffer = (color32_t*)graphics_output->Mode->FrameBufferBase; //Allocate the second buffer based on the screen size - //sec_buffer = (color32_t*)malloc(res_x * res_y * sizeof(color32_t)); + sec_buffer = (color32_t*)malloc(res_x * res_y * sizeof(color32_t)); } /* @@ -164,8 +164,8 @@ void gfx_choose_best(void){ //Do not exceed the display resolution uint32_t mode_res_x = mode_info->HorizontalResolution; uint32_t mode_res_y = mode_info->VerticalResolution; - if((mode_res_x > best_res_x || mode_res_y > best_res_y)/* && - mode_res_y <= mon_best_res_y && mode_res_x <= mon_best_res_x*/){ + if((mode_res_x > best_res_x || mode_res_y > best_res_y) && + mode_res_y <= mon_best_res_y && mode_res_x <= mon_best_res_x){ //Record the new best mode best_res_y = mode_res_y; best_res_x = mode_res_x; diff --git a/src/quark.c b/src/quark.c index c0f608e..f06e240 100644 --- a/src/quark.c +++ b/src/quark.c @@ -140,10 +140,10 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable //Initialize x87 FPU __asm__ volatile("finit"); //Do some initialization stuff - //dram_init(); + dram_init(); //Set verbose mode - quark_verbose = 0; + quark_verbose = 1; gfx_set_verbose(quark_verbose); //Initialize PICs @@ -191,7 +191,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable //Do some graphics-related initialization stuff gfx_init(); - gfx_set_buf(GFX_BUF_VBE); //Enable doublebuffering + gfx_set_buf(GFX_BUF_SEC); //Enable doublebuffering gfx_fill(COLOR32(255, 0, 0, 0)); gfx_set_font(font_neutral); @@ -206,8 +206,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable gfx_draw_xbm((p2d_t){.x = (gfx_res_x() - neutron_logo_width) / 2, .y = 50}, neutron_logo_bits, (p2d_t){.x = neutron_logo_width, .y = neutron_logo_height}, COLOR32(255, 255, 255, 255), COLOR32(255, 0, 0, 0)); //Print the boot process - quark_boot_status(">>> Loading... <<<", 0); - while(1); + quark_boot_status(">>> Loading <<<", 0); //Initialize PS/2 quark_boot_status(">>> Initializing PS/2 <<<", 15); @@ -225,7 +224,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable quark_boot_status(">>> Configuring GUI <<<", 90); gui_init(); //The loading process is done! - quark_boot_status(">>> Done! <<<", 100); + quark_boot_status(">>> Done <<<", 100); //Constantly update the GUI while(1){ @@ -239,7 +238,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable void quark_exc(void){ //Print some info unsigned int ip; - __asm__ volatile("mov %0, %%edx" : "=r" (ip)); + __asm__ volatile("mov %%edx, %0" : "=r" (ip)); gfx_panic(ip, QUARK_PANIC_CPUEXC_CODE); //Hang diff --git a/src/stdlib.c b/src/stdlib.c index 3bc9ce8..cb3e39a 100644 --- a/src/stdlib.c +++ b/src/stdlib.c @@ -1,25 +1,22 @@ //Neutron Project //C Standard Library +#include +#include + #include "./stdlib.h" #include "./drivers/gfx.h" +EFI_SYSTEM_TABLE* quark_get_efi_systable(void); + free_block_t* first_free_block; void* gen_free_base; void* gen_free_top; -uint32_t bad_ram_size = 0; +uint64_t bad_ram_size = 0; uint64_t total_ram_size = 0; -uint32_t usable_ram_size = 0; uint32_t stdlib_usable_ram(void){ - return usable_ram_size; -} - -/* - * Trigger bochs magic breakpoint - */ -volatile void breakpoint(){ - __asm__("xchgw %bx, %bx;"); + return total_ram_size; } /* @@ -29,57 +26,73 @@ void abort(){ while(1); } -/* - * Print a string through Bochs's E9 debug port if the port_e9_hack config setting is enabled - */ -void puts_e9(char* str){ - char c; - //Fetch the next character - while(c = *(str++)) - outb(0xE9, c); //Write it -} - /* * Initialize the dynamic memory allocator */ void dram_init(void){ - first_free_block = NULL; - //Parse the memory map - //It was put in memory as a result of a - // collaboration between Muon-2 and BIOS - uint32_t blk_type = 0; - volatile void* volatile block_base = (void*)(0x93C00); - //Keep track of the block with the most size - size_t largest_blk_size = 0; - void* largset_blk_ptr = NULL; - //Type=0 marks the end - while((blk_type = *(uint32_t*)(block_base + 16)) != 0){ - //Fetch block base - uint64_t base = *(uint64_t*)(block_base); - //Fetch block length - uint64_t size = *(uint64_t*)(block_base + 8); - //Record the total amount of available RAM - total_ram_size += size; - //Only record the block if it's marked as type 1 (usable RAM) - if(blk_type == 1 && size > 0){ - //Only record the block if it stretches over the fifth megabyte - // and its size is larger than the currently found one - if(size + base >= 5 * 1024 * 1024 && size > largest_blk_size){ - uint64_t shrink = (5 * 1024 * 1025) - base; - size -= shrink; - largest_blk_size = size; - largset_blk_ptr = (void*)base + shrink; - } - } else if(blk_type == 5){ //Type 5 means bad RAM (used to tell the user) - bad_ram_size += size; + //Get the memory map from EFI + EFI_MEMORY_DESCRIPTOR* buf; + uint64_t desc_size; + uint32_t desc_ver; + uint64_t size, map_key, mapping_size; + EFI_MEMORY_DESCRIPTOR* desc; + EFI_STATUS status; + uint32_t i = 0; + //Allocate some memory + size = sizeof(EFI_MEMORY_DESCRIPTOR) * 31; + mem_map_retry: + size += sizeof(EFI_MEMORY_DESCRIPTOR) * 31; + status = quark_get_efi_systable()->BootServices->AllocatePool(EfiLoaderData, size, (void*)&buf); + if(EFI_ERROR(status)){ + quark_get_efi_systable()->ConOut->OutputString(quark_get_efi_systable()->ConOut, + (CHAR16*)L"Failed to allocate memory for the memory map\r\n"); + while(1); + } + //Map the memory + status = quark_get_efi_systable()->BootServices->GetMemoryMap(&size, buf, &map_key, &desc_size, &desc_ver); + //Re-allocate the buffer with a different size if the current one isn't sufficient + if(EFI_ERROR(status)){ + if(status == EFI_BUFFER_TOO_SMALL){ + quark_get_efi_systable()->BootServices->FreePool(buf); + goto mem_map_retry; + } else { + quark_get_efi_systable()->ConOut->OutputString(quark_get_efi_systable()->ConOut, + (CHAR16*)L"Failed to get the memory map\r\n"); + while(1); + } + } + + desc = buf; + void* best_block_start = NULL; + uint64_t best_block_size = 0; + //Fetch the next descriptor + while((void*)desc < (void*)buf + size){ + mapping_size = desc->NumberOfPages * EFI_PAGE_SIZE; + + //If a new free memory block was found, record it + if(desc->Type == EfiConventionalMemory && mapping_size > best_block_size){ + best_block_size = mapping_size; + best_block_start = (void*)desc->PhysicalStart; } - //Move on to the next block - block_base += 24; + //Record bad RAM + else if(desc->Type == EfiUnusableMemory){ + bad_ram_size += mapping_size; + } + + desc = (void*)desc + desc_size; + i++; + } + + //Set up general free heap + gen_free_base = best_block_start; + gen_free_top = best_block_start + best_block_size; + total_ram_size += best_block_size; + + if(gen_free_top == NULL){ + quark_get_efi_systable()->ConOut->OutputString(quark_get_efi_systable()->ConOut, + (CHAR16*)L"No usable memory was found\r\n"); + while(1); } - //Save the information - gen_free_base = largset_blk_ptr; - gen_free_top = largset_blk_ptr + largest_blk_size; - usable_ram_size = largest_blk_size; } /* @@ -198,10 +211,13 @@ void* memset(void* dst, int ch, size_t size){ */ void* memcpy(void* destination, const void* source, size_t num){ //We can use the REP MOVx instruction to perform a blazing-fast memory-to-memory data transfer + //Q = 8 bytes at a time //D = 4 bytes at a time //W = 2 bytes at a time //B = 1 byte at a time - if(num % 4 == 0) + if(num % 8 == 0) + __asm__ volatile("rep movsq" : : "D" (destination), "S" (source), "c" (num / 4)); + else if(num % 4 == 0) __asm__ volatile("rep movsd" : : "D" (destination), "S" (source), "c" (num / 4)); else if(num % 2 == 0) __asm__ volatile("rep movsw" : : "D" (destination), "S" (source), "c" (num / 2));