From: Jan Kiszka <jan.kiszka@domain.hid>
To: adeos-main <adeos-main@gna.org>
Cc: Philippe Gerum <rpm@xenomai.org>
Subject: [Adeos-main] [PATCH 4/4] x86_64: Cleanup root IRQ trampolines, align with i386
Date: Wed, 26 Dec 2007 16:38:23 +0100 [thread overview]
Message-ID: <4772756F.1020404@domain.hid> (raw)
[-- 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 --]
reply other threads:[~2007-12-26 15:38 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=4772756F.1020404@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=adeos-main@gna.org \
--cc=rpm@xenomai.org \
/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.