diff options
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/boot/multiboot2.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 1 | ||||
| -rw-r--r-- | kernel/src/cpu/registers.c | 2 | ||||
| -rw-r--r-- | kernel/src/devices/disc.c | 2 | ||||
| -rw-r--r-- | kernel/src/devices/keyboard.c | 1 | ||||
| -rw-r--r-- | kernel/src/libk/serial_stdio.c | 2 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 1 | ||||
| -rw-r--r-- | kernel/src/libk/string.c | 3 | ||||
| -rw-r--r-- | kernel/src/main.c | 9 | ||||
| -rw-r--r-- | kernel/src/mem/heap.c | 1 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 15 | ||||
| -rw-r--r-- | kernel/src/ubsan/ubsan.c | 5 |
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;"); } } |
