Re: Fwd: Re: [patch] Add support for ARMv7M devices.

Jonathan Larmour
2012-03-11T03:37:05Z

[-- Attachment #1: Type: text/plain, Size: 2411 bytes --]

On 09/03/12 16:28, Pedro Alves wrote:
> On 03/09/2012 04:13 PM, Jonathan Larmour wrote:
>>
>> But you have made me think of one improvement: we should probably not call
>> register_remote_g_packet_guess() if tdesc_has_registers (tdesc) - because
>> if someone has directly supplied a target description, we should solely
>> use that, and avoid any guessing.
>
>
> I think that's always true, irrespective of a g packet guess being
> installed. See target_find_description: it's always "file > target xml > g-guesses",

Can you just clarify to me how, for example, a program using VFP registers
(such as for Cortex-M4) would use the correct 'g' packet size? The
registers correspond to the tdesc, and not to either of the guessed sizes.
I guess if I could understand that example, I'll be happy. You can do this
off list if you like, to save others from boredom.

Nevertheless, on the entirely plausible assumption I'm wrong and the patch
was roughly correct before, I'm attaching an updated version against
current CVS - I merged in my comments and use of {INT,FP}_REGISTER_SIZE to
make the code a bit more self-documenting.

2012-03-09 Jonathan Larmour <jifl@eCosCentric.com>
Pedro Alves <pedro@codesourcery.com>

* arm-tdep.c: Include "remote.h" and
"features/arm-with-m-fpa-layout.c".
(arm_register_g_packet_guesses): New function.
(arm_gdbarch_init): Don't force a target description with
registers when the executable is detected as M-profile. Instead
set gdbarch->tdep->is_m. Register `g' packet guesses.
(_initialize_arm_tdep): Initialize the new target description.
* features/arm-with-m-fpa-layout.xml: New description.
* features/arm-with-m-fpa-layout.c: New, generated.

arm-tdep.c | 42 +++++++++++++++++++++++++++++++++-
features/arm-with-m-fpa-layout.c | 44 ++++++++++++++++++++++++++++++++++++
features/arm-with-m-fpa-layout.xml | 45
+++++++++++++++++++++++++++++++++++++
3 files changed, 130 insertions(+), 1 deletion(-)

Jifl
--
eCosCentric Limited http://www.eCosCentric.com/ The eCos experts
Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571
Registered in England and Wales: Reg No 4422071.
** Visit us at the ESC Expo at Design West in San Jose **
** 27-29 March, McEnery Convention Center - Stand #846 **
------["Si fractum non sit, noli id reficere"]------ Opinions==mine

[-- Attachment #2: mprofile-backcompat.v2.patch --]
[-- Type: text/plain, Size: 8230 bytes --]

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);
}

\f
+/* 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. */
+}
+
+\f
/* 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 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved. -->
+
+<!-- A target description for an M-profile device, for stubs that
+ transfer registers using the historical fpa layout. -->
+
+
+<target>
+<feature name="org.gnu.gdb.arm.m-profile">
+ <reg name="r0" bitsize="32"/>
+ <reg name="r1" bitsize="32"/>
+ <reg name="r2" bitsize="32"/>
+ <reg name="r3" bitsize="32"/>
+ <reg name="r4" bitsize="32"/>
+ <reg name="r5" bitsize="32"/>
+ <reg name="r6" bitsize="32"/>
+ <reg name="r7" bitsize="32"/>
+ <reg name="r8" bitsize="32"/>
+ <reg name="r9" bitsize="32"/>
+ <reg name="r10" bitsize="32"/>
+ <reg name="r11" bitsize="32"/>
+ <reg name="r12" bitsize="32"/>
+ <reg name="sp" bitsize="32" type="data_ptr"/>
+ <reg name="lr" bitsize="32"/>
+ <reg name="pc" bitsize="32" type="code_ptr"/>
+
+ <!-- Slack for unused FPA registers (f0-f7 + fps).
+ See arm-fpa.xml. -->
+ <reg name="" bitsize="96" type="arm_fpa_ext" regnum="16"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="96" type="arm_fpa_ext"/>
+ <reg name="" bitsize="32"/>
+
+ <reg name="xpsr" bitsize="32" regnum="25"/>
+</feature>
+</target>