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);
+ }
}
/*
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);
#include <xen/types.h>
#include <xen/mm.h>
#include <xen/xmalloc.h>
+#include <xen/domain.h>
#include <xen/domain_page.h>
-#include <asm/page.h>
#include <xen/event.h>
#include <xen/trace.h>
-#include <asm/hvm/hvm.h>
-#include <asm/hvm/io.h>
-#include <asm/hvm/support.h>
#include <xen/lib.h>
#include <xen/sched.h>
+#include <xen/numa.h>
#include <asm/current.h>
+#include <asm/page.h>
+#include <asm/hvm/hvm.h>
+#include <asm/hvm/io.h>
+#include <asm/hvm/support.h>
#include <asm/hvm/vmx/vmx.h>
-#include <xen/numa.h>
#include <public/hvm/ioreq.h>
#include <public/hvm/params.h>
{
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) )
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);
{
struct domain *d = v->domain;
- domain_pause(d);
+ vcpu_pause(v);
domain_lock(d);
arch_vcpu_reset(v);
clear_bit(_VPF_blocked, &v->pause_flags);
domain_unlock(v->domain);
- domain_unpause(d);
+ vcpu_unpause(v);
}