Index: arm-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-tdep.c,v retrieving revision 1.358 diff -u -5 -p -r1.358 arm-tdep.c --- arm-tdep.c 2 Feb 2012 20:19:12 -0000 1.358 +++ arm-tdep.c 9 Mar 2012 04:19:39 -0000 @@ -41,10 +41,11 @@ #include "gdbtypes.h" #include "prologue-value.h" #include "target-descriptions.h" #include "user-regs.h" #include "observer.h" +#include "remote.h" #include "arm-tdep.h" #include "gdb/sim-arm.h" #include "elf-bfd.h" @@ -53,10 +54,11 @@ #include "gdb_assert.h" #include "vec.h" #include "features/arm-with-m.c" +#include "features/arm-with-m-fpa.c" #include "features/arm-with-iwmmxt.c" #include "features/arm-with-vfpv2.c" #include "features/arm-with-vfpv3.c" #include "features/arm-with-neon.c" @@ -9796,11 +9798,11 @@ arm_gdbarch_init (struct gdbarch_info in numerically greater than TAG_CPU_ARCH_V7). */ if (!tdesc_has_registers (tdesc) && (attr_arch == TAG_CPU_ARCH_V6_M || attr_arch == TAG_CPU_ARCH_V6S_M || attr_profile == 'M')) - tdesc = tdesc_arm_with_m; + is_m = 1; #endif } if (fp_model == ARM_FLOAT_AUTO) { @@ -9858,10 +9860,12 @@ arm_gdbarch_init (struct gdbarch_info in if (feature == NULL) return NULL; else is_m = 1; } + else + is_m = 0; tdesc_data = tdesc_data_alloc (); valid_p = 1; for (i = 0; i < ARM_SP_REGNUM; i++) @@ -10241,10 +10245,33 @@ arm_gdbarch_init (struct gdbarch_info in and does no harm, since nothing ever lists user registers. */ for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++) user_reg_add (gdbarch, arm_register_aliases[i].name, value_of_arm_user_reg, &arm_register_aliases[i].regnum); + if (is_m) + { + /* For backward-compatibility we allow two 'g' packet lengths with + the remote protocol depending on whether FPA registers are + supplied. M-profile targets do not have FPA registers, but some + stubs already exist in the wild which use a 'g' packet which + supplies them albeit with dummy values. The packet format which + includes FPA registers should be considered deprecated for + M-profile targets. + + The register sizes are fixed for these target descriptions in the + XML files, so we can hard-code them: r0-12,sp,lr,pc,xpsr for + tdesc_arm_with_m; and additionally f0-f7 and fps for + tdesc_arm_with_m_fpa. */ + + register_remote_g_packet_guess (gdbarch, + 17 * INT_REGISTER_SIZE, + tdesc_arm_with_m); + register_remote_g_packet_guess (gdbarch, + 18 * INT_REGISTER_SIZE + + 8 * FP_REGISTER_SIZE, + tdesc_arm_with_m_fpa); + } return gdbarch; } static void arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file) @@ -10289,10 +10316,11 @@ _initialize_arm_tdep (void) bfd_target_elf_flavour, arm_elf_osabi_sniffer); /* Initialize the standard target descriptions. */ initialize_tdesc_arm_with_m (); + initialize_tdesc_arm_with_m_fpa (); initialize_tdesc_arm_with_iwmmxt (); initialize_tdesc_arm_with_vfpv2 (); initialize_tdesc_arm_with_vfpv3 (); initialize_tdesc_arm_with_neon (); Index: features/arm-with-m-fpa.c =================================================================== RCS file: features/arm-with-m-fpa.c diff -N features/arm-with-m-fpa.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ features/arm-with-m-fpa.c 9 Mar 2012 04:19:39 -0000 @@ -0,0 +1,46 @@ +/* THIS FILE IS GENERATED. Original: arm-with-m-fpa.xml */ + +#include "defs.h" +#include "osabi.h" +#include "target-descriptions.h" + +struct target_desc *tdesc_arm_with_m_fpa; +static void +initialize_tdesc_arm_with_m_fpa (void) +{ + struct target_desc *result = allocate_target_description (); + struct tdesc_feature *feature; + struct tdesc_type *field_type, *type; + + feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile"); + tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr"); + tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr"); + tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int"); + + feature = tdesc_create_feature (result, "org.gnu.gdb.arm.fpa"); + tdesc_create_reg (feature, "f0", 16, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f1", 17, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f2", 18, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f3", 19, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f4", 20, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f5", 21, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f6", 22, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "f7", 23, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "fps", 24, 1, NULL, 32, "int"); + + tdesc_arm_with_m_fpa = result; +} Index: features/arm-with-m-fpa.xml =================================================================== RCS file: features/arm-with-m-fpa.xml diff -N features/arm-with-m-fpa.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ features/arm-with-m-fpa.xml 9 Mar 2012 04:19:39 -0000 @@ -0,0 +1,12 @@ + + + + + + + +