From 63ed037fdbb04a4855531f5ce980d8517752f640 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Wed, 17 Mar 2021 22:33:31 +0100 Subject: Awesome! --- kernel/features/proc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'kernel/features/proc.c') diff --git a/kernel/features/proc.c b/kernel/features/proc.c index cd0fc8d..5c38fff 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -497,13 +497,13 @@ void proc_init(void) // Idle proc struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); - assert(bin_load("/bin/idle", kernel_proc) == 0); + assert(elf_load("/bin/idle", kernel_proc) == 0); 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)); - assert(bin_load("/bin/init", new->data) == 0); + assert(elf_load("/bin/init", new->data) == 0); current = new; proc_stack_push(new->data, 0); -- cgit v1.2.3 From c97a50ba7baa70b40431594f410ca18e14af3b76 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 19 Mar 2021 23:09:54 +0100 Subject: Some things --- kernel/drivers/interrupts.c | 1 + kernel/features/mm.c | 2 ++ kernel/features/proc.c | 7 ++++--- kernel/features/syscall.c | 1 + kernel/main.c | 6 ------ run | 4 ++-- 6 files changed, 10 insertions(+), 11 deletions(-) (limited to 'kernel/features/proc.c') diff --git a/kernel/drivers/interrupts.c b/kernel/drivers/interrupts.c index 2e1444f..255f976 100644 --- a/kernel/drivers/interrupts.c +++ b/kernel/drivers/interrupts.c @@ -179,6 +179,7 @@ void isr_panic(struct regs *r) printf("\t-> Exception occurred in %s at addr 0x%x\n", proc->name, r->eip - proc->entry); proc_exit(proc, 1); + proc_yield(r); } else { __asm__ volatile("cli\nhlt"); } diff --git a/kernel/features/mm.c b/kernel/features/mm.c index af5e070..01e21e7 100644 --- a/kernel/features/mm.c +++ b/kernel/features/mm.c @@ -34,6 +34,8 @@ extern void paging_invalidate_tlb(void); void page_fault_handler(struct regs *r) { + print("--- PAGE FAULT! ---\n"); + // Check error code const char *type = (r->err_code & 1) ? "present" : "non-present"; const char *operation = (r->err_code & 2) ? "write" : "read"; diff --git a/kernel/features/proc.c b/kernel/features/proc.c index 5c38fff..aa595ff 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -59,7 +59,7 @@ void scheduler(struct regs *regs) } memory_switch_dir(((struct proc *)current->data)->page_dir); - memcpy(regs, &((struct proc *)current->data)->regs, sizeof(struct regs)); + memcpy(regs, &((struct proc *)current->data)->regs, sizeof(*regs)); if (regs->cs != GDT_USER_CODE_OFFSET) { regs->gs = GDT_USER_DATA_OFFSET; @@ -145,9 +145,10 @@ void proc_exit(struct proc *proc, int status) printf("Process %s exited with status %d (%s)\n", proc->name, status, status == 0 ? "success" : "error"); + virtual_destroy_dir(proc->page_dir); proc_clear_quantum(); // TODO: Add quantum to each process struct? - sti(); - hlt(); + + // The caller has to yield itself } void proc_yield(struct regs *r) diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index 2796372..2334947 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -82,6 +82,7 @@ static void syscall_handler(struct regs *r) } case SYS_EXIT: { proc_exit(proc_current(), (int)r->ebx); + proc_yield(r); break; } case SYS_BOOT: { // TODO: Move diff --git a/kernel/main.c b/kernel/main.c index d1afc01..5c5299e 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -18,15 +18,9 @@ #include #include -#include - void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info); // Decl void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info) { - // Clear stack - for (u32 i = 0; i < STACK_SIZE; i++) - ((u8 *)STACK_START)[-i] = 0; - // Serial connection serial_install(); serial_print("\nKernel was compiled at " __TIME__ " on " __DATE__ "\n"); diff --git a/run b/run index 8a49737..27a7f5f 100755 --- a/run +++ b/run @@ -183,10 +183,10 @@ make_disasm() { make_addr() { printf "Info: Make sure that you've turned the debug build on (e.g. with MELVIX_DEBUG=1)\n\n" if [ -z "$2" ]; then - echo "Usage: './run addr kernel 0x50042'" + echo "Usage: './run addr kernel.elf 0x50042'" exit 1 fi - addr2line -e build/"$1".elf -f -p "$2" + addr2line -e build/"$1" -f -p "$2" } make_cloc() { -- cgit v1.2.3 From 635751fc2a75f66d1541469b3204efb1701bd91c Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 20 Mar 2021 18:46:33 +0100 Subject: Even more fixes! :^) --- Makefile | 2 +- apps/Makefile | 4 +++- apps/idle.c | 7 ++++++- apps/init.c | 6 ++---- apps/link.ld | 5 +---- boot/Makefile | 2 +- kernel/Makefile | 2 +- kernel/features/load.c | 4 ++-- kernel/features/mm.c | 14 +++++--------- kernel/features/proc.c | 8 +++++--- 10 files changed, 27 insertions(+), 27 deletions(-) (limited to 'kernel/features/proc.c') diff --git a/Makefile b/Makefile index 9603296..f08c26b 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ all: compile # TODO: Fix stack protector in userspace # TODO: Fix ubsan in userspace (probably due to kernel size) -debug: CFLAGS_DEFAULT += -Wno-error -ggdb3 -s #-fsanitize=undefined # -fstack-protector-all +debug: CFLAGS_DEFAULT += -Wno-error -ggdb3 -s #-fsanitize=undefined #-fstack-protector-all debug: compile export diff --git a/apps/Makefile b/apps/Makefile index 9ad268e..66f8e42 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -4,6 +4,7 @@ COBJS = init.o idle.o wm.o test.o window.o #mandelbrot.o window.o exec.o files.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 +ST = ccache ../cross/opt/bin/i686-elf-strip CFLAGS = $(CFLAGS_DEFAULT) -I../libc/inc/ -I../libgui/inc/ -I../libtxt/inc/ -Duserspace @@ -12,8 +13,9 @@ all: $(COBJS) %.o: %.c @mkdir -p ../build/apps/ @$(CC) -c $(CFLAGS) $< -o $@ - @$(LD) -o $(@:.o=.elf) -L../build/ $@ -lgui -ltxt -lc + @$(LD) -o $(@:.o=.elf) -Tlink.ld -L../build/ -static $@ -lgui -ltxt -lc @cp $(@:.o=.elf) ../build/apps/$(@:.o=) +#@$(ST) --strip-all ../build/apps/$(@:.o=) # %.o: %.c # @mkdir -p ../build/apps/ diff --git a/apps/idle.c b/apps/idle.c index 3f10c3e..15ffc68 100644 --- a/apps/idle.c +++ b/apps/idle.c @@ -1,7 +1,12 @@ // MIT License, Copyright (c) 2021 Marvin Borner -int main(void) +#include + +int main(int argc, char **argv) { + UNUSED(argc); + UNUSED(argv); while (1) ; + return 0; } diff --git a/apps/init.c b/apps/init.c index c26e3ad..221708e 100644 --- a/apps/init.c +++ b/apps/init.c @@ -9,11 +9,9 @@ int main(int argc, char **argv) UNUSED(argc); UNUSED(argv); log("Arrived!\n"); - while (1) - ; - assert(exec("/bin/wm", "wm", NULL) == 0); - assert(exec("/bin/window", "test", NULL) == 0); + /* assert(exec("/bin/wm", "wm", NULL) == 0); */ + /* assert(exec("/bin/window", "test", NULL) == 0); */ return 0; } diff --git a/apps/link.ld b/apps/link.ld index 781e38d..e28bb34 100644 --- a/apps/link.ld +++ b/apps/link.ld @@ -1,11 +1,10 @@ OUTPUT_FORMAT("elf32-i386") OUTPUT_ARCH(i386) -STARTUP(libc.a) /* HUH */ ENTRY(_start) SECTIONS { - . = 0x00000000; + . = 0x40000000; .text : { code = .; @@ -26,7 +25,5 @@ SECTIONS . = ALIGN(4096); } - _GLOBAL_OFFSET_TABLE_ = .; - . = ALIGN(4096); } diff --git a/boot/Makefile b/boot/Makefile index 714ec22..7ef6cab 100644 --- a/boot/Makefile +++ b/boot/Makefile @@ -5,7 +5,7 @@ LD = ccache ../cross/opt/bin/i686-elf-ld OC = ccache ../cross/opt/bin/i686-elf-objcopy AS = ccache nasm -CFLAGS = $(CFLAGS_DEFAULT) -ffreestanding -fno-stack-protector -fno-sanitize=undefined +CFLAGS = $(CFLAGS_DEFAULT) -ffreestanding -fno-stack-protector -fno-sanitize=undefined -Ofast ASFLAGS = -f elf32 diff --git a/kernel/Makefile b/kernel/Makefile index e9ade73..1d9e87a 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -37,4 +37,4 @@ all: compile compile: $(COBJS) @mkdir -p ../build/ @$(LD) -N -z undefs -ekernel_main -Ttext 0x00050000 -o ../build/kernel.elf -L../build/ $+ -lk - @$(LD) -N -Tlink.ld -o ../build/kernel.bin -L../build/ $+ -lk + @$(LD) -N -z max-page-size=0x1000 -Tlink.ld -o ../build/kernel.bin -L../build/ $+ -lk diff --git a/kernel/features/load.c b/kernel/features/load.c index 079cbbe..d3f3495 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -119,8 +119,8 @@ s32 elf_load(const char *path, struct proc *proc) memory_switch_dir(proc->page_dir); u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); - proc->regs.ebp = stack + PROC_STACK_SIZE - 1; - proc->regs.useresp = stack + PROC_STACK_SIZE - 1; + proc->regs.ebp = stack + PROC_STACK_SIZE; + proc->regs.useresp = stack + PROC_STACK_SIZE; proc->regs.eip = header.entry; proc->entry = header.entry; diff --git a/kernel/features/mm.c b/kernel/features/mm.c index 01e21e7..b06657f 100644 --- a/kernel/features/mm.c +++ b/kernel/features/mm.c @@ -48,8 +48,8 @@ void page_fault_handler(struct regs *r) struct page_dir *dir = NULL; if (proc && proc->page_dir) { dir = proc->page_dir; - printf("Stack is at %x, entry at %x\n", virtual_to_physical(dir, proc->regs.ebp), - virtual_to_physical(dir, proc->entry)); + /* printf("Stack is at %x, entry at %x\n", virtual_to_physical(dir, proc->regs.ebp), */ + /* virtual_to_physical(dir, proc->entry)); */ } else { dir = &kernel_dir; } @@ -165,7 +165,7 @@ void physical_free(struct memory_range range) * Virtual */ -#define PDI(vaddr) (((vaddr) >> 22) & 0x03ff) +#define PDI(vaddr) ((vaddr) >> 22) #define PTI(vaddr) (((vaddr) >> 12) & 0x03ff) u8 virtual_present(struct page_dir *dir, u32 vaddr) @@ -210,15 +210,11 @@ void virtual_map(struct page_dir *dir, struct memory_range prange, u32 vaddr, u3 struct page_table *table = (struct page_table *)(dir_entry->bits.address * PAGE_SIZE); - if (dir_entry->bits.present) { - // TODO: Is this a security risk? - if (flags & MEMORY_USER) - dir_entry->bits.user = 1; - } else { + if (!dir_entry->bits.present) { table = memory_alloc_identity(dir, MEMORY_CLEAR); dir_entry->bits.present = 1; dir_entry->bits.writable = 1; - dir_entry->bits.user = flags & MEMORY_USER; + dir_entry->bits.user = 1; dir_entry->bits.address = (u32)(table) >> 12; } diff --git a/kernel/features/proc.c b/kernel/features/proc.c index aa595ff..5d3c8aa 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -81,11 +81,13 @@ void proc_print(void) { struct node *node = proc_list->head; - printf("\nPROCESSES\n"); + printf("--- PROCESSES ---\n"); struct proc *proc = NULL; while (node && (proc = node->data)) { - printf("Process %d: %s [%s]\n", proc->pid, proc->name, - proc->state == PROC_RUNNING ? "RUNNING" : "SLEEPING"); + printf("Process %d: %s [%s] [entry: %x; stack: %x]\n", proc->pid, proc->name, + proc->state == PROC_RUNNING ? "RUNNING" : "SLEEPING", + virtual_to_physical(proc->page_dir, proc->entry), + virtual_to_physical(proc->page_dir, proc->regs.ebp)); node = node->next; } printf("\n"); -- cgit v1.2.3