aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-22 15:57:19 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-22 15:57:19 +0100
commit59ec6ab1b674da6f7ed326c0931ca11b84494fad (patch)
tree99a0d7c6e9a669efed83ffb9423eb824f22e3c13
parent23b812f67fa7ffd933e7550a3b645e0d012e03c6 (diff)
downloadxen-59ec6ab1b674da6f7ed326c0931ca11b84494fad.tar.gz
xen-59ec6ab1b674da6f7ed326c0931ca11b84494fad.tar.bz2
xen-59ec6ab1b674da6f7ed326c0931ca11b84494fad.zip
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@eu.citrix.com>
-rw-r--r--tools/ioemu/hw/vga.c83
1 files changed, 42 insertions, 41 deletions
diff --git a/tools/ioemu/hw/vga.c b/tools/ioemu/hw/vga.c
index 59b143c584..eb5b969caa 100644
--- a/tools/ioemu/hw/vga.c
+++ b/tools/ioemu/hw/vga.c
@@ -1511,51 +1511,52 @@ static void vga_draw_graphic(VGAState *s, int full_update)
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);
+ 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;
+ }
- {
- 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);
+ 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;