summaryrefslogtreecommitdiff
path: root/packages/gdb/gdb-6.3/thumb-breakpoint.patch
blob: cd678b0b934283691b81ef9617d2df3b82588b8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;