Blame SOURCES/gdb-rhbz1187581-power8-regs-not-in-8-2-11of15.patch

ce65b8
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
ce65b8
From: Keith Seitz <keiths@redhat.com>
ce65b8
Date: Fri, 11 Jan 2019 17:02:17 -0500
ce65b8
Subject: gdb-rhbz1187581-power8-regs-not-in-8-2-11of15.patch
ce65b8
ce65b8
;; [PowerPC] Add support for TAR
ce65b8
;; Edjunior Barbosa Machado and Pedro Franco de Carvalho
ce65b8
ce65b8
    [PowerPC] Add support for TAR
ce65b8
ce65b8
    This patch adds support for the Target Address Register for powerpc
ce65b8
    linux native and core file targets, and in the powerpc linux server
ce65b8
    stub.
ce65b8
ce65b8
    gdb/ChangeLog:
ce65b8
    2018-10-26  Edjunior Barbosa Machado  <emachado@linux.vnet.ibm.com>
ce65b8
            Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
ce65b8
ce65b8
        * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa207_vsx32l)
ce65b8
        (tdesc_powerpc_isa207_vsx64l): Declare.
ce65b8
        * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_TARREGSET): Define.
ce65b8
        (struct ppc_linux_features) <isa207>: New field.
ce65b8
        (ppc_linux_no_features): Add initializer for isa207 field.
ce65b8
        * arch/ppc-linux-common.c (ppc_linux_match_description): Return
ce65b8
        new tdescs.
ce65b8
        * nat/ppc-linux.h (PPC_FEATURE2_ARCH_2_07, PPC_FEATURE2_TAR)
ce65b8
        (NT_PPC_TAR): Define if not already defined.
ce65b8
        * features/Makefile (WHICH): Add rs6000/powerpc-isa207-vsx32l and
ce65b8
        rs6000/powerpc-isa207-vsx64l.
ce65b8
        (XMLTOC): Add rs6000/powerpc-isa207-vsx32l.xml and
ce65b8
        rs6000/powerpc-isa207-vsx64l.xml.
ce65b8
        * features/rs6000/power-tar.xml: New file.
ce65b8
        * features/rs6000/powerpc-isa207-vsx32l.xml: New file.
ce65b8
        * features/rs6000/powerpc-isa207-vsx64l.xml: New file.
ce65b8
        * features/rs6000/powerpc-isa207-vsx32l.c: Generate.
ce65b8
        * features/rs6000/powerpc-isa207-vsx64l.c: Generate.
ce65b8
        * regformats/rs6000/powerpc-isa207-vsx32l.dat: Generate.
ce65b8
        * regformats/rs6000/powerpc-isa207-vsx64l.dat: Generate.
ce65b8
        * ppc-linux-nat.c (fetch_register, fetch_ppc_registers): Call
ce65b8
        fetch_regset with the TAR regset.
ce65b8
        (store_register, store_ppc_registers): Call store_regset with the
ce65b8
        TAR regset.
ce65b8
        (ppc_linux_nat_target::read_description): Set isa207 field in the
ce65b8
        features struct if needed.
ce65b8
        * ppc-linux-tdep.c: Include
ce65b8
        features/rs6000/powerpc-isa207-vsx32l.c and
ce65b8
        features/rs6000/powerpc-isa207-vsx64l.c.
ce65b8
        (ppc32_regmap_tar, ppc32_linux_tarregset): New globals.
ce65b8
        (ppc_linux_iterate_over_regset_sections): Call back with the tar
ce65b8
        regset.
ce65b8
        (ppc_linux_core_read_description): Check if the tar section is
ce65b8
        present and set isa207 in the features struct.
ce65b8
        (_initialize_ppc_linux_tdep): Call
ce65b8
        initialize_tdesc_powerpc_isa207_vsx32l and
ce65b8
        initialize_tdesc_powerpc_isa207_vsx64l.
ce65b8
        * ppc-linux-tdep.h (ppc32_linux_tarregset): Declare.
ce65b8
        * ppc-tdep.h (gdbarch_tdep) <ppc_tar_regnum>: New field.
ce65b8
        (enum) <PPC_TAR_REGNUM>: New enum value.
ce65b8
        * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate tar
ce65b8
        feature.
ce65b8
        (ppc_process_record_op31): Record changes to TAR.
ce65b8
ce65b8
    gdb/gdbserver/ChangeLog:
ce65b8
    2018-10-26  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
ce65b8
ce65b8
        * configure.srv (ipa_ppc_linux_regobj): Add
ce65b8
        powerpc-isa207-vsx64l-ipa.o and powerpc-isa207-vsx32l-ipa.o.
ce65b8
        (powerpc*-*-linux*): Add powerpc-isa207-vsx32l.o and
ce65b8
        powerpc-isa207-vsx64l.o to srv_regobj, add rs6000/power-tar.xml,
ce65b8
        rs6000/powerpc-isa207-vsx32l.xml, and
ce65b8
        rs6000/powerpc-isa207-vsx64l.xml to srv_xmlfiles.
ce65b8
        * linux-ppc-tdesc-init.h (enum ppc_linux_tdesc)
ce65b8
        <PPC_TDESC_ISA207_VSX>: New enum value.
ce65b8
        (init_registers_powerpc_isa207_vsx32l): Declare.
ce65b8
        (init_registers_powerpc_isa207_vsx64l): Declare.
ce65b8
        * linux-ppc-low.c (ppc_fill_tarregset): New function.
ce65b8
        (ppc_store_tarregset): New function.
ce65b8
        (ppc_regsets): Add entry for the TAR regset.
ce65b8
        (ppc_arch_setup): Set isa207 in features struct when needed.  Set
ce65b8
        size for the TAR regsets.
ce65b8
        (ppc_get_ipa_tdesc_idx): Return PPC_TDESC_ISA207_VSX.
ce65b8
        (initialize_low_arch): Call init_registers_powerpc_isa207_vsx32l
ce65b8
        and init_registers_powerpc_isa207_vsx64l.
ce65b8
        * linux-ppc-ipa.c (get_ipa_tdesc): Handle PPC_TDESC_ISA207_VSX.
ce65b8
        (initialize_low_tracepoint): Call
ce65b8
        init_registers_powerpc_isa207_vsx32l and
ce65b8
        init_registers_powerpc_isa207_vsx64l.
ce65b8
ce65b8
    gdb/testsuite/ChangeLog:
ce65b8
    2018-10-26  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
ce65b8
ce65b8
        * gdb.arch/powerpc-tar.c: New file.
ce65b8
        * gdb.arch/powerpc-tar.exp: New file.
ce65b8
ce65b8
    gdb/doc/ChangeLog:
ce65b8
    2018-10-26  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
ce65b8
ce65b8
        * gdb.texinfo (PowerPC Features): Describe new feature
ce65b8
        "org.gnu.gdb.power.tar".
ce65b8
ce65b8
diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c
ce65b8
--- a/gdb/arch/ppc-linux-common.c
ce65b8
+++ b/gdb/arch/ppc-linux-common.c
ce65b8
@@ -53,7 +53,8 @@ ppc_linux_match_description (struct ppc_linux_features features)
ce65b8
       if (features.cell)
ce65b8
 	tdesc = tdesc_powerpc_cell64l;
ce65b8
       else if (features.vsx)
ce65b8
-	tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l
ce65b8
+	tdesc = (features.isa207? tdesc_powerpc_isa207_vsx64l
ce65b8
+		 : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l
ce65b8
 		 : features.isa205? tdesc_powerpc_isa205_vsx64l
ce65b8
 		 : tdesc_powerpc_vsx64l);
ce65b8
       else if (features.altivec)
ce65b8
@@ -70,7 +71,8 @@ ppc_linux_match_description (struct ppc_linux_features features)
ce65b8
       if (features.cell)
ce65b8
 	tdesc = tdesc_powerpc_cell32l;
ce65b8
       else if (features.vsx)
ce65b8
-	tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l
ce65b8
+	tdesc = (features.isa207? tdesc_powerpc_isa207_vsx32l
ce65b8
+		 : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l
ce65b8
 		 : features.isa205? tdesc_powerpc_isa205_vsx32l
ce65b8
 		 : tdesc_powerpc_vsx32l);
ce65b8
       else if (features.altivec)
ce65b8
diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h
ce65b8
--- a/gdb/arch/ppc-linux-common.h
ce65b8
+++ b/gdb/arch/ppc-linux-common.h
ce65b8
@@ -32,6 +32,7 @@ struct target_desc;
ce65b8
 #define PPC_LINUX_SIZEOF_VSXREGSET 256
ce65b8
 #define PPC_LINUX_SIZEOF_PPRREGSET 8
ce65b8
 #define PPC_LINUX_SIZEOF_DSCRREGSET 8
ce65b8
+#define PPC_LINUX_SIZEOF_TARREGSET 8
ce65b8
 
ce65b8
 /* Check if the hwcap auxv entry indicates that isa205 is supported.  */
ce65b8
 bool ppc_linux_has_isa205 (CORE_ADDR hwcap);
ce65b8
@@ -44,6 +45,7 @@ struct ppc_linux_features
ce65b8
   bool vsx;
ce65b8
   bool isa205;
ce65b8
   bool ppr_dscr;
ce65b8
+  bool isa207;
ce65b8
   bool cell;
ce65b8
 };
ce65b8
 
ce65b8
@@ -55,6 +57,7 @@ const struct ppc_linux_features ppc_linux_no_features = {
ce65b8
   false,
ce65b8
   false,
ce65b8
   false,
ce65b8
+  false,
ce65b8
 };
ce65b8
 
ce65b8
 /* Return a target description that matches FEATURES.  */
ce65b8
diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h
ce65b8
--- a/gdb/arch/ppc-linux-tdesc.h
ce65b8
+++ b/gdb/arch/ppc-linux-tdesc.h
ce65b8
@@ -30,6 +30,7 @@ extern struct target_desc *tdesc_powerpc_isa205_32l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
ce65b8
+extern struct target_desc *tdesc_powerpc_isa207_vsx32l;
ce65b8
 extern struct target_desc *tdesc_powerpc_e500l;
ce65b8
 
ce65b8
 extern struct target_desc *tdesc_powerpc_64l;
ce65b8
@@ -40,5 +41,6 @@ extern struct target_desc *tdesc_powerpc_isa205_64l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
ce65b8
 extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
ce65b8
+extern struct target_desc *tdesc_powerpc_isa207_vsx64l;
ce65b8
 
ce65b8
 #endif /* ARCH_PPC_LINUX_TDESC_H */
ce65b8
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
ce65b8
--- a/gdb/doc/gdb.texinfo
ce65b8
+++ b/gdb/doc/gdb.texinfo
ce65b8
@@ -42582,6 +42582,9 @@ contain the 64-bit register @samp{ppr}.
ce65b8
 The @samp{org.gnu.gdb.power.dscr} feature is optional.  It should
ce65b8
 contain the 64-bit register @samp{dscr}.
ce65b8
 
ce65b8
+The @samp{org.gnu.gdb.power.tar} feature is optional.  It should
ce65b8
+contain the 64-bit register @samp{tar}.
ce65b8
+
ce65b8
 @node S/390 and System z Features
ce65b8
 @subsection S/390 and System z Features
ce65b8
 @cindex target descriptions, S/390 features
ce65b8
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
ce65b8
--- a/gdb/features/Makefile
ce65b8
+++ b/gdb/features/Makefile
ce65b8
@@ -75,6 +75,7 @@ WHICH = aarch64 \
ce65b8
 	rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \
ce65b8
 	rs6000/powerpc-isa205-ppr-dscr-vsx32l \
ce65b8
 	rs6000/powerpc-isa205-ppr-dscr-vsx64l \
ce65b8
+	rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \
ce65b8
 	s390-linux32 s390-linux64 s390x-linux64 \
ce65b8
 	s390-linux32v1 s390-linux64v1 s390x-linux64v1 \
ce65b8
 	s390-linux32v2 s390-linux64v2 s390x-linux64v2 \
ce65b8
@@ -171,6 +172,8 @@ XMLTOC = \
ce65b8
 	rs6000/powerpc-isa205-vsx64l.xml \
ce65b8
 	rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \
ce65b8
 	rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \
ce65b8
+	rs6000/powerpc-isa207-vsx32l.xml \
ce65b8
+	rs6000/powerpc-isa207-vsx64l.xml \
ce65b8
 	rs6000/powerpc-vsx32.xml \
ce65b8
 	rs6000/powerpc-vsx32l.xml \
ce65b8
 	rs6000/powerpc-vsx64.xml \
ce65b8
diff --git a/gdb/features/rs6000/power-tar.xml b/gdb/features/rs6000/power-tar.xml
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/features/rs6000/power-tar.xml
ce65b8
@@ -0,0 +1,12 @@
ce65b8
+
ce65b8
+
ce65b8
+
ce65b8
+     Copying and distribution of this file, with or without modification,
ce65b8
+     are permitted in any medium without royalty provided the copyright
ce65b8
+     notice and this notice are preserved.  -->
ce65b8
+
ce65b8
+
ce65b8
+
ce65b8
+<feature name="org.gnu.gdb.power.tar">
ce65b8
+  <reg name="tar" bitsize="64" type="uint64"/>
ce65b8
+</feature>
ce65b8
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.c
ce65b8
@@ -0,0 +1,203 @@
ce65b8
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
ce65b8
+  Original: powerpc-isa207-vsx32l.xml */
ce65b8
+
ce65b8
+#include "defs.h"
ce65b8
+#include "osabi.h"
ce65b8
+#include "target-descriptions.h"
ce65b8
+
ce65b8
+struct target_desc *tdesc_powerpc_isa207_vsx32l;
ce65b8
+static void
ce65b8
+initialize_tdesc_powerpc_isa207_vsx32l (void)
ce65b8
+{
ce65b8
+  struct target_desc *result = allocate_target_description ();
ce65b8
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
ce65b8
+
ce65b8
+  struct tdesc_feature *feature;
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
ce65b8
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
ce65b8
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
ce65b8
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
ce65b8
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
ce65b8
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
ce65b8
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
ce65b8
+  tdesc_type *element_type;
ce65b8
+  element_type = tdesc_named_type (feature, "ieee_single");
ce65b8
+  tdesc_create_vector (feature, "v4f", element_type, 4);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int32");
ce65b8
+  tdesc_create_vector (feature, "v4i32", element_type, 4);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int16");
ce65b8
+  tdesc_create_vector (feature, "v8i16", element_type, 8);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int8");
ce65b8
+  tdesc_create_vector (feature, "v16i8", element_type, 16);
ce65b8
+
ce65b8
+  tdesc_type_with_fields *type_with_fields;
ce65b8
+  type_with_fields = tdesc_create_union (feature, "vec128");
ce65b8
+  tdesc_type *field_type;
ce65b8
+  field_type = tdesc_named_type (feature, "uint128");
ce65b8
+  tdesc_add_field (type_with_fields, "uint128", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v4f");
ce65b8
+  tdesc_add_field (type_with_fields, "v4_float", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v4i32");
ce65b8
+  tdesc_add_field (type_with_fields, "v4_int32", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v8i16");
ce65b8
+  tdesc_add_field (type_with_fields, "v8_int16", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v16i8");
ce65b8
+  tdesc_add_field (type_with_fields, "v16_int8", field_type);
ce65b8
+
ce65b8
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
ce65b8
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
ce65b8
+  tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
ce65b8
+  tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
ce65b8
+  tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
ce65b8
+  tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  tdesc_powerpc_isa207_vsx32l = result;
ce65b8
+}
ce65b8
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.xml b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml
ce65b8
@@ -0,0 +1,19 @@
ce65b8
+
ce65b8
+
ce65b8
+
ce65b8
+     Copying and distribution of this file, with or without modification,
ce65b8
+     are permitted in any medium without royalty provided the copyright
ce65b8
+     notice and this notice are preserved.  -->
ce65b8
+
ce65b8
+
ce65b8
+<target>
ce65b8
+  <architecture>powerpc:common</architecture>
ce65b8
+  <xi:include href="power-core.xml"/>
ce65b8
+  <xi:include href="power-fpu-isa205.xml"/>
ce65b8
+  <xi:include href="power-linux.xml"/>
ce65b8
+  <xi:include href="power-altivec.xml"/>
ce65b8
+  <xi:include href="power-vsx.xml"/>
ce65b8
+  <xi:include href="power-ppr.xml"/>
ce65b8
+  <xi:include href="power-dscr.xml"/>
ce65b8
+  <xi:include href="power-tar.xml"/>
ce65b8
+</target>
ce65b8
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.c
ce65b8
@@ -0,0 +1,203 @@
ce65b8
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
ce65b8
+  Original: powerpc-isa207-vsx64l.xml */
ce65b8
+
ce65b8
+#include "defs.h"
ce65b8
+#include "osabi.h"
ce65b8
+#include "target-descriptions.h"
ce65b8
+
ce65b8
+struct target_desc *tdesc_powerpc_isa207_vsx64l;
ce65b8
+static void
ce65b8
+initialize_tdesc_powerpc_isa207_vsx64l (void)
ce65b8
+{
ce65b8
+  struct target_desc *result = allocate_target_description ();
ce65b8
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
ce65b8
+
ce65b8
+  struct tdesc_feature *feature;
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
ce65b8
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
ce65b8
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
ce65b8
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
ce65b8
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
ce65b8
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
ce65b8
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
ce65b8
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
ce65b8
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
ce65b8
+  tdesc_type *element_type;
ce65b8
+  element_type = tdesc_named_type (feature, "ieee_single");
ce65b8
+  tdesc_create_vector (feature, "v4f", element_type, 4);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int32");
ce65b8
+  tdesc_create_vector (feature, "v4i32", element_type, 4);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int16");
ce65b8
+  tdesc_create_vector (feature, "v8i16", element_type, 8);
ce65b8
+
ce65b8
+  element_type = tdesc_named_type (feature, "int8");
ce65b8
+  tdesc_create_vector (feature, "v16i8", element_type, 16);
ce65b8
+
ce65b8
+  tdesc_type_with_fields *type_with_fields;
ce65b8
+  type_with_fields = tdesc_create_union (feature, "vec128");
ce65b8
+  tdesc_type *field_type;
ce65b8
+  field_type = tdesc_named_type (feature, "uint128");
ce65b8
+  tdesc_add_field (type_with_fields, "uint128", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v4f");
ce65b8
+  tdesc_add_field (type_with_fields, "v4_float", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v4i32");
ce65b8
+  tdesc_add_field (type_with_fields, "v4_int32", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v8i16");
ce65b8
+  tdesc_add_field (type_with_fields, "v8_int16", field_type);
ce65b8
+  field_type = tdesc_named_type (feature, "v16i8");
ce65b8
+  tdesc_add_field (type_with_fields, "v16_int8", field_type);
ce65b8
+
ce65b8
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
ce65b8
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
ce65b8
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
ce65b8
+  tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
ce65b8
+  tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
ce65b8
+  tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
ce65b8
+  tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
ce65b8
+  tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
ce65b8
+
ce65b8
+  tdesc_powerpc_isa207_vsx64l = result;
ce65b8
+}
ce65b8
diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.xml b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml
ce65b8
@@ -0,0 +1,19 @@
ce65b8
+
ce65b8
+
ce65b8
+
ce65b8
+     Copying and distribution of this file, with or without modification,
ce65b8
+     are permitted in any medium without royalty provided the copyright
ce65b8
+     notice and this notice are preserved.  -->
ce65b8
+
ce65b8
+
ce65b8
+<target>
ce65b8
+  <architecture>powerpc:common64</architecture>
ce65b8
+  <xi:include href="power64-core.xml"/>
ce65b8
+  <xi:include href="power-fpu-isa205.xml"/>
ce65b8
+  <xi:include href="power64-linux.xml"/>
ce65b8
+  <xi:include href="power-altivec.xml"/>
ce65b8
+  <xi:include href="power-vsx.xml"/>
ce65b8
+  <xi:include href="power-ppr.xml"/>
ce65b8
+  <xi:include href="power-dscr.xml"/>
ce65b8
+  <xi:include href="power-tar.xml"/>
ce65b8
+</target>
ce65b8
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
ce65b8
--- a/gdb/gdbserver/configure.srv
ce65b8
+++ b/gdb/gdbserver/configure.srv
ce65b8
@@ -32,7 +32,7 @@ else
ce65b8
    srv_amd64_linux_regobj=""
ce65b8
 fi
ce65b8
 
ce65b8
-ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o"
ce65b8
+ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o"
ce65b8
 
ce65b8
 # Linux object files.  This is so we don't have to repeat
ce65b8
 # these files over and over again.
ce65b8
@@ -218,6 +218,7 @@ case "${target}" in
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o"
ce65b8
+			srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-e500l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-64l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-altivec64l.o"
ce65b8
@@ -227,6 +228,7 @@ case "${target}" in
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o"
ce65b8
 			srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o"
ce65b8
+			srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o"
ce65b8
 			srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o"
ce65b8
 			srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o"
ce65b8
 			srv_xmlfiles="rs6000/powerpc-32l.xml"
ce65b8
@@ -237,6 +239,7 @@ case "${target}" in
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml"
ce65b8
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml"
ce65b8
@@ -245,6 +248,7 @@ case "${target}" in
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml"
ce65b8
+			srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml"
ce65b8
@@ -255,6 +259,7 @@ case "${target}" in
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml"
ce65b8
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml"
ce65b8
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml"
ce65b8
 			srv_linux_usrregs=yes
ce65b8
diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c
ce65b8
--- a/gdb/gdbserver/linux-ppc-ipa.c
ce65b8
+++ b/gdb/gdbserver/linux-ppc-ipa.c
ce65b8
@@ -193,6 +193,8 @@ get_ipa_tdesc (int idx)
ce65b8
       return tdesc_powerpc_isa205_vsx64l;
ce65b8
     case PPC_TDESC_ISA205_PPR_DSCR_VSX:
ce65b8
       return tdesc_powerpc_isa205_ppr_dscr_vsx64l;
ce65b8
+    case PPC_TDESC_ISA207_VSX:
ce65b8
+      return tdesc_powerpc_isa207_vsx64l;
ce65b8
 #else
ce65b8
     case PPC_TDESC_BASE:
ce65b8
       return tdesc_powerpc_32l;
ce65b8
@@ -210,6 +212,8 @@ get_ipa_tdesc (int idx)
ce65b8
       return tdesc_powerpc_isa205_vsx32l;
ce65b8
     case PPC_TDESC_ISA205_PPR_DSCR_VSX:
ce65b8
       return tdesc_powerpc_isa205_ppr_dscr_vsx32l;
ce65b8
+    case PPC_TDESC_ISA207_VSX:
ce65b8
+      return tdesc_powerpc_isa207_vsx32l;
ce65b8
     case PPC_TDESC_E500:
ce65b8
       return tdesc_powerpc_e500l;
ce65b8
 #endif
ce65b8
@@ -239,6 +243,7 @@ initialize_low_tracepoint (void)
ce65b8
   init_registers_powerpc_isa205_altivec64l ();
ce65b8
   init_registers_powerpc_isa205_vsx64l ();
ce65b8
   init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
ce65b8
+  init_registers_powerpc_isa207_vsx64l ();
ce65b8
 #else
ce65b8
   init_registers_powerpc_32l ();
ce65b8
   init_registers_powerpc_altivec32l ();
ce65b8
@@ -248,6 +253,7 @@ initialize_low_tracepoint (void)
ce65b8
   init_registers_powerpc_isa205_altivec32l ();
ce65b8
   init_registers_powerpc_isa205_vsx32l ();
ce65b8
   init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
ce65b8
+  init_registers_powerpc_isa207_vsx32l ();
ce65b8
   init_registers_powerpc_e500l ();
ce65b8
 #endif
ce65b8
 }
ce65b8
diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c
ce65b8
--- a/gdb/gdbserver/linux-ppc-low.c
ce65b8
+++ b/gdb/gdbserver/linux-ppc-low.c
ce65b8
@@ -525,6 +525,26 @@ ppc_store_dscrregset (struct regcache *regcache, const void *buf)
ce65b8
   supply_register_by_name (regcache, "dscr", dscr);
ce65b8
 }
ce65b8
 
ce65b8
+/* Target Address Register regset fill function.  */
ce65b8
+
ce65b8
+static void
ce65b8
+ppc_fill_tarregset (struct regcache *regcache, void *buf)
ce65b8
+{
ce65b8
+  char *tar = (char *) buf;
ce65b8
+
ce65b8
+  collect_register_by_name (regcache, "tar", tar);
ce65b8
+}
ce65b8
+
ce65b8
+/* Target Address Register regset store function.  */
ce65b8
+
ce65b8
+static void
ce65b8
+ppc_store_tarregset (struct regcache *regcache, const void *buf)
ce65b8
+{
ce65b8
+  const char *tar = (const char *) buf;
ce65b8
+
ce65b8
+  supply_register_by_name (regcache, "tar", tar);
ce65b8
+}
ce65b8
+
ce65b8
 static void
ce65b8
 ppc_fill_vsxregset (struct regcache *regcache, void *buf)
ce65b8
 {
ce65b8
@@ -634,6 +654,8 @@ static struct regset_info ppc_regsets[] = {
ce65b8
      fetch them every time, but still fall back to PTRACE_PEEKUSER for the
ce65b8
      general registers.  Some kernels support these, but not the newer
ce65b8
      PPC_PTRACE_GETREGS.  */
ce65b8
+  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TAR, 0, EXTENDED_REGS,
ce65b8
+    ppc_fill_tarregset, ppc_store_tarregset },
ce65b8
   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS,
ce65b8
     ppc_fill_pprregset, ppc_store_pprregset },
ce65b8
   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DSCR, 0, EXTENDED_REGS,
ce65b8
@@ -708,7 +730,14 @@ ppc_arch_setup (void)
ce65b8
   if ((ppc_hwcap2 & PPC_FEATURE2_DSCR)
ce65b8
       && ppc_check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET)
ce65b8
       && ppc_check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET))
ce65b8
-    features.ppr_dscr = true;
ce65b8
+    {
ce65b8
+      features.ppr_dscr = true;
ce65b8
+      if ((ppc_hwcap2 & PPC_FEATURE2_ARCH_2_07)
ce65b8
+	  && (ppc_hwcap2 & PPC_FEATURE2_TAR)
ce65b8
+	  && ppc_check_regset (tid, NT_PPC_TAR,
ce65b8
+			       PPC_LINUX_SIZEOF_TARREGSET))
ce65b8
+	features.isa207 = true;
ce65b8
+    }
ce65b8
 
ce65b8
   if (ppc_hwcap & PPC_FEATURE_CELL)
ce65b8
     features.cell = true;
ce65b8
@@ -765,6 +794,10 @@ ppc_arch_setup (void)
ce65b8
 	    regset->size = (features.ppr_dscr ?
ce65b8
 			    PPC_LINUX_SIZEOF_DSCRREGSET : 0);
ce65b8
 	    break;
ce65b8
+	  case NT_PPC_TAR:
ce65b8
+	    regset->size = (features.isa207 ?
ce65b8
+			    PPC_LINUX_SIZEOF_TARREGSET : 0);
ce65b8
+	    break;
ce65b8
 	  default:
ce65b8
 	    break;
ce65b8
 	  }
ce65b8
@@ -3146,6 +3179,8 @@ ppc_get_ipa_tdesc_idx (void)
ce65b8
     return PPC_TDESC_ISA205_VSX;
ce65b8
   if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx64l)
ce65b8
     return PPC_TDESC_ISA205_PPR_DSCR_VSX;
ce65b8
+  if (tdesc == tdesc_powerpc_isa207_vsx64l)
ce65b8
+    return PPC_TDESC_ISA207_VSX;
ce65b8
 #endif
ce65b8
 
ce65b8
   if (tdesc == tdesc_powerpc_32l)
ce65b8
@@ -3164,6 +3199,8 @@ ppc_get_ipa_tdesc_idx (void)
ce65b8
     return PPC_TDESC_ISA205_VSX;
ce65b8
   if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx32l)
ce65b8
     return PPC_TDESC_ISA205_PPR_DSCR_VSX;
ce65b8
+  if (tdesc == tdesc_powerpc_isa207_vsx32l)
ce65b8
+    return PPC_TDESC_ISA207_VSX;
ce65b8
   if (tdesc == tdesc_powerpc_e500l)
ce65b8
     return PPC_TDESC_E500;
ce65b8
 
ce65b8
@@ -3223,6 +3260,7 @@ initialize_low_arch (void)
ce65b8
   init_registers_powerpc_isa205_altivec32l ();
ce65b8
   init_registers_powerpc_isa205_vsx32l ();
ce65b8
   init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
ce65b8
+  init_registers_powerpc_isa207_vsx32l ();
ce65b8
   init_registers_powerpc_e500l ();
ce65b8
 #if __powerpc64__
ce65b8
   init_registers_powerpc_64l ();
ce65b8
@@ -3233,6 +3271,7 @@ initialize_low_arch (void)
ce65b8
   init_registers_powerpc_isa205_altivec64l ();
ce65b8
   init_registers_powerpc_isa205_vsx64l ();
ce65b8
   init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
ce65b8
+  init_registers_powerpc_isa207_vsx64l ();
ce65b8
 #endif
ce65b8
 
ce65b8
   initialize_regsets_info (&ppc_regsets_info);
ce65b8
diff --git a/gdb/gdbserver/linux-ppc-tdesc-init.h b/gdb/gdbserver/linux-ppc-tdesc-init.h
ce65b8
--- a/gdb/gdbserver/linux-ppc-tdesc-init.h
ce65b8
+++ b/gdb/gdbserver/linux-ppc-tdesc-init.h
ce65b8
@@ -30,6 +30,7 @@ enum ppc_linux_tdesc {
ce65b8
   PPC_TDESC_ISA205_ALTIVEC,
ce65b8
   PPC_TDESC_ISA205_VSX,
ce65b8
   PPC_TDESC_ISA205_PPR_DSCR_VSX,
ce65b8
+  PPC_TDESC_ISA207_VSX,
ce65b8
   PPC_TDESC_E500,
ce65b8
 };
ce65b8
 
ce65b8
@@ -59,6 +60,9 @@ void init_registers_powerpc_isa205_vsx32l (void);
ce65b8
 /* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx32l.c.  */
ce65b8
 void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void);
ce65b8
 
ce65b8
+/* Defined in auto-generated file powerpc-isa207-vsx32l.c.  */
ce65b8
+void init_registers_powerpc_isa207_vsx32l (void);
ce65b8
+
ce65b8
 /* Defined in auto-generated file powerpc-e500l.c.  */
ce65b8
 void init_registers_powerpc_e500l (void);
ce65b8
 
ce65b8
@@ -90,4 +94,7 @@ void init_registers_powerpc_isa205_vsx64l (void);
ce65b8
 /* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx64l.c.  */
ce65b8
 void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void);
ce65b8
 
ce65b8
+/* Defined in auto-generated file powerpc-isa207-vsx64l.c.  */
ce65b8
+void init_registers_powerpc_isa207_vsx64l (void);
ce65b8
+
ce65b8
 #endif
ce65b8
diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h
ce65b8
--- a/gdb/nat/ppc-linux.h
ce65b8
+++ b/gdb/nat/ppc-linux.h
ce65b8
@@ -54,6 +54,12 @@
ce65b8
 #ifndef PPC_FEATURE2_DSCR
ce65b8
 #define PPC_FEATURE2_DSCR 0x20000000
ce65b8
 #endif
ce65b8
+#ifndef PPC_FEATURE2_ARCH_2_07
ce65b8
+#define PPC_FEATURE2_ARCH_2_07 0x80000000
ce65b8
+#endif
ce65b8
+#ifndef PPC_FEATURE2_TAR
ce65b8
+#define PPC_FEATURE2_TAR 0x04000000
ce65b8
+#endif
ce65b8
 
ce65b8
 /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
ce65b8
    configure time check.  Some older glibc's (for instance 2.2.1)
ce65b8
@@ -85,6 +91,11 @@
ce65b8
 #define PTRACE_SETEVRREGS 21
ce65b8
 #endif
ce65b8
 
ce65b8
+/* Target Address Register.  */
ce65b8
+#ifndef NT_PPC_TAR
ce65b8
+#define NT_PPC_TAR 0x103
ce65b8
+#endif
ce65b8
+
ce65b8
 /* Program Priority Register.  */
ce65b8
 #ifndef NT_PPC_PPR
ce65b8
 #define NT_PPC_PPR 0x104
ce65b8
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
ce65b8
--- a/gdb/ppc-linux-nat.c
ce65b8
+++ b/gdb/ppc-linux-nat.c
ce65b8
@@ -658,6 +658,15 @@ fetch_register (struct regcache *regcache, int tid, int regno)
ce65b8
 		    &ppc32_linux_pprregset);
ce65b8
       return;
ce65b8
     }
ce65b8
+  else if (regno == PPC_TAR_REGNUM)
ce65b8
+    {
ce65b8
+      gdb_assert (tdep->ppc_tar_regnum != -1);
ce65b8
+
ce65b8
+      fetch_regset (regcache, tid, NT_PPC_TAR,
ce65b8
+		    PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+		    &ppc32_linux_tarregset);
ce65b8
+      return;
ce65b8
+    }
ce65b8
 
ce65b8
   if (regaddr == -1)
ce65b8
     {
ce65b8
@@ -862,6 +871,10 @@ fetch_ppc_registers (struct regcache *regcache, int tid)
ce65b8
     fetch_regset (regcache, tid, NT_PPC_DSCR,
ce65b8
 		  PPC_LINUX_SIZEOF_DSCRREGSET,
ce65b8
 		  &ppc32_linux_dscrregset);
ce65b8
+  if (tdep->ppc_tar_regnum != -1)
ce65b8
+    fetch_regset (regcache, tid, NT_PPC_TAR,
ce65b8
+		  PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+		  &ppc32_linux_tarregset);
ce65b8
 }
ce65b8
 
ce65b8
 /* Fetch registers from the child process.  Fetch all registers if
ce65b8
@@ -1060,6 +1073,15 @@ store_register (const struct regcache *regcache, int tid, int regno)
ce65b8
 		    &ppc32_linux_pprregset);
ce65b8
       return;
ce65b8
     }
ce65b8
+  else if (regno == PPC_TAR_REGNUM)
ce65b8
+    {
ce65b8
+      gdb_assert (tdep->ppc_tar_regnum != -1);
ce65b8
+
ce65b8
+      store_regset (regcache, tid, regno, NT_PPC_TAR,
ce65b8
+		    PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+		    &ppc32_linux_tarregset);
ce65b8
+      return;
ce65b8
+    }
ce65b8
 
ce65b8
   if (regaddr == -1)
ce65b8
     return;
ce65b8
@@ -1282,6 +1304,10 @@ store_ppc_registers (const struct regcache *regcache, int tid)
ce65b8
     store_regset (regcache, tid, -1, NT_PPC_DSCR,
ce65b8
 		  PPC_LINUX_SIZEOF_DSCRREGSET,
ce65b8
 		  &ppc32_linux_dscrregset);
ce65b8
+  if (tdep->ppc_tar_regnum != -1)
ce65b8
+    store_regset (regcache, tid, -1, NT_PPC_TAR,
ce65b8
+		  PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+		  &ppc32_linux_tarregset);
ce65b8
 }
ce65b8
 
ce65b8
 /* Fetch the AT_HWCAP entry from the aux vector.  */
ce65b8
@@ -2409,7 +2435,13 @@ ppc_linux_nat_target::read_description ()
ce65b8
   if ((hwcap2 & PPC_FEATURE2_DSCR)
ce65b8
       && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
ce65b8
       && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
ce65b8
-    features.ppr_dscr = true;
ce65b8
+    {
ce65b8
+      features.ppr_dscr = true;
ce65b8
+      if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
ce65b8
+	  && (hwcap2 & PPC_FEATURE2_TAR)
ce65b8
+	  && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET))
ce65b8
+	features.isa207 = true;
ce65b8
+    }
ce65b8
 
ce65b8
   return ppc_linux_match_description (features);
ce65b8
 }
ce65b8
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
ce65b8
--- a/gdb/ppc-linux-tdep.c
ce65b8
+++ b/gdb/ppc-linux-tdep.c
ce65b8
@@ -72,6 +72,7 @@
ce65b8
 #include "features/rs6000/powerpc-isa205-altivec32l.c"
ce65b8
 #include "features/rs6000/powerpc-isa205-vsx32l.c"
ce65b8
 #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c"
ce65b8
+#include "features/rs6000/powerpc-isa207-vsx32l.c"
ce65b8
 #include "features/rs6000/powerpc-64l.c"
ce65b8
 #include "features/rs6000/powerpc-altivec64l.c"
ce65b8
 #include "features/rs6000/powerpc-cell64l.c"
ce65b8
@@ -80,6 +81,7 @@
ce65b8
 #include "features/rs6000/powerpc-isa205-altivec64l.c"
ce65b8
 #include "features/rs6000/powerpc-isa205-vsx64l.c"
ce65b8
 #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c"
ce65b8
+#include "features/rs6000/powerpc-isa207-vsx64l.c"
ce65b8
 #include "features/rs6000/powerpc-e500l.c"
ce65b8
 
ce65b8
 /* Shared library operations for PowerPC-Linux.  */
ce65b8
@@ -581,6 +583,22 @@ const struct regset ppc32_linux_dscrregset = {
ce65b8
   regcache_collect_regset
ce65b8
 };
ce65b8
 
ce65b8
+/* Target Address Register regmap.  */
ce65b8
+
ce65b8
+static const struct regcache_map_entry ppc32_regmap_tar[] =
ce65b8
+  {
ce65b8
+      { 1, PPC_TAR_REGNUM, 8 },
ce65b8
+      { 0 }
ce65b8
+  };
ce65b8
+
ce65b8
+/* Target Address Register regset.  */
ce65b8
+
ce65b8
+const struct regset ppc32_linux_tarregset = {
ce65b8
+  ppc32_regmap_tar,
ce65b8
+  regcache_supply_regset,
ce65b8
+  regcache_collect_regset
ce65b8
+};
ce65b8
+
ce65b8
 const struct regset *
ce65b8
 ppc_linux_gregset (int wordsize)
ce65b8
 {
ce65b8
@@ -621,6 +639,7 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
ce65b8
   int have_vsx = tdep->ppc_vsr0_upper_regnum != -1;
ce65b8
   int have_ppr = tdep->ppc_ppr_regnum != -1;
ce65b8
   int have_dscr = tdep->ppc_dscr_regnum != -1;
ce65b8
+  int have_tar = tdep->ppc_tar_regnum != -1;
ce65b8
 
ce65b8
   if (tdep->wordsize == 4)
ce65b8
     cb (".reg", 48 * 4, 48 * 4, &ppc32_linux_gregset, NULL, cb_data);
ce65b8
@@ -650,6 +669,11 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
ce65b8
 	PPC_LINUX_SIZEOF_DSCRREGSET,
ce65b8
 	&ppc32_linux_dscrregset, "Data Stream Control Register",
ce65b8
 	cb_data);
ce65b8
+
ce65b8
+  if (have_tar)
ce65b8
+    cb (".reg-ppc-tar", PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+	PPC_LINUX_SIZEOF_TARREGSET,
ce65b8
+	&ppc32_linux_tarregset, "Target Address Register", cb_data);
ce65b8
 }
ce65b8
 
ce65b8
 static void
ce65b8
@@ -1064,6 +1088,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
ce65b8
   asection *section = bfd_get_section_by_name (abfd, ".reg");
ce65b8
   asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr");
ce65b8
   asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr");
ce65b8
+  asection *tar = bfd_get_section_by_name (abfd, ".reg-ppc-tar");
ce65b8
 
ce65b8
   if (! section)
ce65b8
     return NULL;
ce65b8
@@ -1097,7 +1122,11 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
ce65b8
   features.isa205 = ppc_linux_has_isa205 (hwcap);
ce65b8
 
ce65b8
   if (ppr && dscr)
ce65b8
-    features.ppr_dscr = true;
ce65b8
+    {
ce65b8
+      features.ppr_dscr = true;
ce65b8
+      if (tar)
ce65b8
+	features.isa207 = true;
ce65b8
+    }
ce65b8
 
ce65b8
   return ppc_linux_match_description (features);
ce65b8
 }
ce65b8
@@ -1973,6 +2002,7 @@ _initialize_ppc_linux_tdep (void)
ce65b8
   initialize_tdesc_powerpc_isa205_altivec32l ();
ce65b8
   initialize_tdesc_powerpc_isa205_vsx32l ();
ce65b8
   initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l ();
ce65b8
+  initialize_tdesc_powerpc_isa207_vsx32l ();
ce65b8
   initialize_tdesc_powerpc_64l ();
ce65b8
   initialize_tdesc_powerpc_altivec64l ();
ce65b8
   initialize_tdesc_powerpc_cell64l ();
ce65b8
@@ -1981,5 +2011,6 @@ _initialize_ppc_linux_tdep (void)
ce65b8
   initialize_tdesc_powerpc_isa205_altivec64l ();
ce65b8
   initialize_tdesc_powerpc_isa205_vsx64l ();
ce65b8
   initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l ();
ce65b8
+  initialize_tdesc_powerpc_isa207_vsx64l ();
ce65b8
   initialize_tdesc_powerpc_e500l ();
ce65b8
 }
ce65b8
diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h
ce65b8
--- a/gdb/ppc-linux-tdep.h
ce65b8
+++ b/gdb/ppc-linux-tdep.h
ce65b8
@@ -47,5 +47,6 @@ int ppc_linux_trap_reg_p (struct gdbarch *gdbarch);
ce65b8
 /* Additional register sets, defined in ppc-linux-tdep.c.  */
ce65b8
 extern const struct regset ppc32_linux_pprregset;
ce65b8
 extern const struct regset ppc32_linux_dscrregset;
ce65b8
+extern const struct regset ppc32_linux_tarregset;
ce65b8
 
ce65b8
 #endif /* PPC_LINUX_TDEP_H */
ce65b8
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
ce65b8
--- a/gdb/ppc-tdep.h
ce65b8
+++ b/gdb/ppc-tdep.h
ce65b8
@@ -259,6 +259,9 @@ struct gdbarch_tdep
ce65b8
     /* Data Stream Control Register.  */
ce65b8
     int ppc_dscr_regnum;
ce65b8
 
ce65b8
+    /* Target Address Register.  */
ce65b8
+    int ppc_tar_regnum;
ce65b8
+
ce65b8
     /* Decimal 128 registers.  */
ce65b8
     int ppc_dl0_regnum;		/* First Decimal128 argument register pair.  */
ce65b8
 
ce65b8
@@ -317,6 +320,7 @@ enum {
ce65b8
   PPC_VSR31_UPPER_REGNUM = 171,
ce65b8
   PPC_PPR_REGNUM = 172,
ce65b8
   PPC_DSCR_REGNUM = 173,
ce65b8
+  PPC_TAR_REGNUM = 174,
ce65b8
   PPC_NUM_REGS
ce65b8
 };
ce65b8
 
ce65b8
diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat
ce65b8
@@ -0,0 +1,147 @@
ce65b8
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
ce65b8
+# Generated from: rs6000/powerpc-isa207-vsx32l.xml
ce65b8
+name:powerpc_isa207_vsx32l
ce65b8
+xmltarget:powerpc-isa207-vsx32l.xml
ce65b8
+expedite:r1,pc
ce65b8
+32:r0
ce65b8
+32:r1
ce65b8
+32:r2
ce65b8
+32:r3
ce65b8
+32:r4
ce65b8
+32:r5
ce65b8
+32:r6
ce65b8
+32:r7
ce65b8
+32:r8
ce65b8
+32:r9
ce65b8
+32:r10
ce65b8
+32:r11
ce65b8
+32:r12
ce65b8
+32:r13
ce65b8
+32:r14
ce65b8
+32:r15
ce65b8
+32:r16
ce65b8
+32:r17
ce65b8
+32:r18
ce65b8
+32:r19
ce65b8
+32:r20
ce65b8
+32:r21
ce65b8
+32:r22
ce65b8
+32:r23
ce65b8
+32:r24
ce65b8
+32:r25
ce65b8
+32:r26
ce65b8
+32:r27
ce65b8
+32:r28
ce65b8
+32:r29
ce65b8
+32:r30
ce65b8
+32:r31
ce65b8
+64:f0
ce65b8
+64:f1
ce65b8
+64:f2
ce65b8
+64:f3
ce65b8
+64:f4
ce65b8
+64:f5
ce65b8
+64:f6
ce65b8
+64:f7
ce65b8
+64:f8
ce65b8
+64:f9
ce65b8
+64:f10
ce65b8
+64:f11
ce65b8
+64:f12
ce65b8
+64:f13
ce65b8
+64:f14
ce65b8
+64:f15
ce65b8
+64:f16
ce65b8
+64:f17
ce65b8
+64:f18
ce65b8
+64:f19
ce65b8
+64:f20
ce65b8
+64:f21
ce65b8
+64:f22
ce65b8
+64:f23
ce65b8
+64:f24
ce65b8
+64:f25
ce65b8
+64:f26
ce65b8
+64:f27
ce65b8
+64:f28
ce65b8
+64:f29
ce65b8
+64:f30
ce65b8
+64:f31
ce65b8
+32:pc
ce65b8
+32:msr
ce65b8
+32:cr
ce65b8
+32:lr
ce65b8
+32:ctr
ce65b8
+32:xer
ce65b8
+64:fpscr
ce65b8
+32:orig_r3
ce65b8
+32:trap
ce65b8
+128:vr0
ce65b8
+128:vr1
ce65b8
+128:vr2
ce65b8
+128:vr3
ce65b8
+128:vr4
ce65b8
+128:vr5
ce65b8
+128:vr6
ce65b8
+128:vr7
ce65b8
+128:vr8
ce65b8
+128:vr9
ce65b8
+128:vr10
ce65b8
+128:vr11
ce65b8
+128:vr12
ce65b8
+128:vr13
ce65b8
+128:vr14
ce65b8
+128:vr15
ce65b8
+128:vr16
ce65b8
+128:vr17
ce65b8
+128:vr18
ce65b8
+128:vr19
ce65b8
+128:vr20
ce65b8
+128:vr21
ce65b8
+128:vr22
ce65b8
+128:vr23
ce65b8
+128:vr24
ce65b8
+128:vr25
ce65b8
+128:vr26
ce65b8
+128:vr27
ce65b8
+128:vr28
ce65b8
+128:vr29
ce65b8
+128:vr30
ce65b8
+128:vr31
ce65b8
+32:vscr
ce65b8
+32:vrsave
ce65b8
+64:vs0h
ce65b8
+64:vs1h
ce65b8
+64:vs2h
ce65b8
+64:vs3h
ce65b8
+64:vs4h
ce65b8
+64:vs5h
ce65b8
+64:vs6h
ce65b8
+64:vs7h
ce65b8
+64:vs8h
ce65b8
+64:vs9h
ce65b8
+64:vs10h
ce65b8
+64:vs11h
ce65b8
+64:vs12h
ce65b8
+64:vs13h
ce65b8
+64:vs14h
ce65b8
+64:vs15h
ce65b8
+64:vs16h
ce65b8
+64:vs17h
ce65b8
+64:vs18h
ce65b8
+64:vs19h
ce65b8
+64:vs20h
ce65b8
+64:vs21h
ce65b8
+64:vs22h
ce65b8
+64:vs23h
ce65b8
+64:vs24h
ce65b8
+64:vs25h
ce65b8
+64:vs26h
ce65b8
+64:vs27h
ce65b8
+64:vs28h
ce65b8
+64:vs29h
ce65b8
+64:vs30h
ce65b8
+64:vs31h
ce65b8
+64:ppr
ce65b8
+64:dscr
ce65b8
+64:tar
ce65b8
diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat
ce65b8
@@ -0,0 +1,147 @@
ce65b8
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
ce65b8
+# Generated from: rs6000/powerpc-isa207-vsx64l.xml
ce65b8
+name:powerpc_isa207_vsx64l
ce65b8
+xmltarget:powerpc-isa207-vsx64l.xml
ce65b8
+expedite:r1,pc
ce65b8
+64:r0
ce65b8
+64:r1
ce65b8
+64:r2
ce65b8
+64:r3
ce65b8
+64:r4
ce65b8
+64:r5
ce65b8
+64:r6
ce65b8
+64:r7
ce65b8
+64:r8
ce65b8
+64:r9
ce65b8
+64:r10
ce65b8
+64:r11
ce65b8
+64:r12
ce65b8
+64:r13
ce65b8
+64:r14
ce65b8
+64:r15
ce65b8
+64:r16
ce65b8
+64:r17
ce65b8
+64:r18
ce65b8
+64:r19
ce65b8
+64:r20
ce65b8
+64:r21
ce65b8
+64:r22
ce65b8
+64:r23
ce65b8
+64:r24
ce65b8
+64:r25
ce65b8
+64:r26
ce65b8
+64:r27
ce65b8
+64:r28
ce65b8
+64:r29
ce65b8
+64:r30
ce65b8
+64:r31
ce65b8
+64:f0
ce65b8
+64:f1
ce65b8
+64:f2
ce65b8
+64:f3
ce65b8
+64:f4
ce65b8
+64:f5
ce65b8
+64:f6
ce65b8
+64:f7
ce65b8
+64:f8
ce65b8
+64:f9
ce65b8
+64:f10
ce65b8
+64:f11
ce65b8
+64:f12
ce65b8
+64:f13
ce65b8
+64:f14
ce65b8
+64:f15
ce65b8
+64:f16
ce65b8
+64:f17
ce65b8
+64:f18
ce65b8
+64:f19
ce65b8
+64:f20
ce65b8
+64:f21
ce65b8
+64:f22
ce65b8
+64:f23
ce65b8
+64:f24
ce65b8
+64:f25
ce65b8
+64:f26
ce65b8
+64:f27
ce65b8
+64:f28
ce65b8
+64:f29
ce65b8
+64:f30
ce65b8
+64:f31
ce65b8
+64:pc
ce65b8
+64:msr
ce65b8
+32:cr
ce65b8
+64:lr
ce65b8
+64:ctr
ce65b8
+32:xer
ce65b8
+64:fpscr
ce65b8
+64:orig_r3
ce65b8
+64:trap
ce65b8
+128:vr0
ce65b8
+128:vr1
ce65b8
+128:vr2
ce65b8
+128:vr3
ce65b8
+128:vr4
ce65b8
+128:vr5
ce65b8
+128:vr6
ce65b8
+128:vr7
ce65b8
+128:vr8
ce65b8
+128:vr9
ce65b8
+128:vr10
ce65b8
+128:vr11
ce65b8
+128:vr12
ce65b8
+128:vr13
ce65b8
+128:vr14
ce65b8
+128:vr15
ce65b8
+128:vr16
ce65b8
+128:vr17
ce65b8
+128:vr18
ce65b8
+128:vr19
ce65b8
+128:vr20
ce65b8
+128:vr21
ce65b8
+128:vr22
ce65b8
+128:vr23
ce65b8
+128:vr24
ce65b8
+128:vr25
ce65b8
+128:vr26
ce65b8
+128:vr27
ce65b8
+128:vr28
ce65b8
+128:vr29
ce65b8
+128:vr30
ce65b8
+128:vr31
ce65b8
+32:vscr
ce65b8
+32:vrsave
ce65b8
+64:vs0h
ce65b8
+64:vs1h
ce65b8
+64:vs2h
ce65b8
+64:vs3h
ce65b8
+64:vs4h
ce65b8
+64:vs5h
ce65b8
+64:vs6h
ce65b8
+64:vs7h
ce65b8
+64:vs8h
ce65b8
+64:vs9h
ce65b8
+64:vs10h
ce65b8
+64:vs11h
ce65b8
+64:vs12h
ce65b8
+64:vs13h
ce65b8
+64:vs14h
ce65b8
+64:vs15h
ce65b8
+64:vs16h
ce65b8
+64:vs17h
ce65b8
+64:vs18h
ce65b8
+64:vs19h
ce65b8
+64:vs20h
ce65b8
+64:vs21h
ce65b8
+64:vs22h
ce65b8
+64:vs23h
ce65b8
+64:vs24h
ce65b8
+64:vs25h
ce65b8
+64:vs26h
ce65b8
+64:vs27h
ce65b8
+64:vs28h
ce65b8
+64:vs29h
ce65b8
+64:vs30h
ce65b8
+64:vs31h
ce65b8
+64:ppr
ce65b8
+64:dscr
ce65b8
+64:tar
ce65b8
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
ce65b8
--- a/gdb/rs6000-tdep.c
ce65b8
+++ b/gdb/rs6000-tdep.c
ce65b8
@@ -4699,6 +4699,10 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
ce65b8
 	case 256:		/* VRSAVE */
ce65b8
 	  record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum);
ce65b8
 	  return 0;
ce65b8
+	case 815:		/* TAR */
ce65b8
+	  if (tdep->ppc_tar_regnum >= 0)
ce65b8
+	    record_full_arch_list_add_reg (regcache, tdep->ppc_tar_regnum);
ce65b8
+	  return 0;
ce65b8
 	case 896:
ce65b8
 	case 898:		/* PPR */
ce65b8
 	  if (tdep->ppc_ppr_regnum >= 0)
ce65b8
@@ -5867,6 +5871,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
ce65b8
   enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO;
ce65b8
   int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0;
ce65b8
   int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0;
ce65b8
+  int have_tar = 0;
ce65b8
   int tdesc_wordsize = -1;
ce65b8
   const struct target_desc *tdesc = info.target_desc;
ce65b8
   struct tdesc_arch_data *tdesc_data = NULL;
ce65b8
@@ -6187,6 +6192,25 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
ce65b8
 	}
ce65b8
       else
ce65b8
 	have_dscr = 0;
ce65b8
+
ce65b8
+      /* Target Address Register.  */
ce65b8
+      feature = tdesc_find_feature (tdesc,
ce65b8
+				    "org.gnu.gdb.power.tar");
ce65b8
+      if (feature != NULL)
ce65b8
+	{
ce65b8
+	  valid_p = 1;
ce65b8
+	  valid_p &= tdesc_numbered_register (feature, tdesc_data,
ce65b8
+					      PPC_TAR_REGNUM, "tar");
ce65b8
+
ce65b8
+	  if (!valid_p)
ce65b8
+	    {
ce65b8
+	      tdesc_data_cleanup (tdesc_data);
ce65b8
+	      return NULL;
ce65b8
+	    }
ce65b8
+	  have_tar = 1;
ce65b8
+	}
ce65b8
+      else
ce65b8
+	have_tar = 0;
ce65b8
     }
ce65b8
 
ce65b8
   /* If we have a 64-bit binary on a 32-bit target, complain.  Also
ce65b8
@@ -6383,6 +6407,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
ce65b8
   tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1;
ce65b8
   tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1;
ce65b8
   tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1;
ce65b8
+  tdep->ppc_tar_regnum = have_tar ? PPC_TAR_REGNUM : -1;
ce65b8
 
ce65b8
   set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM);
ce65b8
   set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1);
ce65b8
diff --git a/gdb/testsuite/gdb.arch/powerpc-tar.c b/gdb/testsuite/gdb.arch/powerpc-tar.c
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/testsuite/gdb.arch/powerpc-tar.c
ce65b8
@@ -0,0 +1,33 @@
ce65b8
+/* This testcase is part of GDB, the GNU debugger.
ce65b8
+
ce65b8
+   Copyright (C) 2018 Free Software Foundation, Inc.
ce65b8
+
ce65b8
+   This program is free software; you can redistribute it and/or modify
ce65b8
+   it under the terms of the GNU General Public License as published by
ce65b8
+   the Free Software Foundation; either version 3 of the License, or
ce65b8
+   (at your option) any later version.
ce65b8
+
ce65b8
+   This program is distributed in the hope that it will be useful,
ce65b8
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
ce65b8
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ce65b8
+   GNU General Public License for more details.
ce65b8
+
ce65b8
+   You should have received a copy of the GNU General Public License
ce65b8
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
ce65b8
+
ce65b8
+int main (void)
ce65b8
+{
ce65b8
+  void * target1 = &&target1_l;
ce65b8
+  void * target2 = &&target2_l;
ce65b8
+  asm volatile ("mtspr 815,%0" : : "r" (target1) : );
ce65b8
+
ce65b8
+  /* Branch always to TAR.  */
ce65b8
+  asm volatile ("bctar 20,0,0"); // marker
ce65b8
+
ce65b8
+ target2_l:
ce65b8
+  asm volatile ("nop"); // marker 2
ce65b8
+ target1_l:
ce65b8
+  asm volatile ("nop");
ce65b8
+
ce65b8
+  return 0;
ce65b8
+}
ce65b8
diff --git a/gdb/testsuite/gdb.arch/powerpc-tar.exp b/gdb/testsuite/gdb.arch/powerpc-tar.exp
ce65b8
new file mode 100644
ce65b8
--- /dev/null
ce65b8
+++ b/gdb/testsuite/gdb.arch/powerpc-tar.exp
ce65b8
@@ -0,0 +1,122 @@
ce65b8
+# Copyright (C) 2018 Free Software Foundation, Inc.
ce65b8
+
ce65b8
+# This program is free software; you can redistribute it and/or modify
ce65b8
+# it under the terms of the GNU General Public License as published by
ce65b8
+# the Free Software Foundation; either version 3 of the License, or
ce65b8
+# (at your option) any later version.
ce65b8
+#
ce65b8
+# This program is distributed in the hope that it will be useful,
ce65b8
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
ce65b8
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ce65b8
+# GNU General Public License for more details.
ce65b8
+#
ce65b8
+# You should have received a copy of the GNU General Public License
ce65b8
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
ce65b8
+
ce65b8
+# This file is part of the gdb testsuite.
ce65b8
+
ce65b8
+# Test access to special purpose register TAR (the Target Address
ce65b8
+# Register).  The test inferior writes to this register, we check that
ce65b8
+# GDB reads the same value, then write to the register the address of
ce65b8
+# another label.  We then let the inferior continue and execute a
ce65b8
+# branch to TAR and check that we stop at the address that we wrote to
ce65b8
+# register.
ce65b8
+
ce65b8
+if {![istarget "powerpc*-*-linux*"]} then {
ce65b8
+    verbose "Skipping PowerPC test for the TAR register."
ce65b8
+    return
ce65b8
+}
ce65b8
+
ce65b8
+standard_testfile .c
ce65b8
+
ce65b8
+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} {
ce65b8
+    return -1
ce65b8
+}
ce65b8
+
ce65b8
+proc check_register_access { regname } {
ce65b8
+    global gdb_prompt
ce65b8
+
ce65b8
+    set test "$regname register access"
ce65b8
+    gdb_test_multiple "info reg $regname" "$test" {
ce65b8
+	-re "Invalid register.*\r\n$gdb_prompt $" {
ce65b8
+	    unsupported "$test"
ce65b8
+	    return 0
ce65b8
+	}
ce65b8
+	-re "\r\n$regname.*\r\n$gdb_prompt $" {
ce65b8
+	    pass "$test"
ce65b8
+	    return 1
ce65b8
+	}
ce65b8
+    }
ce65b8
+    return 0
ce65b8
+}
ce65b8
+
ce65b8
+proc tar_available {} {
ce65b8
+    global gdb_prompt
ce65b8
+    global inferior_exited_re
ce65b8
+
ce65b8
+    set test "TAR available to inferior"
ce65b8
+    gdb_test_multiple "continue" "" {
ce65b8
+	-re "Illegal instruction.*\r\n$gdb_prompt $" {
ce65b8
+	    unsupported "$test"
ce65b8
+	    return 0
ce65b8
+	}
ce65b8
+	-re "$inferior_exited_re normally.*$gdb_prompt $" {
ce65b8
+	    pass "$test"
ce65b8
+	    return 1
ce65b8
+	}
ce65b8
+    }
ce65b8
+    return 0
ce65b8
+}
ce65b8
+
ce65b8
+# Do one pass to check if TAR is usable, system
ce65b8
+# software can prevent it from being used.
ce65b8
+with_test_prefix "check TAR access" {
ce65b8
+    clean_restart $binfile
ce65b8
+
ce65b8
+    if ![runto_main] {
ce65b8
+	return
ce65b8
+    }
ce65b8
+
ce65b8
+    if {![check_register_access "tar"]} {
ce65b8
+	return
ce65b8
+    }
ce65b8
+
ce65b8
+    if {![tar_available]} {
ce65b8
+	return
ce65b8
+    }
ce65b8
+}
ce65b8
+
ce65b8
+# Now do the actual test
ce65b8
+clean_restart $binfile
ce65b8
+
ce65b8
+if ![runto_main] {
ce65b8
+    return
ce65b8
+}
ce65b8
+
ce65b8
+gdb_breakpoint [gdb_get_line_number "marker"]
ce65b8
+
ce65b8
+gdb_continue_to_breakpoint "continue to marker"
ce65b8
+
ce65b8
+set target1 [get_hexadecimal_valueof "target1" -1]
ce65b8
+set tar [get_hexadecimal_valueof "\$tar" -2]
ce65b8
+
ce65b8
+set test "TAR value from mtspr"
ce65b8
+
ce65b8
+if {${target1} == ${tar}} {
ce65b8
+    pass $test
ce65b8
+} else {
ce65b8
+    fail $test
ce65b8
+}
ce65b8
+
ce65b8
+set target2 [get_hexadecimal_valueof "target2" -1]
ce65b8
+
ce65b8
+if {$target2 == -1} {
ce65b8
+    fail "Could not get value of target2"
ce65b8
+    return
ce65b8
+}
ce65b8
+
ce65b8
+gdb_test_no_output "set \$tar = $target2" "set tar"
ce65b8
+
ce65b8
+gdb_breakpoint [gdb_get_line_number "marker 2"]
ce65b8
+
ce65b8
+gdb_continue_to_breakpoint "continue to new target address" ".*marker 2.*"