diff -x CVS -x .svn -x '*~' -x '.#*' -x autom4te.cache -urpN src.old/gdb/arm-tdep.c src/gdb/arm-tdep.c --- src.old/gdb/arm-tdep.c 2010-11-10 01:25:08.000000000 +0000 +++ src/gdb/arm-tdep.c 2010-11-10 02:00:31.000000000 +0000 @@ -42,6 +42,7 @@ #include "prologue-value.h" #include "target-descriptions.h" #include "user-regs.h" +#include "remote.h" #include "arm-tdep.h" #include "gdb/sim-arm.h" @@ -54,6 +55,7 @@ #include "vec.h" #include "features/arm-with-m.c" +#include "features/arm-with-m-fpa.c" static int arm_debug; @@ -7130,7 +7132,7 @@ arm_gdbarch_init (struct gdbarch_info in && (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 } @@ -7192,6 +7194,8 @@ arm_gdbarch_init (struct gdbarch_info in else is_m = 1; } + else + is_m = 0; tdesc_data = tdesc_data_alloc (); @@ -7566,6 +7570,29 @@ arm_gdbarch_init (struct gdbarch_info in 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; } @@ -7609,6 +7636,7 @@ _initialize_arm_tdep (void) /* Initialize the standard target descriptions. */ initialize_tdesc_arm_with_m (); + initialize_tdesc_arm_with_m_fpa (); /* Get the number of possible sets of register names defined in opcodes. */ num_disassembly_options = get_arm_regname_num_options (); diff -x CVS -x .svn -x '*~' -x '.#*' -x autom4te.cache -urpN src.old/gdb/features/arm-with-m-fpa.c src/gdb/features/arm-with-m-fpa.c --- src.old/gdb/features/arm-with-m-fpa.c 1970-01-01 01:00:00.000000000 +0100 +++ src/gdb/features/arm-with-m-fpa.c 2010-11-10 02:00:31.000000000 +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; +} diff -x CVS -x .svn -x '*~' -x '.#*' -x autom4te.cache -urpN src.old/gdb/features/arm-with-m-fpa.xml src/gdb/features/arm-with-m-fpa.xml --- src.old/gdb/features/arm-with-m-fpa.xml 1970-01-01 01:00:00.000000000 +0100 +++ src/gdb/features/arm-with-m-fpa.xml 2010-11-10 02:00:31.000000000 +0000 @@ -0,0 +1,12 @@ + + + + + + + +