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

page.c

Go to the documentation of this file.
00001 /* $Id: page.c,v 1.13 2004/04/27 08:15:54 aw11 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 
00029 /* L4 */
00030 #include <l4/sys/types.h>
00031 #include <l4/env/errno.h>
00032 #include <l4/l4rm/l4rm.h>
00033 #include <l4/dm_mem/dm_mem.h>
00034 
00035 #include <l4/dde_linux/dde.h>
00036 
00037 /* Linux */
00038 #include <asm/page.h>
00039 #include <linux/mm.h>
00040 
00041 /* local */
00042 #include "__config.h"
00043 #include "internal.h"
00044 
00045 #include "fastcall.h"
00046 
00048 struct page l4dde_dummy_page;
00049 
00062 unsigned long FASTCALL(__get_free_pages(unsigned int gfp_mask, unsigned int order))
00063 {
00064   int error, pages;
00065   l4_addr_t page;
00066   l4_size_t size;
00067 
00068   l4_size_t tmp;
00069   l4dm_mem_addr_t dm_paddr;
00070 
00071   if (gfp_mask & GFP_DMA)
00072     LOGd(DEBUG_MSG, "Warning: No ISA DMA memory zone implemented.");
00073 
00074   size = L4_PAGESIZE << order;
00075   pages = 1 << order;
00076 
00077   LOGd(DEBUG_PALLOC, "requesting %d page(s) (pages)\n", pages);
00078 
00079   /* open and attach new dataspace */
00080   page = (l4_addr_t) \
00081     l4dm_mem_allocate_named(size,
00082                             L4DM_CONTIGUOUS | L4DM_PINNED |\
00083                             L4RM_MAP | L4RM_LOG2_ALIGNED,
00084                             "dde pages");
00085   if (!page)
00086     {
00087       LOGdL(DEBUG_ERRORS, "Error: allocating pages");
00088       return 0;
00089     }
00090 
00091   error = l4dm_mem_phys_addr((void *)page, 1, &dm_paddr, 1, &tmp);
00092   if (error != 1)
00093     {
00094       if (error>1 || !error)
00095         Panic("Ouch, what's that?");
00096       LOGdL(DEBUG_ERRORS, "Error: getting physical address (%d)", error);
00097       return 0;
00098     }
00099 
00100   /* address info */
00101   address_add_region(page, dm_paddr.addr, size);
00102 
00103   LOGd(DEBUG_PALLOC, "allocated %d pages @ 0x%08x (phys. 0x%08x)",
00104        pages, page, dm_paddr.addr);
00105 
00106   return (unsigned long) page;
00107 }
00108 
00116 unsigned long FASTCALL(get_zeroed_page(unsigned int gfp_mask))
00117 {
00118   unsigned long page = __get_free_pages(gfp_mask, 0);
00119 
00120   if (!page)
00121     return 0;
00122 
00123   memset((void *) page, 0, L4_PAGESIZE);
00124 
00125   return page;
00126 }
00127 
00138 void FASTCALL(free_pages(unsigned long addr, unsigned int order))
00139 {
00140   LOG_Error("%s for 2^%d pages not implemented", __FUNCTION__, order);
00141 }

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