There is a bug In file
    linux/arch/um/kernel/physmem.c  init_mem() functions:

int init_maps(unsigned long physmem, unsigned
 long iomem, unsigned long highmem)
{
struct page *p, *map;
unsigned long phys_len, phys_pages, highmem_len, highmem_pages;
unsigned long iomem_len, iomem_pages, total_len, total_pages;
int i;

phys_pages = physmem >> PAGE_SHIFT;
phys_len = phys_pages * sizeof( struct page);

iomem_pages = iomem >> PAGE_SHIFT;
iomem_len = iomem_pages * sizeof(struct page);

highmem_pages = highmem >> PAGE_SHIFT;
highmem_len = highmem_pages * sizeof(struct page);

total_pages = phys_pages + iomem_pages + highmem_pages;
total_len = phys_len + iomem_pages + highmem_len;

if(kmalloc_ok){
map = kmalloc(total_len, GFP_KERNEL);
if(map == NULL)
map = vmalloc(total_len);
}
else map = alloc_bootmem_low_pages(total_len);

if (map == NULL)
return(-ENOMEM);

for(i = 0; i < total_pages; i++){
p = &map[i];
set_page_count(p, 0);
SetPageReserved(p);
INIT_LIST_HEAD(&p->list);
}

mem_map = map;
max_mapnr = total_pages;
return(0);
}

this line should be 
total_len = phys_len + iomem_len + highmem_len;



Reply via email to