Hi Keith,

I was getting pretty desperate yesterday and even considered writing
the whole setjmp over in assembler;-)  Finally I realized that the
stack is pretty consistent.  If setjmp is compiled to save a frame
pointer it will always be the first thing pushed on the stack after
the return address.  So I don't need the __builtin_frame_address().

Here is a new version of the patch.  I like this better than
defeating the leaf optimization.

Jim Houston - Concurrent Computer Corp.

--

diff -urN -X dontdiff 2.4.18-ccur1.orig/arch/i386/kdb/kdbasupport.c 
2.4.18-ccur1/arch/i386/kdb/kdbasupport.c
--- 2.4.18-ccur1.orig/arch/i386/kdb/kdbasupport.c       Wed Jun 12 09:44:32 2002
+++ 2.4.18-ccur1/arch/i386/kdb/kdbasupport.c    Thu Aug  1 19:48:29 2002
@@ -1041,56 +1041,37 @@
 int
 kdba_setjmp(kdb_jmp_buf *jb)
 {
-#if defined(CONFIG_FRAME_POINTER)
-       __asm__ ("movl 8(%esp), %eax\n\t"
-                "movl %ebx, 0(%eax)\n\t"
-                "movl %esi, 4(%eax)\n\t"
-                "movl %edi, 8(%eax)\n\t"
-                "movl (%esp), %ecx\n\t"
-                "movl %ecx, 12(%eax)\n\t"
-                "leal 8(%esp), %ecx\n\t"
-                "movl %ecx, 16(%eax)\n\t"
-                "movl 4(%esp), %ecx\n\t"
-                "movl %ecx, 20(%eax)\n\t");
-#else   /* CONFIG_FRAME_POINTER */
-       __asm__ ("movl 4(%esp), %eax\n\t"
-                "movl %ebx, 0(%eax)\n\t"
-                "movl %esi, 4(%eax)\n\t"
-                "movl %edi, 8(%eax)\n\t"
-                "movl %ebp, 12(%eax)\n\t"
-                "leal 4(%esp), %ecx\n\t"
-                "movl %ecx, 16(%eax)\n\t"
-                "movl 0(%esp), %ecx\n\t"
-                "movl %ecx, 20(%eax)\n\t");
-#endif   /* CONFIG_FRAME_POINTER */
+       register kdb_jmp_buf *eax asm("eax") = jb;
+       register long *ebp;
+
+       /* save the callee save registers. */
+       __asm__("movl %%ebx,0(%0)\n\t"
+               "movl %%esi,4(%0)\n\t"
+               "movl %%edi,8(%0)\n\t" : : "a" (eax));
+       /* check if we saved bp on our stack */
+       __asm__("movl   %%ebp,%0" : "=r" (ebp) : );
+       if (ebp == ((long *)&jb)-2)
+               ebp = (long *)(*ebp);
+       eax->regs[3] = (unsigned long)ebp;
+       eax->regs[4] = (unsigned long)&jb;
+       eax->regs[5] = (unsigned long)__builtin_return_address(0);
        KDB_STATE_SET(LONGJMP);
        return 0;
 }
 
 void
 kdba_longjmp(kdb_jmp_buf *jb, int reason)
-{
-#if defined(CONFIG_FRAME_POINTER)
-       __asm__("movl 8(%esp), %ecx\n\t"
-               "movl 12(%esp), %eax\n\t"
-               "movl 20(%ecx), %edx\n\t"
-               "movl 0(%ecx), %ebx\n\t"
-               "movl 4(%ecx), %esi\n\t"
-               "movl 8(%ecx), %edi\n\t"
-               "movl 12(%ecx), %ebp\n\t"
-               "movl 16(%ecx), %esp\n\t"
-               "jmp *%edx\n");
-#else    /* CONFIG_FRAME_POINTER */
-       __asm__("movl 4(%esp), %ecx\n\t"
-               "movl 8(%esp), %eax\n\t"
-               "movl 20(%ecx), %edx\n\t"
-               "movl 0(%ecx), %ebx\n\t"
-               "movl 4(%ecx), %esi\n\t"
-               "movl 8(%ecx), %edi\n\t"
-               "movl 12(%ecx), %ebp\n\t"
-               "movl 16(%ecx), %esp\n\t"
-               "jmp *%edx\n");
-#endif  /* CONFIG_FRAME_POINTER */
+{                                                                               
+       __asm__(
+               "movl 20(%0), %%edx\n\t"
+               "movl 0(%0), %%ebx\n\t"
+               "movl 4(%0), %%esi\n\t"
+               "movl 8(%0), %%edi\n\t"
+               "movl 12(%0), %%ebp\n\t"
+               "movl 16(%0), %%esp\n\t"
+               "jmp *%%edx\n" : : 
+                       "c" (jb),
+                       "a" (reason));
 }
 #endif /* KDB_HAVE_LONGJMP */
 

Reply via email to