> 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
|