summaryrefslogtreecommitdiff
path: root/kc
diff options
context:
space:
mode:
Diffstat (limited to 'kc')
-rw-r--r--kc/boot/kc_main.c15
-rw-r--r--kc/core/memory.c38
-rw-r--r--kc/core/vm_tree.c6
3 files changed, 34 insertions, 25 deletions
diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c
index c469d40..84609ed 100644
--- a/kc/boot/kc_main.c
+++ b/kc/boot/kc_main.c
@@ -337,7 +337,7 @@ static EFI_STATUS enter_kernel(Elf64_Ehdr *ehdr)
if (EFI_ERROR(status))
{
- plog(L"failed exiting boot services\r\n");
+ plog(L"failed exiting boot services:\r\n");
debug();
}
@@ -392,16 +392,11 @@ EFI_STATUS kc_main(struct efi_loader_interface *interface)
plog(L"mapping kernel pages\r\n");
create_kernel_maps(ehdr, (void *)KERNEL_SPACE_LOWER);
- object_space_base = (void *)(kernel_image.buffer_size +
- (char *)KERNEL_SPACE_LOWER);
+ object_space_base =
+ (void *)(page_align(kernel_image.buffer_size,1) +
+ (char *)KERNEL_SPACE_LOWER);
- // map pages up to the nearest 2MB
- // unless there aren't at least 16 4KiB pages remaining
- // until the boundary. this will ensure there is at least
- // 64KiB and at most 2MiB.
- // it is not necessary to know the actual size of this object
- // as it will be overlaid with a virtual address space
- // upon kernel initialization.
+ // add a tail of 64KiB to the kernel image
uint64_t object_space_end = (uintptr_t)object_space_base +
page_size(1) * 16;
diff --git a/kc/core/memory.c b/kc/core/memory.c
index 0efdf81..d396c06 100644
--- a/kc/core/memory.c
+++ b/kc/core/memory.c
@@ -63,11 +63,12 @@ static uint64_t *get_kernel_pm1e(void *vaddr);
static uint64_t *get_kernel_pm2e(void *vaddr);
static void *page_map_at(void *vaddr, phys_addr_t paddr, enum page_map_flags flags);
-struct vm_tree core_vm_tree;
-struct vm_tree_node core_pagestack_node;
-struct vm_tree_node core_image_node;
-struct vm_tree_node core_object_node;
-struct vm_tree_node core_pagemaps_node;
+static struct vm_tree core_vm_tree;
+static struct vm_tree_node core_image_node;
+static struct vm_tree_node core_vmobject_node;
+static struct vm_tree_node core_pagemaps_node;
+static size_t vm_object_space_size = 0x1000000; // 16MiB to start.
+static void *vm_next_free = NULL;
static struct memory_range init_grab_pages(struct memory_range *ranges,
int count,
@@ -306,8 +307,6 @@ static void *page_map_at(void *vaddr,
return (char *)vaddr + offset;
}
-#define KERNEL_OBJECT_SPACE_EXTENT 0x1000000 // 16MiB for kernel object space?
-
static void init_vm_node(struct vm_tree_node *node, void *base, void *head)
{
node->key =
@@ -331,7 +330,8 @@ static void init_vm_node(struct vm_tree_node *node, void *base, void *head)
}
else
{
- kputs("fatal: overlap on static vm node\n");
+ kputs("fatal: overlap vm node\n");
+ panic(GENERAL_PANIC);
}
}
@@ -349,14 +349,15 @@ void memory_init(struct kc_boot_data *boot_data)
init_vm_node(
&core_image_node,
&kc_image_base,
- (void *)page_align(&kc_data_end, 1));
+ object_space_head);
kputs("vm node 2\n");
init_vm_node(
- &core_object_node,
- (void *)page_align(&kc_data_end, 1),
- object_space_head);
+ &core_vmobject_node,
+ object_space_head,
+ (char *)object_space_head + vm_object_space_size);
kputs("vm node 3\n");
init_vm_node(&core_pagemaps_node, vm_temp, (void *)-1);
+ vm_next_free = (char *)object_space_head + vm_object_space_size;
}
void *page_map(phys_addr_t paddr, enum page_map_flags flags)
@@ -433,6 +434,19 @@ void memory_free(void *block)
(void)block;
}
+struct vm_tree_node *vm_alloc_at(void *address, size_t size)
+{
+ (void)address;
+ (void)size;
+ return NULL;
+}
+
+struct vm_tree_node *vm_alloc(size_t size)
+{
+ (void)size;
+ return NULL;
+}
+
static uint64_t *get_kernel_pm1e(void *vaddr)
{
return &kernel_pm1[kpm1_index(vaddr)];
diff --git a/kc/core/vm_tree.c b/kc/core/vm_tree.c
index b0a0043..0837220 100644
--- a/kc/core/vm_tree.c
+++ b/kc/core/vm_tree.c
@@ -296,10 +296,10 @@ struct vm_tree_node *vmn_successor_node(
return vmn_min(N->right);
}
- struct vm_tree_node *p = n->parent;
- while (p && n == p->right)
+ struct vm_tree_node *p = N->parent;
+ while (p && N == p->right)
{
- n = p;
+ N = p;
p = p->parent;
}