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();
+}

Reply via email to