mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@cl.cam.ac.uk>
This commit is contained in:
1 parent
52c437a6da
commit
ee35c5fbf6
5 files changed
+10
-10
No files matched your search
@@ -462,7 +462,7 @@ vector=0
|
||||
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 @@ common_interrupt:
|
||||
|
||||
#define BUILD_INTERRUPT(name, nr) \
|
||||
ENTRY(name) \
|
||||
pushl $nr-256; \
|
||||
pushl 0x80000000+$nr; \
|
||||
SAVE_ALL \
|
||||
movl %esp,%eax; \
|
||||
call smp_/**/name; \
|
||||
|
||||
@@ -53,8 +53,8 @@ static union irq_ctx *softirq_ctx[NR_CPUS];
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -584,7 +584,7 @@ retint_kernel:
|
||||
*/
|
||||
.macro apicinterrupt num,func
|
||||
INTR_FRAME
|
||||
pushq $\num-256
|
||||
pushq 0x8000000000000000+$\num
|
||||
CFI_ADJUST_CFA_OFFSET 8
|
||||
interrupt \func
|
||||
jmp error_entry
|
||||
|
||||
@@ -96,8 +96,8 @@ skip:
|
||||
*/
|
||||
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();
|
||||
|
||||
@@ -170,9 +170,9 @@ static inline void exit_idle(void) {}
|
||||
#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
|
||||
|
||||
|
||||