Hello.
Kevin Hilman wrote:
> Without the CPSR register, gdb is unable to correctly step over a
> conditional branch. This is because it cannot see the condition code
> bits, and thus cannot determine which side of the branch to place the
> breakpoint.
> This patch fixes the register layout of the registers passed to the host
> gdb so that CPSR is properly interpreted.
> Index: linux-2.6.18/include/asm-arm/kgdb.h
> ===================================================================
> --- linux-2.6.18.orig/include/asm-arm/kgdb.h
> +++ linux-2.6.18/include/asm-arm/kgdb.h
> @@ -52,15 +52,27 @@ extern int kgdb_fault_expected;
> #endif /* !__ASSEMBLY__ */
>
> /*
> - * From Amit S. Kale:
> + * From Kevin Hilman:
> *
> - * In the register packet, words 0-15 are R0 to R10, FP, IP, SP, LR, PC. But
> - * Register 16 isn't cpsr. GDB passes CPSR in word 25. There are 9 words in
> - * between which are unused. Passing only 26 words to gdb is sufficient.
> - * GDB can figure out that floating point registers are not passed.
> - * GDB_MAX_REGS should be 26.
> + * gdb is expecting the following registers layout.
> + *
> + * r0-r15: 1 long word each
> + * f0-f7: unused, 3 long words each !!
Now that's really strange. :-/
> + * fps: unused, 1 long word
> + * cpsr: 1 long word
> + *
> + * Even though f0-f7 and fps are not used, they need to be
> + * present in the registers sent for correct processing in
> + * the host-side gdb.
> + *
> + * In particular, it is crucial that CPSR is in the right place,
> + * otherwise gdb will not be able to correctly interpret stepping over
> + * conditional branches.
> */
> -#define GDB_MAX_REGS (26)
> +#define _GP_REGS 16
> +#define _FP_REGS 8
> +#define _EXTRA_REGS 2
> +#define GDB_MAX_REGS (_GP_REGS + (_FP_REGS * 3) +
> _EXTRA_REGS)
>
> #define KGDB_MAX_NO_CPUS 1
> #define BUFMAX 400
> Index: linux-2.6.18/arch/arm/kernel/kgdb.c
> ===================================================================
> --- linux-2.6.18.orig/arch/arm/kernel/kgdb.c
> +++ linux-2.6.18/arch/arm/kernel/kgdb.c
> @@ -78,7 +78,7 @@ void gdb_regs_to_regs(unsigned long *gdb
> kernel_regs->ARM_sp = gdb_regs[_SP];
> kernel_regs->ARM_lr = gdb_regs[_LR];
> kernel_regs->ARM_pc = gdb_regs[_PC];
> - kernel_regs->ARM_cpsr = gdb_regs[GDB_MAX_REGS - 1];
> + kernel_regs->ARM_cpsr = gdb_regs[_CPSR];
> }
It's not that this change matters, since _CPSR is still defined as
GDB_MAX_REGS-1. :-)
WBR, Sergei
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport