Re: Announce: kdb v4.4 is available for kernel 2.6.16

Dan Aloni <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.kernel.debugging
Message-ID <20060402102350.GA4671@localdomain>
On Sat, Apr 01, 2006 at 06:43:13PM -0500, Joe Korty wrote:
> On Sat, Apr 01, 2006 at 08:04:30PM +0300, Dan Aloni wrote:
> > > Current versions are :-
> > > 
> > >   kdb-v4.4-2.6.16-common-1.bz2
> > >   kdb-v4.4-2.6.16-i386-1.bz2
> > >   kdb-v4.4-2.6.16-ia64-1.bz2
> > 
> > Thanks for this new version, however I'm looking forward to see
> > kdb maintained also for the x86_64 architecture. Currently I have 
> > got as far as forward-porting it to a level where it "works" except 
> > for one annoying issue where setjmp/longjmp looks to be broken:
> 
> Problem is due to the mixed C/asm implementation of setjmp/longjmp.
> Replace that with one written entirely in assemply and it will work.
> Here's mine:

Thanks, it's obviously a better way to do it, I've tested it and 
made it into a patch:

diff --git a/arch/x86_64/kdb/kdbasupport.c b/arch/x86_64/kdb/kdbasupport.c
index 57c2a72..1be4909 100644
--- a/arch/x86_64/kdb/kdbasupport.c
+++ b/arch/x86_64/kdb/kdbasupport.c
@@ -1029,71 +1029,41 @@ kdba_clearsinglestep(struct pt_regs *reg
 		regs->eflags &= ~EF_IE;
 }
 
-#ifdef KDB_HAVE_LONGJMP
-int asmlinkage
-kdba_setjmp(kdb_jmp_buf *jb)
-{
-#if defined(CONFIG_FRAME_POINTER)
-	__asm__("movq %rbx, (0*8)(%rdi);"
-		"movq %rbp, (1*8)(%rdi);"
-		"movq %r12, (2*8)(%rdi);"
-		"movq %r13, (3*8)(%rdi);"
-		"movq %r14, (4*8)(%rdi);"
-		"movq %r15, (5*8)(%rdi);"
-		"leaq 16(%rsp), %rdx;"
-		"movq %rdx, (6*8)(%rdi);"
-		"movq (%rsp), %rax;"
-		"movq %rax, (7*8)(%rdi)");
-#else	 /* CONFIG_FRAME_POINTER */
-	__asm__("movq %rbx, (0*8)(%rdi);"
-		"movq %rbp, (1*8)(%rdi);"
-		"movq %r12, (2*8)(%rdi);"
-		"movq %r13, (3*8)(%rdi);"
-		"movq %r14, (4*8)(%rdi);"
-		"movq %r15, (5*8)(%rdi);"
-		"leaq 8(%rsp), %rdx;"
-		"movq %rdx, (6*8)(%rdi);"
-		"movq (%rsp), %rax;"
-		"movq %rax, (7*8)(%rdi)");
-#endif   /* CONFIG_FRAME_POINTER */
-	KDB_STATE_SET(LONGJMP);
-	return 0;
-}
-
-void asmlinkage
-kdba_longjmp(kdb_jmp_buf *jb, int reason)
-{
-#if defined(CONFIG_FRAME_POINTER)
-	__asm__("movq (0*8)(%rdi),%rbx;"
-		"movq (1*8)(%rdi),%rbp;"
-		"movq (2*8)(%rdi),%r12;"
-		"movq (3*8)(%rdi),%r13;"
-		"movq (4*8)(%rdi),%r14;"
-		"movq (5*8)(%rdi),%r15;"
-		"test %esi,%esi;"
-		"mov $01,%eax;"
-		"cmove %eax,%esi;"
-		"mov %esi, %eax;"
-		"movq (7*8)(%rdi),%rdx;"
-		"movq (6*8)(%rdi),%rsp;"
-		"jmpq *%rdx");
-#else    /* CONFIG_FRAME_POINTER */
-	__asm__("movq (0*8)(%rdi),%rbx;"
-		"movq (1*8)(%rdi),%rbp;"
-		"movq (2*8)(%rdi),%r12;"
-		"movq (3*8)(%rdi),%r13;"
-		"movq (4*8)(%rdi),%r14;"
-		"movq (5*8)(%rdi),%r15;"
-		"test %esi,%esi;"
-		"mov $01,%eax;"
-		"cmove %eax,%esi;"
-		"mov %esi, %eax;"
-		"movq (7*8)(%rdi),%rdx;"
-		"movq (6*8)(%rdi),%rsp;"
-		"jmpq *%rdx");
-#endif	 /* CONFIG_FRAME_POINTER */
-}
-#endif	/* KDB_HAVE_LONGJMP */
+asm(
+"        .section .text\n"
+"        .globl  kdba_setjmp\n"
+"        .p2align 4\n"
+"kdba_setjmp:\n"
+"        movq    %rbx,0x0(%rdi)\n"
+"        movq    %rbp,0x8(%rdi)\n"
+"        movq    %r12,0x10(%rdi)\n"
+"        movq    %r13,0x18(%rdi)\n"
+"        movq    %r14,0x20(%rdi)\n"
+"        movq    %r15,0x28(%rdi)\n"
+"        leaq    0x8(%rsp),%rdx\n"
+"        movq    %rdx,0x30(%rdi)\n"
+"        movq    (%rsp),%rax\n"
+"        movq    %rax,0x38(%rdi)\n"
+"        xorq    %rax,%rax\n"
+"        ret\n"
+"           \n"
+"        .globl  kdba_longjmp\n"
+"kdba_longjmp:\n"
+"        movq    0x0(%rdi),%rbx\n"
+"        movq    0x8(%rdi),%rbp\n"
+"        movq    0x10(%rdi),%r12\n"
+"        movq    0x18(%rdi),%r13\n"
+"        movq    0x20(%rdi),%r14\n"
+"        movq    0x28(%rdi),%r15\n"
+"        test    %esi,%esi\n"
+"        mov     $1,%eax\n"
+"        cmove   %eax,%esi\n"
+"        mov     %esi,%eax\n"
+"        movq    0x38(%rdi),%rdx\n"
+"        movq    0x30(%rdi),%rsp\n"
+"        jmpq    *%rdx\n"
+"        .previous\n"
+);
 
 /*
  * kdba_enable_lbr


-- 
Dan Aloni, Linux specialist
XIV LTD, http://www.xivstorage.com
[email protected], [email protected], [email protected], [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.