From 7b8715682ae902fa51d0bf17dd57e6493a8c7711 Mon Sep 17 00:00:00 2001 From: Maxim Grigoriev Date: Wed, 8 Aug 2007 23:22:18 +0000 Subject: [PATCH] 2007-08-08 Maxim Grigoriev * 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 | 10 ++++++++++ gdb/xtensa-tdep.c | 44 +++++++++++++++++++++++++++++++++++++------- gdb/xtensa-tdep.h | 12 ++++++++++++ 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0c6308e649d..7ae91016d24 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2007-08-08 Maxim Grigoriev + + * 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 * serial.c (serial_open): Fix the OPEN parameter macro expansion. diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c index f8024a7a73a..c52aa14c086 100644 --- a/gdb/xtensa-tdep.c +++ b/gdb/xtensa-tdep.c @@ -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 = ®MAP[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; } diff --git a/gdb/xtensa-tdep.h b/gdb/xtensa-tdep.h index 4b219085217..9f450c6cb43 100644 --- a/gdb/xtensa-tdep.h +++ b/gdb/xtensa-tdep.h @@ -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; -- 2.30.2