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
---
 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: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to