From: Keir Fraser Date: Fri, 23 May 2008 10:46:36 +0000 (+0100) Subject: x86: Fixes to VLAPIC and S3 state resets. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14207^2~48 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0f6dc9bea66cd1ae85e1bd5bcdce53faca1115b1;p=xen.git x86: Fixes to VLAPIC and S3 state resets. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d0d3f03ffb..1d21556204 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -825,8 +825,15 @@ int arch_set_info_guest( void arch_vcpu_reset(struct vcpu *v) { - destroy_gdt(v); - vcpu_destroy_pagetables(v); + if ( !is_hvm_vcpu(v) ) + { + destroy_gdt(v); + vcpu_destroy_pagetables(v); + } + else + { + vcpu_end_shutdown_deferral(v); + } } /* diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 769103ef52..5052da58d8 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2123,6 +2123,8 @@ void hvm_vcpu_reset_state(struct vcpu *v, uint16_t cs, uint16_t ip) v->domain->vcpu[0]->arch.hvm_vcpu.cache_tsc_offset; hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset); + paging_update_paging_modes(v); + v->arch.flags |= TF_kernel_mode; v->is_initialised = 1; clear_bit(_VPF_down, &v->pause_flags); diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index 0c3913ba36..5efff29d66 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -22,18 +22,19 @@ #include #include #include +#include #include -#include #include #include -#include -#include -#include #include #include +#include #include +#include +#include +#include +#include #include -#include #include #include @@ -259,6 +260,7 @@ static void vlapic_init_action(unsigned long _vcpu) { struct vcpu *v = (struct vcpu *)_vcpu; struct domain *d = v->domain; + bool_t fpu_initialised; /* If the VCPU is not on its way down we have nothing to do. */ if ( !test_bit(_VPF_down, &v->pause_flags) ) @@ -270,15 +272,12 @@ static void vlapic_init_action(unsigned long _vcpu) return; } + /* Reset necessary VCPU state. This does not include FPU state. */ domain_lock(d); - - /* Paranoia makes us re-assert VPF_down under the domain lock. */ - set_bit(_VPF_down, &v->pause_flags); - v->is_initialised = 0; - clear_bit(_VPF_blocked, &v->pause_flags); - + fpu_initialised = v->fpu_initialised; + vcpu_reset(v); + v->fpu_initialised = fpu_initialised; vlapic_reset(vcpu_vlapic(v)); - domain_unlock(d); vcpu_unpause(v); diff --git a/xen/common/domain.c b/xen/common/domain.c index 1113f3d49a..2965553ed6 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -637,7 +637,7 @@ void vcpu_reset(struct vcpu *v) { struct domain *d = v->domain; - domain_pause(d); + vcpu_pause(v); domain_lock(d); arch_vcpu_reset(v); @@ -653,7 +653,7 @@ void vcpu_reset(struct vcpu *v) clear_bit(_VPF_blocked, &v->pause_flags); domain_unlock(v->domain); - domain_unpause(d); + vcpu_unpause(v); }