aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2014-10-01 10:06:45 +0100
committerPedro Alves <palves@redhat.com>2014-10-01 10:06:45 +0100
commitbdc144174bcb11e808b4e73089b850cf9620a7ee (patch)
tree825fe64a401f567002924366684eba1c585539b9
parent8d7edfd10b9560d9e59fe344a67eb3f0e9b31be5 (diff)
downloadfsf-binutils-gdb-bdc144174bcb11e808b4e73089b850cf9620a7ee.zip
fsf-binutils-gdb-bdc144174bcb11e808b4e73089b850cf9620a7ee.tar.gz
fsf-binutils-gdb-bdc144174bcb11e808b4e73089b850cf9620a7ee.tar.bz2
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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/features/aarch64-core.xml2
-rw-r--r--gdb/features/aarch64.c2
3 files changed, 7 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c967a93..46bc965 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-30 Don Breazeal <donb@codesourcery.com>
* inf-ptrace.c (inf_ptrace_follow_fork): Remove target-independent
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");