summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-07-06 20:47:14 +0200
committerAnton Kling <anton@kling.gg>2024-07-06 20:47:14 +0200
commitabcba25c5f5579e50ab205d8fc01ca9dbaa0f5e8 (patch)
tree02187d5cd1e3a14002ef3d350039ec3995310dd8 /kernel
parent6d6289f0fb3b07b0d1a02f671df6b096318d4a4c (diff)
Kernel: Add kmalloc scan
This will scan for possible overflows in the program. It is a somewhat expensive operation but really useful for debugging.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/drivers/pit.c2
-rw-r--r--kernel/kmalloc.c13
-rw-r--r--kernel/kmalloc.h2
-rw-r--r--kernel/sched/scheduler.c1
4 files changed, 15 insertions, 3 deletions
diff --git a/kernel/drivers/pit.c b/kernel/drivers/pit.c
index b875449..8210aa7 100644
--- a/kernel/drivers/pit.c
+++ b/kernel/drivers/pit.c
@@ -1,5 +1,6 @@
#include "pit.h"
#include <arch/i386/tsc.h>
+#include <kmalloc.h>
#include <random.h>
#define PIT_IO_CHANNEL_0 0x40
@@ -47,6 +48,7 @@ u64 last_tsc = 0;
extern u64 timer_current_uptime;
extern int is_switching_tasks;
void int_clock(reg_t *regs) {
+ kmalloc_scan();
u64 current_tsc = tsc_get();
timer_current_uptime = tsc_calculate_ms(current_tsc);
random_add_entropy_fast((u8 *)&current_tsc, sizeof(current_tsc));
diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c
index 939589d..86c4eda 100644
--- a/kernel/kmalloc.c
+++ b/kernel/kmalloc.c
@@ -100,7 +100,7 @@ int add_heap_memory(size_t min_desired) {
return 1;
}
-MallocHeader *next_header(MallocHeader *a) {
+static MallocHeader *next_header(MallocHeader *a) {
assert(a->magic == 0xdde51ab9410268b1);
if (a->n) {
if (a->n->magic != 0xdde51ab9410268b1) {
@@ -113,7 +113,16 @@ MallocHeader *next_header(MallocHeader *a) {
return NULL;
}
-MallocHeader *next_close_header(MallocHeader *a) {
+void kmalloc_scan(void) {
+ if (!head) {
+ return;
+ }
+ MallocHeader *p = head;
+ for (; (p = next_header(p));)
+ ;
+}
+
+static MallocHeader *next_close_header(MallocHeader *a) {
if (!a) {
kprintf("next close header fail\n");
for (;;)
diff --git a/kernel/kmalloc.h b/kernel/kmalloc.h
index 9c03a19..74e4d81 100644
--- a/kernel/kmalloc.h
+++ b/kernel/kmalloc.h
@@ -8,6 +8,8 @@ void kmalloc_align_free(void *p, size_t s);
void kmalloc_allocate_heap(void);
+void kmalloc_scan(void);
+
void *kmalloc(size_t s);
void *krealloc(void *ptr, size_t size);
void *kreallocarray(void *ptr, size_t nmemb, size_t size);
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c
index d04b6e7..9032ac5 100644
--- a/kernel/sched/scheduler.c
+++ b/kernel/sched/scheduler.c
@@ -442,7 +442,6 @@ process_t *next_task(process_t *s) {
}
if (s == c) {
ms_time = timer_get_uptime();
- // wait_for_interrupt();
}
if (c->sleep_until > ms_time) {
continue;