summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2021-04-28 15:35:03 +0000
committerAda Christine <adachristine18@gmail.com>2021-04-28 15:35:03 +0000
commit4fffc7eb44a6d85fdc5627a71cff4f392068f5e7 (patch)
tree97f938e816d6aec5a3befdf425dc42b997d67760
parenta2e3cd1932263b3b8084803beaa16669bf88f504 (diff)
changed loader allocation, preparing for boot data revamp
-rw-r--r--api/loader/data_efi.h (renamed from api/loader/data.h)19
-rw-r--r--kernel/entry_efi.c15
-rw-r--r--kernel/memory.c12
-rw-r--r--loader/loader_efi.c69
-rw-r--r--loader/memory_efi.c2
5 files changed, 66 insertions, 51 deletions
diff --git a/api/loader/data.h b/api/loader/data_efi.h
index 5bbf2a9..f159de6 100644
--- a/api/loader/data.h
+++ b/api/loader/data_efi.h
@@ -1,10 +1,20 @@
#pragma once
+#include <kernel/memory/range.h>
+
#include <efi.h>
+#include <stddef.h>
+
#define EfiUserMemoryType (EFI_MEMORY_TYPE)0x80000000
#define SystemMemoryType EfiUserMemoryType | 0x01
+enum efi_boot_data_type
+{
+ MEMORY_MAP_DATA,
+ FRAMEBUFFER_DATA,
+};
+
struct efi_memory_map_data
{
UINTN size;
@@ -16,14 +26,13 @@ struct efi_memory_map_data
struct efi_framebuffer_data
{
- EFI_PIXEL_BITMASK bitmask;
- EFI_PHYSICAL_ADDRESS base;
- UINTN size;
+ struct memory_range buffer;
UINT32 width;
UINT32 height;
UINT32 pitch;
- EFI_GRAPHICS_PIXEL_FORMAT pixel_format;
- UINT8 pixel_size;
+ UINT8 pxsize;
+ EFI_PIXEL_BITMASK bitmask;
+ EFI_GRAPHICS_PIXEL_FORMAT pxformat;
};
struct efi_boot_data
diff --git a/kernel/entry_efi.c b/kernel/entry_efi.c
index f4eeb9c..5eecaf2 100644
--- a/kernel/entry_efi.c
+++ b/kernel/entry_efi.c
@@ -1,4 +1,11 @@
-#include <loader/data.h>
+#include "cpu.h"
+#include "serial.h"
+#include "kprint.h"
+#include "memory.h"
+#include "panic.h"
+
+#include <loader/data_efi.h>
+
#include <kernel/entry.h>
#include <stdbool.h>
@@ -6,12 +13,6 @@
#include <stdint.h>
#include <stdnoreturn.h>
-#include "cpu.h"
-#include "serial.h"
-#include "kprint.h"
-#include "memory.h"
-#include "panic.h"
-
static void efi_memory_init(struct efi_memory_map_data *map)
{
// FIXME: bad girl shit: overwriting on aliased pointers.
diff --git a/kernel/memory.c b/kernel/memory.c
index 08028c6..31dd6f1 100644
--- a/kernel/memory.c
+++ b/kernel/memory.c
@@ -468,20 +468,20 @@ int anonymous_page_handler(uint32_t code, void *address)
{
// create a page table and install it
phys_addr_t pm1_phys = page_alloc();
- uint64_t *pm1;
if (pm1_phys)
{
+ uint64_t *pm1;
pm1 = page_map_at(temp, pm1_phys, CONTENT_RWDATA|SIZE_2M);
+ // zero the page
+ memset(pm1, 0, PAGE_SIZE);
+ // put the table where it goes
+ *pm2e = page_address(pm1_phys, 1)|PAGE_WR|PAGE_PR;
+ page_unmap(pm1);
}
else
{
panic(OUT_OF_MEMORY);
}
- // zero the page
- memset(pm1, 0, PAGE_SIZE);
- // put the table where it goes
- *pm2e = page_address(pm1_phys, 1)|PAGE_WR|PAGE_PR;
- page_unmap(pm1);
}
uint64_t *pm1e = get_kernel_pm1e(address);
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
{
diff --git a/loader/memory_efi.c b/loader/memory_efi.c
index 83c83a8..b2d38ee 100644
--- a/loader/memory_efi.c
+++ b/loader/memory_efi.c
@@ -1,6 +1,6 @@
#include "loader_efi.h"
-#include <loader/data.h>
+#include <loader/data_efi.h>
#include <kernel/memory/paging.h>
struct memory_range system_allocate(size_t size)