[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/hvm: make sure stdvga cache cannot be re-enabled
On 05/11/15 12:17, Paul Durrant wrote: > As soon as the cache is disabled, it will become out-of-sync with the > VGA device model and since no mechanism exists to acquire current VRAM > state from the device model, re-enabling it leads to stale data > being seen by the guest. > > The problem can be seen by deliberately crashing a Windows guest; the > BSOD output is corrupted. > > This patch changes the existing 'cache' boolean in hvm_hw_stdvga into a > tri-state enum and only allows the state to move from 'uninitialized' to > 'enabled'. Once the cache state becomes 'disabled' it will remain so for > the lifetime of the VM. Should identify that this is a regression introduced by c/s 3bbaaec09b1b942f5624dee176da6e416d31f982 > > Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > Cc: Keir Fraser <keir@xxxxxxx> > Cc: Jan Beulich <jbeulich@xxxxxxxx> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, with one small issue which could be fixed on commit... > --- > xen/arch/x86/hvm/save.c | 2 +- > xen/arch/x86/hvm/stdvga.c | 50 > ++++++++++++++++++++++++++++++++------------ > xen/include/asm-x86/hvm/io.h | 8 ++++++- > 3 files changed, 45 insertions(+), 15 deletions(-) > > diff --git a/xen/arch/x86/hvm/save.c b/xen/arch/x86/hvm/save.c > index 4660beb..f7d4999 100644 > --- a/xen/arch/x86/hvm/save.c > +++ b/xen/arch/x86/hvm/save.c > @@ -73,7 +73,7 @@ int arch_hvm_load(struct domain *d, struct hvm_save_header > *hdr) > d->arch.hvm_domain.sync_tsc = rdtsc(); > > /* VGA state is not saved/restored, so we nobble the cache. */ > - d->arch.hvm_domain.stdvga.cache = 0; > + d->arch.hvm_domain.stdvga.cache = STDVGA_CACHE_DISABLED; > > return 0; > } > diff --git a/xen/arch/x86/hvm/stdvga.c b/xen/arch/x86/hvm/stdvga.c > index 02a97f9..246c629 100644 > --- a/xen/arch/x86/hvm/stdvga.c > +++ b/xen/arch/x86/hvm/stdvga.c > @@ -101,6 +101,37 @@ static void vram_put(struct hvm_hw_stdvga *s, void *p) > unmap_domain_page(p); > } > > +static void stdvga_try_cache_enable(struct hvm_hw_stdvga *s) > +{ > + /* > + * Caching mode can only be enabled if the the cache has > + * never been used before. As soon as it is disabled, it will > + * become out-of-sync with the VGA device model and since no > + * mechanism exists to acquire current VRAM state from the > + * device model, re-enabling it would lead to stale data being > + * seen by the guest. > + */ > + if ( s->cache != STDVGA_CACHE_UNINITIALIZED ) > + return; > + > + gdprintk(XENLOG_INFO, "entering caching mode\n"); > + s->cache = STDVGA_CACHE_ENABLED; > +} > + > +static void stdvga_cache_disable(struct hvm_hw_stdvga *s) > +{ > + if ( s->cache != STDVGA_CACHE_ENABLED ) > + return; > + > + gdprintk(XENLOG_INFO, "leaving caching mode\n"); > + s->cache = STDVGA_CACHE_DISABLED; > +} > + > +static bool_t stdvga_cache_is_enabled(struct hvm_hw_stdvga *s) const struct hvm_hw_stdvga *s ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |