Files

92 lines
2.2 KiB
C

#include <string.h>
#include <debug.h>
#include <common.h>
#undef __RSV_MEM_DEBUG
struct rsv_memctrl_t {
uint32 start;
uint32 end;
uint32 pos;
};
static struct rsv_memctrl_t g_rsv_memctrl = {0};
void rsv_mem_init(uint32 start, uint32 len)
{
if (g_rsv_memctrl.end == 0) {
g_rsv_memctrl.start = start;
g_rsv_memctrl.end = start + len;
g_rsv_memctrl.pos = 0;
}
#ifdef CONFIG_DEBUG_INFO
puts("Reserved mem: 0x");puthex(start);puts(" - 0x");puthex(start + len);puts("\n");
#endif
}
void rsv_mem_reinit(uint32 start, uint32 len)
{
g_rsv_memctrl.end = 0;
rsv_mem_init(start, len);
}
void *__rsv_mem_alloc(uint32 bytes, const char *file, int line)
{
uint32 new_ptr;
void *ptr = NULL;
if (g_rsv_memctrl.end == 0) {
pr_error("malloc module uninitializtion.\n");
return NULL;
}
new_ptr = g_rsv_memctrl.start + g_rsv_memctrl.pos + around(bytes, 4); /* 4 bytes align */
if (new_ptr > g_rsv_memctrl.end) {
return NULL;
}
ptr = (void *)(uintptr_t)(g_rsv_memctrl.start + g_rsv_memctrl.pos);
g_rsv_memctrl.pos += around(bytes, 4); /* 4 bytes align */
#ifdef __RSV_MEM_DEBUG
puts(file);puts("(");putdec(line);puts("): rsv mem alloc 0x");puthex((ulong)ptr);puts("(");putdec(bytes);puts(")\n");
#endif
return ptr;
}
void *__rsv_mem_align(uint32 alignment, uint32 bytes, const char *file, int line)
{
uint32 new_addr;
void *ptr = NULL;
if (g_rsv_memctrl.end == 0) {
puts("rsv mem NOT initialized.\n");
return NULL;
}
if (alignment & (alignment - 1)) {
puts("align must be powed of 2\n");
return NULL;
}
new_addr = around(g_rsv_memctrl.start + g_rsv_memctrl.pos, alignment);
if (new_addr + around(bytes, 4) > g_rsv_memctrl.end) { /* 4 bytes align */
return NULL;
}
g_rsv_memctrl.pos = new_addr - g_rsv_memctrl.start + around(bytes, 4); /* 4 bytes align */
ptr = (void *)(uintptr_t)new_addr;
#ifdef __RSV_MEM_DEBUG
puts(file);puts("(");putdec(line);puts("): rsv mem align 0x");puthex((ulong)ptr);puts("(");putdec(bytes);puts(")\n");
#endif
return ptr;
}
void dump_rsv_mem_info(void)
{
puts("Reserved Mem Info:\n");
puts("start: 0x");puthex(g_rsv_memctrl.start);puts("\n");
puts("end: 0x");puthex(g_rsv_memctrl.end);puts("\n");
puts("pos: 0x");puthex(g_rsv_memctrl.pos);puts("\n");
}