This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ARM patch -- extra info about cpsr register


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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]