From f9df808fd5e39a2494a5ab3eb90ea71fdc7b187f Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Thu, 24 Apr 2025 11:32:21 -0400 Subject: only backtrace on valid kernel frames --- kernel/lib/backtrace.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'kernel/lib') diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c index 485cc0f..102e775 100644 --- a/kernel/lib/backtrace.c +++ b/kernel/lib/backtrace.c @@ -6,6 +6,11 @@ struct stackframe { void *rip; }; +extern char kern_stack_start[]; +extern char kern_stack_end[]; + +#define VALID(frame) (frame && (char*)(frame) >= kern_stack_start && ((char*)(frame) <= kern_stack_end)) + size_t backtrace(void **dst, size_t len) { struct stackframe *rbp; @@ -17,11 +22,13 @@ size_t backtrace_ex(void **dst, size_t len, void *ip, void *bp) { struct stackframe *frame = bp; __asm__("mov %%rbp, %0" : "=r"(frame)); + if (!VALID(frame)) + return 0; if (len > 0) { dst[0] = ip; } size_t i; - for (i = 1; frame && i < len; i++) { + for (i = 1; VALID(frame) && i < len; i++) { dst[i] = frame->rip; frame = frame->rbp; } @@ -38,9 +45,11 @@ void log_backtrace(void) void log_backtrace_ex(void *ip, void *bp) { struct stackframe *frame = bp; + if (!VALID(frame)) + return; kputs("Stack trace:\n"); kprintf(" %p\t%s\n", ip, mboot_get_elf_sym((uint64_t)ip)); - while (frame) { + while (VALID(frame)) { kprintf(" %p\t%s\n", frame->rip, mboot_get_elf_sym((uint64_t)frame->rip)); frame = frame->rbp; -- cgit v1.2.3-freya From f5c474cf77965376614e8c42a48f1f295228bcd6 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Thu, 24 Apr 2025 13:41:38 -0400 Subject: fmt --- kernel/cpu/tss.c | 14 ++++++++------ kernel/lib/backtrace.c | 4 +++- kernel/memory/paging.c | 6 +++--- kernel/syscall.c | 28 +++++++++------------------- 4 files changed, 23 insertions(+), 29 deletions(-) (limited to 'kernel/lib') diff --git a/kernel/cpu/tss.c b/kernel/cpu/tss.c index bda713b..100525b 100644 --- a/kernel/cpu/tss.c +++ b/kernel/cpu/tss.c @@ -11,7 +11,7 @@ struct sys_seg_descriptor { uint64_t : 1; uint64_t DPL : 2; uint64_t present : 1; - uint64_t limit16_19: 4; + uint64_t limit16_19 : 4; uint64_t available : 1; uint64_t : 1; uint64_t : 1; @@ -49,16 +49,17 @@ static volatile struct sys_seg_descriptor *GDT_TSS; // kernel stack pointer extern char kern_stack_end[]; -void tss_init(void) { - uint64_t base = (uint64_t) &tss; +void tss_init(void) +{ + uint64_t base = (uint64_t)&tss; uint64_t limit = sizeof tss - 1; // setup tss entry memsetv(&tss, 0, sizeof(struct tss)); - tss.rsp0 = (uint64_t) kern_stack_end; + tss.rsp0 = (uint64_t)kern_stack_end; // map tss into gdt - GDT_TSS = (volatile struct sys_seg_descriptor *) (GDT + 0x28); + GDT_TSS = (volatile struct sys_seg_descriptor *)(GDT + 0x28); memsetv(GDT_TSS, 0, sizeof(struct sys_seg_descriptor)); GDT_TSS->limit0_15 = limit & 0xFFFF; GDT_TSS->base0_15 = base & 0xFFFF; @@ -75,6 +76,7 @@ void tss_init(void) { tss_flush(); } -void tss_set_stack(uint64_t stack) { +void tss_set_stack(uint64_t stack) +{ tss.rsp0 = stack; } diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c index 102e775..2507be4 100644 --- a/kernel/lib/backtrace.c +++ b/kernel/lib/backtrace.c @@ -9,7 +9,9 @@ struct stackframe { extern char kern_stack_start[]; extern char kern_stack_end[]; -#define VALID(frame) (frame && (char*)(frame) >= kern_stack_start && ((char*)(frame) <= kern_stack_end)) +#define VALID(frame) \ + (frame && (char *)(frame) >= kern_stack_start && \ + ((char *)(frame) <= kern_stack_end)) size_t backtrace(void **dst, size_t len) { diff --git a/kernel/memory/paging.c b/kernel/memory/paging.c index f286027..80ab833 100644 --- a/kernel/memory/paging.c +++ b/kernel/memory/paging.c @@ -236,7 +236,8 @@ static volatile struct pdpt *pdpt_locate(volatile struct pml4 *pPML4, // locate a pd for a vitural address // @returns PHYSICAL ADDRESS -static volatile struct pd *pd_locate(volatile struct pdpt *pPDPT, const void *vADDR) +static volatile struct pd *pd_locate(volatile struct pdpt *pPDPT, + const void *vADDR) { volatile struct pdpt *vPDPT; volatile struct pdpte *vPDPTE; @@ -667,8 +668,7 @@ volatile void *paging_alloc(void) if (pPML4 == NULL) return NULL; - if (map_pages(pPML4, kernel_start, kernel_start, - F_PRESENT | F_WRITEABLE, + if (map_pages(pPML4, kernel_start, kernel_start, F_PRESENT | F_WRITEABLE, (kernel_end - kernel_start) / PAGE_SIZE)) { pml4_free(pPML4, false); return NULL; diff --git a/kernel/syscall.c b/kernel/syscall.c index 7887e83..7944f46 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -12,7 +12,7 @@ static int sys_exit(void) { ARG1(int, status); - (void) status; + (void)status; // FIXME: schedule somthing else while (1) @@ -53,23 +53,12 @@ static int sys_write(void) } static int (*syscall_tbl[N_SYSCALLS])(void) = { - [SYS_exit] = sys_exit, - [SYS_waitpid] = NULL, - [SYS_fork] = NULL, - [SYS_exec] = NULL, - [SYS_open] = NULL, - [SYS_close] = NULL, - [SYS_read] = NULL, - [SYS_write] = sys_write, - [SYS_getpid] = NULL, - [SYS_getppid] = NULL, - [SYS_gettime] = NULL, - [SYS_getprio] = NULL, - [SYS_setprio] = NULL, - [SYS_kill] = NULL, - [SYS_sleep] = NULL, - [SYS_brk] = NULL, - [SYS_sbrk] = NULL, + [SYS_exit] = sys_exit, [SYS_waitpid] = NULL, [SYS_fork] = NULL, + [SYS_exec] = NULL, [SYS_open] = NULL, [SYS_close] = NULL, + [SYS_read] = NULL, [SYS_write] = sys_write, [SYS_getpid] = NULL, + [SYS_getppid] = NULL, [SYS_gettime] = NULL, [SYS_getprio] = NULL, + [SYS_setprio] = NULL, [SYS_kill] = NULL, [SYS_sleep] = NULL, + [SYS_brk] = NULL, [SYS_sbrk] = NULL, }; void syscall_handler(struct cpu_regs *regs) @@ -91,7 +80,8 @@ void syscall_handler(struct cpu_regs *regs) if (num >= N_SYSCALLS) { // invalid syscall // FIXME: kill user process - while(1); + while (1) + ; } // run syscall handler (if exists) -- cgit v1.2.3-freya From bcfcfc348ebda9f08391348a3e58b3168d678ffc Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sun, 27 Apr 2025 14:09:14 -0400 Subject: zero and set define magic header in kalloc --- kernel/lib/kalloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'kernel/lib') diff --git a/kernel/lib/kalloc.c b/kernel/lib/kalloc.c index 9845a62..0141149 100644 --- a/kernel/lib/kalloc.c +++ b/kernel/lib/kalloc.c @@ -54,7 +54,8 @@ static void *alloc_new(size_t size) } struct page_header *header = addr; - header->magic = 0xBEEFCAFE; + memsetv(header, 0, sizeof(struct page_header)); + header->magic = MAGIC; header->used = size; header->free = free; header->prev = end_header; -- cgit v1.2.3-freya From 5c96b3206d568f359eeb99034b571a2885166e2c Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sun, 27 Apr 2025 22:42:09 -0400 Subject: add register to n param --- kernel/lib/memcmp.c | 2 +- kernel/lib/memcpy.c | 2 +- kernel/lib/memmove.c | 2 +- kernel/lib/memmovev.c | 2 +- kernel/lib/memset.c | 2 +- kernel/lib/memsetv.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) (limited to 'kernel/lib') diff --git a/kernel/lib/memcmp.c b/kernel/lib/memcmp.c index f938d0a..464fda3 100644 --- a/kernel/lib/memcmp.c +++ b/kernel/lib/memcmp.c @@ -1,6 +1,6 @@ #include -int memcmp(const void *restrict vl, const void *restrict vr, size_t n) +int memcmp(const void *restrict vl, const void *restrict vr, register size_t n) { const unsigned char *l = vl, *r = vr; for (; n && *l == *r; n--, l++, r++) diff --git a/kernel/lib/memcpy.c b/kernel/lib/memcpy.c index e848cef..168c926 100644 --- a/kernel/lib/memcpy.c +++ b/kernel/lib/memcpy.c @@ -1,6 +1,6 @@ #include -void *memcpy(void *restrict dest, const void *restrict src, size_t n) +void *memcpy(void *restrict dest, const void *restrict src, register size_t n) { char *d = dest; const char *s = src; diff --git a/kernel/lib/memmove.c b/kernel/lib/memmove.c index 55be66d..b413c1f 100644 --- a/kernel/lib/memmove.c +++ b/kernel/lib/memmove.c @@ -1,6 +1,6 @@ #include -void *memmove(void *dest, const void *src, size_t n) +void *memmove(void *dest, const void *src, register size_t n) { char *d = dest; const char *s = src; diff --git a/kernel/lib/memmovev.c b/kernel/lib/memmovev.c index 56684a5..65e6278 100644 --- a/kernel/lib/memmovev.c +++ b/kernel/lib/memmovev.c @@ -1,6 +1,6 @@ #include -volatile void *memmovev(volatile void *dest, const volatile void *src, size_t n) +volatile void *memmovev(volatile void *dest, const volatile void *src, register size_t n) { volatile char *d = dest; volatile const char *s = src; diff --git a/kernel/lib/memset.c b/kernel/lib/memset.c index d1c2a5e..7132e02 100644 --- a/kernel/lib/memset.c +++ b/kernel/lib/memset.c @@ -1,6 +1,6 @@ #include -void *memset(void *dest, int c, size_t n) +void *memset(void *dest, int c, register size_t n) { unsigned char *d = dest; for (; n; n--) { diff --git a/kernel/lib/memsetv.c b/kernel/lib/memsetv.c index 647847f..d5267b7 100644 --- a/kernel/lib/memsetv.c +++ b/kernel/lib/memsetv.c @@ -1,6 +1,6 @@ #include -volatile void *memsetv(volatile void *dest, int c, size_t n) +volatile void *memsetv(volatile void *dest, int c, register size_t n) { volatile unsigned char *d = dest; for (; n; n--) { -- cgit v1.2.3-freya From 10d5e592e490ae89b88209635b1afd0343cae161 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 28 Apr 2025 11:10:00 -0400 Subject: fmt --- kernel/lib/memmovev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'kernel/lib') diff --git a/kernel/lib/memmovev.c b/kernel/lib/memmovev.c index 65e6278..7884cef 100644 --- a/kernel/lib/memmovev.c +++ b/kernel/lib/memmovev.c @@ -1,6 +1,7 @@ #include -volatile void *memmovev(volatile void *dest, const volatile void *src, register size_t n) +volatile void *memmovev(volatile void *dest, const volatile void *src, + register size_t n) { volatile char *d = dest; volatile const char *s = src; -- cgit v1.2.3-freya