/** * \file * \brief Memory manager header */ /* * Copyright (c) 2008, 2011, ETH Zurich. * Copyright (c), 2022, The University of British Columbia * All rights reserved. * * This file is distributed under the terms in the attached LICENSE file. * If you do not find this file, copies can be found by writing to: * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. */ #ifndef AOS_MM_H #define AOS_MM_H #include #include #include #include #include #include "slot_alloc.h" __BEGIN_DECLS #define MM_BLOCK_BITS 12 #define MM_BLOCK_SIZE BIT(MM_BLOCK_BITS) struct mm_root_node; /** * \brief Memory manager instance data * * This should be opaque from the perspective of the client, but to allow * them to allocate its memory, we declare it in the public header. * * Invariants: * - either all or none of head, tail and current are NULL * - if head != NULL, then after some number of ->next, * we reach tail, and tail->next == NULL * - if head != NULL, then after some number of ->next, * we reach current */ struct mm { struct slab_allocator slabs; ///< Slab allocator used for allocating nodes slot_alloc_t slot_alloc; ///< Slot allocator for allocating cspace slot_refill_t slot_refill; ///< Slot allocator refill function void *slot_alloc_inst; ///< Opaque instance pointer for slot allocator enum objtype objtype; ///< Type of capabilities stored struct mm_root_node *head; ///< First RAM root node struct mm_root_node *tail; ///< Last RAM root node struct mm_root_node *current; ///< RAM root node to allocate from next size_t current_offset; ///< Offset in `current` to allocate from next size_t unallocated_leafs; ///< Number of leafs which don't have a block allocated yet }; errval_t mm_init(struct mm *mm, enum objtype objtype, slab_refill_func_t slab_refill_func, slot_alloc_t slot_alloc_func, slot_refill_t slot_refill_func, void *slot_alloc_inst); errval_t mm_add(struct mm *mm, struct capref cap); errval_t mm_alloc_aligned(struct mm *mm, size_t size, size_t alignment, struct capref *retcap); errval_t mm_alloc(struct mm *mm, size_t size, struct capref *retcap); errval_t mm_free(struct mm *mm, struct capref cap); void mm_destroy(struct mm *mm); __END_DECLS #endif /* AOS_MM_H */