* [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native
@ 2008-09-15 0:02 Thiago Jung Bauermann
2008-09-24 20:32 ` Thiago Jung Bauermann
2008-11-14 11:32 ` Joel Brobecker
0 siblings, 2 replies; 8+ messages in thread
From: Thiago Jung Bauermann @ 2008-09-15 0:02 UTC (permalink / raw)
To: gdb-patches ml
Hi,
The Power ISA 2.05 (implemented by Power6 and later) extended the FPSCR
from 32 bits to 64 bits. This patch makes GDB on native Linux display
the full extension of the register when it sees that it is running on
such a processor. I use the AUXV to detect the feature.
Ran the testsuite on ppc-linux and ppc64-linux, on a machine with 64-bit
FPSCR and also on a machine with a 32-bit FPSCR. No regressions found.
Ok?
--
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center
:ADDPATCH powerpc:
2008-09-14 Thiago Jung Bauermann <bauerman@br.ibm.com>
gdb/
* ppc-linux-nat.c (ppc_register_u_addr): Add special case to return
offset for full 64-bit slot of FPSCR when in 32-bits.
(ppc_linux_read_description): Return target description with 64-bit
FPSCR when inferior is running on an ISA 2.05 or later processor.
* ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call
initialize_tdec_powerpc_isa205_32l,
initialize_tdec_powerpc_isa205_altivec32l,
initialize_tdec_powerpc_isa205_vsx32l,
initialize_tdec_powerpc_isa205_64l,
initialize_tdec_powerpc_isa205_altivec64l and
initialize_tdec_powerpc_isa205_vsx64l.
* ppc-linux-tdep.h: Add external declaration for
tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l,
tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l,
tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l.
* features/rs600/powerpc-fpu-isa205.xml: New file.
* features/rs600/powerpc-isa205-32l.xml: New file.
* features/rs600/powerpc-isa205-64l.xml: New file.
* features/rs600/powerpc-isa205-altivec32l.xml: New file.
* features/rs600/powerpc-isa205-altivec64l.xml: New file.
* features/rs600/powerpc-isa205-vsx32l.xml: New file.
* features/rs600/powerpc-isa205-vsx64l.xml: New file.
* features/rs600/powerpc-isa205-32l.c: Generate.
* features/rs600/powerpc-isa205-64l.c: Generate.
* features/rs600/powerpc-isa205-altivec32l.c: Generate.
* features/rs600/powerpc-isa205-altivec64l.c: Generate.
* features/rs600/powerpc-isa205-vsx32l.c: Generate.
* features/rs600/powerpc-isa205-vsx64l.c: Generate.
gdb/testsuite/
* gdb.arch/ppc-dfp.exp: New file.
* gdb.arch/ppc-dfp.c: New file.
Index: gdb.git/gdb/features/rs6000/power-fpu-isa205.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/power-fpu-isa205.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008 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. -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.power.fpu">
+ <reg name="f0" bitsize="64" type="ieee_double" regnum="32"/>
+ <reg name="f1" bitsize="64" type="ieee_double"/>
+ <reg name="f2" bitsize="64" type="ieee_double"/>
+ <reg name="f3" bitsize="64" type="ieee_double"/>
+ <reg name="f4" bitsize="64" type="ieee_double"/>
+ <reg name="f5" bitsize="64" type="ieee_double"/>
+ <reg name="f6" bitsize="64" type="ieee_double"/>
+ <reg name="f7" bitsize="64" type="ieee_double"/>
+ <reg name="f8" bitsize="64" type="ieee_double"/>
+ <reg name="f9" bitsize="64" type="ieee_double"/>
+ <reg name="f10" bitsize="64" type="ieee_double"/>
+ <reg name="f11" bitsize="64" type="ieee_double"/>
+ <reg name="f12" bitsize="64" type="ieee_double"/>
+ <reg name="f13" bitsize="64" type="ieee_double"/>
+ <reg name="f14" bitsize="64" type="ieee_double"/>
+ <reg name="f15" bitsize="64" type="ieee_double"/>
+ <reg name="f16" bitsize="64" type="ieee_double"/>
+ <reg name="f17" bitsize="64" type="ieee_double"/>
+ <reg name="f18" bitsize="64" type="ieee_double"/>
+ <reg name="f19" bitsize="64" type="ieee_double"/>
+ <reg name="f20" bitsize="64" type="ieee_double"/>
+ <reg name="f21" bitsize="64" type="ieee_double"/>
+ <reg name="f22" bitsize="64" type="ieee_double"/>
+ <reg name="f23" bitsize="64" type="ieee_double"/>
+ <reg name="f24" bitsize="64" type="ieee_double"/>
+ <reg name="f25" bitsize="64" type="ieee_double"/>
+ <reg name="f26" bitsize="64" type="ieee_double"/>
+ <reg name="f27" bitsize="64" type="ieee_double"/>
+ <reg name="f28" bitsize="64" type="ieee_double"/>
+ <reg name="f29" bitsize="64" type="ieee_double"/>
+ <reg name="f30" bitsize="64" type="ieee_double"/>
+ <reg name="f31" bitsize="64" type="ieee_double"/>
+
+ <reg name="fpscr" bitsize="64" group="float" regnum="70"/>
+</feature>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers". -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common</architecture>
+ <xi:include href="power-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power-linux.xml"/>
+</target>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers". -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common64</architecture>
+ <xi:include href="power64-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power64-linux.xml"/>
+</target>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers" and AltiVec
+ vector registers. -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common</architecture>
+ <xi:include href="power-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power-linux.xml"/>
+ <xi:include href="power-altivec.xml"/>
+</target>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers" and AltiVec
+ vector registers. -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common64</architecture>
+ <xi:include href="power64-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power64-linux.xml"/>
+ <xi:include href="power-altivec.xml"/>
+</target>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers", AltiVec
+ and VSX vector registers. -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common</architecture>
+ <xi:include href="power-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power-linux.xml"/>
+ <xi:include href="power-altivec.xml"/>
+ <xi:include href="power-vsx.xml"/>
+</target>
Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml 2008-09-14 20:58:22.000000000 -0300
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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. -->
+
+<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only
+ view of the PowerPC. Includes Linux-only special "registers", AltiVec
+ and VSX vector registers. -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>powerpc:common64</architecture>
+ <xi:include href="power64-core.xml"/>
+ <xi:include href="power-fpu-isa205.xml"/>
+ <xi:include href="power64-linux.xml"/>
+ <xi:include href="power-altivec.xml"/>
+ <xi:include href="power-vsx.xml"/>
+</target>
Index: gdb.git/gdb/ppc-linux-nat.c
===================================================================
--- gdb.git.orig/gdb/ppc-linux-nat.c 2008-09-13 17:45:29.000000000 -0300
+++ gdb.git/gdb/ppc-linux-nat.c 2008-09-14 20:58:23.000000000 -0300
@@ -60,6 +60,10 @@
#define PPC_FEATURE_BOOKE 0x00008000
#endif
+#ifndef PPC_FEATURE_ARCH_2_05
+#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */
+#endif
+
/* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
configure time check. Some older glibc's (for instance 2.2.1)
don't have a specific powerpc version of ptrace.h, and fall back on
@@ -279,6 +283,12 @@ ppc_register_u_addr (struct gdbarch *gdb
hence no adjustment is necessary. Hack around this. */
if (wordsize == 8 && PT_FPSCR == (48 + 32 + 1))
u_addr = (48 + 32) * wordsize;
+ /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit
+ slot and not just its second word. The PT_FPSCR supplied in a
+ 32-bit GDB compilation doesn't reflect this. */
+ else if (wordsize == 4 && register_size (gdbarch, regno) == 8
+ && PT_FPSCR == (48 + 2*32 + 1))
+ u_addr = (48 + 2*32) * wordsize;
else
u_addr = PT_FPSCR * wordsize;
}
@@ -1230,6 +1240,7 @@ ppc_linux_read_description (struct targe
{
int altivec = 0;
int vsx = 0;
+ int isa205 = 0;
int tid = TIDGET (inferior_ptid);
if (tid == 0)
@@ -1274,6 +1285,9 @@ ppc_linux_read_description (struct targe
perror_with_name (_("Unable to fetch AltiVec registers"));
}
+ if (ppc_linux_get_hwcap () & PPC_FEATURE_ARCH_2_05)
+ isa205 = 1;
+
/* Check for 64-bit inferior process. This is the case when the host is
64-bit, and in addition the top bit of the MSR register is set. */
#ifdef __powerpc64__
@@ -1284,21 +1298,21 @@ ppc_linux_read_description (struct targe
if (errno == 0 && msr < 0)
{
if (vsx)
- return tdesc_powerpc_vsx64l;
+ return isa205? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l;
else if (altivec)
- return tdesc_powerpc_altivec64l;
+ return isa205? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l;
- return tdesc_powerpc_64l;
+ return isa205? tdesc_powerpc_isa205_64l : tdesc_powerpc_64l;
}
}
#endif
if (vsx)
- return tdesc_powerpc_vsx32l;
+ return isa205? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l;
else if (altivec)
- return tdesc_powerpc_altivec32l;
+ return isa205? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l;
- return tdesc_powerpc_32l;
+ return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l;
}
void _initialize_ppc_linux_nat (void);
Index: gdb.git/gdb/ppc-linux-tdep.c
===================================================================
--- gdb.git.orig/gdb/ppc-linux-tdep.c 2008-09-13 17:45:29.000000000 -0300
+++ gdb.git/gdb/ppc-linux-tdep.c 2008-09-14 20:58:23.000000000 -0300
@@ -42,9 +42,15 @@
#include "features/rs6000/powerpc-32l.c"
#include "features/rs6000/powerpc-altivec32l.c"
#include "features/rs6000/powerpc-vsx32l.c"
+#include "features/rs6000/powerpc-isa205-32l.c"
+#include "features/rs6000/powerpc-isa205-altivec32l.c"
+#include "features/rs6000/powerpc-isa205-vsx32l.c"
#include "features/rs6000/powerpc-64l.c"
#include "features/rs6000/powerpc-altivec64l.c"
#include "features/rs6000/powerpc-vsx64l.c"
+#include "features/rs6000/powerpc-isa205-64l.c"
+#include "features/rs6000/powerpc-isa205-altivec64l.c"
+#include "features/rs6000/powerpc-isa205-vsx64l.c"
#include "features/rs6000/powerpc-e500l.c"
@@ -1170,8 +1176,14 @@ _initialize_ppc_linux_tdep (void)
initialize_tdesc_powerpc_32l ();
initialize_tdesc_powerpc_altivec32l ();
initialize_tdesc_powerpc_vsx32l ();
+ initialize_tdesc_powerpc_isa205_32l ();
+ initialize_tdesc_powerpc_isa205_altivec32l ();
+ initialize_tdesc_powerpc_isa205_vsx32l ();
initialize_tdesc_powerpc_64l ();
initialize_tdesc_powerpc_altivec64l ();
initialize_tdesc_powerpc_vsx64l ();
+ initialize_tdesc_powerpc_isa205_64l ();
+ initialize_tdesc_powerpc_isa205_altivec64l ();
+ initialize_tdesc_powerpc_isa205_vsx64l ();
initialize_tdesc_powerpc_e500l ();
}
Index: gdb.git/gdb/ppc-linux-tdep.h
===================================================================
--- gdb.git.orig/gdb/ppc-linux-tdep.h 2008-09-13 17:45:29.000000000 -0300
+++ gdb.git/gdb/ppc-linux-tdep.h 2008-09-14 20:58:23.000000000 -0300
@@ -42,9 +42,15 @@ int ppc_linux_trap_reg_p (struct gdbarch
extern struct target_desc *tdesc_powerpc_32l;
extern struct target_desc *tdesc_powerpc_altivec32l;
extern struct target_desc *tdesc_powerpc_vsx32l;
+extern struct target_desc *tdesc_powerpc_isa205_32l;
+extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
+extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
extern struct target_desc *tdesc_powerpc_e500l;
extern struct target_desc *tdesc_powerpc_64l;
extern struct target_desc *tdesc_powerpc_altivec64l;
extern struct target_desc *tdesc_powerpc_vsx64l;
+extern struct target_desc *tdesc_powerpc_isa205_64l;
+extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
+extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
#endif /* PPC_LINUX_TDEP_H */
Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c 2008-09-14 20:58:23.000000000 -0300
@@ -0,0 +1,46 @@
+/* Copyright 2008 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <elf.h>
+
+#ifdef __powerpc64__
+typedef Elf64_auxv_t auxv_t;
+#else
+typedef Elf32_auxv_t auxv_t;
+#endif
+
+#ifndef PPC_FEATURE_HAS_DFP
+#define PPC_FEATURE_HAS_DFP 0x00000400
+#endif
+
+int
+main (int argc, char *argv[], char *envp[], auxv_t auxv[])
+{
+ int i;
+
+ for (i = 0; auxv[i].a_type != AT_NULL; i++)
+ if (auxv[i].a_type == AT_HWCAP) {
+ if (!(auxv[i].a_un.a_val & PPC_FEATURE_HAS_DFP))
+ return 1;
+
+ break;
+ }
+
+ asm ("mtfsfi 7, 5, 1\n"); /* Set DFP rounding mode. */
+
+ return 0;
+}
Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp 2008-09-14 20:58:39.000000000 -0300
@@ -0,0 +1,82 @@
+# Copyright (C) 2008 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+#
+
+# Tests for Powerpc Decimal Floating Point registers setting and fetching
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+if ![istarget "powerpc*"] then {
+ verbose "Skipping powerpc decimal floating point register tests."
+ return
+}
+
+set testfile "ppc-dfp"
+set binfile ${objdir}/${subdir}/${testfile}
+set srcfile ${testfile}.c
+
+if [get_compiler_info $binfile] {
+ warning "get_compiler failed"
+ return -1
+}
+
+if ![test_compiler_info gcc*] {
+ # We use GCC's extended asm syntax
+ warning "unknown compiler"
+ return -1
+}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } {
+ unsupported "This machine doesn't support Decimal Floating Point."
+ return -1
+}
+
+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+gdb_breakpoint [gdb_get_line_number "Set DFP rounding mode."]
+
+gdb_run_cmd
+
+# When the prompt comes back we'll be at the Set DFP rounding mode breakpoint.
+# Unless the program bails out after checking AT_HWCAP.
+gdb_expect {
+ -re "Program exited with code 01.\[\r\n\]+$gdb_prompt $" {
+ unsupported "This machine doesn't support Decimal Floating Point."
+ return -1
+ }
+
+ -re ".*$gdb_prompt $" {}
+}
+
+# First, verify if FPSCR is all zeroes.
+gdb_test "print \$fpscr" " = 0" "FPSCR is all zeroes"
+
+# Step over "set rounding mode" instruction.
+gdb_test "next" "" ""
+
+# Verify that the following bits are set (See Power ISA for details):
+#
+# 29:31 - DFP Rounding Control
+gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode"
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-09-15 0:02 [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native Thiago Jung Bauermann @ 2008-09-24 20:32 ` Thiago Jung Bauermann 2008-11-13 20:06 ` Thiago Jung Bauermann 2008-11-14 11:32 ` Joel Brobecker 1 sibling, 1 reply; 8+ messages in thread From: Thiago Jung Bauermann @ 2008-09-24 20:32 UTC (permalink / raw) To: gdb-patches ml Ping? El dom, 14-09-2008 a las 21:01 -0300, Thiago Jung Bauermann escribió: > Hi, > > The Power ISA 2.05 (implemented by Power6 and later) extended the FPSCR > from 32 bits to 64 bits. This patch makes GDB on native Linux display > the full extension of the register when it sees that it is running on > such a processor. I use the AUXV to detect the feature. > > Ran the testsuite on ppc-linux and ppc64-linux, on a machine with 64-bit > FPSCR and also on a machine with a 32-bit FPSCR. No regressions found. > Ok? > -- > []'s > Thiago Jung Bauermann > IBM Linux Technology Center > > :ADDPATCH powerpc: > > 2008-09-14 Thiago Jung Bauermann <bauerman@br.ibm.com> > > gdb/ > * ppc-linux-nat.c (ppc_register_u_addr): Add special case to return > offset for full 64-bit slot of FPSCR when in 32-bits. > (ppc_linux_read_description): Return target description with 64-bit > FPSCR when inferior is running on an ISA 2.05 or later processor. > * ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call > initialize_tdec_powerpc_isa205_32l, > initialize_tdec_powerpc_isa205_altivec32l, > initialize_tdec_powerpc_isa205_vsx32l, > initialize_tdec_powerpc_isa205_64l, > initialize_tdec_powerpc_isa205_altivec64l and > initialize_tdec_powerpc_isa205_vsx64l. > * ppc-linux-tdep.h: Add external declaration for > tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l, > tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l, > tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l. > * features/rs600/powerpc-fpu-isa205.xml: New file. > * features/rs600/powerpc-isa205-32l.xml: New file. > * features/rs600/powerpc-isa205-64l.xml: New file. > * features/rs600/powerpc-isa205-altivec32l.xml: New file. > * features/rs600/powerpc-isa205-altivec64l.xml: New file. > * features/rs600/powerpc-isa205-vsx32l.xml: New file. > * features/rs600/powerpc-isa205-vsx64l.xml: New file. > * features/rs600/powerpc-isa205-32l.c: Generate. > * features/rs600/powerpc-isa205-64l.c: Generate. > * features/rs600/powerpc-isa205-altivec32l.c: Generate. > * features/rs600/powerpc-isa205-altivec64l.c: Generate. > * features/rs600/powerpc-isa205-vsx32l.c: Generate. > * features/rs600/powerpc-isa205-vsx64l.c: Generate. > > gdb/testsuite/ > > * gdb.arch/ppc-dfp.exp: New file. > * gdb.arch/ppc-dfp.c: New file. > > Index: gdb.git/gdb/features/rs6000/power-fpu-isa205.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/power-fpu-isa205.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,44 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2007, 2008 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. --> > + > +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> > +<feature name="org.gnu.gdb.power.fpu"> > + <reg name="f0" bitsize="64" type="ieee_double" regnum="32"/> > + <reg name="f1" bitsize="64" type="ieee_double"/> > + <reg name="f2" bitsize="64" type="ieee_double"/> > + <reg name="f3" bitsize="64" type="ieee_double"/> > + <reg name="f4" bitsize="64" type="ieee_double"/> > + <reg name="f5" bitsize="64" type="ieee_double"/> > + <reg name="f6" bitsize="64" type="ieee_double"/> > + <reg name="f7" bitsize="64" type="ieee_double"/> > + <reg name="f8" bitsize="64" type="ieee_double"/> > + <reg name="f9" bitsize="64" type="ieee_double"/> > + <reg name="f10" bitsize="64" type="ieee_double"/> > + <reg name="f11" bitsize="64" type="ieee_double"/> > + <reg name="f12" bitsize="64" type="ieee_double"/> > + <reg name="f13" bitsize="64" type="ieee_double"/> > + <reg name="f14" bitsize="64" type="ieee_double"/> > + <reg name="f15" bitsize="64" type="ieee_double"/> > + <reg name="f16" bitsize="64" type="ieee_double"/> > + <reg name="f17" bitsize="64" type="ieee_double"/> > + <reg name="f18" bitsize="64" type="ieee_double"/> > + <reg name="f19" bitsize="64" type="ieee_double"/> > + <reg name="f20" bitsize="64" type="ieee_double"/> > + <reg name="f21" bitsize="64" type="ieee_double"/> > + <reg name="f22" bitsize="64" type="ieee_double"/> > + <reg name="f23" bitsize="64" type="ieee_double"/> > + <reg name="f24" bitsize="64" type="ieee_double"/> > + <reg name="f25" bitsize="64" type="ieee_double"/> > + <reg name="f26" bitsize="64" type="ieee_double"/> > + <reg name="f27" bitsize="64" type="ieee_double"/> > + <reg name="f28" bitsize="64" type="ieee_double"/> > + <reg name="f29" bitsize="64" type="ieee_double"/> > + <reg name="f30" bitsize="64" type="ieee_double"/> > + <reg name="f31" bitsize="64" type="ieee_double"/> > + > + <reg name="fpscr" bitsize="64" group="float" regnum="70"/> > +</feature> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,17 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers". --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common</architecture> > + <xi:include href="power-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power-linux.xml"/> > +</target> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,17 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers". --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common64</architecture> > + <xi:include href="power64-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power64-linux.xml"/> > +</target> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,19 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers" and AltiVec > + vector registers. --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common</architecture> > + <xi:include href="power-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power-linux.xml"/> > + <xi:include href="power-altivec.xml"/> > +</target> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,19 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers" and AltiVec > + vector registers. --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common64</architecture> > + <xi:include href="power64-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power64-linux.xml"/> > + <xi:include href="power-altivec.xml"/> > +</target> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,20 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers", AltiVec > + and VSX vector registers. --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common</architecture> > + <xi:include href="power-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power-linux.xml"/> > + <xi:include href="power-altivec.xml"/> > + <xi:include href="power-vsx.xml"/> > +</target> > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml 2008-09-14 20:58:22.000000000 -0300 > @@ -0,0 +1,20 @@ > +<?xml version="1.0"?> > +<!-- Copyright (C) 2008 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. --> > + > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > + view of the PowerPC. Includes Linux-only special "registers", AltiVec > + and VSX vector registers. --> > + > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > +<target> > + <architecture>powerpc:common64</architecture> > + <xi:include href="power64-core.xml"/> > + <xi:include href="power-fpu-isa205.xml"/> > + <xi:include href="power64-linux.xml"/> > + <xi:include href="power-altivec.xml"/> > + <xi:include href="power-vsx.xml"/> > +</target> > Index: gdb.git/gdb/ppc-linux-nat.c > =================================================================== > --- gdb.git.orig/gdb/ppc-linux-nat.c 2008-09-13 17:45:29.000000000 -0300 > +++ gdb.git/gdb/ppc-linux-nat.c 2008-09-14 20:58:23.000000000 -0300 > @@ -60,6 +60,10 @@ > #define PPC_FEATURE_BOOKE 0x00008000 > #endif > > +#ifndef PPC_FEATURE_ARCH_2_05 > +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ > +#endif > + > /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a > configure time check. Some older glibc's (for instance 2.2.1) > don't have a specific powerpc version of ptrace.h, and fall back on > @@ -279,6 +283,12 @@ ppc_register_u_addr (struct gdbarch *gdb > hence no adjustment is necessary. Hack around this. */ > if (wordsize == 8 && PT_FPSCR == (48 + 32 + 1)) > u_addr = (48 + 32) * wordsize; > + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit > + slot and not just its second word. The PT_FPSCR supplied in a > + 32-bit GDB compilation doesn't reflect this. */ > + else if (wordsize == 4 && register_size (gdbarch, regno) == 8 > + && PT_FPSCR == (48 + 2*32 + 1)) > + u_addr = (48 + 2*32) * wordsize; > else > u_addr = PT_FPSCR * wordsize; > } > @@ -1230,6 +1240,7 @@ ppc_linux_read_description (struct targe > { > int altivec = 0; > int vsx = 0; > + int isa205 = 0; > > int tid = TIDGET (inferior_ptid); > if (tid == 0) > @@ -1274,6 +1285,9 @@ ppc_linux_read_description (struct targe > perror_with_name (_("Unable to fetch AltiVec registers")); > } > > + if (ppc_linux_get_hwcap () & PPC_FEATURE_ARCH_2_05) > + isa205 = 1; > + > /* Check for 64-bit inferior process. This is the case when the host is > 64-bit, and in addition the top bit of the MSR register is set. */ > #ifdef __powerpc64__ > @@ -1284,21 +1298,21 @@ ppc_linux_read_description (struct targe > if (errno == 0 && msr < 0) > { > if (vsx) > - return tdesc_powerpc_vsx64l; > + return isa205? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l; > else if (altivec) > - return tdesc_powerpc_altivec64l; > + return isa205? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l; > > - return tdesc_powerpc_64l; > + return isa205? tdesc_powerpc_isa205_64l : tdesc_powerpc_64l; > } > } > #endif > > if (vsx) > - return tdesc_powerpc_vsx32l; > + return isa205? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l; > else if (altivec) > - return tdesc_powerpc_altivec32l; > + return isa205? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l; > > - return tdesc_powerpc_32l; > + return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l; > } > > void _initialize_ppc_linux_nat (void); > Index: gdb.git/gdb/ppc-linux-tdep.c > =================================================================== > --- gdb.git.orig/gdb/ppc-linux-tdep.c 2008-09-13 17:45:29.000000000 -0300 > +++ gdb.git/gdb/ppc-linux-tdep.c 2008-09-14 20:58:23.000000000 -0300 > @@ -42,9 +42,15 @@ > #include "features/rs6000/powerpc-32l.c" > #include "features/rs6000/powerpc-altivec32l.c" > #include "features/rs6000/powerpc-vsx32l.c" > +#include "features/rs6000/powerpc-isa205-32l.c" > +#include "features/rs6000/powerpc-isa205-altivec32l.c" > +#include "features/rs6000/powerpc-isa205-vsx32l.c" > #include "features/rs6000/powerpc-64l.c" > #include "features/rs6000/powerpc-altivec64l.c" > #include "features/rs6000/powerpc-vsx64l.c" > +#include "features/rs6000/powerpc-isa205-64l.c" > +#include "features/rs6000/powerpc-isa205-altivec64l.c" > +#include "features/rs6000/powerpc-isa205-vsx64l.c" > #include "features/rs6000/powerpc-e500l.c" > > > @@ -1170,8 +1176,14 @@ _initialize_ppc_linux_tdep (void) > initialize_tdesc_powerpc_32l (); > initialize_tdesc_powerpc_altivec32l (); > initialize_tdesc_powerpc_vsx32l (); > + initialize_tdesc_powerpc_isa205_32l (); > + initialize_tdesc_powerpc_isa205_altivec32l (); > + initialize_tdesc_powerpc_isa205_vsx32l (); > initialize_tdesc_powerpc_64l (); > initialize_tdesc_powerpc_altivec64l (); > initialize_tdesc_powerpc_vsx64l (); > + initialize_tdesc_powerpc_isa205_64l (); > + initialize_tdesc_powerpc_isa205_altivec64l (); > + initialize_tdesc_powerpc_isa205_vsx64l (); > initialize_tdesc_powerpc_e500l (); > } > Index: gdb.git/gdb/ppc-linux-tdep.h > =================================================================== > --- gdb.git.orig/gdb/ppc-linux-tdep.h 2008-09-13 17:45:29.000000000 -0300 > +++ gdb.git/gdb/ppc-linux-tdep.h 2008-09-14 20:58:23.000000000 -0300 > @@ -42,9 +42,15 @@ int ppc_linux_trap_reg_p (struct gdbarch > extern struct target_desc *tdesc_powerpc_32l; > extern struct target_desc *tdesc_powerpc_altivec32l; > extern struct target_desc *tdesc_powerpc_vsx32l; > +extern struct target_desc *tdesc_powerpc_isa205_32l; > +extern struct target_desc *tdesc_powerpc_isa205_altivec32l; > +extern struct target_desc *tdesc_powerpc_isa205_vsx32l; > extern struct target_desc *tdesc_powerpc_e500l; > extern struct target_desc *tdesc_powerpc_64l; > extern struct target_desc *tdesc_powerpc_altivec64l; > extern struct target_desc *tdesc_powerpc_vsx64l; > +extern struct target_desc *tdesc_powerpc_isa205_64l; > +extern struct target_desc *tdesc_powerpc_isa205_altivec64l; > +extern struct target_desc *tdesc_powerpc_isa205_vsx64l; > > #endif /* PPC_LINUX_TDEP_H */ > Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c 2008-09-14 20:58:23.000000000 -0300 > @@ -0,0 +1,46 @@ > +/* Copyright 2008 Free Software Foundation, Inc. > + > + This file is part of GDB. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see <http://www.gnu.org/licenses/>. */ > + > +#include <elf.h> > + > +#ifdef __powerpc64__ > +typedef Elf64_auxv_t auxv_t; > +#else > +typedef Elf32_auxv_t auxv_t; > +#endif > + > +#ifndef PPC_FEATURE_HAS_DFP > +#define PPC_FEATURE_HAS_DFP 0x00000400 > +#endif > + > +int > +main (int argc, char *argv[], char *envp[], auxv_t auxv[]) > +{ > + int i; > + > + for (i = 0; auxv[i].a_type != AT_NULL; i++) > + if (auxv[i].a_type == AT_HWCAP) { > + if (!(auxv[i].a_un.a_val & PPC_FEATURE_HAS_DFP)) > + return 1; > + > + break; > + } > + > + asm ("mtfsfi 7, 5, 1\n"); /* Set DFP rounding mode. */ > + > + return 0; > +} > Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp 2008-09-14 20:58:39.000000000 -0300 > @@ -0,0 +1,82 @@ > +# Copyright (C) 2008 Free Software Foundation, Inc. > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see <http://www.gnu.org/licenses/>. > +# > +# Please email any bugs, comments, and/or additions to this file to: > +# bug-gdb@prep.ai.mit.edu > +# > + > +# Tests for Powerpc Decimal Floating Point registers setting and fetching > + > +if $tracelevel then { > + strace $tracelevel > +} > + > +if ![istarget "powerpc*"] then { > + verbose "Skipping powerpc decimal floating point register tests." > + return > +} > + > +set testfile "ppc-dfp" > +set binfile ${objdir}/${subdir}/${testfile} > +set srcfile ${testfile}.c > + > +if [get_compiler_info $binfile] { > + warning "get_compiler failed" > + return -1 > +} > + > +if ![test_compiler_info gcc*] { > + # We use GCC's extended asm syntax > + warning "unknown compiler" > + return -1 > +} > + > +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } { > + unsupported "This machine doesn't support Decimal Floating Point." > + return -1 > +} > + > +# Start with a fresh gdb. > + > +gdb_exit > +gdb_start > +gdb_reinitialize_dir $srcdir/$subdir > +gdb_load ${binfile} > + > +gdb_breakpoint [gdb_get_line_number "Set DFP rounding mode."] > + > +gdb_run_cmd > + > +# When the prompt comes back we'll be at the Set DFP rounding mode breakpoint. > +# Unless the program bails out after checking AT_HWCAP. > +gdb_expect { > + -re "Program exited with code 01.\[\r\n\]+$gdb_prompt $" { > + unsupported "This machine doesn't support Decimal Floating Point." > + return -1 > + } > + > + -re ".*$gdb_prompt $" {} > +} > + > +# First, verify if FPSCR is all zeroes. > +gdb_test "print \$fpscr" " = 0" "FPSCR is all zeroes" > + > +# Step over "set rounding mode" instruction. > +gdb_test "next" "" "" > + > +# Verify that the following bits are set (See Power ISA for details): > +# > +# 29:31 - DFP Rounding Control > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" > > -- []'s Thiago Jung Bauermann IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-09-24 20:32 ` Thiago Jung Bauermann @ 2008-11-13 20:06 ` Thiago Jung Bauermann 0 siblings, 0 replies; 8+ messages in thread From: Thiago Jung Bauermann @ 2008-11-13 20:06 UTC (permalink / raw) To: gdb-patches ml Ping? El mié, 24-09-2008 a las 13:54 -0300, Thiago Jung Bauermann escribió: > Ping? > > El dom, 14-09-2008 a las 21:01 -0300, Thiago Jung Bauermann escribió: > > Hi, > > > > The Power ISA 2.05 (implemented by Power6 and later) extended the FPSCR > > from 32 bits to 64 bits. This patch makes GDB on native Linux display > > the full extension of the register when it sees that it is running on > > such a processor. I use the AUXV to detect the feature. > > > > Ran the testsuite on ppc-linux and ppc64-linux, on a machine with 64-bit > > FPSCR and also on a machine with a 32-bit FPSCR. No regressions found. > > Ok? > > -- > > []'s > > Thiago Jung Bauermann > > IBM Linux Technology Center > > > > :ADDPATCH powerpc: > > > > 2008-09-14 Thiago Jung Bauermann <bauerman@br.ibm.com> > > > > gdb/ > > * ppc-linux-nat.c (ppc_register_u_addr): Add special case to return > > offset for full 64-bit slot of FPSCR when in 32-bits. > > (ppc_linux_read_description): Return target description with 64-bit > > FPSCR when inferior is running on an ISA 2.05 or later processor. > > * ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call > > initialize_tdec_powerpc_isa205_32l, > > initialize_tdec_powerpc_isa205_altivec32l, > > initialize_tdec_powerpc_isa205_vsx32l, > > initialize_tdec_powerpc_isa205_64l, > > initialize_tdec_powerpc_isa205_altivec64l and > > initialize_tdec_powerpc_isa205_vsx64l. > > * ppc-linux-tdep.h: Add external declaration for > > tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l, > > tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l, > > tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l. > > * features/rs600/powerpc-fpu-isa205.xml: New file. > > * features/rs600/powerpc-isa205-32l.xml: New file. > > * features/rs600/powerpc-isa205-64l.xml: New file. > > * features/rs600/powerpc-isa205-altivec32l.xml: New file. > > * features/rs600/powerpc-isa205-altivec64l.xml: New file. > > * features/rs600/powerpc-isa205-vsx32l.xml: New file. > > * features/rs600/powerpc-isa205-vsx64l.xml: New file. > > * features/rs600/powerpc-isa205-32l.c: Generate. > > * features/rs600/powerpc-isa205-64l.c: Generate. > > * features/rs600/powerpc-isa205-altivec32l.c: Generate. > > * features/rs600/powerpc-isa205-altivec64l.c: Generate. > > * features/rs600/powerpc-isa205-vsx32l.c: Generate. > > * features/rs600/powerpc-isa205-vsx64l.c: Generate. > > > > gdb/testsuite/ > > > > * gdb.arch/ppc-dfp.exp: New file. > > * gdb.arch/ppc-dfp.c: New file. > > > > Index: gdb.git/gdb/features/rs6000/power-fpu-isa205.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/power-fpu-isa205.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,44 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2007, 2008 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. --> > > + > > +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> > > +<feature name="org.gnu.gdb.power.fpu"> > > + <reg name="f0" bitsize="64" type="ieee_double" regnum="32"/> > > + <reg name="f1" bitsize="64" type="ieee_double"/> > > + <reg name="f2" bitsize="64" type="ieee_double"/> > > + <reg name="f3" bitsize="64" type="ieee_double"/> > > + <reg name="f4" bitsize="64" type="ieee_double"/> > > + <reg name="f5" bitsize="64" type="ieee_double"/> > > + <reg name="f6" bitsize="64" type="ieee_double"/> > > + <reg name="f7" bitsize="64" type="ieee_double"/> > > + <reg name="f8" bitsize="64" type="ieee_double"/> > > + <reg name="f9" bitsize="64" type="ieee_double"/> > > + <reg name="f10" bitsize="64" type="ieee_double"/> > > + <reg name="f11" bitsize="64" type="ieee_double"/> > > + <reg name="f12" bitsize="64" type="ieee_double"/> > > + <reg name="f13" bitsize="64" type="ieee_double"/> > > + <reg name="f14" bitsize="64" type="ieee_double"/> > > + <reg name="f15" bitsize="64" type="ieee_double"/> > > + <reg name="f16" bitsize="64" type="ieee_double"/> > > + <reg name="f17" bitsize="64" type="ieee_double"/> > > + <reg name="f18" bitsize="64" type="ieee_double"/> > > + <reg name="f19" bitsize="64" type="ieee_double"/> > > + <reg name="f20" bitsize="64" type="ieee_double"/> > > + <reg name="f21" bitsize="64" type="ieee_double"/> > > + <reg name="f22" bitsize="64" type="ieee_double"/> > > + <reg name="f23" bitsize="64" type="ieee_double"/> > > + <reg name="f24" bitsize="64" type="ieee_double"/> > > + <reg name="f25" bitsize="64" type="ieee_double"/> > > + <reg name="f26" bitsize="64" type="ieee_double"/> > > + <reg name="f27" bitsize="64" type="ieee_double"/> > > + <reg name="f28" bitsize="64" type="ieee_double"/> > > + <reg name="f29" bitsize="64" type="ieee_double"/> > > + <reg name="f30" bitsize="64" type="ieee_double"/> > > + <reg name="f31" bitsize="64" type="ieee_double"/> > > + > > + <reg name="fpscr" bitsize="64" group="float" regnum="70"/> > > +</feature> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,17 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers". --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common</architecture> > > + <xi:include href="power-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power-linux.xml"/> > > +</target> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,17 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers". --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common64</architecture> > > + <xi:include href="power64-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power64-linux.xml"/> > > +</target> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,19 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers" and AltiVec > > + vector registers. --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common</architecture> > > + <xi:include href="power-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power-linux.xml"/> > > + <xi:include href="power-altivec.xml"/> > > +</target> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,19 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers" and AltiVec > > + vector registers. --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common64</architecture> > > + <xi:include href="power64-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power64-linux.xml"/> > > + <xi:include href="power-altivec.xml"/> > > +</target> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,20 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers", AltiVec > > + and VSX vector registers. --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common</architecture> > > + <xi:include href="power-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power-linux.xml"/> > > + <xi:include href="power-altivec.xml"/> > > + <xi:include href="power-vsx.xml"/> > > +</target> > > Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml 2008-09-14 20:58:22.000000000 -0300 > > @@ -0,0 +1,20 @@ > > +<?xml version="1.0"?> > > +<!-- Copyright (C) 2008 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. --> > > + > > +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only > > + view of the PowerPC. Includes Linux-only special "registers", AltiVec > > + and VSX vector registers. --> > > + > > +<!DOCTYPE target SYSTEM "gdb-target.dtd"> > > +<target> > > + <architecture>powerpc:common64</architecture> > > + <xi:include href="power64-core.xml"/> > > + <xi:include href="power-fpu-isa205.xml"/> > > + <xi:include href="power64-linux.xml"/> > > + <xi:include href="power-altivec.xml"/> > > + <xi:include href="power-vsx.xml"/> > > +</target> > > Index: gdb.git/gdb/ppc-linux-nat.c > > =================================================================== > > --- gdb.git.orig/gdb/ppc-linux-nat.c 2008-09-13 17:45:29.000000000 -0300 > > +++ gdb.git/gdb/ppc-linux-nat.c 2008-09-14 20:58:23.000000000 -0300 > > @@ -60,6 +60,10 @@ > > #define PPC_FEATURE_BOOKE 0x00008000 > > #endif > > > > +#ifndef PPC_FEATURE_ARCH_2_05 > > +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ > > +#endif > > + > > /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a > > configure time check. Some older glibc's (for instance 2.2.1) > > don't have a specific powerpc version of ptrace.h, and fall back on > > @@ -279,6 +283,12 @@ ppc_register_u_addr (struct gdbarch *gdb > > hence no adjustment is necessary. Hack around this. */ > > if (wordsize == 8 && PT_FPSCR == (48 + 32 + 1)) > > u_addr = (48 + 32) * wordsize; > > + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit > > + slot and not just its second word. The PT_FPSCR supplied in a > > + 32-bit GDB compilation doesn't reflect this. */ > > + else if (wordsize == 4 && register_size (gdbarch, regno) == 8 > > + && PT_FPSCR == (48 + 2*32 + 1)) > > + u_addr = (48 + 2*32) * wordsize; > > else > > u_addr = PT_FPSCR * wordsize; > > } > > @@ -1230,6 +1240,7 @@ ppc_linux_read_description (struct targe > > { > > int altivec = 0; > > int vsx = 0; > > + int isa205 = 0; > > > > int tid = TIDGET (inferior_ptid); > > if (tid == 0) > > @@ -1274,6 +1285,9 @@ ppc_linux_read_description (struct targe > > perror_with_name (_("Unable to fetch AltiVec registers")); > > } > > > > + if (ppc_linux_get_hwcap () & PPC_FEATURE_ARCH_2_05) > > + isa205 = 1; > > + > > /* Check for 64-bit inferior process. This is the case when the host is > > 64-bit, and in addition the top bit of the MSR register is set. */ > > #ifdef __powerpc64__ > > @@ -1284,21 +1298,21 @@ ppc_linux_read_description (struct targe > > if (errno == 0 && msr < 0) > > { > > if (vsx) > > - return tdesc_powerpc_vsx64l; > > + return isa205? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l; > > else if (altivec) > > - return tdesc_powerpc_altivec64l; > > + return isa205? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l; > > > > - return tdesc_powerpc_64l; > > + return isa205? tdesc_powerpc_isa205_64l : tdesc_powerpc_64l; > > } > > } > > #endif > > > > if (vsx) > > - return tdesc_powerpc_vsx32l; > > + return isa205? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l; > > else if (altivec) > > - return tdesc_powerpc_altivec32l; > > + return isa205? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l; > > > > - return tdesc_powerpc_32l; > > + return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l; > > } > > > > void _initialize_ppc_linux_nat (void); > > Index: gdb.git/gdb/ppc-linux-tdep.c > > =================================================================== > > --- gdb.git.orig/gdb/ppc-linux-tdep.c 2008-09-13 17:45:29.000000000 -0300 > > +++ gdb.git/gdb/ppc-linux-tdep.c 2008-09-14 20:58:23.000000000 -0300 > > @@ -42,9 +42,15 @@ > > #include "features/rs6000/powerpc-32l.c" > > #include "features/rs6000/powerpc-altivec32l.c" > > #include "features/rs6000/powerpc-vsx32l.c" > > +#include "features/rs6000/powerpc-isa205-32l.c" > > +#include "features/rs6000/powerpc-isa205-altivec32l.c" > > +#include "features/rs6000/powerpc-isa205-vsx32l.c" > > #include "features/rs6000/powerpc-64l.c" > > #include "features/rs6000/powerpc-altivec64l.c" > > #include "features/rs6000/powerpc-vsx64l.c" > > +#include "features/rs6000/powerpc-isa205-64l.c" > > +#include "features/rs6000/powerpc-isa205-altivec64l.c" > > +#include "features/rs6000/powerpc-isa205-vsx64l.c" > > #include "features/rs6000/powerpc-e500l.c" > > > > > > @@ -1170,8 +1176,14 @@ _initialize_ppc_linux_tdep (void) > > initialize_tdesc_powerpc_32l (); > > initialize_tdesc_powerpc_altivec32l (); > > initialize_tdesc_powerpc_vsx32l (); > > + initialize_tdesc_powerpc_isa205_32l (); > > + initialize_tdesc_powerpc_isa205_altivec32l (); > > + initialize_tdesc_powerpc_isa205_vsx32l (); > > initialize_tdesc_powerpc_64l (); > > initialize_tdesc_powerpc_altivec64l (); > > initialize_tdesc_powerpc_vsx64l (); > > + initialize_tdesc_powerpc_isa205_64l (); > > + initialize_tdesc_powerpc_isa205_altivec64l (); > > + initialize_tdesc_powerpc_isa205_vsx64l (); > > initialize_tdesc_powerpc_e500l (); > > } > > Index: gdb.git/gdb/ppc-linux-tdep.h > > =================================================================== > > --- gdb.git.orig/gdb/ppc-linux-tdep.h 2008-09-13 17:45:29.000000000 -0300 > > +++ gdb.git/gdb/ppc-linux-tdep.h 2008-09-14 20:58:23.000000000 -0300 > > @@ -42,9 +42,15 @@ int ppc_linux_trap_reg_p (struct gdbarch > > extern struct target_desc *tdesc_powerpc_32l; > > extern struct target_desc *tdesc_powerpc_altivec32l; > > extern struct target_desc *tdesc_powerpc_vsx32l; > > +extern struct target_desc *tdesc_powerpc_isa205_32l; > > +extern struct target_desc *tdesc_powerpc_isa205_altivec32l; > > +extern struct target_desc *tdesc_powerpc_isa205_vsx32l; > > extern struct target_desc *tdesc_powerpc_e500l; > > extern struct target_desc *tdesc_powerpc_64l; > > extern struct target_desc *tdesc_powerpc_altivec64l; > > extern struct target_desc *tdesc_powerpc_vsx64l; > > +extern struct target_desc *tdesc_powerpc_isa205_64l; > > +extern struct target_desc *tdesc_powerpc_isa205_altivec64l; > > +extern struct target_desc *tdesc_powerpc_isa205_vsx64l; > > > > #endif /* PPC_LINUX_TDEP_H */ > > Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c 2008-09-14 20:58:23.000000000 -0300 > > @@ -0,0 +1,46 @@ > > +/* Copyright 2008 Free Software Foundation, Inc. > > + > > + This file is part of GDB. > > + > > + This program is free software; you can redistribute it and/or modify > > + it under the terms of the GNU General Public License as published by > > + the Free Software Foundation; either version 3 of the License, or > > + (at your option) any later version. > > + > > + This program is distributed in the hope that it will be useful, > > + but WITHOUT ANY WARRANTY; without even the implied warranty of > > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + GNU General Public License for more details. > > + > > + You should have received a copy of the GNU General Public License > > + along with this program. If not, see <http://www.gnu.org/licenses/>. */ > > + > > +#include <elf.h> > > + > > +#ifdef __powerpc64__ > > +typedef Elf64_auxv_t auxv_t; > > +#else > > +typedef Elf32_auxv_t auxv_t; > > +#endif > > + > > +#ifndef PPC_FEATURE_HAS_DFP > > +#define PPC_FEATURE_HAS_DFP 0x00000400 > > +#endif > > + > > +int > > +main (int argc, char *argv[], char *envp[], auxv_t auxv[]) > > +{ > > + int i; > > + > > + for (i = 0; auxv[i].a_type != AT_NULL; i++) > > + if (auxv[i].a_type == AT_HWCAP) { > > + if (!(auxv[i].a_un.a_val & PPC_FEATURE_HAS_DFP)) > > + return 1; > > + > > + break; > > + } > > + > > + asm ("mtfsfi 7, 5, 1\n"); /* Set DFP rounding mode. */ > > + > > + return 0; > > +} > > Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp > > =================================================================== > > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > > +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp 2008-09-14 20:58:39.000000000 -0300 > > @@ -0,0 +1,82 @@ > > +# Copyright (C) 2008 Free Software Foundation, Inc. > > +# > > +# This program is free software; you can redistribute it and/or modify > > +# it under the terms of the GNU General Public License as published by > > +# the Free Software Foundation; either version 3 of the License, or > > +# (at your option) any later version. > > +# > > +# This program is distributed in the hope that it will be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program. If not, see <http://www.gnu.org/licenses/>. > > +# > > +# Please email any bugs, comments, and/or additions to this file to: > > +# bug-gdb@prep.ai.mit.edu > > +# > > + > > +# Tests for Powerpc Decimal Floating Point registers setting and fetching > > + > > +if $tracelevel then { > > + strace $tracelevel > > +} > > + > > +if ![istarget "powerpc*"] then { > > + verbose "Skipping powerpc decimal floating point register tests." > > + return > > +} > > + > > +set testfile "ppc-dfp" > > +set binfile ${objdir}/${subdir}/${testfile} > > +set srcfile ${testfile}.c > > + > > +if [get_compiler_info $binfile] { > > + warning "get_compiler failed" > > + return -1 > > +} > > + > > +if ![test_compiler_info gcc*] { > > + # We use GCC's extended asm syntax > > + warning "unknown compiler" > > + return -1 > > +} > > + > > +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } { > > + unsupported "This machine doesn't support Decimal Floating Point." > > + return -1 > > +} > > + > > +# Start with a fresh gdb. > > + > > +gdb_exit > > +gdb_start > > +gdb_reinitialize_dir $srcdir/$subdir > > +gdb_load ${binfile} > > + > > +gdb_breakpoint [gdb_get_line_number "Set DFP rounding mode."] > > + > > +gdb_run_cmd > > + > > +# When the prompt comes back we'll be at the Set DFP rounding mode breakpoint. > > +# Unless the program bails out after checking AT_HWCAP. > > +gdb_expect { > > + -re "Program exited with code 01.\[\r\n\]+$gdb_prompt $" { > > + unsupported "This machine doesn't support Decimal Floating Point." > > + return -1 > > + } > > + > > + -re ".*$gdb_prompt $" {} > > +} > > + > > +# First, verify if FPSCR is all zeroes. > > +gdb_test "print \$fpscr" " = 0" "FPSCR is all zeroes" > > + > > +# Step over "set rounding mode" instruction. > > +gdb_test "next" "" "" > > + > > +# Verify that the following bits are set (See Power ISA for details): > > +# > > +# 29:31 - DFP Rounding Control > > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" > > > > -- []'s Thiago Jung Bauermann IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-09-15 0:02 [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native Thiago Jung Bauermann 2008-09-24 20:32 ` Thiago Jung Bauermann @ 2008-11-14 11:32 ` Joel Brobecker 2008-11-14 11:36 ` Joel Brobecker 1 sibling, 1 reply; 8+ messages in thread From: Joel Brobecker @ 2008-11-14 11:32 UTC (permalink / raw) To: Thiago Jung Bauermann; +Cc: gdb-patches ml I will start by saying that I don't know the various powerpc variants very well, but your patch sat unreviewed for a long time, so I have to trust your judgement in the way you separated the ia205 variants from the rest. From what I can tell, this is pretty much the standard way of doing this, so this looks fine. > gdb/ > * ppc-linux-nat.c (ppc_register_u_addr): Add special case to return > offset for full 64-bit slot of FPSCR when in 32-bits. > (ppc_linux_read_description): Return target description with 64-bit > FPSCR when inferior is running on an ISA 2.05 or later processor. > * ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call > initialize_tdec_powerpc_isa205_32l, > initialize_tdec_powerpc_isa205_altivec32l, > initialize_tdec_powerpc_isa205_vsx32l, > initialize_tdec_powerpc_isa205_64l, > initialize_tdec_powerpc_isa205_altivec64l and > initialize_tdec_powerpc_isa205_vsx64l. > * ppc-linux-tdep.h: Add external declaration for > tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l, > tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l, > tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l. > * features/rs600/powerpc-fpu-isa205.xml: New file. > * features/rs600/powerpc-isa205-32l.xml: New file. > * features/rs600/powerpc-isa205-64l.xml: New file. > * features/rs600/powerpc-isa205-altivec32l.xml: New file. > * features/rs600/powerpc-isa205-altivec64l.xml: New file. > * features/rs600/powerpc-isa205-vsx32l.xml: New file. > * features/rs600/powerpc-isa205-vsx64l.xml: New file. > * features/rs600/powerpc-isa205-32l.c: Generate. > * features/rs600/powerpc-isa205-64l.c: Generate. > * features/rs600/powerpc-isa205-altivec32l.c: Generate. > * features/rs600/powerpc-isa205-altivec64l.c: Generate. > * features/rs600/powerpc-isa205-vsx32l.c: Generate. > * features/rs600/powerpc-isa205-vsx64l.c: Generate. > > gdb/testsuite/ > > * gdb.arch/ppc-dfp.exp: New file. > * gdb.arch/ppc-dfp.c: New file. > +#ifndef PPC_FEATURE_ARCH_2_05 > +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ > +#endif How would this macro be defined? Does it come from one of the system includes? What does this macro contain? Perhaps a comment describing this macro would be useful. (a few minutes later, after I started looking at the change inside ppc_linux_read_description, I think I get it, now...) > + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit > + slot and not just its second word. The PT_FPSCR supplied in a > + 32-bit GDB compilation doesn't reflect this. */ 32-bit GDB compilation: Do you mean a 32-bit GDB? While you're modifying this part of the code, I noticed a typo in a comment just above: /* NOTE: cagney/2005-02-08: On some 64-bit GNU/Linux systems the kernel headers incorrectly contained the 32-bit definition of PT_FPSCR. For the 32-bit definition, floating-point registers occupy two 32-bit "slots", and the FPSCR lives in the secondhalf of such a slot-pair (hence +1). For 64-bit, ^^^^^^^^^^ missing space between second and half. Thanks! > +# Please email any bugs, comments, and/or additions to this file to: > +# bug-gdb@prep.ai.mit.edu Could you remove this part form your copyright header? > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" Just a casual remark, not a request for change, but I'm surprised that you might find /t more useful in this case than /x ;-). :REVIEWMAIL: -- Joel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-11-14 11:32 ` Joel Brobecker @ 2008-11-14 11:36 ` Joel Brobecker 2008-11-18 5:45 ` Thiago Jung Bauermann 0 siblings, 1 reply; 8+ messages in thread From: Joel Brobecker @ 2008-11-14 11:36 UTC (permalink / raw) To: Thiago Jung Bauermann; +Cc: gdb-patches ml [humpf, I ended up being interrupted while reviewing and forgot to write the end of the email before sending it. Here is, hopefully, the complete version] I will start by saying that I don't know the various powerpc variants very well, but your patch sat unreviewed for a long time, so I have to trust your judgement in the way you separated the ia205 variants from the rest. From what I can tell, this is pretty much the standard way of doing this, so this looks fine. > gdb/ > * ppc-linux-nat.c (ppc_register_u_addr): Add special case to return > offset for full 64-bit slot of FPSCR when in 32-bits. > (ppc_linux_read_description): Return target description with 64-bit > FPSCR when inferior is running on an ISA 2.05 or later processor. > * ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call > initialize_tdec_powerpc_isa205_32l, > initialize_tdec_powerpc_isa205_altivec32l, > initialize_tdec_powerpc_isa205_vsx32l, > initialize_tdec_powerpc_isa205_64l, > initialize_tdec_powerpc_isa205_altivec64l and > initialize_tdec_powerpc_isa205_vsx64l. > * ppc-linux-tdep.h: Add external declaration for > tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l, > tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l, > tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l. > * features/rs600/powerpc-fpu-isa205.xml: New file. > * features/rs600/powerpc-isa205-32l.xml: New file. > * features/rs600/powerpc-isa205-64l.xml: New file. > * features/rs600/powerpc-isa205-altivec32l.xml: New file. > * features/rs600/powerpc-isa205-altivec64l.xml: New file. > * features/rs600/powerpc-isa205-vsx32l.xml: New file. > * features/rs600/powerpc-isa205-vsx64l.xml: New file. > * features/rs600/powerpc-isa205-32l.c: Generate. > * features/rs600/powerpc-isa205-64l.c: Generate. > * features/rs600/powerpc-isa205-altivec32l.c: Generate. > * features/rs600/powerpc-isa205-altivec64l.c: Generate. > * features/rs600/powerpc-isa205-vsx32l.c: Generate. > * features/rs600/powerpc-isa205-vsx64l.c: Generate. > > gdb/testsuite/ > > * gdb.arch/ppc-dfp.exp: New file. > * gdb.arch/ppc-dfp.c: New file. > +#ifndef PPC_FEATURE_ARCH_2_05 > +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ > +#endif How would this macro be defined? Does it come from one of the system includes? What does this macro contain? Perhaps a comment describing this macro would be useful. (a few minutes later, after I started looking at the change inside ppc_linux_read_description, I think I get it, now...) > + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit > + slot and not just its second word. The PT_FPSCR supplied in a > + 32-bit GDB compilation doesn't reflect this. */ 32-bit GDB compilation: Do you mean a 32-bit GDB? While you're modifying this part of the code, I noticed a typo in a comment just above: /* NOTE: cagney/2005-02-08: On some 64-bit GNU/Linux systems the kernel headers incorrectly contained the 32-bit definition of PT_FPSCR. For the 32-bit definition, floating-point registers occupy two 32-bit "slots", and the FPSCR lives in the secondhalf of such a slot-pair (hence +1). For 64-bit, ^^^^^^^^^^ missing space between second and half. Thanks! > +# Please email any bugs, comments, and/or additions to this file to: > +# bug-gdb@prep.ai.mit.edu Could you remove this part form your copyright header? > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" Just a casual remark, not a request for change, but I'm surprised that you might find /t more useful in this case than /x ;-). Overall, the patch looks sane to me. Can you just wait a few more days, say until Monday to give the real experts a chance to yell at me ;-), and then commit? :REVIEWMAIL: -- Joel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-11-14 11:36 ` Joel Brobecker @ 2008-11-18 5:45 ` Thiago Jung Bauermann 2008-11-18 5:46 ` Daniel Jacobowitz 2008-11-19 13:30 ` Thiago Jung Bauermann 0 siblings, 2 replies; 8+ messages in thread From: Thiago Jung Bauermann @ 2008-11-18 5:45 UTC (permalink / raw) To: Joel Brobecker; +Cc: gdb-patches ml Thanks for your review, Joel! El jue, 13-11-2008 a las 15:54 -0800, Joel Brobecker escribió: > I will start by saying that I don't know the various powerpc variants > very well, but your patch sat unreviewed for a long time, so I have > to trust your judgement in the way you separated the ia205 variants > from the rest. From what I can tell, this is pretty much the standard > way of doing this, so this looks fine. Yes, that's my conclusion as well. I don't like the explosion in the number of target description .xml files this approach brings, but I thought about it for a while, and couldn't find a better way to do it. If linking to the expat library wasn't optional when building GDB, one option would be to provide just the power-fpu-isa205.xml file containing the feature description, and then generate the target description XML on the fly including the appropriate features, and have GDB parse that. > > +#ifndef PPC_FEATURE_ARCH_2_05 > > +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ > > +#endif > > How would this macro be defined? Does it come from one of the system > includes? What does this macro contain? Perhaps a comment describing > this macro would be useful. > > (a few minutes later, after I started looking at the change inside > ppc_linux_read_description, I think I get it, now...) I added this comment, to make it clearer: +/* The PPC_FEATURE_* defines should be provided by <asm/cputable.h>. + If they aren't, we can provide them ourselves (their values are fixed + because they are part of the kernel ABI). They are used in the AT_HWCAP + entry of the AUXV. */ #ifndef PPC_FEATURE_BOOKE #define PPC_FEATURE_BOOKE 0x00008000 #endif +#ifndef PPC_FEATURE_ARCH_2_05 +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ +#endif > > + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit > > + slot and not just its second word. The PT_FPSCR supplied in a > > + 32-bit GDB compilation doesn't reflect this. */ > > 32-bit GDB compilation: Do you mean a 32-bit GDB? Right. I changed the sentence to read "The PT_FPSCR supplied when GDB is compiled as a 32-bit app doesn't reflect this.", I hope it's better. > While you're modifying this part of the code, I noticed a typo in > a comment just above: > > /* NOTE: cagney/2005-02-08: On some 64-bit GNU/Linux systems the > kernel headers incorrectly contained the 32-bit definition of > PT_FPSCR. For the 32-bit definition, floating-point > registers occupy two 32-bit "slots", and the FPSCR lives in > the secondhalf of such a slot-pair (hence +1). For 64-bit, > ^^^^^^^^^^ missing space between second and half. Sure, fixed that in the patch as well. > > +# Please email any bugs, comments, and/or additions to this file to: > > +# bug-gdb@prep.ai.mit.edu > > Could you remove this part form your copyright header? Oops, good catch. Removed. > > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" > > Just a casual remark, not a request for change, but I'm surprised > that you might find /t more useful in this case than /x ;-). I agree in general /x is more helpful, but in this case binary was easier because the FPSCR is just a bunch of flags, so I could directly see which were set and which weren't. Ok, I admit I still don't do my taxes in hex. :-) > Overall, the patch looks sane to me. Can you just wait a few more days, > say until Monday to give the real experts a chance to yell at me ;-), > and then commit? Great! If nobody yells, I'll commit the following tomorrow. -- []'s Thiago Jung Bauermann IBM Linux Technology Center 2008-11-17 Thiago Jung Bauermann <bauerman@br.ibm.com> gdb/ * ppc-linux-nat.c (ppc_register_u_addr): Add special case to return offset for full 64-bit slot of FPSCR when in 32-bits. (ppc_linux_read_description): Return target description with 64-bit FPSCR when inferior is running on an ISA 2.05 or later processor. * ppc-linux-tdep.c (_initialize_ppc_linux_tdep): Call initialize_tdec_powerpc_isa205_32l, initialize_tdec_powerpc_isa205_altivec32l, initialize_tdec_powerpc_isa205_vsx32l, initialize_tdec_powerpc_isa205_64l, initialize_tdec_powerpc_isa205_altivec64l and initialize_tdec_powerpc_isa205_vsx64l. * ppc-linux-tdep.h: Add external declaration for tdesc_powerpc_isa205_32l, tdesc_powerpc_isa205_altivec32l, tdesc_powerpc_isa205_vsx32l, tdesc_powerpc_isa205_64l, tdesc_powerpc_isa205_altivec64l and tdesc_powerpc_isa205_vsx64l. * features/rs600/powerpc-fpu-isa205.xml: New file. * features/rs600/powerpc-isa205-32l.xml: New file. * features/rs600/powerpc-isa205-64l.xml: New file. * features/rs600/powerpc-isa205-altivec32l.xml: New file. * features/rs600/powerpc-isa205-altivec64l.xml: New file. * features/rs600/powerpc-isa205-vsx32l.xml: New file. * features/rs600/powerpc-isa205-vsx64l.xml: New file. * features/rs600/powerpc-isa205-32l.c: Generate. * features/rs600/powerpc-isa205-64l.c: Generate. * features/rs600/powerpc-isa205-altivec32l.c: Generate. * features/rs600/powerpc-isa205-altivec64l.c: Generate. * features/rs600/powerpc-isa205-vsx32l.c: Generate. * features/rs600/powerpc-isa205-vsx64l.c: Generate. gdb/testsuite/ * gdb.arch/ppc-dfp.exp: New file. * gdb.arch/ppc-dfp.c: New file. Index: gdb.git/gdb/features/rs6000/power-fpu-isa205.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/power-fpu-isa205.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,44 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2007, 2008 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. --> + +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> +<feature name="org.gnu.gdb.power.fpu"> + <reg name="f0" bitsize="64" type="ieee_double" regnum="32"/> + <reg name="f1" bitsize="64" type="ieee_double"/> + <reg name="f2" bitsize="64" type="ieee_double"/> + <reg name="f3" bitsize="64" type="ieee_double"/> + <reg name="f4" bitsize="64" type="ieee_double"/> + <reg name="f5" bitsize="64" type="ieee_double"/> + <reg name="f6" bitsize="64" type="ieee_double"/> + <reg name="f7" bitsize="64" type="ieee_double"/> + <reg name="f8" bitsize="64" type="ieee_double"/> + <reg name="f9" bitsize="64" type="ieee_double"/> + <reg name="f10" bitsize="64" type="ieee_double"/> + <reg name="f11" bitsize="64" type="ieee_double"/> + <reg name="f12" bitsize="64" type="ieee_double"/> + <reg name="f13" bitsize="64" type="ieee_double"/> + <reg name="f14" bitsize="64" type="ieee_double"/> + <reg name="f15" bitsize="64" type="ieee_double"/> + <reg name="f16" bitsize="64" type="ieee_double"/> + <reg name="f17" bitsize="64" type="ieee_double"/> + <reg name="f18" bitsize="64" type="ieee_double"/> + <reg name="f19" bitsize="64" type="ieee_double"/> + <reg name="f20" bitsize="64" type="ieee_double"/> + <reg name="f21" bitsize="64" type="ieee_double"/> + <reg name="f22" bitsize="64" type="ieee_double"/> + <reg name="f23" bitsize="64" type="ieee_double"/> + <reg name="f24" bitsize="64" type="ieee_double"/> + <reg name="f25" bitsize="64" type="ieee_double"/> + <reg name="f26" bitsize="64" type="ieee_double"/> + <reg name="f27" bitsize="64" type="ieee_double"/> + <reg name="f28" bitsize="64" type="ieee_double"/> + <reg name="f29" bitsize="64" type="ieee_double"/> + <reg name="f30" bitsize="64" type="ieee_double"/> + <reg name="f31" bitsize="64" type="ieee_double"/> + + <reg name="fpscr" bitsize="64" group="float" regnum="70"/> +</feature> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-32l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers". --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common</architecture> + <xi:include href="power-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power-linux.xml"/> +</target> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-64l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers". --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common64</architecture> + <xi:include href="power64-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power64-linux.xml"/> +</target> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec32l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,19 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers" and AltiVec + vector registers. --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common</architecture> + <xi:include href="power-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power-linux.xml"/> + <xi:include href="power-altivec.xml"/> +</target> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-altivec64l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,19 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers" and AltiVec + vector registers. --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common64</architecture> + <xi:include href="power64-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power64-linux.xml"/> + <xi:include href="power-altivec.xml"/> +</target> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx32l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers", AltiVec + and VSX vector registers. --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common</architecture> + <xi:include href="power-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power-linux.xml"/> + <xi:include href="power-altivec.xml"/> + <xi:include href="power-vsx.xml"/> +</target> Index: gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/features/rs6000/powerpc-isa205-vsx64l.xml 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- Copyright (C) 2008 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. --> + +<!-- PowerPC UISA - a PPC processor as viewed by user-level code. A UISA-only + view of the PowerPC. Includes Linux-only special "registers", AltiVec + and VSX vector registers. --> + +<!DOCTYPE target SYSTEM "gdb-target.dtd"> +<target> + <architecture>powerpc:common64</architecture> + <xi:include href="power64-core.xml"/> + <xi:include href="power-fpu-isa205.xml"/> + <xi:include href="power64-linux.xml"/> + <xi:include href="power-altivec.xml"/> + <xi:include href="power-vsx.xml"/> +</target> Index: gdb.git/gdb/ppc-linux-nat.c =================================================================== --- gdb.git.orig/gdb/ppc-linux-nat.c 2008-11-17 18:02:15.000000000 -0200 +++ gdb.git/gdb/ppc-linux-nat.c 2008-11-17 19:39:06.000000000 -0200 @@ -56,9 +56,16 @@ #define PT_TRAP 40 #endif +/* The PPC_FEATURE_* defines should be provided by <asm/cputable.h>. + If they aren't, we can provide them ourselves (their values are fixed + because they are part of the kernel ABI). They are used in the AT_HWCAP + entry of the AUXV. */ #ifndef PPC_FEATURE_BOOKE #define PPC_FEATURE_BOOKE 0x00008000 #endif +#ifndef PPC_FEATURE_ARCH_2_05 +#define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ +#endif /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a configure time check. Some older glibc's (for instance 2.2.1) @@ -274,11 +281,17 @@ ppc_register_u_addr (struct gdbarch *gdb kernel headers incorrectly contained the 32-bit definition of PT_FPSCR. For the 32-bit definition, floating-point registers occupy two 32-bit "slots", and the FPSCR lives in - the secondhalf of such a slot-pair (hence +1). For 64-bit, + the second half of such a slot-pair (hence +1). For 64-bit, the FPSCR instead occupies the full 64-bit 2-word-slot and hence no adjustment is necessary. Hack around this. */ if (wordsize == 8 && PT_FPSCR == (48 + 32 + 1)) u_addr = (48 + 32) * wordsize; + /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit + slot and not just its second word. The PT_FPSCR supplied when + GDB is compiled as a 32-bit app doesn't reflect this. */ + else if (wordsize == 4 && register_size (gdbarch, regno) == 8 + && PT_FPSCR == (48 + 2*32 + 1)) + u_addr = (48 + 2*32) * wordsize; else u_addr = PT_FPSCR * wordsize; } @@ -1230,6 +1243,7 @@ ppc_linux_read_description (struct targe { int altivec = 0; int vsx = 0; + int isa205 = 0; int tid = TIDGET (inferior_ptid); if (tid == 0) @@ -1274,6 +1288,9 @@ ppc_linux_read_description (struct targe perror_with_name (_("Unable to fetch AltiVec registers")); } + if (ppc_linux_get_hwcap () & PPC_FEATURE_ARCH_2_05) + isa205 = 1; + /* Check for 64-bit inferior process. This is the case when the host is 64-bit, and in addition the top bit of the MSR register is set. */ #ifdef __powerpc64__ @@ -1284,21 +1301,21 @@ ppc_linux_read_description (struct targe if (errno == 0 && msr < 0) { if (vsx) - return tdesc_powerpc_vsx64l; + return isa205? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l; else if (altivec) - return tdesc_powerpc_altivec64l; + return isa205? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l; - return tdesc_powerpc_64l; + return isa205? tdesc_powerpc_isa205_64l : tdesc_powerpc_64l; } } #endif if (vsx) - return tdesc_powerpc_vsx32l; + return isa205? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l; else if (altivec) - return tdesc_powerpc_altivec32l; + return isa205? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l; - return tdesc_powerpc_32l; + return isa205? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l; } void _initialize_ppc_linux_nat (void); Index: gdb.git/gdb/ppc-linux-tdep.c =================================================================== --- gdb.git.orig/gdb/ppc-linux-tdep.c 2008-11-17 18:02:15.000000000 -0200 +++ gdb.git/gdb/ppc-linux-tdep.c 2008-11-17 18:37:25.000000000 -0200 @@ -42,9 +42,15 @@ #include "features/rs6000/powerpc-32l.c" #include "features/rs6000/powerpc-altivec32l.c" #include "features/rs6000/powerpc-vsx32l.c" +#include "features/rs6000/powerpc-isa205-32l.c" +#include "features/rs6000/powerpc-isa205-altivec32l.c" +#include "features/rs6000/powerpc-isa205-vsx32l.c" #include "features/rs6000/powerpc-64l.c" #include "features/rs6000/powerpc-altivec64l.c" #include "features/rs6000/powerpc-vsx64l.c" +#include "features/rs6000/powerpc-isa205-64l.c" +#include "features/rs6000/powerpc-isa205-altivec64l.c" +#include "features/rs6000/powerpc-isa205-vsx64l.c" #include "features/rs6000/powerpc-e500l.c" @@ -1170,8 +1176,14 @@ _initialize_ppc_linux_tdep (void) initialize_tdesc_powerpc_32l (); initialize_tdesc_powerpc_altivec32l (); initialize_tdesc_powerpc_vsx32l (); + initialize_tdesc_powerpc_isa205_32l (); + initialize_tdesc_powerpc_isa205_altivec32l (); + initialize_tdesc_powerpc_isa205_vsx32l (); initialize_tdesc_powerpc_64l (); initialize_tdesc_powerpc_altivec64l (); initialize_tdesc_powerpc_vsx64l (); + initialize_tdesc_powerpc_isa205_64l (); + initialize_tdesc_powerpc_isa205_altivec64l (); + initialize_tdesc_powerpc_isa205_vsx64l (); initialize_tdesc_powerpc_e500l (); } Index: gdb.git/gdb/ppc-linux-tdep.h =================================================================== --- gdb.git.orig/gdb/ppc-linux-tdep.h 2008-11-17 18:02:15.000000000 -0200 +++ gdb.git/gdb/ppc-linux-tdep.h 2008-11-17 18:37:25.000000000 -0200 @@ -42,9 +42,15 @@ int ppc_linux_trap_reg_p (struct gdbarch extern struct target_desc *tdesc_powerpc_32l; extern struct target_desc *tdesc_powerpc_altivec32l; extern struct target_desc *tdesc_powerpc_vsx32l; +extern struct target_desc *tdesc_powerpc_isa205_32l; +extern struct target_desc *tdesc_powerpc_isa205_altivec32l; +extern struct target_desc *tdesc_powerpc_isa205_vsx32l; extern struct target_desc *tdesc_powerpc_e500l; extern struct target_desc *tdesc_powerpc_64l; extern struct target_desc *tdesc_powerpc_altivec64l; extern struct target_desc *tdesc_powerpc_vsx64l; +extern struct target_desc *tdesc_powerpc_isa205_64l; +extern struct target_desc *tdesc_powerpc_isa205_altivec64l; +extern struct target_desc *tdesc_powerpc_isa205_vsx64l; #endif /* PPC_LINUX_TDEP_H */ Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.c 2008-11-17 18:37:25.000000000 -0200 @@ -0,0 +1,46 @@ +/* Copyright 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <elf.h> + +#ifdef __powerpc64__ +typedef Elf64_auxv_t auxv_t; +#else +typedef Elf32_auxv_t auxv_t; +#endif + +#ifndef PPC_FEATURE_HAS_DFP +#define PPC_FEATURE_HAS_DFP 0x00000400 +#endif + +int +main (int argc, char *argv[], char *envp[], auxv_t auxv[]) +{ + int i; + + for (i = 0; auxv[i].a_type != AT_NULL; i++) + if (auxv[i].a_type == AT_HWCAP) { + if (!(auxv[i].a_un.a_val & PPC_FEATURE_HAS_DFP)) + return 1; + + break; + } + + asm ("mtfsfi 7, 5, 1\n"); /* Set DFP rounding mode. */ + + return 0; +} Index: gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/testsuite/gdb.arch/ppc-dfp.exp 2008-11-17 19:41:51.000000000 -0200 @@ -0,0 +1,79 @@ +# Copyright (C) 2008 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# Tests for Powerpc Decimal Floating Point registers setting and fetching + +if $tracelevel then { + strace $tracelevel +} + +if ![istarget "powerpc*"] then { + verbose "Skipping powerpc decimal floating point register tests." + return +} + +set testfile "ppc-dfp" +set binfile ${objdir}/${subdir}/${testfile} +set srcfile ${testfile}.c + +if [get_compiler_info $binfile] { + warning "get_compiler failed" + return -1 +} + +if ![test_compiler_info gcc*] { + # We use GCC's extended asm syntax + warning "unknown compiler" + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } { + unsupported "This machine doesn't support Decimal Floating Point." + return -1 +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_breakpoint [gdb_get_line_number "Set DFP rounding mode."] + +gdb_run_cmd + +# When the prompt comes back we'll be at the Set DFP rounding mode breakpoint. +# Unless the program bails out after checking AT_HWCAP. +gdb_expect { + -re "Program exited with code 01.\[\r\n\]+$gdb_prompt $" { + unsupported "This machine doesn't support Decimal Floating Point." + return -1 + } + + -re ".*$gdb_prompt $" {} +} + +# First, verify if FPSCR is all zeroes. +gdb_test "print \$fpscr" " = 0" "FPSCR is all zeroes" + +# Step over "set rounding mode" instruction. +gdb_test "next" "" "" + +# Verify that the following bits are set (See Power ISA for details): +# +# 29:31 - DFP Rounding Control +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-11-18 5:45 ` Thiago Jung Bauermann @ 2008-11-18 5:46 ` Daniel Jacobowitz 2008-11-19 13:30 ` Thiago Jung Bauermann 1 sibling, 0 replies; 8+ messages in thread From: Daniel Jacobowitz @ 2008-11-18 5:46 UTC (permalink / raw) To: Thiago Jung Bauermann; +Cc: Joel Brobecker, gdb-patches ml On Mon, Nov 17, 2008 at 08:00:23PM -0200, Thiago Jung Bauermann wrote: > If linking to the expat library wasn't optional when building GDB, one > option would be to provide just the power-fpu-isa205.xml file containing > the feature description, and then generate the target description XML on > the fly including the appropriate features, and have GDB parse that. There's another way you could do it... if the individual features could be compiled to C instead of just entire descriptions you could call their generated functions. It's not set up to work that way at the moment. I don't know if it would be an easy change or a messy one. > > > +gdb_test "print/t \$fpscr" " = 10100000000000000000000000000000000" "FPSCR for round to nearest, ties toward zero rounding mode" > > > > Just a casual remark, not a request for change, but I'm surprised > > that you might find /t more useful in this case than /x ;-). > > I agree in general /x is more helpful, but in this case binary was > easier because the FPSCR is just a bunch of flags, so I could directly > see which were set and which weren't. > > Ok, I admit I still don't do my taxes in hex. :-) You do them in binary? Anyway, you might want to consider adding a flags type, like x86 %eflags, for $fpscr. -- Daniel Jacobowitz CodeSourcery ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native 2008-11-18 5:45 ` Thiago Jung Bauermann 2008-11-18 5:46 ` Daniel Jacobowitz @ 2008-11-19 13:30 ` Thiago Jung Bauermann 1 sibling, 0 replies; 8+ messages in thread From: Thiago Jung Bauermann @ 2008-11-19 13:30 UTC (permalink / raw) To: Joel Brobecker; +Cc: gdb-patches ml El lun, 17-11-2008 a las 20:00 -0200, Thiago Jung Bauermann escribió: > > Overall, the patch looks sane to me. Can you just wait a few more days, > > say until Monday to give the real experts a chance to yell at me ;-), > > and then commit? > > Great! If nobody yells, I'll commit the following tomorrow. Committed, thanks! -- []'s Thiago Jung Bauermann IBM Linux Technology Center ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-11-18 21:50 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-09-15 0:02 [rfc][1/2] add suport for 64-bit fpscr in powerpc linux native Thiago Jung Bauermann 2008-09-24 20:32 ` Thiago Jung Bauermann 2008-11-13 20:06 ` Thiago Jung Bauermann 2008-11-14 11:32 ` Joel Brobecker 2008-11-14 11:36 ` Joel Brobecker 2008-11-18 5:45 ` Thiago Jung Bauermann 2008-11-18 5:46 ` Daniel Jacobowitz 2008-11-19 13:30 ` Thiago Jung Bauermann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox