summaryrefslogtreecommitdiff
path: root/stage3/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'stage3/main.c')
-rw-r--r--stage3/main.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/stage3/main.c b/stage3/main.c
index 5f6756f..e9b5717 100644
--- a/stage3/main.c
+++ b/stage3/main.c
@@ -1,5 +1,4 @@
#include "def.h"
-#include "paging.h"
#include "gfx.h"
#include "halt.h"
#include "heap.h"
@@ -18,6 +17,17 @@
#include "rng.h"
#include "debug.h"
+typedef enum {
+ MEM_USABLE = 1,
+ MEM_RESERVED = 2,
+} mem_region_type;
+
+typedef struct __attribute__((packed)) {
+ void *start;
+ usize size;
+ usize type;
+} mem_region;
+
char keymap[256] = { '\0' };
void keyboard_handler()
@@ -60,43 +70,35 @@ void keyboard_handler()
void kmain()
{
- heap_init();
+ // PML3
+ for (u64 page = 0; page < 512*512; page++)
+ ((u64 *) 0x200000)[page] = (page << 30) | 0b10000011; // bit 7 is for huge pages
+
+ // PML4
+ for (u64 tbl = 0; tbl < 512; tbl++)
+ ((u64 *) 0x1000)[tbl] = (0x200000 + tbl * 0x1000) | 0b11;
-#define MMAP for (MemRegion *mreg = (void *) 0x500; mreg->start != nil; mreg++)
+#define MMAP for (mem_region *mreg = (void *) 0x500; mreg->start != nil; mreg++)
+
+ // heap init
+ heap_init();
MMAP {
- // remove anything between 0x100000 and 0x200000. it has already been mapped
+ // remove anything between 0x100000 and 0x400000. it is used for kernel and page tables
usize start = (usize) mreg->start;
- if (start >= 0x100000 && start < 0x200000) {
- if (start + mreg->size <= 0x200000) {
+ if (start >= 0x100000 && start < 0x400000) {
+ if (start + mreg->size <= 0x400000) {
mreg->size = 0; // kill it
} else {
- mreg->size = start + mreg->size - 0x200000;
- mreg->start = (void *) 0x200000;
+ mreg->size = start + mreg->size - 0x400000;
+ mreg->start = (void *) 0x400000;
}
}
- }
- // backup memory map
- usize n_mreg = 0;
- MMAP n_mreg++;
- MemRegion mregs[n_mreg];
- {
- usize i = 0;
- MMAP mregs[i++] = *mreg;
+ // add to heap
+ if (mreg->type == MEM_USABLE) // usable
+ heap_add(mreg->start, mreg->size);
}
- // setup paging
- MMAP page_region(mreg);
-
- page_region(&(MemRegion) {
- .start = (void *) (u64) gfx_info->framebuffer,
- .size = gfx_info->pitch * gfx_info->height,
- .used = MEM_RESERVED,
- });
-
- // heap init
- MMAP heap_add_region(mreg);
-
// font init
font_init();
font_set_size(1);
@@ -106,13 +108,13 @@ void kmain()
print(S("welcome to cuddles\n"));
// memory map
- print(S("memory map:\n"));
- for (usize i = 0; i < n_mreg; i++) {
- print_num_pad((u64) mregs[i].start, 16, 16, ' ');
+ print(S("heap memory:\n"));
+ MMAP {
+ print_num_pad((u64) mreg->start, 16, 16, ' ');
print(S(" | "));
- print_num_pad((u64) mregs[i].start + mregs[i].size, 16, 16, ' ');
+ print_num_pad((u64) mreg->start + mreg->size, 16, 16, ' ');
print(S(" | "));
- print_dec(mregs[i].used);
+ print_dec(mreg->type);
print(S("\n"));
}