/*
 * Electric Fence - Red-Zone memory allocator.
 * Bruce Perens, 1988, 1993
 *
 * For email below, drop spaces and <spam-buster> tag.
 * MODIFIED:  March 20, 2014 (jric<spam-buster> @ <spam-buster> chegg DOT com)
 *
 * This is a special version of malloc() and company for debugging software
 * that is suspected of overrunning or underrunning the boundaries of a
 * malloc buffer, or touching free memory.
 *
 * It arranges for each malloc buffer to be followed (or preceded)
 * in the address space by an inaccessable virtual memory page,
 * and for free memory to be inaccessable. If software touches the
 * inaccessable page, it will get an immediate segmentation
 * fault. It is then trivial to uncover the offending code using a debugger.
 *
 * An advantage of this product over most malloc debuggers is that this one
 * detects reading out of bounds as well as writing, and this one stops on
 * the exact instruction that causes the error, rather than waiting until the
 * next boundary check.
 *
 * There is one product that debugs malloc buffer overruns
 * better than Electric Fence: "Purify" from Purify Systems, and that's only
 * a small part of what Purify does. I'm not affiliated with Purify, I just
 * respect a job well done.
 *
 * This version of malloc() should not be linked into production software,
 * since it tremendously increases the time and memory overhead of malloc().
 * Each malloc buffer will consume a minimum of two virtual memory pages,
 * this is 16 kilobytes on many systems. On some systems it will be necessary
 * to increase the amount of swap space in order to debug large programs that
 * perform lots of allocation, because of the per-buffer overhead.
 *
 */
#include "efence.h"
#include <errno.h>
#include <memory.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <parlib/spinlock.h>
#include <parlib/stdio.h>

/*
 * MEMORY_CREATION_SIZE is the amount of memory to get from the operating
 * system at one time. We'll break that memory down into smaller pieces for
 * malloc buffers. One megabyte is probably a good value.
 */
#define MEMORY_CREATION_SIZE 1024 * 1024

/*
 * Enum Mode indicates the status of a malloc buffer.
 */
enum _Mode {
	NOT_IN_USE = 0, /* Available to represent a malloc buffer. */
	FREE,           /* A free buffer. */
	ALLOCATED,      /* A buffer that is in use. */
	PROTECTED,      /* A freed buffer that can not be allocated again. */
	INTERNAL_USE    /* A buffer used internally by malloc(). */
};
typedef enum _Mode Mode;

/*
 * Struct Slot contains all of the information about a malloc buffer except
 * for the contents of its memory.
 */
struct _Slot {
	void *userAddress;
	void *internalAddress;
	size_t userSize;
	size_t internalSize;
	Mode mode;
};
typedef struct _Slot Slot;

/*
 * EF_ALIGNMENT is a global variable used to control the default alignment
 * of buffers returned by malloc(), calloc(), and realloc(). It is all-caps
 * so that its name matches the name of the environment variable that is used
 * to set it. This gives the programmer one less name to remember.
 * If the value is -1, it will be set from the environment or sizeof(int)
 * at run time.
 */
int EF_ALIGNMENT = -1;

/*
 * EF_PROTECT_FREE is a global variable used to control the disposition of
 * memory that is released using free(). It is all-caps so that its name
 * matches the name of the environment variable that is used to set it.
 * If its value is greater non-zero, memory released by free is made
 * inaccessable and never allocated again. Any software that touches free
 * memory will then get a segmentation fault. If its value is zero, freed
 * memory will be available for reallocation, but will still be inaccessable
 * until it is reallocated.
 * If the value is -1, it will be set from the environment or to 0 at run-time.
 */
int EF_PROTECT_FREE = -1;

/*
 * EF_PROTECT_BELOW is used to modify the behavior of the allocator. When
 * its value is non-zero, the allocator will place an inaccessable page
 * immediately _before_ the malloc buffer in the address space, instead
 * of _after_ it. Use this to detect malloc buffer under-runs, rather than
 * over-runs. It won't detect both at the same time, so you should test your
 * software twice, once with this value clear, and once with it set.
 * If the value is -1, it will be set from the environment or to zero at
 * run-time
 */
int EF_PROTECT_BELOW = -1;

/*
 * EF_ALLOW_MALLOC_0 is set if Electric Fence is to allow malloc(0). I
 * trap malloc(0) by default because it is a common source of bugs.
 */
int EF_ALLOW_MALLOC_0 = -1;

/*
 * EF_FREE_WIPES is set if Electric Fence is to wipe the memory content
 * of freed blocks.  This makes it easier to check if memory is freed or
 * not
 */
int EF_FREE_WIPES = -1;

/*
 * allocationList points to the array of slot structures used to manage the
 * malloc arena.
 */
static Slot *allocationList = 0;

/*
 * allocationListSize is the size of the allocation list. This will always
 * be a multiple of the page size.
 */
static size_t allocationListSize = 0;

/*
 * slotCount is the number of Slot structures in allocationList.
 */
static size_t slotCount = 0;

/*
 * unUsedSlots is the number of Slot structures that are currently available
 * to represent new malloc buffers. When this number gets too low, we will
 * create new slots.
 */
static size_t unUsedSlots = 0;

/*
 * slotsPerPage is the number of slot structures that fit in a virtual
 * memory page.
 */
static size_t slotsPerPage = 0;

/*
 * internalUse is set when allocating and freeing the allocatior-internal
 * data structures.
 */
static int internalUse = 0;

/*
 * noAllocationListProtection is set to tell malloc() and free() not to
 * manipulate the protection of the allocation list. This is only set in
 * realloc(), which does it to save on slow system calls, and in
 * allocateMoreSlots(), which does it because it changes the allocation list.
 */
static int noAllocationListProtection = 0;

/*
 * bytesPerPage is set at run-time to the number of bytes per virtual-memory
 * page, as returned by Page_Size().
 */
static size_t bytesPerPage = 0;

/*
 * mutex to enable multithreaded operation
 */
static struct spin_pdr_lock pdr_lock = SPINPDR_INITIALIZER;
#define RECURSE_UNLOCKED -1
static long lockholder = RECURSE_UNLOCKED;
static int lock_depth;

static long who_am_i(void)
{
	if (in_vcore_context())
		return vcore_id();
	else
		return (long)current_uthread;
}

static void lock(void)
{
	long me = who_am_i();

	if (!spin_pdr_trylock(&pdr_lock)) {
		if (lockholder == me) {
			lock_depth++;
			return;
		}
		spin_pdr_lock(&pdr_lock);
	}
	lockholder = me;
	lock_depth = 1;
}

static void unlock(void)
{
	lock_depth--;
	if (!lock_depth) {
		lockholder = RECURSE_UNLOCKED;
		spin_pdr_unlock(&pdr_lock);
	}
}

/*
 * internalError is called for those "shouldn't happen" errors in the
 * allocator.
 */
static void internalError(void)
{
	EF_Abort("Internal error in allocator.");
}

/*
 * initialize sets up the memory allocation arena and the run-time
 * configuration information.
 */
static void initialize(void)
{
	size_t size = MEMORY_CREATION_SIZE;
	size_t slack;
	char *string;
	Slot *slot;

	/*
	 * Import the user's environment specification of the default
	 * alignment for malloc(). We want that alignment to be under
	 * user control, since smaller alignment lets us catch more bugs,
	 * however some software will break if malloc() returns a buffer
	 * that is not word-aligned.
	 *
	 * I would like
	 * alignment to be zero so that we could catch all one-byte
	 * overruns, however if malloc() is asked to allocate an odd-size
	 * buffer and returns an address that is not word-aligned, or whose
	 * size is not a multiple of the word size, software breaks.
	 * This was the case with the Sun string-handling routines,
	 * which can do word fetches up to three bytes beyond the end of a
	 * string. I handle this problem in part by providing
	 * byte-reference-only versions of the string library functions, but
	 * there are other functions that break, too. Some in X Windows, one
	 * in Sam Leffler's TIFF library, and doubtless many others.
	 */
	if (EF_ALIGNMENT == -1) {
		if ((string = getenv("EF_ALIGNMENT")) != 0)
			EF_ALIGNMENT = (size_t)atoi(string);
		else
			EF_ALIGNMENT = sizeof(int);
	}

	/*
	 * See if the user wants to protect the address space below a buffer,
	 * rather than that above a buffer.
	 */
	if (EF_PROTECT_BELOW == -1) {
		if ((string = getenv("EF_PROTECT_BELOW")) != 0)
			EF_PROTECT_BELOW = (atoi(string) != 0);
		else
			EF_PROTECT_BELOW = 0;
	}

	/*
	 * See if the user wants to protect memory that has been freed until
	 * the program exits, rather than until it is re-allocated.
	 */
	if (EF_PROTECT_FREE == -1) {
		if ((string = getenv("EF_PROTECT_FREE")) != 0)
			EF_PROTECT_FREE = (atoi(string) != 0);
		else
			EF_PROTECT_FREE = 0;
	}

	/*
	 * See if the user wants to allow malloc(0).
	 */
	if (EF_ALLOW_MALLOC_0 == -1) {
		if ((string = getenv("EF_ALLOW_MALLOC_0")) != 0)
			EF_ALLOW_MALLOC_0 = (atoi(string) != 0);
		else
			EF_ALLOW_MALLOC_0 = 0;
	}

	/*
	 * See if the user wants us to wipe out freed memory.
	 */
	if (EF_FREE_WIPES == -1) {
		if ((string = getenv("EF_FREE_WIPES")) != 0)
			EF_FREE_WIPES = (atoi(string) != 0);
		else
			EF_FREE_WIPES = 0;
	}

	/*
	 * Get the run-time configuration of the virtual memory page size.
	 */
	bytesPerPage = Page_Size();

	/*
	 * Figure out how many Slot structures to allocate at one time.
	 */
	slotCount = slotsPerPage = bytesPerPage / sizeof(Slot);
	allocationListSize = bytesPerPage;

	if (allocationListSize > size)
		size = allocationListSize;

	if ((slack = size % bytesPerPage) != 0)
		size += bytesPerPage - slack;

	/*
	 * Allocate memory, and break it up into two malloc buffers. The
	 * first buffer will be used for Slot structures, the second will
	 * be marked free.
	 */
	slot = allocationList = (Slot *)Page_Create(size);
	memset((char *)allocationList, 0, allocationListSize);

	slot[0].internalSize = slot[0].userSize = allocationListSize;
	slot[0].internalAddress = slot[0].userAddress = allocationList;
	slot[0].mode = INTERNAL_USE;
	if (size > allocationListSize) {
		slot[1].internalAddress = slot[1].userAddress =
		    ((char *)slot[0].internalAddress) + slot[0].internalSize;
		slot[1].internalSize = slot[1].userSize = size - slot[0].internalSize;
		slot[1].mode = FREE;
	}

	/*
	 * Deny access to the free page, so that we will detect any software
	 * that treads upon free memory.
	 */
	Page_DenyAccess(slot[1].internalAddress, slot[1].internalSize);

	/*
	 * Account for the two slot structures that we've used.
	 */
	unUsedSlots = slotCount - 2;
}

/*
 * allocateMoreSlots is called when there are only enough slot structures
 * left to support the allocation of a single malloc buffer.
 */
static void allocateMoreSlots(void)
{
	size_t newSize = allocationListSize + bytesPerPage;
	void *newAllocation;
	void *oldAllocation = allocationList;

	Page_AllowAccess(allocationList, allocationListSize);
	noAllocationListProtection = 1;
	internalUse = 1;

	newAllocation = malloc(newSize);
	memcpy(newAllocation, allocationList, allocationListSize);
	memset(&(((char *)newAllocation)[allocationListSize]), 0, bytesPerPage);

	allocationList = (Slot *)newAllocation;
	allocationListSize = newSize;
	slotCount += slotsPerPage;
	unUsedSlots += slotsPerPage;

	free(oldAllocation);

	/*
	 * Keep access to the allocation list open at this point, because
	 * I am returning to memalign(), which needs that access.
	 */
	noAllocationListProtection = 0;
	internalUse = 0;
}

/*
 * This is the memory allocator. When asked to allocate a buffer, allocate
 * it in such a way that the end of the buffer is followed by an inaccessable
 * memory page. If software overruns that buffer, it will touch the bad page
 * and get an immediate segmentation fault. It's then easy to zero in on the
 * offending code with a debugger.
 *
 * There are a few complications. If the user asks for an odd-sized buffer,
 * we would have to have that buffer start on an odd address if the byte after
 * the end of the buffer was to be on the inaccessable page. Unfortunately,
 * there is lots of software that asks for odd-sized buffers and then
 * requires that the returned address be word-aligned, or the size of the
 * buffer be a multiple of the word size. An example are the string-processing
 * functions on Sun systems, which do word references to the string memory
 * and may refer to memory up to three bytes beyond the end of the string.
 * For this reason, I take the alignment requests to memalign() and valloc()
 * seriously, and
 *
 * Electric Fence wastes lots of memory. I do a best-fit allocator here
 * so that it won't waste even more. It's slow, but thrashing because your
 * working set is too big for a system's RAM is even slower.
 */
extern C_LINKAGE void *memalign(size_t alignment, size_t userSize)
{
	register Slot *slot;
	register size_t count;
	Slot *fullSlot = 0;
	Slot *emptySlots[2];
	size_t internalSize;
	size_t slack;
	char *address;

	if (allocationList == 0)
		initialize();

	lock();
	if (userSize == 0 && !EF_ALLOW_MALLOC_0)
		EF_Abort("Allocating 0 bytes, probably a bug.");

	/*
	 * If EF_PROTECT_BELOW is set, all addresses returned by malloc()
	 * and company will be page-aligned.
	 */
	if (!EF_PROTECT_BELOW && alignment > 1) {
		if ((slack = userSize % alignment) != 0)
			userSize += alignment - slack;
	}

	/*
	 * The internal size of the buffer is rounded up to the next page-size
	 * boudary, and then we add another page's worth of memory for the
	 * dead page.
	 */
	internalSize = userSize + bytesPerPage;
	if ((slack = internalSize % bytesPerPage) != 0)
		internalSize += bytesPerPage - slack;

	/*
	 * These will hold the addresses of two empty Slot structures, that
	 * can be used to hold information for any memory I create, and any
	 * memory that I mark free.
	 */
	emptySlots[0] = 0;
	emptySlots[1] = 0;

	/*
	 * The internal memory used by the allocator is currently
	 * inaccessable, so that errant programs won't scrawl on the
	 * allocator's arena. I'll un-protect it here so that I can make
	 * a new allocation. I'll re-protect it before I return.
	 */
	if (!noAllocationListProtection)
		Page_AllowAccess(allocationList, allocationListSize);

	/*
	 * If I'm running out of empty slots, create some more before
	 * I don't have enough slots left to make an allocation.
	 */
	if (!internalUse && unUsedSlots < 7) {
		allocateMoreSlots();
	}

	/*
	 * Iterate through all of the slot structures. Attempt to find a slot
	 * containing free memory of the exact right size. Accept a slot with
	 * more memory than we want, if the exact right size is not available.
	 * Find two slot structures that are not in use. We will need one if
	 * we split a buffer into free and allocated parts, and the second if
	 * we have to create new memory and mark it as free.
	 *
	 */

	for (slot = allocationList, count = slotCount; count > 0; count--) {
		if (slot->mode == FREE && slot->internalSize >= internalSize) {
			if (!fullSlot || slot->internalSize < fullSlot->internalSize) {
				fullSlot = slot;
				if (slot->internalSize == internalSize && emptySlots[0])
					break; /* All done, */
			}
		} else if (slot->mode == NOT_IN_USE) {
			if (!emptySlots[0])
				emptySlots[0] = slot;
			else if (!emptySlots[1])
				emptySlots[1] = slot;
			else if (fullSlot && fullSlot->internalSize == internalSize)
				break; /* All done. */
		}
		slot++;
	}
	if (!emptySlots[0])
		internalError();

	if (!fullSlot) {
		/*
		 * I get here if I haven't been able to find a free buffer
		 * with all of the memory I need. I'll have to create more
		 * memory. I'll mark it all as free, and then split it into
		 * free and allocated portions later.
		 */
		size_t chunkSize = MEMORY_CREATION_SIZE;

		if (!emptySlots[1])
			internalError();

		if (chunkSize < internalSize)
			chunkSize = internalSize;

		if ((slack = chunkSize % bytesPerPage) != 0)
			chunkSize += bytesPerPage - slack;

		/* Use up one of the empty slots to make the full slot. */
		fullSlot = emptySlots[0];
		emptySlots[0] = emptySlots[1];
		fullSlot->internalAddress = Page_Create(chunkSize);
		fullSlot->internalSize = chunkSize;
		fullSlot->mode = FREE;
		unUsedSlots--;
	}

	/*
	 * If I'm allocating memory for the allocator's own data structures,
	 * mark it INTERNAL_USE so that no errant software will be able to
	 * free it.
	 */
	if (internalUse)
		fullSlot->mode = INTERNAL_USE;
	else
		fullSlot->mode = ALLOCATED;

	/*
	 * If the buffer I've found is larger than I need, split it into
	 * an allocated buffer with the exact amount of memory I need, and
	 * a free buffer containing the surplus memory.
	 */
	if (fullSlot->internalSize > internalSize) {
		emptySlots[0]->internalSize = fullSlot->internalSize - internalSize;
		emptySlots[0]->internalAddress =
		    ((char *)fullSlot->internalAddress) + internalSize;
		emptySlots[0]->mode = FREE;
		fullSlot->internalSize = internalSize;
		unUsedSlots--;
	}

	if (!EF_PROTECT_BELOW) {
		/*
		 * Arrange the buffer so that it is followed by an inaccessable
		 * memory page. A buffer overrun that touches that page will
		 * cause a segmentation fault.
		 */
		address = (char *)fullSlot->internalAddress;

		/* Set up the "live" page. */
		if (internalSize - bytesPerPage > 0)
			Page_AllowAccess(fullSlot->internalAddress,
			                 internalSize - bytesPerPage);

		address += internalSize - bytesPerPage;

		/* Set up the "dead" page. */
		Page_DenyAccess(address, bytesPerPage);

		/* Figure out what address to give the user. */
		address -= userSize;
	} else { /* EF_PROTECT_BELOW != 0 */
		/*
		 * Arrange the buffer so that it is preceded by an inaccessable
		 * memory page. A buffer underrun that touches that page will
		 * cause a segmentation fault.
		 */
		address = (char *)fullSlot->internalAddress;

		/* Set up the "dead" page. */
		Page_DenyAccess(address, bytesPerPage);

		address += bytesPerPage;

		/* Set up the "live" page. */
		if (internalSize - bytesPerPage > 0)
			Page_AllowAccess(address, internalSize - bytesPerPage);
	}

	fullSlot->userAddress = address;
	fullSlot->userSize = userSize;

	/*
	 * Make the pool's internal memory inaccessable, so that the program
	 * being debugged can't stomp on it.
	 */
	if (!internalUse)
		Page_DenyAccess(allocationList, allocationListSize);

	unlock();
	return address;
}

/*
 * Find the slot structure for a user address.
 */
static Slot *slotForUserAddress(void *address)
{
	register Slot *slot = allocationList;
	register size_t count = slotCount;

	for (; count > 0; count--) {
		if (slot->userAddress == address)
			return slot;
		slot++;
	}

	return 0;
}

/*
 * Find the slot structure for an internal address.
 */
static Slot *slotForInternalAddress(void *address)
{
	register Slot *slot = allocationList;
	register size_t count = slotCount;

	for (; count > 0; count--) {
		if (slot->internalAddress == address)
			return slot;
		slot++;
	}
	return 0;
}

/*
 * Given the internal address of a buffer, find the buffer immediately
 * before that buffer in the address space. This is used by free() to
 * coalesce two free buffers into one.
 */
static Slot *slotForInternalAddressPreviousTo(void *address)
{
	register Slot *slot = allocationList;
	register size_t count = slotCount;

	for (; count > 0; count--) {
		if (((char *)slot->internalAddress) + slot->internalSize == address)
			return slot;
		slot++;
	}
	return 0;
}

extern C_LINKAGE void free(void *address)
{
	Slot *slot;
	Slot *previousSlot = 0;
	Slot *nextSlot = 0;

	lock();

	if (address == 0) {
		unlock();
		return;
	}

	if (allocationList == 0)
		EF_Abort("free() called before first malloc().");

	if (!noAllocationListProtection)
		Page_AllowAccess(allocationList, allocationListSize);

	slot = slotForUserAddress(address);

	if (!slot)
		EF_Abort("free(%a): address not from malloc().", address);

	if (slot->mode != ALLOCATED) {
		if (internalUse && slot->mode == INTERNAL_USE)
			/* Do nothing. */;
		else {
			EF_Abort("free(%a): freeing free memory.", address);
		}
	}

	if (EF_PROTECT_FREE)
		slot->mode = PROTECTED;
	else
		slot->mode = FREE;

	if (EF_FREE_WIPES)
		memset(slot->userAddress, 0xbd, slot->userSize);

	previousSlot = slotForInternalAddressPreviousTo(slot->internalAddress);
	nextSlot = slotForInternalAddress(((char *)slot->internalAddress) +
	                                  slot->internalSize);

	if (previousSlot &&
	    (previousSlot->mode == FREE || previousSlot->mode == PROTECTED)) {
		/* Coalesce previous slot with this one. */
		previousSlot->internalSize += slot->internalSize;
		if (EF_PROTECT_FREE)
			previousSlot->mode = PROTECTED;

		slot->internalAddress = slot->userAddress = 0;
		slot->internalSize = slot->userSize = 0;
		slot->mode = NOT_IN_USE;
		slot = previousSlot;
		unUsedSlots++;
	}
	if (nextSlot && (nextSlot->mode == FREE || nextSlot->mode == PROTECTED)) {
		/* Coalesce next slot with this one. */
		slot->internalSize += nextSlot->internalSize;
		nextSlot->internalAddress = nextSlot->userAddress = 0;
		nextSlot->internalSize = nextSlot->userSize = 0;
		nextSlot->mode = NOT_IN_USE;
		unUsedSlots++;
	}

	slot->userAddress = slot->internalAddress;
	slot->userSize = slot->internalSize;

	/*
	 * Free memory is _always_ set to deny access. When EF_PROTECT_FREE
	 * is true, free memory is never reallocated, so it remains access
	 * denied for the life of the process. When EF_PROTECT_FREE is false,
	 * the memory may be re-allocated, at which time access to it will be
	 * allowed again.
	 */
	Page_DenyAccess(slot->internalAddress, slot->internalSize);

	if (!noAllocationListProtection)
		Page_DenyAccess(allocationList, allocationListSize);

	unlock();
}

extern C_LINKAGE void *realloc(void *oldBuffer, size_t newSize)
{
	void *newBuffer = malloc(newSize);

	lock();

	if (oldBuffer) {
		size_t size;
		Slot *slot;

		Page_AllowAccess(allocationList, allocationListSize);
		noAllocationListProtection = 1;

		slot = slotForUserAddress(oldBuffer);

		if (slot == 0)
			EF_Abort("realloc(%a, %d): address not from malloc().", oldBuffer,
			         newSize);

		if (newSize < (size = slot->userSize))
			size = newSize;

		if (size > 0)
			memcpy(newBuffer, oldBuffer, size);

		free(oldBuffer);
		noAllocationListProtection = 0;
		Page_DenyAccess(allocationList, allocationListSize);

		if (size < newSize)
			memset(&(((char *)newBuffer)[size]), 0, newSize - size);

		/* Internal memory was re-protected in free() */
	}
	unlock();

	return newBuffer;
}

extern C_LINKAGE void *malloc(size_t size)
{
	if (!allocationList)
		initialize(); /* This sets EF_ALIGNMENT */
	return memalign(EF_ALIGNMENT, size);
}

extern C_LINKAGE char *strdup(const char *s1)
{
	if (!s1)
		return 0;
	char *s2 = malloc(strlen(s1) + 1);

	if (!s2) {
		errno = ENOMEM;
		return 0;
	}

	return strcpy(s2, s1);
}

extern C_LINKAGE char *strndup(const char *s1, size_t n)
{
	if (!s1)
		return 0;
	int complete_size = n; /* includes terminating null */
	for (int i = 0; i < n - 1; i++) {
		if (!s1[i]) {
			complete_size = i + 2;
			break;
		}
	}
	char *s2 = malloc(complete_size);

	if (!s2) {
		errno = ENOMEM;
		return 0;
	}

	strncpy(s2, s1, complete_size - 1);
	s2[complete_size - 1] = '\0';

	return s2;
}

extern C_LINKAGE void *calloc(size_t nelem, size_t elsize)
{
	size_t size = nelem * elsize;
	void *allocation;

	allocation = malloc(size);
	memset(allocation, 0, size);

	return allocation;
}

/*
 * This will catch more bugs if you remove the page alignment, but it
 * will break some software.
 */
extern C_LINKAGE void *valloc(size_t size)
{
	return memalign(bytesPerPage, size);
}

extern C_LINKAGE int posix_memalign(void **memptr, size_t alignment,
                                    size_t size)
{
	*memptr = memalign(alignment, size);
	if (!*memptr) {
		errno = ENOMEM;
		return -1;
	}
	return 0;
}

extern C_LINKAGE void *aligned_alloc(size_t alignment, size_t size)
{
	return memalign(alignment, size);
}
