# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1279629737 -3600
# Node ID 6bebaf40e9250020c4747b541b190bdc78f1eff0
# Parent 6279786d48f263816b30d0d901347e867f575070
hvmloader: clear the xenbus event-channel when we're done with it.
Otherwise a later xenbus client that naively waits for the rising edge
could get stuck.
Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
---
tools/firmware/hvmloader/util.c | 30 ++++++++++++++++++++----------
tools/firmware/hvmloader/util.h | 3 +++
tools/firmware/hvmloader/xenbus.c | 14 ++++++++++----
3 files changed, 33 insertions(+), 14 deletions(-)
diff -r 6279786d48f2 -r 6bebaf40e925 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c Tue Jul 20 11:26:20 2010 +0100
+++ b/tools/firmware/hvmloader/util.c Tue Jul 20 13:42:17 2010 +0100
@@ -587,10 +587,28 @@ struct hvm_info_table *get_hvm_info_tabl
return table;
}
+struct shared_info *get_shared_info(void)
+{
+ static struct shared_info *shared_info = NULL;
+ struct xen_add_to_physmap xatp;
+
+ if ( shared_info != NULL )
+ return shared_info;
+
+ xatp.domid = DOMID_SELF;
+ xatp.space = XENMAPSPACE_shared_info;
+ xatp.idx = 0;
+ xatp.gpfn = 0xfffffu;
+ shared_info = (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
+ if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
+ BUG();
+
+ return shared_info;
+}
+
uint16_t get_cpu_mhz(void)
{
- struct xen_add_to_physmap xatp;
- struct shared_info *shared_info = (struct shared_info *)0xfffff000;
+ struct shared_info *shared_info = get_shared_info();
struct vcpu_time_info *info = &shared_info->vcpu_info[0].time;
uint64_t cpu_khz;
uint32_t tsc_to_nsec_mul, version;
@@ -599,14 +617,6 @@ uint16_t get_cpu_mhz(void)
static uint16_t cpu_mhz;
if ( cpu_mhz != 0 )
return cpu_mhz;
-
- /* Map shared-info page. */
- xatp.domid = DOMID_SELF;
- xatp.space = XENMAPSPACE_shared_info;
- xatp.idx = 0;
- xatp.gpfn = (unsigned long)shared_info >> 12;
- if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
- BUG();
/* Get a consistent snapshot of scale factor (multiplier and shift). */
do {
diff -r 6279786d48f2 -r 6bebaf40e925 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h Tue Jul 20 11:26:20 2010 +0100
+++ b/tools/firmware/hvmloader/util.h Tue Jul 20 13:42:17 2010 +0100
@@ -68,6 +68,9 @@ void pci_write(uint32_t devfn, uint32_t
#define pci_writeb(devfn, reg, val) (pci_write(devfn, reg, 1, (uint8_t) val))
#define pci_writew(devfn, reg, val) (pci_write(devfn, reg, 2, (uint16_t)val))
#define pci_writel(devfn, reg, val) (pci_write(devfn, reg, 4, (uint32_t)val))
+
+/* Get a pointer to the shared-info page */
+struct shared_info *get_shared_info(void);
/* Get CPU speed in MHz. */
uint16_t get_cpu_mhz(void);
diff -r 6279786d48f2 -r 6bebaf40e925 tools/firmware/hvmloader/xenbus.c
--- a/tools/firmware/hvmloader/xenbus.c Tue Jul 20 11:26:20 2010 +0100
+++ b/tools/firmware/hvmloader/xenbus.c Tue Jul 20 13:42:17 2010 +0100
@@ -53,14 +53,20 @@ void xenbus_setup(void)
(unsigned long) rings, (unsigned long) event);
}
-/* Reset the xenbus connection so the next kernel can start again.
- * We zero out the whole ring -- the backend can handle this, and it's
- * not going to surprise any frontends since it's equivalent to never
- * having used the rings. */
+/* Reset the xenbus connection so the next kernel can start again. */
void xenbus_shutdown(void)
{
ASSERT(rings != NULL);
+
+ /* We zero out the whole ring -- the backend can handle this, and it's
+ * not going to surprise any frontends since it's equivalent to never
+ * having used the rings. */
memset(rings, 0, sizeof *rings);
+
+ /* Clear the xenbus event-channel too */
+ get_shared_info()->evtchn_pending[event / sizeof (unsigned long)]
+ &= ~(1UL << ((event % sizeof (unsigned long))));
+
rings = NULL;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|