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

689258
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
689258
From: Keith Seitz <keiths@redhat.com>
689258
Date: Fri, 11 Jan 2019 17:02:16 -0500
689258
Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch
689258
689258
;; [PowerPC] Add support for PPR and DSCR
689258
;; Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581
689258
689258
[PowerPC] Add support for PPR and DSCR
689258
689258
This patch adds gdb support for the Program Priorty Register and the
689258
Data Stream Control Register, for the powerpc linux native and core
689258
file targets, and for the powerpc linux server stub.
689258
689258
gdb/ChangeLog:
689258
2018-10-26  Edjunior Barbosa Machado  <emachado@linux.vnet.ibm.com>
689258
        Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
    * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa205_ppr_dscr_vsx32l)
689258
    (tdesc_powerpc_isa205_ppr_dscr_vsx64l): Declare.
689258
    * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_PPRREGSET)
689258
    (PPC_LINUX_SIZEOF_DSCRREGSET): Define.
689258
    (struct ppc_linux_features) <ppr_dscr>: New field.
689258
    (ppc_linux_no_features): Add initializer for ppr_dscr field.
689258
    * arch/ppc-linux-common.c (ppc_linux_match_description): Return
689258
    new tdescs.
689258
    * nat/ppc-linux.h (PPC_FEATURE2_DSCR, NT_PPC_PPR, NT_PPC_DSCR):
689258
    Define if not already defined.
689258
    * features/Makefile (WHICH): Add
689258
    rs6000/powerpc-isa205-ppr-dscr-vsx32l and
689258
    rs6000/powerpc-isa205-ppr-dscr-vsx64l.
689258
    (XMLTOC): Add rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml and
689258
    rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml.
689258
    * features/rs6000/power-dscr.xml: New file.
689258
    * features/rs6000/power-ppr.xml: New file.
689258
    * features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml: New file.
689258
    * features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml: New file.
689258
    * features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c: Generate.
689258
    * features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c: Generate.
689258
    * regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat: Generate.
689258
    * regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat: Generate.
689258
    * ppc-linux-nat.c: Include <sys/uio.h>.
689258
    (fetch_regset, store_regset, check_regset): New functions.
689258
    (fetch_register, fetch_ppc_registers): Call fetch_regset with
689258
    DSCR and PPR regsets.
689258
    (store_register, store_ppc_registers): Call store_regset with
689258
    DSCR and PPR regsets.
689258
    (ppc_linux_get_hwcap2): New function.
689258
    (ppc_linux_nat_target::read_description): Call
689258
    ppc_linux_get_hwcap2 and check_regset, set ppr_dscr field in the
689258
    features struct if needed.
689258
    * ppc-linux-tdep.c: Include
689258
    features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c and
689258
    features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c.
689258
    (ppc32_regmap_ppr, ppc32_regmap_dscr, ppc32_linux_pprregset)
689258
    (ppc32_linux_dscrregset): New globals.
689258
    (ppc_linux_iterate_over_regset_sections): Call back with the ppr
689258
    and dscr regsets.
689258
    (ppc_linux_core_read_description): Check if the ppr and dscr
689258
    sections are present and set ppr_dscr in the features struct.
689258
    (_initialize_ppc_linux_tdep): Call
689258
    initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l and
689258
    initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l.
689258
    * ppc-linux-tdep.h (ppc32_linux_pprregset)
689258
    (ppc32_linux_dscrregset): Declare.
689258
    * ppc-tdep.h (struct gdbarch_tdep) <ppc_ppr_regnum>: New field.
689258
    <ppc_dscr_regnum>: New field.
689258
    (enum) <PPC_PPR_REGNUM, PPC_DSCR_REGNUM>: New enum values.
689258
    * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate ppr
689258
    and dscr features.
689258
    (ppc_process_record_op31): Record changes to PPR and DSCR.
689258
689258
gdb/gdbserver/ChangeLog:
689258
2018-10-26  Edjunior Barbosa Machado  <emachado@linux.vnet.ibm.com>
689258
        Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
    * configure.srv (ipa_ppc_linux_regobj): Add
689258
    powerpc-isa205-ppr-dscr-vsx32l-ipa.o and
689258
    powerpc-isa205-ppr-dscr-vsx64l-ipa.o.
689258
    (powerpc*-*-linux*): Add powerpc-isa205-ppr-dscr-vsx32l.o and
689258
    powerpc-isa205-ppr-dscr-vsx64l.o to srv_regobj, add
689258
    rs6000/power-dscr.xml, rs6000/power-ppr.xml,
689258
    rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml and
689258
    rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml to srv_xmlfiles.
689258
    * linux-ppc-tdesc-init.h (enum ppc_linux_tdesc)
689258
    <PPC_TDESC_ISA205_PPR_DSCR_VSX>: New enum value.
689258
    (init_registers_powerpc_isa205_ppr_dscr_vsx32l)
689258
    (init_registers_powerpc_isa205_ppr_dscr_vsx64l): Declare.
689258
    * linux-ppc-low.c: Include "elf/common.h" and <sys/uio.h>.
689258
    (ppc_hwcap): Add comment.
689258
    (ppc_hwcap2): New global.
689258
    (ppc_check_regset, ppc_fill_pprregset, ppc_store_pprregset)
689258
    (ppc_fill_dscrregset, ppc_store_dscrregset): New functions.
689258
    (ppc_regsets): Add entries for the DSCR and PPR regsets.
689258
    (ppc_arch_setup): Get AT_HWCAP2.  Set ppr_dscr in features struct
689258
    when needed.  Set sizes for the the DSCR and PPR regsets.
689258
    (ppc_get_ipa_tdesc_idx): Return PPC_TDESC_ISA205_PPR_DSCR_VSX.
689258
    (initialize_low_arch): Call
689258
    init_registers_powerpc_isa205_ppr_dscr_vsx32l and
689258
    init_registers_powerpc_isa205_ppr_dscr_vsx64l.
689258
    * linux-ppc-ipa.c (get_ipa_tdesc): Handle
689258
    PPC_TDESC_ISA205_PPR_DSCR_VSX.
689258
    (initialize_low_tracepoint): Call
689258
    init_registers_powerpc_isa205_ppr_dscr_vsx32l and
689258
    init_registers_powerpc_isa205_ppr_dscr_vsx64l.
689258
689258
gdb/testsuite/ChangeLog:
689258
2018-10-26  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
    * gdb.arch/powerpc-ppr-dscr.c: New file.
689258
    * gdb.arch/powerpc-ppr-dscr.exp: New file.
689258
689258
gdb/doc/ChangeLog:
689258
2018-10-26  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
    * gdb.texinfo (PowerPC Features): Describe new features
689258
    "org.gnu.gdb.power.ppr" and "org.gnu.gdb.power.dscr".
689258
689258
diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c
689258
--- a/gdb/arch/ppc-linux-common.c
689258
+++ b/gdb/arch/ppc-linux-common.c
689258
@@ -53,7 +53,8 @@ ppc_linux_match_description (struct ppc_linux_features features)
689258
       if (features.cell)
689258
 	tdesc = tdesc_powerpc_cell64l;
689258
       else if (features.vsx)
689258
-	tdesc = (features.isa205? tdesc_powerpc_isa205_vsx64l
689258
+	tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l
689258
+		 : features.isa205? tdesc_powerpc_isa205_vsx64l
689258
 		 : tdesc_powerpc_vsx64l);
689258
       else if (features.altivec)
689258
 	tdesc = (features.isa205? tdesc_powerpc_isa205_altivec64l
689258
@@ -69,7 +70,8 @@ ppc_linux_match_description (struct ppc_linux_features features)
689258
       if (features.cell)
689258
 	tdesc = tdesc_powerpc_cell32l;
689258
       else if (features.vsx)
689258
-	tdesc = (features.isa205? tdesc_powerpc_isa205_vsx32l
689258
+	tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l
689258
+		 : features.isa205? tdesc_powerpc_isa205_vsx32l
689258
 		 : tdesc_powerpc_vsx32l);
689258
       else if (features.altivec)
689258
 	tdesc = (features.isa205? tdesc_powerpc_isa205_altivec32l
689258
diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h
689258
--- a/gdb/arch/ppc-linux-common.h
689258
+++ b/gdb/arch/ppc-linux-common.h
689258
@@ -30,6 +30,8 @@ struct target_desc;
689258
 #define PPC_LINUX_SIZEOF_VRREGSET 544
689258
 
689258
 #define PPC_LINUX_SIZEOF_VSXREGSET 256
689258
+#define PPC_LINUX_SIZEOF_PPRREGSET 8
689258
+#define PPC_LINUX_SIZEOF_DSCRREGSET 8
689258
 
689258
 /* Check if the hwcap auxv entry indicates that isa205 is supported.  */
689258
 bool ppc_linux_has_isa205 (CORE_ADDR hwcap);
689258
@@ -41,6 +43,7 @@ struct ppc_linux_features
689258
   bool altivec;
689258
   bool vsx;
689258
   bool isa205;
689258
+  bool ppr_dscr;
689258
   bool cell;
689258
 };
689258
 
689258
@@ -51,6 +54,7 @@ const struct ppc_linux_features ppc_linux_no_features = {
689258
   false,
689258
   false,
689258
   false,
689258
+  false,
689258
 };
689258
 
689258
 /* Return a target description that matches FEATURES.  */
689258
diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h
689258
--- a/gdb/arch/ppc-linux-tdesc.h
689258
+++ b/gdb/arch/ppc-linux-tdesc.h
689258
@@ -29,6 +29,7 @@ extern struct target_desc *tdesc_powerpc_vsx32l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_32l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
689258
+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
689258
 extern struct target_desc *tdesc_powerpc_e500l;
689258
 
689258
 extern struct target_desc *tdesc_powerpc_64l;
689258
@@ -38,5 +39,6 @@ extern struct target_desc *tdesc_powerpc_vsx64l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_64l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
689258
 extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
689258
+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
689258
 
689258
 #endif /* ARCH_PPC_LINUX_TDESC_H */
689258
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
689258
--- a/gdb/doc/gdb.texinfo
689258
+++ b/gdb/doc/gdb.texinfo
689258
@@ -42555,6 +42555,12 @@ contain registers @samp{ev0h} through @samp{ev31h}, @samp{acc}, and
689258
 these to present registers @samp{ev0} through @samp{ev31} to the
689258
 user.
689258
 
689258
+The @samp{org.gnu.gdb.power.ppr} feature is optional.  It should
689258
+contain the 64-bit register @samp{ppr}.
689258
+
689258
+The @samp{org.gnu.gdb.power.dscr} feature is optional.  It should
689258
+contain the 64-bit register @samp{dscr}.
689258
+
689258
 @node S/390 and System z Features
689258
 @subsection S/390 and System z Features
689258
 @cindex target descriptions, S/390 features
689258
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
689258
--- a/gdb/features/Makefile
689258
+++ b/gdb/features/Makefile
689258
@@ -73,6 +73,8 @@ WHICH = aarch64 \
689258
 	rs6000/powerpc-isa205-32l rs6000/powerpc-isa205-64l \
689258
 	rs6000/powerpc-isa205-altivec32l rs6000/powerpc-isa205-altivec64l \
689258
 	rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \
689258
+	rs6000/powerpc-isa205-ppr-dscr-vsx32l \
689258
+	rs6000/powerpc-isa205-ppr-dscr-vsx64l \
689258
 	s390-linux32 s390-linux64 s390x-linux64 \
689258
 	s390-linux32v1 s390-linux64v1 s390x-linux64v1 \
689258
 	s390-linux32v2 s390-linux64v2 s390x-linux64v2 \
689258
@@ -167,6 +169,8 @@ XMLTOC = \
689258
 	rs6000/powerpc-isa205-altivec64l.xml \
689258
 	rs6000/powerpc-isa205-vsx32l.xml \
689258
 	rs6000/powerpc-isa205-vsx64l.xml \
689258
+	rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \
689258
+	rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \
689258
 	rs6000/powerpc-vsx32.xml \
689258
 	rs6000/powerpc-vsx32l.xml \
689258
 	rs6000/powerpc-vsx64.xml \
689258
diff --git a/gdb/features/rs6000/power-dscr.xml b/gdb/features/rs6000/power-dscr.xml
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/power-dscr.xml
689258
@@ -0,0 +1,12 @@
689258
+
689258
+
689258
+
689258
+     Copying and distribution of this file, with or without modification,
689258
+     are permitted in any medium without royalty provided the copyright
689258
+     notice and this notice are preserved.  -->
689258
+
689258
+
689258
+
689258
+<feature name="org.gnu.gdb.power.dscr">
689258
+  <reg name="dscr" bitsize="64" type="uint64"/>
689258
+</feature>
689258
diff --git a/gdb/features/rs6000/power-ppr.xml b/gdb/features/rs6000/power-ppr.xml
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/power-ppr.xml
689258
@@ -0,0 +1,12 @@
689258
+
689258
+
689258
+
689258
+     Copying and distribution of this file, with or without modification,
689258
+     are permitted in any medium without royalty provided the copyright
689258
+     notice and this notice are preserved.  -->
689258
+
689258
+
689258
+
689258
+<feature name="org.gnu.gdb.power.ppr">
689258
+  <reg name="ppr" bitsize="64" type="uint64"/>
689258
+</feature>
689258
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
689258
@@ -0,0 +1,200 @@
689258
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
689258
+  Original: powerpc-isa205-ppr-dscr-vsx32l.xml */
689258
+
689258
+#include "defs.h"
689258
+#include "osabi.h"
689258
+#include "target-descriptions.h"
689258
+
689258
+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
689258
+static void
689258
+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
689258
+{
689258
+  struct target_desc *result = allocate_target_description ();
689258
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
689258
+
689258
+  struct tdesc_feature *feature;
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
689258
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
689258
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
689258
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
689258
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
689258
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
689258
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
689258
+  tdesc_type *element_type;
689258
+  element_type = tdesc_named_type (feature, "ieee_single");
689258
+  tdesc_create_vector (feature, "v4f", element_type, 4);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int32");
689258
+  tdesc_create_vector (feature, "v4i32", element_type, 4);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int16");
689258
+  tdesc_create_vector (feature, "v8i16", element_type, 8);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int8");
689258
+  tdesc_create_vector (feature, "v16i8", element_type, 16);
689258
+
689258
+  tdesc_type_with_fields *type_with_fields;
689258
+  type_with_fields = tdesc_create_union (feature, "vec128");
689258
+  tdesc_type *field_type;
689258
+  field_type = tdesc_named_type (feature, "uint128");
689258
+  tdesc_add_field (type_with_fields, "uint128", field_type);
689258
+  field_type = tdesc_named_type (feature, "v4f");
689258
+  tdesc_add_field (type_with_fields, "v4_float", field_type);
689258
+  field_type = tdesc_named_type (feature, "v4i32");
689258
+  tdesc_add_field (type_with_fields, "v4_int32", field_type);
689258
+  field_type = tdesc_named_type (feature, "v8i16");
689258
+  tdesc_add_field (type_with_fields, "v8_int16", field_type);
689258
+  field_type = tdesc_named_type (feature, "v16i8");
689258
+  tdesc_add_field (type_with_fields, "v16_int8", field_type);
689258
+
689258
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
689258
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
689258
+  tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
689258
+  tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
689258
+  tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
689258
+
689258
+  tdesc_powerpc_isa205_ppr_dscr_vsx32l = result;
689258
+}
689258
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml
689258
@@ -0,0 +1,18 @@
689258
+
689258
+
689258
+
689258
+     Copying and distribution of this file, with or without modification,
689258
+     are permitted in any medium without royalty provided the copyright
689258
+     notice and this notice are preserved.  -->
689258
+
689258
+
689258
+<target>
689258
+  <architecture>powerpc:common</architecture>
689258
+  <xi:include href="power-core.xml"/>
689258
+  <xi:include href="power-fpu-isa205.xml"/>
689258
+  <xi:include href="power-linux.xml"/>
689258
+  <xi:include href="power-altivec.xml"/>
689258
+  <xi:include href="power-vsx.xml"/>
689258
+  <xi:include href="power-ppr.xml"/>
689258
+  <xi:include href="power-dscr.xml"/>
689258
+</target>
689258
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
689258
@@ -0,0 +1,200 @@
689258
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
689258
+  Original: powerpc-isa205-ppr-dscr-vsx64l.xml */
689258
+
689258
+#include "defs.h"
689258
+#include "osabi.h"
689258
+#include "target-descriptions.h"
689258
+
689258
+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
689258
+static void
689258
+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
689258
+{
689258
+  struct target_desc *result = allocate_target_description ();
689258
+  set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
689258
+
689258
+  struct tdesc_feature *feature;
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
689258
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
689258
+  tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
689258
+  tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
689258
+  tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
689258
+  tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
689258
+  tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
689258
+  tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
689258
+  tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
689258
+  tdesc_type *element_type;
689258
+  element_type = tdesc_named_type (feature, "ieee_single");
689258
+  tdesc_create_vector (feature, "v4f", element_type, 4);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int32");
689258
+  tdesc_create_vector (feature, "v4i32", element_type, 4);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int16");
689258
+  tdesc_create_vector (feature, "v8i16", element_type, 8);
689258
+
689258
+  element_type = tdesc_named_type (feature, "int8");
689258
+  tdesc_create_vector (feature, "v16i8", element_type, 16);
689258
+
689258
+  tdesc_type_with_fields *type_with_fields;
689258
+  type_with_fields = tdesc_create_union (feature, "vec128");
689258
+  tdesc_type *field_type;
689258
+  field_type = tdesc_named_type (feature, "uint128");
689258
+  tdesc_add_field (type_with_fields, "uint128", field_type);
689258
+  field_type = tdesc_named_type (feature, "v4f");
689258
+  tdesc_add_field (type_with_fields, "v4_float", field_type);
689258
+  field_type = tdesc_named_type (feature, "v4i32");
689258
+  tdesc_add_field (type_with_fields, "v4_int32", field_type);
689258
+  field_type = tdesc_named_type (feature, "v8i16");
689258
+  tdesc_add_field (type_with_fields, "v8_int16", field_type);
689258
+  field_type = tdesc_named_type (feature, "v16i8");
689258
+  tdesc_add_field (type_with_fields, "v16_int8", field_type);
689258
+
689258
+  tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
689258
+  tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
689258
+  tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
689258
+  tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
689258
+  tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
689258
+  tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
689258
+
689258
+  feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
689258
+  tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
689258
+
689258
+  tdesc_powerpc_isa205_ppr_dscr_vsx64l = result;
689258
+}
689258
diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml
689258
@@ -0,0 +1,18 @@
689258
+
689258
+
689258
+
689258
+     Copying and distribution of this file, with or without modification,
689258
+     are permitted in any medium without royalty provided the copyright
689258
+     notice and this notice are preserved.  -->
689258
+
689258
+
689258
+<target>
689258
+  <architecture>powerpc:common64</architecture>
689258
+  <xi:include href="power64-core.xml"/>
689258
+  <xi:include href="power-fpu-isa205.xml"/>
689258
+  <xi:include href="power64-linux.xml"/>
689258
+  <xi:include href="power-altivec.xml"/>
689258
+  <xi:include href="power-vsx.xml"/>
689258
+  <xi:include href="power-ppr.xml"/>
689258
+  <xi:include href="power-dscr.xml"/>
689258
+</target>
689258
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
689258
--- a/gdb/gdbserver/configure.srv
689258
+++ b/gdb/gdbserver/configure.srv
689258
@@ -32,7 +32,7 @@ else
689258
    srv_amd64_linux_regobj=""
689258
 fi
689258
 
689258
-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-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"
689258
+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"
689258
 
689258
 # Linux object files.  This is so we don't have to repeat
689258
 # these files over and over again.
689258
@@ -217,6 +217,7 @@ case "${target}" in
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-32l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o"
689258
+			srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-e500l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-64l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-altivec64l.o"
689258
@@ -225,6 +226,7 @@ case "${target}" in
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-64l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o"
689258
 			srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o"
689258
+			srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o"
689258
 			srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o"
689258
 			srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o"
689258
 			srv_xmlfiles="rs6000/powerpc-32l.xml"
689258
@@ -234,12 +236,15 @@ case "${target}" in
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-32l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml"
689258
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml"
689258
+			srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml"
689258
+			srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml"
689258
@@ -249,6 +254,7 @@ case "${target}" in
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-64l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml"
689258
+			srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml"
689258
 			srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml"
689258
 			srv_linux_usrregs=yes
689258
diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c
689258
--- a/gdb/gdbserver/linux-ppc-ipa.c
689258
+++ b/gdb/gdbserver/linux-ppc-ipa.c
689258
@@ -191,6 +191,8 @@ get_ipa_tdesc (int idx)
689258
       return tdesc_powerpc_isa205_altivec64l;
689258
     case PPC_TDESC_ISA205_VSX:
689258
       return tdesc_powerpc_isa205_vsx64l;
689258
+    case PPC_TDESC_ISA205_PPR_DSCR_VSX:
689258
+      return tdesc_powerpc_isa205_ppr_dscr_vsx64l;
689258
 #else
689258
     case PPC_TDESC_BASE:
689258
       return tdesc_powerpc_32l;
689258
@@ -206,6 +208,8 @@ get_ipa_tdesc (int idx)
689258
       return tdesc_powerpc_isa205_altivec32l;
689258
     case PPC_TDESC_ISA205_VSX:
689258
       return tdesc_powerpc_isa205_vsx32l;
689258
+    case PPC_TDESC_ISA205_PPR_DSCR_VSX:
689258
+      return tdesc_powerpc_isa205_ppr_dscr_vsx32l;
689258
     case PPC_TDESC_E500:
689258
       return tdesc_powerpc_e500l;
689258
 #endif
689258
@@ -234,6 +238,7 @@ initialize_low_tracepoint (void)
689258
   init_registers_powerpc_isa205_64l ();
689258
   init_registers_powerpc_isa205_altivec64l ();
689258
   init_registers_powerpc_isa205_vsx64l ();
689258
+  init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
689258
 #else
689258
   init_registers_powerpc_32l ();
689258
   init_registers_powerpc_altivec32l ();
689258
@@ -242,6 +247,7 @@ initialize_low_tracepoint (void)
689258
   init_registers_powerpc_isa205_32l ();
689258
   init_registers_powerpc_isa205_altivec32l ();
689258
   init_registers_powerpc_isa205_vsx32l ();
689258
+  init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
689258
   init_registers_powerpc_e500l ();
689258
 #endif
689258
 }
689258
diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c
689258
--- a/gdb/gdbserver/linux-ppc-low.c
689258
+++ b/gdb/gdbserver/linux-ppc-low.c
689258
@@ -20,6 +20,8 @@
689258
 #include "server.h"
689258
 #include "linux-low.h"
689258
 
689258
+#include "elf/common.h"
689258
+#include <sys/uio.h>
689258
 #include <elf.h>
689258
 #include <asm/ptrace.h>
689258
 
689258
@@ -41,8 +43,14 @@
689258
 #define PPC_LI(insn)	(PPC_SEXT (PPC_FIELD (insn, 6, 24), 24) << 2)
689258
 #define PPC_BD(insn)	(PPC_SEXT (PPC_FIELD (insn, 16, 14), 14) << 2)
689258
 
689258
+/* Holds the AT_HWCAP auxv entry.  */
689258
+
689258
 static unsigned long ppc_hwcap;
689258
 
689258
+/* Holds the AT_HWCAP2 auxv entry.  */
689258
+
689258
+static unsigned long ppc_hwcap2;
689258
+
689258
 
689258
 #define ppc_num_regs 73
689258
 
689258
@@ -116,6 +124,24 @@ static int ppc_regmap_e500[] =
689258
  };
689258
 #endif
689258
 
689258
+/* Check whether the kernel provides a register set with number
689258
+   REGSET_ID of size REGSETSIZE for process/thread TID.  */
689258
+
689258
+static int
689258
+ppc_check_regset (int tid, int regset_id, int regsetsize)
689258
+{
689258
+  void *buf = alloca (regsetsize);
689258
+  struct iovec iov;
689258
+
689258
+  iov.iov_base = buf;
689258
+  iov.iov_len = regsetsize;
689258
+
689258
+  if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0
689258
+      || errno == ENODATA)
689258
+    return 1;
689258
+  return 0;
689258
+}
689258
+
689258
 static int
689258
 ppc_cannot_store_register (int regno)
689258
 {
689258
@@ -459,6 +485,46 @@ static void ppc_fill_gregset (struct regcache *regcache, void *buf)
689258
     ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
689258
 }
689258
 
689258
+/* Program Priority Register regset fill function.  */
689258
+
689258
+static void
689258
+ppc_fill_pprregset (struct regcache *regcache, void *buf)
689258
+{
689258
+  char *ppr = (char *) buf;
689258
+
689258
+  collect_register_by_name (regcache, "ppr", ppr);
689258
+}
689258
+
689258
+/* Program Priority Register regset store function.  */
689258
+
689258
+static void
689258
+ppc_store_pprregset (struct regcache *regcache, const void *buf)
689258
+{
689258
+  const char *ppr = (const char *) buf;
689258
+
689258
+  supply_register_by_name (regcache, "ppr", ppr);
689258
+}
689258
+
689258
+/* Data Stream Control Register regset fill function.  */
689258
+
689258
+static void
689258
+ppc_fill_dscrregset (struct regcache *regcache, void *buf)
689258
+{
689258
+  char *dscr = (char *) buf;
689258
+
689258
+  collect_register_by_name (regcache, "dscr", dscr);
689258
+}
689258
+
689258
+/* Data Stream Control Register regset store function.  */
689258
+
689258
+static void
689258
+ppc_store_dscrregset (struct regcache *regcache, const void *buf)
689258
+{
689258
+  const char *dscr = (const char *) buf;
689258
+
689258
+  supply_register_by_name (regcache, "dscr", dscr);
689258
+}
689258
+
689258
 static void
689258
 ppc_fill_vsxregset (struct regcache *regcache, void *buf)
689258
 {
689258
@@ -568,6 +634,10 @@ static struct regset_info ppc_regsets[] = {
689258
      fetch them every time, but still fall back to PTRACE_PEEKUSER for the
689258
      general registers.  Some kernels support these, but not the newer
689258
      PPC_PTRACE_GETREGS.  */
689258
+  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS,
689258
+    ppc_fill_pprregset, ppc_store_pprregset },
689258
+  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DSCR, 0, EXTENDED_REGS,
689258
+    ppc_fill_dscrregset, ppc_store_dscrregset },
689258
   { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, 0, 0, EXTENDED_REGS,
689258
   ppc_fill_vsxregset, ppc_store_vsxregset },
689258
   { PTRACE_GETVRREGS, PTRACE_SETVRREGS, 0, 0, EXTENDED_REGS,
689258
@@ -625,6 +695,7 @@ ppc_arch_setup (void)
689258
   /* The value of current_process ()->tdesc needs to be set for this
689258
      call.  */
689258
   ppc_get_auxv (AT_HWCAP, &ppc_hwcap);
689258
+  ppc_get_auxv (AT_HWCAP2, &ppc_hwcap2);
689258
 
689258
   features.isa205 = ppc_linux_has_isa205 (ppc_hwcap);
689258
 
689258
@@ -634,6 +705,11 @@ ppc_arch_setup (void)
689258
   if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
689258
     features.altivec = true;
689258
 
689258
+  if ((ppc_hwcap2 & PPC_FEATURE2_DSCR)
689258
+      && ppc_check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET)
689258
+      && ppc_check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET))
689258
+    features.ppr_dscr = true;
689258
+
689258
   if (ppc_hwcap & PPC_FEATURE_CELL)
689258
     features.cell = true;
689258
 
689258
@@ -678,6 +754,21 @@ ppc_arch_setup (void)
689258
 	else
689258
 	  regset->size = 0;
689258
 	break;
689258
+      case PTRACE_GETREGSET:
689258
+	switch (regset->nt_type)
689258
+	  {
689258
+	  case NT_PPC_PPR:
689258
+	    regset->size = (features.ppr_dscr ?
689258
+			    PPC_LINUX_SIZEOF_PPRREGSET : 0);
689258
+	    break;
689258
+	  case NT_PPC_DSCR:
689258
+	    regset->size = (features.ppr_dscr ?
689258
+			    PPC_LINUX_SIZEOF_DSCRREGSET : 0);
689258
+	    break;
689258
+	  default:
689258
+	    break;
689258
+	  }
689258
+	break;
689258
       default:
689258
 	break;
689258
       }
689258
@@ -3053,6 +3144,8 @@ ppc_get_ipa_tdesc_idx (void)
689258
     return PPC_TDESC_ISA205_ALTIVEC;
689258
   if (tdesc == tdesc_powerpc_isa205_vsx64l)
689258
     return PPC_TDESC_ISA205_VSX;
689258
+  if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx64l)
689258
+    return PPC_TDESC_ISA205_PPR_DSCR_VSX;
689258
 #endif
689258
 
689258
   if (tdesc == tdesc_powerpc_32l)
689258
@@ -3069,6 +3162,8 @@ ppc_get_ipa_tdesc_idx (void)
689258
     return PPC_TDESC_ISA205_ALTIVEC;
689258
   if (tdesc == tdesc_powerpc_isa205_vsx32l)
689258
     return PPC_TDESC_ISA205_VSX;
689258
+  if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx32l)
689258
+    return PPC_TDESC_ISA205_PPR_DSCR_VSX;
689258
   if (tdesc == tdesc_powerpc_e500l)
689258
     return PPC_TDESC_E500;
689258
 
689258
@@ -3127,6 +3222,7 @@ initialize_low_arch (void)
689258
   init_registers_powerpc_isa205_32l ();
689258
   init_registers_powerpc_isa205_altivec32l ();
689258
   init_registers_powerpc_isa205_vsx32l ();
689258
+  init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
689258
   init_registers_powerpc_e500l ();
689258
 #if __powerpc64__
689258
   init_registers_powerpc_64l ();
689258
@@ -3136,6 +3232,7 @@ initialize_low_arch (void)
689258
   init_registers_powerpc_isa205_64l ();
689258
   init_registers_powerpc_isa205_altivec64l ();
689258
   init_registers_powerpc_isa205_vsx64l ();
689258
+  init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
689258
 #endif
689258
 
689258
   initialize_regsets_info (&ppc_regsets_info);
689258
diff --git a/gdb/gdbserver/linux-ppc-tdesc-init.h b/gdb/gdbserver/linux-ppc-tdesc-init.h
689258
--- a/gdb/gdbserver/linux-ppc-tdesc-init.h
689258
+++ b/gdb/gdbserver/linux-ppc-tdesc-init.h
689258
@@ -29,6 +29,7 @@ enum ppc_linux_tdesc {
689258
   PPC_TDESC_ISA205,
689258
   PPC_TDESC_ISA205_ALTIVEC,
689258
   PPC_TDESC_ISA205_VSX,
689258
+  PPC_TDESC_ISA205_PPR_DSCR_VSX,
689258
   PPC_TDESC_E500,
689258
 };
689258
 
689258
@@ -55,6 +56,9 @@ void init_registers_powerpc_isa205_altivec32l (void);
689258
 /* Defined in auto-generated file powerpc-isa205-vsx32l.c.  */
689258
 void init_registers_powerpc_isa205_vsx32l (void);
689258
 
689258
+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx32l.c.  */
689258
+void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void);
689258
+
689258
 /* Defined in auto-generated file powerpc-e500l.c.  */
689258
 void init_registers_powerpc_e500l (void);
689258
 
689258
@@ -83,4 +87,7 @@ void init_registers_powerpc_isa205_altivec64l (void);
689258
 /* Defined in auto-generated file powerpc-isa205-vsx64l.c.  */
689258
 void init_registers_powerpc_isa205_vsx64l (void);
689258
 
689258
+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx64l.c.  */
689258
+void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void);
689258
+
689258
 #endif
689258
diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h
689258
--- a/gdb/nat/ppc-linux.h
689258
+++ b/gdb/nat/ppc-linux.h
689258
@@ -51,6 +51,9 @@
689258
 #ifndef PPC_FEATURE_HAS_SPE
689258
 #define PPC_FEATURE_HAS_SPE 0x00800000
689258
 #endif
689258
+#ifndef PPC_FEATURE2_DSCR
689258
+#define PPC_FEATURE2_DSCR 0x20000000
689258
+#endif
689258
 
689258
 /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
689258
    configure time check.  Some older glibc's (for instance 2.2.1)
689258
@@ -82,6 +85,16 @@
689258
 #define PTRACE_SETEVRREGS 21
689258
 #endif
689258
 
689258
+/* Program Priority Register.  */
689258
+#ifndef NT_PPC_PPR
689258
+#define NT_PPC_PPR 0x104
689258
+#endif
689258
+
689258
+/* Data Stream Control Register.  */
689258
+#ifndef NT_PPC_DSCR
689258
+#define NT_PPC_DSCR 0x105
689258
+#endif
689258
+
689258
 /* Return the wordsize of the target, either 4 or 8 bytes.  */
689258
 int ppc_linux_target_wordsize (int tid);
689258
 
689258
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
689258
--- a/gdb/ppc-linux-nat.c
689258
+++ b/gdb/ppc-linux-nat.c
689258
@@ -31,6 +31,7 @@
689258
 #include <signal.h>
689258
 #include <sys/user.h>
689258
 #include <sys/ioctl.h>
689258
+#include <sys/uio.h>
689258
 #include "gdb_wait.h"
689258
 #include <fcntl.h>
689258
 #include <sys/procfs.h>
689258
@@ -528,6 +529,78 @@ fetch_spe_register (struct regcache *regcache, int tid, int regno)
689258
     regcache->raw_supply (tdep->ppc_spefscr_regnum, &evrregs.spefscr);
689258
 }
689258
 
689258
+/* Use ptrace to fetch all registers from the register set with note
689258
+   type REGSET_ID, size REGSIZE, and layout described by REGSET, from
689258
+   process/thread TID and supply their values to REGCACHE.  If ptrace
689258
+   returns ENODATA to indicate the regset is unavailable, mark the
689258
+   registers as unavailable in REGCACHE.  */
689258
+
689258
+static void
689258
+fetch_regset (struct regcache *regcache, int tid,
689258
+	      int regset_id, int regsetsize, const struct regset *regset)
689258
+{
689258
+  void *buf = alloca (regsetsize);
689258
+  struct iovec iov;
689258
+
689258
+  iov.iov_base = buf;
689258
+  iov.iov_len = regsetsize;
689258
+
689258
+  if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0)
689258
+    {
689258
+      if (errno == ENODATA)
689258
+	regset->supply_regset (regset, regcache, -1, NULL, regsetsize);
689258
+      else
689258
+	perror_with_name (_("Couldn't get register set"));
689258
+    }
689258
+  else
689258
+    regset->supply_regset (regset, regcache, -1, buf, regsetsize);
689258
+}
689258
+
689258
+/* Use ptrace to store register REGNUM of the regset with note type
689258
+   REGSET_ID, size REGSETSIZE, and layout described by REGSET, from
689258
+   REGCACHE back to process/thread TID.  If REGNUM is -1 all registers
689258
+   in the set are collected and stored.  */
689258
+
689258
+static void
689258
+store_regset (const struct regcache *regcache, int tid, int regnum,
689258
+	      int regset_id, int regsetsize, const struct regset *regset)
689258
+{
689258
+  void *buf = alloca (regsetsize);
689258
+  struct iovec iov;
689258
+
689258
+  iov.iov_base = buf;
689258
+  iov.iov_len = regsetsize;
689258
+
689258
+  /* Make sure that the buffer that will be stored has up to date values
689258
+     for the registers that won't be collected.  */
689258
+  if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0)
689258
+    perror_with_name (_("Couldn't get register set"));
689258
+
689258
+  regset->collect_regset (regset, regcache, regnum, buf, regsetsize);
689258
+
689258
+  if (ptrace (PTRACE_SETREGSET, tid, regset_id, &iov) < 0)
689258
+    perror_with_name (_("Couldn't set register set"));
689258
+}
689258
+
689258
+/* Check whether the kernel provides a register set with number
689258
+   REGSET_ID of size REGSETSIZE for process/thread TID.  */
689258
+
689258
+static bool
689258
+check_regset (int tid, int regset_id, int regsetsize)
689258
+{
689258
+  void *buf = alloca (regsetsize);
689258
+  struct iovec iov;
689258
+
689258
+  iov.iov_base = buf;
689258
+  iov.iov_len = regsetsize;
689258
+
689258
+  if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0
689258
+      || errno == ENODATA)
689258
+    return true;
689258
+  else
689258
+    return false;
689258
+}
689258
+
689258
 static void
689258
 fetch_register (struct regcache *regcache, int tid, int regno)
689258
 {
689258
@@ -567,6 +640,24 @@ fetch_register (struct regcache *regcache, int tid, int regno)
689258
       fetch_spe_register (regcache, tid, regno);
689258
       return;
689258
     }
689258
+  else if (regno == PPC_DSCR_REGNUM)
689258
+    {
689258
+      gdb_assert (tdep->ppc_dscr_regnum != -1);
689258
+
689258
+      fetch_regset (regcache, tid, NT_PPC_DSCR,
689258
+		    PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+		    &ppc32_linux_dscrregset);
689258
+      return;
689258
+    }
689258
+  else if (regno == PPC_PPR_REGNUM)
689258
+    {
689258
+      gdb_assert (tdep->ppc_ppr_regnum != -1);
689258
+
689258
+      fetch_regset (regcache, tid, NT_PPC_PPR,
689258
+		    PPC_LINUX_SIZEOF_PPRREGSET,
689258
+		    &ppc32_linux_pprregset);
689258
+      return;
689258
+    }
689258
 
689258
   if (regaddr == -1)
689258
     {
689258
@@ -763,6 +854,14 @@ fetch_ppc_registers (struct regcache *regcache, int tid)
689258
       fetch_vsx_registers (regcache, tid, -1);
689258
   if (tdep->ppc_ev0_upper_regnum >= 0)
689258
     fetch_spe_register (regcache, tid, -1);
689258
+  if (tdep->ppc_ppr_regnum != -1)
689258
+    fetch_regset (regcache, tid, NT_PPC_PPR,
689258
+		  PPC_LINUX_SIZEOF_PPRREGSET,
689258
+		  &ppc32_linux_pprregset);
689258
+  if (tdep->ppc_dscr_regnum != -1)
689258
+    fetch_regset (regcache, tid, NT_PPC_DSCR,
689258
+		  PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+		  &ppc32_linux_dscrregset);
689258
 }
689258
 
689258
 /* Fetch registers from the child process.  Fetch all registers if
689258
@@ -943,6 +1042,24 @@ store_register (const struct regcache *regcache, int tid, int regno)
689258
       store_spe_register (regcache, tid, regno);
689258
       return;
689258
     }
689258
+  else if (regno == PPC_DSCR_REGNUM)
689258
+    {
689258
+      gdb_assert (tdep->ppc_dscr_regnum != -1);
689258
+
689258
+      store_regset (regcache, tid, regno, NT_PPC_DSCR,
689258
+		    PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+		    &ppc32_linux_dscrregset);
689258
+      return;
689258
+    }
689258
+  else if (regno == PPC_PPR_REGNUM)
689258
+    {
689258
+      gdb_assert (tdep->ppc_ppr_regnum != -1);
689258
+
689258
+      store_regset (regcache, tid, regno, NT_PPC_PPR,
689258
+		    PPC_LINUX_SIZEOF_PPRREGSET,
689258
+		    &ppc32_linux_pprregset);
689258
+      return;
689258
+    }
689258
 
689258
   if (regaddr == -1)
689258
     return;
689258
@@ -1157,6 +1274,14 @@ store_ppc_registers (const struct regcache *regcache, int tid)
689258
       store_vsx_registers (regcache, tid, -1);
689258
   if (tdep->ppc_ev0_upper_regnum >= 0)
689258
     store_spe_register (regcache, tid, -1);
689258
+  if (tdep->ppc_ppr_regnum != -1)
689258
+    store_regset (regcache, tid, -1, NT_PPC_PPR,
689258
+		  PPC_LINUX_SIZEOF_PPRREGSET,
689258
+		  &ppc32_linux_pprregset);
689258
+  if (tdep->ppc_dscr_regnum != -1)
689258
+    store_regset (regcache, tid, -1, NT_PPC_DSCR,
689258
+		  PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+		  &ppc32_linux_dscrregset);
689258
 }
689258
 
689258
 /* Fetch the AT_HWCAP entry from the aux vector.  */
689258
@@ -1171,6 +1296,19 @@ ppc_linux_get_hwcap (void)
689258
   return field;
689258
 }
689258
 
689258
+/* Fetch the AT_HWCAP2 entry from the aux vector.  */
689258
+
689258
+static CORE_ADDR
689258
+ppc_linux_get_hwcap2 (void)
689258
+{
689258
+  CORE_ADDR field;
689258
+
689258
+  if (target_auxv_search (current_top_target (), AT_HWCAP2, &field) != 1)
689258
+    return 0;
689258
+
689258
+  return field;
689258
+}
689258
+
689258
 /* The cached DABR value, to install in new threads.
689258
    This variable is used when the PowerPC HWDEBUG ptrace
689258
    interface is not available.  */
689258
@@ -2233,6 +2371,7 @@ ppc_linux_nat_target::read_description ()
689258
   features.wordsize = ppc_linux_target_wordsize (tid);
689258
 
689258
   CORE_ADDR hwcap = ppc_linux_get_hwcap ();
689258
+  CORE_ADDR hwcap2 = ppc_linux_get_hwcap2 ();
689258
 
689258
   if (have_ptrace_getsetvsxregs
689258
       && (hwcap & PPC_FEATURE_HAS_VSX))
689258
@@ -2267,6 +2406,11 @@ ppc_linux_nat_target::read_description ()
689258
 
689258
   features.isa205 = ppc_linux_has_isa205 (hwcap);
689258
 
689258
+  if ((hwcap2 & PPC_FEATURE2_DSCR)
689258
+      && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
689258
+      && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
689258
+    features.ppr_dscr = true;
689258
+
689258
   return ppc_linux_match_description (features);
689258
 }
689258
 
689258
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
689258
--- a/gdb/ppc-linux-tdep.c
689258
+++ b/gdb/ppc-linux-tdep.c
689258
@@ -71,6 +71,7 @@
689258
 #include "features/rs6000/powerpc-isa205-32l.c"
689258
 #include "features/rs6000/powerpc-isa205-altivec32l.c"
689258
 #include "features/rs6000/powerpc-isa205-vsx32l.c"
689258
+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c"
689258
 #include "features/rs6000/powerpc-64l.c"
689258
 #include "features/rs6000/powerpc-altivec64l.c"
689258
 #include "features/rs6000/powerpc-cell64l.c"
689258
@@ -78,6 +79,7 @@
689258
 #include "features/rs6000/powerpc-isa205-64l.c"
689258
 #include "features/rs6000/powerpc-isa205-altivec64l.c"
689258
 #include "features/rs6000/powerpc-isa205-vsx64l.c"
689258
+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c"
689258
 #include "features/rs6000/powerpc-e500l.c"
689258
 
689258
 /* Shared library operations for PowerPC-Linux.  */
689258
@@ -547,6 +549,38 @@ static const struct regset ppc32_linux_vsxregset = {
689258
   regcache_collect_regset
689258
 };
689258
 
689258
+/* Program Priorty Register regmap.  */
689258
+
689258
+static const struct regcache_map_entry ppc32_regmap_ppr[] =
689258
+  {
689258
+      { 1, PPC_PPR_REGNUM, 8 },
689258
+      { 0 }
689258
+  };
689258
+
689258
+/* Program Priorty Register regset.  */
689258
+
689258
+const struct regset ppc32_linux_pprregset = {
689258
+  ppc32_regmap_ppr,
689258
+  regcache_supply_regset,
689258
+  regcache_collect_regset
689258
+};
689258
+
689258
+/* Data Stream Control Register regmap.  */
689258
+
689258
+static const struct regcache_map_entry ppc32_regmap_dscr[] =
689258
+  {
689258
+      { 1, PPC_DSCR_REGNUM, 8 },
689258
+      { 0 }
689258
+  };
689258
+
689258
+/* Data Stream Control Register regset.  */
689258
+
689258
+const struct regset ppc32_linux_dscrregset = {
689258
+  ppc32_regmap_dscr,
689258
+  regcache_supply_regset,
689258
+  regcache_collect_regset
689258
+};
689258
+
689258
 const struct regset *
689258
 ppc_linux_gregset (int wordsize)
689258
 {
689258
@@ -585,6 +619,8 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
689258
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
689258
   int have_altivec = tdep->ppc_vr0_regnum != -1;
689258
   int have_vsx = tdep->ppc_vsr0_upper_regnum != -1;
689258
+  int have_ppr = tdep->ppc_ppr_regnum != -1;
689258
+  int have_dscr = tdep->ppc_dscr_regnum != -1;
689258
 
689258
   if (tdep->wordsize == 4)
689258
     cb (".reg", 48 * 4, 48 * 4, &ppc32_linux_gregset, NULL, cb_data);
689258
@@ -603,6 +639,17 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
689258
   if (have_vsx)
689258
     cb (".reg-ppc-vsx", PPC_LINUX_SIZEOF_VSXREGSET, PPC_LINUX_SIZEOF_VSXREGSET,
689258
 	&ppc32_linux_vsxregset, "POWER7 VSX", cb_data);
689258
+
689258
+  if (have_ppr)
689258
+    cb (".reg-ppc-ppr", PPC_LINUX_SIZEOF_PPRREGSET,
689258
+	PPC_LINUX_SIZEOF_PPRREGSET,
689258
+	&ppc32_linux_pprregset, "Priority Program Register", cb_data);
689258
+
689258
+  if (have_dscr)
689258
+    cb (".reg-ppc-dscr", PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+	PPC_LINUX_SIZEOF_DSCRREGSET,
689258
+	&ppc32_linux_dscrregset, "Data Stream Control Register",
689258
+	cb_data);
689258
 }
689258
 
689258
 static void
689258
@@ -1015,6 +1062,8 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
689258
   asection *altivec = bfd_get_section_by_name (abfd, ".reg-ppc-vmx");
689258
   asection *vsx = bfd_get_section_by_name (abfd, ".reg-ppc-vsx");
689258
   asection *section = bfd_get_section_by_name (abfd, ".reg");
689258
+  asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr");
689258
+  asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr");
689258
 
689258
   if (! section)
689258
     return NULL;
689258
@@ -1047,6 +1096,9 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
689258
 
689258
   features.isa205 = ppc_linux_has_isa205 (hwcap);
689258
 
689258
+  if (ppr && dscr)
689258
+    features.ppr_dscr = true;
689258
+
689258
   return ppc_linux_match_description (features);
689258
 }
689258
 
689258
@@ -1920,6 +1972,7 @@ _initialize_ppc_linux_tdep (void)
689258
   initialize_tdesc_powerpc_isa205_32l ();
689258
   initialize_tdesc_powerpc_isa205_altivec32l ();
689258
   initialize_tdesc_powerpc_isa205_vsx32l ();
689258
+  initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l ();
689258
   initialize_tdesc_powerpc_64l ();
689258
   initialize_tdesc_powerpc_altivec64l ();
689258
   initialize_tdesc_powerpc_cell64l ();
689258
@@ -1927,5 +1980,6 @@ _initialize_ppc_linux_tdep (void)
689258
   initialize_tdesc_powerpc_isa205_64l ();
689258
   initialize_tdesc_powerpc_isa205_altivec64l ();
689258
   initialize_tdesc_powerpc_isa205_vsx64l ();
689258
+  initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l ();
689258
   initialize_tdesc_powerpc_e500l ();
689258
 }
689258
diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h
689258
--- a/gdb/ppc-linux-tdep.h
689258
+++ b/gdb/ppc-linux-tdep.h
689258
@@ -44,4 +44,8 @@ enum {
689258
 /* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable.  */
689258
 int ppc_linux_trap_reg_p (struct gdbarch *gdbarch);
689258
 
689258
+/* Additional register sets, defined in ppc-linux-tdep.c.  */
689258
+extern const struct regset ppc32_linux_pprregset;
689258
+extern const struct regset ppc32_linux_dscrregset;
689258
+
689258
 #endif /* PPC_LINUX_TDEP_H */
689258
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
689258
--- a/gdb/ppc-tdep.h
689258
+++ b/gdb/ppc-tdep.h
689258
@@ -253,6 +253,12 @@ struct gdbarch_tdep
689258
     int ppc_acc_regnum;         /* SPE 'acc' register.  */
689258
     int ppc_spefscr_regnum;     /* SPE 'spefscr' register.  */
689258
 
689258
+    /* Program Priority Register.  */
689258
+    int ppc_ppr_regnum;
689258
+
689258
+    /* Data Stream Control Register.  */
689258
+    int ppc_dscr_regnum;
689258
+
689258
     /* Decimal 128 registers.  */
689258
     int ppc_dl0_regnum;		/* First Decimal128 argument register pair.  */
689258
 
689258
@@ -309,6 +315,8 @@ enum {
689258
   PPC_VRSAVE_REGNUM = 139,
689258
   PPC_VSR0_UPPER_REGNUM = 140,
689258
   PPC_VSR31_UPPER_REGNUM = 171,
689258
+  PPC_PPR_REGNUM = 172,
689258
+  PPC_DSCR_REGNUM = 173,
689258
   PPC_NUM_REGS
689258
 };
689258
 
689258
diff --git a/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat
689258
@@ -0,0 +1,146 @@
689258
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
689258
+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml
689258
+name:powerpc_isa205_ppr_dscr_vsx32l
689258
+xmltarget:powerpc-isa205-ppr-dscr-vsx32l.xml
689258
+expedite:r1,pc
689258
+32:r0
689258
+32:r1
689258
+32:r2
689258
+32:r3
689258
+32:r4
689258
+32:r5
689258
+32:r6
689258
+32:r7
689258
+32:r8
689258
+32:r9
689258
+32:r10
689258
+32:r11
689258
+32:r12
689258
+32:r13
689258
+32:r14
689258
+32:r15
689258
+32:r16
689258
+32:r17
689258
+32:r18
689258
+32:r19
689258
+32:r20
689258
+32:r21
689258
+32:r22
689258
+32:r23
689258
+32:r24
689258
+32:r25
689258
+32:r26
689258
+32:r27
689258
+32:r28
689258
+32:r29
689258
+32:r30
689258
+32:r31
689258
+64:f0
689258
+64:f1
689258
+64:f2
689258
+64:f3
689258
+64:f4
689258
+64:f5
689258
+64:f6
689258
+64:f7
689258
+64:f8
689258
+64:f9
689258
+64:f10
689258
+64:f11
689258
+64:f12
689258
+64:f13
689258
+64:f14
689258
+64:f15
689258
+64:f16
689258
+64:f17
689258
+64:f18
689258
+64:f19
689258
+64:f20
689258
+64:f21
689258
+64:f22
689258
+64:f23
689258
+64:f24
689258
+64:f25
689258
+64:f26
689258
+64:f27
689258
+64:f28
689258
+64:f29
689258
+64:f30
689258
+64:f31
689258
+32:pc
689258
+32:msr
689258
+32:cr
689258
+32:lr
689258
+32:ctr
689258
+32:xer
689258
+64:fpscr
689258
+32:orig_r3
689258
+32:trap
689258
+128:vr0
689258
+128:vr1
689258
+128:vr2
689258
+128:vr3
689258
+128:vr4
689258
+128:vr5
689258
+128:vr6
689258
+128:vr7
689258
+128:vr8
689258
+128:vr9
689258
+128:vr10
689258
+128:vr11
689258
+128:vr12
689258
+128:vr13
689258
+128:vr14
689258
+128:vr15
689258
+128:vr16
689258
+128:vr17
689258
+128:vr18
689258
+128:vr19
689258
+128:vr20
689258
+128:vr21
689258
+128:vr22
689258
+128:vr23
689258
+128:vr24
689258
+128:vr25
689258
+128:vr26
689258
+128:vr27
689258
+128:vr28
689258
+128:vr29
689258
+128:vr30
689258
+128:vr31
689258
+32:vscr
689258
+32:vrsave
689258
+64:vs0h
689258
+64:vs1h
689258
+64:vs2h
689258
+64:vs3h
689258
+64:vs4h
689258
+64:vs5h
689258
+64:vs6h
689258
+64:vs7h
689258
+64:vs8h
689258
+64:vs9h
689258
+64:vs10h
689258
+64:vs11h
689258
+64:vs12h
689258
+64:vs13h
689258
+64:vs14h
689258
+64:vs15h
689258
+64:vs16h
689258
+64:vs17h
689258
+64:vs18h
689258
+64:vs19h
689258
+64:vs20h
689258
+64:vs21h
689258
+64:vs22h
689258
+64:vs23h
689258
+64:vs24h
689258
+64:vs25h
689258
+64:vs26h
689258
+64:vs27h
689258
+64:vs28h
689258
+64:vs29h
689258
+64:vs30h
689258
+64:vs31h
689258
+64:ppr
689258
+64:dscr
689258
diff --git a/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat
689258
@@ -0,0 +1,146 @@
689258
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
689258
+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml
689258
+name:powerpc_isa205_ppr_dscr_vsx64l
689258
+xmltarget:powerpc-isa205-ppr-dscr-vsx64l.xml
689258
+expedite:r1,pc
689258
+64:r0
689258
+64:r1
689258
+64:r2
689258
+64:r3
689258
+64:r4
689258
+64:r5
689258
+64:r6
689258
+64:r7
689258
+64:r8
689258
+64:r9
689258
+64:r10
689258
+64:r11
689258
+64:r12
689258
+64:r13
689258
+64:r14
689258
+64:r15
689258
+64:r16
689258
+64:r17
689258
+64:r18
689258
+64:r19
689258
+64:r20
689258
+64:r21
689258
+64:r22
689258
+64:r23
689258
+64:r24
689258
+64:r25
689258
+64:r26
689258
+64:r27
689258
+64:r28
689258
+64:r29
689258
+64:r30
689258
+64:r31
689258
+64:f0
689258
+64:f1
689258
+64:f2
689258
+64:f3
689258
+64:f4
689258
+64:f5
689258
+64:f6
689258
+64:f7
689258
+64:f8
689258
+64:f9
689258
+64:f10
689258
+64:f11
689258
+64:f12
689258
+64:f13
689258
+64:f14
689258
+64:f15
689258
+64:f16
689258
+64:f17
689258
+64:f18
689258
+64:f19
689258
+64:f20
689258
+64:f21
689258
+64:f22
689258
+64:f23
689258
+64:f24
689258
+64:f25
689258
+64:f26
689258
+64:f27
689258
+64:f28
689258
+64:f29
689258
+64:f30
689258
+64:f31
689258
+64:pc
689258
+64:msr
689258
+32:cr
689258
+64:lr
689258
+64:ctr
689258
+32:xer
689258
+64:fpscr
689258
+64:orig_r3
689258
+64:trap
689258
+128:vr0
689258
+128:vr1
689258
+128:vr2
689258
+128:vr3
689258
+128:vr4
689258
+128:vr5
689258
+128:vr6
689258
+128:vr7
689258
+128:vr8
689258
+128:vr9
689258
+128:vr10
689258
+128:vr11
689258
+128:vr12
689258
+128:vr13
689258
+128:vr14
689258
+128:vr15
689258
+128:vr16
689258
+128:vr17
689258
+128:vr18
689258
+128:vr19
689258
+128:vr20
689258
+128:vr21
689258
+128:vr22
689258
+128:vr23
689258
+128:vr24
689258
+128:vr25
689258
+128:vr26
689258
+128:vr27
689258
+128:vr28
689258
+128:vr29
689258
+128:vr30
689258
+128:vr31
689258
+32:vscr
689258
+32:vrsave
689258
+64:vs0h
689258
+64:vs1h
689258
+64:vs2h
689258
+64:vs3h
689258
+64:vs4h
689258
+64:vs5h
689258
+64:vs6h
689258
+64:vs7h
689258
+64:vs8h
689258
+64:vs9h
689258
+64:vs10h
689258
+64:vs11h
689258
+64:vs12h
689258
+64:vs13h
689258
+64:vs14h
689258
+64:vs15h
689258
+64:vs16h
689258
+64:vs17h
689258
+64:vs18h
689258
+64:vs19h
689258
+64:vs20h
689258
+64:vs21h
689258
+64:vs22h
689258
+64:vs23h
689258
+64:vs24h
689258
+64:vs25h
689258
+64:vs26h
689258
+64:vs27h
689258
+64:vs28h
689258
+64:vs29h
689258
+64:vs30h
689258
+64:vs31h
689258
+64:ppr
689258
+64:dscr
689258
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
689258
--- a/gdb/rs6000-tdep.c
689258
+++ b/gdb/rs6000-tdep.c
689258
@@ -4466,6 +4466,17 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
689258
     case 570:		/* Count Trailing Zeros Doubleword */
689258
     case 890:		/* Extend-Sign Word and Shift Left Immediate (445) */
689258
     case 890 | 1:	/* Extend-Sign Word and Shift Left Immediate (445) */
689258
+
689258
+      if (ext == 444 && tdep->ppc_ppr_regnum >= 0
689258
+	  && (PPC_RS (insn) == PPC_RA (insn))
689258
+	  && (PPC_RA (insn) == PPC_RB (insn))
689258
+	  && !PPC_RC (insn))
689258
+	{
689258
+	  /* or Rx,Rx,Rx alters PRI in PPR.  */
689258
+	  record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum);
689258
+	  return 0;
689258
+	}
689258
+
689258
       if (PPC_RC (insn))
689258
 	record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
689258
       record_full_arch_list_add_reg (regcache,
689258
@@ -4675,6 +4686,10 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
689258
 	case 1:			/* XER */
689258
 	  record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
689258
 	  return 0;
689258
+	case 3:			/* DSCR */
689258
+	  if (tdep->ppc_dscr_regnum >= 0)
689258
+	    record_full_arch_list_add_reg (regcache, tdep->ppc_dscr_regnum);
689258
+	  return 0;
689258
 	case 8:			/* LR */
689258
 	  record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum);
689258
 	  return 0;
689258
@@ -4684,6 +4699,11 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache,
689258
 	case 256:		/* VRSAVE */
689258
 	  record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum);
689258
 	  return 0;
689258
+	case 896:
689258
+	case 898:		/* PPR */
689258
+	  if (tdep->ppc_ppr_regnum >= 0)
689258
+	    record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum);
689258
+	  return 0;
689258
 	}
689258
 
689258
       goto UNKNOWN_OP;
689258
@@ -5846,7 +5866,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
689258
   enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global;
689258
   enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO;
689258
   int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0;
689258
-  int have_dfp = 0, have_vsx = 0;
689258
+  int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0;
689258
   int tdesc_wordsize = -1;
689258
   const struct target_desc *tdesc = info.target_desc;
689258
   struct tdesc_arch_data *tdesc_data = NULL;
689258
@@ -6129,6 +6149,44 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
689258
 	}
689258
       else
689258
 	have_spe = 0;
689258
+
689258
+      /* Program Priority Register.  */
689258
+      feature = tdesc_find_feature (tdesc,
689258
+				    "org.gnu.gdb.power.ppr");
689258
+      if (feature != NULL)
689258
+	{
689258
+	  valid_p = 1;
689258
+	  valid_p &= tdesc_numbered_register (feature, tdesc_data,
689258
+					      PPC_PPR_REGNUM, "ppr");
689258
+
689258
+	  if (!valid_p)
689258
+	    {
689258
+	      tdesc_data_cleanup (tdesc_data);
689258
+	      return NULL;
689258
+	    }
689258
+	  have_ppr = 1;
689258
+	}
689258
+      else
689258
+	have_ppr = 0;
689258
+
689258
+      /* Data Stream Control Register.  */
689258
+      feature = tdesc_find_feature (tdesc,
689258
+				    "org.gnu.gdb.power.dscr");
689258
+      if (feature != NULL)
689258
+	{
689258
+	  valid_p = 1;
689258
+	  valid_p &= tdesc_numbered_register (feature, tdesc_data,
689258
+					      PPC_DSCR_REGNUM, "dscr");
689258
+
689258
+	  if (!valid_p)
689258
+	    {
689258
+	      tdesc_data_cleanup (tdesc_data);
689258
+	      return NULL;
689258
+	    }
689258
+	  have_dscr = 1;
689258
+	}
689258
+      else
689258
+	have_dscr = 0;
689258
     }
689258
 
689258
   /* If we have a 64-bit binary on a 32-bit target, complain.  Also
689258
@@ -6323,6 +6381,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
689258
   tdep->ppc_ev0_upper_regnum = have_spe ? PPC_SPE_UPPER_GP0_REGNUM : -1;
689258
   tdep->ppc_acc_regnum = have_spe ? PPC_SPE_ACC_REGNUM : -1;
689258
   tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1;
689258
+  tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1;
689258
+  tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1;
689258
 
689258
   set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM);
689258
   set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1);
689258
diff --git a/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c
689258
@@ -0,0 +1,34 @@
689258
+/* This testcase is part of GDB, the GNU debugger.
689258
+
689258
+   Copyright (C) 2018 Free Software Foundation, Inc.
689258
+
689258
+   This program is free software; you can redistribute it and/or modify
689258
+   it under the terms of the GNU General Public License as published by
689258
+   the Free Software Foundation; either version 3 of the License, or
689258
+   (at your option) any later version.
689258
+
689258
+   This program is distributed in the hope that it will be useful,
689258
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
689258
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
689258
+   GNU General Public License for more details.
689258
+
689258
+   You should have received a copy of the GNU General Public License
689258
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
689258
+
689258
+int main (void)
689258
+{
689258
+  /* Set Load Stream Disable bit in DSCR.  */
689258
+  unsigned long dscr = 0x20;
689258
+
689258
+  /* This is the non-privileged SPR number to access DSCR,
689258
+     available since isa 207.  */
689258
+  asm volatile ("mtspr 3,%0" : : "r" (dscr));
689258
+
689258
+  /* Set PPR to low priority (010 in bits 11:13, or
689258
+     0x0008000000000000).  */
689258
+  asm volatile ("or 1,1,1");
689258
+  asm volatile ("nop"); // marker
689258
+  asm volatile ("nop");
689258
+
689258
+  return 0;
689258
+}
689258
diff --git a/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp
689258
new file mode 100644
689258
--- /dev/null
689258
+++ b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp
689258
@@ -0,0 +1,120 @@
689258
+# Copyright (C) 2018 Free Software Foundation, Inc.
689258
+
689258
+# This program is free software; you can redistribute it and/or modify
689258
+# it under the terms of the GNU General Public License as published by
689258
+# the Free Software Foundation; either version 3 of the License, or
689258
+# (at your option) any later version.
689258
+#
689258
+# This program is distributed in the hope that it will be useful,
689258
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
689258
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
689258
+# GNU General Public License for more details.
689258
+#
689258
+# You should have received a copy of the GNU General Public License
689258
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
689258
+
689258
+# This file is part of the gdb testsuite.
689258
+
689258
+# Test access to special purpose registers PPR and DSCR.  The test
689258
+# inferior writes to these registers, we check that GDB reads the same
689258
+# values, then write to the registers trough GDB, step once, and check
689258
+# again if we read back the same values.
689258
+
689258
+if {![istarget "powerpc*-*-linux*"]} then {
689258
+    verbose "Skipping PowerPC test for PPR and DSCR registers."
689258
+    return
689258
+}
689258
+
689258
+standard_testfile .c
689258
+
689258
+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} {
689258
+    return
689258
+}
689258
+
689258
+proc check_register_access { regname } {
689258
+    global gdb_prompt
689258
+
689258
+    set test "$regname register access"
689258
+    gdb_test_multiple "info reg $regname" "$test" {
689258
+	-re "Invalid register.*\r\n$gdb_prompt $" {
689258
+	    unsupported "$test"
689258
+	    return 0
689258
+	}
689258
+	-re "\r\n$regname.*\r\n$gdb_prompt $" {
689258
+	    pass "$test"
689258
+	    return 1
689258
+	}
689258
+    }
689258
+    return 0
689258
+}
689258
+
689258
+# Do one pass to check if the instructions in our test programs are
689258
+# available to this processor (e.g. mtspr 3, RS for accessing DSCR).
689258
+proc ppr_dscr_available {} {
689258
+    global gdb_prompt
689258
+    global inferior_exited_re
689258
+
689258
+    set test "PPR/DSCR available to inferior"
689258
+    gdb_test_multiple "continue" "" {
689258
+	-re "Illegal instruction.*\r\n$gdb_prompt $" {
689258
+	    unsupported "$test"
689258
+	    return 0
689258
+	}
689258
+	-re "$inferior_exited_re normally.*$gdb_prompt $" {
689258
+	    pass "$test"
689258
+	    return 1
689258
+	}
689258
+    }
689258
+    return 0
689258
+}
689258
+
689258
+with_test_prefix "check PPR/DSCR access" {
689258
+    clean_restart $binfile
689258
+
689258
+    if ![runto_main] {
689258
+	return
689258
+    }
689258
+
689258
+    if {![check_register_access "ppr"]} {
689258
+	return
689258
+    }
689258
+
689258
+    if {![check_register_access "dscr"]} {
689258
+	return
689258
+    }
689258
+
689258
+    if {![ppr_dscr_available]} {
689258
+	return
689258
+    }
689258
+}
689258
+
689258
+# Now do the actual test
689258
+clean_restart $binfile
689258
+
689258
+if ![runto_main] {
689258
+    return
689258
+}
689258
+
689258
+gdb_breakpoint [gdb_get_line_number "marker"]
689258
+
689258
+gdb_continue_to_breakpoint "continue to marker"
689258
+
689258
+# At the breakpoint the inferior should have set the
689258
+# registers to these expected values.
689258
+
689258
+with_test_prefix "before write" {
689258
+    gdb_test "info reg dscr" "dscr.*0x0*20\[ \t\]+.*"
689258
+    gdb_test "info reg ppr" "ppr.*0x0*8000000000000\[ \t\]+.*"
689258
+}
689258
+
689258
+# Set Store Stream Enable in DSCR and set PPR to the medium-low
689258
+# priority.
689258
+gdb_test_no_output "set \$dscr = 0x8"
689258
+gdb_test_no_output "set \$ppr = 0xC000000000000"
689258
+
689258
+gdb_test "stepi" "asm.*"
689258
+
689258
+with_test_prefix "after write" {
689258
+    gdb_test "info reg dscr" "dscr.*0x0*8+\[ \t\]+.*"
689258
+    gdb_test "info reg ppr" "ppr.*0x0*\[cC\]000000000000\[ \t\]+.*"
689258
+}