2007-08-08 Maxim Grigoriev <maxim2405@gmail.com>
authorMaxim Grigoriev <maxim2405@gmail.com>
Wed, 8 Aug 2007 23:22:18 +0000 (23:22 +0000)
committerMaxim Grigoriev <maxim2405@gmail.com>
Wed, 8 Aug 2007 23:22:18 +0000 (23:22 +0000)
* xtensa-tdep.h (XTENSA_MAX_COPROCESSOR): New.
(xtensa_register_group_t): Add entries for coprocessors.
* xtensa-tdep.c (xtensa_init_reggroups): New register groups.
(xtensa_add_reggroups): Likewise.
(xtensa_register_reggroup_p): Likewise.
(xtensa_coprocessor_register_group): New function.
(xtensa_cp): New.

gdb/ChangeLog
gdb/xtensa-tdep.c
gdb/xtensa-tdep.h

index 0c6308e649d19d8a3dc192acce521fb3c083f14a..7ae91016d24b4ec93dbd75cf00087798d7d25ea0 100644 (file)
@@ -1,3 +1,13 @@
+2007-08-08  Maxim Grigoriev  <maxim2405@gmail.com>
+
+       * xtensa-tdep.h (XTENSA_MAX_COPROCESSOR): New.
+       (xtensa_register_group_t): Add entries for coprocessors.
+       * xtensa-tdep.c (xtensa_init_reggroups): New register groups.
+       (xtensa_add_reggroups): Likewise.
+       (xtensa_register_reggroup_p): Likewise.
+       (xtensa_coprocessor_register_group): New function.
+       (xtensa_cp): New.
+
 2007-08-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * serial.c (serial_open): Fix the OPEN parameter macro expansion.
index f8024a7a73a97c757944fba5e7c58b46c498e4fb..c52aa14c0867c568b37b745023424d1c9940a09e 100644 (file)
@@ -658,6 +658,7 @@ xtensa_pseudo_register_write (struct gdbarch *gdbarch,
 static struct reggroup *xtensa_ar_reggroup;
 static struct reggroup *xtensa_user_reggroup;
 static struct reggroup *xtensa_vectra_reggroup;
+static struct reggroup *xtensa_cp[XTENSA_MAX_COPROCESSOR];
 
 static void
 xtensa_init_reggroups (void)
@@ -665,25 +666,51 @@ xtensa_init_reggroups (void)
   xtensa_ar_reggroup = reggroup_new ("ar", USER_REGGROUP);
   xtensa_user_reggroup = reggroup_new ("user", USER_REGGROUP);
   xtensa_vectra_reggroup = reggroup_new ("vectra", USER_REGGROUP);
-}
 
+  xtensa_cp[0] = reggroup_new ("cp0", USER_REGGROUP);
+  xtensa_cp[1] = reggroup_new ("cp1", USER_REGGROUP);
+  xtensa_cp[2] = reggroup_new ("cp2", USER_REGGROUP);
+  xtensa_cp[3] = reggroup_new ("cp3", USER_REGGROUP);
+  xtensa_cp[4] = reggroup_new ("cp4", USER_REGGROUP);
+  xtensa_cp[5] = reggroup_new ("cp5", USER_REGGROUP);
+  xtensa_cp[6] = reggroup_new ("cp6", USER_REGGROUP);
+  xtensa_cp[7] = reggroup_new ("cp7", USER_REGGROUP);
+}
 
 static void
 xtensa_add_reggroups (struct gdbarch *gdbarch)
 {
+  int i;
+
+  /* Predefined groups.  */
   reggroup_add (gdbarch, all_reggroup);
   reggroup_add (gdbarch, save_reggroup);
   reggroup_add (gdbarch, restore_reggroup);
   reggroup_add (gdbarch, system_reggroup);
-  reggroup_add (gdbarch, vector_reggroup);             /* vectra */
-  reggroup_add (gdbarch, general_reggroup);            /* core */
-  reggroup_add (gdbarch, float_reggroup);              /* float */
+  reggroup_add (gdbarch, vector_reggroup);
+  reggroup_add (gdbarch, general_reggroup);
+  reggroup_add (gdbarch, float_reggroup);
+
+  /* Xtensa-specific groups.  */
+  reggroup_add (gdbarch, xtensa_ar_reggroup);
+  reggroup_add (gdbarch, xtensa_user_reggroup);
+  reggroup_add (gdbarch, xtensa_vectra_reggroup);
 
-  reggroup_add (gdbarch, xtensa_ar_reggroup);          /* ar */
-  reggroup_add (gdbarch, xtensa_user_reggroup);                /* user */
-  reggroup_add (gdbarch, xtensa_vectra_reggroup);      /* vectra */
+  for (i = 0; i < XTENSA_MAX_COPROCESSOR; i++)
+    reggroup_add (gdbarch, xtensa_cp[i]);
 }
 
+static int 
+xtensa_coprocessor_register_group (struct reggroup *group)
+{
+  int i;
+
+  for (i = 0; i < XTENSA_MAX_COPROCESSOR; i++)
+    if (group == xtensa_cp[i])
+      return i;
+
+  return -1;
+}
 
 #define SAVE_REST_FLAGS        (XTENSA_REGISTER_FLAGS_READABLE \
                        | XTENSA_REGISTER_FLAGS_WRITABLE \
@@ -700,6 +727,7 @@ xtensa_register_reggroup_p (struct gdbarch *gdbarch,
   xtensa_register_t* reg = &REGMAP[regnum];
   xtensa_register_type_t type = reg->type;
   xtensa_register_group_t rg = reg->group;
+  int cp_number;
 
   /* First, skip registers that are not visible to this target
      (unknown and unmapped registers when not using ISS).  */
@@ -725,6 +753,8 @@ xtensa_register_reggroup_p (struct gdbarch *gdbarch,
   if (group == save_reggroup || group == restore_reggroup)
     return (regnum < gdbarch_num_regs (current_gdbarch)
            && (reg->flags & SAVE_REST_FLAGS) == SAVE_REST_VALID);
+  if ((cp_number = xtensa_coprocessor_register_group (group)) >= 0)
+    return rg & (xtRegisterGroupCP0 << cp_number);
   else
     return 1;
 }
index 4b219085217167b0b11ec251a144b8d786f68473..9f450c6cb436e919c80ce1c7c4316ff6c77ffcc1 100644 (file)
@@ -44,6 +44,8 @@ typedef enum
 
 /*  Xtensa register group.  */
 
+#define XTENSA_MAX_COPROCESSOR 0x08  /* Number of Xtensa coprocessors.  */
+
 typedef enum 
 {
   xtRegisterGroupUnknown = 0,
@@ -58,6 +60,16 @@ typedef enum
   xtRegisterGroupFloat         = 0x0400,    /* Floating Point.  */
   xtRegisterGroupVectra                = 0x0800,    /* Vectra.  */
   xtRegisterGroupSystem                = 0x1000,    /* System.  */
+
+  xtRegisterGroupCP0       = 0x01000000,    /* CP0.  */
+  xtRegisterGroupCP1       = 0x02000000,    /* CP1.  */
+  xtRegisterGroupCP2       = 0x04000000,    /* CP2.  */
+  xtRegisterGroupCP3       = 0x08000000,    /* CP3.  */
+  xtRegisterGroupCP4       = 0x10000000,    /* CP4.  */
+  xtRegisterGroupCP5       = 0x20000000,    /* CP5.  */
+  xtRegisterGroupCP6       = 0x40000000,    /* CP6.  */
+  xtRegisterGroupCP7       = 0x80000000,    /* CP7.  */
+
 } xtensa_register_group_t;