This diff communicates an allocated IDT vector to the Hypervisor. OK?
--- sys/dev/pv/xen.c | 34 ++++++++++++++++++++++++++++++++++ sys/dev/pv/xenvar.h | 2 ++ 2 files changed, 36 insertions(+) diff --git sys/dev/pv/xen.c sys/dev/pv/xen.c index e8aeeb8..8643636 100644 --- sys/dev/pv/xen.c +++ sys/dev/pv/xen.c @@ -25,10 +25,12 @@ #include <machine/cpu.h> #include <machine/cpufunc.h> #include <uvm/uvm_extern.h> +#include <machine/i82489var.h> + #include <dev/pv/pvvar.h> #include <dev/pv/xenreg.h> #include <dev/pv/xenvar.h> struct xen_softc *xen_sc; @@ -36,10 +38,11 @@ struct xen_softc *xen_sc; void xen_find_base(struct xen_softc *); int xen_init_hypercall(struct xen_softc *); int xen_getversion(struct xen_softc *); int xen_getfeatures(struct xen_softc *); int xen_init_info_page(struct xen_softc *); +int xen_init_cbvec(struct xen_softc *); int xen_match(struct device *, void *, void *); void xen_attach(struct device *, struct device *, void *); void xen_resume(struct device *); int xen_activate(struct device *, int); @@ -88,10 +91,12 @@ xen_attach(struct device *parent, struct device *self, void *aux) if (xen_getfeatures(sc)) return; if (xen_init_info_page(sc)) return; + + xen_init_cbvec(sc); } void xen_resume(struct device *self) { @@ -418,5 +423,34 @@ xen_init_info_page(struct xen_softc *sc) } DPRINTF("%s: shared info page at va %p pa %#lx\n", sc->sc_dev.dv_xname, sc->sc_ipg, pa); return (0); } + +int +xen_init_cbvec(struct xen_softc *sc) +{ + struct xen_hvm_param xhp; + + if ((sc->sc_features & XENFEAT_CBVEC) == 0) + return (ENOENT); + + xhp.domid = DOMID_SELF; + xhp.index = HVM_PARAM_CALLBACK_IRQ; + xhp.value = HVM_CALLBACK_VECTOR(LAPIC_XEN_VECTOR); + if (xen_hypercall(sc, hvm_op, 2, HVMOP_set_param, &xhp)) { + /* Will retry with the xspd(4) PCI interrupt */ + return (ENOENT); + } + DPRINTF("%s: registered callback IDT vector %d\n", + sc->sc_dev.dv_xname, LAPIC_XEN_VECTOR); + + sc->sc_cbvec = 1; + + return (0); +} + +void +xen_intr(void) +{ + /* stub */ +} diff --git sys/dev/pv/xenvar.h sys/dev/pv/xenvar.h index b5db26d..7c5d244 100644 --- sys/dev/pv/xenvar.h +++ sys/dev/pv/xenvar.h @@ -31,10 +31,12 @@ struct xen_softc { void *sc_hc; uint32_t sc_features; #define XENFEAT_CBVEC (1<<8) struct shared_info *sc_ipg; /* HYPERVISOR_shared_info */ + + int sc_cbvec; /* callback was installed */ }; extern struct xen_softc *xen_sc; /* -- 2.6.3