/** Memory allocators. * * @file * @author Steffen Vogel * @copyright 2017, Institute for Automation of Complex Power Systems, EONERC *********************************************************************************/ #include #include #pragma once #define HUGEPAGESIZE (1 << 21) typedef void *(*memzone_allocator_t)(size_t len, size_t alignment); typedef int (*memzone_deallocator_t)(void *ptr, size_t len); enum memtype_flags { MEMORY_MMAP = (1 << 0), MEMORY_DMA = (1 << 1), MEMORY_HUGEPAGE = (1 << 2), MEMORY_HEAP = (1 << 3) }; struct memtype { const char *name; int flags; size_t alignment; memzone_allocator_t alloc; memzone_deallocator_t free; }; /** @todo Unused for now */ struct memzone { struct memtype * const type; void *addr; uintptr_t physaddr; size_t len; }; /** Initilialize memory subsystem */ int memory_init(int hugepages); /** Allocate \p len bytes memory of type \p m. * * @retval NULL If allocation failed. * @retval <>0 If allocation was successful. */ void * memory_alloc(const struct memtype *m, size_t len); void * memory_alloc_aligned(const struct memtype *m, size_t len, size_t alignment); int memory_free(const struct memtype *m, void *ptr, size_t len); extern const struct memtype memtype_heap; extern const struct memtype memtype_hugepage;