From 557cb0919118624eacbe4bb95de7bd6b4decab91 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Tue, 2 Mar 2021 21:06:05 +0100 Subject: Added stack tracer idk why --- libc/print.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'libc/print.c') diff --git a/libc/print.c b/libc/print.c index 91ecf8f..ca2ab98 100644 --- a/libc/print.c +++ b/libc/print.c @@ -214,6 +214,20 @@ int print(const char *str) return strlen(str); } +void print_trace(u32 count) +{ + struct frame { + struct frame *ebp; + u32 eip; + } * stk; + __asm__ volatile("movl %%ebp, %0;" : "=r"(stk)); + print("EBP\tEIP\n"); + for (u32 i = 0; stk && i < count; i++) { + printf("0x%x\t0x%x\n", stk->ebp, stk->eip); + stk = stk->ebp; + } +} + #endif void panic(const char *format, ...) -- cgit v1.2.3 From f1751c121d48f2d8936c72bdc347777d1e7402d9 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 12 Mar 2021 16:07:45 +0100 Subject: Let's gooo! --- apps/init.c | 2 ++ kernel/drivers/interrupts.c | 4 ++-- kernel/features/load.c | 37 +++++++++++++++++-------------------- kernel/features/mm.c | 39 ++++++++++++++++++++++----------------- kernel/features/proc.c | 20 +++++++++++--------- kernel/inc/mm.h | 2 ++ kernel/main.c | 4 +++- libc/alloc.c | 12 ++++++++++++ libc/inc/def.h | 1 + libc/inc/print.h | 3 ++- libc/print.c | 2 +- libc/sanitize.c | 4 ++-- 12 files changed, 77 insertions(+), 53 deletions(-) (limited to 'libc/print.c') diff --git a/apps/init.c b/apps/init.c index 87f0d82..7044365 100644 --- a/apps/init.c +++ b/apps/init.c @@ -8,6 +8,8 @@ int main(int argc, char **argv) { + while (1) { + }; (void)argc; log("%s loaded\n", argv[0]); diff --git a/kernel/drivers/interrupts.c b/kernel/drivers/interrupts.c index 55926b7..a0cd106 100644 --- a/kernel/drivers/interrupts.c +++ b/kernel/drivers/interrupts.c @@ -171,9 +171,9 @@ void isr_uninstall_handler(int isr) void isr_panic(struct regs *r) { + printf("%s Exception (%x) at 0x%x (ring %d), exiting!\n", isr_exceptions[r->int_no], + r->err_code, r->eip, r->cs & 3); struct proc *proc = proc_current(); - printf("%s Exception (%x) at 0x%x, exiting!\n", isr_exceptions[r->int_no], r->err_code, - r->eip); if (proc) { printf("\t-> Exception occurred in %s at addr 0x%x\n", proc->name, r->eip - proc->entry); diff --git a/kernel/features/load.c b/kernel/features/load.c index 31e22dc..ec9a387 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -6,45 +6,42 @@ #include #include -// TODO: Fix pdi < 256! -#define PROC_DATA_ADDR 0xc000000 - #define PROC_STACK_SIZE 0x4000 -#define PROC_STACK_ADDR (PROC_DATA_ADDR - 256) -void proc_load(struct proc *proc, u32 entry) +/*void proc_load(struct proc *proc, u32 entry) { - /* memory_dir_switch(proc->page_dir); */ - u32 paddr = physical_alloc(PROC_STACK_SIZE); - virtual_map(proc->page_dir, PROC_STACK_ADDR, paddr, PROC_STACK_SIZE, - MEMORY_USER | MEMORY_CLEAR); + u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); - proc->regs.ebp = PROC_STACK_ADDR; - proc->regs.useresp = PROC_STACK_ADDR; + proc->regs.ebp = stack; + proc->regs.useresp = stack; proc->regs.eip = entry; proc->entry = entry; -} +}*/ int bin_load(const char *path, struct proc *proc) { struct stat s = { 0 }; vfs_stat(path, &s); struct proc *current = proc_current(); - struct page_dir *prev = current ? current->page_dir : memory_kernel_dir(); + struct page_dir *prev = current ? current->page_dir : virtual_kernel_dir(); u32 size = PAGE_ALIGN_UP(s.size); - memory_dir_switch(proc->page_dir); - u32 paddr = physical_alloc(size); - virtual_map(proc->page_dir, PROC_DATA_ADDR, paddr, size, MEMORY_USER | MEMORY_CLEAR); + memory_switch_dir(proc->page_dir); + u32 data = (u32)memory_alloc(proc->page_dir, size, MEMORY_USER | MEMORY_CLEAR); - if (!vfs_read(path, (void *)PROC_DATA_ADDR, 0, s.size)) { - memory_dir_switch(prev); + if (!vfs_read(path, (void *)data, 0, s.size)) { + memory_switch_dir(prev); return 1; } strcpy(proc->name, path); - proc_load(proc, PROC_DATA_ADDR); - memory_dir_switch(prev); + u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); + proc->regs.ebp = stack; + proc->regs.useresp = stack; + proc->regs.eip = data; + proc->entry = data; + + memory_switch_dir(prev); return 0; } diff --git a/kernel/features/mm.c b/kernel/features/mm.c index cde9a94..c39b8b7 100644 --- a/kernel/features/mm.c +++ b/kernel/features/mm.c @@ -6,7 +6,6 @@ #include #include #include - #include static struct page_dir kernel_dir ALIGNED(PAGE_SIZE) = { 0 }; @@ -138,7 +137,7 @@ static u8 physical_is_used(struct memory_range range) return 0; } -static struct memory_range physical_alloc(u32 size) +struct memory_range physical_alloc(u32 size) { assert(PAGE_ALIGNED(size)); @@ -165,34 +164,34 @@ static void physical_free(struct memory_range range) * Virtual */ -#define PDI(vaddr) ((vaddr) >> 22) +#define PDI(vaddr) (((vaddr) >> 22) & 0x03ff) #define PTI(vaddr) (((vaddr) >> 12) & 0x03ff) u8 virtual_present(struct page_dir *dir, u32 vaddr) { u32 pdi = PDI(vaddr); - u32 pti = PTI(vaddr); - union page_dir_entry *dir_entry = &dir->entries[pdi]; if (!dir_entry->bits.present) return 0; struct page_table *table = (struct page_table *)(dir_entry->bits.address * PAGE_SIZE); + + u32 pti = PTI(vaddr); union page_table_entry *table_entry = &table->entries[pti]; - return !table_entry->bits.present; + return table_entry->bits.present; } u32 virtual_to_physical(struct page_dir *dir, u32 vaddr) { u32 pdi = PDI(vaddr); - u32 pti = PTI(vaddr); - union page_dir_entry *dir_entry = &dir->entries[pdi]; if (!dir_entry->bits.present) return 0; struct page_table *table = (struct page_table *)(dir_entry->bits.address * PAGE_SIZE); + + u32 pti = PTI(vaddr); union page_table_entry *table_entry = &table->entries[pti]; if (!table_entry->bits.present) return 0; @@ -204,9 +203,8 @@ void virtual_map(struct page_dir *dir, struct memory_range prange, u32 vaddr, u3 { for (u32 i = 0; i < prange.size / PAGE_SIZE; i++) { u32 offset = i * PAGE_SIZE; - u32 pdi = PDI(vaddr + offset); - u32 pti = PTI(vaddr + offset); + u32 pdi = PDI(vaddr + offset); union page_dir_entry *dir_entry = &dir->entries[pdi]; struct page_table *table = (struct page_table *)(dir_entry->bits.address * PAGE_SIZE); @@ -219,6 +217,7 @@ void virtual_map(struct page_dir *dir, struct memory_range prange, u32 vaddr, u3 dir_entry->bits.address = (u32)(table) >> 12; } + u32 pti = PTI(vaddr + offset); union page_table_entry *table_entry = &table->entries[pti]; table_entry->bits.present = 1; table_entry->bits.writable = 1; @@ -263,14 +262,14 @@ void virtual_free(struct page_dir *dir, struct memory_range vrange) u32 offset = i * PAGE_SIZE; u32 pdi = PDI(vrange.base + offset); - u32 pti = PTI(vrange.base + offset); - union page_dir_entry *dir_entry = &dir->entries[pdi]; if (!dir_entry->bits.present) continue; struct page_table *table = (struct page_table *)(dir_entry->bits.address * PAGE_SIZE); + + u32 pti = PTI(vrange.base + offset); union page_table_entry *table_entry = &table->entries[pti]; if (table_entry->bits.present) @@ -284,12 +283,14 @@ struct page_dir *virtual_create_dir(void) { struct page_dir *dir = memory_alloc(&kernel_dir, sizeof(*dir), MEMORY_CLEAR); + memset(dir, 0, sizeof(*dir)); + for (u32 i = 0; i < 256; i++) { union page_dir_entry *dir_entry = &dir->entries[i]; - dir_entry->bits.user = 0; - dir_entry->bits.writable = 1; dir_entry->bits.present = 1; + dir_entry->bits.writable = 1; + dir_entry->bits.user = 0; dir_entry->bits.address = (u32)&kernel_tables[i] / PAGE_SIZE; } @@ -334,22 +335,26 @@ void *memory_alloc(struct page_dir *dir, u32 size, u32 flags) assert(PAGE_ALIGNED(size)); if (!size) - return 0; + goto err; struct memory_range prange = physical_alloc(size); if (prange.size == 0) - return 0; + goto err; u32 vaddr = virtual_alloc(dir, prange, flags).base; if (!vaddr) { physical_free(prange); - return 0; + goto err; } if (flags & MEMORY_CLEAR) memset((void *)vaddr, 0, size); return (void *)vaddr; + +err: + print("Memory allocation error!\n"); + return 0; } void *memory_alloc_identity(struct page_dir *dir, u32 flags) diff --git a/kernel/features/proc.c b/kernel/features/proc.c index 19a92d3..4d1311e 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -57,7 +57,7 @@ void scheduler(struct regs *regs) } } - memory_dir_switch(((struct proc *)current->data)->page_dir); + memory_switch_dir(((struct proc *)current->data)->page_dir); memcpy(regs, &((struct proc *)current->data)->regs, sizeof(struct regs)); if (regs->cs != GDT_USER_CODE_OFFSET) { @@ -248,9 +248,9 @@ struct proc *proc_make(enum proc_priv priv) proc->state = PROC_RUNNING; if (priv == PROC_PRIV_KERNEL) - proc->page_dir = memory_kernel_dir(); + proc->page_dir = virtual_kernel_dir(); else - proc->page_dir = memory_dir_create(); + proc->page_dir = virtual_create_dir(); if (current) list_add(proc_list, proc); @@ -472,11 +472,11 @@ void proc_init(void) vfs_mount(dev, "/proc/"); // Idle proc - struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); - proc_load(kernel_proc, (u32)kernel_idle); - strcpy(kernel_proc->name, "idle"); - kernel_proc->state = PROC_SLEEPING; - idle_proc = list_add(proc_list, kernel_proc); + /* struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); */ + /* proc_load(kernel_proc, (u32)kernel_idle); */ + /* strcpy(kernel_proc->name, "idle"); */ + /* kernel_proc->state = PROC_SLEEPING; */ + /* idle_proc = list_add(proc_list, kernel_proc); */ // Init proc (root) struct node *new = list_add(proc_list, proc_make(PROC_PRIV_ROOT)); @@ -496,7 +496,9 @@ void proc_init(void) /* ((u32 *)_esp)[-1] = (u32)argv; // Second argument (argv) */ printf("Jumping to userspace!\n"); - memory_dir_switch(((struct proc *)new->data)->page_dir); + /* printf("%x\n", ((u32 *)((struct proc *)new->data)->entry)[5]); */ + memory_switch_dir(((struct proc *)new->data)->page_dir); + /* printf("%x\n", ((u32 *)((struct proc *)new->data)->entry)[5]); */ proc_jump_userspace(); while (1) { }; diff --git a/kernel/inc/mm.h b/kernel/inc/mm.h index 6d3714d..aad4ffd 100644 --- a/kernel/inc/mm.h +++ b/kernel/inc/mm.h @@ -15,6 +15,8 @@ struct memory_range { * Physical */ +struct memory_range physical_alloc(u32 size); + /** * Virtual */ diff --git a/kernel/main.c b/kernel/main.c index f0bfc3c..8247672 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -17,6 +17,8 @@ #include #include +#include + struct vid_info *boot_passed; void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info); // Decl @@ -31,7 +33,7 @@ void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info) serial_print("\nKernel was compiled at " __TIME__ " on " __DATE__ "\n"); serial_print("Serial connected.\n"); - paging_install(mem_info); + memory_install(mem_info); boot_passed = vid_info; diff --git a/libc/alloc.c b/libc/alloc.c index 11639a6..f621c4e 100644 --- a/libc/alloc.c +++ b/libc/alloc.c @@ -303,6 +303,9 @@ static void _free(void *ptr) void *zalloc(u32 size) { +#ifdef userspace + panic("AAH!\n"); +#endif void *ret = malloc(size); memset(ret, 0, size); return ret; @@ -311,6 +314,9 @@ void *zalloc(u32 size) // Naive realloc implementation - TODO! void *realloc(void *ptr, u32 size) { +#ifdef userspace + panic("AAH!\n"); +#endif if (!ptr) return malloc(size); @@ -330,6 +336,9 @@ void *realloc(void *ptr, u32 size) void *malloc_debug(u32 size, const char *file, int line, const char *func, const char *inp) { +#ifdef userspace + panic("AAH!\n"); +#endif assert(size < (100 << 20)); // Don't brag with memory pls void *ret = _malloc(size); @@ -343,6 +352,9 @@ void *malloc_debug(u32 size, const char *file, int line, const char *func, const void free_debug(void *ptr, const char *file, int line, const char *func, const char *inp) { +#ifdef userspace + panic("AAH!\n"); +#endif if (ptr) _free(ptr); diff --git a/libc/inc/def.h b/libc/inc/def.h index 945ccb0..db1c95e 100644 --- a/libc/inc/def.h +++ b/libc/inc/def.h @@ -25,6 +25,7 @@ typedef unsigned long long u64; #define UNUSED(a) ((void)(a)) +#define NORETURN __attribute__((noreturn)) #define NO_SANITIZE __attribute__((no_sanitize("undefined"))) #define PACKED __attribute__((packed)) #define ALIGNED(align) __attribute__((aligned(align))) diff --git a/libc/inc/print.h b/libc/inc/print.h index 110ba4c..58b5dc6 100644 --- a/libc/inc/print.h +++ b/libc/inc/print.h @@ -4,13 +4,14 @@ #define PRINT_H #include "arg.h" +#include int printf(const char *format, ...); int vprintf(const char *format, va_list ap); int sprintf(char *str, const char *format, ...); int vsprintf(char *str, const char *format, va_list ap); int print(const char *str); -void panic(const char *format, ...); +NORETURN void panic(const char *format, ...); #ifdef userspace int vfprintf(const char *path, const char *format, va_list ap); diff --git a/libc/print.c b/libc/print.c index ca2ab98..173e117 100644 --- a/libc/print.c +++ b/libc/print.c @@ -230,7 +230,7 @@ void print_trace(u32 count) #endif -void panic(const char *format, ...) +NORETURN void panic(const char *format, ...) { char buf[1024] = { 0 }; va_list ap; diff --git a/libc/sanitize.c b/libc/sanitize.c index 8cfec49..8514e49 100644 --- a/libc/sanitize.c +++ b/libc/sanitize.c @@ -13,13 +13,13 @@ u32 __stack_chk_guard = STACK_CHK_GUARD; void __stack_chk_fail(void); -void __stack_chk_fail(void) +NORETURN void __stack_chk_fail(void) { panic("FATAL: Stack smashing detected\n"); } void __stack_chk_fail_local(void); -void __stack_chk_fail_local(void) +NORETURN void __stack_chk_fail_local(void) { panic("FATAL: Local stack smashing detected\n"); } -- cgit v1.2.3 From 0aef683b9d1e08555791426ba12223ed78051353 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 12 Mar 2021 17:27:01 +0100 Subject: Boots successfully... --- Makefile | 2 +- apps/Makefile | 2 +- apps/idle.c | 7 +++++++ apps/init.c | 1 + kernel/features/load.c | 17 ++++------------- kernel/features/mm.c | 24 +++++++++++++++--------- kernel/features/proc.c | 19 +++++-------------- kernel/inc/load.h | 1 - kernel/inc/mm.h | 9 ++++++++- libc/cpu.c | 7 +++++++ libc/inc/cpu.h | 1 + libc/print.c | 1 + 12 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 apps/idle.c (limited to 'libc/print.c') diff --git a/Makefile b/Makefile index a9817cd..1e20a7a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ CFLAGS_DEFAULT = $(CFLAGS_WARNINGS) $(CFLAGS_OPTIMIZATION) -std=c99 -m32 -nostdl all: compile -debug: CFLAGS_DEFAULT += -Wno-error -ggdb3 -s -fstack-protector-all -fsanitize=undefined +debug: CFLAGS_DEFAULT += -Wno-error -ggdb3 -s -fsanitize=undefined # -fstack-protector-all # TODO: Fix stack protector in userspace debug: compile export diff --git a/apps/Makefile b/apps/Makefile index 8426b9c..2c6c643 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,6 +1,6 @@ # MIT License, Copyright (c) 2020 Marvin Borner -COBJS = init.o wm.o test.o window.o #mandelbrot.o window.o exec.o files.o test.o cc.o browser.o server.o +COBJS = init.o idle.o wm.o test.o window.o #mandelbrot.o window.o exec.o files.o test.o cc.o browser.o server.o CC = ccache ../cross/opt/bin/i686-elf-gcc LD = ccache ../cross/opt/bin/i686-elf-ld OC = ccache ../cross/opt/bin/i686-elf-objcopy diff --git a/apps/idle.c b/apps/idle.c new file mode 100644 index 0000000..3f10c3e --- /dev/null +++ b/apps/idle.c @@ -0,0 +1,7 @@ +// MIT License, Copyright (c) 2021 Marvin Borner + +int main(void) +{ + while (1) + ; +} diff --git a/apps/init.c b/apps/init.c index 7044365..9e57078 100644 --- a/apps/init.c +++ b/apps/init.c @@ -8,6 +8,7 @@ int main(int argc, char **argv) { + log("Loaded!\n"); while (1) { }; (void)argc; diff --git a/kernel/features/load.c b/kernel/features/load.c index ec9a387..4ad2cbf 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -8,25 +8,16 @@ #define PROC_STACK_SIZE 0x4000 -/*void proc_load(struct proc *proc, u32 entry) -{ - u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); - - proc->regs.ebp = stack; - proc->regs.useresp = stack; - proc->regs.eip = entry; - proc->entry = entry; -}*/ - int bin_load(const char *path, struct proc *proc) { struct stat s = { 0 }; vfs_stat(path, &s); - struct proc *current = proc_current(); - struct page_dir *prev = current ? current->page_dir : virtual_kernel_dir(); - u32 size = PAGE_ALIGN_UP(s.size); + struct page_dir *prev; + memory_backup_dir(&prev); memory_switch_dir(proc->page_dir); + + u32 size = PAGE_ALIGN_UP(s.size); u32 data = (u32)memory_alloc(proc->page_dir, size, MEMORY_USER | MEMORY_CLEAR); if (!vfs_read(path, (void *)data, 0, s.size)) { diff --git a/kernel/features/mm.c b/kernel/features/mm.c index c39b8b7..5fe70fd 100644 --- a/kernel/features/mm.c +++ b/kernel/features/mm.c @@ -15,10 +15,10 @@ static struct page_table kernel_tables[256] ALIGNED(PAGE_SIZE) = { 0 }; * Lowlevel paging */ -static void paging_disable(void) +/*static void paging_disable(void) { cr0_set(cr0_get() | 0x7fffffff); -} +}*/ static void paging_enable(void) { @@ -27,7 +27,6 @@ static void paging_enable(void) static void paging_switch_dir(u32 dir) { - assert(dir); cr3_set(dir); } @@ -154,7 +153,7 @@ struct memory_range physical_alloc(u32 size) return memory_range(0, 0); } -static void physical_free(struct memory_range range) +void physical_free(struct memory_range range) { assert(PAGE_ALIGNED(range.base) && PAGE_ALIGNED(range.size)); physical_set_free(range); @@ -297,11 +296,6 @@ struct page_dir *virtual_create_dir(void) return dir; } -struct page_dir *virtual_kernel_dir(void) -{ - return &kernel_dir; -} - void virtual_destroy_dir(struct page_dir *dir) { assert(dir != &kernel_dir); @@ -326,6 +320,11 @@ void virtual_destroy_dir(struct page_dir *dir) memory_free(&kernel_dir, memory_range((u32)dir, sizeof(*dir))); } +struct page_dir *virtual_kernel_dir(void) +{ + return &kernel_dir; +} + /** * Memory wrappers */ @@ -405,6 +404,13 @@ void memory_switch_dir(struct page_dir *dir) paging_switch_dir(virtual_to_physical(&kernel_dir, (u32)dir)); } +void memory_backup_dir(struct page_dir **backup) +{ + struct proc *proc = proc_current(); + struct page_dir *dir = proc ? proc->page_dir : virtual_kernel_dir(); + *backup = dir; +} + struct memory_range memory_range_from(u32 base, u32 size) { u32 align = PAGE_SIZE - base % PAGE_SIZE; diff --git a/kernel/features/proc.c b/kernel/features/proc.c index 4d1311e..db2291c 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -76,12 +76,6 @@ void scheduler(struct regs *regs) /* printf("{%d}", ((struct proc *)current->data)->pid); */ } -static void kernel_idle(void) -{ - while (1) - ; -} - void proc_print(void) { struct node *node = proc_list->head; @@ -328,7 +322,7 @@ static s32 procfs_write(const char *path, void *buf, u32 offset, u32 count, stru } } - printf("%s - off: %d, cnt: %d, buf: %x, dev %x\n", path, offset, count, buf, dev); + printf("ERR: %s - off: %d, cnt: %d, buf: %x, dev %x\n", path, offset, count, buf, dev); return -1; } @@ -472,11 +466,10 @@ void proc_init(void) vfs_mount(dev, "/proc/"); // Idle proc - /* struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); */ - /* proc_load(kernel_proc, (u32)kernel_idle); */ - /* strcpy(kernel_proc->name, "idle"); */ - /* kernel_proc->state = PROC_SLEEPING; */ - /* idle_proc = list_add(proc_list, kernel_proc); */ + struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); + bin_load("/bin/idle", kernel_proc); + kernel_proc->state = PROC_SLEEPING; + idle_proc = list_add(proc_list, kernel_proc); // Init proc (root) struct node *new = list_add(proc_list, proc_make(PROC_PRIV_ROOT)); @@ -496,9 +489,7 @@ void proc_init(void) /* ((u32 *)_esp)[-1] = (u32)argv; // Second argument (argv) */ printf("Jumping to userspace!\n"); - /* printf("%x\n", ((u32 *)((struct proc *)new->data)->entry)[5]); */ memory_switch_dir(((struct proc *)new->data)->page_dir); - /* printf("%x\n", ((u32 *)((struct proc *)new->data)->entry)[5]); */ proc_jump_userspace(); while (1) { }; diff --git a/kernel/inc/load.h b/kernel/inc/load.h index 330caca..f493e84 100644 --- a/kernel/inc/load.h +++ b/kernel/inc/load.h @@ -5,7 +5,6 @@ #include -void proc_load(struct proc *proc, u32 entry); int bin_load(const char *path, struct proc *proc); #endif diff --git a/kernel/inc/mm.h b/kernel/inc/mm.h index aad4ffd..6a1c063 100644 --- a/kernel/inc/mm.h +++ b/kernel/inc/mm.h @@ -16,6 +16,7 @@ struct memory_range { */ struct memory_range physical_alloc(u32 size); +void physical_free(struct memory_range range); /** * Virtual @@ -70,11 +71,14 @@ struct page_dir { union page_dir_entry entries[PAGE_COUNT]; } PACKED; +u8 virtual_present(struct page_dir *dir, u32 vaddr); u32 virtual_to_physical(struct page_dir *dir, u32 vaddr); void virtual_map(struct page_dir *dir, struct memory_range prange, u32 vaddr, u32 flags); struct memory_range virtual_alloc(struct page_dir *dir, struct memory_range physical_range, u32 flags); +void virtual_free(struct page_dir *dir, struct memory_range vrange); struct page_dir *virtual_create_dir(void); +void virtual_destroy_dir(struct page_dir *dir); struct page_dir *virtual_kernel_dir(void); /** @@ -89,10 +93,13 @@ struct page_dir *virtual_kernel_dir(void); struct memory_range memory_range_from(u32 base, u32 size); struct memory_range memory_range_around(u32 base, u32 size); -void memory_install(struct mem_info *mem_info); void *memory_alloc(struct page_dir *dir, u32 size, u32 flags); void *memory_alloc_identity(struct page_dir *dir, u32 flags); +void memory_map_identity(struct page_dir *dir, struct memory_range prange, u32 flags); void memory_free(struct page_dir *dir, struct memory_range vrange); void memory_switch_dir(struct page_dir *dir); +void memory_backup_dir(struct page_dir **backup); + +void memory_install(struct mem_info *mem_info); #endif diff --git a/libc/cpu.c b/libc/cpu.c index cb9aa49..8ca4d27 100644 --- a/libc/cpu.c +++ b/libc/cpu.c @@ -82,6 +82,13 @@ void cr0_set(u32 cr0) __asm__ volatile("movl %%eax, %%cr0" ::"a"(cr0)); } +u32 cr3_get(void) +{ + u32 cr3; + __asm__ volatile("movl %%cr0, %%eax" : "=a"(cr3)); + return cr3; +} + void cr3_set(u32 cr3) { __asm__ volatile("movl %%eax, %%cr3" ::"a"(cr3)); diff --git a/libc/inc/cpu.h b/libc/inc/cpu.h index 161b7a4..d709d86 100644 --- a/libc/inc/cpu.h +++ b/libc/inc/cpu.h @@ -29,6 +29,7 @@ void fpu_restore(void); u32 cr0_get(void); void cr0_set(u32 cr0); +u32 cr3_get(void); void cr3_set(u32 cr3); u32 cr4_get(void); void cr4_set(u32 cr4); diff --git a/libc/print.c b/libc/print.c index 173e117..1c577e5 100644 --- a/libc/print.c +++ b/libc/print.c @@ -238,6 +238,7 @@ NORETURN void panic(const char *format, ...) vsprintf(buf, format, ap); va_end(ap); #ifdef kernel + print("--- DON'T PANIC! ---\n"); print(buf); loop(); #else -- cgit v1.2.3