|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/hvm: No need to arch_set_info_guest() before restoring per-vcpu HVM state.
# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1327227603 0
# Node ID eca719b621a1201528bfec25fb1786ec21c0c9d3
# Parent 80fdf2182bc62ca358ba2f1a3513b47a4f8d9dfd
x86/hvm: No need to arch_set_info_guest() before restoring per-vcpu HVM state.
Signed-off-by: Keir Fraser <keir@xxxxxxx>
---
diff -r 80fdf2182bc6 -r eca719b621a1 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Sat Jan 21 17:15:40 2012 +0000
+++ b/xen/arch/x86/domain.c Sun Jan 22 10:20:03 2012 +0000
@@ -709,13 +709,7 @@
#undef xen_vcpu_guest_context
#endif
-/*
- * This is called by do_domctl(XEN_DOMCTL_setvcpucontext, ...), boot_vcpu(),
- * and hvm_load_cpu_ctxt().
- *
- * Note that for a HVM guest NULL may be passed for the context pointer,
- * meaning "use current values".
- */
+/* Called by XEN_DOMCTL_setvcpucontext and VCPUOP_initialise. */
int arch_set_info_guest(
struct vcpu *v, vcpu_guest_context_u c)
{
@@ -735,7 +729,7 @@
#else
#define c(fld) (c.nat->fld)
#endif
- flags = c.nat ? c(flags) : v->arch.vgc_flags;
+ flags = c(flags);
if ( !is_hvm_vcpu(v) )
{
@@ -791,28 +785,25 @@
v->arch.vgc_flags = flags;
- if ( c.nat )
+ memcpy(v->arch.fpu_ctxt, &c.nat->fpu_ctxt, sizeof(c.nat->fpu_ctxt));
+ if ( !compat )
{
- memcpy(v->arch.fpu_ctxt, &c.nat->fpu_ctxt, sizeof(c.nat->fpu_ctxt));
- if ( !compat )
- {
- memcpy(&v->arch.user_regs, &c.nat->user_regs,
sizeof(c.nat->user_regs));
- if ( !is_hvm_vcpu(v) )
- memcpy(v->arch.pv_vcpu.trap_ctxt, c.nat->trap_ctxt,
- sizeof(c.nat->trap_ctxt));
- }
+ memcpy(&v->arch.user_regs, &c.nat->user_regs,
sizeof(c.nat->user_regs));
+ if ( !is_hvm_vcpu(v) )
+ memcpy(v->arch.pv_vcpu.trap_ctxt, c.nat->trap_ctxt,
+ sizeof(c.nat->trap_ctxt));
+ }
#ifdef CONFIG_COMPAT
- else
- {
- XLAT_cpu_user_regs(&v->arch.user_regs, &c.cmp->user_regs);
- for ( i = 0; i < ARRAY_SIZE(c.cmp->trap_ctxt); ++i )
- XLAT_trap_info(v->arch.pv_vcpu.trap_ctxt + i,
- c.cmp->trap_ctxt + i);
- }
+ else
+ {
+ XLAT_cpu_user_regs(&v->arch.user_regs, &c.cmp->user_regs);
+ for ( i = 0; i < ARRAY_SIZE(c.cmp->trap_ctxt); ++i )
+ XLAT_trap_info(v->arch.pv_vcpu.trap_ctxt + i,
+ c.cmp->trap_ctxt + i);
+ }
#endif
- for ( i = 0; i < ARRAY_SIZE(v->arch.debugreg); ++i )
- v->arch.debugreg[i] = c(debugreg[i]);
- }
+ for ( i = 0; i < ARRAY_SIZE(v->arch.debugreg); ++i )
+ v->arch.debugreg[i] = c(debugreg[i]);
v->arch.user_regs.eflags |= 2;
diff -r 80fdf2182bc6 -r eca719b621a1 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Sat Jan 21 17:15:40 2012 +0000
+++ b/xen/arch/x86/hvm/hvm.c Sun Jan 22 10:20:03 2012 +0000
@@ -670,7 +670,7 @@
static int hvm_load_cpu_ctxt(struct domain *d, hvm_domain_context_t *h)
{
- int vcpuid, rc;
+ int vcpuid;
struct vcpu *v;
struct hvm_hw_cpu ctxt;
struct segment_register seg;
@@ -684,11 +684,6 @@
return -EINVAL;
}
- /* Need to init this vcpu before loading its contents */
- rc = boot_vcpu(d, vcpuid, NULL);
- if ( (rc != 0) && (rc != -EEXIST) )
- return rc;
-
if ( hvm_load_entry(CPU, h, &ctxt) != 0 )
return -EINVAL;
diff -r 80fdf2182bc6 -r eca719b621a1 xen/common/compat/domain.c
--- a/xen/common/compat/domain.c Sat Jan 21 17:15:40 2012 +0000
+++ b/xen/common/compat/domain.c Sun Jan 22 10:20:03 2012 +0000
@@ -46,7 +46,9 @@
break;
}
- rc = boot_vcpu(d, vcpuid, cmp_ctxt);
+ domain_lock(d);
+ rc = v->is_initialised ? -EEXIST : arch_set_info_guest(v, cmp_ctxt);
+ domain_unlock(d);
xfree(cmp_ctxt);
break;
diff -r 80fdf2182bc6 -r eca719b621a1 xen/common/domain.c
--- a/xen/common/domain.c Sat Jan 21 17:15:40 2012 +0000
+++ b/xen/common/domain.c Sun Jan 22 10:20:03 2012 +0000
@@ -778,18 +778,6 @@
domain_unpause(d);
}
-int boot_vcpu(struct domain *d, int vcpuid, vcpu_guest_context_u ctxt)
-{
- struct vcpu *v = d->vcpu[vcpuid];
- int rc;
-
- domain_lock(d);
- rc = v->is_initialised ? -EEXIST : arch_set_info_guest(v, ctxt);
- domain_unlock(d);
-
- return rc;
-}
-
void vcpu_reset(struct vcpu *v)
{
struct domain *d = v->domain;
@@ -847,7 +835,9 @@
return -EFAULT;
}
- rc = boot_vcpu(d, vcpuid, ctxt);
+ domain_lock(d);
+ rc = v->is_initialised ? -EEXIST : arch_set_info_guest(v, ctxt);
+ domain_unlock(d);
free_vcpu_guest_context(ctxt);
break;
diff -r 80fdf2182bc6 -r eca719b621a1 xen/include/xen/domain.h
--- a/xen/include/xen/domain.h Sat Jan 21 17:15:40 2012 +0000
+++ b/xen/include/xen/domain.h Sun Jan 22 10:20:03 2012 +0000
@@ -12,8 +12,6 @@
struct vcpu *alloc_vcpu(
struct domain *d, unsigned int vcpu_id, unsigned int cpu_id);
-int boot_vcpu(
- struct domain *d, int vcpuid, vcpu_guest_context_u ctxt);
struct vcpu *alloc_dom0_vcpu0(void);
void vcpu_reset(struct vcpu *v);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |