Hu Tao <hu...@cn.fujitsu.com> writes: > pvevent device is used to send guest panic event from guest to qemu. > > When guest panic happens, pvevent device driver will write a event > number to IO port 0x505(which is the IO port occupied by pvevent device, > by default). On receiving the event, pvevent device will pause guest > cpu(s), and send a qmp event QEVENT_GUEST_PANICKED. > > TODO: make the IO port configurable > > Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> > Signed-off-by: Hu Tao <hu...@cn.fujitsu.com> > --- > hw/Makefile.objs | 2 + > hw/pvevent.c | 116 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 118 insertions(+) > create mode 100644 hw/pvevent.c > > diff --git a/hw/Makefile.objs b/hw/Makefile.objs > index 40ebe46..edf499e 100644 > --- a/hw/Makefile.objs > +++ b/hw/Makefile.objs > @@ -218,5 +218,7 @@ obj-$(CONFIG_KVM) += ivshmem.o > obj-$(CONFIG_LINUX) += vfio_pci.o > endif > > +common-obj-y += pvevent.o > + > $(obj)/baum.o: QEMU_CFLAGS += $(SDL_CFLAGS) > endif > diff --git a/hw/pvevent.c b/hw/pvevent.c > new file mode 100644 > index 0000000..c7df77b > --- /dev/null > +++ b/hw/pvevent.c > @@ -0,0 +1,116 @@ > +/* > + * QEMU simulated pvevent device. > + * > + * Copyright Fujitsu, Corp. 2013 > + * > + * Authors: > + * Wen Congyang <we...@cn.fujitsu.com> > + * Hu Tao <hu...@cn.fujitsu.com> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#include <qapi/qmp/qobject.h> > +#include <qapi/qmp/qjson.h> > +#include <monitor/monitor.h> > +#include <sysemu/sysemu.h> > +#include <sysemu/kvm.h> > + > +/* The bit of supported pv event */ > +#define PVEVENT_F_PANICKED 0 > + > +/* The pv event value */ > +#define PVEVENT_PANICKED (1 << PVEVENT_F_PANICKED)
This looks like events are encoded as bits, which can be combined into a set, but... > + > +#define TYPE_ISA_PVEVENT_DEVICE "pvevent" > +#define ISA_PVEVENT_DEVICE(obj) \ > + OBJECT_CHECK(PVEventState, (obj), TYPE_ISA_PVEVENT_DEVICE) > + > +static void panicked_mon_event(const char *action) > +{ > + QObject *data; > + > + data = qobject_from_jsonf("{ 'action': %s }", action); > + monitor_protocol_event(QEVENT_GUEST_PANICKED, data); > + qobject_decref(data); > +} > + > +static void handle_event(int event) > +{ > + if (event == PVEVENT_PANICKED) { ... here you don't test bits. Weird. Intentional? > + panicked_mon_event("pause"); > + vm_stop(RUN_STATE_GUEST_PANICKED); > + return; > + } > +} Should we log events we don't understand? > + > +#include "hw/isa.h" > + > +typedef struct PVEventState { > + ISADevice parent_obj; > + > + MemoryRegion io; > + uint16_t ioport; > +} PVEventState; > + > +/* return supported events on read */ > +static uint64_t pvevent_ioport_read(void *opaque, hwaddr addr, unsigned size) > +{ > + return PVEVENT_PANICKED; > +} > + > +static void pvevent_ioport_write(void *opaque, hwaddr addr, uint64_t val, > + unsigned size) > +{ > + handle_event(val); > +} [...]