diff options
author | John Bowler <jbowler@nslu2-linux.org> | 2005-09-22 20:04:07 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2005-09-22 20:04:07 +0000 |
commit | 153ada05e0051228c641736634c255bc18962e81 (patch) | |
tree | 36dd05d65d17980d325dd16f30cd47b4689500e3 /packages/gdb/gdb-6.3/thumb-breakpoint.patch | |
parent | 3d947aa7a969ef9343e1d64b055d37d0ce856fb0 (diff) |
gdb_6.3: patch the thumb handling to use a thumb swi (not an undefined instr)
This doesn't fix thumb debugging (a thumb program run under gdb will crash
right at the start) but it does avoid the illegal instruction crash by
inserting a swi instead.
Diffstat (limited to 'packages/gdb/gdb-6.3/thumb-breakpoint.patch')
-rw-r--r-- | packages/gdb/gdb-6.3/thumb-breakpoint.patch | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/packages/gdb/gdb-6.3/thumb-breakpoint.patch b/packages/gdb/gdb-6.3/thumb-breakpoint.patch new file mode 100644 index 0000000000..cd678b0b93 --- /dev/null +++ b/packages/gdb/gdb-6.3/thumb-breakpoint.patch @@ -0,0 +1,41 @@ +# This patch causes gdb to use thumb swi(1) on linux for a thumb breakpoint +# rather than the default, swi(254). To stand any chance of making this +# work a linux kernel patch is required to read the swi number on a thumb +# swi. In the absence of this patch gdb will effectively insert a random +# swi because the kernel reads the swi number from r7... +# +--- gdb-6.3/gdb/arm-linux-tdep.c.orig 2005-09-19 13:55:16.486702426 -0700 ++++ gdb-6.3/gdb/arm-linux-tdep.c 2005-09-19 13:57:44.127992906 -0700 +@@ -44,6 +44,12 @@ + + static const char arm_linux_arm_be_breakpoint[] = { 0xef, 0x9f, 0x00, 0x01 }; + ++/* The following requires the corresponding patch to the kernel to recognise ++ * this SWI as a breakpoint. ++ */ ++static const char arm_linux_thumb_le_breakpoint[] = {0x01, 0xdf}; ++static const char arm_linux_thumb_be_breakpoint[] = {0xdf, 0x01}; ++ + /* Description of the longjmp buffer. */ + #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE + #define ARM_LINUX_JB_PC 21 +@@ -463,10 +469,17 @@ + + tdep->lowest_pc = 0x8000; + if (info.byte_order == BFD_ENDIAN_BIG) +- tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; ++ { ++ tdep->arm_breakpoint = arm_linux_arm_be_breakpoint; ++ tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint; ++ } + else +- tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; ++ { ++ tdep->arm_breakpoint = arm_linux_arm_le_breakpoint; ++ tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint; ++ } + tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint); ++ tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint); + + tdep->fp_model = ARM_FLOAT_FPA; + |