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);
 
 
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,
 
 

Reply via email to