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.c69
1 files changed, 37 insertions, 32 deletions
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
index 7195ae5..08da215 100644
--- a/loader/loader_efi.c
+++ b/loader/loader_efi.c
@@ -1,6 +1,7 @@
#include "loader_efi.h"
-#include <loader/data.h>
+#include <loader/data_efi.h>
+
#include <kernel/entry.h>
#include <kernel/memory/paging.h>
@@ -123,10 +124,7 @@ static void map_pages(void *map,
}
}
-#define KERNEL_SPACE_LOWER 0xffffffff80000000
-#define KERNEL_SPACE_UPPER 0xffffffffc0000000
-
-static void create_kernel_maps(struct system_image *image)
+static void create_image_maps(struct system_image *image)
{
Elf64_Ehdr *ehdr = &image->ehdr;
Elf64_Phdr *phdrs = image->phdrs;
@@ -149,24 +147,9 @@ static void create_kernel_maps(struct system_image *image)
size);
}
}
-
-
- // Create fractal mappings
- uint64_t *lower_page_dir = get_page_table(system_page_map,
- KERNEL_SPACE_LOWER,
- 2);
- uint64_t *upper_page_dir = get_page_table(system_page_map,
- KERNEL_SPACE_UPPER,
- 2);
-
- upper_page_dir[PAGE_TABLE_INDEX_MASK] =
- (uint64_t)upper_page_dir|DATA_PAGE_TYPE;
- upper_page_dir[PAGE_TABLE_INDEX_MASK - 1] =
- (uint64_t)lower_page_dir|DATA_PAGE_TYPE;
-
}
-static void enter_kernel(struct system_image *kernel_image)
+static void enter_kernel()
{
struct efi_boot_data data;
kernel_entry_func kernel_entry;
@@ -213,6 +196,27 @@ static void enter_kernel(struct system_image *kernel_image)
kernel_entry(&data);
}
+#define KERNEL_SPACE_LOWER 0xffffffff80000000
+#define KERNEL_SPACE_UPPER 0xffffffffc0000000
+
+static void create_system_maps()
+{
+ system_page_map = new_page_table();
+
+ // Create fractal mappings
+ uint64_t *lower_page_dir = get_page_table(system_page_map,
+ KERNEL_SPACE_LOWER,
+ 2);
+ uint64_t *upper_page_dir = get_page_table(system_page_map,
+ KERNEL_SPACE_UPPER,
+ 2);
+
+ upper_page_dir[PAGE_TABLE_INDEX_MASK] =
+ (uint64_t)upper_page_dir|DATA_PAGE_TYPE;
+ upper_page_dir[PAGE_TABLE_INDEX_MASK - 1] =
+ (uint64_t)lower_page_dir|DATA_PAGE_TYPE;
+}
+
void loader_main(void)
{
kernel_image = open_system_image(kernel_path);
@@ -231,11 +235,11 @@ void loader_main(void)
efi_exit(EFI_ABORTED);
}
- system_page_map = new_page_table();
+ create_system_maps();
Print(L"kernel pml4 %16.0lx\r\n", system_page_map);
- create_kernel_maps(kernel_image);
+ create_image_maps(kernel_image);
Print(L"kernel maps created. entering kernel\r\n");
- enter_kernel(kernel_image);
+ enter_kernel();
efi_exit(EFI_ABORTED);
}
@@ -413,7 +417,7 @@ static struct efi_memory_map_data *get_memory_map_data(void)
if (status == EFI_BUFFER_TOO_SMALL)
{
- map = efi_allocate(sizeof(*map));
+ map = efi_allocate(sizeof(*map) + mapsize);
}
if (map)
@@ -456,23 +460,24 @@ static struct efi_framebuffer_data *get_framebuffer_data(void)
framebuffer->bitmask = mode->Info->PixelInformation;
framebuffer->width = mode->Info->HorizontalResolution;
framebuffer->height = mode->Info->VerticalResolution;
- framebuffer->base = mode->FrameBufferBase;
- framebuffer->size = mode->FrameBufferSize;
- framebuffer->pixel_format = mode->Info->PixelFormat;
+ framebuffer->buffer.base = mode->FrameBufferBase;
+ framebuffer->buffer.size = mode->FrameBufferSize;
+ framebuffer->buffer.type = RESERVED_MEMORY;
+ framebuffer->pxformat = mode->Info->PixelFormat;
- switch (framebuffer->pixel_format)
+ switch (framebuffer->pxformat)
{
//falthrough
case PixelBlueGreenRedReserved8BitPerColor:
case PixelRedGreenBlueReserved8BitPerColor:
- framebuffer->pixel_size = sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
+ framebuffer->pxsize = sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
break;
default:
// TODO: calculate pixel size for bitmask format
- framebuffer->pixel_size = 0;
+ framebuffer->pxsize = 0;
}
- framebuffer->pitch = framebuffer->width * framebuffer->pixel_size;
+ framebuffer->pitch = framebuffer->width * framebuffer->pxsize;
}
else
{