]> xenbits.xensource.com Git - xen.git/commitdiff
x86/hvm: unconditionally buffer writes to VRAM
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 16 Jul 2015 09:50:41 +0000 (11:50 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 16 Jul 2015 09:50:41 +0000 (11:50 +0200)
When c/s 3bbaaec09 "unify stdvga mmio intercept with standard mmio
intercept" was added, a small semantic change was made. Prior to
this patch the hypervisor unconditionally sent all guest writes
to the VGA aperture as buffered ioreqs, whereas after the patch it
only does this when the VGA model is in 'stdvga' mode (sequencer
register #7 == 0).

When installing Windows 7 (64-bit) using the default QEMU VGA model
(== cirrus), Windows leaves 'stdvga' mode early in boot and hence
all further writes to the VGA aperture are done using synchronous
ioreqs which slows down boot by several orders of magnitude (thanks
to the elaborate splash screen that Windows presents). This can be
viewed as a regression and so this patch re-instates previous
buffering behaviour.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Tested-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper@citrix.com>
xen/arch/x86/hvm/stdvga.c

index 6d22b224bb15a8bdb1ea65a0b7e948bdc304034d..f50bff7511f179795075dcc1aa2ad3d13c53bed6 100644 (file)
@@ -441,7 +441,7 @@ static int stdvga_mem_write(const struct hvm_io_handler *handler,
     };
     struct hvm_ioreq_server *srv;
 
-    if ( !s->cache )
+    if ( !s->cache || !s->stdvga )
         goto done;
 
     /* Intercept mmio write */
@@ -503,9 +503,6 @@ static bool_t stdvga_mem_accept(const struct hvm_io_handler *handler,
 
     spin_lock(&s->lock);
 
-    if ( !s->stdvga )
-        goto reject;
-
     if ( p->dir == IOREQ_WRITE && p->count > 1 )
     {
         /*
@@ -526,7 +523,7 @@ static bool_t stdvga_mem_accept(const struct hvm_io_handler *handler,
 
         goto reject;
     }
-    else if ( p->dir == IOREQ_READ && !s->cache )
+    else if ( p->dir == IOREQ_READ && (!s->cache || !s->stdvga) )
         goto reject;
 
     /* s->lock intentionally held */