From 6761ca494b9c8901060b854f4f3d7f30833b20f5 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 28 May 2023 17:55:02 -0300 Subject: [PATCH] slab: fix indirect return object and add a debug assert define --- kernel-src/mm/slab.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/kernel-src/mm/slab.c b/kernel-src/mm/slab.c index 64faf0ed..f524a2a2 100644 --- a/kernel-src/mm/slab.c +++ b/kernel-src/mm/slab.c @@ -12,6 +12,8 @@ #define GET_SLAB(x) (slab_t *)(ROUND_DOWN((uintptr_t)x, PAGE_SIZE) + SLAB_PAGE_OFFSET) +#define SLAB_DEBUG 0 + // the cache responsible for allocating all others static scache_t selfcache = { .size = sizeof(scache_t), @@ -77,6 +79,18 @@ static void *takeobject(scache_t *cache, slab_t *slab) { return NULL; void **objend = slab->free; + +#if SLAB_DEBUG != 0 + if (cache->size < SLAB_INDIRECT_CUTOFF) { + void *addr = (void *)objend; + void *base = (void *)ROUND_DOWN((uintptr_t)slab, PAGE_SIZE); + __assert(addr > base && addr < (void *)slab); + } else { + void *addr = slab->base + ((uintptr_t)objend - ROUND_DOWN((uintptr_t)slab, PAGE_SIZE)) / sizeof(void **) * cache->truesize; + __assert(addr > slab->base && (uintptr_t)addr < (uintptr_t)slab->base + cache->slabobjcount * cache->truesize); + } +#endif + slab->free = *slab->free; slab->used += 1; *objend = NULL; @@ -110,7 +124,7 @@ static slab_t *returnobject(scache_t *cache, void *obj) { } __assert(slab); uintmax_t objn = ((uintptr_t)obj - (uintptr_t)slab->base) / cache->truesize; - void **base = (void **)ROUND_DOWN((uintptr_t)obj, PAGE_SIZE); + void **base = (void **)ROUND_DOWN((uintptr_t)slab, PAGE_SIZE); freeptr = &base[objn]; }