aos/include/mm/slot_alloc.h
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

71 lines
2.2 KiB
C

/**
* \file
* \brief Slot management for memory allocator
*/
/*
* Copyright (c) 2007, 2008, ETH Zurich.
* 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 MM_SLOT_ALLOC_H
#define MM_SLOT_ALLOC_H
#include <sys/cdefs.h>
#include <errors/errno.h>
#include <aos/caddr.h>
__BEGIN_DECLS
/// Generic interface to slot allocator function
typedef errval_t (*slot_alloc_t)(void *inst, uint64_t nslots, struct capref *ret);
typedef errval_t (*slot_refill_t)(void *inst);
/// Implementations of above interface
errval_t slot_alloc_prealloc(void *inst, uint64_t nslots, struct capref *ret);
errval_t slot_alloc_basecn(void *inst, uint64_t nslots, struct capref *ret);
errval_t slot_alloc_dynamic(void *inst, uint64_t nslots, struct capref *ret);
errval_t slot_refill_dynamic(void *inst);
struct mm; // forward declaration
/// Instance data for pre-allocating slot allocator for 2 level cspace
struct slot_prealloc {
/// Metadata for next place from which to allocate slots
struct {
struct capref cap; ///< Next cap to allocate
uint64_t free; ///< Number of free slots including cap
} meta[2] __attribute__ ((aligned(4)));
/// Which entry in meta array we are currently allocating from
uint8_t current;
/// RAM allocator to allocate space for new cnodes
struct mm *mm;
};
/// Initialiser for the pre-allocating implementation
errval_t slot_prealloc_init(struct slot_prealloc *slot_alloc,
struct capref initial_cnode,
uint64_t initial_space, struct mm *ram_mm);
/// Refill function for the pre-allocating implementation
errval_t slot_prealloc_refill(void *inst);
/// Instance data for simple base-cnode allocator
struct slot_alloc_basecn {
struct capref cap; ///< Next cap to allocate
uint64_t free; ///< Number of free slots including cap
};
/// Initialiser for the single-cnode implementation
errval_t slot_alloc_basecn_init(struct slot_alloc_basecn *slot_alloc);
__END_DECLS
#endif // MM_SLOT_ALLOC_H