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] This patch fixes the booting problems on machines with >

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] This patch fixes the booting problems on machines with >4GB memory, and
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sun, 14 Aug 2005 05:06:11 -0400
Delivery-date: Sun, 14 Aug 2005 09:06:46 +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-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 719841477514b7cf0496244ef72d1adff72e7deb
# Parent  dc27fd3392b1d8c149c71f2ef63534d4e3a32853
This patch fixes the booting problems on machines with >4GB memory, and
is applicable to both x86_64 and x86 PAE.

Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx>

diff -r dc27fd3392b1 -r 719841477514 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Sun Aug 14 08:09:06 2005
+++ b/xen/arch/x86/mm.c Sun Aug 14 09:06:32 2005
@@ -736,7 +736,7 @@
         pl2e[l2_table_offset(LINEAR_PT_VIRT_START) + i] =
             (l3e_get_flags(pl3e[i]) & _PAGE_PRESENT) ?
             l2e_from_pfn(l3e_get_pfn(pl3e[i]), __PAGE_HYPERVISOR) :
-            l2e_empty();
+        l2e_empty();
     unmap_domain_page(pl2e);
 
     return 1;
@@ -764,7 +764,7 @@
     unsigned long l2_backptr = l2_type & PGT_va_mask;
     BUG_ON(l2_backptr == PGT_va_unknown);
 
-     *backptr = ((l2_backptr >> PGT_va_shift) << L3_PAGETABLE_SHIFT) | 
+    *backptr = ((l2_backptr >> PGT_va_shift) << L3_PAGETABLE_SHIFT) | 
         (offset_in_l2 << L2_PAGETABLE_SHIFT);
     return 1;
 }
@@ -872,7 +872,7 @@
         if ( !l2_backptr(&vaddr, i, type) )
             goto fail;
 #else
-      vaddr = (unsigned long)i << L3_PAGETABLE_SHIFT;
+        vaddr = (unsigned long)i << L3_PAGETABLE_SHIFT;
 #endif
         if ( is_guest_l3_slot(i) &&
              unlikely(!get_page_from_l3e(pl3e[i], pfn, d, vaddr)) )
@@ -1246,7 +1246,7 @@
         if (!l4e_has_changed(ol4e, nl4e, _PAGE_PRESENT))
             return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e);
 
-         if ( unlikely(!l3_backptr(&vaddr, pgentry_ptr_to_slot(pl4e), type)) ||
+        if ( unlikely(!l3_backptr(&vaddr, pgentry_ptr_to_slot(pl4e), type)) ||
              unlikely(!get_page_from_l4e(nl4e, pfn, current->domain, vaddr)) )
             return 0;
 
@@ -2270,9 +2270,9 @@
 
 
 int update_grant_va_mapping_pte(unsigned long pte_addr,
-                            l1_pgentry_t _nl1e, 
-                            struct domain *d,
-                            struct vcpu *v)
+                                l1_pgentry_t _nl1e, 
+                                struct domain *d,
+                                struct vcpu *v)
 {
     /* Caller must:
      * . own d's BIGLOCK 
@@ -2872,59 +2872,53 @@
 static inline unsigned int ptwr_eip_stat_hash( unsigned long eip, domid_t id )
 {
     return (((unsigned long) id) ^ eip ^ (eip>>8) ^ (eip>>16) ^ (eip>24)) % 
-       ptwr_eip_buckets;
+        ptwr_eip_buckets;
 }
 
 static void ptwr_eip_stat_inc(u32 *n)
 {
-    (*n)++;
-    if(*n == 0)
-    {
-       (*n)=~0;
-       /* rescale all buckets */
-       int i;
-       for(i=0;i<ptwr_eip_buckets;i++)
-       {
-           int j;
-           for(j=0;j<ptwr_eip_stat_thresholdN;j++)
-               ptwr_eip_stats[i].val[j] = 
-                   (((u64)ptwr_eip_stats[i].val[j])+1)>>1;
-       }
-    }
-}
-
-static void ptwr_eip_stat_update( unsigned long eip, domid_t id, int modified )
-{
-    int i, b;
-
-    i = b = ptwr_eip_stat_hash( eip, id );
+    int i, j;
+
+    if ( ++(*n) != 0 )
+        return;
+
+    *n = ~0;
+
+    /* Re-scale all buckets. */
+    for ( i = 0; i <ptwr_eip_buckets; i++ )
+        for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ )
+            ptwr_eip_stats[i].val[j] >>= 1;
+}
+
+static void ptwr_eip_stat_update(unsigned long eip, domid_t id, int modified)
+{
+    int i, j, b;
+
+    i = b = ptwr_eip_stat_hash(eip, id);
 
     do
     {
-       if (!ptwr_eip_stats[i].eip)
-       { /* doesn't exist */
-           ptwr_eip_stats[i].eip = eip;
-           ptwr_eip_stats[i].id = id;
-           memset(ptwr_eip_stats[i].val,0, sizeof(ptwr_eip_stats[i].val));
-       }
-
-       if (ptwr_eip_stats[i].eip == eip)
-       {
-           int j;
-           for(j=0;j<ptwr_eip_stat_thresholdN;j++)
-           {
-               if(modified <= ptwr_eip_stat_threshold[j])
-               {
-                   break;
-               }
-           }
-           BUG_ON(j>=ptwr_eip_stat_thresholdN);
-           ptwr_eip_stat_inc(&(ptwr_eip_stats[i].val[j]));    
-           return;
-       }
-       i = (i+1) % ptwr_eip_buckets;
-    }
-    while(i!=b);
+        if ( !ptwr_eip_stats[i].eip )
+        {
+            /* doesn't exist */
+            ptwr_eip_stats[i].eip = eip;
+            ptwr_eip_stats[i].id = id;
+            memset(ptwr_eip_stats[i].val,0, sizeof(ptwr_eip_stats[i].val));
+        }
+
+        if ( ptwr_eip_stats[i].eip == eip )
+        {
+            for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ )
+                if ( modified <= ptwr_eip_stat_threshold[j] )
+                    break;
+            BUG_ON(j >= ptwr_eip_stat_thresholdN);
+            ptwr_eip_stat_inc(&ptwr_eip_stats[i].val[j]);
+            return;
+        }
+
+        i = (i+1) % ptwr_eip_buckets;
+    }
+    while ( i != b );
    
     printk("ptwr_eip_stat: too many EIPs in use!\n");
     
@@ -2932,42 +2926,41 @@
     ptwr_eip_stat_reset();
 }
 
-void ptwr_eip_stat_reset()
-{
-    memset( ptwr_eip_stats, 0, sizeof(ptwr_eip_stats));
-}
-
-void ptwr_eip_stat_print()
+void ptwr_eip_stat_reset(void)
+{
+    memset(ptwr_eip_stats, 0, sizeof(ptwr_eip_stats));
+}
+
+void ptwr_eip_stat_print(void)
 {
     struct domain *e;
     domid_t d;
-
-    for_each_domain(e)
-    {
-       int i;
-       d = e->domain_id;
-
-       for(i=0;i<ptwr_eip_buckets;i++)
-       {
-           if ( ptwr_eip_stats[i].eip && ptwr_eip_stats[i].id == d )
-           {
-               int j;
-               printk("D %d  eip %08lx ",
-                      ptwr_eip_stats[i].id, ptwr_eip_stats[i].eip );
-
-               for(j=0;j<ptwr_eip_stat_thresholdN;j++)
-                   printk("<=%u %4u \t",
-                          ptwr_eip_stat_threshold[j],
-                          ptwr_eip_stats[i].val[j] );
-               printk("\n");
-           }   
-       }
+    int i, j;
+
+    for_each_domain( e )
+    {
+        d = e->domain_id;
+
+        for ( i = 0; i < ptwr_eip_buckets; i++ )
+        {
+            if ( ptwr_eip_stats[i].eip && ptwr_eip_stats[i].id != d )
+                continue;
+
+            printk("D %d  eip %08lx ",
+                   ptwr_eip_stats[i].id, ptwr_eip_stats[i].eip);
+
+            for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ )
+                printk("<=%u %4u \t",
+                       ptwr_eip_stat_threshold[j],
+                       ptwr_eip_stats[i].val[j]);
+            printk("\n");
+        }
     }
 }
 
 #else /* PERF_ARRAYS */
 
-#define ptwr_eip_stat_update( eip, id, modified ) ((void)0)
+#define ptwr_eip_stat_update(eip, id, modified) ((void)0)
 
 #endif
 
@@ -3025,8 +3018,8 @@
 /* Flush the given writable p.t. page and write-protect it again. */
 void ptwr_flush(struct domain *d, const int which)
 {
-    unsigned long  pte, *ptep, l1va;
-    l1_pgentry_t  *pl1e;
+    unsigned long l1va;
+    l1_pgentry_t  *pl1e, pte, *ptep;
     l2_pgentry_t  *pl2e;
     unsigned int   modified;
 
@@ -3046,13 +3039,13 @@
         TOGGLE_MODE();
 
     l1va = d->arch.ptwr[which].l1va;
-    ptep = (unsigned long *)&linear_pg_table[l1_linear_offset(l1va)];
+    ptep = (l1_pgentry_t *)&linear_pg_table[l1_linear_offset(l1va)];
 
     /*
      * STEP 1. Write-protect the p.t. page so no more updates can occur.
      */
 
-    if ( unlikely(__get_user(pte, ptep)) )
+    if ( unlikely(__get_user(pte.l1, &ptep->l1)) )
     {
         MEM_LOG("ptwr: Could not read pte at %p", ptep);
         /*
@@ -3062,8 +3055,8 @@
         BUG();
     }
     PTWR_PRINTK("[%c] disconnected_l1va at %p is %lx\n",
-                PTWR_PRINT_WHICH, ptep, pte);
-    pte &= ~_PAGE_RW;
+                PTWR_PRINT_WHICH, ptep, pte.l1);
+    l1e_remove_flags(pte, _PAGE_RW);
 
     /* Write-protect the p.t. page in the guest page table. */
     if ( unlikely(__put_user(pte, ptep)) )
@@ -3080,7 +3073,7 @@
     /* NB. INVLPG is a serialising instruction: flushes pending updates. */
     flush_tlb_one_mask(d->cpumask, l1va);
     PTWR_PRINTK("[%c] disconnected_l1va at %p now %lx\n",
-                PTWR_PRINT_WHICH, ptep, pte);
+                PTWR_PRINT_WHICH, ptep, pte.l1);
 
     /*
      * STEP 2. Validate any modified PTEs.
@@ -3247,7 +3240,7 @@
 
 /* Write page fault handler: check if guest is trying to modify a PTE. */
 int ptwr_do_page_fault(struct domain *d, unsigned long addr, 
-                      struct cpu_user_regs *regs)
+                       struct cpu_user_regs *regs)
 {
     unsigned long    pfn;
     struct pfn_info *page;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] This patch fixes the booting problems on machines with >4GB memory, and, Xen patchbot -unstable <=