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

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