# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 4109c4e7804abeabe3b222673f2ba4dd1375be53
# Parent 98eaa430bdf3e0c7700104090c23a0f2412f1441
Change do_IRQ high bit masking.
Allow more than 256 interrupt vectors on native by only setting the
highest bit when marking orig_eax to indicate that we're not within
a system call.
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
diff -r 98eaa430bdf3 -r 4109c4e7804a
linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S
--- a/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S Tue Mar 28 12:45:08 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/entry-xen.S Tue Mar 28 13:19:22 2006
@@ -462,7 +462,7 @@
ENTRY(irq_entries_start)
.rept NR_IRQS
ALIGN
-1: pushl $vector-256
+1: pushl 0x80000000+$vector
jmp common_interrupt
.data
.long 1b
@@ -479,7 +479,7 @@
#define BUILD_INTERRUPT(name, nr) \
ENTRY(name) \
- pushl $nr-256; \
+ pushl 0x80000000+$nr; \
SAVE_ALL \
movl %esp,%eax; \
call smp_/**/name; \
diff -r 98eaa430bdf3 -r 4109c4e7804a
linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c Tue Mar 28 12:45:08 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/irq-xen.c Tue Mar 28 13:19:22 2006
@@ -53,8 +53,8 @@
*/
fastcall unsigned int do_IRQ(struct pt_regs *regs)
{
- /* high bits used in ret_from_ code */
- int irq = regs->orig_eax & __IRQ_MASK(HARDIRQ_BITS);
+ /* high bit used in ret_from_ code */
+ int irq = regs->orig_eax & __IRQ_MASK(BITS_PER_LONG - 1);
#ifdef CONFIG_4KSTACKS
union irq_ctx *curctx, *irqctx;
u32 *isp;
diff -r 98eaa430bdf3 -r 4109c4e7804a
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Tue Mar 28
12:45:08 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Tue Mar 28
13:19:22 2006
@@ -584,7 +584,7 @@
*/
.macro apicinterrupt num,func
INTR_FRAME
- pushq $\num-256
+ pushq 0x8000000000000000+$\num
CFI_ADJUST_CFA_OFFSET 8
interrupt \func
jmp error_entry
diff -r 98eaa430bdf3 -r 4109c4e7804a
linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c Tue Mar 28 12:45:08 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/irq-xen.c Tue Mar 28 13:19:22 2006
@@ -96,8 +96,8 @@
*/
asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
{
- /* high bits used in ret_from_ code */
- int irq = regs->orig_rax & __IRQ_MASK(HARDIRQ_BITS);
+ /* high bit used in ret_from_ code */
+ int irq = regs->orig_rax & __IRQ_MASK(BITS_PER_LONG - 1);
exit_idle();
irq_enter();
diff -r 98eaa430bdf3 -r 4109c4e7804a
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Tue Mar 28 12:45:08 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Tue Mar 28 13:19:22 2006
@@ -170,9 +170,9 @@
#include <asm/idle.h>
#define IRQ_REG orig_rax
#endif
-#define do_IRQ(irq, regs) do { \
- (regs)->IRQ_REG = (irq); \
- do_IRQ((regs)); \
+#define do_IRQ(irq, regs) do { \
+ (regs)->IRQ_REG = (irq) | (1UL << (BITS_PER_LONG - 1)); \
+ do_IRQ((regs)); \
} while (0)
#endif
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|