00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <linux/slab.h>
00016 #include <linux/types.h>
00017 #include <linux/bootmem.h>
00018 #include <linux/module.h>
00019 #include <linux/pci.h>
00020 #include <linux/mm.h>
00021 #include <asm/io.h>
00022
00023
00024 #include <l4/dde/ddekit/debug.h>
00025 #include <l4/dde/ddekit/memory.h>
00026
00027 #include <l4/dde/linux26/dde26.h>
00028
00029
00030 int forbid_dac;
00031
00032
00033
00034
00035 struct page* mem_map = NULL;
00036 static bootmem_data_t contig_bootmem_data;
00037 struct pglist_data contig_page_data = { .bdata = &contig_bootmem_data };
00038
00039 int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
00040 unsigned long pfn, unsigned long size, pgprot_t prot)
00041 {
00042 return 0;
00043 }
00044 EXPORT_SYMBOL(remap_pfn_range);
00045
00046
00047
00048
00049
00050 #define DEBUG_MALLOC 0
00051
00052
00053
00054
00055
00056
00057
00058
00059 static struct cache_sizes malloc_sizes[] = {
00060 #define CACHE(x) { .cs_size = (x) },
00061 #include <linux/kmalloc_sizes.h>
00062 CACHE(ULONG_MAX)
00063 #undef CACHE
00064 };
00065
00066
00067
00068
00069
00070 static const char *malloc_names[] = {
00071 #define CACHE(x) "size-" #x,
00072 #include <linux/kmalloc_sizes.h>
00073 NULL
00074 #undef CACHE
00075 };
00076
00077
00078
00079
00080
00081 static struct kmem_cache *find_cache(size_t size)
00082 {
00083 struct cache_sizes *sizes;
00084
00085 for (sizes = malloc_sizes; size > sizes->cs_size; ++sizes) ;
00086
00087 return sizes->cs_cachep;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 void kfree(const void *objp)
00101 {
00102 if (!objp) return;
00103
00104
00105 void **p = (void **)objp - 1;
00106
00107 ddekit_log(DEBUG_MALLOC, "objp=%p cache=%p (%d)",
00108 p, *p, *p ? kmem_cache_size(*p) : 0);
00109
00110 if (*p)
00111
00112 kmem_cache_free(*p, p);
00113 else
00114
00115 ddekit_large_free(p);
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 void *__kmalloc(size_t size, gfp_t flags)
00128 {
00129
00130 size += sizeof(void *);
00131
00132
00133 struct kmem_cache *cache = find_cache(size);
00134
00135 void **p;
00136 if (cache)
00137
00138 p = kmem_cache_alloc(cache, flags);
00139 else
00140
00141 p = ddekit_large_malloc(size);
00142
00143 ddekit_log(DEBUG_MALLOC, "size=%d, cache=%p (%d) => %p",
00144 size, cache, cache ? kmem_cache_size(cache) : 0, p);
00145
00146
00147 if (p) {
00148 *p = cache;
00149 p++;
00150 }
00151 return p;
00152 }
00153
00154
00155 size_t ksize(const void *p)
00156 {
00157 struct kmem_cache *cache = (struct kmem_cache *)*((void**)p - 1);
00158 if (cache)
00159 return kmem_cache_size(cache);
00160 return -1;
00161 }
00162
00163
00164 void *dma_alloc_coherent(struct device *dev, size_t size,
00165 dma_addr_t *dma_handle, gfp_t flag)
00166 {
00167 void *ret = (void *)__get_free_pages(flag, get_order(size));
00168
00169 if (ret != NULL) {
00170 memset(ret, 0, size);
00171 *dma_handle = virt_to_bus(ret);
00172 }
00173 return ret;
00174 }
00175
00176
00177 void dma_free_coherent(struct device *dev, size_t size,
00178 void *vaddr, dma_addr_t dma_handle)
00179 {
00180 free_pages((unsigned long)vaddr, get_order(size));
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 void l4dde26_kmalloc_init(void)
00192 {
00193 struct cache_sizes *sizes = malloc_sizes;
00194 const char **names = malloc_names;
00195
00196
00197 for (; sizes->cs_size != ULONG_MAX; ++sizes, ++names)
00198 sizes->cs_cachep = kmem_cache_create(*names, sizes->cs_size, 0, 0, 0);
00199 }