1/* 2 * Copyright 2017, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the BSD 2-Clause license. Note that NO WARRANTY is provided. 8 * See "LICENSE_BSD2.txt" for details. 9 * 10 * @TAG(DATA61_BSD) 11 */ 12 13#include <allocman/mspace/vspace_pool.h> 14#include <allocman/allocman.h> 15#include <allocman/util.h> 16#include <stdlib.h> 17#include <sel4/sel4.h> 18 19/* we will arbitrarily use 4k pages. Be nice if this was configureable for 20 * modern systems where 4k is small and wasteful 21 */ 22#define PAGE_SIZE_BITS 12 23 24static k_r_malloc_header_t *_morecore(size_t cookie, mspace_k_r_malloc_t *k_r_malloc, size_t new_units) 25{ 26 size_t new_size; 27 k_r_malloc_header_t *new_header; 28 mspace_vspace_pool_t *vspace_pool = (mspace_vspace_pool_t*)cookie; 29 new_size = new_units * sizeof(k_r_malloc_header_t); 30 while (vspace_pool->pool_ptr + new_size > vspace_pool->pool_top) { 31 int error; 32 error = vspace_new_pages_at_vaddr(&vspace_pool->vspace, (void*)vspace_pool->pool_top, 1, PAGE_SIZE_BITS, vspace_pool->reservation); 33 if (error != seL4_NoError) { 34 return NULL; 35 } 36 vspace_pool->pool_top += BIT(PAGE_SIZE_BITS); 37 } 38 new_header = (k_r_malloc_header_t*)vspace_pool->pool_ptr; 39 vspace_pool->pool_ptr += new_size; 40 return new_header; 41} 42 43void mspace_vspace_pool_create(mspace_vspace_pool_t *vspace_pool, struct mspace_vspace_pool_config config) 44{ 45 vspace_pool->pool_ptr = config.vstart; 46 vspace_pool->pool_top = config.vstart; 47 vspace_pool->reservation = config.reservation; 48 vspace_pool->vspace = config.vspace; 49 vspace_pool->morecore_alloc = NULL; 50 51 mspace_k_r_malloc_init(&vspace_pool->k_r_malloc, (size_t)vspace_pool, _morecore); 52} 53 54void *_mspace_vspace_pool_alloc(struct allocman *alloc, void *_vspace_pool, size_t bytes, int *error) 55{ 56 void *ret; 57 mspace_vspace_pool_t *vspace_pool = (mspace_vspace_pool_t*)_vspace_pool; 58 vspace_pool->morecore_alloc = alloc; 59 ret = mspace_k_r_malloc_alloc(&vspace_pool->k_r_malloc, bytes); 60 vspace_pool->morecore_alloc = NULL; 61 SET_ERROR(error, (ret == NULL) ? 1 : 0); 62 return ret; 63} 64 65void _mspace_vspace_pool_free(struct allocman *alloc, void *_vspace_pool, void *ptr, size_t bytes) 66{ 67 mspace_vspace_pool_t *vspace_pool = (mspace_vspace_pool_t*)_vspace_pool; 68 vspace_pool->morecore_alloc = alloc; 69 mspace_k_r_malloc_free(&vspace_pool->k_r_malloc, ptr); 70 vspace_pool->morecore_alloc = NULL; 71} 72