* [Adeos-main] [PATCH 4/4] x86_64: Cleanup root IRQ trampolines, align with i386
@ 2007-12-26 15:38 Jan Kiszka
0 siblings, 0 replies; only message in thread
From: Jan Kiszka @ 2007-12-26 15:38 UTC (permalink / raw)
To: adeos-main; +Cc: Philippe Gerum
[-- Attachment #1.1: Type: text/plain, Size: 353 bytes --]
This patch reduces the xirq_handler trampoline to the required minimum
and refactors call_root_virq_handler in the same manner. At this chance,
it reorders the execution of irq_exit in the virq path in the same way
as i386 does. I bet the current order was bogus, given that it first ran
the Linux IRQ epilogue and _then_ called irq_exit...
Jan
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: cleanup-root-irq-trampolines-x86_64.patch --]
[-- Type: text/x-patch; name="cleanup-root-irq-trampolines-x86_64.patch", Size: 4064 bytes --]
---
arch/x86_64/kernel/entry.S | 23 ------------------
include/asm-x86_64/ipipe.h | 55 ++++++++++++++++++++++++++++++---------------
2 files changed, 38 insertions(+), 40 deletions(-)
Index: linux-2.6.23.12-xeno_64/arch/x86_64/kernel/entry.S
===================================================================
--- linux-2.6.23.12-xeno_64.orig/arch/x86_64/kernel/entry.S
+++ linux-2.6.23.12-xeno_64/arch/x86_64/kernel/entry.S
@@ -580,28 +580,8 @@ END(stub_rt_sigreturn)
#endif
.endm
-#ifdef CONFIG_IPIPE
-
- /* %rdi=virq number, %rsi=cookie, %rdx=handler */
-ENTRY(__ipipe_root_virq_thunk)
- movq %rsp, %rax
- pushq $0
- pushq %rax
- pushfq
- pushq $__KERNEL_CS
- pushq $1f
- pushq $-1
- XCPT_FRAME
- SAVE_ARGS
- call *%rdx
- jmp exit_intr
- CFI_ENDPROC
-1:
- cli
- ret
-END(__ipipe_root_virq_thunk)
-
ENTRY(common_interrupt)
+#ifdef CONFIG_IPIPE
XCPT_FRAME
interrupt __ipipe_handle_irq
testl %eax, %eax
@@ -615,7 +595,6 @@ ENTRY(common_interrupt)
swapgs
jmp restore_args
#else /* !CONFIG_IPIPE */
-ENTRY(common_interrupt)
XCPT_FRAME
interrupt do_IRQ
#endif /* !CONFIG_IPIPE */
Index: linux-2.6.23.12-xeno_64/include/asm-x86_64/ipipe.h
===================================================================
--- linux-2.6.23.12-xeno_64.orig/include/asm-x86_64/ipipe.h
+++ linux-2.6.23.12-xeno_64/include/asm-x86_64/ipipe.h
@@ -123,9 +123,6 @@ DECLARE_PER_CPU(struct pt_regs, __ipipe_
unsigned __ipipe_get_irq_vector(int irq);
-asmlinkage void __ipipe_root_virq_thunk(unsigned irq,
- void *cookie,
- void (*handler)(unsigned irq, void *cookie));
static inline unsigned long __ipipe_ffnz(unsigned long ul)
{
__asm__("bsrq %1, %0":"=r"(ul)
@@ -155,15 +152,7 @@ __ipipe_call_root_xirq_handler(unsigned
"pushq %[kernel_cs]\n\t"
"pushq $xirq_end\n\t"
"pushq %%rax # dummy value\n\t"
- "movq %%rdi,8*8(%%rsp) # are these required?\n\t"
- "movq %%rsi,7*8(%%rsp)\n\t"
- "movq %%rdx,6*8(%%rsp)\n\t"
- "movq %%rcx,5*8(%%rsp)\n\t"
- "movq %%rax,4*8(%%rsp)\n\t"
- "movq %%r8,3*8(%%rsp)\n\t"
- "movq %%r9,2*8(%%rsp)\n\t"
- "movq %%r10,1*8(%%rsp)\n\t"
- "movq %%r11,(%%rsp)\n\t"
+ "subq $9*8,%%rsp # rest can remain unsaved\n\t"
"movq %[regs],%%rdi # always pass tick regs\n\t"
"call *%[handler]\n\t"
@@ -177,6 +166,38 @@ __ipipe_call_root_xirq_handler(unsigned
: "rdx", "rdi");
}
+void irq_enter(void);
+void irq_exit(void);
+
+static inline void
+__ipipe_call_root_virq_handler(unsigned irq,
+ void (*handler)(unsigned irq, void *cookie),
+ void *cookie)
+{
+ irq_enter();
+ __asm__ __volatile__ (
+ "movq %%rsp, %%rdx\n\t"
+ "pushq $0\n\t"
+ "pushq %%rdx\n\t"
+ "pushfq\n\t"
+ "pushq %[kernel_cs]\n\t"
+ "pushq $virq_end\n\t"
+ "pushq %%rax # dummy value\n\t"
+ "subq $9*8,%%rsp # rest can remain unsaved\n\t"
+
+ "call *%[handler]\n\t"
+ : /* no output */
+ : "D" (irq), "S" (cookie), [handler] "rm" (handler),
+ [kernel_cs] "i" (__KERNEL_CS)
+ : "rdx");
+ irq_exit();
+ __asm__ __volatile__ (
+ "jmp exit_intr # Linux IRQ epilogue\n\t"
+ "virq_end: cli\n\t"
+ : /* no output */
+ : /* no input */);
+}
+
/*
* When running handlers, enable hw interrupts for all domains but the
* one heading the pipeline, so that IRQs can never be significantly
@@ -189,12 +210,10 @@ __ipipe_call_root_xirq_handler(unsigned
if (likely(!ipipe_virtual_irq_p(irq))) \
__ipipe_call_root_xirq_handler( \
irq, (ipd)->irqs[irq].handler); \
- else { \
- irq_enter(); \
- __ipipe_root_virq_thunk( \
- irq, (ipd)->irqs[irq].cookie, (ipd)->irqs[irq].handler); \
- irq_exit(); \
- } \
+ else \
+ __ipipe_call_root_virq_handler( \
+ irq, (ipd)->irqs[irq].handler, \
+ (ipd)->irqs[irq].cookie); \
} else { \
__clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \
ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-12-26 15:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-26 15:38 [Adeos-main] [PATCH 4/4] x86_64: Cleanup root IRQ trampolines, align with i386 Jan Kiszka
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.