1. linux/arch/um/kernel/physmem.c
the find_iomem function will case endless loop if you use two or more iomem to launch the UML kernel.
diff -urN linux-2.6.10/arch/um/kernel/physmem.c linux-2.6.10-src/arch/um/kernel/physmem.c
--- linux-2.6.10/arch/um/kernel/physmem.c 2004-12-25 05:35:01.000000000 +0800
+++ linux-2.6.10-src/arch/um/kernel/physmem.c 2006-02-21 13:22: 43.000000000 +0800
@@ -275,7 +275,7 @@
highmem_len = highmem_pages * sizeof(struct page);
total_pages = phys_pages + iomem_pages + highmem_pages;
- total_len = phys_len + iomem_pages + highmem_len;
+ total_len = phys_len + iomem_len + highmem_len;
if(kmalloc_ok){
map = kmalloc(total_len, GFP_KERNEL);
@@ -435,6 +435,7 @@
*len_out = region->size;
return(region->virt);
}
+ region = region->next;
}
return(0);
--- linux-2.6.10/arch/um/kernel/physmem.c 2004-12-25 05:35:01.000000000 +0800
+++ linux-2.6.10-src/arch/um/kernel/physmem.c 2006-02-21 13:22: 43.000000000 +0800
@@ -275,7 +275,7 @@
highmem_len = highmem_pages * sizeof(struct page);
total_pages = phys_pages + iomem_pages + highmem_pages;
- total_len = phys_len + iomem_pages + highmem_len;
+ total_len = phys_len + iomem_len + highmem_len;
if(kmalloc_ok){
map = kmalloc(total_len, GFP_KERNEL);
@@ -435,6 +435,7 @@
*len_out = region->size;
return(region->virt);
}
+ region = region->next;
}
return(0);
2. /arch/um/kernel/mem_user.c
diff -urN linux-2.6.10/arch/um/kernel/mem_user.c linux-2.6.10-src/arch/um/kernel/mem_user.c
--- linux-2.6.10/arch/um/kernel/mem_user.c 2004-12-25 05:34:57.000000000 +0800
+++ linux-2.6.10-src/arch/um/kernel/mem_user.c 2006-02-21 16:17: 39.000000000 +0800
@@ -191,7 +191,7 @@
goto out_close;
}
- size = (buf.ust_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
+ size = (buf.ust_size + UM_KERN_PAGE_SIZE - 1 ) & ~(UM_KERN_PAGE_SIZE - 1);
*new = ((struct iomem_region) { .next = iomem_regions,
.driver = driver,
--- linux-2.6.10/arch/um/kernel/mem_user.c 2004-12-25 05:34:57.000000000 +0800
+++ linux-2.6.10-src/arch/um/kernel/mem_user.c 2006-02-21 16:17: 39.000000000 +0800
@@ -191,7 +191,7 @@
goto out_close;
}
- size = (buf.ust_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
+ size = (buf.ust_size + UM_KERN_PAGE_SIZE - 1 ) & ~(UM_KERN_PAGE_SIZE - 1);
*new = ((struct iomem_region) { .next = iomem_regions,
.driver = driver,
