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] Add l?e_create_page() macros. map_pages_to_xen() now tak

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Add l?e_create_page() macros. map_pages_to_xen() now takes a pfn range
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Thu, 19 May 2005 13:24:18 +0000
Delivery-date: Thu, 19 May 2005 14:02:35 +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.1463, 2005/05/19 14:24:18+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Add l?e_create_page() macros. map_pages_to_xen() now takes a pfn range
        rather than a byte range. Fix x86/64 RAM mapping to discard partial
        frames.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 arch/x86/domain.c      |    8 ++----
 arch/x86/mm.c          |   61 +++++++++++++++++++++++++++++--------------------
 arch/x86/setup.c       |   24 ++++++++++---------
 arch/x86/shadow.c      |    2 -
 arch/x86/x86_32/mm.c   |    8 ------
 arch/x86/x86_64/mm.c   |   16 +++---------
 include/asm-x86/page.h |   13 +++++++---
 7 files changed, 67 insertions(+), 65 deletions(-)


diff -Nru a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     2005-05-19 10:03:11 -04:00
+++ b/xen/arch/x86/domain.c     2005-05-19 10:03:11 -04:00
@@ -263,9 +263,8 @@
                            PAGE_SHIFT] = INVALID_M2P_ENTRY;
     ed->arch.perdomain_ptes = d->arch.mm_perdomain_pt;
     ed->arch.perdomain_ptes[FIRST_RESERVED_GDT_PAGE] =
-        l1e_create_pfn(page_to_pfn(virt_to_page(gdt_table)),
-                       PAGE_HYPERVISOR);
-    
+        l1e_create_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);
+
     ed->arch.guest_vtable  = __linear_l2_table;
     ed->arch.shadow_vtable = __shadow_linear_l2_table;
 
@@ -302,8 +301,7 @@
     ed->arch.perdomain_ptes =
         d->arch.mm_perdomain_pt + (ed->vcpu_id << PDPT_VCPU_SHIFT);
     ed->arch.perdomain_ptes[FIRST_RESERVED_GDT_PAGE] =
-        l1e_create_pfn(page_to_pfn(virt_to_page(gdt_table)),
-                       PAGE_HYPERVISOR);
+        l1e_create_page(virt_to_page(gdt_table), PAGE_HYPERVISOR);
 }
 
 #ifdef CONFIG_VMX
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-05-19 10:03:11 -04:00
+++ b/xen/arch/x86/mm.c 2005-05-19 10:03:11 -04:00
@@ -161,7 +161,10 @@
         if ( p == 0 )
             panic("Not enough memory for frame table\n");
         map_pages_to_xen(
-            FRAMETABLE_VIRT_START + i, p, 4UL << 20, PAGE_HYPERVISOR);
+            FRAMETABLE_VIRT_START + i,
+            p >> PAGE_SHIFT,
+            4UL << (20-PAGE_SHIFT),
+            PAGE_HYPERVISOR);
     }
 
     memset(frame_table, 0, frame_table_size);
@@ -2833,31 +2836,30 @@
     free_xenheap_page((unsigned long)d->arch.ptwr[PTWR_PT_INACTIVE].page);
 }
 
-/* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */
 int map_pages_to_xen(
-    unsigned long v,
-    unsigned long p,
-    unsigned long s,
+    unsigned long virt,
+    unsigned long pfn,
+    unsigned long nr_pfns,
     unsigned long flags)
 {
     l2_pgentry_t *pl2e, ol2e;
-    l1_pgentry_t *pl1e;
+    l1_pgentry_t *pl1e, ol1e;
     unsigned int  i;
 
     unsigned int  map_small_pages = !!(flags & MAP_SMALL_PAGES);
     flags &= ~MAP_SMALL_PAGES;
 
-    while ( s != 0 )
+    while ( nr_pfns != 0 )
     {
-        pl2e = virt_to_xen_l2e(v);
+        pl2e = virt_to_xen_l2e(virt);
 
-        if ( (((v|p) & ((1 << L2_PAGETABLE_SHIFT) - 1)) == 0) &&
-             (s >= (1 << L2_PAGETABLE_SHIFT)) &&
+        if ( ((((virt>>PAGE_SHIFT) | pfn) & ((1<<PAGETABLE_ORDER)-1)) == 0) &&
+             (nr_pfns >= (1<<PAGETABLE_ORDER)) &&
              !map_small_pages )
         {
             /* Super-page mapping. */
             ol2e  = *pl2e;
-            *pl2e = l2e_create_phys(p, flags|_PAGE_PSE);
+            *pl2e = l2e_create_pfn(pfn, flags|_PAGE_PSE);
 
             if ( (l2e_get_flags(ol2e) & _PAGE_PRESENT) )
             {
@@ -2866,9 +2868,9 @@
                     free_xen_pagetable(l2e_get_page(*pl2e));
             }
 
-            v += 1 << L2_PAGETABLE_SHIFT;
-            p += 1 << L2_PAGETABLE_SHIFT;
-            s -= 1 << L2_PAGETABLE_SHIFT;
+            virt    += 1UL << L2_PAGETABLE_SHIFT;
+            pfn     += 1UL << PAGETABLE_ORDER;
+            nr_pfns -= 1UL << PAGETABLE_ORDER;
         }
         else
         {
@@ -2890,26 +2892,36 @@
                 local_flush_tlb_pge();
             }
 
-            pl1e = l2e_to_l1e(*pl2e) + l1_table_offset(v);
-            if ( (l1e_get_flags(*pl1e) & _PAGE_PRESENT) )
-                local_flush_tlb_one(v);
-            *pl1e = l1e_create_phys(p, flags);
-
-            v += 1 << L1_PAGETABLE_SHIFT;
-            p += 1 << L1_PAGETABLE_SHIFT;
-            s -= 1 << L1_PAGETABLE_SHIFT;       
+            pl1e  = l2e_to_l1e(*pl2e) + l1_table_offset(virt);
+            ol1e  = *pl1e;
+            *pl1e = l1e_create_pfn(pfn, flags);
+            if ( (l1e_get_flags(ol1e) & _PAGE_PRESENT) )
+                local_flush_tlb_one(virt);
+
+            virt    += 1UL << L1_PAGETABLE_SHIFT;
+            pfn     += 1UL;
+            nr_pfns -= 1UL;
         }
     }
 
     return 0;
 }
 
+void __set_fixmap(
+    enum fixed_addresses idx, unsigned long p, unsigned long flags)
+{
+    if ( unlikely(idx >= __end_of_fixed_addresses) )
+        BUG();
+    map_pages_to_xen(fix_to_virt(idx), p >> PAGE_SHIFT, 1, flags);
+}
+
 #ifdef MEMORY_GUARD
 
 void memguard_init(void)
 {
     map_pages_to_xen(
-        PAGE_OFFSET, 0, xenheap_phys_end, __PAGE_HYPERVISOR|MAP_SMALL_PAGES);
+        PAGE_OFFSET, 0, xenheap_phys_end >> PAGE_SHIFT,
+        __PAGE_HYPERVISOR|MAP_SMALL_PAGES);
 }
 
 static void __memguard_change_range(void *p, unsigned long l, int guard)
@@ -2927,7 +2939,8 @@
     if ( guard )
         flags &= ~_PAGE_PRESENT;
 
-    map_pages_to_xen((unsigned long)(_p), __pa(_p), _l, flags);
+    map_pages_to_xen(
+        _p, virt_to_phys(p) >> PAGE_SHIFT, _l >> PAGE_SHIFT, flags);
 }
 
 void memguard_guard_range(void *p, unsigned long l)
diff -Nru a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      2005-05-19 10:03:11 -04:00
+++ b/xen/arch/x86/setup.c      2005-05-19 10:03:11 -04:00
@@ -399,7 +399,7 @@
     /* Map default GDT into their final position in the idle page table. */
     map_pages_to_xen(
         GDT_VIRT_START(current) + FIRST_RESERVED_GDT_BYTE,
-        virt_to_phys(gdt_table), PAGE_SIZE, PAGE_HYPERVISOR);
+        virt_to_phys(gdt_table) >> PAGE_SHIFT, 1, PAGE_HYPERVISOR);
 
     /* Process CPU type information. */
     identify_cpu(&boot_cpu_data);
@@ -580,17 +580,19 @@
          *     due to cache-attribute mismatches (e.g., AMD/AGP Linux bug).
          */
         {
-            unsigned long start = (unsigned long)e820.map[i].addr;
-            unsigned long size  = (unsigned long)e820.map[i].size;
-            size = (size + (start & ~PAGE_MASK) + PAGE_SIZE - 1) & PAGE_MASK;
-            if ( (start &= PAGE_MASK) < (64UL << 20) )
-            {
-                if ( (signed long)(size -= (64UL << 20) - start) <= 0 )
-                    continue;
-                start = 64UL << 20;
-            }
+            /* Calculate page-frame range, discarding partial frames. */
+            unsigned long start, end;
+            start = (e820.map[i].addr + PAGE_SIZE - 1) >> PAGE_SHIFT;
+            end   = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
+            /* Clip the range to above 64MB. */
+            if ( end < (64UL << (20-PAGE_SHIFT)) )
+                continue;
+            if ( start < (64UL << (20-PAGE_SHIFT)) )
+                start = 64UL << (20-PAGE_SHIFT);
+            /* Request the mapping. */
             map_pages_to_xen(
-                PAGE_OFFSET + start, start, size, PAGE_HYPERVISOR);
+                PAGE_OFFSET + (start << PAGE_SHIFT),
+                start, end-start, PAGE_HYPERVISOR);
         }
 #endif
     }
diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     2005-05-19 10:03:13 -04:00
+++ b/xen/arch/x86/shadow.c     2005-05-19 10:03:13 -04:00
@@ -789,7 +789,7 @@
         memset(l1, 0, PAGE_SIZE);
         unmap_domain_mem_with_cache(l1, l1cache);
 
-        l2e = l2e_create_pfn(page_to_pfn(l1page), __PAGE_HYPERVISOR);
+        l2e = l2e_create_page(l1page, __PAGE_HYPERVISOR);
         l2[l2_table_offset(va)] = l2e;
     }
     unmap_domain_mem_with_cache(l2, l2cache);
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-19 10:03:11 -04:00
+++ b/xen/arch/x86/x86_32/mm.c  2005-05-19 10:03:11 -04:00
@@ -54,14 +54,6 @@
     return &idle_pg_table[l2_table_offset(v)];
 }
 
-void __set_fixmap(
-    enum fixed_addresses idx, unsigned long p, unsigned long flags)
-{
-    if ( unlikely(idx >= __end_of_fixed_addresses) )
-        BUG();
-    map_pages_to_xen(fix_to_virt(idx), p, PAGE_SIZE, flags);
-}
-
 void __init paging_init(void)
 {
     void *ioremap_pt;
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-19 10:03:11 -04:00
+++ b/xen/arch/x86/x86_64/mm.c  2005-05-19 10:03:11 -04:00
@@ -72,17 +72,9 @@
     return pl2e;
 }
 
-void __set_fixmap(
-    enum fixed_addresses idx, unsigned long p, unsigned long flags)
-{
-    if ( unlikely(idx >= __end_of_fixed_addresses) )
-        BUG();
-    map_pages_to_xen(fix_to_virt(idx), p, PAGE_SIZE, flags);
-}
-
 void __init paging_init(void)
 {
-    unsigned long i, p;
+    unsigned long i;
     l3_pgentry_t *l3rw, *l3ro;
     struct pfn_info *pg;
 
@@ -96,10 +88,10 @@
             NULL, L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT);
         if ( pg == NULL )
             panic("Not enough memory for m2p table\n");
-        p = page_to_phys(pg);
         map_pages_to_xen(

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Add l?e_create_page() macros. map_pages_to_xen() now takes a pfn range, BitKeeper Bot <=