summaryrefslogtreecommitdiff
path: root/kernel/lib
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/lib')
-rw-r--r--kernel/lib/backtrace.c15
-rw-r--r--kernel/lib/kalloc.c3
-rw-r--r--kernel/lib/memcmp.c2
-rw-r--r--kernel/lib/memcpy.c2
-rw-r--r--kernel/lib/memmove.c2
-rw-r--r--kernel/lib/memmovev.c3
-rw-r--r--kernel/lib/memset.c2
-rw-r--r--kernel/lib/memsetv.c2
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--) {