summaryrefslogtreecommitdiff
path: root/loader/loader_efi.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader/loader_efi.c')
-rw-r--r--loader/loader_efi.c182
1 files changed, 0 insertions, 182 deletions
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
deleted file mode 100644
index 23540ef..0000000
--- a/loader/loader_efi.c
+++ /dev/null
@@ -1,182 +0,0 @@
-#include "loader_efi.h"
-
-#include <loader/data_efi.h>
-
-#include <kernel/entry.h>
-
-static CHAR16 *kernel_path = L"\\adasoft\\sophia\\kernel.os";
-static struct system_image *kernel_image = NULL;
-
-static struct efi_memory_map_data *get_memory_map_data(void);
-static struct efi_framebuffer_data *get_framebuffer_data(void);
-static void *get_acpi_data(void);
-
-noreturn static void enter_kernel()
-{
- struct efi_boot_data data;
- kernel_entry_func kernel_entry;
- kernel_entry = (kernel_entry_func)(kernel_image->ehdr.e_entry);
-
- struct memory_range kernel_entry_stack =
- system_allocate(KERNEL_ENTRY_STACK_SIZE);
-
- // get a stack here for now idfk
- paging_map_range(KERNEL_ENTRY_STACK_BASE,
- &kernel_entry_stack,
- DATA_PAGE_TYPE);
-
- data.acpi = get_acpi_data();
- data.framebuffer = get_framebuffer_data();
- data.memory_map = get_memory_map_data();
-
- EFI_STATUS status = e_bs->ExitBootServices(e_image_handle,
- data.memory_map->key);
-
- if (EFI_ERROR(status))
- {
- Print(L"failed exiting boot services environment: %r\r\n", status);
- efi_exit(status);
- }
-
- // enter the kernel address environment
- paging_enter();
-
- // set the kernel entry stack.
- __asm__
- (
- "mov %0, %%rsp"
- :
- : "r"((uint64_t)KERNEL_ENTRY_STACK_HEAD)
- );
-
- kernel_entry(&data);
-
- while(true);
-}
-
-void loader_main(void)
-{
- kernel_image = system_image_open(kernel_path);
-
- Print(L"loading %s\r\n", kernel_path);
-
- if (system_image_load(kernel_image))
- {
- Print(L"loaded kernel image at base %16.0lx size %d bytes\r\n",
- kernel_image->buffer.base,
- kernel_image->buffer.size);
- }
- else
- {
- Print(L"failed loading kernel image\r\n");
- efi_exit(EFI_ABORTED);
- }
-
- paging_init();
- system_image_map(kernel_image);
- Print(L"kernel maps created. entering kernel\r\n");
- enter_kernel();
-
- efi_exit(EFI_ABORTED);
-}
-
-static struct efi_memory_map_data *get_memory_map_data(void)
-{
- EFI_STATUS status;
- UINTN mapsize = 0;
- struct efi_memory_map_data *map = NULL;
-
- status = e_bs->GetMemoryMap(&mapsize, NULL, NULL, NULL, NULL);
-
- if (status == EFI_BUFFER_TOO_SMALL)
- {
- map = efi_allocate(sizeof(*map) + mapsize);
- }
-
- if (map)
- {
- status = e_bs->GetMemoryMap(&map->size,
- map->data,
- &map->key,
- &map->descsize,
- &map->descver);
- }
- else
- {
- status = e_last_error;
- }
-
- if (EFI_ERROR(status))
- {
- Print(L"failed getting memory map: %r\r\n", status);
- return NULL;
- }
-
- return map;
-}
-
-static struct efi_framebuffer_data *get_framebuffer_data(void)
-{
- struct efi_framebuffer_data *framebuffer;
-
- if (!e_graphics_output)
- {
- return NULL;
- }
-
- framebuffer = efi_allocate(sizeof(*framebuffer));
-
- if (framebuffer)
- {
- EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *mode = e_graphics_output->Mode;
-
- framebuffer->bitmask = mode->Info->PixelInformation;
- framebuffer->width = mode->Info->HorizontalResolution;
- framebuffer->height = mode->Info->VerticalResolution;
- framebuffer->buffer.base = mode->FrameBufferBase;
- framebuffer->buffer.size = mode->FrameBufferSize;
- framebuffer->buffer.type = RESERVED_MEMORY;
- framebuffer->pxformat = mode->Info->PixelFormat;
-
- switch (framebuffer->pxformat)
- {
- //falthrough
- case PixelBlueGreenRedReserved8BitPerColor:
- case PixelRedGreenBlueReserved8BitPerColor:
- framebuffer->pxsize = sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
- break;
- default:
- // TODO: calculate pixel size for bitmask format
- framebuffer->pxsize = 0;
- }
-
- framebuffer->pitch = framebuffer->width * framebuffer->pxsize;
- }
- else
- {
- Print(L"failed getting framebuffer data: %r\r\n", e_last_error);
- return NULL;
- }
-
- return framebuffer;
-}
-
-static void *get_acpi_data(void)
-{
- struct efi_acpi_data *acpi = efi_allocate(sizeof(*acpi));
-
- EFI_GUID acpi_20_guid = ACPI_20_TABLE_GUID;
-
- for (UINTN i = 0; acpi && i < e_st->NumberOfTableEntries; i++)
- {
- if (!CompareGuid(&acpi_20_guid, &e_st->ConfigurationTable[i].VendorGuid))
- {
- acpi->rsdp = e_st->ConfigurationTable[i].VendorTable;
- return acpi;
- }
- }
-
- Print(L"failed getting acpi rsdp\r\n");
- return NULL;
-}
-