We can detect this class of error by redefining the flags to use the high bits instead of the low ones. This way the malloc() KMEMSTAT value check triggers because 0x10000000 is greater than the maximum type value.
I tested the following, and it boots fine, and when I moved M_ZERO to the type field in acpibtn the allocation panicked. (Of course, having different prefixes for type and flags would help but that is another matter.) -m. Index: sys/malloc.h =================================================================== RCS file: /cvs/src/sys/sys/malloc.h,v retrieving revision 1.122 diff -u -p -r1.122 malloc.h --- sys/malloc.h 3 Feb 2022 17:18:22 -0000 1.122 +++ sys/malloc.h 12 Dec 2022 23:24:23 -0000 @@ -53,11 +53,13 @@ /* * flags to malloc + * Uses high bits to trigger 'type' limit check + * if misused. */ -#define M_WAITOK 0x0001 -#define M_NOWAIT 0x0002 -#define M_CANFAIL 0x0004 -#define M_ZERO 0x0008 +#define M_WAITOK 0x10000000 +#define M_NOWAIT 0x20000000 +#define M_CANFAIL 0x40000000 +#define M_ZERO 0x80000000 /* * Types of memory to be allocated -- Rumour is information distilled so finely that it can filter through anything. -- (Terry Pratchett, Feet of Clay)