| #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 *)addr)[-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; |
| } |