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

[Xen-changelog] Fix mapping of MPT for x86/64 guests. Remove a few more uses of



ChangeSet 1.1498, 2005/05/21 10:51:43+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Fix mapping of MPT for x86/64 guests. Remove a few more uses of
        l?e_create_phys().
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 domain.c    |    4 ++--
 mm.c        |   14 ++++++++------
 x86_32/mm.c |   20 +++++++++-----------
 x86_64/mm.c |   50 ++++++++++++++++++++++----------------------------
 4 files changed, 41 insertions(+), 47 deletions(-)


diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     2005-05-22 13:03:01 -04:00
+++ b/xen/arch/x86/domain.c     2005-05-22 13:03:01 -04:00
@@ -275,12 +275,12 @@
     d->arch.mm_perdomain_l2 = (l2_pgentry_t *)alloc_xenheap_page();
     memset(d->arch.mm_perdomain_l2, 0, PAGE_SIZE);
     d->arch.mm_perdomain_l2[l2_table_offset(PERDOMAIN_VIRT_START)] = 
-        l2e_create_phys(__pa(d->arch.mm_perdomain_pt),
+        l2e_create_page(virt_to_page(d->arch.mm_perdomain_pt),
                         __PAGE_HYPERVISOR);
     d->arch.mm_perdomain_l3 = (l3_pgentry_t *)alloc_xenheap_page();
     memset(d->arch.mm_perdomain_l3, 0, PAGE_SIZE);
     d->arch.mm_perdomain_l3[l3_table_offset(PERDOMAIN_VIRT_START)] = 
-        l3e_create_phys(__pa(d->arch.mm_perdomain_l2),
+        l3e_create_page(virt_to_page(d->arch.mm_perdomain_l2),
                             __PAGE_HYPERVISOR);
 #endif
     
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-05-22 13:03:01 -04:00
+++ b/xen/arch/x86/mm.c 2005-05-22 13:03:01 -04:00
@@ -700,8 +700,9 @@
     pl2e[l2_table_offset(LINEAR_PT_VIRT_START)] =
         l2e_create_pfn(pfn, __PAGE_HYPERVISOR);
     pl2e[l2_table_offset(PERDOMAIN_VIRT_START)] =
-        l2e_create_phys(__pa(page_get_owner(page)->arch.mm_perdomain_pt),
-                        __PAGE_HYPERVISOR);
+        l2e_create_page(
+            virt_to_page(page_get_owner(page)->arch.mm_perdomain_pt),
+            __PAGE_HYPERVISOR);
 #endif
 
     unmap_domain_mem(pl2e);
@@ -770,8 +771,9 @@
     pl4e[l4_table_offset(LINEAR_PT_VIRT_START)] =
         l4e_create_pfn(pfn, __PAGE_HYPERVISOR);
     pl4e[l4_table_offset(PERDOMAIN_VIRT_START)] =
-        l4e_create_phys(__pa(page_get_owner(page)->arch.mm_perdomain_l3),
-                        __PAGE_HYPERVISOR);
+        l4e_create_page(
+            virt_to_page(page_get_owner(page)->arch.mm_perdomain_l3),
+            __PAGE_HYPERVISOR);
 
     return 1;
 
@@ -2880,7 +2882,7 @@
             {
                 pl1e = page_to_virt(alloc_xen_pagetable());
                 clear_page(pl1e);
-                *pl2e = l2e_create_phys(__pa(pl1e), __PAGE_HYPERVISOR);
+                *pl2e = l2e_create_page(virt_to_page(pl1e), __PAGE_HYPERVISOR);
             }
             else if ( l2e_get_flags(*pl2e) & _PAGE_PSE )
             {
@@ -2889,7 +2891,7 @@
                     pl1e[i] = l1e_create_pfn(
                         l2e_get_pfn(*pl2e) + i,
                         l2e_get_flags(*pl2e) & ~_PAGE_PSE);
-                *pl2e = l2e_create_phys(__pa(pl1e), __PAGE_HYPERVISOR);
+                *pl2e = l2e_create_page(virt_to_page(pl1e), __PAGE_HYPERVISOR);
                 local_flush_tlb_pge();
             }
 
diff -Nru a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c  2005-05-22 13:03:01 -04:00
+++ b/xen/arch/x86/x86_32/mm.c  2005-05-22 13:03:01 -04:00
@@ -58,13 +58,13 @@
 {
     void *ioremap_pt;
     unsigned long v;
-    struct pfn_info *pg;
+    struct pfn_info *m2p_pg;
 
     /* Allocate and map the machine-to-phys table. */
-    if ( (pg = alloc_domheap_pages(NULL, 10)) == NULL )
+    if ( (m2p_pg = alloc_domheap_pages(NULL, 10)) == NULL )
         panic("Not enough memory to bootstrap Xen.\n");
     idle_pg_table[l2_table_offset(RDWR_MPT_VIRT_START)] =
-        l2e_create_phys(page_to_phys(pg), __PAGE_HYPERVISOR | _PAGE_PSE);
+        l2e_create_page(m2p_pg, __PAGE_HYPERVISOR | _PAGE_PSE);
     memset((void *)RDWR_MPT_VIRT_START, 0x55, 4UL << 20);
 
     /* Xen 4MB mappings can all be GLOBAL. */
@@ -82,27 +82,25 @@
     ioremap_pt = (void *)alloc_xenheap_page();
     clear_page(ioremap_pt);
     idle_pg_table[l2_table_offset(IOREMAP_VIRT_START)] =
-        l2e_create_phys(__pa(ioremap_pt), __PAGE_HYPERVISOR);
+        l2e_create_page(virt_to_page(ioremap_pt), __PAGE_HYPERVISOR);
 
-    /* Create read-only mapping of MPT for guest-OS use.
+    /*
+     * Create read-only mapping of MPT for guest-OS use.
      * NB. Remove the global bit so that shadow_mode_translate()==true domains
      *     can reused this address space for their phys-to-machine mapping.
      */
     idle_pg_table[l2_table_offset(RO_MPT_VIRT_START)] =
-        l2e_create_pfn(
-            l2e_get_pfn(idle_pg_table[l2_table_offset(RDWR_MPT_VIRT_START)]),
-            l2e_get_flags(idle_pg_table[l2_table_offset(RDWR_MPT_VIRT_START)])
-            & ~(_PAGE_RW | _PAGE_GLOBAL));
+        l2e_create_page(m2p_pg, (__PAGE_HYPERVISOR | _PAGE_PSE) & ~_PAGE_RW);
 
     /* Set up mapping cache for domain pages. */
     mapcache = (l1_pgentry_t *)alloc_xenheap_page();
     clear_page(mapcache);
     idle_pg_table[l2_table_offset(MAPCACHE_VIRT_START)] =
-        l2e_create_phys(__pa(mapcache), __PAGE_HYPERVISOR);
+        l2e_create_page(virt_to_page(mapcache), __PAGE_HYPERVISOR);
 
     /* Set up linear page table mapping. */
     idle_pg_table[l2_table_offset(LINEAR_PT_VIRT_START)] =
-        l2e_create_phys(__pa(idle_pg_table), __PAGE_HYPERVISOR);
+        l2e_create_page(virt_to_page(idle_pg_table), __PAGE_HYPERVISOR);
 }
 
 void __init zap_low_mappings(void)
diff -Nru a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  2005-05-22 13:03:01 -04:00
+++ b/xen/arch/x86/x86_64/mm.c  2005-05-22 13:03:01 -04:00
@@ -75,48 +75,42 @@
 void __init paging_init(void)
 {
     unsigned long i;
-    l3_pgentry_t *l3rw, *l3ro;
+    l3_pgentry_t *l3_ro_mpt;
+    l2_pgentry_t *l2_ro_mpt;
     struct pfn_info *pg;
 
+    /* Create user-accessible L2 directory to map the MPT for guests. */
+    l3_ro_mpt = (l3_pgentry_t *)alloc_xenheap_page();
+    clear_page(l3_ro_mpt);
+    idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)] =
+        l4e_create_page(
+            virt_to_page(l3_ro_mpt), __PAGE_HYPERVISOR | _PAGE_USER);
+    l2_ro_mpt = (l2_pgentry_t *)alloc_xenheap_page();
+    clear_page(l2_ro_mpt);
+    l3_ro_mpt[l3_table_offset(RO_MPT_VIRT_START)] =
+        l3e_create_page(
+            virt_to_page(l2_ro_mpt), __PAGE_HYPERVISOR | _PAGE_USER);
+    l2_ro_mpt += l2_table_offset(RO_MPT_VIRT_START);
+
     /*
      * Allocate and map the machine-to-phys table.
-     * This also ensures L3 is present for ioremap().
+     * This also ensures L3 is present for fixmaps.
      */
     for ( i = 0; i < max_page; i += ((1UL << L2_PAGETABLE_SHIFT) / 8) )
     {
-        pg = alloc_domheap_pages(
-            NULL, L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT);
+        pg = alloc_domheap_pages(NULL, PAGETABLE_ORDER);
         if ( pg == NULL )
             panic("Not enough memory for m2p table\n");
         map_pages_to_xen(
             RDWR_MPT_VIRT_START + i*8, page_to_pfn(pg), 
-            1UL << (L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT),
-            PAGE_HYPERVISOR | _PAGE_USER);
+            1UL << PAGETABLE_ORDER,
+            PAGE_HYPERVISOR);
         memset((void *)(RDWR_MPT_VIRT_START + i*8), 0x55,
                1UL << L2_PAGETABLE_SHIFT);
+        *l2_ro_mpt++ = l2e_create_page(
+            pg, _PAGE_GLOBAL|_PAGE_PSE|_PAGE_USER|_PAGE_PRESENT);
+        BUG_ON(((unsigned long)l2_ro_mpt & ~PAGE_MASK) == 0);
     }
-
-    /*
-     * Above we mapped the M2P table as user-accessible and read-writable.
-     * Fix security by denying user access at the top level of the page table.
-     */
-    l4e_remove_flags(&idle_pg_table[l4_table_offset(RDWR_MPT_VIRT_START)],
-                     _PAGE_USER);
-
-    /* Create read-only mapping of MPT for guest-OS use. */
-    l3ro = (l3_pgentry_t *)alloc_xenheap_page();
-    clear_page(l3ro);
-    idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)] =
-        l4e_create_phys(__pa(l3ro),
-                        (__PAGE_HYPERVISOR | _PAGE_USER) & ~_PAGE_RW);
-
-    /* Copy the L3 mappings from the RDWR_MPT area. */
-    l3rw = l4e_to_l3e(
-        idle_pg_table[l4_table_offset(RDWR_MPT_VIRT_START)]);
-    l3rw += l3_table_offset(RDWR_MPT_VIRT_START);
-    l3ro += l3_table_offset(RO_MPT_VIRT_START);
-    memcpy(l3ro, l3rw,
-           (RDWR_MPT_VIRT_END - RDWR_MPT_VIRT_START) >> L3_PAGETABLE_SHIFT);
 
     /* Set up linear page table mapping. */
     idle_pg_table[l4_table_offset(LINEAR_PT_VIRT_START)] =

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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