00001
00002
00011
00012
00013
00014
00015
00029
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
00038 #include <asm/page.h>
00039 #include <linux/mm.h>
00040
00041
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
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
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 }