From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org
Cc: virtualization@lists.osdl.org, xen-devel@lists.xensource.com,
Jeremy Fitzhardinge <jeremy@goop.org>, Andi Kleen <ak@suse.de>,
Andrew Morton <akpm@osdl.org>,
Rusty Russell <rusty@rustcorp.com.au>,
Zachary Amsden <zach@vmware.com>,
Ian Pratt <ian.pratt@xensource.com>,
Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Subject: [RFC PATCH 14/33] subarch support for controlling interrupt delivery
Date: Tue, 18 Jul 2006 00:00:14 -0700 [thread overview]
Message-ID: <20060718091951.968462000@sous-sol.org> (raw)
In-Reply-To: 20060718091807.467468000@sous-sol.org
[-- Attachment #1: i386-interrupt-control --]
[-- Type: text/plain, Size: 7830 bytes --]
Abstract the code that controls interrupt delivery, and add a separate
subarch implementation for Xen that manipulates a shared-memory event
delivery mask.
Signed-off-by: Ian Pratt <ian.pratt@xensource.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
---
arch/i386/mach-xen/Makefile | 2
arch/i386/mach-xen/interrupt.c | 67 +++++++++++++++++++++++++
include/asm-i386/irqflags.h | 61 +---------------------
include/asm-i386/mach-default/mach_irqflags.h | 64 +++++++++++++++++++++++
include/asm-i386/mach-default/mach_system.h | 4 +
include/asm-i386/mach-xen/mach_irqflags.h | 29 ++++++++++
include/asm-i386/mach-xen/mach_system.h | 5 +
7 files changed, 174 insertions(+), 58 deletions(-)
diff -r 092b7e56c85d arch/i386/mach-xen/Makefile
--- a/arch/i386/mach-xen/Makefile Thu Jul 13 14:42:42 2006 -0700
+++ b/arch/i386/mach-xen/Makefile Thu Jul 13 14:42:42 2006 -0700
@@ -4,6 +4,6 @@
extra-y := head.o
-obj-y := setup.o setup-xen.o memory.o
+obj-y := setup.o setup-xen.o memory.o interrupt.o
setup-y := ../mach-default/setup.o
diff -r 092b7e56c85d include/asm-i386/irqflags.h
--- a/include/asm-i386/irqflags.h Thu Jul 13 14:42:42 2006 -0700
+++ b/include/asm-i386/irqflags.h Thu Jul 13 14:42:42 2006 -0700
@@ -10,66 +10,12 @@
#ifndef _ASM_IRQFLAGS_H
#define _ASM_IRQFLAGS_H
+#include <mach_irqflags.h>
+
#ifndef __ASSEMBLY__
-
-static inline unsigned long __raw_local_save_flags(void)
-{
- unsigned long flags;
-
- __asm__ __volatile__(
- "pushfl ; popl %0"
- : "=g" (flags)
- : /* no input */
- );
-
- return flags;
-}
#define raw_local_save_flags(flags) \
do { (flags) = __raw_local_save_flags(); } while (0)
-
-static inline void raw_local_irq_restore(unsigned long flags)
-{
- __asm__ __volatile__(
- "pushl %0 ; popfl"
- : /* no output */
- :"g" (flags)
- :"memory", "cc"
- );
-}
-
-static inline void raw_local_irq_disable(void)
-{
- __asm__ __volatile__("cli" : : : "memory");
-}
-
-static inline void raw_local_irq_enable(void)
-{
- __asm__ __volatile__("sti" : : : "memory");
-}
-
-/*
- * Used in the idle loop; sti takes one instruction cycle
- * to complete:
- */
-static inline void raw_safe_halt(void)
-{
- __asm__ __volatile__("sti; hlt" : : : "memory");
-}
-
-/*
- * Used when interrupts are already enabled or to
- * shutdown the processor:
- */
-static inline void halt(void)
-{
- __asm__ __volatile__("hlt": : :"memory");
-}
-
-static inline int raw_irqs_disabled_flags(unsigned long flags)
-{
- return !(flags & (1 << 9));
-}
static inline int raw_irqs_disabled(void)
{
@@ -93,7 +39,7 @@ static inline unsigned long __raw_local_
#define raw_local_irq_save(flags) \
do { (flags) = __raw_local_irq_save(); } while (0)
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
/*
* Do the CPU's IRQ-state tracing from assembly code. We call a
@@ -124,4 +70,5 @@ static inline unsigned long __raw_local_
# define TRACE_IRQS_OFF
#endif
+
#endif
diff -r 092b7e56c85d arch/i386/mach-xen/interrupt.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/arch/i386/mach-xen/interrupt.c Thu Jul 13 16:00:43 2006 -0700
@@ -0,0 +1,67 @@
+#include <linux/preempt.h>
+#include <linux/module.h>
+
+#include <asm/hypervisor.h>
+#include <mach_irqflags.h>
+
+
+/*
+ * The use of 'barrier' in the following reflects their use as local-lock
+ * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
+ * critical operations are executed. All critical operations must complete
+ * /before/ reentrancy is permitted (e.g., __sti()).
+ */
+unsigned long __raw_local_save_flags(void)
+{
+ struct vcpu_info *_vcpu;
+ unsigned long flags;
+
+ preempt_disable();
+ _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];
+ flags = _vcpu->evtchn_upcall_mask;
+ preempt_enable();
+
+ return flags;
+}
+EXPORT_SYMBOL(__raw_local_save_flags);
+
+void raw_local_irq_restore(unsigned long flags)
+{
+ struct vcpu_info *_vcpu;
+
+ preempt_disable();
+
+ _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];
+ if ((_vcpu->evtchn_upcall_mask = flags) == 0) {
+ barrier(); /* unmask then check (avoid races) */
+ if (unlikely(_vcpu->evtchn_upcall_pending))
+ force_evtchn_callback();
+ preempt_enable();
+ } else
+ preempt_enable_no_resched();
+}
+EXPORT_SYMBOL(raw_local_irq_restore);
+
+void raw_local_irq_disable(void)
+{
+ struct vcpu_info *_vcpu;
+ preempt_disable();
+ _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];
+ _vcpu->evtchn_upcall_mask = 1;
+ preempt_enable_no_resched();
+}
+EXPORT_SYMBOL(raw_local_irq_disable);
+
+void raw_local_irq_enable(void)
+{
+ struct vcpu_info *_vcpu;
+
+ preempt_disable();
+ _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];
+ _vcpu->evtchn_upcall_mask = 0;
+ barrier(); /* unmask then check (avoid races) */
+ if (unlikely(_vcpu->evtchn_upcall_pending))
+ force_evtchn_callback();
+ preempt_enable();
+}
+EXPORT_SYMBOL(raw_local_irq_enable);
diff -r 092b7e56c85d include/asm-i386/mach-default/mach_irqflags.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-i386/mach-default/mach_irqflags.h Thu Jul 13 14:42:42 2006 -0700
@@ -0,0 +1,64 @@
+#ifndef ASM_MACH_IRQFLAGS_H
+#define ASM_MACH_IRQFLAGS_H
+
+#ifndef __ASSEMBLY__
+
+static inline unsigned long __raw_local_save_flags(void)
+{
+ unsigned long flags;
+
+ __asm__ __volatile__(
+ "pushfl ; popl %0"
+ : "=g" (flags)
+ : /* no input */
+ );
+
+ return flags;
+}
+
+static inline void raw_local_irq_restore(unsigned long flags)
+{
+ __asm__ __volatile__(
+ "pushl %0 ; popfl"
+ : /* no output */
+ :"g" (flags)
+ :"memory", "cc"
+ );
+}
+
+static inline void raw_local_irq_disable(void)
+{
+ __asm__ __volatile__("cli" : : : "memory");
+}
+
+static inline void raw_local_irq_enable(void)
+{
+ __asm__ __volatile__("sti" : : : "memory");
+}
+
+/*
+ * Used in the idle loop; sti takes one instruction cycle
+ * to complete:
+ */
+static inline void raw_safe_halt(void)
+{
+ __asm__ __volatile__("sti; hlt" : : : "memory");
+}
+
+/*
+ * Used when interrupts are already enabled or to
+ * shutdown the processor:
+ */
+static inline void halt(void)
+{
+ __asm__ __volatile__("hlt": : :"memory");
+}
+
+static inline int raw_irqs_disabled_flags(unsigned long flags)
+{
+ return !(flags & (1 << 9));
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* ASM_MACH_IRQFLAGS_H */
diff -r 092b7e56c85d include/asm-i386/mach-default/mach_system.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-i386/mach-default/mach_system.h Thu Jul 13 15:59:13 2006 -0700
@@ -0,0 +1,4 @@
+#ifndef __ASM_MACH_SYSTEM_H
+#define __ASM_MACH_SYSTEM_H
+
+#endif /* __ASM_MACH_SYSTEM_H */
diff -r 092b7e56c85d include/asm-i386/mach-xen/mach_irqflags.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-i386/mach-xen/mach_irqflags.h Thu Jul 13 14:42:42 2006 -0700
@@ -0,0 +1,29 @@
+#ifndef ASM_MACH_IRQFLAGS_H
+#define ASM_MACH_IRQFLAGS_H
+
+#ifndef __ASSEMBLY__
+
+#ifdef CONFIG_SMP
+#define __vcpu_id smp_processor_id()
+#else
+#define __vcpu_id 0
+#endif
+
+/* interrupt control.. */
+
+unsigned long __raw_local_save_flags(void);
+void raw_local_irq_restore(unsigned long flags);
+void raw_local_irq_disable(void);
+void raw_local_irq_enable(void);
+
+#define raw_safe_halt() do { } while(0)
+#define halt() do { } while(0)
+
+static inline int raw_irqs_disabled_flags(unsigned long flags)
+{
+ return flags != 0;
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* ASM_MACH_IRQFLAGS_H */
diff -r 092b7e56c85d include/asm-i386/mach-xen/mach_system.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-i386/mach-xen/mach_system.h Thu Jul 13 15:59:13 2006 -0700
@@ -0,0 +1,5 @@
+#ifndef __ASM_MACH_SYSTEM_H
+#define __ASM_MACH_SYSTEM_H
+
+
+#endif /* __ASM_MACH_SYSTEM_H */
--
next prev parent reply other threads:[~2006-07-18 9:24 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-18 9:18 [RFC PATCH 00/33] Xen i386 paravirtualization support Chris Wright
2006-07-18 9:18 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 01/33] Add apply_to_page_range() function Chris Wright
2006-07-18 10:38 ` Adrian Bunk
2006-07-18 19:29 ` Chris Wright
2006-07-18 19:29 ` Chris Wright
2006-07-20 6:17 ` Adrian Bunk
2006-07-18 7:00 ` [RFC PATCH 02/33] Add sync bitops Chris Wright
2006-07-18 9:56 ` Arjan van de Ven
2006-07-18 10:18 ` Keir Fraser
2006-07-18 10:18 ` Keir Fraser
2006-07-19 12:54 ` Andi Kleen
2006-07-18 10:34 ` Adrian Bunk
2006-07-18 7:00 ` [RFC PATCH 03/33] Add nosegneg capability to the vsyscall page notes Chris Wright
2006-07-18 7:00 ` [RFC PATCH 04/33] Add XEN config options and disable unsupported config options Chris Wright
2006-07-18 9:59 ` Arjan van de Ven
2006-07-18 10:21 ` Keir Fraser
2006-07-18 10:21 ` Keir Fraser
2006-07-18 7:00 ` [RFC PATCH 05/33] Makefile support to build Xen subarch Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 10:00 ` Arjan van de Ven
2006-07-18 11:40 ` Andrew Morton
2006-07-18 20:41 ` Jeremy Fitzhardinge
2006-07-18 20:15 ` Jeremy Fitzhardinge
2006-07-18 7:00 ` [RFC PATCH 06/33] Add Xen interface header files Chris Wright
2006-07-18 7:00 ` [RFC PATCH 07/33] Hypervisor " Chris Wright
2006-07-18 7:00 ` [RFC PATCH 08/33] Add vmlinuz build target Chris Wright
2006-07-18 7:00 ` [RFC PATCH 09/33] Add start-of-day setup hooks to subarch Chris Wright
2006-07-18 10:03 ` Arjan van de Ven
2006-07-18 20:49 ` Jeremy Fitzhardinge
2006-07-20 6:07 ` Adrian Bunk
2006-07-20 12:10 ` Keir Fraser
2006-07-20 13:27 ` Jeremy Fitzhardinge
2006-07-18 7:00 ` [RFC PATCH 10/33] add support for Xen feature queries Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 11/33] Add Xen-specific memory management definitions Chris Wright
2006-07-18 7:00 ` [RFC PATCH 12/33] Change __FIXADDR_TOP to leave room for the hypervisor Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 13/33] Add a new head.S start-of-day file for booting on Xen Chris Wright
2006-07-18 10:06 ` Arjan van de Ven
2006-07-18 20:13 ` Jeremy Fitzhardinge
2006-07-18 7:00 ` Chris Wright [this message]
2006-07-18 7:00 ` [RFC PATCH 15/33] move segment checks to subarch Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 10:09 ` Arjan van de Ven
2006-07-18 11:28 ` Zachary Amsden
2006-07-18 11:28 ` Zachary Amsden
2006-07-18 19:06 ` Rusty Russell
2006-07-18 19:06 ` Rusty Russell
2006-07-18 19:25 ` Chris Wright
2006-07-18 19:25 ` Chris Wright
2006-07-18 20:00 ` [Xen-devel] " Rusty Russell
2006-07-18 7:00 ` [RFC PATCH 16/33] Add support for Xen to entry.S Chris Wright
2006-07-18 10:11 ` Arjan van de Ven
2006-07-18 20:04 ` Jeremy Fitzhardinge
2006-07-18 19:17 ` Rusty Russell
2006-07-18 19:17 ` Rusty Russell
2006-07-18 20:43 ` Chris Wright
2006-07-18 20:43 ` Chris Wright
2006-07-18 23:03 ` Jeremy Fitzhardinge
2006-07-19 5:30 ` Chris Wright
2006-07-19 5:30 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 17/33] Support loading an initrd when running on Xen Chris Wright
2006-07-18 7:00 ` [RFC PATCH 18/33] Subarch support for CPUID instruction Chris Wright
2006-07-18 10:14 ` Arjan van de Ven
2006-07-18 10:26 ` Keir Fraser
2006-07-18 10:26 ` Keir Fraser
2006-07-18 10:38 ` Arjan van de Ven
2006-07-18 11:33 ` Zachary Amsden
2006-07-18 11:33 ` Zachary Amsden
2006-07-18 20:46 ` David Miller
2006-07-18 21:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 19/33] Support gdt/idt/ldt handling on Xen Chris Wright
2006-07-18 7:00 ` [RFC PATCH 20/33] subarch support for interrupt and exception gates Chris Wright
2006-07-18 7:00 ` [RFC PATCH 21/33] subarch support for control register accesses Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 22/33] subarch stack pointer update Chris Wright
2006-07-18 7:00 ` [RFC PATCH 23/33] subarch TLB support Chris Wright
2006-07-18 20:39 ` David Miller
2006-07-18 21:00 ` Chris Wright
2006-07-18 21:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 24/33] Add support for Xen event channels Chris Wright
2006-07-18 7:00 ` [RFC PATCH 25/33] Implement timekeeping for Xen Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-25 2:49 ` john stultz
2006-07-25 20:05 ` Jeremy Fitzhardinge
2006-07-18 7:00 ` [RFC PATCH 26/33] subarch suport for idle loop (NO_IDLE_HZ for Xen) Chris Wright
2006-07-18 7:00 ` [RFC PATCH 27/33] Add the Xen virtual console driver Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 10:24 ` Arjan van de Ven
2006-07-18 10:31 ` Keir Fraser
2006-07-18 10:31 ` Keir Fraser
2006-07-27 15:05 ` Hollis Blanchard
2006-07-18 7:00 ` [RFC PATCH 28/33] Add Xen grant table support Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-19 10:04 ` [Xen-devel] " Harry Butterworth
2006-07-19 10:04 ` Harry Butterworth
2006-07-25 18:30 ` Hollis Blanchard
2006-07-25 18:30 ` Hollis Blanchard
2006-07-25 18:45 ` Keir Fraser
2006-07-25 18:45 ` Keir Fraser
2006-07-25 19:06 ` Segher Boessenkool
2006-07-25 19:06 ` [XenPPC] " Segher Boessenkool
2006-07-18 7:00 ` [RFC PATCH 29/33] Add Xen driver utility functions Chris Wright
2006-07-18 7:00 ` [RFC PATCH 30/33] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-07-18 7:00 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 31/33] Add Xen subarch reboot support Chris Wright
2006-07-20 6:16 ` Adrian Bunk
2006-07-18 7:00 ` [RFC PATCH 32/33] Add the Xen virtual network device driver Chris Wright
2006-07-18 10:27 ` Arjan van de Ven
2006-07-18 10:35 ` Keir Fraser
2006-07-18 10:35 ` Keir Fraser
2006-07-18 10:42 ` Arjan van de Ven
2006-07-18 12:18 ` Dave Boutcher
2006-07-18 12:39 ` jamal
2006-07-18 13:08 ` Herbert Xu
2006-07-18 13:08 ` Herbert Xu
2006-07-18 13:25 ` John Haller
2006-07-18 15:22 ` Herbert Xu
2006-07-18 15:22 ` Herbert Xu
2006-07-18 15:44 ` Stephen Hemminger
2006-07-19 3:55 ` Herbert Xu
2006-07-19 3:55 ` Herbert Xu
2006-07-19 3:55 ` Herbert Xu
2006-07-18 20:42 ` David Miller
2006-07-18 21:09 ` Chris Wright
2006-07-18 7:00 ` [RFC PATCH 33/33] Add Xen virtual block " Chris Wright
2006-07-18 10:34 ` Arjan van de Ven
2006-07-18 20:57 ` Jeremy Fitzhardinge
2006-07-18 13:01 ` Dave Boutcher
2006-07-18 16:25 ` Jeff Garzik
2006-07-18 16:25 ` Jeff Garzik
2006-07-18 19:28 ` Chris Wright
2006-07-18 19:28 ` Chris Wright
2006-07-18 21:22 ` Jeremy Fitzhardinge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060718091951.968462000@sous-sol.org \
--to=chrisw@sous-sol.org \
--cc=Christian.Limpach@cl.cam.ac.uk \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=ian.pratt@xensource.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.osdl.org \
--cc=xen-devel@lists.xensource.com \
--cc=zach@vmware.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.