--- /dev/null
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/interrupt.h>
+#include <sys/pcpu.h>
+#include <sys/smp.h>
+#include <sys/syslog.h>
+
+#include <xen/xen-os.h>
+#include <xen/arch-intr.h>
+
+void
+xen_arch_intr_init(void)
+{
+ /* Nothing to do */
+}
+
+int
+xen_arch_intr_setup(struct xenisrc *isrc)
+{
+
+ /* We don't support pirq on ARM */
+ if (isrc->xi_type == EVTCHN_TYPE_PIRQ)
+ return ENOTSUP;
+
+ /* XXX: Make the name of the evetn more accurate */
+ return (intr_event_create(&isrc->xi_intsrc.xai_event, 0,
+ isrc->xi_vector /* IRQ */,
+ xen_intr_disable_intr /* mask */,
+ xen_intr_enable_intr /* unmask */,
+ xen_intr_eoi_source /* EOI */,
+ xen_intr_assign_cpu /* cpu assign */,
+ "xen%d", isrc->xi_vector));
+}
+
+struct xenisrc *
+xen_arch_intr_lookup_source(int vector)
+{
+
+ /* TODO: Implement it */
+ printf("%s: XXX: Not implemented\n", __FUNCTION__);
+
+ return NULL;
+}
+
+bool
+xen_arch_intr_has_handlers(struct xenisrc *isrc)
+{
+
+ return (!TAILQ_EMPTY(&isrc->xi_intsrc.xai_event->ie_handlers));
+}
+
+void
+xen_arch_intr_execute_handlers(struct xenisrc *isrc, struct trapframe *frame)
+{
+ int error;
+
+ error = intr_event_handle(isrc->xi_intsrc.xai_event, frame);
+ if (error)
+ log(LOG_ERR, "Stray evchn%d: %d\n",
+ isrc->xi_port, error);
+}
+
+#if 0
+int
+xen_arch_intr_add_handler(device_t dev, driver_filter_t filter,
+ driver_intr_t handler, void *arg, enum intr_type flags,
+ struct xenisrc *isrc)
+{
+
+ return (intr_add_handler(device_get_nameunit(dev), isrc->xi_vector,
+ filter, handler, arg, flags, &isrc->xi_cookie));
+}
+
+int
+xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
+{
+
+ return (intr_describe(isrc->xi_vector, isrc->xi_cookie, descr));
+}
+
+int
+xen_arch_intr_remove_handler(struct xenisrc *isrc)
+{
+
+ return (intr_remove_handler(isrc->xi_cookie));
+}
+
+int
+xen_arch_intr_event_bind(struct xenisrc *isrc, u_int cpu)
+{
+
+ return (intr_event_bind(isrc->xi_intsrc.is_event, cpu));
+}
+#endif