summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-11-26 00:22:10 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-11-27 01:04:18 +0100
commitd43a3388a976a74ae109c5b8b5a31f82a16b45db (patch)
tree51880414ee600ddfb3c7e3486c3d74beced36bfe
parent5d56d1a5b4d52702eb4e4ea6f05e4b6eebf41ca8 (diff)
fixing issues
1) main.c: order of init (multiboot.c must be after heap & paging because it uses heap to allocate pages for framebuffer) 2) paging.c: zeroing new pages allocated via heap 3) multiboot2.c: invalid pointer arithmetic 4) libk/string.c: check for null pointers in memcpy 5) paging: only page_lvl2 should have FLAG_HUGE 6) keyboard.c: kfree(print_buff)
-rw-r--r--kernel/src/boot/multiboot2.c4
-rw-r--r--kernel/src/cpu/irq.c1
-rw-r--r--kernel/src/cpu/registers.c2
-rw-r--r--kernel/src/devices/disc.c2
-rw-r--r--kernel/src/devices/keyboard.c1
-rw-r--r--kernel/src/libk/serial_stdio.c2
-rw-r--r--kernel/src/libk/stdio.c1
-rw-r--r--kernel/src/libk/string.c3
-rw-r--r--kernel/src/main.c9
-rw-r--r--kernel/src/mem/heap.c1
-rw-r--r--kernel/src/mem/paging.c15
-rw-r--r--kernel/src/ubsan/ubsan.c5
12 files changed, 31 insertions, 15 deletions
diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c
index 9410273..b111649 100644
--- a/kernel/src/boot/multiboot2.c
+++ b/kernel/src/boot/multiboot2.c
@@ -23,8 +23,8 @@ void init_fb(mb2_tag_fb* tag_fb)
main_fb.bpp = tag_fb->framebuffer_bpp;
// identity map framebuffer address
- map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT + FLAG_WRITABLE);
- map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE);
+ map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER);
+ map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER);
}
void init_mmap(mb2_tag_mmap* tag_mmap)
diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c
index a19a7f1..2695d4d 100644
--- a/kernel/src/cpu/irq.c
+++ b/kernel/src/cpu/irq.c
@@ -6,6 +6,7 @@
#include <keyboard.h>
#include <timer.h>
#include <paging.h>
+#include <libk/serial_stdio.h>
#include <libk/stdio.h>
const char* const exception_name[] = {
diff --git a/kernel/src/cpu/registers.c b/kernel/src/cpu/registers.c
index 7dc22d4..03efcdf 100644
--- a/kernel/src/cpu/registers.c
+++ b/kernel/src/cpu/registers.c
@@ -1,5 +1,5 @@
#include <types.h>
-#include <libk/stdio.h>
+#include <libk/serial_stdio.h>
struct registers_t {
uint64_t rax;
diff --git a/kernel/src/devices/disc.c b/kernel/src/devices/disc.c
index e97b7bf..b378fc1 100644
--- a/kernel/src/devices/disc.c
+++ b/kernel/src/devices/disc.c
@@ -5,6 +5,8 @@
#include <libk/math.h>
#include <kernel_vma.h>
+#include <libk/serial_stdio.h>
+
disc_sector_t* disc;
void disc_init()
diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c
index 60f41b8..c5aa245 100644
--- a/kernel/src/devices/keyboard.c
+++ b/kernel/src/devices/keyboard.c
@@ -58,4 +58,5 @@ void keyboard_handler()
char* print_buff = kalloc(len + 1);
read_buff(keyboard_buffer, print_buff, len);
printf("%s", print_buff);
+ kfree(print_buff);
}
diff --git a/kernel/src/libk/serial_stdio.c b/kernel/src/libk/serial_stdio.c
index a56750b..fb61ba1 100644
--- a/kernel/src/libk/serial_stdio.c
+++ b/kernel/src/libk/serial_stdio.c
@@ -50,7 +50,7 @@ void serial_printf(const char *s, ...)
else if(s[i] == 'x') serial_print_hex((uint64_t)va_arg(list, uint64_t));
else
{
- serial_print_string("Wrong format using printf\n");
+ serial_print_string("Wrong format using serial_printf\n");
return;
}
}
diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c
index c5c8643..e7e372d 100644
--- a/kernel/src/libk/stdio.c
+++ b/kernel/src/libk/stdio.c
@@ -1,5 +1,6 @@
#include <types.h>
#include <libk/stdio.h>
+#include <libk/serial_stdio.h>
#include <stdarg.h>
#include <libk/string.h>
#include <graphics.h>
diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c
index be37ba9..4cee538 100644
--- a/kernel/src/libk/string.c
+++ b/kernel/src/libk/string.c
@@ -70,6 +70,9 @@ void itoh(uint64_t num, char* s)
void memcpy(const void* destptr, const void* srcptr, size_t n)
{
+ if (destptr == NULL || srcptr == NULL)
+ return;
+
uint8_t* dest = (uint8_t*)destptr;
const uint8_t* src = (const uint8_t*)srcptr;
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 7424f56..ae2e0ee 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -5,6 +5,7 @@
#include <paging.h>
#include <heap.h>
#include <keyboard.h>
+#include <libk/serial_stdio.h>
#include <libk/stdio.h>
#include <libk/string.h>
#include <libk/math.h>
@@ -20,16 +21,18 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic);
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
{
init_serial();
+// serial is enabled from this point
init_gdt();
init_paging();
- init_timer(TICKS_PER_SECOND);
- init_idt();
init_heap();
- init_tss();
read_mb2(multiboot_bootinfo, multiboot_magic);
+// framebuffer is enabled from this point
+ init_timer(TICKS_PER_SECOND);
+ init_idt();
disc_init();
ext2_init();
ls(path_to_inode("/"));
+ init_tss();
jump_userspace();
for(;;) {
diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c
index e37e003..539328c 100644
--- a/kernel/src/mem/heap.c
+++ b/kernel/src/mem/heap.c
@@ -3,6 +3,7 @@
#include <libk/math.h>
#include <paging.h>
+#include <libk/serial_stdio.h>
#include <libk/stdio.h>
kheap_t main_kheap;
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index 774c5d6..fd88dbc 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -2,7 +2,9 @@
#include <paging.h>
#include <heap.h>
+#include <libk/serial_stdio.h>
#include <libk/stdio.h>
+#include <libk/string.h>
#include <kernel_vma.h>
void load_pt_lvl4(uint64_t*);
@@ -25,6 +27,7 @@ void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
uint64_t* pt_lvl3 = (uint64_t*)(page_table_lvl4[pt_lvl4_i] + KERNEL_VMA);
if (!((uint64_t)pt_lvl3 & FLAG_PRESENT)) {
pt_lvl3 = (uint64_t*)kalloc(4096);
+ memset(pt_lvl3, 0, 4096);
page_table_lvl4[pt_lvl4_i] = ((uint64_t)pt_lvl3 - KERNEL_VMA) | flags;
} else {
pt_lvl3 = (uint64_t*)((uint64_t)pt_lvl3 - (uint64_t)pt_lvl3 % 4096);
@@ -33,6 +36,7 @@ void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
uint64_t* pt_lvl2 = (uint64_t*)(pt_lvl3[pt_lvl3_i] + KERNEL_VMA);
if (!((uint64_t)pt_lvl2 & FLAG_PRESENT)) {
pt_lvl2 = (uint64_t*)kalloc(4096);
+ memset(pt_lvl2, 0, 4096);
pt_lvl3[pt_lvl3_i] = ((uint64_t)pt_lvl2 - KERNEL_VMA) | flags;
} else {
pt_lvl2 = (uint64_t*)((uint64_t)pt_lvl2 - (uint64_t)pt_lvl2 % 4096);
@@ -43,23 +47,22 @@ void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
void init_paging(void)
{
- page_table_lvl4[511] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
- page_table_lvl3[510] = (uint64_t)page_table_lvl2 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl4[511] = (uint64_t)page_table_lvl3 - KERNEL_VMA + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER);
+ page_table_lvl3[510] = (uint64_t)page_table_lvl2 - KERNEL_VMA + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER);
// 16mb kernel + 32mb heap
for (size_t i = 0; i < 24; i++) {
- page_table_lvl2[i] = (uint64_t)0x0 + PAGE_SIZE * i + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER + FLAG_HUGE;
+ page_table_lvl2[i] = (uint64_t)0x0 + PAGE_SIZE * i + (FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER | FLAG_HUGE);
}
load_pt_lvl4(page_table_lvl4);
}
-
void page_fault(uint64_t error)
{
uint64_t addr;
__asm__ volatile ("mov %%cr2, %0;" : "=r"(addr) : : "memory");
- map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER | FLAG_HUGE);
-
printf("address: 0x%x, error code: %d\n", addr, error);
+
+ map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER);
}
diff --git a/kernel/src/ubsan/ubsan.c b/kernel/src/ubsan/ubsan.c
index 84283f7..9cd744d 100644
--- a/kernel/src/ubsan/ubsan.c
+++ b/kernel/src/ubsan/ubsan.c
@@ -52,11 +52,12 @@ static void ubsan_abort(const struct ubsan_source_location* location,
if ( !location || !location->filename )
location = &unknown_location;
- serial_printf(
+ printf(
"filename = %s; line = %d; column = %d; violation = %s;\n",
location->filename, location->line, location->column, violation);
- while (true) {
+ for(;;) {
+ __asm__ volatile ("hlt;");
}
}