um: Print minimum physical memory requirement
authorThomas Meyer <thomas@m3y3r.de>
Fri, 3 Apr 2015 14:51:26 +0000 (16:51 +0200)
committerRichard Weinberger <richard@nod.at>
Mon, 13 Apr 2015 19:17:46 +0000 (21:17 +0200)
Print a more sensible message about the minimum physical memory
requirement.

Signed-off-by: Thomas Meyer <thomas@m3y3r.de>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/kernel/physmem.c

index 549ecf3f5857441c95e4344b6aabc99ce4723f7f..9034fc8056b485d2eb34cf7af2f20a23dde87b51 100644 (file)
@@ -57,22 +57,51 @@ void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
 
 extern int __syscall_stub_start;
 
+/**
+ * setup_physmem() - Setup physical memory for UML
+ * @start:     Start address of the physical kernel memory,
+ *             i.e start address of the executable image.
+ * @reserve_end:       end address of the physical kernel memory.
+ * @len:       Length of total physical memory that should be mapped/made
+ *             available, in bytes.
+ * @highmem:   Number of highmem bytes that should be mapped/made available.
+ *
+ * Creates an unlinked temporary file of size (len + highmem) and memory maps
+ * it on the last executable image address (uml_reserved).
+ *
+ * The offset is needed as the length of the total physical memory
+ * (len + highmem) includes the size of the memory used be the executable image,
+ * but the mapped-to address is the last address of the executable image
+ * (uml_reserved == end address of executable image).
+ *
+ * The memory mapped memory of the temporary file is used as backing memory
+ * of all user space processes/kernel tasks.
+ */
 void __init setup_physmem(unsigned long start, unsigned long reserve_end,
                          unsigned long len, unsigned long long highmem)
 {
        unsigned long reserve = reserve_end - start;
-       int pfn = PFN_UP(__pa(reserve_end));
-       int delta = (len - reserve) >> PAGE_SHIFT;
-       int err, offset, bootmap_size;
+       unsigned long pfn = PFN_UP(__pa(reserve_end));
+       unsigned long delta = (len - reserve) >> PAGE_SHIFT;
+       unsigned long offset, bootmap_size;
+       long map_size;
+       int err;
+
+       offset = uml_reserved - uml_physmem;
+       map_size = len - offset;
+       if(map_size <= 0) {
+               printf("Too few physical memory! Needed=%d, given=%d\n",
+                      offset, len);
+               exit(1);
+       }
 
        physmem_fd = create_mem_file(len + highmem);
 
-       offset = uml_reserved - uml_physmem;
        err = os_map_memory((void *) uml_reserved, physmem_fd, offset,
-                           len - offset, 1, 1, 1);
+                           map_size, 1, 1, 1);
        if (err < 0) {
                printf("setup_physmem - mapping %ld bytes of memory at 0x%p "
-                      "failed - errno = %d\n", len - offset,
+                      "failed - errno = %d\n", map_size,
                       (void *) uml_reserved, err);
                exit(1);
        }