From 42bdb9e4fea494b85b394dd99d1686e812eb8a28 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 1 Oct 2023 03:03:13 +0200 Subject: ddb: Add whatis command This is convenient when tracking buffer overflows --- kern/slab.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'kern/slab.c') diff --git a/kern/slab.c b/kern/slab.c index 545c7019..3264ebba 100644 --- a/kern/slab.c +++ b/kern/slab.c @@ -1496,11 +1496,49 @@ void slab_info(void) #if MACH_KDB #include - void db_show_slab_info(void) +void db_show_slab_info(void) { _slab_info(db_printf); } +void db_whatis_slab(vm_offset_t a) +{ + struct kmem_cache *cache; + +#ifndef SLAB_VERIFY + db_printf("enabling SLAB_VERIFY is recommended\n"); +#endif + + simple_lock(&kmem_cache_list_lock); + + list_for_each_entry(&kmem_cache_list, cache, node) { + if (a >= (vm_offset_t) cache + && a < (vm_offset_t) cache + sizeof(*cache)) + db_printf("Cache %s\n", cache->name); + + simple_lock(&cache->lock); + + if (cache->flags & KMEM_CF_USE_TREE) { + struct rbtree_node *node; + + node = rbtree_lookup_nearest(&cache->active_slabs, (void*) a, + kmem_slab_cmp_lookup, RBTREE_LEFT); + if (node) { + struct kmem_slab *slab; + slab = rbtree_entry(node, struct kmem_slab, tree_node); + if (a >= (vm_offset_t) slab->addr + && a < (vm_offset_t) slab->addr + cache->slab_size) + db_printf("In cache %s\n", cache->name); + } + } + + simple_unlock(&cache->lock); + } + + simple_unlock(&kmem_cache_list_lock); + +} + #endif /* MACH_KDB */ #if MACH_DEBUG -- cgit v1.2.3