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] [xen-unstable] ioemu: fix vram tracking when !s->lfb_add

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] ioemu: fix vram tracking when !s->lfb_addr
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 23 Jul 2008 08:50:38 -0700
Delivery-date: Wed, 23 Jul 2008 08:52:06 -0700
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/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 Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1216738639 -3600
# Node ID a47770d74b697abfe530882881e80612f1e8346e
# Parent  a637c023e066e972d03e95b1359786e72f32d2be
ioemu: fix vram tracking when !s->lfb_addr

When we don't have an LFB (standard VGA), we can not and do not need
vram tracking at all since we always get explicit dirtying.

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
 tools/ioemu/hw/vga.c |   89 +++++++++++++++++++++++++--------------------------
 1 files changed, 45 insertions(+), 44 deletions(-)

diff -r a637c023e066 -r a47770d74b69 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Tue Jul 22 13:36:56 2008 +0100
+++ b/tools/ioemu/hw/vga.c      Tue Jul 22 15:57:19 2008 +0100
@@ -1511,51 +1511,52 @@ static void vga_draw_graphic(VGAState *s
            width, height, v, line_offset, s->cr[9], s->cr[0x17], 
s->line_compare, s->sr[0x01]);
 #endif
 
-    if (height - 1 > s->line_compare || multi_run || (s->cr[0x17] & 3) != 3
-            || !s->lfb_addr) {
-        /* Tricky things happen, just track all video memory */
-        start = 0;
-        end = s->vram_size;
-    } else {
-        /* Tricky things won't have any effect, i.e. we are in the very simple
-         * (and very usual) case of a linear buffer. */
-        /* use page table dirty bit tracking for the LFB plus border */
-        start = (s->start_addr * 4) & TARGET_PAGE_MASK;
-        end = ((s->start_addr * 4 + height * line_offset) + TARGET_PAGE_SIZE - 
1) & TARGET_PAGE_MASK;
-    }
-
-    for (y = 0 ; y < start; y += TARGET_PAGE_SIZE)
-        /* We will not read that anyway. */
-        cpu_physical_memory_set_dirty(s->vram_offset + y);
-
-    {
-        unsigned long npages = (end - y) / TARGET_PAGE_SIZE;
-        const int width = sizeof(unsigned long) * 8;
-        unsigned long bitmap[(npages + width - 1) / width];
-        int err;
-
-        if (!(err = xc_hvm_track_dirty_vram(xc_handle, domid,
-                    (s->lfb_addr + y) / TARGET_PAGE_SIZE, npages, bitmap))) {
-            int i, j;
-            for (i = 0; i < sizeof(bitmap) / sizeof(*bitmap); i++) {
-                unsigned long map = bitmap[i];
-                for (j = i * width; map && j < npages; map >>= 1, j++)
-                    if (map & 1)
-                        cpu_physical_memory_set_dirty(s->vram_offset + y
-                            + j * TARGET_PAGE_SIZE);
+    if (s->lfb_addr) {
+        if (height - 1 > s->line_compare || multi_run || (s->cr[0x17] & 3) != 
3) {
+            /* Tricky things happen, just track all video memory */
+            start = 0;
+            end = s->vram_size;
+        } else {
+            /* Tricky things won't have any effect, i.e. we are in the very 
simple
+             * (and very usual) case of a linear buffer. */
+            /* use page table dirty bit tracking for the LFB plus border */
+            start = (s->start_addr * 4) & TARGET_PAGE_MASK;
+            end = ((s->start_addr * 4 + height * line_offset) + 
TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
+        }
+
+        for (y = 0 ; y < start; y += TARGET_PAGE_SIZE)
+            /* We will not read that anyway. */
+            cpu_physical_memory_set_dirty(s->vram_offset + y);
+
+        {
+            unsigned long npages = (end - y) / TARGET_PAGE_SIZE;
+            const int width = sizeof(unsigned long) * 8;
+            unsigned long bitmap[(npages + width - 1) / width];
+            int err;
+
+            if (!(err = xc_hvm_track_dirty_vram(xc_handle, domid,
+                        (s->lfb_addr + y) / TARGET_PAGE_SIZE, npages, 
bitmap))) {
+                int i, j;
+                for (i = 0; i < sizeof(bitmap) / sizeof(*bitmap); i++) {
+                    unsigned long map = bitmap[i];
+                    for (j = i * width; map && j < npages; map >>= 1, j++)
+                        if (map & 1)
+                            cpu_physical_memory_set_dirty(s->vram_offset + y
+                                + j * TARGET_PAGE_SIZE);
+                }
+                y += npages * TARGET_PAGE_SIZE;
+            } else {
+                /* ENODATA just means we have changed mode and will succeed
+                 * next time */
+                if (err != -ENODATA)
+                    fprintf(stderr, "track_dirty_vram(%lx, %lx) failed 
(%d)\n", s->lfb_addr + y, npages, err);
             }
-            y += npages * TARGET_PAGE_SIZE;
-        } else {
-            /* ENODATA just means we have changed mode and will succeed
-             * next time */
-            if (err != -ENODATA)
-                fprintf(stderr, "track_dirty_vram(%lx, %lx) failed (%d)\n", 
s->lfb_addr + y, npages, err);
-        }
-    }
-
-    for ( ; y < s->vram_size; y += TARGET_PAGE_SIZE)
-        /* We will not read that anyway. */
-        cpu_physical_memory_set_dirty(s->vram_offset + y);
+        }
+
+        for ( ; y < s->vram_size; y += TARGET_PAGE_SIZE)
+            /* We will not read that anyway. */
+            cpu_physical_memory_set_dirty(s->vram_offset + y);
+    }
 
     addr1 = (s->start_addr * 4);
     bwidth = (width * bits + 7) / 8;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] ioemu: fix vram tracking when !s->lfb_addr, Xen patchbot-unstable <=