|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] xen/dom0: Fix latent dom0 construction bugs on all architectures
commit 0075bc1f02c389c5bb84cbffdc27dc9b53699bca
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Mon Oct 16 13:20:00 2017 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Oct 17 14:47:05 2017 +0100
xen/dom0: Fix latent dom0 construction bugs on all architectures
* x86 PV and ARM dom0's must not clear _VPF_down from v->pause_flags until
all state is actually set up. As it currently stands, d0v0 is eligible
for
scheduling before its registers have been set. This is latent as we also
hold a systemcontroller pause reference at the time which prevents d0
from
being scheduled.
* x86 PVH previously was not setting v->is_initialised for d0v0, despite
setting the vcpu running eventually. Therefore, a later
VCPUOP_initialise
hypercall will modify state under the feet of the running vcpu. This is
latent as PVH dom0 construction don't yet function.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Release-acked-by: Julien Grall <julien.grall@xxxxxxxxxx>
---
xen/arch/arm/domain_build.c | 6 +++---
xen/arch/x86/dom0_build.c | 13 +++++++++++--
xen/arch/x86/hvm/dom0_build.c | 1 +
xen/arch/x86/pv/dom0_build.c | 6 +++---
4 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 4636b17..bf29299 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -2197,9 +2197,6 @@ int construct_dom0(struct domain *d)
discard_initial_modules();
- v->is_initialised = 1;
- clear_bit(_VPF_down, &v->pause_flags);
-
memset(regs, 0, sizeof(*regs));
regs->pc = (register_t)kinfo.entry;
@@ -2247,6 +2244,9 @@ int construct_dom0(struct domain *d)
vcpu_switch_to_aarch64_mode(d->vcpu[i]);
}
+ v->is_initialised = 1;
+ clear_bit(_VPF_down, &v->pause_flags);
+
return 0;
}
diff --git a/xen/arch/x86/dom0_build.c b/xen/arch/x86/dom0_build.c
index e4bffd5..bf992fe 100644
--- a/xen/arch/x86/dom0_build.c
+++ b/xen/arch/x86/dom0_build.c
@@ -466,6 +466,8 @@ int __init construct_dom0(struct domain *d, const module_t
*image,
void *(*bootstrap_map)(const module_t *),
char *cmdline)
{
+ int rc;
+
/* Sanity! */
BUG_ON(d->domain_id != 0);
BUG_ON(d->vcpu[0] == NULL);
@@ -481,8 +483,15 @@ int __init construct_dom0(struct domain *d, const module_t
*image,
}
#endif
- return (is_hvm_domain(d) ? dom0_construct_pvh : dom0_construct_pv)
- (d, image, image_headroom, initrd,bootstrap_map, cmdline);
+ rc = (is_hvm_domain(d) ? dom0_construct_pvh : dom0_construct_pv)
+ (d, image, image_headroom, initrd, bootstrap_map, cmdline);
+ if ( rc )
+ return rc;
+
+ /* Sanity! */
+ BUG_ON(!d->vcpu[0]->is_initialised);
+
+ return 0;
}
/*
diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index e8f746c..a67071c 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c
@@ -614,6 +614,7 @@ static int __init pvh_setup_cpus(struct domain *d, paddr_t
entry,
update_domain_wallclock_time(d);
+ v->is_initialised = 1;
clear_bit(_VPF_down, &v->pause_flags);
return 0;
diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index dcbee43..8ad7e3d 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -847,9 +847,6 @@ int __init dom0_construct_pv(struct domain *d,
update_domain_wallclock_time(d);
- v->is_initialised = 1;
- clear_bit(_VPF_down, &v->pause_flags);
-
/*
* Initial register values:
* DS,ES,FS,GS = FLAT_KERNEL_DS
@@ -883,6 +880,9 @@ int __init dom0_construct_pv(struct domain *d,
if ( d->domain_id == hardware_domid )
iommu_hwdom_init(d);
+ v->is_initialised = 1;
+ clear_bit(_VPF_down, &v->pause_flags);
+
return 0;
out:
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |