WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Fix mapping of MPT for x86/64 guests. Remove a few more uses of
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Sat, 21 May 2005 09:51:43 +0000
Delivery-date: Sun, 22 May 2005 17:02:24 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Fix mapping of MPT for x86/64 guests. Remove a few more uses of, BitKeeper Bot <=