|
@@ -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);
|
|
|
}
|