blob: bd9af102c33c4c6f3ec310cb1269c3b211b538d7 [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;
}