This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
ARM patch -- extra info about cpsr register
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: ARM patch -- extra info about cpsr register
- From: Richard Earnshaw <rearnsha at arm dot com>
- Date: Mon, 13 Mar 2000 19:19:42 +0000
- cc: rearnsha at arm dot com
- Organization: ARM Ltd.
- Reply-To: rearnsha at arm dot com
Time I sorted out some of my local changes...
This patch provides a useful additional decoding of the CPSR register for
ARM ports of GDB for commands such as "info reg". It translates the
setting of the CPSR into a set of mnemonic letters representing the
settings of the various flag bits as documented in the data sheet (upper
case for set bits, lower case for clear bits) -- generally I find this
much more intelligible than the raw numbers.
<date> Richard Earnshaw (rearnsha@arm.com)
* arm-tdep.c (arm_print_register_hook): New function.
* arm/tm-arm.h (PRINT_REGISTER_HOOK): Call it.
(FLAG_*): New bits in CPSR.
Index: tm-arm.h
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/tm-arm.h,v
retrieving revision 1.1.1.9
diff -u -p -r1.1.1.9 tm-arm.h
--- tm-arm.h 2000/02/05 07:29:52 1.1.1.9
+++ tm-arm.h 2000/03/13 19:08:33
@@ -174,6 +174,10 @@ extern char **arm_register_names;
#define REGISTER_NAME(i) arm_register_names[i]
+/* Print extra information for some registers (eg cpsr). */
+extern void arm_print_register_hook PARAMS((int));
+#define PRINT_REGISTER_HOOK(regno) arm_print_register_hook(regno)
+
/* Register numbers of various important registers. Note that some of
these values are "real" register numbers, and correspond to the
general registers of the machine, and some are "phony" register
@@ -223,8 +227,24 @@ extern char **arm_register_names;
#define FLAG_Z 0x40000000
#define FLAG_C 0x20000000
#define FLAG_V 0x10000000
-
+#define FLAG_I 0x00000080
+#define FLAG_F 0x00000040
+#define FLAG_T 0x00000020
+
+#define FLAG_MODE 0x0000001f
+
+#define FLAG_USR 0x00000010
+#define FLAG_FIQ 0x00000011
+#define FLAG_IRQ 0x00000012
+#define FLAG_SVC 0x00000013
+#define FLAG_ABT 0x00000017
+#define FLAG_UND 0x0000001b
+#define FLAG_SYS 0x0000001f
+#define FLAG_USR26 0x00000000
+#define FLAG_FIQ26 0x00000001
+#define FLAG_IRQ26 0x00000002
+#define FLAG_SVC26 0x00000003
/* Total amount of space needed to store our copies of the machine's
register state, the array `registers'. */
Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.4
diff -u -p -r1.4 arm-tdep.c
--- arm-tdep.c 2000/02/29 07:23:02 1.4
+++ arm-tdep.c 2000/03/13 19:10:32
@@ -1001,6 +1001,44 @@ arm_init_extra_frame_info (int fromleaf,
}
+/* Print extra information about certain registers */
+void
+arm_print_register_hook(regno)
+ int regno;
+{
+ if (regno == PS_REGNUM)
+ {
+ int cpsr = read_register (PS_REGNUM);
+ char *cpsr_mode;
+
+ switch (cpsr & FLAG_MODE)
+ {
+ case FLAG_USR: cpsr_mode = "user"; break;
+ case FLAG_FIQ: cpsr_mode = "fiq"; break;
+ case FLAG_IRQ: cpsr_mode = "irq"; break;
+ case FLAG_SVC: cpsr_mode = "svc"; break;
+ case FLAG_ABT: cpsr_mode = "abort"; break;
+ case FLAG_UND: cpsr_mode = "undef"; break;
+ case FLAG_SYS: cpsr_mode = "system"; break;
+ case FLAG_USR26: cpsr_mode = "user26"; break;
+ case FLAG_FIQ26: cpsr_mode = "fiq26"; break;
+ case FLAG_IRQ26: cpsr_mode = "irq26"; break;
+ case FLAG_SVC26: cpsr_mode = "svc26"; break;
+ default: cpsr_mode = "invalid"; break;
+ }
+
+ printf_filtered ("\t%c%c%c%c-%c%c%c_%s",
+ cpsr & FLAG_N ? 'N' : 'n',
+ cpsr & FLAG_Z ? 'Z' : 'z',
+ cpsr & FLAG_C ? 'C' : 'c',
+ cpsr & FLAG_V ? 'V' : 'v',
+ cpsr & FLAG_I ? 'I' : 'i',
+ cpsr & FLAG_F ? 'F' : 'f',
+ cpsr & FLAG_T ? 'T' : 't',
+ cpsr_mode);
+ }
+}
+
/* Find the caller of this frame. We do this by seeing if LR_REGNUM
is saved in the stack anywhere, otherwise we get it from the
registers.