#pragma once #include #include struct memory_segment { uint64_t addr; uint64_t len; uint32_t type; uint32_t reserved; } __attribute__((packed)); struct memory_map { uint32_t size; uint32_t version; struct memory_segment entries[]; } __attribute__((packed)); /** * Initalize system memory allocator */ extern void memory_init(struct memory_map *map); /** * Disabled cpu interupts to not interfere with * current memory allocations. */ extern void memory_lock(void); /** * Reenabled cpu interupts */ extern void memory_unlock(void); /** * @returns how much memory the system has */ extern uint64_t memory_total(void); /** * @returns how much memory is free */ extern uint64_t memory_free(void); /** * @returns how much memory is used */ extern uint64_t memory_used(void); /** * Allocates a single page in memory. * @returns the page if allocated or NULL on failure */ extern void *alloc_page(void); /** * Allocats count pages in memory * @param count - the number of continious pages to allocate * @returns the pages if allocated or NULL on failure */ extern void *alloc_pages(int count); /** * Frees a single page in memory * @param page - the pointer to the page */ extern void free_page(void *page); /** * Allocates at least len bytes of memory starting at * physical address addr. Returned address can be * any virtural address. * @param addr - the physical address to map * @param len - the minimum length to map * @param writable - if this memory should be writable * @param user - if this memory should be user writable */ extern void *mmap(void *addr, size_t len); /** * Unmaps mapped address from the mmap function * @param addr - the address returned from mmap * @param len - the length allocated */ extern void unmap(void *addr); /** * Allocates size_t bytes in memory * @param size - the amount of bytes to allocate * @retruns the address allocated or NULL on failure */ extern void *malloc(size_t size); /** * Reallocates a given allocated ptr to a new size of bytes in memory. * If ptr is NULL it will allocate new memory. * @param ptr - the pointer to reallocate * @param size - the amount of bytes to set the pointer to * @returns the address allocated or NULL on failure */ extern void *realloc(void *ptr, size_t size); /** * Frees a allocated pointer in memory * @param ptr - the pointer to free */ extern void free(void *ptr);