diff options
author | Anton Kling <anton@kling.gg> | 2024-07-06 20:47:14 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-07-06 20:47:14 +0200 |
commit | abcba25c5f5579e50ab205d8fc01ca9dbaa0f5e8 (patch) | |
tree | 02187d5cd1e3a14002ef3d350039ec3995310dd8 /kernel | |
parent | 6d6289f0fb3b07b0d1a02f671df6b096318d4a4c (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.c | 2 | ||||
-rw-r--r-- | kernel/kmalloc.c | 13 | ||||
-rw-r--r-- | kernel/kmalloc.h | 2 | ||||
-rw-r--r-- | kernel/sched/scheduler.c | 1 |
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 *)¤t_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; |