diff options
author | Michael Brown | 2015-06-30 18:06:58 +0200 |
---|---|---|
committer | Michael Brown | 2015-06-30 18:18:51 +0200 |
commit | 211529a7fe97521acdeaf1f785e48ea3ddd26517 (patch) | |
tree | 2f1cb9d465700d03b10846d2b88b98b8b1d9cfec /src/interface/xen | |
parent | [gdb] Allow gdbstub to be started on an arbitrary serial port (diff) | |
download | ipxe-211529a7fe97521acdeaf1f785e48ea3ddd26517.tar.gz ipxe-211529a7fe97521acdeaf1f785e48ea3ddd26517.tar.xz ipxe-211529a7fe97521acdeaf1f785e48ea3ddd26517.zip |
[xen] Wait for and clear XenStore event before receiving data
Older, out-of-tree Xen kernel modules (such as those provided with
SuSE Linux Enterprise Server 11) do not clear the leftover "event
pending" bit when opening an event channel. Consequently, no event is
ever delivered to indicate that there is information in the XenStore
ring buffer, and the system hangs shortly after loading the
xen-platform-pci kernel module.
Work around this problem by always waiting for the XenStore event
channel to be signalled, and clearing the event before processing the
received data.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/xen')
-rw-r--r-- | src/interface/xen/xenstore.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/interface/xen/xenstore.c b/src/interface/xen/xenstore.c index 731af779..23424a92 100644 --- a/src/interface/xen/xenstore.c +++ b/src/interface/xen/xenstore.c @@ -242,6 +242,10 @@ static int xenstore_response ( struct xen_hypervisor *xen, uint32_t req_id, char *string; int rc; + /* Wait for response to become available */ + while ( ! xenevent_pending ( xen, xen->store.port ) ) + cpu_nap(); + /* Receive message header */ xenstore_recv ( xen, &msg, sizeof ( msg ) ); *len = msg.len; |