summaryrefslogtreecommitdiff
path: root/kc
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2021-12-26 01:12:31 +0000
committerAda Christine <adachristine18@gmail.com>2021-12-26 01:12:31 +0000
commit2b0734bdc362d5f453e5bfe833b534298072a56a (patch)
tree6007e56e35ef448b43c1de3e7e5998fd2ca360de /kc
parent257bdba7ddcc8d9893927c458e3c6e377c4e8d9c (diff)
everything builds, probably doesn't work. commit in preparation for a merge
Diffstat (limited to 'kc')
-rw-r--r--kc/boot/kc_main.c52
-rw-r--r--kc/core/kc_main.c52
-rw-r--r--kc/core/memory.c41
-rw-r--r--kc/core/memory.h18
4 files changed, 57 insertions, 106 deletions
diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c
index 1829616..744ced7 100644
--- a/kc/boot/kc_main.c
+++ b/kc/boot/kc_main.c
@@ -37,9 +37,55 @@ struct efi_loader_image kernel_image =
.path = L"\\adasoft\\sophia\\kernel.os"
};
+static struct efi_loader_interface *loader_interface;
static struct efi_boot_data boot_data;
-// TODO: split relocation code out into library
+static void collect_boot_data(void)
+{
+ EFI_BOOT_SERVICES *ebs = loader_interface->system_table->BootServices;
+ EFI_STATUS status;
+
+ boot_data.memory_map.size = 0;
+
+ status = ebs->GetMemoryMap(&boot_data.memory_map.size,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+
+ if (EFI_BUFFER_TOO_SMALL == status)
+ {
+ boot_data.memory_map.size += EFI_PAGE_SIZE;
+ status = loader_interface->page_alloc(SystemMemoryType,
+ boot_data.memory_map.size,
+ (EFI_PHYSICAL_ADDRESS *)&boot_data.memory_map.buffer.base);
+ }
+
+ if (!EFI_ERROR(status))
+ {
+ boot_data.memory_map.size = boot_data.memory_map.buffer.size;
+
+ status = ebs->GetMemoryMap(&boot_data.memory_map.size,
+ (EFI_MEMORY_DESCRIPTOR *)&boot_data.memory_map.buffer.base,
+ &boot_data.memory_map.key,
+ &boot_data.memory_map.descsize,
+ &boot_data.memory_map.descver);
+ }
+
+ if (EFI_ERROR(status))
+ {
+ __asm__ volatile
+ (
+ "cli\n\t"
+ "int3\n\t"
+ );
+
+ while (1)
+ {
+ __asm__ volatile ("hlt\n\t");
+ }
+ }
+}
EFI_STATUS kc_main(struct efi_loader_interface *interface)
{
@@ -56,11 +102,13 @@ EFI_STATUS kc_main(struct efi_loader_interface *interface)
return EFI_INVALID_PARAMETER;
}
+ loader_interface = interface;
+
if (!EFI_ERROR((status = interface->image_open(&kernel_image))) &&
!EFI_ERROR((status = interface->image_alloc(&kernel_image))) &&
!EFI_ERROR((status = interface->image_load(&kernel_image))))
{
- (void)boot_data;
+ collect_boot_data();
}
__asm__ volatile (
diff --git a/kc/core/kc_main.c b/kc/core/kc_main.c
index 5eecaf2..8242227 100644
--- a/kc/core/kc_main.c
+++ b/kc/core/kc_main.c
@@ -4,66 +4,18 @@
#include "memory.h"
#include "panic.h"
-#include <loader/data_efi.h>
-
#include <kernel/entry.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
-#include <stdnoreturn.h>
-static void efi_memory_init(struct efi_memory_map_data *map)
-{
- // FIXME: bad girl shit: overwriting on aliased pointers.
- // this is a temporary solution to shortcomings with
- // loader boot data. it's sort-of OK because the memory_range struct
- // is smaller than EFI_MEMORY_DESCRIPTOR. it's still not good.
- struct memory_range *ranges = (struct memory_range *)map->data;
- int entries = map->size / map->descsize;
-
- for (int i = 0; i < entries; i++)
- {
- EFI_MEMORY_DESCRIPTOR *desc;
- desc = (EFI_MEMORY_DESCRIPTOR *)((char *)map->data + i * map->descsize);
-
- enum memory_range_type type;
- phys_addr_t base;
- size_t size;
-
- base = desc->PhysicalStart;
- size = desc->NumberOfPages * EFI_PAGE_SIZE;
-
- switch (desc->Type)
- {
- case EfiConventionalMemory:
- case EfiBootServicesData:
- case EfiBootServicesCode:
- case EfiLoaderData:
- case EfiLoaderCode:
- type = AVAILABLE_MEMORY;
- break;
- case SystemMemoryType:
- type = SYSTEM_MEMORY;
- break;
- default:
- type = RESERVED_MEMORY;
- }
-
- ranges[i].type = type;
- ranges[i].base = base;
- ranges[i].size = size;
- }
-
- memory_init(ranges, entries);
-}
-
-noreturn void kernel_entry(struct efi_boot_data *data)
+unsigned long kc_main(void *data)
{
(void)data;
cpu_init();
serial_init();
kputs("<hacker voice> i'm in\r\n");
- efi_memory_init(data->memory_map);
halt();
}
+
diff --git a/kc/core/memory.c b/kc/core/memory.c
index 62f3a38..0e989fd 100644
--- a/kc/core/memory.c
+++ b/kc/core/memory.c
@@ -47,11 +47,7 @@ struct page
uint32_t used: 1;
};
-extern char k_virt_base;
-extern char k_text_begin;
-extern char k_text_end;
-extern char k_data_begin;
-extern char k_data_end;
+extern char kc_image_base;
static struct page *const page_array = (struct page *)0xffffffd800000000;
static int first_free_page_index = -1;
@@ -72,11 +68,6 @@ static void *page_map_at(void *vaddr, phys_addr_t paddr, enum page_map_flags fla
int anonymous_page_handler(uint32_t code, void *address);
// the system memory_space's that are always present
-static struct memory_space kernel_image_space;
-static struct memory_space kernel_stack_space;
-static struct memory_space kernel_pagemap_space;
-// the kernel's own heap space
-static struct memory_space kernel_heap_space;
// NULL if the system address spaces are not set up
static struct memory_space *root_memory_space;
@@ -150,7 +141,7 @@ static phys_addr_t get_kernel_pm3_phys(void)
CONTENT_RODATA|SIZE_2M);
// pm3_phys is in pm4.
- pm3_phys = page_address(pm4[pte_index(&k_virt_base, 4)], 1);
+ pm3_phys = page_address(pm4[pte_index(&kc_image_base, 4)], 1);
// never leave a temporary mapping
page_unmap(pm4);
@@ -287,32 +278,6 @@ static struct memory_space init_anonymous_space(void *base, void *head)
return space;
}
-void memory_init(struct memory_range *ranges, int count)
-{
- init_create_page_array(ranges, count);
- // initialize always-present memory spaces for the vmm
- kernel_image_space = init_system_space((void *)&k_text_begin,
- (void *)align_next(&k_data_end, PAGE_SIZE));
- kernel_stack_space = init_system_space((void *)KERNEL_ENTRY_STACK_BASE,
- (void *)KERNEL_ENTRY_STACK_HEAD);
- kernel_pagemap_space = init_system_space(kernel_pm1, (void *)-1LL);
-
- // initialize the kernel heap space
- kernel_heap_space = init_anonymous_space(kernel_image_space.head,
- (char *)kernel_image_space.head +
- KERNEL_HEAP_SPACE_SIZE);
-
- // set up the list links
- kernel_image_space.next = &kernel_heap_space;
- kernel_heap_space.prev = &kernel_image_space;
- kernel_heap_space.next = &kernel_stack_space;
- kernel_stack_space.prev = &kernel_heap_space;
- kernel_stack_space.next = &kernel_pagemap_space;
- kernel_pagemap_space.prev = &kernel_stack_space;
-
- root_memory_space = &kernel_image_space;
-}
-
static void *page_map_at(void *vaddr,
phys_addr_t paddr,
enum page_map_flags flags)
@@ -475,7 +440,7 @@ int anonymous_page_handler(uint32_t code, void *address)
}
kputs("anonymous fault\n");
// kernel page mappings are built different
- if (address >= (void *)&k_virt_base)
+ if (address >= (void *)&kc_image_base)
{
uint64_t *pm2e = get_kernel_pm2e(address);
diff --git a/kc/core/memory.h b/kc/core/memory.h
index 67b0648..847ac8d 100644
--- a/kc/core/memory.h
+++ b/kc/core/memory.h
@@ -5,7 +5,7 @@
#include <stddef.h>
-typdef int (*memory_space_handler_func)(uint32_t code, void *vaddr);
+typedef int (*memory_space_handler_func)(uint32_t code, void *vaddr);
enum page_map_flags
{
@@ -20,21 +20,6 @@ enum page_map_flags
SIZE_MASK = 0xc,
};
-enum memory_space_flags
-{
- SYSTEM_SPACE = 0x1, // memory cannot be swapped
-};
-
-struct memory_space
-{
- enum memory_space_flags flags;
- memory_space_handler_func handler;
- void *base;
- void *head;
-};
-
-void memory_init(struct memory_range *ranges, int count);
-
void *memcpy(void *dest, const void *src, size_t size);
void *memmove(void *dest, const void *src, size_t size);
void *memset(void *dest, int val, size_t size);
@@ -51,3 +36,4 @@ void heap_free(void *block);
void *memory_alloc(size_t size);
void memory_free(void *block);
+