summaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2021-04-23 01:27:23 +0000
committerAda Christine <adachristine18@gmail.com>2021-04-23 01:27:23 +0000
commitee99fed2a52ac8bdd72d5fa1f4d798c7ef41248c (patch)
treec392fe821544f19f659a7569c06f70b6b5dbba20 /loader
parentb90e152c02aad225e83a3e6c1b80d1a0e396bb14 (diff)
using struct memory_range and a modifed allocation function
Diffstat (limited to 'loader')
-rw-r--r--loader/loader_efi.c65
-rw-r--r--loader/loader_efi.h4
-rw-r--r--loader/memory_efi.c25
3 files changed, 39 insertions, 55 deletions
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
index 2beb545..f9f1ebd 100644
--- a/loader/loader_efi.c
+++ b/loader/loader_efi.c
@@ -11,15 +11,9 @@
#define kernel_path L"\\adasoft\\sophia\\kernel.os"
-struct system_buffer
-{
- EFI_PHYSICAL_ADDRESS base;
- UINTN size;
-};
-
struct system_image
{
- struct system_buffer buffer;
+ struct memory_range buffer;
EFI_FILE_PROTOCOL *file;
Elf64_Ehdr ehdr;
Elf64_Phdr *phdrs;
@@ -42,30 +36,17 @@ enum page_type
static uint64_t *new_page_table(void)
{
- EFI_STATUS status;
- EFI_PHYSICAL_ADDRESS table_address;
-
- status = e_bs->AllocatePages(AllocateAnyPages,
- SystemMemoryType,
- 1,
- &table_address);
-
- if (EFI_ERROR(status))
- {
- Print(L"fatal: failed allocating page table: %r", status);
- efi_exit(status);
- }
-
- e_bs->SetMem((void *)table_address, EFI_PAGE_SIZE, 0);
+ struct memory_range table = system_allocate(page_size(1));
+ e_bs->SetMem((void *)table.base, table.size, 0);
- return (uint64_t *)table_address;
+ return (uint64_t *)table.base;
}
static uint64_t *get_page_map(void)
{
uint64_t map;
__asm__("mov %%cr3, %0" : "=r"(map));
- return (uint64_t *)(map & PAGE_ADDRESS_MASK);
+ return (uint64_t *)(page_address(map, 1));
}
void set_page_map(uint64_t *map)
@@ -134,7 +115,7 @@ static void map_pages(void *map,
enum page_type type,
size_t size)
{
- for (size_t offset = 0; offset < size; offset += EFI_PAGE_SIZE)
+ for (size_t offset = 0; offset < size; offset += page_size(1))
{
Print(L"mapping page %16.0lx to %16.0lx\r\n", virt + offset, phys + offset);
map_page(map, virt + offset, phys + offset, type);
@@ -184,40 +165,14 @@ static void create_kernel_maps(struct system_image *image)
}
-static struct system_buffer get_system_buffer(UINTN size)
-{
- EFI_STATUS status;
- struct system_buffer buffer;
-
- buffer.size = size;
-
- status = e_bs->AllocatePages(AllocateAnyPages,
- SystemMemoryType,
- EFI_SIZE_TO_PAGES(buffer.size),
- &buffer.base);
-
- if (EFI_ERROR(status))
- {
- Print(L"error allocating system buffer: %r\r\n", status);
- buffer.base = 0;
- buffer.size = 0;
- }
-
- Print(L"allocated system buffer at %16.0lx of %d bytes\r\n",
- buffer.base,
- buffer.size);
-
- return buffer;
-}
-
static void enter_kernel(struct system_image *kernel_image)
{
struct efi_boot_data data;
kernel_entry_func kernel_entry;
kernel_entry = (kernel_entry_func)(kernel_image->ehdr.e_entry);
- struct system_buffer kernel_entry_stack =
- get_system_buffer(KERNEL_ENTRY_STACK_SIZE);
+ struct memory_range kernel_entry_stack =
+ system_allocate(KERNEL_ENTRY_STACK_SIZE);
// get a stack here for now idfk
map_pages(kernel_image->maps,
@@ -401,9 +356,9 @@ static UINTN get_image_size(struct system_image *image)
static bool load_system_image(struct system_image *image)
{
- image->buffer = get_system_buffer(get_image_size(image));
+ image->buffer = system_allocate(get_image_size(image));
- if (!image->buffer.base)
+ if (image->buffer.type != SYSTEM_MEMORY)
{
return false;
}
diff --git a/loader/loader_efi.h b/loader/loader_efi.h
index a08f4c6..a1ba360 100644
--- a/loader/loader_efi.h
+++ b/loader/loader_efi.h
@@ -6,6 +6,8 @@
#include <stddef.h>
#include <stdnoreturn.h>
+#include <kernel/memory/range.h>
+
extern EFI_SYSTEM_TABLE *e_st;
extern EFI_BOOT_SERVICES *e_bs;
extern EFI_RUNTIME_SERVICES *e_rt;
@@ -18,6 +20,8 @@ extern EFI_STATUS e_last_error;
noreturn void efi_exit(EFI_STATUS status);
+struct memory_range system_allocate(size_t size);
+
void *efi_allocate(size_t size);
void efi_free(void *buffer);
diff --git a/loader/memory_efi.c b/loader/memory_efi.c
index 3dae44f..83c83a8 100644
--- a/loader/memory_efi.c
+++ b/loader/memory_efi.c
@@ -1,5 +1,30 @@
#include "loader_efi.h"
+#include <loader/data.h>
+#include <kernel/memory/paging.h>
+
+struct memory_range system_allocate(size_t size)
+{
+ EFI_STATUS status;
+ struct memory_range buffer;
+
+ buffer.type = SYSTEM_MEMORY;
+ buffer.size = size;
+
+ status = e_bs->AllocatePages(AllocateAnyPages,
+ SystemMemoryType,
+ page_count(buffer.size, 1),
+ &buffer.base);
+
+ if (EFI_ERROR(status))
+ {
+ e_last_error = status;
+ buffer.type = UNUSABLE_MEMORY;
+ }
+
+ return buffer;
+}
+
void *efi_allocate(size_t size)
{
EFI_STATUS status;