diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c --- a/sys/kern/kern_malloc.c +++ b/sys/kern/kern_malloc.c @@ -228,6 +228,16 @@ CTLFLAG_RD | CTLTYPE_OPAQUE | CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_malloc_zone_sizes, "S", "Zone sizes used by malloc"); +#ifdef MALLOC_DEBUG +static uint64_t sysctl_panic_on_free_addr = 0; +SYSCTL_U64(_vm_malloc, OID_AUTO, panic_on_free_addr, CTLFLAG_RW, + &sysctl_panic_on_free_addr, 0, "Panic if this address is freed"); + +static uint64_t sysctl_printf_on_free_addr = 0; +SYSCTL_U64(_vm_malloc, OID_AUTO, printf_on_free_addr, CTLFLAG_RW, + &sysctl_printf_on_free_addr, 0, "Printf if this address is freed"); +#endif + /* * The malloc_mtx protects the kmemstatistics linked list. */ @@ -493,7 +503,12 @@ void contigfree(void *addr, unsigned long size, struct malloc_type *type) { - +#ifdef MALLOC_DEBUG + if (sysctl_printf_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_printf_on_free_addr) + printf("%s: REQUESTED PRINTF on freeing %p size %lu type %s\n", __func__, addr, size, type->ks_shortdesc); + if (sysctl_panic_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_panic_on_free_addr) + panic("%s: REQUESTED PANIC on freeing %p size %lu type %s\n", __func__, addr, size, type->ks_shortdesc); +#endif kmem_free(addr, size); malloc_type_freed(type, round_page(size)); } @@ -878,6 +893,11 @@ if (addr == NULL) return (EJUSTRETURN); + if (sysctl_printf_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_printf_on_free_addr) + printf("%s: REQUESTED PRINTF on freeing %p type %s\n", __func__, addr, mtp->ks_shortdesc); + if (sysctl_panic_on_free_addr != 0 && (uintptr_t)addr == (uintptr_t)sysctl_panic_on_free_addr) + panic("%s: REQUESTED PANIC on freeing %p type %s\n", __func__, addr, mtp->ks_shortdesc); + #ifdef DEBUG_MEMGUARD if (is_memguard_addr(addr)) { memguard_free(addr);