#include <k/core.h>
#include <k/type.h>
#include <k/mem.h>
/* zero.fn.c - kmzero() "zero region"
* ~ lexi hale <lexi@hale.su>
* kmzero() zeroes a region of memory. it is
* libk's equivalent to libc's bzero().
*/
#define canzero(bits) (_canzero(sizeof(u##bits), bits, size))
static bool _canzero(sz type, u8 bits, sz size) {
return (sizeof (u64) * byte_bits == 64 && size >= sizeof (u64));
}
void kmzero(void* memory, sz size) {
ubyte* elt = memory,
* const end = elt + size;
if canzero(64) {
u64* p = (u64*) elt;
sz segments = (end - elt) / sizeof (u64);
for(;(p - (u64*)elt) < segments; ++p) *p = 0;
elt = (ubyte*) p;
}
for (;elt < end; ++elt) *elt = 0;
}