aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/viridian.c
diff options
context:
space:
mode:
authorPaul Durrant <paul.durrant@citrix.com>2011-11-25 15:30:41 +0000
committerPaul Durrant <paul.durrant@citrix.com>2011-11-25 15:30:41 +0000
commit26ddefddf050f692444bde22226f9726556c5a20 (patch)
tree23ec0efce002770e08d3d6ec6b47de7707c188f6 /xen/arch/x86/hvm/viridian.c
parent5e0f79980e4ace10de74923f604ba523ede0ef90 (diff)
downloadxen-26ddefddf050f692444bde22226f9726556c5a20.tar.gz
xen-26ddefddf050f692444bde22226f9726556c5a20.tar.bz2
xen-26ddefddf050f692444bde22226f9726556c5a20.zip
Fix save/restore for HVM domains with viridian=1
xc_domain_save/restore currently pay no attention to HVM_PARAM_VIRIDIAN which results in an HVM domain running a recent version on Windows (post-Vista) locking up on a domain restore due to EOIs (done via a viridian MSR write) being silently dropped. This patch adds an extra save entry for the viridian parameter and also adds code in the viridian kernel module to catch attempted use of viridian functionality when the HVM parameter has not been set. Signed-off-by: Paul Durrant <paul.durrant@citrix.com> Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/viridian.c')
-rw-r--r--xen/arch/x86/hvm/viridian.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c
index 6d3b899d2e..6a7067c835 100644
--- a/xen/arch/x86/hvm/viridian.c
+++ b/xen/arch/x86/hvm/viridian.c
@@ -206,8 +206,11 @@ int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
struct vcpu *v = current;
struct domain *d = v->domain;
- if ( !is_viridian_domain(d) )
+ if ( !is_viridian_domain(d) ) {
+ gdprintk(XENLOG_WARNING, "%s: %d not a viridian domain\n", __func__,
+ d->domain_id);
return 0;
+ }
switch ( idx )
{
@@ -271,8 +274,11 @@ int rdmsr_viridian_regs(uint32_t idx, uint64_t *val)
struct vcpu *v = current;
struct domain *d = v->domain;
- if ( !is_viridian_domain(d) )
+ if ( !is_viridian_domain(d) ) {
+ gdprintk(XENLOG_WARNING, "%s: %d not a viridian domain\n", __func__,
+ d->domain_id);
return 0;
+ }
switch ( idx )
{
@@ -411,6 +417,8 @@ static int viridian_load_domain_ctxt(struct domain *d, hvm_domain_context_t *h)
if ( hvm_load_entry(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
return -EINVAL;
+ ASSERT(is_viridian_domain(d));
+
d->arch.hvm_domain.viridian.hypercall_gpa.raw = ctxt.hypercall_gpa;
d->arch.hvm_domain.viridian.guest_os_id.raw = ctxt.guest_os_id;
@@ -455,6 +463,8 @@ static int viridian_load_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h)
if ( hvm_load_entry(VIRIDIAN_VCPU, h, &ctxt) != 0 )
return -EINVAL;
+ ASSERT(is_viridian_domain(d));
+
v->arch.hvm_vcpu.viridian.apic_assist.raw = ctxt.apic_assist;
return 0;