summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
authorBenji Dial <benji6283@gmail.com>2020-09-06 15:47:06 -0400
committerBenji Dial <benji6283@gmail.com>2020-09-06 15:47:06 -0400
commitb8284137d4e0eec11c78bc14047243fce6a51373 (patch)
tree5969602dc3d090b536edccbf34d33d46a300c192 /src/kernel
parent73bb0e48640b842824a0b45fe4854df8ff7faf7b (diff)
downloadportland-os-b8284137d4e0eec11c78bc14047243fce6a51373.tar.gz
minor changes, redoing makefile, meminfo program
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/elf-link.ld2
-rw-r--r--src/kernel/idt.c40
-rw-r--r--src/kernel/isrs.asm2
-rw-r--r--src/kernel/log.c2
-rw-r--r--src/kernel/main.c23
-rw-r--r--src/kernel/task.c3
6 files changed, 49 insertions, 23 deletions
diff --git a/src/kernel/elf-link.ld b/src/kernel/elf-link.ld
index 10abac0..84d3f92 100644
--- a/src/kernel/elf-link.ld
+++ b/src/kernel/elf-link.ld
@@ -4,7 +4,7 @@ OUTPUT_ARCH(i386)
SECTIONS {
. = 0x00030000;
.text : {
- */main.o(.text)
+ */main.ko(.text)
*(.text)
}
.rodata : {
diff --git a/src/kernel/idt.c b/src/kernel/idt.c
index 31d597f..3d23797 100644
--- a/src/kernel/idt.c
+++ b/src/kernel/idt.c
@@ -6,6 +6,7 @@
#include "panic.h"
#include "task.h"
#include "paging.h"
+#include "pmap.h"
enum {
IDT_PRESENT = 0x80,
@@ -73,6 +74,32 @@ static void *sc_allocate_ram(uint32_t pages) {
return pd_user_allocate_anywhere_writable(active_task->page_directory, pages);
}
+enum mi_arg {
+ MI_KERNEL_MAX,
+ MI_KERNEL_LEFT,
+ MI_USER_MAX,
+ MI_USER_LEFT,
+ MI_TASK_LEFT
+};
+
+__attribute__ ((pure))
+static uint32_t sc_memory_info(enum mi_arg arg) {
+ switch (arg) {
+ case MI_KERNEL_MAX:
+ return max_kernel_pages;
+ case MI_KERNEL_LEFT:
+ return kernel_pages_left;
+ case MI_USER_MAX:
+ return max_user_pages;
+ case MI_USER_LEFT:
+ return user_pages_left;
+ case MI_TASK_LEFT:
+ panic("TODO: this process memory left");
+ default:
+ return -1;
+ }
+}
+
void const *syscall_table[] = {
&sc_open_file,
&sc_close_file,
@@ -81,14 +108,17 @@ void const *syscall_table[] = {
&sc_start_task,
&sc_log_string,
&sc_get_key,
- &sc_allocate_ram
+ &sc_allocate_ram,
+ &sc_memory_info
};
-extern void syscall_isr;
-extern void quit_isr;
-extern void yield_isr;
+typedef void isr_t;
+
+extern isr_t syscall_isr;
+extern isr_t quit_isr;
+extern isr_t yield_isr;
-static void register_int(uint8_t n, void *isr, uint8_t dpl) {
+static void register_int(uint8_t n, isr_t *isr, uint8_t dpl) {
idt[n].addr_low = (uint32_t)isr & 0xffff;
idt[n].addr_high = (uint32_t)isr >> 16;
idt[n].cs = 0x10;
diff --git a/src/kernel/isrs.asm b/src/kernel/isrs.asm
index 1fd6fcb..82c17fe 100644
--- a/src/kernel/isrs.asm
+++ b/src/kernel/isrs.asm
@@ -11,7 +11,7 @@ extern active_task
extern delete_task
extern advance_active_task
-n_syscalls equ 8
+n_syscalls equ 0x9
section .text
syscall_isr:
diff --git a/src/kernel/log.c b/src/kernel/log.c
index 39fc1ba..b5a96cb 100644
--- a/src/kernel/log.c
+++ b/src/kernel/log.c
@@ -12,6 +12,8 @@ static const uint8_t log_mode_colors[] = {
void set_log_mode(enum log_mode mode) {
vga_set_color(log_mode_colors[mode]);
+ vga_printch('\n');
+ vga_printch('\n');
}
void logch(char ch) {
diff --git a/src/kernel/main.c b/src/kernel/main.c
index 2f63d71..d99b595 100644
--- a/src/kernel/main.c
+++ b/src/kernel/main.c
@@ -124,30 +124,25 @@ void main() {
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");
+ logsz("Processor supports PAE (but Portland OS does not yet).\n");
else
- logsz("Processor does not support PAE.\n\n");
+ logsz("Processor does not support PAE.\n");
- u32_dec(kernel_pages_left * 4, nbuf);
- logsz(nbuf);
- logsz("k / ");
+ logsz("Kernel dynamic area size: ");
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 / ");
+ logsz("k\nUserspace area size: ");
u32_dec(max_user_pages * 4, nbuf);
logsz(nbuf);
- logsz("k user memory free.\n");
+ logsz("k\n\n");
+
+ if (!try_elf_run(drives, "BIN/INIT.ELF"))
+ panic("Failed to load init program.");
init_idt();
+ logsz("Switching to init task.\n");
set_log_mode(LOG_USER);
- logch('\n');
_start_user_mode();
} \ No newline at end of file
diff --git a/src/kernel/task.c b/src/kernel/task.c
index 80818a7..2a1f4c4 100644
--- a/src/kernel/task.c
+++ b/src/kernel/task.c
@@ -79,9 +79,8 @@ void advance_active_task() {
if (++active_task == tasks + MAX_TASKS)
active_task = tasks;
if (active_task == prev_task) {
- logch('\n');
set_log_mode(LOG_SYSTEM);
- logsz("\nNo active tasks, halting.");
+ logsz("No active tasks, halting.");
while (1)
asm ("hlt");
}