summaryrefslogtreecommitdiff
path: root/src/kernel/main.c
diff options
context:
space:
mode:
authorBenji Dial <benji6283@gmail.com>2020-09-06 00:48:07 -0400
committerBenji Dial <benji6283@gmail.com>2020-09-06 00:48:07 -0400
commite8c6577617bffa4402c07c7aa20e3c24f03c1c20 (patch)
tree2fb9230b62d2344a44453117de9e656892219788 /src/kernel/main.c
parent7ff724fe8f709440da9c730fdb8dcbaa4f989ed5 (diff)
downloadportland-os-e8c6577617bffa4402c07c7aa20e3c24f03c1c20.tar.gz
program loading, others
big kernel additions: paging, elf loading, separate kernel and user page allocation it now properly loads and runs sd0:bin/init.elf still need to determine which disk was booted from, and start the init on that disk
Diffstat (limited to 'src/kernel/main.c')
-rw-r--r--src/kernel/main.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/src/kernel/main.c b/src/kernel/main.c
index 0c57ef3..eb57a01 100644
--- a/src/kernel/main.c
+++ b/src/kernel/main.c
@@ -1,21 +1,30 @@
#include <stdint.h>
#include "serial.h"
#include "panic.h"
+#include "paging.h"
#include "boot.h"
#include "util.h"
#include "fat.h"
#include "ide.h"
-#include "mem.h"
+#include "idt.h"
+#include "pmap.h"
+#include "task.h"
#include "pci.h"
#include "log.h"
+#include "elf.h"
+void reset_tree();
void tree(struct drive *d);
+void _start_user_mode() __attribute__ ((noreturn));
+
__attribute__ ((noreturn))
void main() {
char nbuf[11];
- init_mmap();
+ init_pagemap();
+ init_paging();
+ init_tasks();
init_serial();
init_log();
@@ -57,6 +66,8 @@ void main() {
init_fat();
//other fs drivers
+ init_drives();
+
init_ide();
//other drive drivers
@@ -97,13 +108,44 @@ void main() {
logch('\n');
- u32_dec(pages_left * 4, nbuf);
+ for (uint8_t n = 0; n < n_drives; ++n) {
+ if (drives[n].get_free_sectors(drives + n) == -1)
+ continue;
+
+ u32_dec(n, nbuf);
+ logsz("sd");
+ logsz(nbuf);
+ logsz(" tree:\n");
+
+ reset_tree();
+ tree(drives + n);
+ logch('\n');
+ }
+
+ if (!try_elf_run(drives, "BIN/INIT.ELF"))
+ panic("Failed to load init program.");
+
+ if (BOOT_INFO->support_flags & BIS_PAE)
+ logsz("Processor supports PAE (but Portland OS does not yet).\n\n");
+ else
+ logsz("Processor does not support PAE.\n\n");
+
+ u32_dec(kernel_pages_left * 4, nbuf);
+ logsz(nbuf);
+ logsz("k / ");
+ u32_dec(max_kernel_pages * 4, nbuf);
+ logsz(nbuf);
+ logsz("k kernel heap free.\n");
+ u32_dec(user_pages_left * 4, nbuf);
+ logsz(nbuf);
+ logsz("k / ");
+ u32_dec(max_user_pages * 4, nbuf);
logsz(nbuf);
- logsz("k dynamic memory free.\n\n");
+ logsz("k user memory free.\n");
- logsz("sd0 root:\n");
- tree(&drives[0]);
+//while (1)
+// asm ("hlt");
- while (1)
- asm ("hlt");
+ init_idt();
+ _start_user_mode();
} \ No newline at end of file