This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] aarch64/gdbserver: fix floating point registers display
- From: Pedro Alves <palves at redhat dot com>
- To: Yao Qi <yao at codesourcery dot com>, Andrew Pinski <pinskia at gmail dot com>, "catalin dot udma at freescale dot com" <catalin dot udma at freescale dot com>
- Cc: Richard Earnshaw <rearnsha at arm dot com>, Philippe Waroquiers <philippe dot waroquiers at skynet dot be>, "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Wed, 01 Oct 2014 10:50:41 +0100
- Subject: Re: [PATCH] aarch64/gdbserver: fix floating point registers display
- Authentication-results: sourceware.org; auth=none
- References: <1407835166-827-1-git-send-email-catalin dot udma at freescale dot com> <53E9E1C2 dot 6010707 at arm dot com> <53E9EB9A dot 7000304 at codesourcery dot com> <1407932734 dot 2182 dot 67 dot camel at soleil> <53EB5C86 dot 4030307 at codesourcery dot com> <53EB7965 dot 8070208 at arm dot com> <53F4DC74 dot 8080807 at redhat dot com> <85303e79d83947958b01132bc0613e72 at BY2PR03MB175 dot namprd03 dot prod dot outlook dot com> <CA+=Sn1=_u-HaUpYDLz2_M44S-e2Ms9eTj+PX752eJTHsMv5c4w at mail dot gmail dot com> <53F59F12 dot 1010007 at codesourcery dot com> <53F618B3 dot 5040508 at redhat dot com>
On 08/21/2014 05:05 PM, Pedro Alves wrote:
> On 08/21/2014 08:26 AM, Yao Qi wrote:
>> On 08/21/2014 02:56 PM, Andrew Pinski wrote:
>>> If we revert the patch is someone going to fix big-endian support then
>>> since that is the original why it was requested.
>>
>> I prefer to revert the patch, because it has problem. How to fix
>> big-endian support is another issue.
>
> Agreed. It just seems to me that gdbserver needs to extract
> the right 32-bits out of the ptrace buffer?
I'm giving the gdb/regformats/ dir some TLC today, and while
regenerating the .dat files stumbled on this.
I've now reverted the patch from mainline and the 7.8 branch, with
the patch below.
Catalin, can I get you to file a PR for the floating point issue,
and add it to:
https://sourceware.org/gdb/wiki/GDB_7.8_Release
?
(that PR list is what goes into the 7.8.1 release announcement.)
Thanks.
--------
>From 63fcc8bcd98a8cd9672dd8672f663662f8caa811 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Wed, 1 Oct 2014 10:44:08 +0100
Subject: [PATCH] Aarch64: Make CPSR a 32-bit register again in the target
description
This reverts commit a4d9ba85 - 'AARCH64: Change cpsr type to be
64bit.'.
Even though Linux's ptrace exposes CPSR as 64-bit, CPSR is really
32-bit, and basing GDB's fundamentals on a particular OS's ptrace(2)
implementation is a bad idea.
In addition, while that commit intended to fix big endian Aarch64, it
ended up breaking floating point debugging against GDBserver, for both
big and little endian, because it changed the CPSR to be 64-bit in the
features/aarch64-core.xml file, but missed regenerating the
regformats/aarch64.dat file. If we generate it now, we see this:
diff --git c/gdb/regformats/aarch64.dat w/gdb/regformats/aarch64.dat
index afe1028..0d32183 100644
--- c/gdb/regformats/aarch64.dat
+++ w/gdb/regformats/aarch64.dat
@@ -35,7 +35,7 @@ expedite:x29,sp,pc
64:x30
64:sp
64:pc
-32:cpsr
+64:cpsr
128:v0
128:v1
128:v2
IOW, that commit left regformats/aarch64.dat still considering CPSR as
32-bits. regformats/aarch64.dat is used by GDBserver for its internal
regcache layout, and for the g/G packet register block. See the
generated aarch64.c file in GDBserver's build dir.
So the target description xml file that GDBserver reports to GDB is
now claiming that CPSR is 64-bit, but what GDBserver actually puts in
the g/G register packets is 32-bits. Because GDB thinks CPSR is
64-bit (because that's what the XML description says), GDB will be
reading the remaining 32-bit bits of CPSR out of v0 (the register
immediately afterwards), and then all the registers that follow CPSR
in the register packet end up wrong in GDB, because they're being read
from the wrong offsets...
gdb/
2014-10-01 Pedro Alves <palves@redhat.com>
* features/aarch64-core.xml (cpsr): Change back to 32-bit.
* features/aarch64.c: Regenerate.
---
gdb/ChangeLog | 5 +++++
gdb/features/aarch64-core.xml | 2 +-
gdb/features/aarch64.c | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 242fe26..f16db06 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2014-10-01 Pedro Alves <palves@redhat.com>
+
+ * features/aarch64-core.xml (cpsr): Change back to 32-bit.
+ * features/aarch64.c: Regenerate.
+
2014-09-11 Pedro Alves <palves@redhat.com>
PR gdb/17347
diff --git a/gdb/features/aarch64-core.xml b/gdb/features/aarch64-core.xml
index dbec6dc..9b45a22 100644
--- a/gdb/features/aarch64-core.xml
+++ b/gdb/features/aarch64-core.xml
@@ -42,5 +42,5 @@
<reg name="sp" bitsize="64" type="data_ptr"/>
<reg name="pc" bitsize="64" type="code_ptr"/>
- <reg name="cpsr" bitsize="64"/>
+ <reg name="cpsr" bitsize="32"/>
</feature>
diff --git a/gdb/features/aarch64.c b/gdb/features/aarch64.c
index 31a148e..1e9a99d 100644
--- a/gdb/features/aarch64.c
+++ b/gdb/features/aarch64.c
@@ -50,7 +50,7 @@ initialize_tdesc_aarch64 (void)
tdesc_create_reg (feature, "x30", 30, 1, NULL, 64, "int");
tdesc_create_reg (feature, "sp", 31, 1, NULL, 64, "data_ptr");
tdesc_create_reg (feature, "pc", 32, 1, NULL, 64, "code_ptr");
- tdesc_create_reg (feature, "cpsr", 33, 1, NULL, 64, "int");
+ tdesc_create_reg (feature, "cpsr", 33, 1, NULL, 32, "int");
feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.fpu");
field_type = tdesc_named_type (feature, "ieee_double");
--
1.9.3