[LINUX] Set up /proc/iomem in a sensibel way to indicate
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Jun 2006 09:24:48 +0000 (10:24 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Jun 2006 09:24:48 +0000 (10:24 +0100)
code & data resources, and a RAM area on domU.
From: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c
linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c

index 43fb12bbb3b66f1448b14b486740ad925afb1700..7ae42e6d3559a755bcfbc69466ade82db44141f1 100644 (file)
@@ -1378,7 +1378,6 @@ legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
                res->end = res->start + e820[i].size - 1;
                res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
                request_resource(&iomem_resource, res);
-#ifndef CONFIG_XEN
                if (e820[i].type == E820_RAM) {
                        /*
                         *  We don't know which RAM region contains kernel data,
@@ -1391,7 +1390,6 @@ legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
                        request_resource(res, &crashk_res);
 #endif
                }
-#endif
        }
 }
 
@@ -1460,8 +1458,16 @@ static void __init register_memory(void)
        int           i;
 
        /* Nothing to do if not running in dom0. */
-       if (!(xen_start_info->flags & SIF_INITDOMAIN))
+       if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+               struct e820entry domU_e820 = {
+                       .addr = 0,
+                       .size = max_pfn << PAGE_SHIFT,
+                       .type = E820_RAM,
+               };
+               legacy_init_iomem_resources(&domU_e820, 1,
+                                           &code_resource, &data_resource);
                return;
+       }
 
 #ifdef CONFIG_XEN
        machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE);
@@ -1698,11 +1704,10 @@ void __init setup_arch(char **cmdline_p)
        init_mm.brk = (PFN_UP(__pa(xen_start_info->pt_base)) +
                       xen_start_info->nr_pt_frames) << PAGE_SHIFT;
 
-       /* XEN: This is nonsense: kernel may not even be contiguous in RAM. */
-       /*code_resource.start = virt_to_phys(_text);*/
-       /*code_resource.end = virt_to_phys(_etext)-1;*/
-       /*data_resource.start = virt_to_phys(_etext);*/
-       /*data_resource.end = virt_to_phys(_edata)-1;*/
+       code_resource.start = virt_to_phys(_text);
+       code_resource.end = virt_to_phys(_etext)-1;
+       data_resource.start = virt_to_phys(_etext);
+       data_resource.end = virt_to_phys(_edata)-1;
 
        parse_cmdline_early(cmdline_p);
 
index 0f5dd54fa3dd910887078b05663d5786811b9bc2..1dcaedc0d5195b50ce83c5f753bc78fb06d5a466 100644 (file)
@@ -44,9 +44,7 @@ unsigned long end_pfn_map;
  */
 unsigned long end_user_pfn = MAXMEM>>PAGE_SHIFT;  
 
-#ifndef CONFIG_XEN
 extern struct resource code_resource, data_resource;
-#endif
 
 /* Check for some hardcoded bad areas that early boot is not allowed to touch */ 
 static inline int bad_addr(unsigned long *addrp, unsigned long size)
@@ -251,8 +249,7 @@ void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
                res->end = res->start + e820[i].size - 1;
                res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
                request_resource(&iomem_resource, res);
-#ifndef CONFIG_XEN
-               if (e820.map[i].type == E820_RAM) {
+               if (e820[i].type == E820_RAM) {
                        /*
                         *  We don't know which RAM region contains kernel data,
                         *  so we try it repeatedly and let the resource manager
@@ -264,7 +261,6 @@ void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
                        request_resource(res, &crashk_res);
 #endif
                }
-#endif
        }
 }
 
index 0b88c1781f1ebb5571d2bca1d23f957016c26f1b..05fb99fc3353df878ff68c8c8abd71c940e00eb6 100644 (file)
@@ -692,12 +692,10 @@ void __init setup_arch(char **cmdline_p)
        init_mm.end_data = (unsigned long) &_edata;
        init_mm.brk = (unsigned long) &_end;
 
-#ifndef CONFIG_XEN
        code_resource.start = virt_to_phys(&_text);
        code_resource.end = virt_to_phys(&_etext)-1;
        data_resource.start = virt_to_phys(&_etext);
        data_resource.end = virt_to_phys(&_edata)-1;
-#endif
 
        parse_cmdline_early(cmdline_p);
 
@@ -921,6 +919,13 @@ void __init setup_arch(char **cmdline_p)
                BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap));
 
                e820_reserve_resources(machine_e820, memmap.nr_entries);
+       } else {
+               struct e820entry domU_e820 = {
+                       .addr = 0,
+                       .size = max_pfn << PAGE_SHIFT,
+                       .type = E820_RAM,
+               };
+               e820_reserve_resources(&domU_e820, 1);
        }
 #elif !defined(CONFIG_XEN)
        probe_roms();