From 63ed037fdbb04a4855531f5ce980d8517752f640 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Wed, 17 Mar 2021 22:33:31 +0100 Subject: Awesome! --- apps/Makefile | 7 +++---- apps/init.c | 5 ++++- apps/window.c | 3 +-- 3 files changed, 8 insertions(+), 7 deletions(-) (limited to 'apps') diff --git a/apps/Makefile b/apps/Makefile index 1a7aff3..9ad268e 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -5,16 +5,15 @@ CC = ccache ../cross/opt/bin/i686-elf-gcc LD = ccache ../cross/opt/bin/i686-elf-ld OC = ccache ../cross/opt/bin/i686-elf-objcopy -CFLAGS = $(CFLAGS_DEFAULT) -I../libc/inc/ -I../libgui/inc/ -I../libtxt/inc/ -fPIE -Duserspace +CFLAGS = $(CFLAGS_DEFAULT) -I../libc/inc/ -I../libgui/inc/ -I../libtxt/inc/ -Duserspace all: $(COBJS) %.o: %.c @mkdir -p ../build/apps/ @$(CC) -c $(CFLAGS) $< -o $@ - @$(LD) -o $(@:.o=.elf) -Tlink.ld -L../build/ $@ -lgui -ltxt -lc - @$(OC) -O binary $(@:.o=.elf) ../build/apps/$(@:.o=) - @cp $(@:.o=.elf) ../build/apps/$(@:.o=.elf) + @$(LD) -o $(@:.o=.elf) -L../build/ $@ -lgui -ltxt -lc + @cp $(@:.o=.elf) ../build/apps/$(@:.o=) # %.o: %.c # @mkdir -p ../build/apps/ diff --git a/apps/init.c b/apps/init.c index 35d296b..c26e3ad 100644 --- a/apps/init.c +++ b/apps/init.c @@ -8,9 +8,12 @@ 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/window", "test", NULL) == 0); return 0; } diff --git a/apps/window.c b/apps/window.c index 90a414c..0f9e7d1 100644 --- a/apps/window.c +++ b/apps/window.c @@ -8,8 +8,7 @@ int main(void) { struct gui_window win = { 0 }; assert(gui_new_window(&win) > 0); - while (1) - ; + return 0; #if 0 gfx_fill(win.ctx, COLOR_GREEN); // Professional testing -- 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 'apps') 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 From b96c27bba0b242fc860fc9a2fcb63f121312fa7e Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 20 Mar 2021 19:52:56 +0100 Subject: LGTM! --- Makefile | 4 ++-- apps/Makefile | 2 +- apps/init.c | 3 +-- apps/link.ld | 29 ----------------------------- boot/load.c | 2 +- kernel/Makefile | 2 +- kernel/drivers/fb.c | 12 ++++++++---- kernel/features/load.c | 5 ++--- kernel/features/mm.c | 26 ++++++++++++++------------ kernel/features/syscall.c | 10 ++++++---- kernel/inc/fb.h | 2 ++ kernel/inc/mm.h | 9 +++++++-- kernel/link.ld | 2 +- kernel/main.c | 2 ++ 14 files changed, 48 insertions(+), 62 deletions(-) delete mode 100644 apps/link.ld (limited to 'apps') diff --git a/Makefile b/Makefile index f08c26b..e086c05 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ CFLAGS_DEFAULT = $(CFLAGS_WARNINGS) $(CFLAGS_OPTIMIZATION) -std=c99 -m32 -nostdl 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 +# TODO: Fix ubsan in userspace - Os should be a temporary fix +debug: CFLAGS_DEFAULT += -Wno-error -ggdb3 -s -Os -fsanitize=undefined -fstack-protector-all debug: compile export diff --git a/apps/Makefile b/apps/Makefile index 66f8e42..d43104a 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -13,7 +13,7 @@ all: $(COBJS) %.o: %.c @mkdir -p ../build/apps/ @$(CC) -c $(CFLAGS) $< -o $@ - @$(LD) -o $(@:.o=.elf) -Tlink.ld -L../build/ -static $@ -lgui -ltxt -lc + @$(LD) -o $(@:.o=.elf) --section-start=.text=0x42000000 -L../build/ -static $@ -lgui -ltxt -lc @cp $(@:.o=.elf) ../build/apps/$(@:.o=) #@$(ST) --strip-all ../build/apps/$(@:.o=) diff --git a/apps/init.c b/apps/init.c index 221708e..35d296b 100644 --- a/apps/init.c +++ b/apps/init.c @@ -8,9 +8,8 @@ int main(int argc, char **argv) { UNUSED(argc); UNUSED(argv); - log("Arrived!\n"); - /* assert(exec("/bin/wm", "wm", 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 deleted file mode 100644 index e28bb34..0000000 --- a/apps/link.ld +++ /dev/null @@ -1,29 +0,0 @@ -OUTPUT_FORMAT("elf32-i386") -OUTPUT_ARCH(i386) -ENTRY(_start) - -SECTIONS -{ - . = 0x40000000; - - .text : { - code = .; - *(.text) - *(.rodata) - . = ALIGN(4096); - } - - .data : { - data = .; - *(.data) - . = ALIGN(4096); - } - - .bss : { - bss = .; - *(.bss) - . = ALIGN(4096); - } - - . = ALIGN(4096); -} diff --git a/boot/load.c b/boot/load.c index 34c6af8..4a6f3db 100644 --- a/boot/load.c +++ b/boot/load.c @@ -336,7 +336,7 @@ void *read_inode(struct inode *in) if (!num_blocks) return 0; - void *buf = (void *)0x50000; + void *buf = (void *)0x9000; //assert(buf != 0); int indirect; diff --git a/kernel/Makefile b/kernel/Makefile index 1d9e87a..64035e5 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -36,5 +36,5 @@ all: compile compile: $(COBJS) @mkdir -p ../build/ - @$(LD) -N -z undefs -ekernel_main -Ttext 0x00050000 -o ../build/kernel.elf -L../build/ $+ -lk + @$(LD) -N -z undefs -ekernel_main -Ttext 0x00009000 -o ../build/kernel.elf -L../build/ $+ -lk @$(LD) -N -z max-page-size=0x1000 -Tlink.ld -o ../build/kernel.bin -L../build/ $+ -lk diff --git a/kernel/drivers/fb.c b/kernel/drivers/fb.c index af8a830..2db05f2 100644 --- a/kernel/drivers/fb.c +++ b/kernel/drivers/fb.c @@ -33,11 +33,8 @@ static s32 fb_ioctl(u32 request, void *arg1, void *arg2, void *arg3, struct devi case IO_FB_GET: { if (!info) return -1; - struct vbe_basic *vbe = (struct vbe_basic *)info->vbe; memcpy(arg1, info->vbe, sizeof(struct vbe_basic)); - u32 size = vbe->height * vbe->pitch; - memory_map_identity(proc_current()->page_dir, - memory_range_around((u32)vbe->fb, size), MEMORY_USER); + fb_map_buffer(proc_current()->page_dir, info); return 0; } default: @@ -50,6 +47,13 @@ static s32 fb_ready(void) return 1; } +void fb_map_buffer(struct page_dir *dir, struct vid_info *boot) +{ + struct vbe_basic *vbe = (struct vbe_basic *)boot->vbe; + u32 size = vbe->height * vbe->pitch; + memory_map_identity(dir, memory_range_around((u32)vbe->fb, size), MEMORY_USER); +} + void fb_install(struct vid_info *boot) { info = boot; diff --git a/kernel/features/load.c b/kernel/features/load.c index d3f3495..3430a75 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -104,9 +104,8 @@ s32 elf_load(const char *path, struct proc *proc) struct memory_range prange = physical_alloc(vrange.size); virtual_map(proc->page_dir, prange, vrange.base, MEMORY_CLEAR | MEMORY_USER); - if ((u32)vfs_read(path, (void *)program.vaddr, program.offset, program.filesz) != - program.filesz) { - print("OH NOSE!\n"); + if ((u32)vfs_read(proc->name, (void *)program.vaddr, program.offset, + program.filesz) != program.filesz) { memory_switch_dir(prev); return -ENOEXEC; } diff --git a/kernel/features/mm.c b/kernel/features/mm.c index b06657f..b804076 100644 --- a/kernel/features/mm.c +++ b/kernel/features/mm.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -15,23 +16,23 @@ static struct page_table kernel_tables[PAGE_KERNEL_COUNT] ALIGNED(PAGE_SIZE) = { * Lowlevel paging */ -/*static void paging_disable(void) +static void paging_switch_dir(u32 dir) +{ + cr3_set(dir); +} + +extern void paging_invalidate_tlb(void); + +/*void paging_disable(void) { cr0_set(cr0_get() | 0x7fffffff); }*/ -static void paging_enable(void) +void paging_enable(void) { cr0_set(cr0_get() | 0x80000000); } -static void paging_switch_dir(u32 dir) -{ - cr3_set(dir); -} - -extern void paging_invalidate_tlb(void); - void page_fault_handler(struct regs *r) { print("--- PAGE FAULT! ---\n"); @@ -415,12 +416,12 @@ void memory_backup_dir(struct page_dir **backup) static u8 memory_bypass_validity = 0; void memory_bypass_enable(void) { - memory_bypass_validity = 1; + /* memory_bypass_validity = 1; */ } void memory_bypass_disable(void) { - memory_bypass_validity = 0; + /* memory_bypass_validity = 0; */ } // TODO: Limit by proc stack and data range @@ -506,9 +507,10 @@ void memory_install(struct mem_info *mem_info, struct vid_info *vid_info) memory_map_identity(&kernel_dir, memory_range_around(STACK_START - STACK_SIZE, STACK_SIZE), MEMORY_NONE); - // Map VBE data + // Map framebuffer memory_map_identity(&kernel_dir, memory_range_around((u32)vid_info->vbe, 0x1000), MEMORY_NONE); + fb_map_buffer(virtual_kernel_dir(), vid_info); // Unmap NULL byte/page struct memory_range zero = memory_range(0, PAGE_SIZE); diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index 2334947..7d68d93 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -73,11 +73,13 @@ static void syscall_handler(struct regs *r) char *path = (char *)r->ebx; struct proc *proc = proc_make(PROC_PRIV_NONE); r->eax = (u32)elf_load(path, proc); - if (r->eax != 0) + if (r->eax != 0) { proc_exit(proc, -r->eax); - // TODO: Reimplement argc,argv - proc_stack_push(proc, 0); - proc_yield(r); + } else { + // TODO: Reimplement argc,argv + proc_stack_push(proc, 0); + proc_yield(r); + } break; } case SYS_EXIT: { diff --git a/kernel/inc/fb.h b/kernel/inc/fb.h index 212230b..3b545fd 100644 --- a/kernel/inc/fb.h +++ b/kernel/inc/fb.h @@ -4,7 +4,9 @@ #define FB_H #include +#include +void fb_map_buffer(struct page_dir *dir, struct vid_info *boot); void fb_install(struct vid_info *boot); #endif diff --git a/kernel/inc/mm.h b/kernel/inc/mm.h index 98dcf46..5a307b2 100644 --- a/kernel/inc/mm.h +++ b/kernel/inc/mm.h @@ -12,6 +12,13 @@ struct memory_range { u32 size; }; +/** + * Lowlevel paging + */ + +void paging_enable(void); +void page_fault_handler(struct regs *r); + /** * Physical */ @@ -109,6 +116,4 @@ u8 memory_valid(const void *addr); void memory_install(struct mem_info *mem_info, struct vid_info *vid_info); -void page_fault_handler(struct regs *r); - #endif diff --git a/kernel/link.ld b/kernel/link.ld index 5a63e33..fbe8a8c 100644 --- a/kernel/link.ld +++ b/kernel/link.ld @@ -1,7 +1,7 @@ OUTPUT_FORMAT("binary") OUTPUT_ARCH(i386) ENTRY(kernel_main) -phys = 0x00050000; +phys = 0x00009000; SECTIONS { diff --git a/kernel/main.c b/kernel/main.c index 5c5299e..3ff0463 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -27,6 +27,8 @@ void kernel_main(struct mem_info *mem_info, struct vid_info *vid_info) serial_print("Serial connected.\n"); memory_install(mem_info, vid_info); + memory_switch_dir(virtual_kernel_dir()); + paging_enable(); cpu_enable_features(); cpu_print(); -- cgit v1.2.3