|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/hvm: do not register hpet mmio during s3 cycle
Do it once at domain creation (hpet_init).
Sleep -> Resume cycles will end up crashing an HVM guest with hpet as
the sequence during resume takes the path:
-> hvm_s3_suspend
-> hpet_reset
-> hpet_deinit
-> hpet_init
-> register_mmio_handler
-> hvm_next_io_handler
register_mmio_handler will use a new io handler each time, until
eventually it reaches NR_IO_HANDLERS, then hvm_next_io_handler calls
domain_crash.
Signed-off-by: Eric Chanudet <chanudete@xxxxxxxxxxxx>
---
xen/arch/x86/hvm/hpet.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c
index 3ea895a0fb..7635f1a644 100644
--- a/xen/arch/x86/hvm/hpet.c
+++ b/xen/arch/x86/hvm/hpet.c
@@ -635,14 +635,10 @@ static int hpet_load(struct domain *d,
hvm_domain_context_t *h)
HVM_REGISTER_SAVE_RESTORE(HPET, hpet_save, hpet_load, 1, HVMSR_PER_DOM);
-void hpet_init(struct domain *d)
+static void hpet_set(HPETState *h)
{
- HPETState *h = domain_vhpet(d);
int i;
- if ( !has_vhpet(d) )
- return;
-
memset(h, 0, sizeof(HPETState));
rwlock_init(&h->lock);
@@ -668,11 +664,30 @@ void hpet_init(struct domain *d)
h->hpet.comparator64[i] = ~0ULL;
h->pt[i].source = PTSRC_isa;
}
+}
+void hpet_init(struct domain *d)
+{
+ HPETState *h = domain_vhpet(d);
+
+ if ( !has_vhpet(d) )
+ return;
+
+ hpet_set(h);
register_mmio_handler(d, &hpet_mmio_ops);
d->arch.hvm_domain.params[HVM_PARAM_HPET_ENABLED] = 1;
}
+void hpet_reinit(struct domain *d)
+{
+ HPETState *h = domain_vhpet(d);
+
+ if ( !has_vhpet(d) )
+ return;
+
+ hpet_set(h);
+}
+
void hpet_deinit(struct domain *d)
{
int i;
@@ -698,7 +713,7 @@ void hpet_deinit(struct domain *d)
void hpet_reset(struct domain *d)
{
hpet_deinit(d);
- hpet_init(d);
+ hpet_reinit(d);
}
/*
--
2.14.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |