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 17:58:50 -0000 @@ -38,10 +38,11 @@ #include "trad-frame.h" #include "objfiles.h" #include "dwarf2-frame.h" #include "gdbtypes.h" #include "prologue-value.h" +#include "remote.h" #include "target-descriptions.h" #include "user-regs.h" #include "observer.h" #include "arm-tdep.h" @@ -53,10 +54,11 @@ #include "gdb_assert.h" #include "vec.h" #include "features/arm-with-m.c" +#include "features/arm-with-m-fpa-layout.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" @@ -9663,10 +9665,45 @@ arm_register_reggroup_p (struct gdbarch else return default_register_reggroup_p (gdbarch, regnum, group); } +/* 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. */ + +static void +arm_register_g_packet_guesses (struct gdbarch *gdbarch) +{ + if (gdbarch_tdep (gdbarch)->is_m) + { + /* If we know from the executable this is an M-profile target, + cater for remote targets whose register set layout is the + same as the FPA layout. */ + register_remote_g_packet_guess (gdbarch, + /* r0-r12,sp,lr,pc; f0-f7; fps,cpsr */ + (16 * INT_REGISTER_SIZE) + + (8 * FP_REGISTER_SIZE) + + (2 * INT_REGISTER_SIZE), + tdesc_arm_with_m_fpa_layout); + + /* The regular M-profile layout. */ + register_remote_g_packet_guess (gdbarch, + /* r0-r12,sp,lr,pc; xpsr */ + (16 * INT_REGISTER_SIZE) + + INT_REGISTER_SIZE, + tdesc_arm_with_m); + } + + /* Otherwise we don't have a useful guess. */ +} + + /* Initialize the current architecture based on INFO. If possible, re-use an architecture from ARCHES, which is a list of architectures already created during this debugging session. Called e.g. at program startup, when reading a core file, and when @@ -9796,11 +9833,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) { @@ -10053,10 +10090,12 @@ arm_gdbarch_init (struct gdbarch_info in tdep->have_vfp_registers = have_vfp_registers; tdep->have_vfp_pseudos = have_vfp_pseudos; tdep->have_neon_pseudos = have_neon_pseudos; tdep->have_neon = have_neon; + arm_register_g_packet_guesses (gdbarch); + /* Breakpoints. */ switch (info.byte_order_for_code) { case BFD_ENDIAN_BIG: tdep->arm_breakpoint = arm_default_arm_be_breakpoint; @@ -10289,10 +10328,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_layout (); 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-layout.c =================================================================== RCS file: features/arm-with-m-fpa-layout.c diff -N features/arm-with-m-fpa-layout.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ features/arm-with-m-fpa-layout.c 9 Mar 2012 17:58:50 -0000 @@ -0,0 +1,44 @@ +/* THIS FILE IS GENERATED. Original: arm-with-m-fpa-layout.xml */ + +#include "defs.h" +#include "osabi.h" +#include "target-descriptions.h" + +struct target_desc *tdesc_arm_with_m_fpa_layout; +static void +initialize_tdesc_arm_with_m_fpa_layout (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, "", 16, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 17, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 18, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 19, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 20, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 21, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 22, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 23, 1, NULL, 96, "arm_fpa_ext"); + tdesc_create_reg (feature, "", 24, 1, NULL, 32, "int"); + tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int"); + + tdesc_arm_with_m_fpa_layout = result; +} Index: features/arm-with-m-fpa-layout.xml =================================================================== RCS file: features/arm-with-m-fpa-layout.xml diff -N features/arm-with-m-fpa-layout.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ features/arm-with-m-fpa-layout.xml 9 Mar 2012 17:58:50 -0000 @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +