[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] access shared_info?



> Even if you could get address of shared_info, you can't map it into user
> space without some kernel hacking to make that possible (/dev/mem can
> only map I/O memory when running on Xen).

Ok, different attack ;)

How about the attached patch?  It makes /proc/iomem under xen dom0 look
like on native hardware.  Also for domU it has some sensible values then
instead of being empty.

cheers,

  Gerd

-- 
Gerd Hoffmann <kraxel@xxxxxxx>
http://www.suse.de/~kraxel/julika-dora.jpeg
diff -r c191c649cdb3 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Tue Jun  6 09:25:59 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Wed Jun  7 17:48:10 2006
@@ -1352,10 +1352,23 @@
  * Request address space for all standard RAM and ROM resources
  * and also for regions reported as reserved by the e820.
  */
+
+static void __init register_kernel_ressources(struct resource *res)
+{
+       /*
+        *  We don't know which RAM region contains kernel data,
+        *  so we try it repeatedly and let the resource manager
+        *  test it.
+        */
+       request_resource(res, &code_resource);
+       request_resource(res, &data_resource);
+#ifdef CONFIG_KEXEC
+       request_resource(res, &crashk_res);
+#endif
+}
+
 static void __init
-legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
-                           struct resource *code_resource,
-                           struct resource *data_resource)
+legacy_init_iomem_resources(struct e820entry *e820, int nr_map)
 {
        int i;
 
@@ -1378,21 +1391,23 @@
                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,
-                        *  so we try it repeatedly and let the resource manager
-                        *  test it.
-                        */
-                       request_resource(res, code_resource);
-                       request_resource(res, data_resource);
-#ifdef CONFIG_KEXEC
-                       request_resource(res, &crashk_res);
-#endif
-               }
-#endif
-       }
+               if (e820[i].type == E820_RAM)
+                       register_kernel_ressources(res);
+       }
+}
+
+static void __init
+domU_init_iomem_resources(void)
+{
+       struct resource *res;
+       
+       res = alloc_bootmem_low(sizeof(struct resource));
+       res->name  = "System RAM";
+       res->start = 0;
+       res->end   = (max_pfn * PAGE_SIZE) - 1;
+       res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+       request_resource(&iomem_resource, res);
+       register_kernel_ressources(res);
 }
 
 /*
@@ -1460,8 +1475,10 @@
        int           i;
 
        /* Nothing to do if not running in dom0. */
-       if (!(xen_start_info->flags & SIF_INITDOMAIN))
+       if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
+               domU_init_iomem_resources();
                return;
+       }
 
 #ifdef CONFIG_XEN
        machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE);
@@ -1471,14 +1488,12 @@
 
        BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap));
 
-       legacy_init_iomem_resources(machine_e820, memmap.nr_entries,
-                                   &code_resource, &data_resource);
+       legacy_init_iomem_resources(machine_e820, memmap.nr_entries);
 #else
        if (efi_enabled)
                efi_initialize_iomem_resources(&code_resource, &data_resource);
        else
-               legacy_init_iomem_resources(e820.map, e820.nr_map,
-                                           &code_resource, &data_resource);
+               legacy_init_iomem_resources(e820.map, e820.nr_map);
 #endif
 
        /* EFI systems may still have VGA */
@@ -1698,11 +1713,10 @@
        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);
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.