summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/multiboot.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/arch/i386/kernel/multiboot.c b/arch/i386/kernel/multiboot.c
index f56910a..dedf163 100644
--- a/arch/i386/kernel/multiboot.c
+++ b/arch/i386/kernel/multiboot.c
@@ -7,44 +7,43 @@
#include <kernel/pmem.h>
#include <kernel/timer.h>
#include <kernel/panic.h>
+#include <kernel/vmem.h>
#include <kernel/video/framebuffer.h>
#include <libk/io.h>
#include <libk/string.h>
#include <libk/kmalloc.h>
-extern void kernel_main(char *cmdline);
-extern uintptr_t *kpgdir;
-
-void i386_entry(uint32_t mboot_magic, struct mboot_info *header, uintptr_t *entry_pd) {
- kpgdir = entry_pd;
+void kernel_main(char *cmdline);
+void i386_entry(uint32_t mboot_magic, struct mboot_info *header) {
+ map_page(0xB8000, (uintptr_t)VGA_MEMORY, PD_RW);
fb_init();
+
if (mboot_magic != MBOOT_LOADER_MAGIC) {
disable_ints();
panic("Not booted with multiboot bootloader");
}
- map_page(NULL, (uintptr_t)header, (uintptr_t)header, PD_PRES);
+
+ map_page(0x9000, 0x9000, PD_RW);
if (!(header->flags >> 6 & 0x1)) {
disable_ints();
panic("Physical memory map not provided by bootloader");
}
- struct mboot_info hcopy;
- char cmdcopy[1024];
- memcpy(&hcopy, header, sizeof(struct mboot_info));
- map_page(NULL, (uintptr_t)header->cmdline, (uintptr_t)header->cmdline, PD_PRES);
- strcpy(cmdcopy, header->cmdline);
-
- pfa_init(&hcopy);
- paging_init();
- kmalloc_init();
+ char cmdline[4096];
+ map_page(header->cmdline, PAGE_TMP_MAP, 0);
+ memcpy(cmdline, (char*)PAGE_TMP_MAP, strlen((char*)PAGE_TMP_MAP));
+ unmap_page(PAGE_TMP_MAP);
+ pfa_init(header);
gdt_install();
idt_install();
+ paging_init();
+ map_page(0xB8000, (uintptr_t)VGA_MEMORY, PD_RW);
pic_remap();
timer_init();
enable_ints();
- kernel_main(cmdcopy);
+ kernel_main(cmdline);
while (1);
}