OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [mm0/] [lib/] [addr.c] - Rev 7

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * This module allocates an unused address range from
 * a given memory region defined as the pool range.
 *
 * Copyright (C) 2007 Bahadir Balban
 */
#include <lib/bit.h>
#include <l4/macros.h>
#include <l4/types.h>
#include INC_GLUE(memory.h)
#include <lib/addr.h>
#include <stdio.h>
 
/*
 * Initializes an address pool, but uses an already
 * allocated id pool for it.
 */
int address_pool_init_with_idpool(struct address_pool *pool,
				  struct id_pool *idpool,
				  unsigned long start, unsigned long end)
{
	pool->idpool = idpool;
	pool->start = start;
	pool->end = end;
 
	return 0;
}
 
int address_pool_init(struct address_pool *pool, unsigned long start, unsigned long end)
{
	if ((pool->idpool = id_pool_new_init(__pfn(end - start))) < 0)
		return (int)pool->idpool;
	pool->start = start;
	pool->end = end;
	return 0;
}
 
void *address_new(struct address_pool *pool, int npages)
{
	unsigned int pfn;
 
	if ((int)(pfn = ids_new_contiguous(pool->idpool, npages)) < 0)
		return 0;
 
	return (void *)__pfn_to_addr(pfn) + pool->start;
}
 
int address_del(struct address_pool *pool, void *addr, int npages)
{
	unsigned long pfn = __pfn(page_align(addr) - pool->start);
 
	if (ids_del_contiguous(pool->idpool, pfn, npages) < 0) {
		printf("%s: Invalid address range returned to "
		       "virtual address pool.\n", __FUNCTION__);
		return -1;
	}
	return 0;
}
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.