Files
photon/photon/libc/sys/magenta/heap.c
2021-02-19 13:54:28 +00:00

70 lines
1.7 KiB
C

#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <magenta/vmo.h>
#include <magenta/limits.h>
#include <magenta/misc.h>
#include <magenta/vmar.h>
#define ROUND_UP(x, b) x += (b) - ((x) % (b))
static uintptr_t heap_start = 0;
static uintptr_t heap_end = 0;
static uintptr_t heap_alloc_point = 0;
static size_t heap_sz = 0;
static mx_handle_t heap_vmo = MX_NULL_HANDLE;
void __crt_heap_init(size_t heap_sz)
{
mx_status_t status = mx_vmo_create(
heap_sz,
MX_VM_CAN_MAP_READ | MX_VM_CAN_MAP_WRITE | MX_VM_CAN_MAP_SPECIFIC,
&heap_vmo);
mx_vaddr_t heap = 0;
mx_vmar_map(mx_get_startup_handle(MX_B_VMAR_ROOT),
MX_VM_PERM_READ | MX_VM_PERM_WRITE,
0, heap_vmo, 0, heap_sz,
&heap);
heap_start = heap;
heap_end = heap + heap_sz;
heap_alloc_point = heap_start;
memset((void *)heap, 0x0, heap_sz);
}
void *__crt_heap_extend(size_t sz)
{
if (sz % MX_PAGE_SIZE) {
sz &= (MX_PAGE_SIZE - 1);
sz += MX_PAGE_SIZE;
}
if (!heap_start) {
__crt_heap_init(sz);
return (void *)heap_start;
}
if (!sz) {
return (void *)heap_end;
}
mx_vmo_set_size(heap_vmo, heap_sz + sz);
mx_vaddr_t vmar_base, alloc_base;
mx_vmar_bounds(mx_get_startup_handle(MX_B_VMAR_ROOT), &vmar_base, NULL);
mx_vaddr_t offset = heap_end - vmar_base;
mx_vmar_map(mx_get_startup_handle(MX_B_VMAR_ROOT),
MX_VM_PERM_READ | MX_VM_PERM_WRITE | MX_VM_SPECIFIC,
offset, heap_vmo, heap_sz, sz, &alloc_base);
heap_sz += sz;
void *out = (void *)heap_end;
memset(out, 0x0, sz);
heap_end += sz;
return out;
}