blob: 83cc39bef15d45e9af3b58bff55f6e75bc5566da [file] [log] [blame]
#include "plat.h"
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
void *malloc_aligned(size_t size)
{
void *mem = malloc(size + 8 + sizeof(void *) * 2);
void **aligned_ptr = (void **)((uintptr_t)(mem + 8 + sizeof(void *)) & ~7);
aligned_ptr[-1] = mem;
aligned_ptr[-2] = (void *)size;
return aligned_ptr;
}
void *realloc_aligned(void *addr, size_t size)
{
void *mem = malloc(size + 8 + sizeof(void *) * 2);
void **aligned_ptr = (void **)((uintptr_t)(mem + 8 + sizeof(void *)) & ~7);
aligned_ptr[-1] = mem;
memcpy(aligned_ptr, addr, (uintptr_t)aligned_ptr[-2]);
return aligned_ptr;
}
void free_aligned(void *addr)
{
void **ptr = (void **)addr;
free(ptr[-1]);
}
void *link(dasm_State **Dst)
{
size_t size;
void *buf;
dasm_link(Dst, &size);
buf = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1,
0);
dasm_encode(Dst, buf);
mprotect(buf, size, PROT_READ | PROT_EXEC);
return buf;
}