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

[Xen-ia64-devel] [PATCH 3/3] [read-only mapping] acpi read-only mapping


 3 / 3 
# HG changeset patch
# User yamahata@xxxxxxxxxxxxx
# Node ID 6c1719503e6cfc12be50a7e7bf7e4a09944cdc9c
# Parent  6c3d5f671d1760d6d301fe3160156375e8ac39c6
implemented dom0 acpi read-only mapping
PATCHNAME: dom0_acpi_read_only_mappping

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>

diff -r 6c3d5f671d17 -r 6c1719503e6c xen/arch/ia64/xen/dom_fw.c
--- a/xen/arch/ia64/xen/dom_fw.c	Tue May 16 13:25:45 2006 +0900
+++ b/xen/arch/ia64/xen/dom_fw.c	Tue May 16 13:25:46 2006 +0900
@@ -678,6 +678,7 @@ struct dom0_passthrough_arg {
 struct dom0_passthrough_arg {
 #ifdef CONFIG_XEN_IA64_DOM0_VP
     struct domain*      d;
+    unsigned long       readonly;
 #endif
     efi_memory_desc_t *md;
     int*                i;
@@ -692,7 +693,7 @@ dom_fw_dom0_passthrough(efi_memory_desc_
 #ifdef CONFIG_XEN_IA64_DOM0_VP
     struct domain* d = arg->d;
     u64 start = md->phys_addr;
-    u64 end = start + (md->num_pages << EFI_PAGE_SHIFT);
+    u64 size = md->num_pages << EFI_PAGE_SHIFT;
 
     if (md->type == EFI_MEMORY_MAPPED_IO ||
         md->type == EFI_MEMORY_MAPPED_IO_PORT_SPACE) {
@@ -701,13 +702,12 @@ dom_fw_dom0_passthrough(efi_memory_desc_
         //    It requires impractical memory to map such a huge region
         //    to a domain.
         //    For now we don't map it, but later we must fix this.
-        if (md->type == EFI_MEMORY_MAPPED_IO &&
-            ((md->num_pages << EFI_PAGE_SHIFT) > 0x100000000UL))
+        if (md->type == EFI_MEMORY_MAPPED_IO && (size > 0x100000000UL))
             return 0;
 
-        paddr = assign_domain_mmio_page(d, start, end - start);
+        paddr = assign_domain_mmio_page(d, start, size);
     } else
-        paddr = assign_domain_mach_page(d, start, end - start);
+        paddr = assign_domain_mach_page(d, start, size, arg->readonly);
 #else
     paddr = md->phys_addr;
 #endif
@@ -855,7 +855,8 @@ dom_fw_init (struct domain *d, const cha
 	}
 	if (d == dom0) {
 #ifdef CONFIG_XEN_IA64_DOM0_VP
-# define ASSIGN_DOMAIN_MACH_PAGE(d, p) assign_domain_mach_page(d, p, PAGE_SIZE)
+# define ASSIGN_DOMAIN_MACH_PAGE(d, p) \
+        assign_domain_mach_page(d, p, PAGE_SIZE, 1)
 #else
 # define ASSIGN_DOMAIN_MACH_PAGE(d, p) ({p;})
 #endif
@@ -971,17 +972,24 @@ dom_fw_init (struct domain *d, const cha
 		/* pass through the I/O port space */
 		if (!running_on_sim) {
 			struct dom0_passthrough_arg arg;
+			arg.md = &efi_memmap[i];
+			arg.i = &i;
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 			arg.d = d;
-#endif
-			arg.md = &efi_memmap[i];
-			arg.i = &i;
+			arg.readonly = 0;
+#endif
 			//XXX Is this needed?
 			efi_memmap_walk_type(EFI_RUNTIME_SERVICES_CODE,
 			                     dom_fw_dom0_passthrough, &arg);
 			// for ACPI table.
+#ifdef CONFIG_XEN_IA64_DOM0_VP
+			arg.readonly = 1;
+#endif
 			efi_memmap_walk_type(EFI_RUNTIME_SERVICES_DATA,
 			                     dom_fw_dom0_passthrough, &arg);
+#ifdef CONFIG_XEN_IA64_DOM0_VP
+			arg.readonly = 0;
+#endif
 			efi_memmap_walk_type(EFI_ACPI_RECLAIM_MEMORY,
 			                     dom_fw_dom0_passthrough, &arg);
 			efi_memmap_walk_type(EFI_MEMORY_MAPPED_IO,
diff -r 6c3d5f671d17 -r 6c1719503e6c xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c	Tue May 16 13:25:45 2006 +0900
+++ b/xen/arch/ia64/xen/domain.c	Tue May 16 13:25:46 2006 +0900
@@ -846,12 +846,13 @@ assign_domain_page(struct domain *d,
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 static void
 assign_domain_same_page(struct domain *d,
-                          unsigned long mpaddr, unsigned long size)
+                        unsigned long mpaddr, unsigned long size,
+                        unsigned long readonly)
 {
     //XXX optimization
     unsigned long end = mpaddr + size;
     for (; mpaddr < end; mpaddr += PAGE_SIZE) {
-        __assign_domain_page(d, mpaddr, mpaddr, 0);
+        __assign_domain_page(d, mpaddr, mpaddr, readonly);
     }
 }
 
@@ -863,15 +864,16 @@ assign_domain_mmio_page(struct domain *d
         DPRINTK("%s: domain %p mpaddr 0x%lx size = 0x%lx\n",
                 __func__, d, mpaddr, size);
     }
-    assign_domain_same_page(d, mpaddr, size);
+    assign_domain_same_page(d, mpaddr, size, 0);
     return mpaddr;
 }
 
 unsigned long
 assign_domain_mach_page(struct domain *d,
-                        unsigned long mpaddr, unsigned long size)
-{
-    assign_domain_same_page(d, mpaddr, size);
+                        unsigned long mpaddr, unsigned long size,
+                        unsigned long readonly)
+{
+    assign_domain_same_page(d, mpaddr, size, readonly);
     return mpaddr;
 }
 
diff -r 6c3d5f671d17 -r 6c1719503e6c xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h	Tue May 16 13:25:45 2006 +0900
+++ b/xen/include/asm-ia64/domain.h	Tue May 16 13:25:46 2006 +0900
@@ -123,7 +123,7 @@ void assign_domain_io_page(struct domain
 void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned long flags);
 #ifdef CONFIG_XEN_IA64_DOM0_VP
 unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr, unsigned long size);
-unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size);
+unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size, unsigned long readonly);
 unsigned long do_dom0vp_op(unsigned long cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3);
 unsigned long dom0vp_zap_physmap(struct domain *d, unsigned long gpfn, unsigned int extent_order);
 unsigned long dom0vp_add_physmap(struct domain* d, unsigned long gpfn, unsigned long mfn, unsigned int readonly, domid_t domid);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


This mailing list archive is a service of Copilotco.