All of lore.kernel.org
 help / color / mirror / Atom feed
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.