74 lines
2.5 KiB
C
74 lines
2.5 KiB
C
/**
|
|
* \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 <sys/cdefs.h>
|
|
#include <errors/errno.h>
|
|
#include <aos/types.h>
|
|
#include <aos/capabilities.h>
|
|
#include <aos/slab.h>
|
|
#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 */
|