diff options
Diffstat (limited to 'kernel/lib')
-rw-r--r-- | kernel/lib/backtrace.c | 15 | ||||
-rw-r--r-- | kernel/lib/kalloc.c | 3 | ||||
-rw-r--r-- | kernel/lib/memcmp.c | 2 | ||||
-rw-r--r-- | kernel/lib/memcpy.c | 2 | ||||
-rw-r--r-- | kernel/lib/memmove.c | 2 | ||||
-rw-r--r-- | kernel/lib/memmovev.c | 3 | ||||
-rw-r--r-- | kernel/lib/memset.c | 2 | ||||
-rw-r--r-- | kernel/lib/memsetv.c | 2 |
8 files changed, 22 insertions, 9 deletions
diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c index 485cc0f..2507be4 100644 --- a/kernel/lib/backtrace.c +++ b/kernel/lib/backtrace.c @@ -6,6 +6,13 @@ 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 +24,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 +47,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; 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; 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 <lib.h> -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 <lib.h> -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 <lib.h> -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..7884cef 100644 --- a/kernel/lib/memmovev.c +++ b/kernel/lib/memmovev.c @@ -1,6 +1,7 @@ #include <lib.h> -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 <lib.h> -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 <lib.h> -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--) { |