Main Page | Modules | Class List | File List | Class Members | File Members | Related Pages

address.c

Go to the documentation of this file.
00001 /* $Id: address.c,v 1.7 2004/04/01 09:14:20 ch12 Exp $ */
00002 /*****************************************************************************/
00011 /* (c) 2003 Technische Universitaet Dresden
00012  * This file is part of DROPS, which is distributed under the terms of the
00013  * GNU General Public License 2. Please see the COPYING file for details.
00014  */
00015 
00043 /* L4 */
00044 #include <l4/env/errno.h>
00045 
00046 #include <l4/dde_linux/dde.h>
00047 
00048 /* local */
00049 #include "__config.h"
00050 #include "internal.h"
00051 
00055 static struct dde_region *conv = NULL;
00056 
00064 void address_add_region(l4_addr_t va, l4_addr_t pa, l4_size_t size)
00065 {
00066   dde_add_region(&conv, va, pa, size);
00067 }
00068 
00074 void address_remove_region(l4_addr_t va, l4_size_t size)
00075 {
00076   dde_remove_region(&conv, va, 0, size);
00077 }
00078 
00086 void *__va(volatile unsigned long paddr)
00087 {
00088   struct dde_region *p;
00089   void *pp;
00090 
00091   /* look in conversion table/list */
00092   p = conv;
00093   while (p)
00094     {
00095       if ((p->pa <= paddr) && (p->pa + p->size > paddr))
00096         {
00097           pp = (void *) (p->va + (paddr - p->pa));
00098 #if DEBUG_ADDRESS
00099           LOG("__va(0x%lx) => %p\n", paddr, pp);
00100 #endif
00101           return pp;
00102         }
00103       p = p->next;
00104     }
00105 
00106   Panic("no virtual address found for 0x%lx", paddr);
00107   return NULL;
00108 }
00109 
00117 unsigned long __pa(volatile void *vaddr)
00118 {
00119   struct dde_region *p;
00120   unsigned long pp;
00121   unsigned long addr = (unsigned long) vaddr;
00122 
00123   /* look in conversion table/list */
00124   p = conv;
00125   while (p)
00126     {
00127       if ((p->va <= addr) && (p->va + p->size > addr))
00128         {
00129           pp = p->pa + (addr - p->va);
00130 #if DEBUG_ADDRESS
00131           LOG("__pa(0x%lx) => 0x%lx\n", addr, pp);
00132 #endif
00133           return pp;
00134         }
00135       p = p->next;
00136     }
00137 
00138   Panic("no physical address found for %p", vaddr);
00139   return 0;
00140 }

Linux DDE, written by Christian Helmuth  © 2003 Technische Universitaet Dresden