#include <sys/param.h>
#ifdef DEADBEEF0
#define POISON0 ((unsigned) DEADBEEF0)
#else
#define POISON0 ((unsigned) 0xdeadbeef)
#endif
#ifdef DEADBEEF1
#define POISON1 ((unsigned) DEADBEEF1)
#else
#define POISON1 ((unsigned) 0xdeafbead)
#endif
#define POISON_SIZE 64
uint32_t
poison_value(void *v)
{
ulong l = (u_long)v;
l = l >> PAGE_SHIFT;
switch (l & 3) {
case 0:
return POISON0;
case 1:
return POISON1;
case 2:
return (POISON0 & 0xffff0000) | (~POISON0 & 0x0000ffff);
case 3:
return (POISON1 & 0xffff0000) | (~POISON1 & 0x0000ffff);
}
return 0;
}
void
poison_mem(void *v, size_t len)
{
uint32_t *ip = v;
size_t i;
uint32_t poison;
poison = poison_value(v);
if (len > POISON_SIZE)
len = POISON_SIZE;
len = len / sizeof(*ip);
for (i = 0; i < len; i++)
ip[i] = poison;
}
int
poison_check(void *v, size_t len, size_t *pidx, uint32_t *pval)
{
uint32_t *ip = v;
size_t i;
uint32_t poison;
poison = poison_value(v);
if (len > POISON_SIZE)
len = POISON_SIZE;
len = len / sizeof(*ip);
for (i = 0; i < len; i++) {
if (ip[i] != poison) {
*pidx = i;
*pval = poison;
return 1;
}
}
return 0;
}