Module Name: src Committed By: cherry Date: Mon Nov 7 15:51:31 UTC 2011
Modified Files: src/sys/arch/xen/include: intrdefs.h src/sys/arch/xen/x86: xen_ipi.c Log Message: Add an ipi callback to force hypervisor callback. this is useful to "re-route" interrupts to a given vcpu To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/arch/xen/include/intrdefs.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/xen/x86/xen_ipi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/xen/include/intrdefs.h diff -u src/sys/arch/xen/include/intrdefs.h:1.10 src/sys/arch/xen/include/intrdefs.h:1.11 --- src/sys/arch/xen/include/intrdefs.h:1.10 Wed Aug 10 06:29:23 2011 +++ src/sys/arch/xen/include/intrdefs.h Mon Nov 7 15:51:31 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: intrdefs.h,v 1.10 2011/08/10 06:29:23 cherry Exp $ */ +/* $NetBSD: intrdefs.h,v 1.11 2011/11/07 15:51:31 cherry Exp $ */ /* This file co-exists, and is included via machine/intrdefs.h */ @@ -11,7 +11,8 @@ #define XEN_IPI_SYNCH_FPU 0x00000002 #define XEN_IPI_DDB 0x00000004 #define XEN_IPI_XCALL 0x00000008 +#define XEN_IPI_HVCB 0x00000010 -#define XEN_NIPIS 4 /* IPI_KICK doesn't have a handler */ +#define XEN_NIPIS 5 /* IPI_KICK doesn't have a handler */ #endif /* _XEN_INTRDEFS_H_ */ Index: src/sys/arch/xen/x86/xen_ipi.c diff -u src/sys/arch/xen/x86/xen_ipi.c:1.5 src/sys/arch/xen/x86/xen_ipi.c:1.6 --- src/sys/arch/xen/x86/xen_ipi.c:1.5 Tue Sep 27 01:02:37 2011 +++ src/sys/arch/xen/x86/xen_ipi.c Mon Nov 7 15:51:31 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_ipi.c,v 1.5 2011/09/27 01:02:37 jym Exp $ */ +/* $NetBSD: xen_ipi.c,v 1.6 2011/11/07 15:51:31 cherry Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -33,10 +33,10 @@ /* * Based on: x86/ipi.c - * __KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.5 2011/09/27 01:02:37 jym Exp $"); + * __KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.6 2011/11/07 15:51:31 cherry Exp $"); */ -__KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.5 2011/09/27 01:02:37 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.6 2011/11/07 15:51:31 cherry Exp $"); #include <sys/types.h> @@ -72,13 +72,15 @@ static void xen_ipi_halt(struct cpu_info static void xen_ipi_synch_fpu(struct cpu_info *, struct intrframe *); static void xen_ipi_ddb(struct cpu_info *, struct intrframe *); static void xen_ipi_xcall(struct cpu_info *, struct intrframe *); +static void xen_ipi_hvcb(struct cpu_info *, struct intrframe *); static void (*ipifunc[XEN_NIPIS])(struct cpu_info *, struct intrframe *) = { /* In order of priority (see: xen/include/intrdefs.h */ xen_ipi_halt, xen_ipi_synch_fpu, xen_ipi_ddb, - xen_ipi_xcall + xen_ipi_xcall, + xen_ipi_hvcb }; static void @@ -139,9 +141,9 @@ static inline u_int max_cpus(void) static inline bool /* helper */ valid_ipimask(uint32_t ipimask) { - uint32_t masks = XEN_IPI_XCALL | XEN_IPI_DDB | - XEN_IPI_SYNCH_FPU | XEN_IPI_HALT | - XEN_IPI_KICK; + uint32_t masks = XEN_IPI_HVCB | XEN_IPI_XCALL | + XEN_IPI_DDB | XEN_IPI_SYNCH_FPU | + XEN_IPI_HALT | XEN_IPI_KICK; if (ipimask & ~masks) { return false; @@ -296,3 +298,16 @@ xc_send_ipi(struct cpu_info *ci) xen_broadcast_ipi(XEN_IPI_XCALL); } } + +static void +xen_ipi_hvcb(struct cpu_info *ci, struct intrframe *intrf) +{ + KASSERT(ci != NULL); + KASSERT(intrf != NULL); + + volatile struct vcpu_info *vci = ci->ci_vcpu; + + KASSERT(ci == curcpu()); + KASSERT(!vci->evtchn_upcall_mask); + hypervisor_force_callback(); +}