On Tue, 2006-07-11 at 13:02 +0530, Amit S. Kale wrote:
> Hi Andrei,
> 
> Thanks for these patches. Your point about the need for a general cleanup of 
> current thread info pointer fetch is exellent. We definitely need to add some 
> ifdefs around stack size.
> 
> I would also like to add more code to kernel entry points to save thread info 
> pointer. It would be too intrusive though, since with such a code in place, 
> acceptance into mainline kernel becomes difficult. We could add it to a 
> non-lite patch.

Sounds like the "critical exception stack" is used for other things than
single stepping; like traps or interrupts.  

-piet

> 
> Suggestions?
> -Amit
> 
> 
> On Wednesday 05 July 2006 21:58, Andrei Konovalov wrote:
> > Hello,
> >
> > Here:
> >
> > +   /*
> > +    * On Book E and perhaps other processsors, singlestep is handled on
> > +    * the critical exception stack.  This causes current_thread_info()
> > +    * to fail, since it it locates the thread_info by masking off
> > +    * the low bits of the current stack pointer.  We work around
> > +    * this issue by copying the thread_info from the kernel stack
> > +    * before calling kgdb_handle_exception, and copying it back
> > +    * afterwards.  On most processors the copy is avoided since
> > +    * exception_thread_info == thread_info.
> > +    */
> > +   thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1));
> > +   exception_thread_info = current_thread_info();
> >
> > - calling current_thread_info() is incorrect, as it assumes 8K stack, but
> > for Book E and ppc4xx the critical exception stack is 4K and is 4K-aligned
> > (see head_4xx.S, head_44x.S and head_fsl_booke.S in arch/ppc/kernel/).
> > So depending on the actual kernel layout/configuration
> > exception_thread_info could point 4K below the critical exception stack.
> > Even if
> > (exception_stack_bottom & ~(THREAD_SIZE-1)) != 0 (i.e. the stack is NOT 8K
> > aligned) everything seems to work OK in most cases (the overwritten data
> > are not so critical?). But we did encountered one case when trying to
> > single step from the default breakpoint made the kernel to hang.
> >
> > There are several possible ways to fix that:
> >
> > - make the critical exception stack to be 8K aligned:
> >
> > ===========================================================================
> >========== diff -upr a/arch/ppc/kernel/head_4xx.S
> > b/arch/ppc/kernel/head_4xx.S --- a/arch/ppc/kernel/head_4xx.S       
> > 2006-07-05 20:23:51.000000000 +0400 +++ b/arch/ppc/kernel/head_4xx.S       
> > 2006-07-05 19:54:51.000000000 +0400 @@ -1001,7 +1001,7 @@ swapper_pg_dir:
> >
> >   /* Stack for handling critical exceptions from kernel mode */
> >          .section .bss
> > -        .align 12
> > +        .align 13
> >   exception_stack_bottom:
> >          .space  4096
> >   critical_stack_top:
> > ===========================================================================
> >==========
> >
> > - replace call to current_thread_info() with:
> >
> > ===========================================================================
> >========== diff -upr a/arch/ppc/kernel/kgdb.c b/arch/ppc/kernel/kgdb.c
> > --- a/arch/ppc/kernel/kgdb.c    2006-07-05 19:53:29.000000000 +0400
> > +++ b/arch/ppc/kernel/kgdb.c    2006-07-05 20:18:06.000000000 +0400
> > @@ -106,29 +106,32 @@ static int kgdb_breakpoint(struct pt_reg
> >   static int kgdb_singlestep(struct pt_regs *regs)
> >   {
> >          struct thread_info *thread_info, *exception_thread_info;
> > +       register unsigned long sp asm("r1");
> >
> >          if (user_mode(regs))
> >                  return 0;
> > +
> > +#if defined(CONFIG_40x) || defined(CONFIG_44x) || defined(CONFIG_E500)
> >          /*
> > -       * On Book E and perhaps other processsors, singlestep is handled on
> > +       * On Book E, ppc40x, and ppc44x, singlestep is handled on
> >          * the critical exception stack.  This causes current_thread_info()
> > -       * to fail, since it it locates the thread_info by masking off
> > +       * to fail, since it locates the thread_info by masking off
> >          * the low bits of the current stack pointer.  We work around
> >          * this issue by copying the thread_info from the kernel stack
> >          * before calling kgdb_handle_exception, and copying it back
> > -       * afterwards.  On most processors the copy is avoided since
> > -       * exception_thread_info == thread_info.
> > +       * afterwards.
> >          */
> > +#define CRIT_STACK_SIZE        0x1000  /* 4kB */
> >          thread_info = (struct thread_info *)(regs->gpr[1] &
> > ~(THREAD_SIZE-1)); -       exception_thread_info = current_thread_info();
> > -
> > -       if (thread_info != exception_thread_info)
> > -               memcpy(exception_thread_info, thread_info, sizeof
> > *thread_info); +       exception_thread_info = (struct thread_info *)(sp &
> > ~(CRIT_STACK_SIZE-1)); +       memcpy(exception_thread_info, thread_info,
> > sizeof *thread_info);
> >
> >          kgdb_handle_exception(0, SIGTRAP, 0, regs);
> >
> > -       if (thread_info != exception_thread_info)
> > -               memcpy(thread_info, exception_thread_info, sizeof
> > *thread_info); +       memcpy(thread_info, exception_thread_info, sizeof
> > *thread_info); +#else
> > +       kgdb_handle_exception(0, SIGTRAP, 0, regs);
> > +#endif
> >
> >          return 1;
> >   }
> > ===========================================================================
> >==========
> >
> >    or
> >
> > ===========================================================================
> >========== diff -upr a/arch/ppc/kernel/kgdb.c c/arch/ppc/kernel/kgdb.c
> > --- a/arch/ppc/kernel/kgdb.c    2006-07-05 19:53:29.000000000 +0400
> > +++ c/arch/ppc/kernel/kgdb.c    2006-07-05 20:17:51.000000000 +0400
> > @@ -110,9 +110,9 @@ static int kgdb_singlestep(struct pt_reg
> >          if (user_mode(regs))
> >                  return 0;
> >          /*
> > -       * On Book E and perhaps other processsors, singlestep is handled on
> > +       * On Book E and perhaps other processors, singlestep is handled on
> >          * the critical exception stack.  This causes current_thread_info()
> > -       * to fail, since it it locates the thread_info by masking off
> > +       * to fail, since it locates the thread_info by masking off
> >          * the low bits of the current stack pointer.  We work around
> >          * this issue by copying the thread_info from the kernel stack
> >          * before calling kgdb_handle_exception, and copying it back
> > @@ -122,8 +122,14 @@ static int kgdb_singlestep(struct pt_reg
> >          thread_info = (struct thread_info *)(regs->gpr[1] &
> > ~(THREAD_SIZE-1)); exception_thread_info = current_thread_info();
> >
> > -       if (thread_info != exception_thread_info)
> > +       if (thread_info != exception_thread_info) {
> > +               #define CRIT_STACK_SIZE 0x1000
> > +               register unsigned long sp asm("r1");
> > +
> > +               exception_thread_info =
> > +                       (struct thread_info *)(sp & ~(CRIT_STACK_SIZE-1));
> >                  memcpy(exception_thread_info, thread_info, sizeof
> > *thread_info); +       }
> >
> >          kgdb_handle_exception(0, SIGTRAP, 0, regs);
> >
> > ===========================================================================
> >==========
> >
> > To say the true, I don't like all the three (these are just to illustrate
> > the idea). Seems some general cleanup in handling the stack size would make
> > sense.
> >
> > Suggestions?
> >
> >
> > Thanks,
> > Andrei
> >
> >
> > Using Tomcat but need to do more? Need to support web services, security?
> > Get stuff done quickly with pre-integrated technology to make your job
> > easier Download IBM WebSphere Application Server v.1.0.1 based on Apache
> > Geronimo
> > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> > _______________________________________________
> > Kgdb-bugreport mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport
> 
> 
> -------------------------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Kgdb-bugreport mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport
-- 
Piet Delaney
BlueLane Teck
W: (408) 200-5256; [EMAIL PROTECTED]
H: (408) 243-8872; [EMAIL PROTECTED]




-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

Reply via email to