aos/lib/devif/region.c
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

96 lines
2.7 KiB
C

/*
* Copyright (c) 2016 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, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
*/
#include <aos/aos.h>
#include <devif/queue_interface.h>
#include "region.h"
#include "dqi_debug.h"
/*
* A region keeps track of the buffers that are currently allocated
* i.e. If two buffer is marked as allocated and it is reused before it
* is freed, the region will return an allocation error
*
* The datastructure to keep track of the allocation has a bucket for each
* 4K page. If a buffer starts in a certain page, the buffer will be added to
* the bucket of this page. Within a bucket there is a linked list. To allocated
* the buffer structures a slab allocator is used.
*/
/*
static void print_list(struct buffer* b, uint32_t page_id, bool insert) {
printf("########################### \n");
struct buffer* buf = b;
for (int i =0; i < 9; i++) {
if (buf) {
if (insert) {
printf("ins page_id %d, bid %d, baddr %p, baddr->next %p \n", page_id,
buf->id, buf, buf->next);
} else {
printf("del page_id %d, bid %d, baddr %p, baddr->next %p \n", page_id,
buf->id, buf, buf->next);
}
buf = buf->next;
} else {
break;
}
}
printf("############################## \n");
}
*/
/**
* @brief initialized a region from which only fixed size buffers are used
*
* @param region Return pointer to the region
* @param region_id The ID of the region,
* @param cap Capability of the memory region
*
* @returns error on failure or SYS_ERR_OK on success
*/
errval_t region_init(struct region** region,
regionid_t region_id,
lpaddr_t base_addr,
size_t len,
struct capref* cap)
{
struct region* tmp = malloc(sizeof(struct region));
//struct region* tmp = calloc(1, sizeof(struct region));
if (tmp == NULL) {
return LIB_ERR_MALLOC_FAIL;
}
tmp->id = region_id;
tmp->cap = cap;
tmp->base_addr = base_addr;
tmp->len = len;
*region = tmp;
DQI_DEBUG_REGION("Initialize Region size=%ld addr=%16lx\n",
tmp->len, tmp->base_addr);
return SYS_ERR_OK;
}
/**
* @brief free up a region
*
* @param region The region to free up
*
* @returns error on failure or SYS_ERR_OK on success
*/
errval_t region_destroy(struct region* region)
{
free(region);
return SYS_ERR_OK;
}