public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
  2017-02-01 13:03 ` [PATCH 2/5] Change xstate_bv handling to use 8 bytes of data Michael Sturm
@ 2017-02-01 13:03 ` Michael Sturm
  2017-02-01 13:03 ` [PATCH 3/5] Rename target descriptions to reflect actual content of description Michael Sturm
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:03 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

Pedro suggested a separate patch synching with GCCs cpuid.h
instead of just adding new bits for PKU feature.

 gdb/Changelog:
     2016-11-14  Michael Sturm  <michael.sturm@intel.com>

          * nat/x86-gcc-cpuid.h: Replace with copy of cpuid.h
            from gcc-6 branch.

Change-Id: I16f8f7f2d0aa7c2e815701d15ed831a6c6b33d21
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
---
 gdb/nat/x86-gcc-cpuid.h | 108 ++++++++++++++++++++++--------------------------
 1 file changed, 50 insertions(+), 58 deletions(-)

diff --git a/gdb/nat/x86-gcc-cpuid.h b/gdb/nat/x86-gcc-cpuid.h
index d800c82..d412c42 100644
--- a/gdb/nat/x86-gcc-cpuid.h
+++ b/gdb/nat/x86-gcc-cpuid.h
@@ -1,5 +1,5 @@
 /*
- * Helper cpuid.h file copied from gcc-4.8.0.  Code in gdb should not
+ * Helper cpuid.h file copied from gcc-6.0.0.  Code in gdb should not
  * include this directly, but pull in x86-cpuid.h and use that func.
  */
 /*
@@ -61,31 +61,56 @@
 #define bit_LWP 	(1 << 15)
 #define bit_FMA4        (1 << 16)
 #define bit_TBM         (1 << 21)
+#define bit_MWAITX      (1 << 29)
 
 /* %edx */
+#define bit_AVX5124VNNIW (1 << 2)
+#define bit_AVX5124FMAPS (1 << 3)
 #define bit_MMXEXT	(1 << 22)
 #define bit_LM		(1 << 29)
 #define bit_3DNOWP	(1 << 30)
 #define bit_3DNOW	(1 << 31)
 
+/* %ebx.  */
+#define bit_CLZERO	(1 << 0)
+
 /* Extended Features (%eax == 7) */
+/* %ebx */
 #define bit_FSGSBASE	(1 << 0)
 #define bit_BMI	(1 << 3)
 #define bit_HLE	(1 << 4)
 #define bit_AVX2	(1 << 5)
 #define bit_BMI2	(1 << 8)
 #define bit_RTM	(1 << 11)
+#define bit_MPX	(1 << 14)
 #define bit_AVX512F	(1 << 16)
-#define bit_MPX (1 << 14)
+#define bit_AVX512DQ	(1 << 17)
 #define bit_RDSEED	(1 << 18)
 #define bit_ADX	(1 << 19)
+#define bit_AVX512IFMA	(1 << 21)
+#define bit_CLFLUSHOPT	(1 << 23)
+#define bit_CLWB	(1 << 24)
 #define bit_AVX512PF	(1 << 26)
 #define bit_AVX512ER	(1 << 27)
 #define bit_AVX512CD	(1 << 28)
 #define bit_SHA		(1 << 29)
+#define bit_AVX512BW	(1 << 30)
+#define bit_AVX512VL	(1 << 31)
+
+/* %ecx */
+#define bit_PREFETCHWT1	  (1 << 0)
+#define bit_AVX512VBMI	(1 << 1)
+#define bit_PKU	(1 << 3)
+#define bit_OSPKE	(1 << 4)
+
+/* XFEATURE_ENABLED_MASK register bits (%eax == 13, %ecx == 0) */
+#define bit_BNDREGS     (1 << 3)
+#define bit_BNDCSR      (1 << 4)
 
 /* Extended State Enumeration Sub-leaf (%eax == 13, %ecx == 1) */
 #define bit_XSAVEOPT	(1 << 0)
+#define bit_XSAVEC	(1 << 1)
+#define bit_XSAVES	(1 << 3)
 
 /* Signatures for different CPU implementations as returned in uses
    of cpuid with level 0.  */
@@ -141,55 +166,6 @@
 #define signature_VORTEX_ecx	0x436f5320
 #define signature_VORTEX_edx	0x36387865
 
-#if defined(__i386__) && defined(__PIC__)
-/* %ebx may be the PIC register.  */
-#if __GNUC__ >= 3
-#define __cpuid(level, a, b, c, d)			\
-  __asm__ ("xchg{l}\t{%%}ebx, %k1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchg{l}\t{%%}ebx, %k1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level))
-
-#define __cpuid_count(level, count, a, b, c, d)		\
-  __asm__ ("xchg{l}\t{%%}ebx, %k1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchg{l}\t{%%}ebx, %k1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level), "2" (count))
-#else
-/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
-   nor alternatives in i386 code.  */
-#define __cpuid(level, a, b, c, d)			\
-  __asm__ ("xchgl\t%%ebx, %k1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchgl\t%%ebx, %k1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level))
-
-#define __cpuid_count(level, count, a, b, c, d)		\
-  __asm__ ("xchgl\t%%ebx, %k1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchgl\t%%ebx, %k1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level), "2" (count))
-#endif
-#elif defined(__x86_64__) && (defined(__code_model_medium__) || defined(__code_model_large__)) && defined(__PIC__)
-/* %rbx may be the PIC register.  */
-#define __cpuid(level, a, b, c, d)			\
-  __asm__ ("xchg{q}\t{%%}rbx, %q1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchg{q}\t{%%}rbx, %q1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level))
-
-#define __cpuid_count(level, count, a, b, c, d)		\
-  __asm__ ("xchg{q}\t{%%}rbx, %q1\n\t"			\
-	   "cpuid\n\t"					\
-	   "xchg{q}\t{%%}rbx, %q1\n\t"			\
-	   : "=a" (a), "=&r" (b), "=c" (c), "=d" (d)	\
-	   : "0" (level), "2" (count))
-#else
 #define __cpuid(level, a, b, c, d)			\
   __asm__ ("cpuid\n\t"					\
 	   : "=a" (a), "=b" (b), "=c" (c), "=d" (d)	\
@@ -199,7 +175,7 @@
   __asm__ ("cpuid\n\t"					\
 	   : "=a" (a), "=b" (b), "=c" (c), "=d" (d)	\
 	   : "0" (level), "2" (count))
-#endif
+
 
 /* Return highest supported input value for cpuid instruction.  ext can
    be either 0x0 or 0x8000000 to return highest supported value for
@@ -258,21 +234,37 @@ __get_cpuid_max (unsigned int __ext, unsigned int *__sig)
   return __eax;
 }
 
-/* Return cpuid data for requested cpuid level, as found in returned
+/* Return cpuid data for requested cpuid leaf, as found in returned
    eax, ebx, ecx and edx registers.  The function checks if cpuid is
    supported and returns 1 for valid cpuid information or 0 for
-   unsupported cpuid level.  All pointers are required to be non-null.  */
+   unsupported cpuid leaf.  All pointers are required to be non-null.  */
 
 static __inline int
-__get_cpuid (unsigned int __level,
+__get_cpuid (unsigned int __leaf,
 	     unsigned int *__eax, unsigned int *__ebx,
 	     unsigned int *__ecx, unsigned int *__edx)
 {
-  unsigned int __ext = __level & 0x80000000;
+  unsigned int __ext = __leaf & 0x80000000;
+
+  if (__get_cpuid_max (__ext, 0) < __leaf)
+    return 0;
+
+  __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
+  return 1;
+}
+
+/* Same as above, but sub-leaf can be specified.  */
+
+static __inline int
+__get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
+		   unsigned int *__eax, unsigned int *__ebx,
+		   unsigned int *__ecx, unsigned int *__edx)
+{
+  unsigned int __ext = __leaf & 0x80000000;
 
-  if (__get_cpuid_max (__ext, 0) < __level)
+  if (__get_cpuid_max (__ext, 0) < __leaf)
     return 0;
 
-  __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
+  __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
   return 1;
 }
-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 3/5] Rename target descriptions to reflect actual content of description.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
  2017-02-01 13:03 ` [PATCH 2/5] Change xstate_bv handling to use 8 bytes of data Michael Sturm
  2017-02-01 13:03 ` [PATCH 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch Michael Sturm
@ 2017-02-01 13:03 ` Michael Sturm
  2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:03 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

To better reflect the actual feature set covered by the IA target
descriptions, the existing descriptions are renamed. Each feature of
the extended state is added to the name of a description or xstate mask
starting from AVX.
For example, amd64-mpx-avx512-linux becomes amd64-avx-mpx-avx512-linux,
while amd64-avx-linux remains unchanged.
Likewise, the corresponding xstate masks are changed, e.g. from
X86_XSTATE_MPX_AVX512_MASK to X86_XSTATE_AVX_MPX_AVX512_MASK.

gdb/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * amd64-linux-tdep.c (features/i386/amd64-avx512-linux.c): Rename
     include to...
     (features/i386/amd64-avx-mpx-avx512-linux.c): ...this.
     (features/i386/x32-avx512-linux.c): Rename include to...
     (features/i386/x32-avx-mpx-avx512-linux.c): ...this.
     (amd64_linux_core_read_description): Rename X86_XSTATE_MPX_AVX512_MASK,
     X86_XSTATE_AVX512_MASK, desc_x32_avx512_linux, tdesc_amd64_avx512_linux.
     (_initialize_amd64_linux_tdep): Rename
     initialize_tdesc_amd64_avx512_linux, initialize_tdesc_x32_avx512_linux.
     * amd64-linux-tdep.h (tdesc_amd64_avx512_linux): Rename to...
     (tdesc_amd64_avx_mpx_avx512_linux): ...this.
     (tdesc_x32_avx512_linux): Rename to...
     (tdesc_x32_avx_mpx_avx512_linux): ...this.
     * amd64-tdep.c (features/i386/amd64-avx512.c): Rename include to...
     (features/i386/amd64-avx-mpx-avx512.c): ...this.
     (features/i386/x32-avx512.c): Rename include to...
     (features/i386/x32-avx-mpx-avx512.c): ...this.
     (amd64_target_description): Rename X86_XSTATE_MPX_AVX512_MASK,
     X86_XSTATE_AVX512_MASK, tdesc_amd64_avx512.
     (_initialize_amd64_tdep): Rename initialize_tdesc_amd64_avx512. Rename
     initialize_tdesc_x32_avx512.
     * common/x86-xstate.h (X86_XSTATE_AVX512_MASK): Rename to...
     (X86_XSTATE_AVX_AVX512_MASK): ...this.
     (86_XSTATE_MPX_AVX512_MASK): Rename to...
     (X86_XSTATE_AVX_MPX_AVX512_MASK): ...this.
     (X86_XSTATE_ALL_MASK): Rename X86_XSTATE_MPX_AVX512_MASK to
     X86_XSTATE_AVX_MPX_AVX512_MASK.
     * features/Makefile (WHICH): Rename i386/i386-avx512,
     i386/i386-avx512-linux, i386/amd64-avx512, i386/amd64-avx512-linux,
     i386/x32-avx512, i386/x32-avx512-linux.
     (i386/i386-avx512-expedite, i386/i386-avx512-linux-expedite,
     i386/amd64-avx512-expedite, i386/amd64-avx512-linux-expedite,
     i386/x32-avx512-expedite, i386/x32-avx512-linux-expedite): Rename
     expedites.
     (XMLTOC): Rename i386/amd64-avx512-linux.xml, i386/amd64-avx512.xml,
     i386/i386-avx512-linux.xml, i386/i386-avx512.xml,
     i386/x32-avx512-linux.xml, i386/x32-avx512.xml.
     ($(outdir)/i386/i386-avx512.dat): Rename dat file in rule.
     ($(outdir)/i386/i386-avx512-linux.dat): Likewise.
     ($(outdir)/i386/amd64-avx512.dat): Likewise.
     ($(outdir)/i386/amd64-avx512-linux.dat): Likewise.
     ($(outdir)/i386/x32-avx512.dat): Likewise.
     ($(outdir)/i386/x32-avx512-linux.dat): Likewise.
     * features/i386/amd64-avx512-linux.c: Regenerate from renamed XML file.
     * features/i386/amd64-avx512-linux.xml: Rename XML file.
     * features/i386/amd64-avx512.c: Regenerate from renamed XML file.
     * features/i386/amd64-avx512.xml: Rename XML file.
     * features/i386/i386-avx512-linux.c: Regenerate from renamed XML file.
     * features/i386/i386-avx512-linux.xml: Rename XML file.
     * features/i386/i386-avx512.c: Regenerate from renamed XML file.
     * features/i386/i386-avx512.xml: Rename XML file.
     * features/i386/x32-avx512-linux.c: Regenerate from renamed XML file.
     * features/i386/x32-avx512-linux.xml: Rename XML file.
     * features/i386/x32-avx512.c: Regenerate from renamed XML file.
     * features/i386/x32-avx512.xml: Rename XML file.
     * i386-linux-tdep.c (features/i386/i386-avx512-linux.c): Rename to...
     (features/i386/i386-avx-mpx-avx512-linux.c): ...this.
     (i386_linux_core_read_description): Rename X86_XSTATE_MPX_AVX512_MASK,
     X86_XSTATE_AVX512_MASK, tdesc_i386_avx512_linux.
     (_initialize_i386_linux_tdep): Rename initialize_tdesc_i386_avx512_linux.
     * i386-linux-tdep.h (tdesc_i386_avx512_linux): Rename to...
     (tdesc_i386_avx_mpx_avx512_linux): ...this.
     * i386-tdep.c (features/i386/i386-avx512.c): Rename to...
     (features/i386/i386-avx-mpx-avx512.c): ...this.
     (i386_register_reggroup_p): Rename X86_XSTATE_AVX512_MASK.
     (i386_validate_tdesc_p): Likewise.
     (i386_target_description): Rename X86_XSTATE_MPX_AVX512_MASK,
     tdesc_i386_avx512.
     (_initialize_i386_tdep): Rename initialize_tdesc_i386_avx512.
     * regformats/i386/amd64-avx512-linux.dat: Regenerate from renamed XML
     file.
     * regformats/i386/amd64-avx512.dat: Likewise.
     * regformats/i386/i386-avx512-linux.dat: Likewise.
     * regformats/i386/i386-avx512.dat: Likewise.
     * regformats/i386/x32-avx512-linux.dat: Likewise.
     * regformats/i386/x32-avx512.dat: Likewise.
     * x86-Linux-nat.c (x86_linux_read_description): Rename
     X86_XSTATE_MPX_AVX512_MASK, X86_XSTATE_AVX512_MASK,
     tdesc_x32_avx512_linux, tdesc_amd64_avx512_linux, tdesc_i386_avx512_linux.

gdbserver/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * Makefile.in (clean): Rename i386-avx512.c, i386-avx512-linux.c,
     amd64-avx512.c, amd64-avx512-linux.c, x32-avx512.c, x32-avx512-linux.c.
     (i386-avx512-linux-ipa.o): Rename rule and source files.
     (amd64-avx512-linux-ipa.o): Likewise.
     (i386-avx512.c): Rename rule, source fils and dat files.
     (i386-avx512-linux.c): Likewise.
     (amd64-avx512.c): Likewise.
     (amd64-avx512-linux.c): Likewise.
     (x32-avx512.c): Likewise.
     (x32-avx512-linux.c): Likewise.
     * configfure.srv (srv_i386_regobj): Rename i386-avx512.o.
     (i386_linux_regobj): Rename i386-avx512-linux.o.
     (srv_amd64_regobj): Rename amd64-avx512.o, x32-avx512.o.
     (srv_amd64_linux_regobj): Rename amd64-avx512-linux.o,
     x32-avx512-linux.o.
     (ipa_i386_linux_regobj): Rename i386-avx512-linux-ipa.o.
     (ipa_amd64_linux_regobj): Rename amd64-avx512-linux-ipa.o.
     (srv_i386_xmlfiles): Rename i386/i386-avx512.xml.
     (srv_amd64_xmlfiles): Rename i386/amd64-avx512.xml, i386/x32-avx512.xml.
     (srv_i386_linux_xmlfiles): Rename i386/i386-avx512-linux.xml.
     (srv_amd64_linux_xmlfiles): Rename i386/amd64-avx512-linux.xml,
     i386/x32-avx512-linux.xml).
     * linux-amd64-ipa.c (get_ipa_tdesc): Rename X86_TDESC_AVX512 and returned
     tdesc for that case.
     (initialize_low_tracepoint): Rename init_registers_amd64_avx512_linux.
     * linux-i386-ipa.c (get_ipa_tdesc): Rename X86_TDESC_AVX512 and tdesc
     returned for that case.
     (initialize_low_tracepoint): Rename init_registers_i386_avx512_linux.
     * linux-x86-low.c (x86_linux_read_description): Rename
     X86_XSTATE_AVX512_MASK and tdesc returned for that case.
     (x86_get_ipa_tdesc_idx): Rename tdesc_amd64_avx512_linux,
     tdesc_x32_avx512_linux and mask returned for these descriptions.
     Rename tdesc_i386_avx512_linux and mask returned for that description.
     (initialize_low_arch): Rename init_registers_amd64_avx512_linux,
     init_registers_x32_avx512_linux, init_registers_i386_avx512_linux.
     * linux-x86-tdesc.h (enum x86_linux_tdesc): Rename X86_TDESC_AVX512.
     (init_registers_amd64_avx512_linux): Rename to...
     (init_registers_amd64_avx_mpx_avx512_linux): ...this.
     (tdesc_amd64_avx512_linux): Rename to...
     (tdesc_amd64_avx_mpx_avx512_linux): ...this.
     (init_registers_x32_avx512_linux): Rename to...
     (init_registers_x32_avx_mpx_avx512_linux): ...this.
     (tdesc_x32_avx512_linux): Rename to...
     (tdesc_x32_avx_mpx_avx512_linux): ...this.
     (init_registers_i386_avx512_linux): Rename to...
     (init_registers_i386_avx_mpx_avx512_linux): ...this.
     (tdesc_i386_avx512_linux): Rename to...
     (tdesc_i386_avx_mpx_avx512_linux): ...this.

Change-Id: Idb83be3b3b72d5487542d4b568193df2777a3d9d
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
---
 gdb/amd64-linux-tdep.c                             | 16 +++++-----
 gdb/amd64-linux-tdep.h                             |  4 +--
 gdb/amd64-tdep.c                                   | 14 ++++-----
 gdb/common/x86-xstate.h                            |  6 ++--
 gdb/features/Makefile                              | 34 +++++++++++-----------
 ...avx512-linux.c => amd64-avx-mpx-avx512-linux.c} |  8 ++---
 ...12-linux.xml => amd64-avx-mpx-avx512-linux.xml} |  2 +-
 .../{amd64-avx512.c => amd64-avx-mpx-avx512.c}     |  8 ++---
 .../{amd64-avx512.xml => amd64-avx-mpx-avx512.xml} |  2 +-
 ...-avx512-linux.c => i386-avx-mpx-avx512-linux.c} |  8 ++---
 ...512-linux.xml => i386-avx-mpx-avx512-linux.xml} |  2 +-
 .../i386/{i386-avx512.c => i386-avx-mpx-avx512.c}  |  8 ++---
 .../{i386-avx512.xml => i386-avx-mpx-avx512.xml}   |  2 +-
 ...2-avx512-linux.c => x32-avx-mpx-avx512-linux.c} |  8 ++---
 ...x512-linux.xml => x32-avx-mpx-avx512-linux.xml} |  2 +-
 .../i386/{x32-avx512.c => x32-avx-mpx-avx512.c}    |  8 ++---
 .../{x32-avx512.xml => x32-avx-mpx-avx512.xml}     |  2 +-
 gdb/gdbserver/Makefile.in                          | 34 +++++++++++-----------
 gdb/gdbserver/configure.srv                        | 21 +++++++------
 gdb/gdbserver/linux-amd64-ipa.c                    | 11 ++++---
 gdb/gdbserver/linux-i386-ipa.c                     |  6 ++--
 gdb/gdbserver/linux-x86-low.c                      | 29 +++++++++---------
 gdb/gdbserver/linux-x86-tdesc.h                    | 20 ++++++-------
 gdb/i386-linux-tdep.c                              | 10 +++----
 gdb/i386-linux-tdep.h                              |  2 +-
 gdb/i386-tdep.c                                    | 20 ++++++-------
 ...2-avx512.dat => amd64-avx-mpx-avx512-linux.dat} |  9 ++++--
 ...4-avx512-linux.dat => amd64-avx-mpx-avx512.dat} |  6 ++--
 ...512-linux.dat => i386-avx-mpx-avx512-linux.dat} |  6 ++--
 .../{i386-avx512.dat => i386-avx-mpx-avx512.dat}   |  6 ++--
 ...x512-linux.dat => x32-avx-mpx-avx512-linux.dat} |  6 ++--
 .../{amd64-avx512.dat => x32-avx-mpx-avx512.dat}   |  6 ++--
 gdb/x86-linux-nat.c                                | 14 ++++-----
 33 files changed, 174 insertions(+), 166 deletions(-)
 rename gdb/features/i386/{amd64-avx512-linux.c => amd64-avx-mpx-avx512-linux.c} (98%)
 rename gdb/features/i386/{amd64-avx512-linux.xml => amd64-avx-mpx-avx512-linux.xml} (89%)
 rename gdb/features/i386/{amd64-avx512.c => amd64-avx-mpx-avx512.c} (98%)
 rename gdb/features/i386/{amd64-avx512.xml => amd64-avx-mpx-avx512.xml} (93%)
 rename gdb/features/i386/{i386-avx512-linux.c => i386-avx-mpx-avx512-linux.c} (98%)
 rename gdb/features/i386/{i386-avx512-linux.xml => i386-avx-mpx-avx512-linux.xml} (88%)
 rename gdb/features/i386/{i386-avx512.c => i386-avx-mpx-avx512.c} (98%)
 rename gdb/features/i386/{i386-avx512.xml => i386-avx-mpx-avx512.xml} (94%)
 rename gdb/features/i386/{x32-avx512-linux.c => x32-avx-mpx-avx512-linux.c} (98%)
 rename gdb/features/i386/{x32-avx512-linux.xml => x32-avx-mpx-avx512-linux.xml} (89%)
 rename gdb/features/i386/{x32-avx512.c => x32-avx-mpx-avx512.c} (98%)
 rename gdb/features/i386/{x32-avx512.xml => x32-avx-mpx-avx512.xml} (94%)
 rename gdb/regformats/i386/{x32-avx512.dat => amd64-avx-mpx-avx512-linux.dat} (90%)
 rename gdb/regformats/i386/{amd64-avx512-linux.dat => amd64-avx-mpx-avx512.dat} (93%)
 rename gdb/regformats/i386/{i386-avx512-linux.dat => i386-avx-mpx-avx512-linux.dat} (84%)
 rename gdb/regformats/i386/{i386-avx512.dat => i386-avx-mpx-avx512.dat} (86%)
 rename gdb/regformats/i386/{x32-avx512-linux.dat => x32-avx-mpx-avx512-linux.dat} (92%)
 rename gdb/regformats/i386/{amd64-avx512.dat => x32-avx-mpx-avx512.dat} (93%)

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index b9d7176..5c5e1ab 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -44,11 +44,11 @@
 #include "features/i386/amd64-avx-linux.c"
 #include "features/i386/amd64-mpx-linux.c"
 #include "features/i386/amd64-avx-mpx-linux.c"
-#include "features/i386/amd64-avx512-linux.c"
+#include "features/i386/amd64-avx-mpx-avx512-linux.c"
 
 #include "features/i386/x32-linux.c"
 #include "features/i386/x32-avx-linux.c"
-#include "features/i386/x32-avx512-linux.c"
+#include "features/i386/x32-avx-mpx-avx512-linux.c"
 
 /* The syscall's XML filename for i386.  */
 #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
@@ -1585,12 +1585,12 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
 
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX512_MASK:
+    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+    case X86_XSTATE_AVX_AVX512_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	return tdesc_x32_avx512_linux;
+	return tdesc_x32_avx_mpx_avx512_linux;
       else
-	return tdesc_amd64_avx512_linux;
+	return tdesc_amd64_avx_mpx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
 	return tdesc_x32_avx_linux;  /* No x32 MPX falling back to AVX.  */
@@ -2296,9 +2296,9 @@ _initialize_amd64_linux_tdep (void)
   initialize_tdesc_amd64_avx_linux ();
   initialize_tdesc_amd64_mpx_linux ();
   initialize_tdesc_amd64_avx_mpx_linux ();
-  initialize_tdesc_amd64_avx512_linux ();
+  initialize_tdesc_amd64_avx_mpx_avx512_linux ();
 
   initialize_tdesc_x32_linux ();
   initialize_tdesc_x32_avx_linux ();
-  initialize_tdesc_x32_avx512_linux ();
+  initialize_tdesc_x32_avx_mpx_avx512_linux ();
 }
diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h
index 7c53fda..55afe67 100644
--- a/gdb/amd64-linux-tdep.h
+++ b/gdb/amd64-linux-tdep.h
@@ -36,11 +36,11 @@ extern struct target_desc *tdesc_amd64_linux;
 extern struct target_desc *tdesc_amd64_avx_linux;
 extern struct target_desc *tdesc_amd64_mpx_linux;
 extern struct target_desc *tdesc_amd64_avx_mpx_linux;
-extern struct target_desc *tdesc_amd64_avx512_linux;
+extern struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
 
 extern struct target_desc *tdesc_x32_linux;
 extern struct target_desc *tdesc_x32_avx_linux;
-extern struct target_desc *tdesc_x32_avx512_linux;
+extern struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
 
 /* Enum that defines the syscall identifiers for amd64 linux.
    Used for process record/replay, these will be translated into
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 233c65a..863f67c 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -46,11 +46,11 @@
 #include "features/i386/amd64-avx.c"
 #include "features/i386/amd64-mpx.c"
 #include "features/i386/amd64-avx-mpx.c"
-#include "features/i386/amd64-avx512.c"
+#include "features/i386/amd64-avx-mpx-avx512.c"
 
 #include "features/i386/x32.c"
 #include "features/i386/x32-avx.c"
-#include "features/i386/x32-avx512.c"
+#include "features/i386/x32-avx-mpx-avx512.c"
 
 #include "ax.h"
 #include "ax-gdb.h"
@@ -3202,9 +3202,9 @@ amd64_target_description (uint64_t xcr0)
 {
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX512_MASK:
-      return tdesc_amd64_avx512;
+    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_amd64_avx_mpx_avx512;
     case X86_XSTATE_MPX_MASK:
       return tdesc_amd64_mpx;
     case X86_XSTATE_AVX_MPX_MASK:
@@ -3226,11 +3226,11 @@ _initialize_amd64_tdep (void)
   initialize_tdesc_amd64_avx ();
   initialize_tdesc_amd64_mpx ();
   initialize_tdesc_amd64_avx_mpx ();
-  initialize_tdesc_amd64_avx512 ();
+  initialize_tdesc_amd64_avx_mpx_avx512 ();
 
   initialize_tdesc_x32 ();
   initialize_tdesc_x32_avx ();
-  initialize_tdesc_x32_avx512 ();
+  initialize_tdesc_x32_avx_mpx_avx512 ();
 }
 \f
 
diff --git a/gdb/common/x86-xstate.h b/gdb/common/x86-xstate.h
index fcb7453..4680bd6 100644
--- a/gdb/common/x86-xstate.h
+++ b/gdb/common/x86-xstate.h
@@ -41,10 +41,10 @@
 #define X86_XSTATE_AVX_MASK	(X86_XSTATE_SSE_MASK | X86_XSTATE_AVX)
 #define X86_XSTATE_MPX_MASK	(X86_XSTATE_SSE_MASK | X86_XSTATE_MPX)
 #define X86_XSTATE_AVX_MPX_MASK	(X86_XSTATE_AVX_MASK | X86_XSTATE_MPX)
-#define X86_XSTATE_AVX512_MASK	(X86_XSTATE_AVX_MASK | X86_XSTATE_AVX512)
-#define X86_XSTATE_MPX_AVX512_MASK (X86_XSTATE_AVX_MPX_MASK | X86_XSTATE_AVX512)
+#define X86_XSTATE_AVX_AVX512_MASK	(X86_XSTATE_AVX_MASK | X86_XSTATE_AVX512)
+#define X86_XSTATE_AVX_MPX_AVX512_MASK (X86_XSTATE_AVX_MPX_MASK | X86_XSTATE_AVX512)
 
-#define X86_XSTATE_ALL_MASK	(X86_XSTATE_MPX_AVX512_MASK)
+#define X86_XSTATE_ALL_MASK	(X86_XSTATE_AVX_MPX_AVX512_MASK)
 
 #define X86_XSTATE_SSE_SIZE	576
 #define X86_XSTATE_AVX_SIZE	832
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 5a82641..3efcd4f 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -52,14 +52,14 @@ WHICH = aarch64 \
 	i386/i386-avx i386/i386-avx-linux \
 	i386/i386-mpx i386/i386-mpx-linux \
 	i386/i386-avx-mpx i386/i386-avx-mpx-linux \
-	i386/i386-avx512 i386/i386-avx512-linux \
+	i386/i386-avx-mpx-avx512 i386/i386-avx-mpx-avx512-linux \
 	i386/amd64-avx i386/amd64-avx-linux \
 	i386/amd64-mpx i386/amd64-mpx-linux \
 	i386/amd64-avx-mpx i386/amd64-avx-mpx-linux \
-	i386/amd64-avx512 i386/amd64-avx512-linux \
+	i386/amd64-avx-mpx-avx512 i386/amd64-avx-mpx-avx512-linux \
 	i386/x32 i386/x32-linux \
 	i386/x32-avx i386/x32-avx-linux \
-	i386/x32-avx512 i386/x32-avx512-linux \
+	i386/x32-avx-mpx-avx512 i386/x32-avx-mpx-avx512-linux \
 	mips-linux mips-dsp-linux \
 	microblaze-with-stack-protect \
 	mips64-linux mips64-dsp-linux \
@@ -138,8 +138,8 @@ XMLTOC = \
 	arm/arm-with-vfpv3.xml \
 	i386/amd64-avx-linux.xml \
 	i386/amd64-avx.xml \
-	i386/amd64-avx512-linux.xml \
-	i386/amd64-avx512.xml \
+	i386/amd64-avx-mpx-avx512-linux.xml \
+	i386/amd64-avx-mpx-avx512.xml \
 	i386/amd64-linux.xml \
 	i386/amd64-mpx-linux.xml \
 	i386/amd64-mpx.xml \
@@ -148,8 +148,8 @@ XMLTOC = \
 	i386/amd64.xml \
 	i386/i386-avx-linux.xml \
 	i386/i386-avx.xml \
-	i386/i386-avx512-linux.xml \
-	i386/i386-avx512.xml \
+	i386/i386-avx-mpx-avx512-linux.xml \
+	i386/i386-avx-mpx-avx512.xml \
 	i386/i386-linux.xml \
 	i386/i386-mmx-linux.xml \
 	i386/i386-mmx.xml \
@@ -160,8 +160,8 @@ XMLTOC = \
 	i386/i386.xml \
 	i386/x32-avx-linux.xml \
 	i386/x32-avx.xml \
-	i386/x32-avx512-linux.xml \
-	i386/x32-avx512.xml \
+	i386/x32-avx-mpx-avx512-linux.xml \
+	i386/x32-avx-mpx-avx512.xml \
 	i386/x32-linux.xml \
 	i386/x32.xml \
 	microblaze-with-stack-protect.xml \
@@ -271,9 +271,9 @@ $(outdir)/i386/i386-mpx-linux.dat: i386/32bit-core.xml \
 			       i386/32bit-linux.xml i386/32bit-mpx.xml
 $(outdir)/i386/i386-avx-mpx-linux.dat: i386/32bit-core.xml \
 			       i386/32bit-linux.xml i386/32bit-mpx.xml
-$(outdir)/i386/i386-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
+$(outdir)/i386/i386-avx-mpx-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
 			       i386/32bit-mpx.xml i386/32bit-avx512.xml
-$(outdir)/i386/i386-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
+$(outdir)/i386/i386-avx-mpx-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
 			       i386/32bit-linux.xml i386/32bit-mpx.xml i386/32bit-avx512.xml
 $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml 
 $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml i386/32bit-linux.xml
@@ -288,9 +288,9 @@ $(outdir)/i386/amd64-mpx.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml
 $(outdir)/i386/amd64-avx-mpx.dat: i386/64bit-core.xml \
 			       i386/64bit-mpx.xml
-$(outdir)/i386/amd64-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+$(outdir)/i386/amd64-avx-mpx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml i386/64bit-avx512.xml
-$(outdir)/i386/amd64-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+$(outdir)/i386/amd64-avx-mpx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml i386/64bit-avx512.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
 $(outdir)/i386/x32.dat: i386/x32-core.xml i386/64bit-sse.xml
@@ -299,11 +299,11 @@ $(outdir)/i386/x32-linux.dat: i386/x32-core.xml i386/64bit-sse.xml \
 $(outdir)/i386/x32-avx.dat: i386/x32-core.xml i386/64bit-avx.xml
 $(outdir)/i386/x32-avx-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
-$(outdir)/i386/x32-avx512.dat: i386/x32-core.xml i386/64bit-avx.xml \
+$(outdir)/i386/x32-avx-mpx-avx512.dat: i386/x32-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml i386/64bit-avx512.xml
-$(outdir)/i386/x32-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml i386/64bit-avx512.xml \
-			       i386/64bit-linux.xml i386/64bit-segments.xml
+$(outdir)/i386/x32-avx-mpx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
+			       i386/64bit-mpx.xml i386/64bit-avx512.xml i386/64bit-linux.xml \
+			       i386/64bit-segments.xml
 
 # 'all' doesn't build the C files, so don't delete them in 'clean'
 # either.
diff --git a/gdb/features/i386/amd64-avx512-linux.c b/gdb/features/i386/amd64-avx-mpx-avx512-linux.c
similarity index 98%
rename from gdb/features/i386/amd64-avx512-linux.c
rename to gdb/features/i386/amd64-avx-mpx-avx512-linux.c
index b071f62..dd1f100 100644
--- a/gdb/features/i386/amd64-avx512-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx512-linux.xml */
+  Original: amd64-avx-mpx-avx512-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_amd64_avx512_linux;
+struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
 static void
-initialize_tdesc_amd64_avx512_linux (void)
+initialize_tdesc_amd64_avx_mpx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -322,5 +322,5 @@ initialize_tdesc_amd64_avx512_linux (void)
   tdesc_create_reg (feature, "zmm30h", 152, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 153, 1, NULL, 256, "v2ui128");
 
-  tdesc_amd64_avx512_linux = result;
+  tdesc_amd64_avx_mpx_avx512_linux = result;
 }
diff --git a/gdb/features/i386/amd64-avx512-linux.xml b/gdb/features/i386/amd64-avx-mpx-avx512-linux.xml
similarity index 89%
rename from gdb/features/i386/amd64-avx512-linux.xml
rename to gdb/features/i386/amd64-avx-mpx-avx512-linux.xml
index 516f4e3..21d0664 100644
--- a/gdb/features/i386/amd64-avx512-linux.xml
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-linux.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- AMD64 with AVX512 - Includes Linux-only special "register".  -->
+<!-- AMD64 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/features/i386/amd64-avx512.c b/gdb/features/i386/amd64-avx-mpx-avx512.c
similarity index 98%
rename from gdb/features/i386/amd64-avx512.c
rename to gdb/features/i386/amd64-avx-mpx-avx512.c
index 09b73f4..486931f 100644
--- a/gdb/features/i386/amd64-avx512.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx512.xml */
+  Original: amd64-avx-mpx-avx512.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_amd64_avx512;
+struct target_desc *tdesc_amd64_avx_mpx_avx512;
 static void
-initialize_tdesc_amd64_avx512 (void)
+initialize_tdesc_amd64_avx_mpx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -313,5 +313,5 @@ initialize_tdesc_amd64_avx512 (void)
   tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128");
 
-  tdesc_amd64_avx512 = result;
+  tdesc_amd64_avx_mpx_avx512 = result;
 }
diff --git a/gdb/features/i386/amd64-avx512.xml b/gdb/features/i386/amd64-avx-mpx-avx512.xml
similarity index 93%
rename from gdb/features/i386/amd64-avx512.xml
rename to gdb/features/i386/amd64-avx-mpx-avx512.xml
index 264ce7e..482111e 100644
--- a/gdb/features/i386/amd64-avx512.xml
+++ b/gdb/features/i386/amd64-avx-mpx-avx512.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- AMD64 with AVX512 -->
+<!-- AMD64 with AVX, MPX, AVX512 -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/features/i386/i386-avx512-linux.c b/gdb/features/i386/i386-avx-mpx-avx512-linux.c
similarity index 98%
rename from gdb/features/i386/i386-avx512-linux.c
rename to gdb/features/i386/i386-avx-mpx-avx512-linux.c
index 0d3ab22..0fa3552 100644
--- a/gdb/features/i386/i386-avx512-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx512-linux.xml */
+  Original: i386-avx-mpx-avx512-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_i386_avx512_linux;
+struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
 static void
-initialize_tdesc_i386_avx512_linux (void)
+initialize_tdesc_i386_avx_mpx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -204,5 +204,5 @@ initialize_tdesc_i386_avx512_linux (void)
   tdesc_create_reg (feature, "zmm6h", 70, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm7h", 71, 1, NULL, 256, "v2ui128");
 
-  tdesc_i386_avx512_linux = result;
+  tdesc_i386_avx_mpx_avx512_linux = result;
 }
diff --git a/gdb/features/i386/i386-avx512-linux.xml b/gdb/features/i386/i386-avx-mpx-avx512-linux.xml
similarity index 88%
rename from gdb/features/i386/i386-avx512-linux.xml
rename to gdb/features/i386/i386-avx-mpx-avx512-linux.xml
index a0c34ba..2617eab 100644
--- a/gdb/features/i386/i386-avx512-linux.xml
+++ b/gdb/features/i386/i386-avx-mpx-avx512-linux.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- I386 with AVX512 - Includes Linux-only special "register".  -->
+<!-- I386 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/features/i386/i386-avx512.c b/gdb/features/i386/i386-avx-mpx-avx512.c
similarity index 98%
rename from gdb/features/i386/i386-avx512.c
rename to gdb/features/i386/i386-avx-mpx-avx512.c
index 1cb68a1..ad5ac3b 100644
--- a/gdb/features/i386/i386-avx512.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx512.xml */
+  Original: i386-avx-mpx-avx512.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_i386_avx512;
+struct target_desc *tdesc_i386_avx_mpx_avx512;
 static void
-initialize_tdesc_i386_avx512 (void)
+initialize_tdesc_i386_avx_mpx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -199,5 +199,5 @@ initialize_tdesc_i386_avx512 (void)
   tdesc_create_reg (feature, "zmm6h", 69, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm7h", 70, 1, NULL, 256, "v2ui128");
 
-  tdesc_i386_avx512 = result;
+  tdesc_i386_avx_mpx_avx512 = result;
 }
diff --git a/gdb/features/i386/i386-avx512.xml b/gdb/features/i386/i386-avx-mpx-avx512.xml
similarity index 94%
rename from gdb/features/i386/i386-avx512.xml
rename to gdb/features/i386/i386-avx-mpx-avx512.xml
index 6957563..392cc1b 100644
--- a/gdb/features/i386/i386-avx512.xml
+++ b/gdb/features/i386/i386-avx-mpx-avx512.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- I386 with AVX512 -->
+<!-- I386 with AVX, MPX, AVX512 -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/features/i386/x32-avx512-linux.c b/gdb/features/i386/x32-avx-mpx-avx512-linux.c
similarity index 98%
rename from gdb/features/i386/x32-avx512-linux.c
rename to gdb/features/i386/x32-avx-mpx-avx512-linux.c
index 3994996..841d6c9 100644
--- a/gdb/features/i386/x32-avx512-linux.c
+++ b/gdb/features/i386/x32-avx-mpx-avx512-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx512-linux.xml */
+  Original: x32-avx-mpx-avx512-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_x32_avx512_linux;
+struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
 static void
-initialize_tdesc_x32_avx512_linux (void)
+initialize_tdesc_x32_avx_mpx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -322,5 +322,5 @@ initialize_tdesc_x32_avx512_linux (void)
   tdesc_create_reg (feature, "zmm30h", 152, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 153, 1, NULL, 256, "v2ui128");
 
-  tdesc_x32_avx512_linux = result;
+  tdesc_x32_avx_mpx_avx512_linux = result;
 }
diff --git a/gdb/features/i386/x32-avx512-linux.xml b/gdb/features/i386/x32-avx-mpx-avx512-linux.xml
similarity index 89%
rename from gdb/features/i386/x32-avx512-linux.xml
rename to gdb/features/i386/x32-avx-mpx-avx512-linux.xml
index 7266c8e..4b57d41 100644
--- a/gdb/features/i386/x32-avx512-linux.xml
+++ b/gdb/features/i386/x32-avx-mpx-avx512-linux.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- X32 with AVX512 - Includes Linux-only special "register".  -->
+<!-- X32 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/features/i386/x32-avx512.c b/gdb/features/i386/x32-avx-mpx-avx512.c
similarity index 98%
rename from gdb/features/i386/x32-avx512.c
rename to gdb/features/i386/x32-avx-mpx-avx512.c
index acbfaea..20deeab 100644
--- a/gdb/features/i386/x32-avx512.c
+++ b/gdb/features/i386/x32-avx-mpx-avx512.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx512.xml */
+  Original: x32-avx-mpx-avx512.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_x32_avx512;
+struct target_desc *tdesc_x32_avx_mpx_avx512;
 static void
-initialize_tdesc_x32_avx512 (void)
+initialize_tdesc_x32_avx_mpx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -313,5 +313,5 @@ initialize_tdesc_x32_avx512 (void)
   tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128");
 
-  tdesc_x32_avx512 = result;
+  tdesc_x32_avx_mpx_avx512 = result;
 }
diff --git a/gdb/features/i386/x32-avx512.xml b/gdb/features/i386/x32-avx-mpx-avx512.xml
similarity index 94%
rename from gdb/features/i386/x32-avx512.xml
rename to gdb/features/i386/x32-avx-mpx-avx512.xml
index dc7c315..5bc74a8 100644
--- a/gdb/features/i386/x32-avx512.xml
+++ b/gdb/features/i386/x32-avx-mpx-avx512.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- X32 with AVX512 -->
+<!-- X32 with AVX, MPX, AVX512 -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 75736b6..bc4819b 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -445,15 +445,15 @@ clean:
 	rm -f i386-avx.c i386-avx-linux.c
 	rm -f i386-mpx.c i386-mpx-linux.c
 	rm -f i386-avx-mpx.c i386-avx-mpx-linux.c
-	rm -f i386-avx512.c i386-avx512-linux.c
+	rm -f i386-avx-mpx-avx512.c i386-avx-mpx-avx512-linux.c
 	rm -f amd64-avx.c amd64-avx-linux.c
 	rm -f amd64-mpx.c amd64-mpx-linux.c
 	rm -f amd64-avx-mpx.c amd64-avx-mpx-linux.c
-	rm -f amd64-avx512.c amd64-avx512-linux.c
+	rm -f amd64-avx-mpx-avx512.c amd64-avx-mpx-avx512-linux.c
 	rm -f i386-mmx.c i386-mmx-linux.c
 	rm -f x32.c x32-linux.c
 	rm -f x32-avx.c x32-avx-linux.c
-	rm -f x32-avx512.c x32-avx512-linux.c
+	rm -f x32-avx-mpx-avx512.c x32-avx-mpx-avx512-linux.c
 	@$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do
 
 maintainer-clean realclean distclean: clean
@@ -577,7 +577,7 @@ i386-mpx-linux-ipa.o: i386-mpx-linux.c
 i386-avx-mpx-linux-ipa.o: i386-avx-mpx-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
-i386-avx512-linux-ipa.o: i386-avx512-linux.c
+i386-avx-mpx-avx512-linux-ipa.o: i386-avx-mpx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 linux-i386-ipa.o: linux-i386-ipa.c
@@ -598,7 +598,7 @@ amd64-mpx-linux-ipa.o: amd64-mpx-linux.c
 amd64-avx-mpx-linux-ipa.o: amd64-avx-mpx-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
-amd64-avx512-linux-ipa.o: amd64-avx512-linux.c
+amd64-avx-mpx-avx512-linux-ipa.o: amd64-avx-mpx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 linux-aarch64-ipa.o: linux-aarch64-ipa.c
@@ -894,10 +894,10 @@ i386-avx.c : $(srcdir)/../regformats/i386/i386-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx.dat i386-avx.c
 i386-avx-linux.c : $(srcdir)/../regformats/i386/i386-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-linux.dat i386-avx-linux.c
-i386-avx512.c : $(srcdir)/../regformats/i386/i386-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx512.dat i386-avx512.c
-i386-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx512-linux.dat i386-avx512-linux.c
+i386-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat i386-avx-mpx-avx512.c
+i386-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-linux.dat i386-avx-mpx-avx512-linux.c
 i386-mpx.c : $(srcdir)/../regformats/i386/i386-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-mpx.dat i386-mpx.c
 i386-mpx-linux.c : $(srcdir)/../regformats/i386/i386-mpx-linux.dat $(regdat_sh)
@@ -1012,10 +1012,10 @@ amd64-avx.c : $(srcdir)/../regformats/i386/amd64-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx.dat amd64-avx.c
 amd64-avx-linux.c : $(srcdir)/../regformats/i386/amd64-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-linux.dat amd64-avx-linux.c
-amd64-avx512.c : $(srcdir)/../regformats/i386/amd64-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx512.dat amd64-avx512.c
-amd64-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx512-linux.dat amd64-avx512-linux.c
+amd64-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat amd64-avx-mpx-avx512.c
+amd64-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-linux.dat amd64-avx-mpx-avx512-linux.c
 amd64-mpx.c : $(srcdir)/../regformats/i386/amd64-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-mpx.dat amd64-mpx.c
 amd64-mpx-linux.c : $(srcdir)/../regformats/i386/amd64-mpx-linux.dat $(regdat_sh)
@@ -1032,10 +1032,10 @@ x32-avx.c : $(srcdir)/../regformats/i386/x32-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx.dat x32-avx.c
 x32-avx-linux.c : $(srcdir)/../regformats/i386/x32-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-linux.dat x32-avx-linux.c
-x32-avx512.c : $(srcdir)/../regformats/i386/x32-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx512.dat x32-avx512.c
-x32-avx512-linux.c : $(srcdir)/../regformats/i386/x32-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx512-linux.dat x32-avx512-linux.c
+x32-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/x32-avx-mpx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-mpx-avx512.dat x32-avx-mpx-avx512.c
+x32-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/x32-avx-mpx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-mpx-avx512-linux.dat x32-avx-mpx-avx512-linux.c
 reg-xtensa.c : $(srcdir)/../regformats/reg-xtensa.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-xtensa.dat reg-xtensa.c
 reg-tilegx.c : $(srcdir)/../regformats/reg-tilegx.dat $(regdat_sh)
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index d03dcb9..9f656f9 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -24,22 +24,21 @@
 # Default hostio_last_error implementation
 srv_hostio_err_objs="hostio-errno.o"
 
-srv_i386_regobj="i386.o i386-avx.o i386-avx512.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
-srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx512-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
-srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx512.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx512.o"
-srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx512-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx512-linux.o"
+srv_i386_regobj="i386.o i386-avx.o i386-avx-mpx-avx512.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
+srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-mpx-avx512-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
+srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-mpx-avx512.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-mpx-avx512.o"
+srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-mpx-avx512-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-mpx-avx512-linux.o"
 
-ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx512-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
-ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx512-linux-ipa.o amd64-mpx-linux-ipa.o"
-ipa_x32_linux_regobj="x32-linux-ipa.o x32-avx-linux-ipa.o x32-avx512-linux-ipa.o"
+ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-mpx-avx512-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
+ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-mpx-avx512-linux-ipa.o amd64-mpx-linux-ipa.o"
 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"
 
 srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml i386/32bit-avx512.xml i386/32bit-mpx.xml"
 srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-sse.xml i386/64bit-avx.xml i386/64bit-avx512.xml i386/x32-core.xml i386/64bit-mpx.xml"
-srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx512.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx512.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
-srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx512-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx512-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx512-linux.xml $srv_i386_64bit_xmlfiles"
+srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-mpx-avx512.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-mpx-avx512.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-mpx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
+srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-mpx-avx512-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-mpx-avx512-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-mpx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
 
 
 # Linux object files.  This is so we don't have to repeat
diff --git a/gdb/gdbserver/linux-amd64-ipa.c b/gdb/gdbserver/linux-amd64-ipa.c
index 3dd1c32..3d105f9 100644
--- a/gdb/gdbserver/linux-amd64-ipa.c
+++ b/gdb/gdbserver/linux-amd64-ipa.c
@@ -197,8 +197,12 @@ get_ipa_tdesc (int idx)
       return tdesc_amd64_mpx_linux;
     case X86_TDESC_AVX_MPX:
       return tdesc_amd64_avx_mpx_linux;
-    case X86_TDESC_AVX512:
-      return tdesc_amd64_avx512_linux;
+    case X86_TDESC_AVX_MPX_AVX512:
+      return tdesc_amd64_avx_mpx_avx512_linux;
+    default:
+      internal_error (__FILE__, __LINE__,
+		      "unknown ipa tdesc index: %d", idx);
+      return tdesc_amd64_linux;
     }
 #endif
 
@@ -278,7 +282,6 @@ initialize_low_tracepoint (void)
   init_registers_amd64_linux ();
   init_registers_amd64_avx_linux ();
   init_registers_amd64_avx_mpx_linux ();
-  init_registers_amd64_mpx_linux ();
-  init_registers_amd64_avx512_linux ();
+  init_registers_amd64_avx_mpx_avx512_linux ();
 #endif
 }
diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c
index 0932a7b..cc09ef8 100644
--- a/gdb/gdbserver/linux-i386-ipa.c
+++ b/gdb/gdbserver/linux-i386-ipa.c
@@ -262,8 +262,8 @@ get_ipa_tdesc (int idx)
       return tdesc_i386_mpx_linux;
     case X86_TDESC_AVX_MPX:
       return tdesc_i386_avx_mpx_linux;
-    case X86_TDESC_AVX512:
-      return tdesc_i386_avx512_linux;
+    case X86_TDESC_AVX_MPX_AVX512:
+      return tdesc_i386_avx_mpx_avx512_linux;
     default:
       internal_error (__FILE__, __LINE__,
 		      "unknown ipa tdesc index: %d", idx);
@@ -293,6 +293,6 @@ initialize_low_tracepoint (void)
   init_registers_i386_linux ();
   init_registers_i386_avx_linux ();
   init_registers_i386_mpx_linux ();
-  init_registers_i386_avx512_linux ();
+  init_registers_i386_avx_mpx_avx512_linux ();
   initialize_fast_tracepoint_trampoline_buffer ();
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 8fdf324..9977f61 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -822,8 +822,9 @@ x86_linux_read_description (void)
 	    {
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
-		case X86_XSTATE_AVX512_MASK:
-		  return tdesc_amd64_avx512_linux;
+		case X86_XSTATE_AVX_MPX_AVX512_MASK:
+		case X86_XSTATE_AVX_AVX512_MASK:
+		  return tdesc_amd64_avx_mpx_avx512_linux;
 
 		case X86_XSTATE_AVX_MPX_MASK:
 		  return tdesc_amd64_avx_mpx_linux;
@@ -847,8 +848,9 @@ x86_linux_read_description (void)
 	    {
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
-		case X86_XSTATE_AVX512_MASK:
-		  return tdesc_x32_avx512_linux;
+		case X86_XSTATE_AVX_MPX_AVX512_MASK:
+		case X86_XSTATE_AVX_AVX512_MASK:
+		  return tdesc_x32_avx_mpx_avx512_linux;
 
 		case X86_XSTATE_MPX_MASK: /* No MPX on x32.  */
 		case X86_XSTATE_AVX_MASK:
@@ -869,8 +871,9 @@ x86_linux_read_description (void)
 	{
 	  switch (xcr0 & X86_XSTATE_ALL_MASK)
 	    {
-	    case (X86_XSTATE_AVX512_MASK):
-	      return tdesc_i386_avx512_linux;
+	    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+	    case (X86_XSTATE_AVX_AVX512_MASK):
+	      return tdesc_i386_avx_mpx_avx512_linux;
 
 	    case (X86_XSTATE_MPX_MASK):
 	      return tdesc_i386_mpx_linux;
@@ -2895,8 +2898,8 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_MPX;
   if (tdesc == tdesc_amd64_avx_mpx_linux)
     return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_amd64_avx512_linux || tdesc == tdesc_x32_avx512_linux)
-    return X86_TDESC_AVX512;
+  if (tdesc == tdesc_amd64_avx_mpx_avx512_linux || tdesc == tdesc_x32_avx_mpx_avx512_linux)
+    return X86_TDESC_AVX_MPX_AVX512;
 #endif
 
   if (tdesc == tdesc_i386_mmx_linux)
@@ -2909,8 +2912,8 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_MPX;
   if (tdesc == tdesc_i386_avx_mpx_linux)
     return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_i386_avx512_linux)
-    return X86_TDESC_AVX512;
+  if (tdesc == tdesc_i386_avx_mpx_avx512_linux)
+    return X86_TDESC_AVX_MPX_AVX512;
 
   return 0;
 }
@@ -2968,13 +2971,13 @@ initialize_low_arch (void)
 #ifdef __x86_64__
   init_registers_amd64_linux ();
   init_registers_amd64_avx_linux ();
-  init_registers_amd64_avx512_linux ();
   init_registers_amd64_mpx_linux ();
   init_registers_amd64_avx_mpx_linux ();
+  init_registers_amd64_avx_mpx_avx512_linux ();
 
   init_registers_x32_linux ();
   init_registers_x32_avx_linux ();
-  init_registers_x32_avx512_linux ();
+  init_registers_x32_avx_mpx_avx512_linux ();
 
   tdesc_amd64_linux_no_xml = XNEW (struct target_desc);
   copy_target_description (tdesc_amd64_linux_no_xml, tdesc_amd64_linux);
@@ -2983,9 +2986,9 @@ initialize_low_arch (void)
   init_registers_i386_linux ();
   init_registers_i386_mmx_linux ();
   init_registers_i386_avx_linux ();
-  init_registers_i386_avx512_linux ();
   init_registers_i386_mpx_linux ();
   init_registers_i386_avx_mpx_linux ();
+  init_registers_i386_avx_mpx_avx512_linux ();
 
   tdesc_i386_linux_no_xml = XNEW (struct target_desc);
   copy_target_description (tdesc_i386_linux_no_xml, tdesc_i386_linux);
diff --git a/gdb/gdbserver/linux-x86-tdesc.h b/gdb/gdbserver/linux-x86-tdesc.h
index bcf0b95..b5d19d9 100644
--- a/gdb/gdbserver/linux-x86-tdesc.h
+++ b/gdb/gdbserver/linux-x86-tdesc.h
@@ -28,7 +28,7 @@ enum x86_linux_tdesc {
   X86_TDESC_AVX = 2,
   X86_TDESC_MPX = 3,
   X86_TDESC_AVX_MPX = 4,
-  X86_TDESC_AVX512 = 5,
+  X86_TDESC_AVX_MPX_AVX512 = 5,
 };
 
 #ifdef __x86_64__
@@ -42,9 +42,9 @@ extern const struct target_desc *tdesc_amd64_linux;
 void init_registers_amd64_avx_linux (void);
 extern const struct target_desc *tdesc_amd64_avx_linux;
 
-/* Defined in auto-generated file amd64-avx512-linux.c.  */
-void init_registers_amd64_avx512_linux (void);
-extern const struct target_desc *tdesc_amd64_avx512_linux;
+/* Defined in auto-generated file amd64-avx-mpx-avx512-linux.c.  */
+void init_registers_amd64_avx_mpx_avx512_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
 
 /* Defined in auto-generated file amd64-avx-mpx-linux.c.  */
 void init_registers_amd64_avx_mpx_linux (void);
@@ -64,9 +64,9 @@ extern const struct target_desc *tdesc_x32_linux;
 void init_registers_x32_avx_linux (void);
 extern const struct target_desc *tdesc_x32_avx_linux;
 
-/* Defined in auto-generated file x32-avx512-linux.c.  */
-void init_registers_x32_avx512_linux (void);
-extern const struct target_desc *tdesc_x32_avx512_linux;
+/* Defined in auto-generated file x32-avx-mpx-avx512-linux.c.  */
+void init_registers_x32_avx_mpx_avx512_linux (void);
+extern const struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
 #endif
 
 #endif
@@ -88,9 +88,9 @@ extern const struct target_desc *tdesc_i386_avx_linux;
 void init_registers_i386_avx_mpx_linux (void);
 extern const struct target_desc *tdesc_i386_avx_mpx_linux;
 
-/* Defined in auto-generated file i386-avx512-linux.c.  */
-void init_registers_i386_avx512_linux (void);
-extern const struct target_desc *tdesc_i386_avx512_linux;
+/* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
+void init_registers_i386_avx_mpx_avx512_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
 
 /* Defined in auto-generated file i386-mpx-linux.c.  */
 void init_registers_i386_mpx_linux (void);
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 2014961..b510d34 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -50,7 +50,7 @@
 #include "features/i386/i386-mpx-linux.c"
 #include "features/i386/i386-avx-mpx-linux.c"
 #include "features/i386/i386-avx-linux.c"
-#include "features/i386/i386-avx512-linux.c"
+#include "features/i386/i386-avx-mpx-avx512-linux.c"
 
 /* Return non-zero, when the register is in the corresponding register
    group.  Put the LINUX_ORIG_EAX register in the system group.  */
@@ -688,9 +688,9 @@ i386_linux_core_read_description (struct gdbarch *gdbarch,
 
   switch ((xcr0 & X86_XSTATE_ALL_MASK))
     {
-    case X86_XSTATE_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX512_MASK:
-      return tdesc_i386_avx512_linux;
+    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_i386_avx_mpx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
       return tdesc_i386_mpx_linux;
     case X86_XSTATE_AVX_MPX_MASK:
@@ -1086,5 +1086,5 @@ _initialize_i386_linux_tdep (void)
   initialize_tdesc_i386_avx_linux ();
   initialize_tdesc_i386_mpx_linux ();
   initialize_tdesc_i386_avx_mpx_linux ();
-  initialize_tdesc_i386_avx512_linux ();
+  initialize_tdesc_i386_avx_mpx_avx512_linux ();
 }
diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h
index f7f2407..8242554 100644
--- a/gdb/i386-linux-tdep.h
+++ b/gdb/i386-linux-tdep.h
@@ -48,7 +48,7 @@ extern struct target_desc *tdesc_i386_mmx_linux;
 extern struct target_desc *tdesc_i386_avx_linux;
 extern struct target_desc *tdesc_i386_mpx_linux;
 extern struct target_desc *tdesc_i386_avx_mpx_linux;
-extern struct target_desc *tdesc_i386_avx512_linux;
+extern struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
 
 /* Format of XSAVE extended state is:
  	struct
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index b86c623..9892a84 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -54,7 +54,7 @@
 #include "features/i386/i386-avx.c"
 #include "features/i386/i386-mpx.c"
 #include "features/i386/i386-avx-mpx.c"
-#include "features/i386/i386-avx512.c"
+#include "features/i386/i386-avx-mpx-avx512.c"
 #include "features/i386/i386-mmx.c"
 
 #include "ax.h"
@@ -4555,11 +4555,11 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
   ymm_avx512_regnum_p = i386_ymm_avx512_regnum_p (gdbarch, regnum);
   zmm_regnum_p = i386_zmm_regnum_p (gdbarch, regnum);
 
-  avx512_p = ((tdep->xcr0 & X86_XSTATE_AVX512_MASK)
-	      == X86_XSTATE_AVX512_MASK);
-  avx_p = ((tdep->xcr0 & X86_XSTATE_AVX512_MASK)
+  avx512_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
+	      == X86_XSTATE_AVX_AVX512_MASK);
+  avx_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
 	   == X86_XSTATE_AVX_MASK) && !avx512_p;
-  sse_p = ((tdep->xcr0 & X86_XSTATE_AVX512_MASK)
+  sse_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
 	   == X86_XSTATE_SSE_MASK) && !avx512_p && ! avx_p;
 
   if (group == vector_reggroup)
@@ -8210,7 +8210,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
       if (!feature_avx)
 	return 0;
 
-      tdep->xcr0 = X86_XSTATE_MPX_AVX512_MASK;
+      tdep->xcr0 = X86_XSTATE_AVX_MPX_AVX512_MASK;
 
       /* It may have been set by OSABI initialization function.  */
       if (tdep->k0_regnum < 0)
@@ -8685,9 +8685,9 @@ i386_target_description (uint64_t xcr0)
 {
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX512_MASK:
-      return tdesc_i386_avx512;
+    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_i386_avx_mpx_avx512;
     case X86_XSTATE_AVX_MPX_MASK:
       return tdesc_i386_avx_mpx;
     case X86_XSTATE_MPX_MASK:
@@ -9029,7 +9029,7 @@ Show Intel Memory Protection Extensions specific variables."),
   initialize_tdesc_i386_avx ();
   initialize_tdesc_i386_mpx ();
   initialize_tdesc_i386_avx_mpx ();
-  initialize_tdesc_i386_avx512 ();
+  initialize_tdesc_i386_avx_mpx_avx512 ();
 
   /* Tell remote stub that we support XML target description.  */
   register_remote_support_xml ("i386");
diff --git a/gdb/regformats/i386/x32-avx512.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat
similarity index 90%
rename from gdb/regformats/i386/x32-avx512.dat
rename to gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat
index 609ffe4..526bca4 100644
--- a/gdb/regformats/i386/x32-avx512.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/x32-avx512.xml
-name:x32_avx512
-xmltarget:x32-avx512.xml
+# Generated from: i386/amd64-avx-mpx-avx512-linux.xml
+name:amd64_avx_mpx_avx512_linux
+xmltarget:amd64-avx-mpx-avx512-linux.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
@@ -60,6 +60,9 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:orig_rax
+64:fs_base
+64:gs_base
 128:ymm0h
 128:ymm1h
 128:ymm2h
diff --git a/gdb/regformats/i386/amd64-avx512-linux.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512.dat
similarity index 93%
rename from gdb/regformats/i386/amd64-avx512-linux.dat
rename to gdb/regformats/i386/amd64-avx-mpx-avx512.dat
index f1658d3..fc4bd2d 100644
--- a/gdb/regformats/i386/amd64-avx512-linux.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx-avx512.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/amd64-avx512-linux.xml
-name:amd64_avx512_linux
-xmltarget:amd64-avx512-linux.xml
+# Generated from: i386/amd64-avx-mpx-avx512.xml
+name:amd64_avx_mpx_avx512
+xmltarget:amd64-avx-mpx-avx512.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
diff --git a/gdb/regformats/i386/i386-avx512-linux.dat b/gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat
similarity index 84%
rename from gdb/regformats/i386/i386-avx512-linux.dat
rename to gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat
index 8fe70b9..2afffa3 100644
--- a/gdb/regformats/i386/i386-avx512-linux.dat
+++ b/gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/i386-avx512-linux.xml
-name:i386_avx512_linux
-xmltarget:i386-avx512-linux.xml
+# Generated from: i386/i386-avx-mpx-avx512-linux.xml
+name:i386_avx_mpx_avx512_linux
+xmltarget:i386-avx-mpx-avx512-linux.xml
 expedite:ebp,esp,eip
 32:eax
 32:ecx
diff --git a/gdb/regformats/i386/i386-avx512.dat b/gdb/regformats/i386/i386-avx-mpx-avx512.dat
similarity index 86%
rename from gdb/regformats/i386/i386-avx512.dat
rename to gdb/regformats/i386/i386-avx-mpx-avx512.dat
index 7e1fe93..a3c520c 100644
--- a/gdb/regformats/i386/i386-avx512.dat
+++ b/gdb/regformats/i386/i386-avx-mpx-avx512.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/i386-avx512.xml
-name:i386_avx512
-xmltarget:i386-avx512.xml
+# Generated from: i386/i386-avx-mpx-avx512.xml
+name:i386_avx_mpx_avx512
+xmltarget:i386-avx-mpx-avx512.xml
 expedite:ebp,esp,eip
 32:eax
 32:ecx
diff --git a/gdb/regformats/i386/x32-avx512-linux.dat b/gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat
similarity index 92%
rename from gdb/regformats/i386/x32-avx512-linux.dat
rename to gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat
index 0b7f73a..b8b9d52 100644
--- a/gdb/regformats/i386/x32-avx512-linux.dat
+++ b/gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/x32-avx512-linux.xml
-name:x32_avx512_linux
-xmltarget:x32-avx512-linux.xml
+# Generated from: i386/x32-avx-mpx-avx512-linux.xml
+name:x32_avx_mpx_avx512_linux
+xmltarget:x32-avx-mpx-avx512-linux.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
diff --git a/gdb/regformats/i386/amd64-avx512.dat b/gdb/regformats/i386/x32-avx-mpx-avx512.dat
similarity index 93%
rename from gdb/regformats/i386/amd64-avx512.dat
rename to gdb/regformats/i386/x32-avx-mpx-avx512.dat
index 1f6c458..e872082 100644
--- a/gdb/regformats/i386/amd64-avx512.dat
+++ b/gdb/regformats/i386/x32-avx-mpx-avx512.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/amd64-avx512.xml
-name:amd64_avx512
-xmltarget:amd64-avx512.xml
+# Generated from: i386/x32-avx-mpx-avx512.xml
+name:x32_avx_mpx_avx512
+xmltarget:x32-avx-mpx-avx512.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 679cf35..6c6ad3e 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -204,12 +204,12 @@ x86_linux_read_description (struct target_ops *ops)
 #ifdef __x86_64__
       switch (xcr0_features_bits)
 	{
-	case X86_XSTATE_MPX_AVX512_MASK:
-	case X86_XSTATE_AVX512_MASK:
+	case X86_XSTATE_AVX_MPX_AVX512_MASK:
+	case X86_XSTATE_AVX_AVX512_MASK:
 	  if (is_x32)
-	    return tdesc_x32_avx512_linux;
+	    return tdesc_x32_avx_mpx_avx512_linux;
 	  else
-	    return tdesc_amd64_avx512_linux;
+	    return tdesc_amd64_avx_mpx_avx512_linux;
 	case X86_XSTATE_MPX_MASK:
 	  if (is_x32)
 	    return tdesc_x32_avx_linux; /* No MPX on x32 using AVX.  */
@@ -237,9 +237,9 @@ x86_linux_read_description (struct target_ops *ops)
     {
       switch (xcr0_features_bits)
 	{
-	case X86_XSTATE_MPX_AVX512_MASK:
-	case X86_XSTATE_AVX512_MASK:
-	  return tdesc_i386_avx512_linux;
+	case X86_XSTATE_AVX_MPX_AVX512_MASK:
+	case X86_XSTATE_AVX_AVX512_MASK:
+	  return tdesc_i386_avx_mpx_avx512_linux;
 	case X86_XSTATE_MPX_MASK:
 	  return tdesc_i386_mpx_linux;
 	case X86_XSTATE_AVX_MPX_MASK:
-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 2/5] Change xstate_bv handling to use 8 bytes of data.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
@ 2017-02-01 13:03 ` Michael Sturm
  2017-02-01 13:03 ` [PATCH 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch Michael Sturm
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:03 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

The size of the state-component bitmap as specified in
Intel(R) 64 and IA-32 Architectures Software Developer's Manual,
Chapter 13.4.2 is 8 bytes.
So far, the data types used for xstate_bv_p (gdb_byte*),
clear_bv (unsigned int) and tdep->xcr0 (uint64_t) were
inconsistent. But, since the xstate components were still
fitting into a single byte, the code still worked
as expected.
However, with the addition of the PKU feature (bit 9),
using one byte for the bitmap will no longer be sufficient.

This patch changes related code to use 64 bit data types
consistently and changes read/write acces of the XSAVE
header in the xsave buffer to use the endianess-aware
functions extract_unsigned_integer and store_unsigned_integer.
This is required to make sure that eventual differences
in endianess between host and target are taken care off.

gdb/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * i387-tdep.c (i387_supply_xsave): Change type
     of clear_bv to ULONGEST. Replace gdb_byte *xstate_bv_p
     with ULONGEST xstate_bv and use extract_unsigned_integer
     and store_unsigned_integer to read/write its value from
     the xsave buffer.
     (i387_collect_xsave): Replace gdb_byte *xstate_bv_p
     with ULONGEST initial_xstate_bv and use
     extract_unsigned_integer/store_unsigned_integer to
     read/write its value from the xsave buffer.
     Change type of clear_bv to ULONGEST.

gdbserver/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * i387-fp.c (i387_cache_to_xsave): Change type of clear_bv to
     unsigned long long.
     (i387_fxsave_to_cache): Likewise.

Change-Id: I0de254158960b4f7bcbc9fe2fb857034fa1f7ca5
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
---
 gdb/gdbserver/i387-fp.c |  8 ++++----
 gdb/i387-tdep.c         | 33 +++++++++++++++++++++------------
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/gdb/gdbserver/i387-fp.c b/gdb/gdbserver/i387-fp.c
index b9d7754..8267045 100644
--- a/gdb/gdbserver/i387-fp.c
+++ b/gdb/gdbserver/i387-fp.c
@@ -273,14 +273,14 @@ i387_cache_to_xsave (struct regcache *regcache, void *buf)
   struct i387_xsave *fp = (struct i387_xsave *) buf;
   int i;
   unsigned long val, val2;
-  unsigned int clear_bv;
   unsigned long long xstate_bv = 0;
+  unsigned long long clear_bv = 0;
   char raw[64];
   char *p;
   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;
 
-  /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
+  /* The supported bits in `xstat_bv' are 8 bytes.  Clear part in
      vector registers if its bit in xstat_bv is zero.  */
   clear_bv = (~fp->xstate_bv) & x86_xcr0;
 
@@ -643,12 +643,12 @@ i387_xsave_to_cache (struct regcache *regcache, const void *buf)
   struct i387_fxsave *fxp = (struct i387_fxsave *) buf;
   int i, top;
   unsigned long val;
-  unsigned int clear_bv;
+  unsigned long long clear_bv;
   gdb_byte *p;
   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;
 
-  /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
+  /* The supported bits in `xstat_bv' are 8 bytes.  Clear part in
      vector registers if its bit in xstat_bv is zero.  */
   clear_bv = (~fp->xstate_bv) & x86_xcr0;
 
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index adbe721..e3418d7 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -898,7 +898,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   const gdb_byte *regs = (const gdb_byte *) xsave;
   int i;
-  unsigned int clear_bv;
+  ULONGEST clear_bv;
   static const gdb_byte zero[MAX_REGISTER_SIZE] = { 0 };
   enum
     {
@@ -950,12 +950,15 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
 
   if (regclass != none)
     {
-      /* Get `xstat_bv'.  */
-      const gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
+      /* Get `xstat_bv'.  The supported bits in `xstat_bv' are 8 bytes.  */
+      enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+      ULONGEST xstate_bv = 0;
 
-      /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
-	 vector registers if its bit in xstat_bv is zero.  */
-      clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
+      xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
+					    8, byte_order);
+
+      /* Clear part in vector registers if its bit in xstat_bv is zero.  */
+      clear_bv = (~(xstate_bv)) & tdep->xcr0;
     }
   else
     clear_bv = X86_XSTATE_ALL_MASK;
@@ -1333,11 +1336,14 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
   if ((regclass & check))
     {
       gdb_byte raw[I386_MAX_REGISTER_SIZE];
-      gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs);
-      unsigned int xstate_bv = 0;
-      /* The supported bits in `xstat_bv' are 1 byte.  */
-      unsigned int clear_bv = (~(*xstate_bv_p)) & tdep->xcr0;
+      ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
       gdb_byte *p;
+      enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+
+      /* The supported bits in `xstat_bv' are 8 bytes.  */
+      initial_xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
+						    8, byte_order);
+      clear_bv = (~(initial_xstate_bv)) & tdep->xcr0;
 
       /* Clear register set if its bit in xstat_bv is zero.  */
       if (clear_bv)
@@ -1619,8 +1625,11 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 	 registers are changed.  */
       if (xstate_bv)
 	{
-	  /* The supported bits in `xstat_bv' are 1 byte.  */
-	  *xstate_bv_p |= (gdb_byte) xstate_bv;
+	  /* The supported bits in `xstat_bv' are 8 bytes.  */
+	  initial_xstate_bv |= xstate_bv;
+	  store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
+				  8, byte_order,
+				  initial_xstate_bv);
 
 	  switch (regclass)
 	    {
-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
                   ` (2 preceding siblings ...)
  2017-02-01 13:03 ` [PATCH 3/5] Rename target descriptions to reflect actual content of description Michael Sturm
@ 2017-02-01 13:04 ` Michael Sturm
  2017-02-01 13:09   ` Eli Zaretskii
                     ` (2 more replies)
  2017-02-01 13:04 ` [PATCH 4/5] Add target description for avx-avx512 Michael Sturm
                   ` (2 subsequent siblings)
  6 siblings, 3 replies; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:04 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

This patch adds support for the registers added by the
Memory Protection Keys for Userspace (PKU aka PKEYs) feature.
Native and remote debugging are covered by this patch.

The XSAVE area is extended with a new state containing
the 32-bit wide PKRU register. The new register is added to
amd64-avx-mpx_avx512-* tdesc, thus it is renamed accordingly. Also,
respective xstate mask X86_XSTATE_AVX_MPX_AVX512_MASK is renamed to
X86_XSTATE_AVX_MPX_AVX512_PKU_MASK to reflect the new feature set
it supports.

For more information, please refer to the
Intel(R) 64 and IA-32 Architectures Software Developer's
Manual - Septemper 2015
http://www.intel.com/content/dam/www/public/us/en/documents/
manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

gdb/Changelog:
2015-12-08  Michael Sturm  <michael.sturm@intel.com>

     * NEWS: Mention addition of PKU feature.
     * amd64-linux-nat.c (amd64_linux_gregset32_reg_offset): Add PKRU register.
     * amd64-linux-tdep.c (features/i386/amd64-avx-mpx-avx512-linux.c): Rename
       to...
     (features/i386/amd64-avx-mpx-avx512-pku-linux.c): ...this.
     (amd64_linux_gregset_reg_offset): Add PKRU register.
     (amd64_linux_core_read_description): Rename
     X86_XSTATE_AVX_MPX_AVX512_MASK,
     rename tdesc_amd64_avx_mpx_avx512_pku_linux.
     (_initialize_amd64_linux_tdep): Rename
     initialize_tdesc_amd64_avx_mpx_avx512_linux.
     * amd64-linux-tdep.h (AMD64_LINUX_ORIG_RAX_REGNUM): Adjust regnum
     calculation.
     (tdesc_amd64_avx_mpx_avx512_linux): Rename to...
     (tdesc_amd64_avx_mpx_avx512_pku_linux): ...this.
     * amd64-tdep.c (features/i386/amd64-avx-mpx-avx512-pku.c): Rename to...
     (features/i386/amd64-avx-mpx-avx512-pku.c): ...this.
     (amd64_pkeys_names): New register name for raw register PKRU.
     (amd64_init_abi): Add code to initialize PKRU tdep variables if feature
     is present.
     (amd64_target_description): Rename X86_XSTATE_AVX_MPX_AVX512_MASK,
     rename tdesc_amd64_avx_mpx_avx512.
     (_initialize_amd64_tdep): Rename initialize_tdesc_amd64_avx_mpx_avx512.
     * amd64-tdep.h (enum amd64_regnum): Add PKRU register.
     (AMD64_NUM_REGS): Adjust regnum calculation.
     * i386-linux.nat.c (GETXSTATEREGS_SUPPLIES): Extend range of
     registers supplied via XSTATE by PKRU register.
     * common/x86-xstate.h (X86_XSTATE_PKRU): New macro.
     (X86_XSTATE_AVX_MPX_AVX512_MASK): Add PKRU and renamed mask.
     (X86_XSTATE_ALL_MASK): Rename X86_XSTATE_AVX_MPX_AVX512_MASK.
     (X86_XSTATE_PKRU_SIZE): New macro.
     (X86_XSTATE_MAX_SIZE): Adjust size.
     (HAS_PKRU(XCR0)): New macro.
     (X86_XSTATE_SIZE): Add checkfor PKRU.
     * features/Makefile (WHICH): Rename i386/i386-avx-mpx-avx512,
     i386/i386-avx-mpx-avx512-linux, i386/amd64-avx-mpx-avx512,
     i386/amd64-avx-mpx-avx512-linux.
     (i386/i386-avx-mpx-avx512-expedite): Rename expedite.
     (i386/i386-avx-mpx-avx512-linux-expedite): Likewise.
     (i386/amd64-avx-mpx-avx512-expedite): Likewise.
     (i386/amd64-avx-mpx-avx512-linux-expedite): Likewise.
     (XMLTOC): Rename i386/amd64-avx-mpx-avx512-linux.xml,
     i386/amd64-avx-mpx-avx512.xml, i386/i386-avx-mpx-avx512-linux.xml,
     i386/i386-avx-mpx-avx512.xml.
     ((outdir)/i386/i386-avx-mpx-avx512.dat): Rename rule, add
     i386/32bit-pkeys.xml.
     ((outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat): Likewise.
     ((outdir)/i386/amd64-avx-mpx-avx512.dat): Rename rule, add
     i386/64bit-pkeys.xml.
     ((outdir)/i386/amd64-avx-mpx-avx512-linux.dat): Likewise.
     * features/i386/32bit-pkeys.xml: New file.
     * features/i386/64bit-pkeys.xml: Likewise.
     * features/i386/amd64-avx-mpx-avx512-linux-pku.c: Regenerate from
     renamed XML file.
     * features/i386/amd64-avx-mpx-avx512-linux.xml: Rename to
     amd64-avx-mpx-avx512-pku-linux.xml, add 64bit-pkeys.xml
     * features/i386/amd64-avx-mpx-avx512.c: Regenerate from
     renamed XML file.
     * features/i386/amd64-avx-mpx-avx512.xml: Rename to
     amd64-avx-mpx-avx512-pku.xml, add 64bit-pkeys.xml.
     * features/i386/i386-avx-mpx-avx512-linux.c: Regenerate from
     renamed XML file.
     * features/i386/i386-avx-mpx-avx512-linux.xml: Rename to
     i386-avx-mpx-avx512-pku-linux.xml, add 32bit-pkeys.xml.
     * features/i386/i386-avx-mpx-avx512.c: Regenerate from
     renamed XML file.
     * features/i386/i386-avx-mpx-avx512.xml: Rename to
     i386-avx-mpx-avx512-pku.xml, add 32bit-pkeys.xml.
     * i386-linux-nat.c (GETXSTATEREGS_SUPPLIES): Change to use
     I386_PKEYS_NUM_REGS.
     * i386-linux-tdep.c (features/i386/i386-avx-mpx-avx512-linux.c): Rename
     include.
     (i386_linux_gregset_reg_offset): Add PKRU register.
     (i386_linux_core_read_description): Rename xstate mask and returned
     tdesc for X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
     (_initialize_i386_linux_tdep): Rename
     initialize_tdesc_i386_avx_mpx_avx512_linux.
     * i386-linux-tdep.h (I386_LINUX_ORIG_EAX_REGNUM): Adjuste regnum
     calculation.
     (tdesc_i386_avx_mpx_avx512_linux): Rename prototype.
     (/* Format of XSAVE...): Add pkru register.
     * i386-tdep.c (i386-avx-mpx-avx512.c): Rename include.
     (i386_pkeys_names): New register name for raw register PKRU.
     (i386_pkru_regnum_p): Add function to look up register number of
     PKRU raw register.
     (i386_register_reggroup_p): Add code to exclude PKRU from general
     register group.
     (i386_validate_tdesc_p): Add code to handle PKRU feature, add PKRU
     registers if feature is present in xcr0.
     (i386_gdbarch_init): Adjust number of registers in architecture. Add code
     to initialize PKRU feature variables in tdep structure.
     (i386_target_description): Rename xstate mask and returned
     tdesc for X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
     (_initialize_i386_tdep): Rename initialize_tdesc_i386_avx_mpx_avx512.
     * i386-tdep.h (struct gdbarch_tdep): Add feature variables to tdep
     structure.
     (enum i386_regnum): Add PKRU register.
     (I386_PKEYS_NUM_REGS): New define for number of registers in PKRU feature.
     (i386_pkru_regnum_p): New prototype.
     * i387-tdep.c (xsave_pkeys_offset): New table for PKRU offsets in
     XSAVE buffer.
     (XSAVE_PKEYS_ADDR): New macro.
     (i387_supply_xsave): Add code to handle PKRU register.
     (i387_collect_xsave): Likewise.
     * i387-tdep.h (I387_NUM_PKEYS_REGS): New define for number of registers
     in PKRU feature.
     (I387_PKRU_REGNUM): New macro.
     (I387_PKEYSEND_REGNUM): Likewise.
     * regformats/i386/amd64_avx_mpx_avx512_pku_linux.dat: Regenerate from
     renamed XML file.
     * regformats/i386/amd64_avx_mpx_avx512_pku.dat: Likewise.
     * regformats/i386/i386/amd64-avx-mpx-avx512-pku.dat: Likewise.
     * regformats/i386/i386_avx_mpx_avx512_pku_linux.dat: Likewise.

testsuite/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * gdb.arch/i386-pkru.c: New file.
     * gdb.arch/i386-pkru.exp: Likewise.

gdbserver/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * Makefile.in (clean): Rename i386-avx-mpx-avx512.c,
     i386-avx-mpx-avx512-linux.c, amd64-avx-mpx-avx512.c,
     amd64-avx-mpx-avx512-linux.c.
     (i386-avx-mpx-avx512-linux-ipa.o:): Rename rule and source file.
     (amd64-avx-mpx-avx512-linux-ipa.o:): Likewise.
     (i386-avx-mpx-avx512.c :): Rename rule, source files and dat files.
     (i386-avx-mpx-avx512-linux.c :): Likewise.
     (amd64-avx-mpx-avx512.c :): Likewise.
     (amd64-avx-mpx-avx512-linux.c :): Likewise.
     * configure.srv (srv_i386_regobj): Rename i386-avx-mpx-avx512.o.
     (srv_i386_linux_regobj): Rename i386-avx-mpx-avx512-linux.o.
     (srv_amd64_regobj): Rename amd64-avx-mpx-avx512.o.
     (srv_amd64_linux_regobj): Rename amd64-avx-mpx-avx512-linux.o.
     (ipa_i386_linux_regobj): Rename i386-avx-mpx-avx512-linux-ipa.o.
     (ipa_amd64_linux_regobj): Rename amd64-avx-mpx-avx512-pku-linux-ipa.o.
     (srv_i386_32bit_xmlfiles): Add 32bit-pkeys.xml.
     (srv_i386_64bit_xmlfiles): Add 64bit-pkeys.xml.
     (srv_i386_xmlfiles): Rename i386/i386-avx-mpx-avx512.xml.
     (srv_amd64_xmlfiles): Rename i386/amd64-avx-mpx-avx512.xml.
     (srv_i386_linux_xmlfiles): Rename i386/i386-avx-mpx-avx512-linux.xml.
     (srv_amd64_linux_xmlfiles): Rename di386/amd64-avx-mpx-avx512-linux.xml.
     * i387-fp.c (num_pkeys_registers): New variable.
     (struct i387_xsave): Add space for pkru values.
     (i387_cache_to_fsave): Add code to handle PKRU register.
     (i387_xsave_to_cache): Likewise.
     * linux-amd64-ipa.c (get_ipa_tdesc): Rename
     tdesc_amd64_avx_mpx_avx512_linux.
     (initialize_low_tracepoint): Rename
     init_registers_amd64_avx_mpx_avx512_linux.
     * linux-i386-ipa.c (get_ipa_desc): Rename
     tdesc_i386_avx_mpx_avx512_linux.
     (initialize_low_tracepoint): Rename
     init_registers_i386_avx_mpx_avx512_linux.
     * linux-x86-low.c (x86_64_regmap[]): Add PKRU register.
     (x86_linux_read_description): Rename X86_XSTATE_AVX_MPX_AVX512_MASK,
     rename tdesc_amd64_avx_mpx_avx512_linux, rename
     tdesc_i386_avx_mpx_avx512_linux.
     (x86_get_ipa_tdesc_idx): Rename tdesc_amd64_avx_mpx_avx512_linux,
     rename tdesc_i386_avx_mpx_avx512_linux.
     (initialize_low_arch): Rename init_registers_amd64_avx_mpx_avx512_linux,
     rename init_registers_i386_avx_mpx_avx512_linux.
     * linux-x86-tdesc.h (init_registers_amd64_avx_mpx_avx512_linux): Renamed
     prototype.
     (tdesc_amd64_avx_mpx_avx512_linux): Likewise.
     (init_registers_i386_avx_mpx_avx512_linux): Likewise.
     (tdesc_i386_avx_mpx_avx512_linux): Likewise.

doc/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * gdb.texinfo (i386 Features): Add description of PKRU register.

Change-Id: If75ce5aba7dfd33fdbe3d8b47f04ef3f550c52be
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
---
 gdb/NEWS                                           |  4 +
 gdb/amd64-linux-nat.c                              |  1 +
 gdb/amd64-linux-tdep.c                             |  9 ++-
 gdb/amd64-linux-tdep.h                             |  4 +-
 gdb/amd64-tdep.c                                   | 19 ++++-
 gdb/amd64-tdep.h                                   |  1 +
 gdb/common/x86-xstate.h                            | 19 +++--
 gdb/doc/gdb.texinfo                                |  4 +
 gdb/features/Makefile                              | 34 ++++----
 gdb/features/i386/32bit-pkeys.xml                  | 13 ++++
 gdb/features/i386/64bit-pkeys.xml                  | 13 ++++
 ...12-linux.c => amd64-avx-mpx-avx512-pku-linux.c} | 11 ++-
 ...inux.xml => amd64-avx-mpx-avx512-pku-linux.xml} |  4 +-
 ...avx-mpx-avx512.c => amd64-avx-mpx-avx512-pku.c} | 11 ++-
 ...mpx-avx512.xml => amd64-avx-mpx-avx512-pku.xml} |  3 +-
 ...512-linux.c => i386-avx-mpx-avx512-pku-linux.c} | 11 ++-
 ...linux.xml => i386-avx-mpx-avx512-pku-linux.xml} |  4 +-
 ...-avx-mpx-avx512.c => i386-avx-mpx-avx512-pku.c} | 11 ++-
 ...-mpx-avx512.xml => i386-avx-mpx-avx512-pku.xml} |  3 +-
 gdb/gdbserver/Makefile.in                          | 24 +++---
 gdb/gdbserver/configure.srv                        | 24 +++---
 gdb/gdbserver/i387-fp.c                            | 43 +++++++++++
 gdb/gdbserver/linux-amd64-ipa.c                    |  5 +-
 gdb/gdbserver/linux-i386-ipa.c                     |  6 +-
 gdb/gdbserver/linux-x86-low.c                      | 28 ++++---
 gdb/gdbserver/linux-x86-tdesc.h                    | 12 +--
 gdb/i386-linux-nat.c                               |  2 +-
 gdb/i386-linux-tdep.c                              |  9 ++-
 gdb/i386-linux-tdep.h                              |  5 +-
 gdb/i386-tdep.c                                    | 61 +++++++++++++--
 gdb/i386-tdep.h                                    | 14 +++-
 gdb/i387-tdep.c                                    | 83 +++++++++++++++++++-
 gdb/i387-tdep.h                                    |  5 ++
 ...x512.dat => amd64-avx-mpx-avx512-pku-linux.dat} |  6 +-
 ...x512-linux.dat => amd64-avx-mpx-avx512-pku.dat} |  7 +-
 ...linux.dat => i386-avx-mpx-avx512-pku-linux.dat} |  7 +-
 ...-mpx-avx512.dat => i386-avx-mpx-avx512-pku.dat} |  7 +-
 gdb/testsuite/gdb.arch/i386-pkru.c                 | 90 ++++++++++++++++++++++
 gdb/testsuite/gdb.arch/i386-pkru.exp               | 69 +++++++++++++++++
 gdb/x86-linux-nat.c                                | 10 +--
 40 files changed, 563 insertions(+), 133 deletions(-)
 create mode 100644 gdb/features/i386/32bit-pkeys.xml
 create mode 100644 gdb/features/i386/64bit-pkeys.xml
 rename gdb/features/i386/{amd64-avx-mpx-avx512-linux.c => amd64-avx-mpx-avx512-pku-linux.c} (97%)
 rename gdb/features/i386/{amd64-avx-mpx-avx512-linux.xml => amd64-avx-mpx-avx512-pku-linux.xml} (83%)
 rename gdb/features/i386/{amd64-avx-mpx-avx512.c => amd64-avx-mpx-avx512-pku.c} (98%)
 rename gdb/features/i386/{amd64-avx-mpx-avx512.xml => amd64-avx-mpx-avx512-pku.xml} (87%)
 rename gdb/features/i386/{i386-avx-mpx-avx512-linux.c => i386-avx-mpx-avx512-pku-linux.c} (96%)
 rename gdb/features/i386/{i386-avx-mpx-avx512-linux.xml => i386-avx-mpx-avx512-pku-linux.xml} (82%)
 rename gdb/features/i386/{i386-avx-mpx-avx512.c => i386-avx-mpx-avx512-pku.c} (96%)
 rename gdb/features/i386/{i386-avx-mpx-avx512.xml => i386-avx-mpx-avx512-pku.xml} (87%)
 rename gdb/regformats/i386/{amd64-avx-mpx-avx512.dat => amd64-avx-mpx-avx512-pku-linux.dat} (91%)
 rename gdb/regformats/i386/{amd64-avx-mpx-avx512-linux.dat => amd64-avx-mpx-avx512-pku.dat} (92%)
 rename gdb/regformats/i386/{i386-avx-mpx-avx512-linux.dat => i386-avx-mpx-avx512-pku-linux.dat} (82%)
 rename gdb/regformats/i386/{i386-avx-mpx-avx512.dat => i386-avx-mpx-avx512-pku.dat} (84%)
 create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.c
 create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.exp

diff --git a/gdb/NEWS b/gdb/NEWS
index 21e8cd3..d14c4af 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,10 @@
 
 *** Changes since GDB 7.12
 
+* GDB now supports access to the PKU register on GNU/Linux. The register is
+  added by the Memory Protection Keys for Userspace feature which will be
+  available in future Intel CPUs.
+
 * Building GDB and GDBserver now requires a C++11 compiler.
 
   For example, GCC 4.8 or later.
diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c
index 528984c..4a429ec 100644
--- a/gdb/amd64-linux-nat.c
+++ b/gdb/amd64-linux-nat.c
@@ -73,6 +73,7 @@ static int amd64_linux_gregset32_reg_offset[] =
   -1, -1,			  /* MPX registers BNDCFGU, BNDSTATUS.  */
   -1, -1, -1, -1, -1, -1, -1, -1, /* k0 ... k7 (AVX512)  */
   -1, -1, -1, -1, -1, -1, -1, -1, /* zmm0 ... zmm7 (AVX512)  */
+  -1,				  /* PKEYS register PKRU  */
   ORIG_RAX * 8			  /* "orig_eax"  */
 };
 \f
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 21aa3bc..0e2f285 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -45,7 +45,7 @@
 #include "features/i386/amd64-mpx-linux.c"
 #include "features/i386/amd64-avx-mpx-linux.c"
 #include "features/i386/amd64-avx-avx512-linux.c"
-#include "features/i386/amd64-avx-mpx-avx512-linux.c"
+#include "features/i386/amd64-avx-mpx-avx512-pku-linux.c"
 
 #include "features/i386/x32-linux.c"
 #include "features/i386/x32-avx-linux.c"
@@ -104,6 +104,7 @@ int amd64_linux_gregset_reg_offset[] =
   -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
+  -1,				/* PKEYS register pkru  */
 
   /* End of hardware registers */
   21 * 8, 22 * 8,		      /* fs_base and gs_base.  */
@@ -1586,12 +1587,12 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
 
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_AVX_MPX_AVX512_MASK:
+    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
 	  /* No MPX on x32, fallback to AVX-AVX512.  */
 	return tdesc_x32_avx_avx512_linux;
       else
-	return tdesc_amd64_avx_mpx_avx512_linux;
+	return tdesc_amd64_avx_mpx_avx512_pku_linux;
     case X86_XSTATE_AVX_AVX512_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
 	return tdesc_x32_avx_avx512_linux;
@@ -2305,7 +2306,7 @@ _initialize_amd64_linux_tdep (void)
   initialize_tdesc_amd64_mpx_linux ();
   initialize_tdesc_amd64_avx_mpx_linux ();
   initialize_tdesc_amd64_avx_avx512_linux ();
-  initialize_tdesc_amd64_avx_mpx_avx512_linux ();
+  initialize_tdesc_amd64_avx_mpx_avx512_pku_linux ();
 
   initialize_tdesc_x32_linux ();
   initialize_tdesc_x32_avx_linux ();
diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h
index 0d4ddac..7453408 100644
--- a/gdb/amd64-linux-tdep.h
+++ b/gdb/amd64-linux-tdep.h
@@ -26,7 +26,7 @@
 /* Register number for the "orig_rax" register.  If this register
    contains a value >= 0 it is interpreted as the system call number
    that the kernel is supposed to restart.  */
-#define AMD64_LINUX_ORIG_RAX_REGNUM AMD64_NUM_REGS
+#define AMD64_LINUX_ORIG_RAX_REGNUM (AMD64_GSBASE_REGNUM + 1)
 
 /* Total number of registers for GNU/Linux.  */
 #define AMD64_LINUX_NUM_REGS (AMD64_LINUX_ORIG_RAX_REGNUM + 1)
@@ -37,7 +37,7 @@ extern struct target_desc *tdesc_amd64_avx_linux;
 extern struct target_desc *tdesc_amd64_mpx_linux;
 extern struct target_desc *tdesc_amd64_avx_mpx_linux;
 extern struct target_desc *tdesc_amd64_avx_avx512_linux;
-extern struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
+extern struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
 
 extern struct target_desc *tdesc_x32_linux;
 extern struct target_desc *tdesc_x32_avx_linux;
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index c2a1074..4da71e5 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -47,7 +47,7 @@
 #include "features/i386/amd64-mpx.c"
 #include "features/i386/amd64-avx-mpx.c"
 #include "features/i386/amd64-avx-avx512.c"
-#include "features/i386/amd64-avx-mpx-avx512.c"
+#include "features/i386/amd64-avx-mpx-avx512-pku.c"
 
 #include "features/i386/x32.c"
 #include "features/i386/x32-avx.c"
@@ -157,6 +157,10 @@ static const char *amd64_xmm_avx512_names[] = {
     "xmm28",  "xmm29",  "xmm30",  "xmm31"
 };
 
+static const char *amd64_pkeys_names[] = {
+    "pkru"
+};
+
 /* DWARF Register Number Mapping as defined in the System V psABI,
    section 3.6.  */
 
@@ -3061,6 +3065,13 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 		       AMD64_GSBASE_REGNUM, "gs_base");
     }
 
+  if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL)
+    {
+      tdep->pkeys_register_names = amd64_pkeys_names;
+      tdep->pkru_regnum = AMD64_PKRU_REGNUM;
+      tdep->num_pkeys_regs = 1;
+    }
+
   tdep->num_byte_regs = 20;
   tdep->num_word_regs = 16;
   tdep->num_dword_regs = 16;
@@ -3203,8 +3214,8 @@ amd64_target_description (uint64_t xcr0)
 {
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_AVX_MPX_AVX512_MASK:
-      return tdesc_amd64_avx_mpx_avx512;
+    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+      return tdesc_amd64_avx_mpx_avx512_pku;
     case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_amd64_avx_avx512;
     case X86_XSTATE_MPX_MASK:
@@ -3229,7 +3240,7 @@ _initialize_amd64_tdep (void)
   initialize_tdesc_amd64_mpx ();
   initialize_tdesc_amd64_avx_mpx ();
   initialize_tdesc_amd64_avx_avx512 ();
-  initialize_tdesc_amd64_avx_mpx_avx512 ();
+  initialize_tdesc_amd64_avx_mpx_avx512_pku ();
 
   initialize_tdesc_x32 ();
   initialize_tdesc_x32_avx ();
diff --git a/gdb/amd64-tdep.h b/gdb/amd64-tdep.h
index 8ccf031..87f0ba3 100644
--- a/gdb/amd64-tdep.h
+++ b/gdb/amd64-tdep.h
@@ -77,6 +77,7 @@ enum amd64_regnum
   AMD64_K7_REGNUM = AMD64_K0_REGNUM + 7,
   AMD64_ZMM0H_REGNUM,
   AMD64_ZMM31H_REGNUM = AMD64_ZMM0H_REGNUM + 31,
+  AMD64_PKRU_REGNUM,
   AMD64_FSBASE_REGNUM,
   AMD64_GSBASE_REGNUM
 };
diff --git a/gdb/common/x86-xstate.h b/gdb/common/x86-xstate.h
index 4680bd6..b89928a 100644
--- a/gdb/common/x86-xstate.h
+++ b/gdb/common/x86-xstate.h
@@ -35,6 +35,8 @@
 #define X86_XSTATE_AVX512	(X86_XSTATE_K | X86_XSTATE_ZMM_H \
 				 | X86_XSTATE_ZMM)
 
+#define X86_XSTATE_PKRU		(1ULL << 9)
+
 /* Supported mask and size of the extended state.  */
 #define X86_XSTATE_X87_MASK	X86_XSTATE_X87
 #define X86_XSTATE_SSE_MASK	(X86_XSTATE_X87 | X86_XSTATE_SSE)
@@ -42,27 +44,32 @@
 #define X86_XSTATE_MPX_MASK	(X86_XSTATE_SSE_MASK | X86_XSTATE_MPX)
 #define X86_XSTATE_AVX_MPX_MASK	(X86_XSTATE_AVX_MASK | X86_XSTATE_MPX)
 #define X86_XSTATE_AVX_AVX512_MASK	(X86_XSTATE_AVX_MASK | X86_XSTATE_AVX512)
-#define X86_XSTATE_AVX_MPX_AVX512_MASK (X86_XSTATE_AVX_MPX_MASK | X86_XSTATE_AVX512)
+#define X86_XSTATE_AVX_MPX_AVX512_PKU_MASK 	(X86_XSTATE_AVX_MPX_MASK\
+					| X86_XSTATE_AVX512 | X86_XSTATE_PKRU)
+
+#define X86_XSTATE_ALL_MASK		(X86_XSTATE_AVX_MPX_AVX512_PKU_MASK)
 
-#define X86_XSTATE_ALL_MASK	(X86_XSTATE_AVX_MPX_AVX512_MASK)
 
 #define X86_XSTATE_SSE_SIZE	576
 #define X86_XSTATE_AVX_SIZE	832
 #define X86_XSTATE_BNDREGS_SIZE	1024
 #define X86_XSTATE_BNDCFG_SIZE	1088
 #define X86_XSTATE_AVX512_SIZE	2688
-#define X86_XSTATE_MAX_SIZE	2688
+#define X86_XSTATE_PKRU_SIZE	2696
+#define X86_XSTATE_MAX_SIZE	2696
 
 
 /* In case one of the MPX XCR0 bits is set we consider we have MPX.  */
 #define HAS_MPX(XCR0) (((XCR0) & X86_XSTATE_MPX) != 0)
 #define HAS_AVX(XCR0) (((XCR0) & X86_XSTATE_AVX) != 0)
 #define HAS_AVX512(XCR0) (((XCR0) & X86_XSTATE_AVX512) != 0)
+#define HAS_PKRU(XCR0) (((XCR0) & X86_XSTATE_PKRU) != 0)
 
 /* Get I386 XSAVE extended state size.  */
 #define X86_XSTATE_SIZE(XCR0) \
-    (HAS_AVX512 (XCR0) ? X86_XSTATE_AVX512_SIZE : \
-     (HAS_MPX (XCR0) ? X86_XSTATE_BNDCFG_SIZE : \
-      (HAS_AVX (XCR0) ? X86_XSTATE_AVX_SIZE : X86_XSTATE_SSE_SIZE)))
+    (HAS_PKRU (XCR0) ? X86_XSTATE_PKRU_SIZE : \
+     (HAS_AVX512 (XCR0) ? X86_XSTATE_AVX512_SIZE : \
+      (HAS_MPX (XCR0) ? X86_XSTATE_BNDCFG_SIZE : \
+       (HAS_AVX (XCR0) ? X86_XSTATE_AVX_SIZE : X86_XSTATE_SSE_SIZE))))
 
 #endif /* X86_XSTATE_H */
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index b9b4c82..b7da8a9 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -41217,6 +41217,10 @@ describe the additional @sc{zmm} registers:
 @samp{zmm16h} through @samp{zmm31h}, only valid for amd64.
 @end itemize
 
+The @samp{org.gnu.gdb.i386.pkeys} feature is optional.  It should
+describe a single register, @samp{pkru}.  It is a 32-bit register
+valid for i386 and amd64.
+
 @node MicroBlaze Features
 @subsection MicroBlaze Features
 @cindex target descriptions, MicroBlaze features
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index f25c884..3bc8b5a 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -53,12 +53,12 @@ WHICH = aarch64 \
 	i386/i386-mpx i386/i386-mpx-linux \
 	i386/i386-avx-mpx i386/i386-avx-mpx-linux \
 	i386/i386-avx-avx512 i386/i386-avx-avx512-linux \
-	i386/i386-avx-mpx-avx512 i386/i386-avx-mpx-avx512-linux \
+	i386/i386-avx-mpx-avx512-pku i386/i386-avx-mpx-avx512-pku-linux \
 	i386/amd64-avx i386/amd64-avx-linux \
 	i386/amd64-mpx i386/amd64-mpx-linux \
 	i386/amd64-avx-mpx i386/amd64-avx-mpx-linux \
 	i386/amd64-avx-avx512 i386/amd64-avx-avx512-linux \
-	i386/amd64-avx-mpx-avx512 i386/amd64-avx-mpx-avx512-linux \
+	i386/amd64-avx-mpx-avx512-pku i386/amd64-avx-mpx-avx512-pku-linux \
 	i386/x32 i386/x32-linux \
 	i386/x32-avx i386/x32-avx-linux \
 	i386/x32-avx-avx512 i386/x32-avx-avx512-linux \
@@ -142,8 +142,8 @@ XMLTOC = \
 	i386/amd64-avx.xml \
 	i386/amd64-avx-avx512-linux.xml \
 	i386/amd64-avx-avx512.xml \
-	i386/amd64-avx-mpx-avx512-linux.xml \
-	i386/amd64-avx-mpx-avx512.xml \
+	i386/amd64-avx-mpx-avx512-pku-linux.xml \
+	i386/amd64-avx-mpx-avx512-pku.xml \
 	i386/amd64-linux.xml \
 	i386/amd64-mpx-linux.xml \
 	i386/amd64-mpx.xml \
@@ -154,8 +154,8 @@ XMLTOC = \
 	i386/i386-avx.xml \
 	i386/i386-avx-avx512-linux.xml \
 	i386/i386-avx-avx512.xml \
-	i386/i386-avx-mpx-avx512-linux.xml \
-	i386/i386-avx-mpx-avx512.xml \
+	i386/i386-avx-mpx-avx512-pku-linux.xml \
+	i386/i386-avx-mpx-avx512-pku.xml \
 	i386/i386-linux.xml \
 	i386/i386-mmx-linux.xml \
 	i386/i386-mmx.xml \
@@ -281,10 +281,12 @@ $(outdir)/i386/i386-avx-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
 			       i386/32bit-avx512.xml
 $(outdir)/i386/i386-avx-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
 			       i386/32bit-linux.xml i386/32bit-avx512.xml
-$(outdir)/i386/i386-avx-mpx-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
-			       i386/32bit-mpx.xml i386/32bit-avx512.xml
-$(outdir)/i386/i386-avx-mpx-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
-			       i386/32bit-linux.xml i386/32bit-mpx.xml i386/32bit-avx512.xml
+$(outdir)/i386/i386-avx-mpx-avx512-pku.dat: i386/32bit-core.xml
+			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml \
+			       i386/32bit-pkeys.xml
+$(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml \
+			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml \
+			       i386/32bit-pkeys.xml i386/32bit-linux.xml
 $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml 
 $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml i386/32bit-linux.xml
 $(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml
@@ -302,11 +304,13 @@ $(outdir)/i386/amd64-avx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-avx512.xml
 $(outdir)/i386/amd64-avx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-avx512.xml i386/64bit-linux.xml
-$(outdir)/i386/amd64-avx-mpx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml i386/64bit-avx512.xml
-$(outdir)/i386/amd64-avx-mpx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml i386/64bit-avx512.xml \
-			       i386/64bit-linux.xml i386/64bit-segments.xml
+$(outdir)/i386/amd64-avx-mpx-avx512-pku.dat: i386/64bit-core.xml \
+			       i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \
+			       i386/64bit-pkeys.xml
+$(outdir)/i386/amd64-avx-mpx-avx512-pku-linux.dat: i386/64bit-core.xml \
+			       i386/64bit-avx.xml i386/64bit-mpx.xml i386/64bit-avx512.xml \
+			       i386/64bit-linux.xml i386/64bit-segments.xml \
+			       i386/64bit-pkeys.xml
 $(outdir)/i386/x32.dat: i386/x32-core.xml i386/64bit-sse.xml
 $(outdir)/i386/x32-linux.dat: i386/x32-core.xml i386/64bit-sse.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
diff --git a/gdb/features/i386/32bit-pkeys.xml b/gdb/features/i386/32bit-pkeys.xml
new file mode 100644
index 0000000..7ae5cc5
--- /dev/null
+++ b/gdb/features/i386/32bit-pkeys.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2016-2017 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.i386.pkeys">
+
+  <reg name="pkru" bitsize="32" type="uint32"/>
+
+</feature>
diff --git a/gdb/features/i386/64bit-pkeys.xml b/gdb/features/i386/64bit-pkeys.xml
new file mode 100644
index 0000000..7ae5cc5
--- /dev/null
+++ b/gdb/features/i386/64bit-pkeys.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2016-2017 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.i386.pkeys">
+
+  <reg name="pkru" bitsize="32" type="uint32"/>
+
+</feature>
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-linux.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
similarity index 97%
rename from gdb/features/i386/amd64-avx-mpx-avx512-linux.c
rename to gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
index dd1f100..248eff7 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-linux.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-mpx-avx512-linux.xml */
+  Original: amd64-avx-mpx-avx512-pku-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
+struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
 static void
-initialize_tdesc_amd64_avx_mpx_avx512_linux (void)
+initialize_tdesc_amd64_avx_mpx_avx512_pku_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -322,5 +322,8 @@ initialize_tdesc_amd64_avx_mpx_avx512_linux (void)
   tdesc_create_reg (feature, "zmm30h", 152, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 153, 1, NULL, 256, "v2ui128");
 
-  tdesc_amd64_avx_mpx_avx512_linux = result;
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  tdesc_create_reg (feature, "pkru", 152, 1, NULL, 32, "uint32");
+
+  tdesc_amd64_avx_mpx_avx512_pku_linux = result;
 }
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512-linux.xml b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.xml
similarity index 83%
rename from gdb/features/i386/amd64-avx-mpx-avx512-linux.xml
rename to gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.xml
index 21d0664..9585606 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512-linux.xml
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku-linux.xml
@@ -5,7 +5,8 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- AMD64 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
+<!-- AMD64 with AVX, MPX, AVX512, PKEYS - Includes Linux-only
+     special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -18,4 +19,5 @@
   <xi:include href="64bit-avx.xml"/>
   <xi:include href="64bit-mpx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
+  <xi:include href="64bit-pkeys.xml"/>
 </target>
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512.c b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
similarity index 98%
rename from gdb/features/i386/amd64-avx-mpx-avx512.c
rename to gdb/features/i386/amd64-avx-mpx-avx512-pku.c
index 486931f..dfe7d77 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512.c
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: amd64-avx-mpx-avx512.xml */
+  Original: amd64-avx-mpx-avx512-pku.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_amd64_avx_mpx_avx512;
+struct target_desc *tdesc_amd64_avx_mpx_avx512_pku;
 static void
-initialize_tdesc_amd64_avx_mpx_avx512 (void)
+initialize_tdesc_amd64_avx_mpx_avx512_pku (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -313,5 +313,8 @@ initialize_tdesc_amd64_avx_mpx_avx512 (void)
   tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128");
 
-  tdesc_amd64_avx_mpx_avx512 = result;
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  tdesc_create_reg (feature, "pkru", 151, 1, NULL, 32, "uint32");
+
+  tdesc_amd64_avx_mpx_avx512_pku = result;
 }
diff --git a/gdb/features/i386/amd64-avx-mpx-avx512.xml b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
similarity index 87%
rename from gdb/features/i386/amd64-avx-mpx-avx512.xml
rename to gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
index 482111e..e769108 100644
--- a/gdb/features/i386/amd64-avx-mpx-avx512.xml
+++ b/gdb/features/i386/amd64-avx-mpx-avx512-pku.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- AMD64 with AVX, MPX, AVX512 -->
+<!-- AMD64 with AVX, MPX, AVX512, PKEYS -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -15,4 +15,5 @@
   <xi:include href="64bit-avx.xml"/>
   <xi:include href="64bit-mpx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
+  <xi:include href="64bit-pkeys.xml"/>
 </target>
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-linux.c b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
similarity index 96%
rename from gdb/features/i386/i386-avx-mpx-avx512-linux.c
rename to gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
index 0fa3552..f90c834 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-linux.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-mpx-avx512-linux.xml */
+  Original: i386-avx-mpx-avx512-pku-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
+struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
 static void
-initialize_tdesc_i386_avx_mpx_avx512_linux (void)
+initialize_tdesc_i386_avx_mpx_avx512_pku_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -204,5 +204,8 @@ initialize_tdesc_i386_avx_mpx_avx512_linux (void)
   tdesc_create_reg (feature, "zmm6h", 70, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm7h", 71, 1, NULL, 256, "v2ui128");
 
-  tdesc_i386_avx_mpx_avx512_linux = result;
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  tdesc_create_reg (feature, "pkru", 72, 1, NULL, 32, "uint32");
+
+  tdesc_i386_avx_mpx_avx512_pku_linux = result;
 }
diff --git a/gdb/features/i386/i386-avx-mpx-avx512-linux.xml b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.xml
similarity index 82%
rename from gdb/features/i386/i386-avx-mpx-avx512-linux.xml
rename to gdb/features/i386/i386-avx-mpx-avx512-pku-linux.xml
index 2617eab..1ef709a 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512-linux.xml
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku-linux.xml
@@ -5,7 +5,8 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- I386 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
+<!-- I386 with AVX, MPX, AVX512, PKEYS - Includes Linux-only
+     special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -17,4 +18,5 @@
   <xi:include href="32bit-avx.xml"/>
   <xi:include href="32bit-mpx.xml"/>
   <xi:include href="32bit-avx512.xml"/>
+  <xi:include href="32bit-pkeys.xml"/>
 </target>
diff --git a/gdb/features/i386/i386-avx-mpx-avx512.c b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
similarity index 96%
rename from gdb/features/i386/i386-avx-mpx-avx512.c
rename to gdb/features/i386/i386-avx-mpx-avx512-pku.c
index ad5ac3b..08d9b4b 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512.c
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: i386-avx-mpx-avx512.xml */
+  Original: i386-avx-mpx-avx512-pku.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_i386_avx_mpx_avx512;
+struct target_desc *tdesc_i386_avx_mpx_avx512_pku;
 static void
-initialize_tdesc_i386_avx_mpx_avx512 (void)
+initialize_tdesc_i386_avx_mpx_avx512_pku (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -199,5 +199,8 @@ initialize_tdesc_i386_avx_mpx_avx512 (void)
   tdesc_create_reg (feature, "zmm6h", 69, 1, NULL, 256, "v2ui128");
   tdesc_create_reg (feature, "zmm7h", 70, 1, NULL, 256, "v2ui128");
 
-  tdesc_i386_avx_mpx_avx512 = result;
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.pkeys");
+  tdesc_create_reg (feature, "pkru", 71, 1, NULL, 32, "uint32");
+
+  tdesc_i386_avx_mpx_avx512_pku = result;
 }
diff --git a/gdb/features/i386/i386-avx-mpx-avx512.xml b/gdb/features/i386/i386-avx-mpx-avx512-pku.xml
similarity index 87%
rename from gdb/features/i386/i386-avx-mpx-avx512.xml
rename to gdb/features/i386/i386-avx-mpx-avx512-pku.xml
index 392cc1b..cbf78e1 100644
--- a/gdb/features/i386/i386-avx-mpx-avx512.xml
+++ b/gdb/features/i386/i386-avx-mpx-avx512-pku.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- I386 with AVX, MPX, AVX512 -->
+<!-- I386 with AVX, MPX, AVX512, PKEYS -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -15,4 +15,5 @@
   <xi:include href="32bit-avx.xml"/>
   <xi:include href="32bit-mpx.xml"/>
   <xi:include href="32bit-avx512.xml"/>
+  <xi:include href="32bit-pkeys.xml"/>
 </target>
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 37a9514..c2354d2 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -446,12 +446,12 @@ clean:
 	rm -f i386-mpx.c i386-mpx-linux.c
 	rm -f i386-avx-mpx.c i386-avx-mpx-linux.c
 	rm -f i386-avx-avx512.c i386-avx-avx512-linux.c
-	rm -f i386-avx-mpx-avx512.c i386-avx-mpx-avx512-linux.c
+	rm -f i386-avx-mpx-avx512-pku.c i386-avx-mpx-avx512-pku-linux.c
 	rm -f amd64-avx.c amd64-avx-linux.c
 	rm -f amd64-mpx.c amd64-mpx-linux.c
 	rm -f amd64-avx-mpx.c amd64-avx-mpx-linux.c
 	rm -f amd64-avx-avx512.c amd64-avx-avx512-linux.c
-	rm -f amd64-avx-mpx-avx512.c amd64-avx-mpx-avx512-linux.c
+	rm -f amd64-avx-mpx-avx512-pku.c amd64-avx-mpx-avx512-pku-linux.c
 	rm -f i386-mmx.c i386-mmx-linux.c
 	rm -f x32.c x32-linux.c
 	rm -f x32-avx.c x32-avx-linux.c
@@ -582,7 +582,7 @@ i386-avx-mpx-linux-ipa.o: i386-avx-mpx-linux.c
 i386-avx-avx512-linux-ipa.o: i386-avx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
-i386-avx-mpx-avx512-linux-ipa.o: i386-avx-mpx-avx512-linux.c
+i386-avx-mpx-avx512-pku-linux-ipa.o: i386-avx-mpx-avx512-pku-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 linux-i386-ipa.o: linux-i386-ipa.c
@@ -606,7 +606,7 @@ amd64-avx-mpx-linux-ipa.o: amd64-avx-mpx-linux.c
 amd64-avx-avx512-linux-ipa.o: amd64-avx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
-amd64-avx-mpx-avx512-linux-ipa.o: amd64-avx-mpx-avx512-linux.c
+amd64-avx-mpx-avx512-pku-linux-ipa.o: amd64-avx-mpx-avx512-pku-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 linux-aarch64-ipa.o: linux-aarch64-ipa.c
@@ -906,14 +906,14 @@ i386-avx-avx512.c : $(srcdir)/../regformats/i386/i386-avx-avx512.dat $(regdat_sh
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-avx512.dat i386-avx-avx512.c
 i386-avx-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx-avx512-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-avx512-linux.dat i386-avx-avx512-linux.c
-i386-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat i386-avx-mpx-avx512.c
-i386-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-linux.dat i386-avx-mpx-avx512-linux.c
 i386-mpx.c : $(srcdir)/../regformats/i386/i386-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-mpx.dat i386-mpx.c
 i386-mpx-linux.c : $(srcdir)/../regformats/i386/i386-mpx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-mpx-linux.dat i386-mpx-linux.c
+i386-avx-mpx-avx512-pku.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-pku.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-pku.dat i386-avx-mpx-avx512-pku.c
+i386-avx-mpx-avx512-pku-linux.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-pku-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-pku-linux.dat i386-avx-mpx-avx512-pku-linux.c
 i386-avx-mpx.c : $(srcdir)/../regformats/i386/i386-avx-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx.dat i386-avx-mpx.c
 i386-avx-mpx-linux.c : $(srcdir)/../regformats/i386/i386-avx-mpx-linux.dat $(regdat_sh)
@@ -1028,14 +1028,14 @@ amd64-avx-avx512.c : $(srcdir)/../regformats/i386/amd64-avx-avx512.dat $(regdat_
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-avx512.dat amd64-avx-avx512.c
 amd64-avx-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx-avx512-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-avx512-linux.dat amd64-avx-avx512-linux.c
-amd64-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat amd64-avx-mpx-avx512.c
-amd64-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-linux.dat amd64-avx-mpx-avx512-linux.c
 amd64-mpx.c : $(srcdir)/../regformats/i386/amd64-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-mpx.dat amd64-mpx.c
 amd64-mpx-linux.c : $(srcdir)/../regformats/i386/amd64-mpx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-mpx-linux.dat amd64-mpx-linux.c
+amd64-avx-mpx-avx512-pku.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-pku.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-pku.dat amd64-avx-mpx-avx512-pku.c
+amd64-avx-mpx-avx512-pku-linux.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat amd64-avx-mpx-avx512-pku-linux.c
 amd64-avx-mpx.c : $(srcdir)/../regformats/i386/amd64-avx-mpx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx.dat amd64-avx-mpx.c
 amd64-avx-mpx-linux.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-linux.dat $(regdat_sh)
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 9390cb1..d00d9e2 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -24,21 +24,21 @@
 # Default hostio_last_error implementation
 srv_hostio_err_objs="hostio-errno.o"
 
-srv_i386_regobj="i386.o i386-avx.o i386-avx-avx512.o i386-avx-mpx-avx512.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
-srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
-srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-avx512.o amd64-avx-mpx-avx512.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-avx512.o"
-srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
+srv_i386_regobj="i386.o i386-avx.o i386-avx-avx512.o i386-avx-mpx-avx512-pku.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
+srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-pku-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
+srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-avx512.o amd64-avx-mpx-avx512-pku.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-avx512.o"
+srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-pku-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
 
-ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-avx512-linux-ipa.o i386-avx-mpx-avx512-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
-ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-avx512-linux-ipa.o amd64-avx-mpx-avx512-linux-ipa.o amd64-mpx-linux-ipa.o"
+ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-avx512-linux-ipa.o i386-avx-mpx-avx512-pku-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
+ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-avx512-linux-ipa.o amd64-avx-mpx-avx512-pku-linux-ipa.o amd64-mpx-linux-ipa.o"
 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"
 
-srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml i386/32bit-avx512.xml i386/32bit-mpx.xml"
-srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-sse.xml i386/64bit-avx.xml i386/64bit-avx512.xml i386/x32-core.xml i386/64bit-mpx.xml"
-srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-avx512.xml i386/i386-avx-mpx-avx512.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
-srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-avx512-linux.xml i386/i386-avx-mpx-avx512-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
+srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml i386/32bit-avx512.xml i386/32bit-mpx.xml i386/32bit-pkeys.xml"
+srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-sse.xml i386/64bit-avx.xml i386/64bit-avx512.xml i386/x32-core.xml i386/64bit-mpx.xml i386/64bit-pkeys.xml"
+srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-avx512.xml i386/i386-avx-mpx-avx512-pku.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
+srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-avx512-linux.xml i386/i386-avx-mpx-avx512-pku-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-pku-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
 
 
 # Linux object files.  This is so we don't have to repeat
diff --git a/gdb/gdbserver/i387-fp.c b/gdb/gdbserver/i387-fp.c
index 8267045..5f5cbda 100644
--- a/gdb/gdbserver/i387-fp.c
+++ b/gdb/gdbserver/i387-fp.c
@@ -27,6 +27,7 @@ static const int num_avx512_zmmh_low_registers = 16;
 static const int num_avx512_zmmh_high_registers = 16;
 static const int num_avx512_ymmh_registers = 16;
 static const int num_avx512_xmm_registers = 16;
+static const int num_pkeys_registers = 1;
 
 /* Note: These functions preserve the reserved bits in control registers.
    However, gdbserver promptly throws away that information.  */
@@ -136,6 +137,10 @@ struct i387_xsave {
 
   /* Space for 16 512-bit zmm16-31 values.  */
   unsigned char zmmh_high_space[1024];
+
+  /* Space for 1 32-bit PKRU register.  The HW XSTATE size for this feature is
+     actually 64 bits, but WRPKRU/RDPKRU instructions ignore upper 32 bits.  */
+  unsigned char pkru_space[8];
 };
 
 void
@@ -325,6 +330,10 @@ i387_cache_to_xsave (struct regcache *regcache, void *buf)
 	  for (i = 0; i < num_avx512_ymmh_registers; i++)
 	    memset (((char *) &fp->zmmh_high_space[0]) + 16 + i * 64, 0, 16);
 	}
+
+      if ((clear_bv & X86_XSTATE_PKRU))
+	for (i = 0; i < num_pkeys_registers; i++)
+	  memset (((char *) &fp->pkru_space[0]) + i * 4, 0, 4);
     }
 
   /* Check if any x87 registers are changed.  */
@@ -497,6 +506,23 @@ i387_cache_to_xsave (struct regcache *regcache, void *buf)
 	}
     }
 
+  /* Check if any PKEYS registers are changed.  */
+  if ((x86_xcr0 & X86_XSTATE_PKRU))
+    {
+      int pkru_regnum = find_regno (regcache->tdesc, "pkru");
+
+      for (i = 0; i < num_pkeys_registers; i++)
+	{
+	  collect_register (regcache, i + pkru_regnum, raw);
+	  p = ((char *) &fp->pkru_space[0]) + i * 4;
+	  if (memcmp (raw, p, 4) != 0)
+	    {
+	      xstate_bv |= X86_XSTATE_PKRU;
+	      memcpy (p, raw, 4);
+	    }
+	}
+    }
+
   /* Update the corresponding bits in xstate_bv if any SSE/AVX
      registers are changed.  */
   fp->xstate_bv |= xstate_bv;
@@ -801,6 +827,23 @@ i387_xsave_to_cache (struct regcache *regcache, const void *buf)
 	}
     }
 
+  if ((x86_xcr0 & X86_XSTATE_PKRU) != 0)
+    {
+      int pkru_regnum = find_regno (regcache->tdesc, "pkru");
+
+      if ((clear_bv & X86_XSTATE_PKRU) != 0)
+	{
+	  for (i = 0; i < num_pkeys_registers; i++)
+	    supply_register_zeroed (regcache, i + pkru_regnum);
+	}
+      else
+	{
+	  p = (gdb_byte *) &fp->pkru_space[0];
+	  for (i = 0; i < num_pkeys_registers; i++)
+	    supply_register (regcache, i + pkru_regnum, p + i * 4);
+	}
+    }
+
   supply_register_by_name (regcache, "fioff", &fp->fioff);
   supply_register_by_name (regcache, "fooff", &fp->fooff);
   supply_register_by_name (regcache, "mxcsr", &fp->mxcsr);
diff --git a/gdb/gdbserver/linux-amd64-ipa.c b/gdb/gdbserver/linux-amd64-ipa.c
index c00b77a..67f36c2 100644
--- a/gdb/gdbserver/linux-amd64-ipa.c
+++ b/gdb/gdbserver/linux-amd64-ipa.c
@@ -197,8 +197,8 @@ get_ipa_tdesc (int idx)
       return tdesc_amd64_mpx_linux;
     case X86_TDESC_AVX_MPX:
       return tdesc_amd64_avx_mpx_linux;
-    case X86_TDESC_AVX_MPX_AVX512:
-      return tdesc_amd64_avx_mpx_avx512_linux;
+    case X86_TDESC_AVX_MPX_AVX512_PKU:
+      return tdesc_amd64_avx_mpx_avx512_pku_linux;
     case X86_TDESC_AVX_AVX512:
       return tdesc_amd64_avx_avx512_linux;
     default:
@@ -286,5 +286,6 @@ initialize_low_tracepoint (void)
   init_registers_amd64_mpx_linux ();
   init_registers_amd64_avx_mpx_linux ();
   init_registers_amd64_avx_avx512_linux ();
+  init_registers_amd64_avx_mpx_avx512_pku_linux ();
 #endif
 }
diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c
index aa16f85..e9ac78b 100644
--- a/gdb/gdbserver/linux-i386-ipa.c
+++ b/gdb/gdbserver/linux-i386-ipa.c
@@ -264,8 +264,8 @@ get_ipa_tdesc (int idx)
       return tdesc_i386_avx_mpx_linux;
     case X86_TDESC_AVX_AVX512:
       return tdesc_i386_avx_avx512_linux;
-    case X86_TDESC_AVX_MPX_AVX512:
-      return tdesc_i386_avx_mpx_avx512_linux;
+    case X86_TDESC_AVX_MPX_AVX512_PKU:
+      return tdesc_i386_avx_mpx_avx512_pku_linux;
     default:
       internal_error (__FILE__, __LINE__,
 		      "unknown ipa tdesc index: %d", idx);
@@ -296,7 +296,7 @@ initialize_low_tracepoint (void)
   init_registers_i386_avx_linux ();
   init_registers_i386_mpx_linux ();
   init_registers_i386_avx_avx512_linux ();
-  init_registers_i386_avx_mpx_avx512_linux ();
+  init_registers_i386_avx_mpx_avx512_pku_linux ();
 
   initialize_fast_tracepoint_trampoline_buffer ();
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index f946cf4..6df1d51 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -148,7 +148,8 @@ static const int x86_64_regmap[] =
   -1, -1, -1, -1, -1, -1, -1, -1,       /* zmm0 ... zmm31 (AVX512)  */
   -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1					/* pkru  */
 };
 
 #define X86_64_NUM_REGS (sizeof (x86_64_regmap) / sizeof (x86_64_regmap[0]))
@@ -822,8 +823,8 @@ x86_linux_read_description (void)
 	    {
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
-		case X86_XSTATE_AVX_MPX_AVX512_MASK:
-		  return tdesc_amd64_avx_mpx_avx512_linux;
+		case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+		  return tdesc_amd64_avx_mpx_avx512_pku_linux;
 
 		case X86_XSTATE_AVX_AVX512_MASK:
 		  return tdesc_amd64_avx_avx512_linux;
@@ -850,7 +851,10 @@ x86_linux_read_description (void)
 	    {
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
-		case X86_XSTATE_AVX_MPX_AVX512_MASK: /* No MPX on x32.  */
+		case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+		  /* No x32 MPX and PKU, fall back to avx_avx512.  */
+		  return tdesc_x32_avx_avx512_linux;
+
 		case X86_XSTATE_AVX_AVX512_MASK:
 		  return tdesc_x32_avx_avx512_linux;
 
@@ -873,8 +877,8 @@ x86_linux_read_description (void)
 	{
 	  switch (xcr0 & X86_XSTATE_ALL_MASK)
 	    {
-	    case (X86_XSTATE_AVX_MPX_AVX512_MASK):
-	      return tdesc_i386_avx_mpx_avx512_linux;
+	    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+	      return tdesc_i386_avx_mpx_avx512_pku_linux;
 
 	    case (X86_XSTATE_AVX_AVX512_MASK):
 	      return tdesc_i386_avx_avx512_linux;
@@ -2902,8 +2906,8 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_MPX;
   if (tdesc == tdesc_amd64_avx_mpx_linux)
     return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_amd64_avx_mpx_avx512_linux || tdesc == tdesc_x32_avx_avx512_linux)
-    return X86_TDESC_AVX_MPX_AVX512;
+  if (tdesc == tdesc_amd64_avx_mpx_avx512_pku_linux || tdesc == tdesc_x32_avx_avx512_linux)
+    return X86_TDESC_AVX_MPX_AVX512_PKU;
   if (tdesc == tdesc_amd64_avx_avx512_linux)
     return X86_TDESC_AVX_AVX512;
 #endif
@@ -2918,8 +2922,8 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_MPX;
   if (tdesc == tdesc_i386_avx_mpx_linux)
     return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_i386_avx_mpx_avx512_linux)
-    return X86_TDESC_AVX_MPX_AVX512;
+  if (tdesc == tdesc_i386_avx_mpx_avx512_pku_linux)
+    return X86_TDESC_AVX_MPX_AVX512_PKU;
   if (tdesc == tdesc_i386_avx_avx512_linux)
     return X86_TDESC_AVX_AVX512;
 
@@ -2982,7 +2986,7 @@ initialize_low_arch (void)
   init_registers_amd64_mpx_linux ();
   init_registers_amd64_avx_mpx_linux ();
   init_registers_amd64_avx_avx512_linux ();
-  init_registers_amd64_avx_mpx_avx512_linux ();
+  init_registers_amd64_avx_mpx_avx512_pku_linux ();
 
   init_registers_x32_linux ();
   init_registers_x32_avx_linux ();
@@ -2998,7 +3002,7 @@ initialize_low_arch (void)
   init_registers_i386_mpx_linux ();
   init_registers_i386_avx_mpx_linux ();
   init_registers_i386_avx_avx512_linux ();
-  init_registers_i386_avx_mpx_avx512_linux ();
+  init_registers_i386_avx_mpx_avx512_pku_linux ();
 
   tdesc_i386_linux_no_xml = XNEW (struct target_desc);
   copy_target_description (tdesc_i386_linux_no_xml, tdesc_i386_linux);
diff --git a/gdb/gdbserver/linux-x86-tdesc.h b/gdb/gdbserver/linux-x86-tdesc.h
index 96966c3..bbe4078 100644
--- a/gdb/gdbserver/linux-x86-tdesc.h
+++ b/gdb/gdbserver/linux-x86-tdesc.h
@@ -29,7 +29,7 @@ enum x86_linux_tdesc {
   X86_TDESC_MPX = 3,
   X86_TDESC_AVX_MPX = 4,
   X86_TDESC_AVX_AVX512 = 5,
-  X86_TDESC_AVX_MPX_AVX512 = 6,
+  X86_TDESC_AVX_MPX_AVX512_PKU = 6,
 };
 
 #ifdef __x86_64__
@@ -47,9 +47,9 @@ extern const struct target_desc *tdesc_amd64_avx_linux;
 void init_registers_amd64_avx_avx512_linux (void);
 extern const struct target_desc *tdesc_amd64_avx_avx512_linux;
 
-/* Defined in auto-generated file amd64-avx-mpx-avx512-linux.c.  */
-void init_registers_amd64_avx_mpx_avx512_linux (void);
-extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
+/* Defined in auto-generated file amd64-avx-mpx-avx512-pku-linux.c.  */
+void init_registers_amd64_avx_mpx_avx512_pku_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_pku_linux;
 
 /* Defined in auto-generated file amd64-avx-mpx-linux.c.  */
 void init_registers_amd64_avx_mpx_linux (void);
@@ -98,8 +98,8 @@ void init_registers_i386_avx_avx512_linux (void);
 extern const struct target_desc *tdesc_i386_avx_avx512_linux;
 
 /* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
-void init_registers_i386_avx_mpx_avx512_linux (void);
-extern const struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
+void init_registers_i386_avx_mpx_avx512_pku_linux (void);
+extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
 
 /* Defined in auto-generated file i386-mpx-linux.c.  */
 void init_registers_i386_mpx_linux (void);
diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c
index f86fac3..2c4963b 100644
--- a/gdb/i386-linux-nat.c
+++ b/gdb/i386-linux-nat.c
@@ -59,7 +59,7 @@
   (I386_ST0_REGNUM <= (regno) && (regno) < I386_SSE_NUM_REGS)
 
 #define GETXSTATEREGS_SUPPLIES(regno) \
-  (I386_ST0_REGNUM <= (regno) && (regno) < I386_AVX512_NUM_REGS)
+  (I386_ST0_REGNUM <= (regno) && (regno) < I386_PKEYS_NUM_REGS)
 
 /* Does the current host support the GETREGS request?  */
 int have_ptrace_getregs =
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index 66828f5..1909d61 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -51,7 +51,7 @@
 #include "features/i386/i386-avx-mpx-linux.c"
 #include "features/i386/i386-avx-linux.c"
 #include "features/i386/i386-avx-avx512-linux.c"
-#include "features/i386/i386-avx-mpx-avx512-linux.c"
+#include "features/i386/i386-avx-mpx-avx512-pku-linux.c"
 
 /* Return non-zero, when the register is in the corresponding register
    group.  Put the LINUX_ORIG_EAX register in the system group.  */
@@ -613,6 +613,7 @@ int i386_linux_gregset_reg_offset[] =
   -1, -1,			  /* MPX registers BNDCFGU, BNDSTATUS.  */
   -1, -1, -1, -1, -1, -1, -1, -1, /* k0 ... k7 (AVX512)  */
   -1, -1, -1, -1, -1, -1, -1, -1, /* zmm0 ... zmm7 (AVX512)  */
+  -1,				  /* PKRU register  */
   11 * 4,			  /* "orig_eax"  */
 };
 
@@ -689,8 +690,8 @@ i386_linux_core_read_description (struct gdbarch *gdbarch,
 
   switch ((xcr0 & X86_XSTATE_ALL_MASK))
     {
-    case X86_XSTATE_AVX_MPX_AVX512_MASK:
-      return tdesc_i386_avx_mpx_avx512_linux;
+    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+      return tdesc_i386_avx_mpx_avx512_pku_linux;
     case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_i386_avx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
@@ -1089,5 +1090,5 @@ _initialize_i386_linux_tdep (void)
   initialize_tdesc_i386_mpx_linux ();
   initialize_tdesc_i386_avx_mpx_linux ();
   initialize_tdesc_i386_avx_avx512_linux ();
-  initialize_tdesc_i386_avx_mpx_avx512_linux ();
+  initialize_tdesc_i386_avx_mpx_avx512_pku_linux ();
 }
diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h
index 06190fa..8d4c7ca 100644
--- a/gdb/i386-linux-tdep.h
+++ b/gdb/i386-linux-tdep.h
@@ -29,7 +29,7 @@
 /* Register number for the "orig_eax" pseudo-register.  If this
    pseudo-register contains a value >= 0 it is interpreted as the
    system call number that the kernel is supposed to restart.  */
-#define I386_LINUX_ORIG_EAX_REGNUM (I386_ZMM7H_REGNUM + 1)
+#define I386_LINUX_ORIG_EAX_REGNUM (I386_PKRU_REGNUM + 1)
 
 /* Total number of registers for GNU/Linux.  */
 #define I386_LINUX_NUM_REGS (I386_LINUX_ORIG_EAX_REGNUM + 1)
@@ -49,7 +49,7 @@ extern struct target_desc *tdesc_i386_avx_linux;
 extern struct target_desc *tdesc_i386_mpx_linux;
 extern struct target_desc *tdesc_i386_avx_mpx_linux;
 extern struct target_desc *tdesc_i386_avx_avx512_linux;
-extern struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
+extern struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
 
 /* Format of XSAVE extended state is:
  	struct
@@ -63,6 +63,7 @@ extern struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
 	  avx512_zmmh_regs0-7[1153..1407]
 	  avx512_zmmh_regs8-15[1408..1663]
 	  avx512_zmm_regs16-31[1664..2687]
+	  pkru[2688..2752]
 	  future_state etc
 	};
 
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index f66dcc0..54a7ccf 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -55,7 +55,7 @@
 #include "features/i386/i386-mpx.c"
 #include "features/i386/i386-avx-mpx.c"
 #include "features/i386/i386-avx-avx512.c"
-#include "features/i386/i386-avx-mpx-avx512.c"
+#include "features/i386/i386-avx-mpx-avx512-pku.c"
 #include "features/i386/i386-mmx.c"
 
 #include "ax.h"
@@ -121,6 +121,11 @@ static const char *i386_mpx_names[] =
   "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus"
 };
 
+static const char* i386_pkeys_names[] =
+{
+  "pkru"
+};
+
 /* Register names for MPX pseudo-registers.  */
 
 static const char *i386_bnd_names[] =
@@ -415,6 +420,21 @@ i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
   return regnum >= 0 && regnum < I387_NUM_MPX_CTRL_REGS;
 }
 
+/* PKRU register?  */
+
+bool
+i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int pkru_regnum = tdep->pkru_regnum;
+
+  if (pkru_regnum < 0)
+    return false;
+
+  regnum -= pkru_regnum;
+  return regnum >= 0 && regnum < I387_NUM_PKEYS_REGS;
+}
+
 /* Return the name of register REGNUM, or the empty string if it is
    an anonymous register.  */
 
@@ -4529,7 +4549,7 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
       ymm_regnum_p, ymmh_regnum_p, ymm_avx512_regnum_p, ymmh_avx512_regnum_p,
       bndr_regnum_p, bnd_regnum_p, k_regnum_p, zmm_regnum_p, zmmh_regnum_p,
       zmm_avx512_regnum_p, mpx_ctrl_regnum_p, xmm_avx512_regnum_p,
-      avx512_p, avx_p, sse_p;
+      avx512_p, avx_p, sse_p, pkru_regnum_p;
 
   /* Don't include pseudo registers, except for MMX, in any register
      groups.  */
@@ -4546,6 +4566,7 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
   if (group == i386_mmx_reggroup)
     return mmx_regnum_p;
 
+  pkru_regnum_p = i386_pkru_regnum_p(gdbarch, regnum);
   xmm_regnum_p = i386_xmm_regnum_p (gdbarch, regnum);
   xmm_avx512_regnum_p = i386_xmm_avx512_regnum_p (gdbarch, regnum);
   mxcsr_regnum_p = i386_mxcsr_regnum_p (gdbarch, regnum);
@@ -4617,7 +4638,8 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 	    && !bnd_regnum_p
 	    && !mpx_ctrl_regnum_p
 	    && !zmm_regnum_p
-	    && !zmmh_regnum_p);
+	    && !zmmh_regnum_p
+	    && !pkru_regnum_p);
 
   return default_register_reggroup_p (gdbarch, regnum, group);
 }
@@ -8179,7 +8201,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   const struct tdesc_feature *feature_core;
 
   const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx,
-			     *feature_avx512;
+			     *feature_avx512, *feature_pkeys;
   int i, num_regs, valid_p;
 
   if (! tdesc_has_registers (tdesc))
@@ -8202,6 +8224,9 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
   /* Try AVX512 registers.  */
   feature_avx512 = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx512");
 
+  /* Try PKEYS  */
+  feature_pkeys = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys");
+
   valid_p = 1;
 
   /* The XCR0 bits.  */
@@ -8308,6 +8333,22 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
 	    tdep->mpx_register_names[i]);
     }
 
+  if (feature_pkeys)
+    {
+      tdep->xcr0 |= X86_XSTATE_PKRU;
+      if (tdep->pkru_regnum < 0)
+	{
+	  tdep->pkeys_register_names = i386_pkeys_names;
+	  tdep->pkru_regnum = I386_PKRU_REGNUM;
+	  tdep->num_pkeys_regs = 1;
+	}
+
+      for (i = 0; i < I387_NUM_PKEYS_REGS; i++)
+	valid_p &= tdesc_numbered_register (feature_pkeys, tdesc_data,
+					    I387_PKRU_REGNUM (tdep) + i,
+					    tdep->pkeys_register_names[i]);
+    }
+
   return valid_p;
 }
 
@@ -8503,7 +8544,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Even though the default ABI only includes general-purpose registers,
      floating-point registers and the SSE registers, we have to leave a
      gap for the upper AVX, MPX and AVX512 registers.  */
-  set_gdbarch_num_regs (gdbarch, I386_AVX512_NUM_REGS);
+  set_gdbarch_num_regs (gdbarch, I386_PKEYS_NUM_REGS);
 
   set_gdbarch_gnu_triplet_regexp (gdbarch, i386_gnu_triplet_regexp);
 
@@ -8548,6 +8589,10 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->num_ymm_avx512_regs = 0;
   tdep->num_xmm_avx512_regs = 0;
 
+  /* No PKEYS registers  */
+  tdep->pkru_regnum = -1;
+  tdep->num_pkeys_regs = 0;
+
   tdesc_data = tdesc_data_alloc ();
 
   set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
@@ -8686,8 +8731,8 @@ i386_target_description (uint64_t xcr0)
 {
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
-    case X86_XSTATE_AVX_MPX_AVX512_MASK:
-      return tdesc_i386_avx_mpx_avx512;
+    case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+      return tdesc_i386_avx_mpx_avx512_pku;
     case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_i386_avx_avx512;
     case X86_XSTATE_AVX_MPX_MASK:
@@ -9032,7 +9077,7 @@ Show Intel Memory Protection Extensions specific variables."),
   initialize_tdesc_i386_mpx ();
   initialize_tdesc_i386_avx_mpx ();
   initialize_tdesc_i386_avx_avx512 ();
-  initialize_tdesc_i386_avx_mpx_avx512 ();
+  initialize_tdesc_i386_avx_mpx_avx512_pku ();
 
   /* Tell remote stub that we support XML target description.  */
   register_remote_support_xml ("i386");
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index d4ff7e4..2b11767 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -189,6 +189,15 @@ struct gdbarch_tdep
   /* YMM16-31 register names.  Only used for tdesc_numbered_register.  */
   const char **ymm_avx512_register_names;
 
+  /* Number of PKEYS registers.  */
+  int num_pkeys_regs;
+
+  /* Register number for PKRU register.  */
+  int pkru_regnum;
+
+  /* PKEYS register names.  */
+  const char **pkeys_register_names;
+
   /* Target description.  */
   const struct target_desc *tdesc;
 
@@ -284,7 +293,8 @@ enum i386_regnum
   I386_K0_REGNUM,		/* %k0 */
   I386_K7_REGNUM = I386_K0_REGNUM + 7,
   I386_ZMM0H_REGNUM,		/* %zmm0h */
-  I386_ZMM7H_REGNUM = I386_ZMM0H_REGNUM + 7
+  I386_ZMM7H_REGNUM = I386_ZMM0H_REGNUM + 7,
+  I386_PKRU_REGNUM
 };
 
 /* Register numbers of RECORD_REGMAP.  */
@@ -324,6 +334,7 @@ enum record_i386_regnum
 #define I386_AVX_NUM_REGS	(I386_YMM7H_REGNUM + 1)
 #define I386_MPX_NUM_REGS	(I386_BNDSTATUS_REGNUM + 1)
 #define I386_AVX512_NUM_REGS	(I386_ZMM7H_REGNUM + 1)
+#define I386_PKEYS_NUM_REGS	(I386_PKRU_REGNUM + 1)
 
 /* Size of the largest register.  */
 #define I386_MAX_REGISTER_SIZE	64
@@ -345,6 +356,7 @@ extern int i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum);
 extern int i386_k_regnum_p (struct gdbarch *gdbarch, int regnum);
 extern int i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum);
 extern int i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern bool i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum);
 
 extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch,
 					      int regnum);
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index e3418d7..4fff16f 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -888,6 +888,19 @@ static int xsave_avx512_zmm_h_offset[] =
 #define XSAVE_AVX512_ZMM_H_ADDR(tdep, xsave, regnum) \
   (xsave + xsave_avx512_zmm_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
 
+/* At xsave_pkeys_offset[REGNUM] you find the offset to the location
+   of the PKRU register data structure used by the "xsave"
+   instruction where GDB register REGNUM is stored.  */
+
+static int xsave_pkeys_offset[] =
+{
+2688 + 0 * 8		/* %pkru (64 bits in XSTATE, 32-bit actually used by
+			   instructions and applications).  */
+};
+
+#define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
+(xsave + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
+
 /* Similar to i387_supply_fxsave, but use XSAVE extended state.  */
 
 void
@@ -911,8 +924,9 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
       avx512_zmm_h = 0x20,
       avx512_ymmh_avx512 = 0x40,
       avx512_xmm_avx512 = 0x80,
+      pkeys = 0x100,
       all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
-	    | avx512_ymmh_avx512 | avx512_xmm_avx512
+	    | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
     } regclass;
 
   gdb_assert (regs != NULL);
@@ -921,6 +935,9 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
 
   if (regnum == -1)
     regclass = all;
+  else if (regnum >= I387_PKRU_REGNUM (tdep)
+	   && regnum < I387_PKEYSEND_REGNUM (tdep))
+    regclass = pkeys;
   else if (regnum >= I387_ZMM0H_REGNUM (tdep)
 	   && regnum < I387_ZMMENDH_REGNUM (tdep))
     regclass = avx512_zmm_h;
@@ -977,6 +994,14 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
     case none:
       break;
 
+    case pkeys:
+      if ((clear_bv & X86_XSTATE_PKRU))
+	regcache_raw_supply (regcache, regnum, zero);
+      else
+	regcache_raw_supply (regcache, regnum,
+			     XSAVE_PKEYS_ADDR (tdep, regs, regnum));
+      return;
+
     case avx512_zmm_h:
       if ((clear_bv & (X86_XSTATE_ZMM_H | X86_XSTATE_ZMM)))
 	regcache_raw_supply (regcache, regnum, zero);
@@ -1042,6 +1067,26 @@ i387_supply_xsave (struct regcache *regcache, int regnum,
       return;
 
     case all:
+      /* Handle PKEYS registers.  */
+      if ((tdep->xcr0 & X86_XSTATE_PKRU))
+	{
+	  if ((clear_bv & X86_XSTATE_PKRU))
+	    {
+	      for (i = I387_PKRU_REGNUM (tdep);
+		   i < I387_PKEYSEND_REGNUM (tdep);
+		   i++)
+		regcache_raw_supply (regcache, i, zero);
+	    }
+	  else
+	    {
+	      for (i = I387_PKRU_REGNUM (tdep);
+		   i < I387_PKEYSEND_REGNUM (tdep);
+		   i++)
+		regcache_raw_supply (regcache, i,
+				     XSAVE_PKEYS_ADDR (tdep, regs, i));
+	    }
+	}
+
       /* Handle the upper ZMM registers.  */
       if ((tdep->xcr0 & (X86_XSTATE_ZMM_H | X86_XSTATE_ZMM)))
 	{
@@ -1286,8 +1331,9 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
       avx512_zmm_h = 0x40 | check,
       avx512_ymmh_avx512 = 0x80 | check,
       avx512_xmm_avx512 = 0x100 | check,
+      pkeys = 0x200 | check,
       all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
-	    | avx512_ymmh_avx512 | avx512_xmm_avx512
+	    | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
     } regclass;
 
   gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
@@ -1295,6 +1341,9 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 
   if (regnum == -1)
     regclass = all;
+  else if (regnum >= I387_PKRU_REGNUM (tdep)
+	   && regnum < I387_PKEYSEND_REGNUM (tdep))
+    regclass = pkeys;
   else if (regnum >= I387_ZMM0H_REGNUM (tdep)
 	   && regnum < I387_ZMMENDH_REGNUM (tdep))
     regclass = avx512_zmm_h;
@@ -1348,6 +1397,11 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
       /* Clear register set if its bit in xstat_bv is zero.  */
       if (clear_bv)
 	{
+	  if ((clear_bv & X86_XSTATE_PKRU))
+	    for (i = I387_PKRU_REGNUM (tdep);
+		 i < I387_PKEYSEND_REGNUM (tdep); i++)
+	      memset (XSAVE_PKEYS_ADDR (tdep, regs, i), 0, 4);
+
 	  if ((clear_bv & X86_XSTATE_BNDREGS))
 	    for (i = I387_BND0R_REGNUM (tdep);
 		 i < I387_BNDCFGU_REGNUM (tdep); i++)
@@ -1396,6 +1450,20 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 
       if (regclass == all)
 	{
+	  /* Check if any PKEYS registers are changed.  */
+	  if ((tdep->xcr0 & X86_XSTATE_PKRU))
+	    for (i = I387_PKRU_REGNUM (tdep);
+		 i < I387_PKEYSEND_REGNUM (tdep); i++)
+	      {
+		regcache_raw_collect (regcache, i, raw);
+		p = XSAVE_PKEYS_ADDR (tdep, regs, i);
+		if (memcmp (raw, p, 4) != 0)
+		  {
+		    xstate_bv |= X86_XSTATE_PKRU;
+		    memcpy (p, raw, 4);
+		  }
+	      }
+
 	  /* Check if any ZMMH registers are changed.  */
 	  if ((tdep->xcr0 & (X86_XSTATE_ZMM_H | X86_XSTATE_ZMM)))
 	    for (i = I387_ZMM0H_REGNUM (tdep);
@@ -1531,6 +1599,16 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 	      internal_error (__FILE__, __LINE__,
 			      _("invalid i387 regclass"));
 
+	    case pkeys:
+	      /* This is a PKEYS register.  */
+	      p = XSAVE_PKEYS_ADDR (tdep, regs, regnum);
+	      if (memcmp (raw, p, 4) != 0)
+		{
+		  xstate_bv |= X86_XSTATE_PKRU;
+		  memcpy (p, raw, 4);
+		}
+	      break;
+
 	    case avx512_zmm_h:
 	      /* This is a ZMM register.  */
 	      p = XSAVE_AVX512_ZMM_H_ADDR (tdep, regs, regnum);
@@ -1648,6 +1726,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum,
 	    case avx512_zmm_h:
 	    case avx512_ymmh_avx512:
 	    case avx512_xmm_avx512:
+	    case pkeys:
 	      /* Register REGNUM has been updated.  Return.  */
 	      return;
 	    }
diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h
index 81d45b7..6a97e4f 100644
--- a/gdb/i387-tdep.h
+++ b/gdb/i387-tdep.h
@@ -44,7 +44,9 @@ struct ui_file;
 #define I387_NUM_BND_REGS 4
 #define I387_NUM_MPX_CTRL_REGS 2
 #define I387_NUM_K_REGS 8
+#define I387_NUM_PKEYS_REGS 1
 
+#define I387_PKRU_REGNUM(tdep) ((tdep)->pkru_regnum)
 #define I387_K0_REGNUM(tdep) ((tdep)->k0_regnum)
 #define I387_NUM_ZMMH_REGS(tdep) ((tdep)->num_zmm_regs)
 #define I387_ZMM0H_REGNUM(tdep) ((tdep)->zmm0h_regnum)
@@ -79,6 +81,9 @@ struct ui_file;
 #define I387_XMM_AVX512_END_REGNUM(tdep) \
   (I387_XMM16_REGNUM (tdep) + I387_NUM_XMM_AVX512_REGS (tdep))
 
+#define I387_PKEYSEND_REGNUM(tdep) \
+  (I387_PKRU_REGNUM (tdep) + I387_NUM_PKEYS_REGS)
+
 /* Print out the i387 floating point state.  */
 
 extern void i387_print_float_info (struct gdbarch *gdbarch,
diff --git a/gdb/regformats/i386/amd64-avx-mpx-avx512.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat
similarity index 91%
rename from gdb/regformats/i386/amd64-avx-mpx-avx512.dat
rename to gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat
index fc4bd2d..3ae6b0e 100644
--- a/gdb/regformats/i386/amd64-avx-mpx-avx512.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/amd64-avx-mpx-avx512.xml
-name:amd64_avx_mpx_avx512
-xmltarget:amd64-avx-mpx-avx512.xml
+# Generated from: i386/amd64-avx-mpx-avx512-pku-linux.xml
+name:amd64_avx_mpx_avx512_pku_linux
+xmltarget:amd64-avx-mpx-avx512-pku-linux.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
diff --git a/gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
similarity index 92%
rename from gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat
rename to gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
index 526bca4..88185fd 100644
--- a/gdb/regformats/i386/amd64-avx-mpx-avx512-linux.dat
+++ b/gdb/regformats/i386/amd64-avx-mpx-avx512-pku.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/amd64-avx-mpx-avx512-linux.xml
-name:amd64_avx_mpx_avx512_linux
-xmltarget:amd64-avx-mpx-avx512-linux.xml
+# Generated from: i386/amd64-avx-mpx-avx512-pku.xml
+name:amd64_avx_mpx_avx512_pku
+xmltarget:amd64-avx-mpx-avx512-pku.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
@@ -157,3 +157,4 @@ expedite:rbp,rsp,rip
 256:zmm29h
 256:zmm30h
 256:zmm31h
+32:pkru
diff --git a/gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat b/gdb/regformats/i386/i386-avx-mpx-avx512-pku-linux.dat
similarity index 82%
rename from gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat
rename to gdb/regformats/i386/i386-avx-mpx-avx512-pku-linux.dat
index 2afffa3..515ee10 100644
--- a/gdb/regformats/i386/i386-avx-mpx-avx512-linux.dat
+++ b/gdb/regformats/i386/i386-avx-mpx-avx512-pku-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/i386-avx-mpx-avx512-linux.xml
-name:i386_avx_mpx_avx512_linux
-xmltarget:i386-avx-mpx-avx512-linux.xml
+# Generated from: i386/i386-avx-mpx-avx512-pku-linux.xml
+name:i386_avx_mpx_avx512_pku_linux
+xmltarget:i386-avx-mpx-avx512-pku-linux.xml
 expedite:ebp,esp,eip
 32:eax
 32:ecx
@@ -75,3 +75,4 @@ expedite:ebp,esp,eip
 256:zmm5h
 256:zmm6h
 256:zmm7h
+32:pkru
diff --git a/gdb/regformats/i386/i386-avx-mpx-avx512.dat b/gdb/regformats/i386/i386-avx-mpx-avx512-pku.dat
similarity index 84%
rename from gdb/regformats/i386/i386-avx-mpx-avx512.dat
rename to gdb/regformats/i386/i386-avx-mpx-avx512-pku.dat
index a3c520c..17094b4 100644
--- a/gdb/regformats/i386/i386-avx-mpx-avx512.dat
+++ b/gdb/regformats/i386/i386-avx-mpx-avx512-pku.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/i386-avx-mpx-avx512.xml
-name:i386_avx_mpx_avx512
-xmltarget:i386-avx-mpx-avx512.xml
+# Generated from: i386/i386-avx-mpx-avx512-pku.xml
+name:i386_avx_mpx_avx512_pku
+xmltarget:i386-avx-mpx-avx512-pku.xml
 expedite:ebp,esp,eip
 32:eax
 32:ecx
@@ -74,3 +74,4 @@ expedite:ebp,esp,eip
 256:zmm5h
 256:zmm6h
 256:zmm7h
+32:pkru
diff --git a/gdb/testsuite/gdb.arch/i386-pkru.c b/gdb/testsuite/gdb.arch/i386-pkru.c
new file mode 100644
index 0000000..cec78f5
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-pkru.c
@@ -0,0 +1,90 @@
+/* Test program for PKEYS registers.
+
+   Copyright 2015-2017 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stddef.h>
+#include "x86-cpuid.h"
+
+#ifndef NOINLINE
+#define NOINLINE __attribute__ ((noinline))
+#endif
+
+unsigned int have_pkru (void) NOINLINE;
+
+static inline unsigned long
+rdpkru (void)
+{
+  unsigned int eax, edx;
+  unsigned int ecx = 0;
+  unsigned int pkru;
+
+  asm volatile (".byte 0x0f,0x01,0xee\n\t"
+               : "=a" (eax), "=d" (edx)
+               : "c" (ecx));
+  pkru = eax;
+  return pkru;
+}
+
+static inline void
+wrpkru (unsigned int pkru)
+{
+  unsigned int eax = pkru;
+  unsigned int ecx = 0;
+  unsigned int edx = 0;
+
+  asm volatile (".byte 0x0f,0x01,0xef\n\t"
+               : : "a" (eax), "c" (ecx), "d" (edx));
+}
+
+unsigned int NOINLINE
+have_pkru (void)
+{
+  unsigned int eax, ebx, ecx, edx;
+
+  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+    return 0;
+
+  if ((ecx & bit_OSXSAVE) == bit_OSXSAVE)
+    {
+      if (__get_cpuid_max (0, NULL) < 7)
+	return 0;
+
+      __cpuid_count (7, 0, eax, ebx, ecx, edx);
+
+      if ((ecx & bit_PKU) == bit_PKU)
+	return 1;
+    }
+  return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+  unsigned int wr_value = 0x12345678;
+  unsigned int rd_value = 0x0;
+
+  if (have_pkru ())
+    {
+      wrpkru (wr_value);
+      asm ("nop\n\t");	/* break here 1.  */
+
+      rd_value = rdpkru ();
+      asm ("nop\n\t");	/* break here 2.  */
+    }
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.arch/i386-pkru.exp b/gdb/testsuite/gdb.arch/i386-pkru.exp
new file mode 100644
index 0000000..6c525ab
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-pkru.exp
@@ -0,0 +1,69 @@
+# Copyright 2015-2017 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
+    unsupported "skipping x86 PKEYS tests."
+    return
+}
+
+set comp_flags "-I${srcdir}/../nat/"
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
+     [list debug additional_flags=${comp_flags}]] } {
+    untested "failed to compiler x86 PKEYS test.
+    return -1
+}
+
+if ![runto_main] {
+    untested "could not run to main"
+    return -1
+}
+
+set supports_pkru 0
+set test "probe PKRU support"
+gdb_test_multiple "print have_pkru()" $test {
+    -re ".. = 1\r\n$gdb_prompt $" {
+        pass $test
+        set supports_pkru 1
+    }
+}
+
+if { !$supports_pkru } {
+    unsupported "processor does not support protection key feature."
+    return
+}
+
+# Test pkru register at startup
+# set test_string "0"
+
+gdb_test "print \$pkru" 0 "pkru register"
+
+# Read values from pseudo registers.
+gdb_breakpoint [ gdb_get_line_number "break here 1" ]
+gdb_continue_to_breakpoint "break here 1" ".*break here 1.*"
+
+# set test_string ".*0x12345678.*"
+gdb_test "info register pkru" ".*pkru.*0x12345678.*" "read pkru register"
+
+# set test_string ".*0x44444444.*"
+gdb_test "print /x \$pkru = 0x44444444" "= 0x44444444" "set pkru value"
+gdb_test "info register pkru" ".*pkru.*0x44444444.*" "read value after setting value"
+
+gdb_breakpoint [ gdb_get_line_number "break here 2" ]
+gdb_continue_to_breakpoint "break here 2" ".*break here 2.*"
+
+gdb_test "print /x rd_value" "= 0x44444444" "variable after reading pkru"
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index e6adb4e..40a1b62 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -204,12 +204,12 @@ x86_linux_read_description (struct target_ops *ops)
 #ifdef __x86_64__
       switch (xcr0_features_bits)
 	{
-	case X86_XSTATE_AVX_MPX_AVX512_MASK:
+	case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
 	  if (is_x32)
-	    /* No MPX on x32, fallback to AVX-AVX512.  */
+	    /* No MPX, PKU on x32, fall back to AVX-AVX512.  */
 	    return tdesc_x32_avx_avx512_linux;
 	  else
-	    return tdesc_amd64_avx_mpx_avx512_linux;
+	    return tdesc_amd64_avx_mpx_avx512_pku_linux;
 	case X86_XSTATE_AVX_AVX512_MASK:
 	  if (is_x32)
 	    return tdesc_x32_avx_avx512_linux;
@@ -242,8 +242,8 @@ x86_linux_read_description (struct target_ops *ops)
     {
       switch (xcr0_features_bits)
 	{
-	case X86_XSTATE_AVX_MPX_AVX512_MASK:
-	  return tdesc_i386_avx_mpx_avx512_linux;
+	case X86_XSTATE_AVX_MPX_AVX512_PKU_MASK:
+	  return tdesc_i386_avx_mpx_avx512_pku_linux;
 	case X86_XSTATE_AVX_AVX512_MASK:
 	  return tdesc_i386_avx_avx512_linux;
 	case X86_XSTATE_MPX_MASK:
-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer.
@ 2017-02-01 13:04 Michael Sturm
  2017-02-01 13:03 ` [PATCH 2/5] Change xstate_bv handling to use 8 bytes of data Michael Sturm
                   ` (6 more replies)
  0 siblings, 7 replies; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:04 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

This patch series adds support for the registers added by the
Memory Protection Keys for Userspace (PKU aka PKEYs).
Native and remote debugging are covered by this patch.

The feedback I got during the first review of this patch raised
questions regarding the naming of XSTATE masks and target descriptors.
in addition, Walfred started working on patches that included renaming
of XSTATE masks and target descriptors. These patches have been submitted
by now.
(https://sourceware.org/ml/gdb-patches/2016-04/msg00329.html)
(https://sourceware.org/ml/gdb-patches/2016-04/msg00328.html)

Adressed in V4:
Updated copyrights to 2017 throughout the series.

* [PATCH v3 2/5] Change xstate_bv handling to use 8 bytes of data
  Moved explanatory text from Changelog to commit log.
* [PATCH v3 3/5] Rename target descriptions to reflect actual content
  Removed unneccessary new expedites. Added fs_base/gs_base registers.
* [PATCH v3 5/5] Add support for Intel PKRU register to GDB and GDBserver
  Changed returned type of i386_pkru_regnum_p to bool. 
  Removed "Contributed by..." text.
  Include stddef.h instead of stdio.h in test source file.
  Check for actual value in pkru read back test.

Adressed in V3:
* [PATCH v2 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch
  Added copyright blurb that got lost by accident.
* PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data
  Shortened description of changes in Changelog.
* [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver
  Corrected spurious change in NEWS and some missing spaces in comments.
  Removed some code in the test and improved the output as pointed out by Luis..
  
Adressed in V2:
* [Patch v2 1/5] New patch to sync cpuid bits with GCC as suggested by
  Pedro.
* [PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data:
  Read/write xstate_bc values using endianess-aware functions.
* [PATCH v2 3/5] Rename target descriptions to reflect actual content:
  Addressed comments by Pedro regarding wording in Changelog.
* [PATCH v2 4/5] Add target description for avx-avx512:
  Addressed comments by Pedro regarding Changelog.
  Fixed wording of comments regarding MPX on x32.
  Removed MPX from comment in x32*.xml files.
* [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver:
  Adressed comments by Pedro regarding Changelog.
  Added missing renames in GDBserver ipa-related files.
  Changed test for PKU following comments by Pedro.
  
  
  I'd like to answer Pedro's question regarding the approach of
  adding PKRU to amd64-avx-mpx_avx512-* tdesc and renaming _without_
  keeping a copy without PKU:
  Q: "Is that really the right thing to do?  What about machines that
  _don't_ support pkru?  Shouldn't we keep the older descriptions
  for those?
  A: The first machine to support PKU will have the xstate mask
  X86_XSTATE_AVX_MPX_AVX512_PKU_MASK. 
  The nearest existing xstate masks without PKU are 
  X86_XSTATE_AVX_AVX512_MASK, which was introduced in patch 4 of 
  this series, and X86_XSTATE_AVX_MPX_MASK.
  I've only kept X86_XSTATE_AVX_MPX_AVX512_MASK in patch 4, 
  because it is reused in patch 5 to be renamed to
  X86_XSTATE_AVX_MPX_AVX512_PKU_MASK. 

Michael Sturm (5):
  Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch.
  Change xstate_bv handling to use 8 bytes of data.
  Rename target descriptions to reflect actual content of description.
  Add target description for avx-avx512.
  Add support for Intel PKRU register to GDB and GDBserver.

 gdb/NEWS                                           |   4 +
 gdb/amd64-linux-nat.c                              |   1 +
 gdb/amd64-linux-tdep.c                             |  30 ++-
 gdb/amd64-linux-tdep.h                             |   7 +-
 gdb/amd64-tdep.c                                   |  28 +-
 gdb/amd64-tdep.h                                   |   1 +
 gdb/common/x86-xstate.h                            |  21 +-
 gdb/doc/gdb.texinfo                                |   4 +
 gdb/features/Makefile                              |  64 +++--
 gdb/features/i386/32bit-pkeys.xml                  |  13 +
 gdb/features/i386/64bit-pkeys.xml                  |  13 +
 gdb/features/i386/amd64-avx-avx512-linux.c         | 288 +++++++++++++++++++++
 gdb/features/i386/amd64-avx-avx512-linux.xml       |  20 ++
 gdb/features/i386/amd64-avx-avx512.c               | 279 ++++++++++++++++++++
 gdb/features/i386/amd64-avx-avx512.xml             |  17 ++
 ...12-linux.c => amd64-avx-mpx-avx512-pku-linux.c} |  11 +-
 ...inux.xml => amd64-avx-mpx-avx512-pku-linux.xml} |   4 +-
 .../{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} |  11 +-
 ...d64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} |   3 +-
 gdb/features/i386/i386-avx-avx512-linux.c          | 170 ++++++++++++
 gdb/features/i386/i386-avx-avx512-linux.xml        |  19 ++
 gdb/features/i386/i386-avx-avx512.c                | 165 ++++++++++++
 gdb/features/i386/i386-avx-avx512.xml              |  17 ++
 ...512-linux.c => i386-avx-mpx-avx512-pku-linux.c} |  11 +-
 ...linux.xml => i386-avx-mpx-avx512-pku-linux.xml} |   4 +-
 .../{i386-avx512.c => i386-avx-mpx-avx512-pku.c}   |  11 +-
 ...i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} |   3 +-
 .../{x32-avx512-linux.c => x32-avx-avx512-linux.c} | 192 ++++++--------
 ...2-avx512-linux.xml => x32-avx-avx512-linux.xml} |   3 +-
 .../i386/{x32-avx512.c => x32-avx-avx512.c}        | 190 ++++++--------
 .../i386/{x32-avx512.xml => x32-avx-avx512.xml}    |   3 +-
 gdb/gdbserver/Makefile.in                          |  50 ++--
 gdb/gdbserver/configure.srv                        |  25 +-
 gdb/gdbserver/i387-fp.c                            |  51 +++-
 gdb/gdbserver/linux-amd64-ipa.c                    |  15 +-
 gdb/gdbserver/linux-i386-ipa.c                     |  10 +-
 gdb/gdbserver/linux-x86-low.c                      |  45 +++-
 gdb/gdbserver/linux-x86-tdesc.h                    |  29 ++-
 gdb/i386-linux-nat.c                               |   2 +-
 gdb/i386-linux-tdep.c                              |  14 +-
 gdb/i386-linux-tdep.h                              |   6 +-
 gdb/i386-tdep.c                                    |  76 +++++-
 gdb/i386-tdep.h                                    |  14 +-
 gdb/i387-tdep.c                                    | 116 ++++++++-
 gdb/i387-tdep.h                                    |   5 +
 gdb/nat/x86-gcc-cpuid.h                            | 108 ++++----
 .../{x32-avx512.dat => amd64-avx-avx512-linux.dat} |  15 +-
 .../{amd64-avx512.dat => amd64-avx-avx512.dat}     |  12 +-
 ...inux.dat => amd64-avx-mpx-avx512-pku-linux.dat} |   6 +-
 ...x512-linux.dat => amd64-avx-mpx-avx512-pku.dat} |   7 +-
 gdb/regformats/i386/i386-avx-avx512-linux.dat      |  71 +++++
 gdb/regformats/i386/i386-avx-avx512.dat            |  70 +++++
 ...vx512.dat => i386-avx-mpx-avx512-pku-linux.dat} |   8 +-
 ...vx512-linux.dat => i386-avx-mpx-avx512-pku.dat} |   8 +-
 gdb/regformats/i386/x32-avx-avx512-linux.dat       | 153 +++++++++++
 gdb/regformats/i386/x32-avx-avx512.dat             | 150 +++++++++++
 gdb/testsuite/gdb.arch/i386-pkru.c                 |  90 +++++++
 gdb/testsuite/gdb.arch/i386-pkru.exp               |  69 +++++
 gdb/x86-linux-nat.c                                |  20 +-
 59 files changed, 2351 insertions(+), 501 deletions(-)
 create mode 100644 gdb/features/i386/32bit-pkeys.xml
 create mode 100644 gdb/features/i386/64bit-pkeys.xml
 create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
 create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.xml
 create mode 100644 gdb/features/i386/amd64-avx-avx512.c
 create mode 100644 gdb/features/i386/amd64-avx-avx512.xml
 rename gdb/features/i386/{amd64-avx512-linux.c => amd64-avx-mpx-avx512-pku-linux.c} (97%)
 rename gdb/features/i386/{amd64-avx512-linux.xml => amd64-avx-mpx-avx512-pku-linux.xml} (83%)
 rename gdb/features/i386/{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} (98%)
 rename gdb/features/i386/{amd64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} (87%)
 create mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
 create mode 100644 gdb/features/i386/i386-avx-avx512-linux.xml
 create mode 100644 gdb/features/i386/i386-avx-avx512.c
 create mode 100644 gdb/features/i386/i386-avx-avx512.xml
 rename gdb/features/i386/{i386-avx512-linux.c => i386-avx-mpx-avx512-pku-linux.c} (96%)
 rename gdb/features/i386/{i386-avx512-linux.xml => i386-avx-mpx-avx512-pku-linux.xml} (82%)
 rename gdb/features/i386/{i386-avx512.c => i386-avx-mpx-avx512-pku.c} (96%)
 rename gdb/features/i386/{i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} (87%)
 rename gdb/features/i386/{x32-avx512-linux.c => x32-avx-avx512-linux.c} (61%)
 rename gdb/features/i386/{x32-avx512-linux.xml => x32-avx-avx512-linux.xml} (85%)
 rename gdb/features/i386/{x32-avx512.c => x32-avx-avx512.c} (60%)
 rename gdb/features/i386/{x32-avx512.xml => x32-avx-avx512.xml} (89%)
 rename gdb/regformats/i386/{x32-avx512.dat => amd64-avx-avx512-linux.dat} (90%)
 rename gdb/regformats/i386/{amd64-avx512.dat => amd64-avx-avx512.dat} (90%)
 rename gdb/regformats/i386/{x32-avx512-linux.dat => amd64-avx-mpx-avx512-pku-linux.dat} (91%)
 rename gdb/regformats/i386/{amd64-avx512-linux.dat => amd64-avx-mpx-avx512-pku.dat} (92%)
 create mode 100644 gdb/regformats/i386/i386-avx-avx512-linux.dat
 create mode 100644 gdb/regformats/i386/i386-avx-avx512.dat
 rename gdb/regformats/i386/{i386-avx512.dat => i386-avx-mpx-avx512-pku-linux.dat} (81%)
 rename gdb/regformats/i386/{i386-avx512-linux.dat => i386-avx-mpx-avx512-pku.dat} (84%)
 create mode 100644 gdb/regformats/i386/x32-avx-avx512-linux.dat
 create mode 100644 gdb/regformats/i386/x32-avx-avx512.dat
 create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.c
 create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.exp

-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 4/5] Add target description for avx-avx512.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
                   ` (3 preceding siblings ...)
  2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
@ 2017-02-01 13:04 ` Michael Sturm
  2017-02-10 15:44   ` Pedro Alves
  2017-02-07 14:29 ` [ping][PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Sturm, Michael
  2017-02-17 13:47 ` [pushed] " Sturm, Michael
  6 siblings, 1 reply; 22+ messages in thread
From: Michael Sturm @ 2017-02-01 13:04 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches, michael.sturm

Add a dedicated target description for the feature combination
avx-avx512 as implemented by certain IA CPU models.

The corresponding X86_XSTATE_AVX_AVX512_MASK already exists, but shared
the tdesc with X86_XSTATE_AVX_MPX_AVX512_MASK. This caused MPX registers
displayed as undefined on CPUs that only implemented
X86_XSTATE_AVX_AVX512_MASK, which is undesired. This patch solves this issue.

This patch also corrects the wrong usage of x32-avx-mpx-avx512, which is
replaced by x32-avx-avx512. The MPX feature is not implemented in x32 mode.

gdb/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * amd64-linux-tdep.c (features/i386/amd64-avx-avx512-linux.c):
     New include.
     (features/i386/x32-avx-mpx-avx512-linux.c): Rename to...
     (features/i386/x32-avx-avx512-linux.c): ...this.
     (amd64_linux_core_read_description): Add dedicated cases for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate tdesc.
     (_initialize_amd64_linux_tdep): Add calls to
     initialize_tdesc_amd64_avx_avx512_linux and
     initialize_tdesc_x32_avx_avx512_linux.
     * amd64-linux.tdep.h (tdesc_amd64_avx_avx512_linux): New prototype.
     (tdesc_x32_avx_mpx_avx512_linux): Rename to...
     (tdesc_x32_avx_avx512_linu): ...this.
     * amd64-tdep.c (features/i386/amd64-avx-avx512.c): New include.
     (features/i386/x32-avx-mpx-avx512.c): Rename to...
     (features/i386/x32-avx-avx512.c): ...this.
     (amd64_target_description): Add dedicated case for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate tdesc.
     (_initialize_amd64_tdep): Add call to
     initialize_tdesc_amd64_avx_avx512.
     (initialize_tdesc_x32_avx_mpx_avx512): Rename to...
     (initialize_tdesc_x32_avx_avx512): ...this.
     * features/Makefile (WHICH): New tdescs i386/i386-avx-avx512,
     i386/i386-avx-avx512-linux, i386/amd64-avx-avx512,
     i386/amd64-avx-avx512-linux.
     (i386/x32-avx-mpx-avx512): Rename to...
     (i386/x32-avx-avx512): ...this.
     (i386/x32-avx-mpx-avx512-linux): Rename to...
     (i386/x32-avx-avx512-linux): ...this.
     (i386/i386-avx-avx512-expedite, i386/i386-avx-avx512-linux-expedite,
     i386/amd64-avx-avx512-expedite, i386/amd64-avx-avx512-linux-expedite):
     New expedites.
     (i386/x32-avx-mpx-avx512-expedite): Rename to...
     (i386/x32-avx-avx512-expedite): ...this.
     (i386/x32-avx-mpx-avx512-linux-expedite): Rename to...
     (i386/x32-avx-avx512-linux-expedite): ...this.
     (XMLTOC): New XML files i386/amd64-avx-avx512-linux.xml,
     i386/amd64-avx-avx512.xml, i386/i386-avx-avx512-linux.xml,
     i386/i386-avx-avx512.xml.
     (i386/x32-avx-mpx-avx512-linux.xml): Rename to...
     (i386/x32-avx-avx512-linux.xml): ...this.
     (i386/x32-avx-mpx-avx512.xml): Rename to...
     (i386/x32-avx-avx512.xml): ...this.
     ($(outdir)/i386/i386-avx-avx512.dat): New rule.
     ($(outdir)/i386/i386-avx-avx512-linux.dat): Likewise.
     ($(outdir)/i386/amd64-avx-avx512.dat): Likewise.
     ($(outdir)/i386/amd64-avx-avx512-linux.dat): Likewise.
     ($(outdir)/i386/x32-avx-mpx-avx512.dat):  Rename to...
     ($(outdir)/i386/x32-avx-avx512.dat): ...this.
     ($(outdir)/i386/x32-avx-mpx-avx512-linux.dat): Rename to...
     ($(outdir)/i386/x32-avx-avx512-linux.dat): ...this.
     * features/i386/amd64-avx-avx512-linux.c: New file.
     * features/i386/amd64-avx-avx512-linux.xml: Likewise.
     * features/i386/amd64-avx-avx512.c: Likewise.
     * features/i386/amd64-avx-avx512.xml: Likewise.
     * features/i386/i386-avx-avx512-linux.c: Likewise.
     * features/i386/i386-avx-avx512-linux.xml: Likewise.
     * features/i386/i386-avx-avx512.c: Likewise.
     * features/i386/i386-avx-avx512.xml: Likewise.
     * features/i386/x32-avx-mpx-avx512-linux.c: Deleted.
     * features/i386/x32-avx-avx512-linux.c: New file.
     * features/i386/x32-avx-mpx-avx512-linux.xml: Deleted.
     * features/i386/x32-avx-avx512-linux.xml: New file.
     * features/i386/x32-avx-mpx-avx512.c: Deleted.
     * features/i386/x32-avx-avx512.c: New file.
     * features/i386/x32-avx-mpx-avx512.xml: Deleted.
     * features/i386/x32-avx-avx512.xml: New file.
     * i386-linux-tdep.c (features/i386/i386-avx-avx512-linux.c): New include.
     (i386_linux_core_read_description): Add dedicated case for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate tdesc.
     (_initialize_i386_linux_tdep): Add call to
     initialize_tdesc_i386_avx_avx512_linux.
     * i386-linux-tdep.h (tdesc_i386_avx_avx512_linux): New prototype.
     * i386-tdep.c (features/i386/i386-avx-avx512.c): New include.
     (i386_validate_tdesc_p): Correct XSTATE mask used for feature_avx512.
     (i386_target_description): Add dedicated case for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate tdesc.
     (_initialize_i386_tdep): Add call to initialize_tdesc_i386_avx_avx512.
     * regformats/i386/amd64-avx-avx512-linux.dat: New file
     * regformats/i386/amd64-avx-avx512.dat: Likewise.
     * regformats/i386/i386-avx-avx512-linux.dat: Likewise.
     * regformats/i386/i386-avx-avx512.dat: Likewise.
     * regformats/i386/x32-avx-mpx-avx512-linux.dat: Deleted.
     * regformats/i386/x32-avx-avx512-linux.dat: New file.
     * regformats/i386/x32-avx-mpx-avx512.dat: Deleted.
     * regformats/i386/x32-avx-avx512.dat: New file.
     * x86-linux-nat.c (x86_linux_read_description): Add dedidated case for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate description.

gdbserver/Changelog:
2016-04-18  Michael Sturm  <michael.sturm@intel.com>

     * Makefile.in  (clean): Add handling of new source files
     i386-avx-avx512.c, i386-avx-avx512-linux.c, amd64-avx-avx512.c,
     amd64-avx-avx512-linux.c.
     (x32-avx-mpx-avx512.c): Rename to...
     (x32-avx-avx512.c): ...this.
     (x32-avx-mpx-avx512-linux.c): Rename to...
     (x32-avx-avx512-linux.c): ...this.
     (i386-avx-avx512-linux-ipa.o): New rule.
     (amd64-avx-avx512-linux-ipa.o): Likewise.
     (i386-avx-avx512.c): Likewise.
     (i386-avx-avx512-linux.c): Likewise.
     (amd64-avx-avx512.c): Likewise.
     (amd64-avx-avx512-linux.c): Likewise.
     (x32-avx-avx512.c): Rename rule, source files, dat files from
     x32-avx-mpx-avx512.*) to this.
     (x32-avx-avx512-linux.c): Rename rule, source files, dat files from
     x32-avx-mpx-avx512-linux.*) to this.
     * configure.srv (srv_i386_regobj): Add i386-avx-avx512.o.
     (srv_i386_linux_regobj): Add i386-avx-avx512-linux.o.
     (srv_amd64_regobj): Add amd64-avx-avx512.o, rename
     x32-avx-mpx-avx512.o to x32-avx-avx512.o.
     (srv_amd64_linux_regobj): Add amd64-avx-avx512-linux.o, rename
     x32-avx-mpx-avx512-linux.o to x32-avx-avx512-linux.o.
     (ipa_i386_linux_regobj): Add i386-avx-avx512-linux-ipa.o.
     (ipa_amd64_linux_regobj): Add amd64-avx-avx512-linux-ipa.o.
     (srv_i386_xmlfiles): Add i386/i386-avx-avx512.xml.
     (srv_amd64_xmlfiles): Add i386/amd64-avx-avx512.xml, rename
     x32-avx-mpx-avx512.xml to x32-avx-avx512.xml.
     (srv_i386_linux_xmlfiles): Add i386/i386-avx-avx512-linux.xml.
     (srv_amd64_linux_xmlfiles): Add i386/amd64-avx-avx512-linux.xml,
     rename x32-avx-mpx-avx512-linux.xml to x32-avx-avx512-linux.xml.
     * linux-amd64-ipa.c (get_ipa_tdesc): Add dedicated case for
     X86_TDESC_AVX_AVX512 and return appropriate tdesc.
     (initialize_low_tracepoint): Add init_registers_amd64_avx_avx512_linux.
     * linux-i386-ipa.c (get_ipa_tdesc): Add dedicated case for
     X86_TDESC_AVX_AVX512 and return appropriate tdesc.
     (initialize_low_tracepoint): Add init_registers_i386_avx_avx512_linux.
     * linux-x86-low.c (x86_linux_read_description): Add dedicated cases for
     X86_XSTATE_AVX_AVX512_MASK and return appropriate tdesc.
     (x86_get_ipa_tdesc_idx): Rename tdesc_x32_avx_mpx_avx512_linux to
     tdesc_x32_avx_avx512_linux, add dedicated if-clause for
     tdesc_amd64_avx_avx512_linux and return appropriate mask.
     Add dedicated clause for tdesc_i386_avx_avx512_linux
     and return appropriate mask.
     (initialize_low_arch): Add init_registers_amd64_avx_avx512_linux,
     rename init_registers_x32_avx_mpx_avx512_linux, add
     init_registers_i386_avx_avx512_linux.
     * linux-x86-tdesc.h (enum x86_linux_tdesc): Add new value for
     X86_TDESC_AVX_AVX512.
     (init_registers_amd64_avx_avx512_linux): New prototype.
     (tdesc_amd64_avx_avx512_linux): Likewise.
     (init_registers_x32_avx_mpx_avx512_linux): Rename to...
     (init_registers_x32_avx_avx512_linux): ...this.
     (tdesc_x32_avx_mpx_avx512_linux): Rename to...
     (tdesc_x32_avx_avx512_linux): ...this.
     (init_registers_i386_avx_avx512_linux): New prototype.
     (tdesc_i386_avx_avx512_linux): Likewise.

Change-Id: I01359fab56c961a39568df50af39714ec7b31706
Signed-off-by: Michael Sturm <michael.sturm@intel.com>
---
 gdb/amd64-linux-tdep.c                             |  21 +-
 gdb/amd64-linux-tdep.h                             |   3 +-
 gdb/amd64-tdep.c                                   |   9 +-
 gdb/features/Makefile                              |  28 +-
 gdb/features/i386/amd64-avx-avx512-linux.c         | 288 +++++++++++++++++++++
 gdb/features/i386/amd64-avx-avx512-linux.xml       |  20 ++
 gdb/features/i386/amd64-avx-avx512.c               | 279 ++++++++++++++++++++
 gdb/features/i386/amd64-avx-avx512.xml             |  17 ++
 gdb/features/i386/i386-avx-avx512-linux.c          | 170 ++++++++++++
 gdb/features/i386/i386-avx-avx512-linux.xml        |  19 ++
 gdb/features/i386/i386-avx-avx512.c                | 165 ++++++++++++
 gdb/features/i386/i386-avx-avx512.xml              |  17 ++
 ...x-mpx-avx512-linux.c => x32-avx-avx512-linux.c} | 192 ++++++--------
 ...x-avx512-linux.xml => x32-avx-avx512-linux.xml} |   3 +-
 .../{x32-avx-mpx-avx512.c => x32-avx-avx512.c}     | 190 ++++++--------
 .../{x32-avx-mpx-avx512.xml => x32-avx-avx512.xml} |   3 +-
 gdb/gdbserver/Makefile.in                          |  26 +-
 gdb/gdbserver/configure.srv                        |  20 +-
 gdb/gdbserver/linux-amd64-ipa.c                    |   5 +-
 gdb/gdbserver/linux-i386-ipa.c                     |   4 +
 gdb/gdbserver/linux-x86-low.c                      |  24 +-
 gdb/gdbserver/linux-x86-tdesc.h                    |  17 +-
 gdb/i386-linux-tdep.c                              |   5 +-
 gdb/i386-linux-tdep.h                              |   1 +
 gdb/i386-tdep.c                                    |   7 +-
 ...x-mpx-avx512.dat => amd64-avx-avx512-linux.dat} |  15 +-
 gdb/regformats/i386/amd64-avx-avx512.dat           | 150 +++++++++++
 gdb/regformats/i386/i386-avx-avx512-linux.dat      |  71 +++++
 gdb/regformats/i386/i386-avx-avx512.dat            |  70 +++++
 ...x-avx512-linux.dat => x32-avx-avx512-linux.dat} |  12 +-
 gdb/regformats/i386/x32-avx-avx512.dat             | 150 +++++++++++
 gdb/x86-linux-nat.c                                |  12 +-
 32 files changed, 1712 insertions(+), 301 deletions(-)
 create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
 create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.xml
 create mode 100644 gdb/features/i386/amd64-avx-avx512.c
 create mode 100644 gdb/features/i386/amd64-avx-avx512.xml
 create mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
 create mode 100644 gdb/features/i386/i386-avx-avx512-linux.xml
 create mode 100644 gdb/features/i386/i386-avx-avx512.c
 create mode 100644 gdb/features/i386/i386-avx-avx512.xml
 rename gdb/features/i386/{x32-avx-mpx-avx512-linux.c => x32-avx-avx512-linux.c} (61%)
 rename gdb/features/i386/{x32-avx-mpx-avx512-linux.xml => x32-avx-avx512-linux.xml} (84%)
 rename gdb/features/i386/{x32-avx-mpx-avx512.c => x32-avx-avx512.c} (60%)
 rename gdb/features/i386/{x32-avx-mpx-avx512.xml => x32-avx-avx512.xml} (88%)
 rename gdb/regformats/i386/{x32-avx-mpx-avx512.dat => amd64-avx-avx512-linux.dat} (89%)
 create mode 100644 gdb/regformats/i386/amd64-avx-avx512.dat
 create mode 100644 gdb/regformats/i386/i386-avx-avx512-linux.dat
 create mode 100644 gdb/regformats/i386/i386-avx-avx512.dat
 rename gdb/regformats/i386/{x32-avx-mpx-avx512-linux.dat => x32-avx-avx512-linux.dat} (88%)
 create mode 100644 gdb/regformats/i386/x32-avx-avx512.dat

diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 5c5e1ab..21aa3bc 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -44,11 +44,12 @@
 #include "features/i386/amd64-avx-linux.c"
 #include "features/i386/amd64-mpx-linux.c"
 #include "features/i386/amd64-avx-mpx-linux.c"
+#include "features/i386/amd64-avx-avx512-linux.c"
 #include "features/i386/amd64-avx-mpx-avx512-linux.c"
 
 #include "features/i386/x32-linux.c"
 #include "features/i386/x32-avx-linux.c"
-#include "features/i386/x32-avx-mpx-avx512-linux.c"
+#include "features/i386/x32-avx-avx512-linux.c"
 
 /* The syscall's XML filename for i386.  */
 #define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
@@ -1586,19 +1587,26 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
     case X86_XSTATE_AVX_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX_AVX512_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	return tdesc_x32_avx_mpx_avx512_linux;
+	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	return tdesc_x32_avx_avx512_linux;
       else
 	return tdesc_amd64_avx_mpx_avx512_linux;
+    case X86_XSTATE_AVX_AVX512_MASK:
+      if (gdbarch_ptr_bit (gdbarch) == 32)
+	return tdesc_x32_avx_avx512_linux;
+      else
+	return tdesc_amd64_avx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	return tdesc_x32_avx_linux;  /* No x32 MPX falling back to AVX.  */
+	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_mpx_linux;
     case X86_XSTATE_AVX_MPX_MASK:
       if (gdbarch_ptr_bit (gdbarch) == 32)
-	return tdesc_x32_avx_linux;  /* No x32 MPX falling back to AVX.  */
+	  /* No MPX on x32, fallback to AVX-AVX512.  */
+	return tdesc_x32_avx_linux;
       else
 	return tdesc_amd64_avx_mpx_linux;
     case X86_XSTATE_AVX_MASK:
@@ -2296,9 +2304,10 @@ _initialize_amd64_linux_tdep (void)
   initialize_tdesc_amd64_avx_linux ();
   initialize_tdesc_amd64_mpx_linux ();
   initialize_tdesc_amd64_avx_mpx_linux ();
+  initialize_tdesc_amd64_avx_avx512_linux ();
   initialize_tdesc_amd64_avx_mpx_avx512_linux ();
 
   initialize_tdesc_x32_linux ();
   initialize_tdesc_x32_avx_linux ();
-  initialize_tdesc_x32_avx_mpx_avx512_linux ();
+  initialize_tdesc_x32_avx_avx512_linux ();
 }
diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h
index 55afe67..0d4ddac 100644
--- a/gdb/amd64-linux-tdep.h
+++ b/gdb/amd64-linux-tdep.h
@@ -36,11 +36,12 @@ extern struct target_desc *tdesc_amd64_linux;
 extern struct target_desc *tdesc_amd64_avx_linux;
 extern struct target_desc *tdesc_amd64_mpx_linux;
 extern struct target_desc *tdesc_amd64_avx_mpx_linux;
+extern struct target_desc *tdesc_amd64_avx_avx512_linux;
 extern struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
 
 extern struct target_desc *tdesc_x32_linux;
 extern struct target_desc *tdesc_x32_avx_linux;
-extern struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
+extern struct target_desc *tdesc_x32_avx_avx512_linux;
 
 /* Enum that defines the syscall identifiers for amd64 linux.
    Used for process record/replay, these will be translated into
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index 863f67c..c2a1074 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -46,11 +46,12 @@
 #include "features/i386/amd64-avx.c"
 #include "features/i386/amd64-mpx.c"
 #include "features/i386/amd64-avx-mpx.c"
+#include "features/i386/amd64-avx-avx512.c"
 #include "features/i386/amd64-avx-mpx-avx512.c"
 
 #include "features/i386/x32.c"
 #include "features/i386/x32-avx.c"
-#include "features/i386/x32-avx-mpx-avx512.c"
+#include "features/i386/x32-avx-avx512.c"
 
 #include "ax.h"
 #include "ax-gdb.h"
@@ -3203,8 +3204,9 @@ amd64_target_description (uint64_t xcr0)
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
     case X86_XSTATE_AVX_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_amd64_avx_mpx_avx512;
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_amd64_avx_avx512;
     case X86_XSTATE_MPX_MASK:
       return tdesc_amd64_mpx;
     case X86_XSTATE_AVX_MPX_MASK:
@@ -3226,11 +3228,12 @@ _initialize_amd64_tdep (void)
   initialize_tdesc_amd64_avx ();
   initialize_tdesc_amd64_mpx ();
   initialize_tdesc_amd64_avx_mpx ();
+  initialize_tdesc_amd64_avx_avx512 ();
   initialize_tdesc_amd64_avx_mpx_avx512 ();
 
   initialize_tdesc_x32 ();
   initialize_tdesc_x32_avx ();
-  initialize_tdesc_x32_avx_mpx_avx512 ();
+  initialize_tdesc_x32_avx_avx512 ();
 }
 \f
 
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
index 3efcd4f..f25c884 100644
--- a/gdb/features/Makefile
+++ b/gdb/features/Makefile
@@ -52,14 +52,16 @@ WHICH = aarch64 \
 	i386/i386-avx i386/i386-avx-linux \
 	i386/i386-mpx i386/i386-mpx-linux \
 	i386/i386-avx-mpx i386/i386-avx-mpx-linux \
+	i386/i386-avx-avx512 i386/i386-avx-avx512-linux \
 	i386/i386-avx-mpx-avx512 i386/i386-avx-mpx-avx512-linux \
 	i386/amd64-avx i386/amd64-avx-linux \
 	i386/amd64-mpx i386/amd64-mpx-linux \
 	i386/amd64-avx-mpx i386/amd64-avx-mpx-linux \
+	i386/amd64-avx-avx512 i386/amd64-avx-avx512-linux \
 	i386/amd64-avx-mpx-avx512 i386/amd64-avx-mpx-avx512-linux \
 	i386/x32 i386/x32-linux \
 	i386/x32-avx i386/x32-avx-linux \
-	i386/x32-avx-mpx-avx512 i386/x32-avx-mpx-avx512-linux \
+	i386/x32-avx-avx512 i386/x32-avx-avx512-linux \
 	mips-linux mips-dsp-linux \
 	microblaze-with-stack-protect \
 	mips64-linux mips64-dsp-linux \
@@ -138,6 +140,8 @@ XMLTOC = \
 	arm/arm-with-vfpv3.xml \
 	i386/amd64-avx-linux.xml \
 	i386/amd64-avx.xml \
+	i386/amd64-avx-avx512-linux.xml \
+	i386/amd64-avx-avx512.xml \
 	i386/amd64-avx-mpx-avx512-linux.xml \
 	i386/amd64-avx-mpx-avx512.xml \
 	i386/amd64-linux.xml \
@@ -148,6 +152,8 @@ XMLTOC = \
 	i386/amd64.xml \
 	i386/i386-avx-linux.xml \
 	i386/i386-avx.xml \
+	i386/i386-avx-avx512-linux.xml \
+	i386/i386-avx-avx512.xml \
 	i386/i386-avx-mpx-avx512-linux.xml \
 	i386/i386-avx-mpx-avx512.xml \
 	i386/i386-linux.xml \
@@ -160,8 +166,8 @@ XMLTOC = \
 	i386/i386.xml \
 	i386/x32-avx-linux.xml \
 	i386/x32-avx.xml \
-	i386/x32-avx-mpx-avx512-linux.xml \
-	i386/x32-avx-mpx-avx512.xml \
+	i386/x32-avx-avx512-linux.xml \
+	i386/x32-avx-avx512.xml \
 	i386/x32-linux.xml \
 	i386/x32.xml \
 	microblaze-with-stack-protect.xml \
@@ -271,6 +277,10 @@ $(outdir)/i386/i386-mpx-linux.dat: i386/32bit-core.xml \
 			       i386/32bit-linux.xml i386/32bit-mpx.xml
 $(outdir)/i386/i386-avx-mpx-linux.dat: i386/32bit-core.xml \
 			       i386/32bit-linux.xml i386/32bit-mpx.xml
+$(outdir)/i386/i386-avx-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
+			       i386/32bit-avx512.xml
+$(outdir)/i386/i386-avx-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
+			       i386/32bit-linux.xml i386/32bit-avx512.xml
 $(outdir)/i386/i386-avx-mpx-avx512.dat: i386/32bit-core.xml i386/32bit-avx.xml \
 			       i386/32bit-mpx.xml i386/32bit-avx512.xml
 $(outdir)/i386/i386-avx-mpx-avx512-linux.dat: i386/32bit-core.xml i386/32bit-avx.xml \
@@ -288,6 +298,10 @@ $(outdir)/i386/amd64-mpx.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml
 $(outdir)/i386/amd64-avx-mpx.dat: i386/64bit-core.xml \
 			       i386/64bit-mpx.xml
+$(outdir)/i386/amd64-avx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+			       i386/64bit-avx512.xml
+$(outdir)/i386/amd64-avx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
+			       i386/64bit-avx512.xml i386/64bit-linux.xml
 $(outdir)/i386/amd64-avx-mpx-avx512.dat: i386/64bit-core.xml i386/64bit-avx.xml \
 			       i386/64bit-mpx.xml i386/64bit-avx512.xml
 $(outdir)/i386/amd64-avx-mpx-avx512-linux.dat: i386/64bit-core.xml i386/64bit-avx.xml \
@@ -299,10 +313,10 @@ $(outdir)/i386/x32-linux.dat: i386/x32-core.xml i386/64bit-sse.xml \
 $(outdir)/i386/x32-avx.dat: i386/x32-core.xml i386/64bit-avx.xml
 $(outdir)/i386/x32-avx-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
 			       i386/64bit-linux.xml i386/64bit-segments.xml
-$(outdir)/i386/x32-avx-mpx-avx512.dat: i386/x32-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml i386/64bit-avx512.xml
-$(outdir)/i386/x32-avx-mpx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
-			       i386/64bit-mpx.xml i386/64bit-avx512.xml i386/64bit-linux.xml \
+$(outdir)/i386/x32-avx-avx512.dat: i386/x32-core.xml i386/64bit-avx.xml \
+			       i386/64bit-avx512.xml
+$(outdir)/i386/x32-avx-avx512-linux.dat: i386/x32-core.xml i386/64bit-avx.xml \
+			       i386/64bit-avx512.xml i386/64bit-linux.xml \
 			       i386/64bit-segments.xml
 
 # 'all' doesn't build the C files, so don't delete them in 'clean'
diff --git a/gdb/features/i386/amd64-avx-avx512-linux.c b/gdb/features/i386/amd64-avx-avx512-linux.c
new file mode 100644
index 0000000..6129ab1
--- /dev/null
+++ b/gdb/features/i386/amd64-avx-avx512-linux.c
@@ -0,0 +1,288 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: amd64-avx-avx512-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_amd64_avx_avx512_linux;
+static void
+initialize_tdesc_amd64_avx_avx512_linux (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
+
+  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+  tdesc_create_reg (feature, "orig_rax", 57, 1, NULL, 64, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.segments");
+  tdesc_create_reg (feature, "fs_base", 58, 1, NULL, 64, "int");
+  tdesc_create_reg (feature, "gs_base", 59, 1, NULL, 64, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  tdesc_create_reg (feature, "ymm0h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 72, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 73, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "xmm16", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 92, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 93, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 94, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 95, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 96, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 105, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 106, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 107, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 108, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 109, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 110, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 111, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 112, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 113, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 114, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 115, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 116, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 117, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 118, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 119, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 120, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 144, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 145, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 146, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 146, 1, NULL, 256, "v2ui128");
+
+  tdesc_amd64_avx_avx512_linux = result;
+}
diff --git a/gdb/features/i386/amd64-avx-avx512-linux.xml b/gdb/features/i386/amd64-avx-avx512-linux.xml
new file mode 100644
index 0000000..1fed2cb
--- /dev/null
+++ b/gdb/features/i386/amd64-avx-avx512-linux.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2014-2016 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 with AVX, AVX512 - Includes Linux-only special "register".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-linux.xml"/>
+  <xi:include href="64bit-segments.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+  <xi:include href="64bit-avx512.xml"/>
+</target>
diff --git a/gdb/features/i386/amd64-avx-avx512.c b/gdb/features/i386/amd64-avx-avx512.c
new file mode 100644
index 0000000..8a185c1
--- /dev/null
+++ b/gdb/features/i386/amd64-avx-avx512.c
@@ -0,0 +1,279 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: amd64-avx-avx512.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_amd64_avx_avx512;
+static void
+initialize_tdesc_amd64_avx_avx512 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("i386:x86-64"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "rax", 0, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbx", 1, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rcx", 2, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdx", 3, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rsi", 4, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rdi", 5, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rbp", 6, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "rsp", 7, 1, NULL, 64, "data_ptr");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "int64");
+  tdesc_create_reg (feature, "rip", 16, 1, NULL, 64, "code_ptr");
+  tdesc_create_reg (feature, "eflags", 17, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", 18, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", 19, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", 20, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", 21, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", 22, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", 23, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", 24, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", 25, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", 26, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", 27, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", 28, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", 29, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", 30, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", 31, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", 32, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", 33, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", 34, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", 35, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", 36, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", 37, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", 38, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", 39, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  tdesc_create_reg (feature, "xmm0", 40, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", 41, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", 42, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", 43, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", 44, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", 45, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", 46, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", 47, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm8", 48, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm9", 49, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm10", 50, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm11", 51, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm12", 52, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm13", 53, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm14", 54, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm15", 55, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", 56, 1, "vector", 32, "i386_mxcsr");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  tdesc_create_reg (feature, "ymm0h", 57, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 58, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 59, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 60, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 61, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 62, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 63, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 64, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm8h", 65, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm9h", 66, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm10h", 67, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm11h", 68, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm12h", 69, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm13h", 70, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "xmm16", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 89, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 90, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 91, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 92, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 93, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 94, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 95, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 96, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 105, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 106, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 107, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 108, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 109, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 110, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 111, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 112, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 113, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 114, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 115, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 116, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 117, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 118, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 119, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 120, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128");
+
+  tdesc_amd64_avx_avx512 = result;
+}
diff --git a/gdb/features/i386/amd64-avx-avx512.xml b/gdb/features/i386/amd64-avx-avx512.xml
new file mode 100644
index 0000000..a1e8a72
--- /dev/null
+++ b/gdb/features/i386/amd64-avx-avx512.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2014-2016 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 with AVX, AVX512 -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+  <xi:include href="64bit-avx512.xml"/>
+</target>
diff --git a/gdb/features/i386/i386-avx-avx512-linux.c b/gdb/features/i386/i386-avx-avx512-linux.c
new file mode 100644
index 0000000..81149d5
--- /dev/null
+++ b/gdb/features/i386/i386-avx-avx512-linux.c
@@ -0,0 +1,170 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: i386-avx-avx512-linux.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_i386_avx_avx512_linux;
+static void
+initialize_tdesc_i386_avx_avx512_linux (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
+
+  set_tdesc_osabi (result, osabi_from_tdesc_string ("GNU/Linux"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.linux");
+  tdesc_create_reg (feature, "orig_eax", 41, 1, NULL, 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  tdesc_create_reg (feature, "ymm0h", 42, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 43, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 44, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 45, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 46, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 47, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 48, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 49, 1, NULL, 128, "uint128");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "k0", 50, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 51, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 52, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 53, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 54, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 55, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 56, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 57, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 58, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 59, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 60, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 61, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 62, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 63, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 64, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 65, 1, NULL, 256, "v2ui128");
+
+  tdesc_i386_avx_avx512_linux = result;
+}
diff --git a/gdb/features/i386/i386-avx-avx512-linux.xml b/gdb/features/i386/i386-avx-avx512-linux.xml
new file mode 100644
index 0000000..381be4e
--- /dev/null
+++ b/gdb/features/i386/i386-avx-avx512-linux.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2014-2016 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- I386 with AVX, AVX512 - Includes Linux-only special "register".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="32bit-core.xml"/>
+  <xi:include href="32bit-sse.xml"/>
+  <xi:include href="32bit-linux.xml"/>
+  <xi:include href="32bit-avx.xml"/>
+  <xi:include href="32bit-avx512.xml"/>
+</target>
diff --git a/gdb/features/i386/i386-avx-avx512.c b/gdb/features/i386/i386-avx-avx512.c
new file mode 100644
index 0000000..1075ca0
--- /dev/null
+++ b/gdb/features/i386/i386-avx-avx512.c
@@ -0,0 +1,165 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: i386-avx-avx512.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_i386_avx_avx512;
+static void
+initialize_tdesc_i386_avx_avx512 (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type;
+  struct tdesc_type *type;
+
+  set_tdesc_architecture (result, bfd_scan_arch ("i386"));
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.core");
+  type = tdesc_create_flags (feature, "i386_eflags", 4);
+  tdesc_add_flag (type, 0, "CF");
+  tdesc_add_flag (type, 1, "");
+  tdesc_add_flag (type, 2, "PF");
+  tdesc_add_flag (type, 4, "AF");
+  tdesc_add_flag (type, 6, "ZF");
+  tdesc_add_flag (type, 7, "SF");
+  tdesc_add_flag (type, 8, "TF");
+  tdesc_add_flag (type, 9, "IF");
+  tdesc_add_flag (type, 10, "DF");
+  tdesc_add_flag (type, 11, "OF");
+  tdesc_add_flag (type, 14, "NT");
+  tdesc_add_flag (type, 16, "RF");
+  tdesc_add_flag (type, 17, "VM");
+  tdesc_add_flag (type, 18, "AC");
+  tdesc_add_flag (type, 19, "VIF");
+  tdesc_add_flag (type, 20, "VIP");
+  tdesc_add_flag (type, 21, "ID");
+
+  tdesc_create_reg (feature, "eax", 0, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ecx", 1, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edx", 2, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ebx", 3, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "esp", 4, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "ebp", 5, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "esi", 6, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "edi", 7, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "eip", 8, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "eflags", 9, 1, NULL, 32, "i386_eflags");
+  tdesc_create_reg (feature, "cs", 10, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ss", 11, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "ds", 12, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "es", 13, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "fs", 14, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "gs", 15, 1, NULL, 32, "int32");
+  tdesc_create_reg (feature, "st0", 16, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st1", 17, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st2", 18, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st3", 19, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st4", 20, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st5", 21, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st6", 22, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "st7", 23, 1, NULL, 80, "i387_ext");
+  tdesc_create_reg (feature, "fctrl", 24, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fstat", 25, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "ftag", 26, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fiseg", 27, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fioff", 28, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "foseg", 29, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fooff", 30, 1, "float", 32, "int");
+  tdesc_create_reg (feature, "fop", 31, 1, "float", 32, "int");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.sse");
+  field_type = tdesc_named_type (feature, "ieee_single");
+  tdesc_create_vector (feature, "v4f", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "ieee_double");
+  tdesc_create_vector (feature, "v2d", field_type, 2);
+
+  field_type = tdesc_named_type (feature, "int8");
+  tdesc_create_vector (feature, "v16i8", field_type, 16);
+
+  field_type = tdesc_named_type (feature, "int16");
+  tdesc_create_vector (feature, "v8i16", field_type, 8);
+
+  field_type = tdesc_named_type (feature, "int32");
+  tdesc_create_vector (feature, "v4i32", field_type, 4);
+
+  field_type = tdesc_named_type (feature, "int64");
+  tdesc_create_vector (feature, "v2i64", field_type, 2);
+
+  type = tdesc_create_union (feature, "vec128");
+  field_type = tdesc_named_type (feature, "v4f");
+  tdesc_add_field (type, "v4_float", field_type);
+  field_type = tdesc_named_type (feature, "v2d");
+  tdesc_add_field (type, "v2_double", field_type);
+  field_type = tdesc_named_type (feature, "v16i8");
+  tdesc_add_field (type, "v16_int8", field_type);
+  field_type = tdesc_named_type (feature, "v8i16");
+  tdesc_add_field (type, "v8_int16", field_type);
+  field_type = tdesc_named_type (feature, "v4i32");
+  tdesc_add_field (type, "v4_int32", field_type);
+  field_type = tdesc_named_type (feature, "v2i64");
+  tdesc_add_field (type, "v2_int64", field_type);
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_add_field (type, "uint128", field_type);
+
+  type = tdesc_create_flags (feature, "i386_mxcsr", 4);
+  tdesc_add_flag (type, 0, "IE");
+  tdesc_add_flag (type, 1, "DE");
+  tdesc_add_flag (type, 2, "ZE");
+  tdesc_add_flag (type, 3, "OE");
+  tdesc_add_flag (type, 4, "UE");
+  tdesc_add_flag (type, 5, "PE");
+  tdesc_add_flag (type, 6, "DAZ");
+  tdesc_add_flag (type, 7, "IM");
+  tdesc_add_flag (type, 8, "DM");
+  tdesc_add_flag (type, 9, "ZM");
+  tdesc_add_flag (type, 10, "OM");
+  tdesc_add_flag (type, 11, "UM");
+  tdesc_add_flag (type, 12, "PM");
+  tdesc_add_flag (type, 15, "FZ");
+
+  tdesc_create_reg (feature, "xmm0", 32, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm1", 33, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm2", 34, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm3", 35, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm4", 36, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm5", 37, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm6", 38, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm7", 39, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "mxcsr", 40, 1, "vector", 32, "i386_mxcsr");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx");
+  tdesc_create_reg (feature, "ymm0h", 41, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm1h", 42, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm2h", 43, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm3h", 44, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm4h", 45, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm5h", 46, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm6h", 47, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm7h", 48, 1, NULL, 128, "uint128");
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
+  field_type = tdesc_named_type (feature, "uint128");
+  tdesc_create_vector (feature, "v2ui128", field_type, 2);
+
+  tdesc_create_reg (feature, "k0", 49, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 50, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 51, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 52, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 53, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 54, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 55, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 56, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 57, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 58, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 59, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 60, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 61, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 62, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 63, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 64, 1, NULL, 256, "v2ui128");
+
+  tdesc_i386_avx_avx512 = result;
+}
diff --git a/gdb/features/i386/i386-avx-avx512.xml b/gdb/features/i386/i386-avx-avx512.xml
new file mode 100644
index 0000000..dba48e2
--- /dev/null
+++ b/gdb/features/i386/i386-avx-avx512.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2014-2016 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- I386 with AVX, AVX512 -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386</architecture>
+  <xi:include href="32bit-core.xml"/>
+  <xi:include href="32bit-sse.xml"/>
+  <xi:include href="32bit-avx.xml"/>
+  <xi:include href="32bit-avx512.xml"/>
+</target>
diff --git a/gdb/features/i386/x32-avx-mpx-avx512-linux.c b/gdb/features/i386/x32-avx-avx512-linux.c
similarity index 61%
rename from gdb/features/i386/x32-avx-mpx-avx512-linux.c
rename to gdb/features/i386/x32-avx-avx512-linux.c
index 841d6c9..0467d87 100644
--- a/gdb/features/i386/x32-avx-mpx-avx512-linux.c
+++ b/gdb/features/i386/x32-avx-avx512-linux.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx-mpx-avx512-linux.xml */
+  Original: x32-avx-avx512-linux.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
+struct target_desc *tdesc_x32_avx_avx512_linux;
 static void
-initialize_tdesc_x32_avx_mpx_avx512_linux (void)
+initialize_tdesc_x32_avx_avx512_linux (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -173,44 +173,6 @@ initialize_tdesc_x32_avx_mpx_avx512_linux (void)
   tdesc_create_reg (feature, "ymm14h", 74, 1, NULL, 128, "uint128");
   tdesc_create_reg (feature, "ymm15h", 75, 1, NULL, 128, "uint128");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 77, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 78, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 79, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 80, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 81, 1, NULL, 64, "status");
-
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
@@ -249,78 +211,78 @@ initialize_tdesc_x32_avx_mpx_avx512_linux (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_create_vector (feature, "v2ui128", field_type, 2);
 
-  tdesc_create_reg (feature, "xmm16", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 95, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 96, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 97, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 108, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 109, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 110, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 111, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 112, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 113, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 116, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 117, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 118, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 119, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 120, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 121, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 147, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 148, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 149, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 150, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 151, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 152, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 153, 1, NULL, 256, "v2ui128");
-
-  tdesc_x32_avx_mpx_avx512_linux = result;
+  tdesc_create_reg (feature, "xmm16", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 89, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 90, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 91, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 92, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 93, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 94, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 95, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 96, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 105, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 106, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 107, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 108, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 109, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 110, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 111, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 112, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 113, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 114, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 115, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 116, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 117, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 118, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 119, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 120, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 144, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 145, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 146, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 147, 1, NULL, 256, "v2ui128");
+
+  tdesc_x32_avx_avx512_linux = result;
 }
diff --git a/gdb/features/i386/x32-avx-mpx-avx512-linux.xml b/gdb/features/i386/x32-avx-avx512-linux.xml
similarity index 84%
rename from gdb/features/i386/x32-avx-mpx-avx512-linux.xml
rename to gdb/features/i386/x32-avx-avx512-linux.xml
index 4b57d41..4594c9d 100644
--- a/gdb/features/i386/x32-avx-mpx-avx512-linux.xml
+++ b/gdb/features/i386/x32-avx-avx512-linux.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- X32 with AVX, MPX, AVX512 - Includes Linux-only special "register".  -->
+<!-- X32 with AVX, AVX512 - Includes Linux-only special "register".  -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -16,6 +16,5 @@
   <xi:include href="64bit-linux.xml"/>
   <xi:include href="64bit-segments.xml"/>
   <xi:include href="64bit-avx.xml"/>
-  <xi:include href="64bit-mpx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
 </target>
diff --git a/gdb/features/i386/x32-avx-mpx-avx512.c b/gdb/features/i386/x32-avx-avx512.c
similarity index 60%
rename from gdb/features/i386/x32-avx-mpx-avx512.c
rename to gdb/features/i386/x32-avx-avx512.c
index 20deeab..a7a2d52 100644
--- a/gdb/features/i386/x32-avx-mpx-avx512.c
+++ b/gdb/features/i386/x32-avx-avx512.c
@@ -1,13 +1,13 @@
 /* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
-  Original: x32-avx-mpx-avx512.xml */
+  Original: x32-avx-avx512.xml */
 
 #include "defs.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 
-struct target_desc *tdesc_x32_avx_mpx_avx512;
+struct target_desc *tdesc_x32_avx_avx512;
 static void
-initialize_tdesc_x32_avx_mpx_avx512 (void)
+initialize_tdesc_x32_avx_avx512 (void)
 {
   struct target_desc *result = allocate_target_description ();
   struct tdesc_feature *feature;
@@ -164,44 +164,6 @@ initialize_tdesc_x32_avx_mpx_avx512 (void)
   tdesc_create_reg (feature, "ymm14h", 71, 1, NULL, 128, "uint128");
   tdesc_create_reg (feature, "ymm15h", 72, 1, NULL, 128, "uint128");
 
-  feature = tdesc_create_feature (result, "org.gnu.gdb.i386.mpx");
-  type = tdesc_create_struct (feature, "br128");
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "lbound", field_type);
-  field_type = tdesc_named_type (feature, "uint64");
-  tdesc_add_field (type, "ubound_raw", field_type);
-
-  type = tdesc_create_struct (feature, "_bndstatus");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "bde", 2, 63);
-  tdesc_add_bitfield (type, "error", 0, 1);
-
-  type = tdesc_create_union (feature, "status");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndstatus");
-  tdesc_add_field (type, "status", field_type);
-
-  type = tdesc_create_struct (feature, "_bndcfgu");
-  tdesc_set_struct_size (type, 8);
-  tdesc_add_bitfield (type, "base", 12, 63);
-  tdesc_add_bitfield (type, "reserved", 2, 11);
-  tdesc_add_bitfield (type, "preserved", 1, 1);
-  tdesc_add_bitfield (type, "enabled", 0, 0);
-
-  type = tdesc_create_union (feature, "cfgu");
-  field_type = tdesc_named_type (feature, "data_ptr");
-  tdesc_add_field (type, "raw", field_type);
-  field_type = tdesc_named_type (feature, "_bndcfgu");
-  tdesc_add_field (type, "config", field_type);
-
-  tdesc_create_reg (feature, "bnd0raw", 73, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd1raw", 74, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd2raw", 75, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bnd3raw", 76, 1, NULL, 128, "br128");
-  tdesc_create_reg (feature, "bndcfgu", 77, 1, NULL, 64, "cfgu");
-  tdesc_create_reg (feature, "bndstatus", 78, 1, NULL, 64, "status");
-
   feature = tdesc_create_feature (result, "org.gnu.gdb.i386.avx512");
   field_type = tdesc_named_type (feature, "ieee_single");
   tdesc_create_vector (feature, "v4f", field_type, 4);
@@ -240,78 +202,78 @@ initialize_tdesc_x32_avx_mpx_avx512 (void)
   field_type = tdesc_named_type (feature, "uint128");
   tdesc_create_vector (feature, "v2ui128", field_type, 2);
 
-  tdesc_create_reg (feature, "xmm16", 79, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm17", 80, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm18", 81, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm19", 82, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm20", 83, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm21", 84, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm22", 85, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm23", 86, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm24", 87, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm25", 88, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm26", 89, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm27", 90, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm28", 91, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm29", 92, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm30", 93, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "xmm31", 94, 1, NULL, 128, "vec128");
-  tdesc_create_reg (feature, "ymm16h", 95, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm17h", 96, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm18h", 97, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm19h", 98, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm20h", 99, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm21h", 100, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm22h", 101, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm23h", 102, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm24h", 103, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm25h", 104, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm26h", 105, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm27h", 106, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm28h", 107, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm29h", 108, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm30h", 109, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "ymm31h", 110, 1, NULL, 128, "uint128");
-  tdesc_create_reg (feature, "k0", 111, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k1", 112, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k2", 113, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k3", 114, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k4", 115, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k5", 116, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k6", 117, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "k7", 118, 1, NULL, 64, "uint64");
-  tdesc_create_reg (feature, "zmm0h", 119, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm1h", 120, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm2h", 121, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm3h", 122, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm4h", 123, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm5h", 124, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm6h", 125, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm7h", 126, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm8h", 127, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm9h", 128, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm10h", 129, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm11h", 130, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm12h", 131, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm13h", 132, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm14h", 133, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm15h", 134, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm16h", 135, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm17h", 136, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm18h", 137, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm19h", 138, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm20h", 139, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm21h", 140, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm22h", 141, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm23h", 142, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm24h", 143, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm25h", 144, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm26h", 145, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm27h", 146, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm28h", 147, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm29h", 148, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm30h", 149, 1, NULL, 256, "v2ui128");
-  tdesc_create_reg (feature, "zmm31h", 150, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "xmm16", 73, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm17", 74, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm18", 75, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm19", 76, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm20", 77, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm21", 78, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm22", 79, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm23", 80, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm24", 81, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm25", 82, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm26", 83, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm27", 84, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm28", 85, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm29", 86, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm30", 87, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "xmm31", 88, 1, NULL, 128, "vec128");
+  tdesc_create_reg (feature, "ymm16h", 89, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm17h", 90, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm18h", 91, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm19h", 92, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm20h", 93, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm21h", 94, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm22h", 95, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm23h", 96, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm24h", 97, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm25h", 98, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm26h", 99, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm27h", 100, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm28h", 101, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm29h", 102, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm30h", 103, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "ymm31h", 104, 1, NULL, 128, "uint128");
+  tdesc_create_reg (feature, "k0", 105, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k1", 106, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k2", 107, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k3", 108, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k4", 109, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k5", 110, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k6", 111, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "k7", 112, 1, NULL, 64, "uint64");
+  tdesc_create_reg (feature, "zmm0h", 113, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm1h", 114, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm2h", 115, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm3h", 116, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm4h", 117, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm5h", 118, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm6h", 119, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm7h", 120, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm8h", 121, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm9h", 122, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm10h", 123, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm11h", 124, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm12h", 125, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm13h", 126, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm14h", 127, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm15h", 128, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm16h", 129, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm17h", 130, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm18h", 131, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm19h", 132, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm20h", 133, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm21h", 134, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm22h", 135, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm23h", 136, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm24h", 137, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm25h", 138, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm26h", 139, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm27h", 140, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm28h", 141, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm29h", 142, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm30h", 143, 1, NULL, 256, "v2ui128");
+  tdesc_create_reg (feature, "zmm31h", 144, 1, NULL, 256, "v2ui128");
 
-  tdesc_x32_avx_mpx_avx512 = result;
+  tdesc_x32_avx_avx512 = result;
 }
diff --git a/gdb/features/i386/x32-avx-mpx-avx512.xml b/gdb/features/i386/x32-avx-avx512.xml
similarity index 88%
rename from gdb/features/i386/x32-avx-mpx-avx512.xml
rename to gdb/features/i386/x32-avx-avx512.xml
index 5bc74a8..eb69dfe 100644
--- a/gdb/features/i386/x32-avx-mpx-avx512.xml
+++ b/gdb/features/i386/x32-avx-avx512.xml
@@ -5,7 +5,7 @@
      are permitted in any medium without royalty provided the copyright
      notice and this notice are preserved.  -->
 
-<!-- X32 with AVX, MPX, AVX512 -->
+<!-- X32 with AVX, AVX512 -->
 
 <!DOCTYPE target SYSTEM "gdb-target.dtd">
 <target>
@@ -13,6 +13,5 @@
   <xi:include href="x32-core.xml"/>
   <xi:include href="64bit-sse.xml"/>
   <xi:include href="64bit-avx.xml"/>
-  <xi:include href="64bit-mpx.xml"/>
   <xi:include href="64bit-avx512.xml"/>
 </target>
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index bc4819b..37a9514 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -445,15 +445,17 @@ clean:
 	rm -f i386-avx.c i386-avx-linux.c
 	rm -f i386-mpx.c i386-mpx-linux.c
 	rm -f i386-avx-mpx.c i386-avx-mpx-linux.c
+	rm -f i386-avx-avx512.c i386-avx-avx512-linux.c
 	rm -f i386-avx-mpx-avx512.c i386-avx-mpx-avx512-linux.c
 	rm -f amd64-avx.c amd64-avx-linux.c
 	rm -f amd64-mpx.c amd64-mpx-linux.c
 	rm -f amd64-avx-mpx.c amd64-avx-mpx-linux.c
+	rm -f amd64-avx-avx512.c amd64-avx-avx512-linux.c
 	rm -f amd64-avx-mpx-avx512.c amd64-avx-mpx-avx512-linux.c
 	rm -f i386-mmx.c i386-mmx-linux.c
 	rm -f x32.c x32-linux.c
 	rm -f x32-avx.c x32-avx-linux.c
-	rm -f x32-avx-mpx-avx512.c x32-avx-mpx-avx512-linux.c
+	rm -f x32-avx-avx512.c x32-avx-avx512-linux.c
 	@$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do
 
 maintainer-clean realclean distclean: clean
@@ -577,6 +579,9 @@ i386-mpx-linux-ipa.o: i386-mpx-linux.c
 i386-avx-mpx-linux-ipa.o: i386-avx-mpx-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
+i386-avx-avx512-linux-ipa.o: i386-avx-avx512-linux.c
+	$(IPAGENT_COMPILE) $<
+	$(POSTCOMPILE)
 i386-avx-mpx-avx512-linux-ipa.o: i386-avx-mpx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
@@ -598,6 +603,9 @@ amd64-mpx-linux-ipa.o: amd64-mpx-linux.c
 amd64-avx-mpx-linux-ipa.o: amd64-avx-mpx-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
+amd64-avx-avx512-linux-ipa.o: amd64-avx-avx512-linux.c
+	$(IPAGENT_COMPILE) $<
+	$(POSTCOMPILE)
 amd64-avx-mpx-avx512-linux-ipa.o: amd64-avx-mpx-avx512-linux.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
@@ -894,6 +902,10 @@ i386-avx.c : $(srcdir)/../regformats/i386/i386-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx.dat i386-avx.c
 i386-avx-linux.c : $(srcdir)/../regformats/i386/i386-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-linux.dat i386-avx-linux.c
+i386-avx-avx512.c : $(srcdir)/../regformats/i386/i386-avx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-avx512.dat i386-avx-avx512.c
+i386-avx-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-avx512-linux.dat i386-avx-avx512-linux.c
 i386-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/i386-avx-mpx-avx512.dat i386-avx-mpx-avx512.c
 i386-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/i386-avx-mpx-avx512-linux.dat $(regdat_sh)
@@ -1012,6 +1024,10 @@ amd64-avx.c : $(srcdir)/../regformats/i386/amd64-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx.dat amd64-avx.c
 amd64-avx-linux.c : $(srcdir)/../regformats/i386/amd64-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-linux.dat amd64-avx-linux.c
+amd64-avx-avx512.c : $(srcdir)/../regformats/i386/amd64-avx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-avx512.dat amd64-avx-avx512.c
+amd64-avx-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-avx512-linux.dat amd64-avx-avx512-linux.c
 amd64-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512.dat amd64-avx-mpx-avx512.c
 amd64-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/amd64-avx-mpx-avx512-linux.dat $(regdat_sh)
@@ -1032,10 +1048,10 @@ x32-avx.c : $(srcdir)/../regformats/i386/x32-avx.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx.dat x32-avx.c
 x32-avx-linux.c : $(srcdir)/../regformats/i386/x32-avx-linux.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-linux.dat x32-avx-linux.c
-x32-avx-mpx-avx512.c : $(srcdir)/../regformats/i386/x32-avx-mpx-avx512.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-mpx-avx512.dat x32-avx-mpx-avx512.c
-x32-avx-mpx-avx512-linux.c : $(srcdir)/../regformats/i386/x32-avx-mpx-avx512-linux.dat $(regdat_sh)
-	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-mpx-avx512-linux.dat x32-avx-mpx-avx512-linux.c
+x32-avx-avx512.c : $(srcdir)/../regformats/i386/x32-avx-avx512.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-avx512.dat x32-avx-avx512.c
+x32-avx-avx512-linux.c : $(srcdir)/../regformats/i386/x32-avx-avx512-linux.dat $(regdat_sh)
+	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/i386/x32-avx-avx512-linux.dat x32-avx-avx512-linux.c
 reg-xtensa.c : $(srcdir)/../regformats/reg-xtensa.dat $(regdat_sh)
 	$(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-xtensa.dat reg-xtensa.c
 reg-tilegx.c : $(srcdir)/../regformats/reg-tilegx.dat $(regdat_sh)
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 9f656f9..9390cb1 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -24,21 +24,21 @@
 # Default hostio_last_error implementation
 srv_hostio_err_objs="hostio-errno.o"
 
-srv_i386_regobj="i386.o i386-avx.o i386-avx-mpx-avx512.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
-srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-mpx-avx512-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
-srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-mpx-avx512.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-mpx-avx512.o"
-srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-mpx-avx512-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-mpx-avx512-linux.o"
+srv_i386_regobj="i386.o i386-avx.o i386-avx-avx512.o i386-avx-mpx-avx512.o i386-mpx.o i386-avx-mpx.o i386-mmx.o"
+srv_i386_linux_regobj="i386-linux.o i386-avx-linux.o i386-avx-avx512-linux.o i386-avx-mpx-avx512-linux.o i386-mpx-linux.o i386-avx-mpx-linux.o i386-mmx-linux.o"
+srv_amd64_regobj="amd64.o amd64-avx.o amd64-avx-avx512.o amd64-avx-mpx-avx512.o amd64-mpx.o amd64-avx-mpx.o x32.o x32-avx.o x32-avx-avx512.o"
+srv_amd64_linux_regobj="amd64-linux.o amd64-avx-linux.o amd64-avx-avx512-linux.o amd64-avx-mpx-avx512-linux.o amd64-mpx-linux.o amd64-avx-mpx-linux.o x32-linux.o x32-avx-linux.o x32-avx-avx512-linux.o"
 
-ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-mpx-avx512-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
-ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-mpx-avx512-linux-ipa.o amd64-mpx-linux-ipa.o"
+ipa_i386_linux_regobj="i386-linux-ipa.o i386-avx-linux-ipa.o  i386-avx-mpx-linux-ipa.o i386-avx-avx512-linux-ipa.o i386-avx-mpx-avx512-linux-ipa.o i386-mpx-linux-ipa.o i386-mmx-linux-ipa.o"
+ipa_amd64_linux_regobj="amd64-linux-ipa.o amd64-avx-linux-ipa.o amd64-avx-mpx-linux-ipa.o amd64-avx-avx512-linux-ipa.o amd64-avx-mpx-avx512-linux-ipa.o amd64-mpx-linux-ipa.o"
 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"
 
 srv_i386_32bit_xmlfiles="i386/32bit-core.xml i386/32bit-sse.xml i386/32bit-avx.xml i386/32bit-avx512.xml i386/32bit-mpx.xml"
 srv_i386_64bit_xmlfiles="i386/64bit-core.xml i386/64bit-segments.xml i386/64bit-sse.xml i386/64bit-avx.xml i386/64bit-avx512.xml i386/x32-core.xml i386/64bit-mpx.xml"
-srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-mpx-avx512.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-mpx-avx512.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-mpx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
-srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-mpx-avx512-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
-srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-mpx-avx512-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-mpx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
+srv_i386_xmlfiles="i386/i386.xml i386/i386-avx.xml i386/i386-avx-avx512.xml i386/i386-avx-mpx-avx512.xml i386/i386-mpx.xml i386/i386-avx-mpx.xml i386/i386-mmx.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_xmlfiles="i386/amd64.xml i386/amd64-avx.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512.xml i386/x32.xml i386/x32-avx.xml i386/x32-avx-avx512.xml i386/amd64-mpx.xml i386/amd64-avx-mpx.xml  $srv_i386_64bit_xmlfiles"
+srv_i386_linux_xmlfiles="i386/i386-linux.xml i386/i386-avx-linux.xml i386/i386-avx-avx512-linux.xml i386/i386-avx-mpx-avx512-linux.xml i386/i386-mmx-linux.xml i386/32bit-linux.xml i386/i386-mpx-linux.xml i386/i386-avx-mpx-linux.xml $srv_i386_32bit_xmlfiles"
+srv_amd64_linux_xmlfiles="i386/amd64-linux.xml i386/amd64-avx-linux.xml i386/amd64-avx-avx512.xml i386/amd64-avx-mpx-avx512-linux.xml i386/64bit-linux.xml i386/amd64-mpx-linux.xml i386/amd64-avx-mpx-linux.xml i386/x32-linux.xml i386/x32-avx-linux.xml i386/x32-avx-avx512-linux.xml $srv_i386_64bit_xmlfiles"
 
 
 # Linux object files.  This is so we don't have to repeat
diff --git a/gdb/gdbserver/linux-amd64-ipa.c b/gdb/gdbserver/linux-amd64-ipa.c
index 3d105f9..c00b77a 100644
--- a/gdb/gdbserver/linux-amd64-ipa.c
+++ b/gdb/gdbserver/linux-amd64-ipa.c
@@ -199,6 +199,8 @@ get_ipa_tdesc (int idx)
       return tdesc_amd64_avx_mpx_linux;
     case X86_TDESC_AVX_MPX_AVX512:
       return tdesc_amd64_avx_mpx_avx512_linux;
+    case X86_TDESC_AVX_AVX512:
+      return tdesc_amd64_avx_avx512_linux;
     default:
       internal_error (__FILE__, __LINE__,
 		      "unknown ipa tdesc index: %d", idx);
@@ -281,7 +283,8 @@ initialize_low_tracepoint (void)
 #else
   init_registers_amd64_linux ();
   init_registers_amd64_avx_linux ();
+  init_registers_amd64_mpx_linux ();
   init_registers_amd64_avx_mpx_linux ();
-  init_registers_amd64_avx_mpx_avx512_linux ();
+  init_registers_amd64_avx_avx512_linux ();
 #endif
 }
diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c
index cc09ef8..aa16f85 100644
--- a/gdb/gdbserver/linux-i386-ipa.c
+++ b/gdb/gdbserver/linux-i386-ipa.c
@@ -262,6 +262,8 @@ get_ipa_tdesc (int idx)
       return tdesc_i386_mpx_linux;
     case X86_TDESC_AVX_MPX:
       return tdesc_i386_avx_mpx_linux;
+    case X86_TDESC_AVX_AVX512:
+      return tdesc_i386_avx_avx512_linux;
     case X86_TDESC_AVX_MPX_AVX512:
       return tdesc_i386_avx_mpx_avx512_linux;
     default:
@@ -293,6 +295,8 @@ initialize_low_tracepoint (void)
   init_registers_i386_linux ();
   init_registers_i386_avx_linux ();
   init_registers_i386_mpx_linux ();
+  init_registers_i386_avx_avx512_linux ();
   init_registers_i386_avx_mpx_avx512_linux ();
+
   initialize_fast_tracepoint_trampoline_buffer ();
 }
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 9977f61..f946cf4 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -823,9 +823,11 @@ x86_linux_read_description (void)
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
 		case X86_XSTATE_AVX_MPX_AVX512_MASK:
-		case X86_XSTATE_AVX_AVX512_MASK:
 		  return tdesc_amd64_avx_mpx_avx512_linux;
 
+		case X86_XSTATE_AVX_AVX512_MASK:
+		  return tdesc_amd64_avx_avx512_linux;
+
 		case X86_XSTATE_AVX_MPX_MASK:
 		  return tdesc_amd64_avx_mpx_linux;
 
@@ -848,9 +850,9 @@ x86_linux_read_description (void)
 	    {
 	      switch (xcr0 & X86_XSTATE_ALL_MASK)
 	        {
-		case X86_XSTATE_AVX_MPX_AVX512_MASK:
+		case X86_XSTATE_AVX_MPX_AVX512_MASK: /* No MPX on x32.  */
 		case X86_XSTATE_AVX_AVX512_MASK:
-		  return tdesc_x32_avx_mpx_avx512_linux;
+		  return tdesc_x32_avx_avx512_linux;
 
 		case X86_XSTATE_MPX_MASK: /* No MPX on x32.  */
 		case X86_XSTATE_AVX_MASK:
@@ -871,10 +873,12 @@ x86_linux_read_description (void)
 	{
 	  switch (xcr0 & X86_XSTATE_ALL_MASK)
 	    {
-	    case X86_XSTATE_AVX_MPX_AVX512_MASK:
-	    case (X86_XSTATE_AVX_AVX512_MASK):
+	    case (X86_XSTATE_AVX_MPX_AVX512_MASK):
 	      return tdesc_i386_avx_mpx_avx512_linux;
 
+	    case (X86_XSTATE_AVX_AVX512_MASK):
+	      return tdesc_i386_avx_avx512_linux;
+
 	    case (X86_XSTATE_MPX_MASK):
 	      return tdesc_i386_mpx_linux;
 
@@ -2898,8 +2902,10 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_MPX;
   if (tdesc == tdesc_amd64_avx_mpx_linux)
     return X86_TDESC_AVX_MPX;
-  if (tdesc == tdesc_amd64_avx_mpx_avx512_linux || tdesc == tdesc_x32_avx_mpx_avx512_linux)
+  if (tdesc == tdesc_amd64_avx_mpx_avx512_linux || tdesc == tdesc_x32_avx_avx512_linux)
     return X86_TDESC_AVX_MPX_AVX512;
+  if (tdesc == tdesc_amd64_avx_avx512_linux)
+    return X86_TDESC_AVX_AVX512;
 #endif
 
   if (tdesc == tdesc_i386_mmx_linux)
@@ -2914,6 +2920,8 @@ x86_get_ipa_tdesc_idx (void)
     return X86_TDESC_AVX_MPX;
   if (tdesc == tdesc_i386_avx_mpx_avx512_linux)
     return X86_TDESC_AVX_MPX_AVX512;
+  if (tdesc == tdesc_i386_avx_avx512_linux)
+    return X86_TDESC_AVX_AVX512;
 
   return 0;
 }
@@ -2973,11 +2981,12 @@ initialize_low_arch (void)
   init_registers_amd64_avx_linux ();
   init_registers_amd64_mpx_linux ();
   init_registers_amd64_avx_mpx_linux ();
+  init_registers_amd64_avx_avx512_linux ();
   init_registers_amd64_avx_mpx_avx512_linux ();
 
   init_registers_x32_linux ();
   init_registers_x32_avx_linux ();
-  init_registers_x32_avx_mpx_avx512_linux ();
+  init_registers_x32_avx_avx512_linux ();
 
   tdesc_amd64_linux_no_xml = XNEW (struct target_desc);
   copy_target_description (tdesc_amd64_linux_no_xml, tdesc_amd64_linux);
@@ -2988,6 +2997,7 @@ initialize_low_arch (void)
   init_registers_i386_avx_linux ();
   init_registers_i386_mpx_linux ();
   init_registers_i386_avx_mpx_linux ();
+  init_registers_i386_avx_avx512_linux ();
   init_registers_i386_avx_mpx_avx512_linux ();
 
   tdesc_i386_linux_no_xml = XNEW (struct target_desc);
diff --git a/gdb/gdbserver/linux-x86-tdesc.h b/gdb/gdbserver/linux-x86-tdesc.h
index b5d19d9..96966c3 100644
--- a/gdb/gdbserver/linux-x86-tdesc.h
+++ b/gdb/gdbserver/linux-x86-tdesc.h
@@ -28,7 +28,8 @@ enum x86_linux_tdesc {
   X86_TDESC_AVX = 2,
   X86_TDESC_MPX = 3,
   X86_TDESC_AVX_MPX = 4,
-  X86_TDESC_AVX_MPX_AVX512 = 5,
+  X86_TDESC_AVX_AVX512 = 5,
+  X86_TDESC_AVX_MPX_AVX512 = 6,
 };
 
 #ifdef __x86_64__
@@ -42,6 +43,10 @@ extern const struct target_desc *tdesc_amd64_linux;
 void init_registers_amd64_avx_linux (void);
 extern const struct target_desc *tdesc_amd64_avx_linux;
 
+/* Defined in auto-generated file amd64-avx-avx512-linux.c.  */
+void init_registers_amd64_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_amd64_avx_avx512_linux;
+
 /* Defined in auto-generated file amd64-avx-mpx-avx512-linux.c.  */
 void init_registers_amd64_avx_mpx_avx512_linux (void);
 extern const struct target_desc *tdesc_amd64_avx_mpx_avx512_linux;
@@ -64,9 +69,9 @@ extern const struct target_desc *tdesc_x32_linux;
 void init_registers_x32_avx_linux (void);
 extern const struct target_desc *tdesc_x32_avx_linux;
 
-/* Defined in auto-generated file x32-avx-mpx-avx512-linux.c.  */
-void init_registers_x32_avx_mpx_avx512_linux (void);
-extern const struct target_desc *tdesc_x32_avx_mpx_avx512_linux;
+/* Defined in auto-generated file x32-avx-avx512-linux.c.  */
+void init_registers_x32_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_x32_avx_avx512_linux;
 #endif
 
 #endif
@@ -88,6 +93,10 @@ extern const struct target_desc *tdesc_i386_avx_linux;
 void init_registers_i386_avx_mpx_linux (void);
 extern const struct target_desc *tdesc_i386_avx_mpx_linux;
 
+/* Defined in auto-generated file i386-avx-avx512-linux.c.  */
+void init_registers_i386_avx_avx512_linux (void);
+extern const struct target_desc *tdesc_i386_avx_avx512_linux;
+
 /* Defined in auto-generated file i386-avx-mpx-avx512-linux.c.  */
 void init_registers_i386_avx_mpx_avx512_linux (void);
 extern const struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c
index b510d34..66828f5 100644
--- a/gdb/i386-linux-tdep.c
+++ b/gdb/i386-linux-tdep.c
@@ -50,6 +50,7 @@
 #include "features/i386/i386-mpx-linux.c"
 #include "features/i386/i386-avx-mpx-linux.c"
 #include "features/i386/i386-avx-linux.c"
+#include "features/i386/i386-avx-avx512-linux.c"
 #include "features/i386/i386-avx-mpx-avx512-linux.c"
 
 /* Return non-zero, when the register is in the corresponding register
@@ -689,8 +690,9 @@ i386_linux_core_read_description (struct gdbarch *gdbarch,
   switch ((xcr0 & X86_XSTATE_ALL_MASK))
     {
     case X86_XSTATE_AVX_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_i386_avx_mpx_avx512_linux;
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_i386_avx_avx512_linux;
     case X86_XSTATE_MPX_MASK:
       return tdesc_i386_mpx_linux;
     case X86_XSTATE_AVX_MPX_MASK:
@@ -1086,5 +1088,6 @@ _initialize_i386_linux_tdep (void)
   initialize_tdesc_i386_avx_linux ();
   initialize_tdesc_i386_mpx_linux ();
   initialize_tdesc_i386_avx_mpx_linux ();
+  initialize_tdesc_i386_avx_avx512_linux ();
   initialize_tdesc_i386_avx_mpx_avx512_linux ();
 }
diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h
index 8242554..06190fa 100644
--- a/gdb/i386-linux-tdep.h
+++ b/gdb/i386-linux-tdep.h
@@ -48,6 +48,7 @@ extern struct target_desc *tdesc_i386_mmx_linux;
 extern struct target_desc *tdesc_i386_avx_linux;
 extern struct target_desc *tdesc_i386_mpx_linux;
 extern struct target_desc *tdesc_i386_avx_mpx_linux;
+extern struct target_desc *tdesc_i386_avx_avx512_linux;
 extern struct target_desc *tdesc_i386_avx_mpx_avx512_linux;
 
 /* Format of XSAVE extended state is:
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 9892a84..f66dcc0 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -54,6 +54,7 @@
 #include "features/i386/i386-avx.c"
 #include "features/i386/i386-mpx.c"
 #include "features/i386/i386-avx-mpx.c"
+#include "features/i386/i386-avx-avx512.c"
 #include "features/i386/i386-avx-mpx-avx512.c"
 #include "features/i386/i386-mmx.c"
 
@@ -8210,7 +8211,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
       if (!feature_avx)
 	return 0;
 
-      tdep->xcr0 = X86_XSTATE_AVX_MPX_AVX512_MASK;
+      tdep->xcr0 = X86_XSTATE_AVX_AVX512_MASK;
 
       /* It may have been set by OSABI initialization function.  */
       if (tdep->k0_regnum < 0)
@@ -8686,8 +8687,9 @@ i386_target_description (uint64_t xcr0)
   switch (xcr0 & X86_XSTATE_ALL_MASK)
     {
     case X86_XSTATE_AVX_MPX_AVX512_MASK:
-    case X86_XSTATE_AVX_AVX512_MASK:
       return tdesc_i386_avx_mpx_avx512;
+    case X86_XSTATE_AVX_AVX512_MASK:
+      return tdesc_i386_avx_avx512;
     case X86_XSTATE_AVX_MPX_MASK:
       return tdesc_i386_avx_mpx;
     case X86_XSTATE_MPX_MASK:
@@ -9029,6 +9031,7 @@ Show Intel Memory Protection Extensions specific variables."),
   initialize_tdesc_i386_avx ();
   initialize_tdesc_i386_mpx ();
   initialize_tdesc_i386_avx_mpx ();
+  initialize_tdesc_i386_avx_avx512 ();
   initialize_tdesc_i386_avx_mpx_avx512 ();
 
   /* Tell remote stub that we support XML target description.  */
diff --git a/gdb/regformats/i386/x32-avx-mpx-avx512.dat b/gdb/regformats/i386/amd64-avx-avx512-linux.dat
similarity index 89%
rename from gdb/regformats/i386/x32-avx-mpx-avx512.dat
rename to gdb/regformats/i386/amd64-avx-avx512-linux.dat
index e872082..0743693 100644
--- a/gdb/regformats/i386/x32-avx-mpx-avx512.dat
+++ b/gdb/regformats/i386/amd64-avx-avx512-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/x32-avx-mpx-avx512.xml
-name:x32_avx_mpx_avx512
-xmltarget:x32-avx-mpx-avx512.xml
+# Generated from: i386/amd64-avx-avx512-linux.xml
+name:amd64_avx_avx512_linux
+xmltarget:amd64-avx-avx512-linux.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
@@ -60,6 +60,9 @@ expedite:rbp,rsp,rip
 128:xmm14
 128:xmm15
 32:mxcsr
+64:orig_rax
+64:fs_base
+64:gs_base
 128:ymm0h
 128:ymm1h
 128:ymm2h
@@ -76,12 +79,6 @@ expedite:rbp,rsp,rip
 128:ymm13h
 128:ymm14h
 128:ymm15h
-128:bnd0raw
-128:bnd1raw
-128:bnd2raw
-128:bnd3raw
-64:bndcfgu
-64:bndstatus
 128:xmm16
 128:xmm17
 128:xmm18
diff --git a/gdb/regformats/i386/amd64-avx-avx512.dat b/gdb/regformats/i386/amd64-avx-avx512.dat
new file mode 100644
index 0000000..b7938e6
--- /dev/null
+++ b/gdb/regformats/i386/amd64-avx-avx512.dat
@@ -0,0 +1,150 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: i386/amd64-avx-avx512.xml
+name:amd64_avx_avx512
+xmltarget:amd64-avx-avx512.xml
+expedite:rbp,rsp,rip
+64:rax
+64:rbx
+64:rcx
+64:rdx
+64:rsi
+64:rdi
+64:rbp
+64:rsp
+64:r8
+64:r9
+64:r10
+64:r11
+64:r12
+64:r13
+64:r14
+64:r15
+64:rip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+128:xmm8
+128:xmm9
+128:xmm10
+128:xmm11
+128:xmm12
+128:xmm13
+128:xmm14
+128:xmm15
+32:mxcsr
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+128:ymm8h
+128:ymm9h
+128:ymm10h
+128:ymm11h
+128:ymm12h
+128:ymm13h
+128:ymm14h
+128:ymm15h
+128:xmm16
+128:xmm17
+128:xmm18
+128:xmm19
+128:xmm20
+128:xmm21
+128:xmm22
+128:xmm23
+128:xmm24
+128:xmm25
+128:xmm26
+128:xmm27
+128:xmm28
+128:xmm29
+128:xmm30
+128:xmm31
+128:ymm16h
+128:ymm17h
+128:ymm18h
+128:ymm19h
+128:ymm20h
+128:ymm21h
+128:ymm22h
+128:ymm23h
+128:ymm24h
+128:ymm25h
+128:ymm26h
+128:ymm27h
+128:ymm28h
+128:ymm29h
+128:ymm30h
+128:ymm31h
+64:k0
+64:k1
+64:k2
+64:k3
+64:k4
+64:k5
+64:k6
+64:k7
+256:zmm0h
+256:zmm1h
+256:zmm2h
+256:zmm3h
+256:zmm4h
+256:zmm5h
+256:zmm6h
+256:zmm7h
+256:zmm8h
+256:zmm9h
+256:zmm10h
+256:zmm11h
+256:zmm12h
+256:zmm13h
+256:zmm14h
+256:zmm15h
+256:zmm16h
+256:zmm17h
+256:zmm18h
+256:zmm19h
+256:zmm20h
+256:zmm21h
+256:zmm22h
+256:zmm23h
+256:zmm24h
+256:zmm25h
+256:zmm26h
+256:zmm27h
+256:zmm28h
+256:zmm29h
+256:zmm30h
+256:zmm31h
diff --git a/gdb/regformats/i386/i386-avx-avx512-linux.dat b/gdb/regformats/i386/i386-avx-avx512-linux.dat
new file mode 100644
index 0000000..4477133
--- /dev/null
+++ b/gdb/regformats/i386/i386-avx-avx512-linux.dat
@@ -0,0 +1,71 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: i386/i386-avx-avx512-linux.xml
+name:i386_avx_avx512_linux
+xmltarget:i386-avx-avx512-linux.xml
+expedite:ebp,esp,eip
+32:eax
+32:ecx
+32:edx
+32:ebx
+32:esp
+32:ebp
+32:esi
+32:edi
+32:eip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+32:mxcsr
+32:orig_eax
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+64:k0
+64:k1
+64:k2
+64:k3
+64:k4
+64:k5
+64:k6
+64:k7
+256:zmm0h
+256:zmm1h
+256:zmm2h
+256:zmm3h
+256:zmm4h
+256:zmm5h
+256:zmm6h
+256:zmm7h
diff --git a/gdb/regformats/i386/i386-avx-avx512.dat b/gdb/regformats/i386/i386-avx-avx512.dat
new file mode 100644
index 0000000..45b6f6c
--- /dev/null
+++ b/gdb/regformats/i386/i386-avx-avx512.dat
@@ -0,0 +1,70 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: i386/i386-avx-avx512.xml
+name:i386_avx_avx512
+xmltarget:i386-avx-avx512.xml
+expedite:ebp,esp,eip
+32:eax
+32:ecx
+32:edx
+32:ebx
+32:esp
+32:ebp
+32:esi
+32:edi
+32:eip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+32:mxcsr
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+64:k0
+64:k1
+64:k2
+64:k3
+64:k4
+64:k5
+64:k6
+64:k7
+256:zmm0h
+256:zmm1h
+256:zmm2h
+256:zmm3h
+256:zmm4h
+256:zmm5h
+256:zmm6h
+256:zmm7h
diff --git a/gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat b/gdb/regformats/i386/x32-avx-avx512-linux.dat
similarity index 88%
rename from gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat
rename to gdb/regformats/i386/x32-avx-avx512-linux.dat
index b8b9d52..0078617 100644
--- a/gdb/regformats/i386/x32-avx-mpx-avx512-linux.dat
+++ b/gdb/regformats/i386/x32-avx-avx512-linux.dat
@@ -1,7 +1,7 @@
 # THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
-# Generated from: i386/x32-avx-mpx-avx512-linux.xml
-name:x32_avx_mpx_avx512_linux
-xmltarget:x32-avx-mpx-avx512-linux.xml
+# Generated from: i386/x32-avx-avx512-linux.xml
+name:x32_avx_avx512_linux
+xmltarget:x32-avx-avx512-linux.xml
 expedite:rbp,rsp,rip
 64:rax
 64:rbx
@@ -79,12 +79,6 @@ expedite:rbp,rsp,rip
 128:ymm13h
 128:ymm14h
 128:ymm15h
-128:bnd0raw
-128:bnd1raw
-128:bnd2raw
-128:bnd3raw
-64:bndcfgu
-64:bndstatus
 128:xmm16
 128:xmm17
 128:xmm18
diff --git a/gdb/regformats/i386/x32-avx-avx512.dat b/gdb/regformats/i386/x32-avx-avx512.dat
new file mode 100644
index 0000000..3f96035
--- /dev/null
+++ b/gdb/regformats/i386/x32-avx-avx512.dat
@@ -0,0 +1,150 @@
+# THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi :set ro:
+# Generated from: i386/x32-avx-avx512.xml
+name:x32_avx_avx512
+xmltarget:x32-avx-avx512.xml
+expedite:rbp,rsp,rip
+64:rax
+64:rbx
+64:rcx
+64:rdx
+64:rsi
+64:rdi
+64:rbp
+64:rsp
+64:r8
+64:r9
+64:r10
+64:r11
+64:r12
+64:r13
+64:r14
+64:r15
+64:rip
+32:eflags
+32:cs
+32:ss
+32:ds
+32:es
+32:fs
+32:gs
+80:st0
+80:st1
+80:st2
+80:st3
+80:st4
+80:st5
+80:st6
+80:st7
+32:fctrl
+32:fstat
+32:ftag
+32:fiseg
+32:fioff
+32:foseg
+32:fooff
+32:fop
+128:xmm0
+128:xmm1
+128:xmm2
+128:xmm3
+128:xmm4
+128:xmm5
+128:xmm6
+128:xmm7
+128:xmm8
+128:xmm9
+128:xmm10
+128:xmm11
+128:xmm12
+128:xmm13
+128:xmm14
+128:xmm15
+32:mxcsr
+128:ymm0h
+128:ymm1h
+128:ymm2h
+128:ymm3h
+128:ymm4h
+128:ymm5h
+128:ymm6h
+128:ymm7h
+128:ymm8h
+128:ymm9h
+128:ymm10h
+128:ymm11h
+128:ymm12h
+128:ymm13h
+128:ymm14h
+128:ymm15h
+128:xmm16
+128:xmm17
+128:xmm18
+128:xmm19
+128:xmm20
+128:xmm21
+128:xmm22
+128:xmm23
+128:xmm24
+128:xmm25
+128:xmm26
+128:xmm27
+128:xmm28
+128:xmm29
+128:xmm30
+128:xmm31
+128:ymm16h
+128:ymm17h
+128:ymm18h
+128:ymm19h
+128:ymm20h
+128:ymm21h
+128:ymm22h
+128:ymm23h
+128:ymm24h
+128:ymm25h
+128:ymm26h
+128:ymm27h
+128:ymm28h
+128:ymm29h
+128:ymm30h
+128:ymm31h
+64:k0
+64:k1
+64:k2
+64:k3
+64:k4
+64:k5
+64:k6
+64:k7
+256:zmm0h
+256:zmm1h
+256:zmm2h
+256:zmm3h
+256:zmm4h
+256:zmm5h
+256:zmm6h
+256:zmm7h
+256:zmm8h
+256:zmm9h
+256:zmm10h
+256:zmm11h
+256:zmm12h
+256:zmm13h
+256:zmm14h
+256:zmm15h
+256:zmm16h
+256:zmm17h
+256:zmm18h
+256:zmm19h
+256:zmm20h
+256:zmm21h
+256:zmm22h
+256:zmm23h
+256:zmm24h
+256:zmm25h
+256:zmm26h
+256:zmm27h
+256:zmm28h
+256:zmm29h
+256:zmm30h
+256:zmm31h
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 6c6ad3e..e6adb4e 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -205,11 +205,16 @@ x86_linux_read_description (struct target_ops *ops)
       switch (xcr0_features_bits)
 	{
 	case X86_XSTATE_AVX_MPX_AVX512_MASK:
-	case X86_XSTATE_AVX_AVX512_MASK:
 	  if (is_x32)
-	    return tdesc_x32_avx_mpx_avx512_linux;
+	    /* No MPX on x32, fallback to AVX-AVX512.  */
+	    return tdesc_x32_avx_avx512_linux;
 	  else
 	    return tdesc_amd64_avx_mpx_avx512_linux;
+	case X86_XSTATE_AVX_AVX512_MASK:
+	  if (is_x32)
+	    return tdesc_x32_avx_avx512_linux;
+	  else
+	    return tdesc_amd64_avx_avx512_linux;
 	case X86_XSTATE_MPX_MASK:
 	  if (is_x32)
 	    return tdesc_x32_avx_linux; /* No MPX on x32 using AVX.  */
@@ -238,8 +243,9 @@ x86_linux_read_description (struct target_ops *ops)
       switch (xcr0_features_bits)
 	{
 	case X86_XSTATE_AVX_MPX_AVX512_MASK:
-	case X86_XSTATE_AVX_AVX512_MASK:
 	  return tdesc_i386_avx_mpx_avx512_linux;
+	case X86_XSTATE_AVX_AVX512_MASK:
+	  return tdesc_i386_avx_avx512_linux;
 	case X86_XSTATE_MPX_MASK:
 	  return tdesc_i386_mpx_linux;
 	case X86_XSTATE_AVX_MPX_MASK:
-- 
1.8.4.2

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
@ 2017-02-01 13:09   ` Eli Zaretskii
  2017-02-03  9:20     ` Sturm, Michael
  2017-02-10 15:46   ` Pedro Alves
  2017-06-19 20:15   ` Simon Marchi
  2 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2017-02-01 13:09 UTC (permalink / raw)
  To: Michael Sturm; +Cc: mark.kettenis, palves, gdb-patches

> From: Michael Sturm <michael.sturm@intel.com>
> Cc: gdb-patches@sourceware.org, michael.sturm@intel.com
> Date: Wed,  1 Feb 2017 14:03:25 +0100
> 
> This patch adds support for the registers added by the
> Memory Protection Keys for Userspace (PKU aka PKEYs) feature.
> Native and remote debugging are covered by this patch.
> 
> The XSAVE area is extended with a new state containing
> the 32-bit wide PKRU register. The new register is added to
> amd64-avx-mpx_avx512-* tdesc, thus it is renamed accordingly. Also,
> respective xstate mask X86_XSTATE_AVX_MPX_AVX512_MASK is renamed to
> X86_XSTATE_AVX_MPX_AVX512_PKU_MASK to reflect the new feature set
> it supports.
> 
> For more information, please refer to the
> Intel(R) 64 and IA-32 Architectures Software Developer's
> Manual - Septemper 2015
> http://www.intel.com/content/dam/www/public/us/en/documents/
> manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

OK for the documentation parts.

Thanks.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-02-01 13:09   ` Eli Zaretskii
@ 2017-02-03  9:20     ` Sturm, Michael
  0 siblings, 0 replies; 22+ messages in thread
From: Sturm, Michael @ 2017-02-03  9:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mark.kettenis, palves, gdb-patches

Thank you , Eli!

Thanks and Regards,
Michael

On 01/02/2017 14:08, Eli Zaretskii wrote:
>> From: Michael Sturm <michael.sturm@intel.com>
>> Cc: gdb-patches@sourceware.org, michael.sturm@intel.com
>> Date: Wed,  1 Feb 2017 14:03:25 +0100
>>
>> This patch adds support for the registers added by the
>> Memory Protection Keys for Userspace (PKU aka PKEYs) feature.
>> Native and remote debugging are covered by this patch.
>>
>> The XSAVE area is extended with a new state containing
>> the 32-bit wide PKRU register. The new register is added to
>> amd64-avx-mpx_avx512-* tdesc, thus it is renamed accordingly. Also,
>> respective xstate mask X86_XSTATE_AVX_MPX_AVX512_MASK is renamed to
>> X86_XSTATE_AVX_MPX_AVX512_PKU_MASK to reflect the new feature set
>> it supports.
>>
>> For more information, please refer to the
>> Intel(R) 64 and IA-32 Architectures Software Developer's
>> Manual - Septemper 2015
>> http://www.intel.com/content/dam/www/public/us/en/documents/
>> manuals/64-ia-32-architectures-software-developer-manual-325462.pdf
> OK for the documentation parts.
>
> Thanks.

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [ping][PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
                   ` (4 preceding siblings ...)
  2017-02-01 13:04 ` [PATCH 4/5] Add target description for avx-avx512 Michael Sturm
@ 2017-02-07 14:29 ` Sturm, Michael
  2017-02-17 13:47 ` [pushed] " Sturm, Michael
  6 siblings, 0 replies; 22+ messages in thread
From: Sturm, Michael @ 2017-02-07 14:29 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches

Hello Pedro, All,

Can this version of the series be merged? Looking forward to your 
review/comments!

Thanks and Regards,
Michael



On 01/02/2017 14:03, Michael Sturm wrote:
> This patch series adds support for the registers added by the
> Memory Protection Keys for Userspace (PKU aka PKEYs).
> Native and remote debugging are covered by this patch.
>
> The feedback I got during the first review of this patch raised
> questions regarding the naming of XSTATE masks and target descriptors.
> in addition, Walfred started working on patches that included renaming
> of XSTATE masks and target descriptors. These patches have been submitted
> by now.
> (https://sourceware.org/ml/gdb-patches/2016-04/msg00329.html)
> (https://sourceware.org/ml/gdb-patches/2016-04/msg00328.html)
>
> Adressed in V4:
> Updated copyrights to 2017 throughout the series.
>
> * [PATCH v3 2/5] Change xstate_bv handling to use 8 bytes of data
>    Moved explanatory text from Changelog to commit log.
> * [PATCH v3 3/5] Rename target descriptions to reflect actual content
>    Removed unneccessary new expedites. Added fs_base/gs_base registers.
> * [PATCH v3 5/5] Add support for Intel PKRU register to GDB and GDBserver
>    Changed returned type of i386_pkru_regnum_p to bool.
>    Removed "Contributed by..." text.
>    Include stddef.h instead of stdio.h in test source file.
>    Check for actual value in pkru read back test.
>
> Adressed in V3:
> * [PATCH v2 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch
>    Added copyright blurb that got lost by accident.
> * PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data
>    Shortened description of changes in Changelog.
> * [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver
>    Corrected spurious change in NEWS and some missing spaces in comments.
>    Removed some code in the test and improved the output as pointed out by Luis..
>    
> Adressed in V2:
> * [Patch v2 1/5] New patch to sync cpuid bits with GCC as suggested by
>    Pedro.
> * [PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data:
>    Read/write xstate_bc values using endianess-aware functions.
> * [PATCH v2 3/5] Rename target descriptions to reflect actual content:
>    Addressed comments by Pedro regarding wording in Changelog.
> * [PATCH v2 4/5] Add target description for avx-avx512:
>    Addressed comments by Pedro regarding Changelog.
>    Fixed wording of comments regarding MPX on x32.
>    Removed MPX from comment in x32*.xml files.
> * [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver:
>    Adressed comments by Pedro regarding Changelog.
>    Added missing renames in GDBserver ipa-related files.
>    Changed test for PKU following comments by Pedro.
>    
>    
>    I'd like to answer Pedro's question regarding the approach of
>    adding PKRU to amd64-avx-mpx_avx512-* tdesc and renaming _without_
>    keeping a copy without PKU:
>    Q: "Is that really the right thing to do?  What about machines that
>    _don't_ support pkru?  Shouldn't we keep the older descriptions
>    for those?
>    A: The first machine to support PKU will have the xstate mask
>    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
>    The nearest existing xstate masks without PKU are
>    X86_XSTATE_AVX_AVX512_MASK, which was introduced in patch 4 of
>    this series, and X86_XSTATE_AVX_MPX_MASK.
>    I've only kept X86_XSTATE_AVX_MPX_AVX512_MASK in patch 4,
>    because it is reused in patch 5 to be renamed to
>    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
>
> Michael Sturm (5):
>    Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch.
>    Change xstate_bv handling to use 8 bytes of data.
>    Rename target descriptions to reflect actual content of description.
>    Add target description for avx-avx512.
>    Add support for Intel PKRU register to GDB and GDBserver.
>
>   gdb/NEWS                                           |   4 +
>   gdb/amd64-linux-nat.c                              |   1 +
>   gdb/amd64-linux-tdep.c                             |  30 ++-
>   gdb/amd64-linux-tdep.h                             |   7 +-
>   gdb/amd64-tdep.c                                   |  28 +-
>   gdb/amd64-tdep.h                                   |   1 +
>   gdb/common/x86-xstate.h                            |  21 +-
>   gdb/doc/gdb.texinfo                                |   4 +
>   gdb/features/Makefile                              |  64 +++--
>   gdb/features/i386/32bit-pkeys.xml                  |  13 +
>   gdb/features/i386/64bit-pkeys.xml                  |  13 +
>   gdb/features/i386/amd64-avx-avx512-linux.c         | 288 +++++++++++++++++++++
>   gdb/features/i386/amd64-avx-avx512-linux.xml       |  20 ++
>   gdb/features/i386/amd64-avx-avx512.c               | 279 ++++++++++++++++++++
>   gdb/features/i386/amd64-avx-avx512.xml             |  17 ++
>   ...12-linux.c => amd64-avx-mpx-avx512-pku-linux.c} |  11 +-
>   ...inux.xml => amd64-avx-mpx-avx512-pku-linux.xml} |   4 +-
>   .../{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} |  11 +-
>   ...d64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} |   3 +-
>   gdb/features/i386/i386-avx-avx512-linux.c          | 170 ++++++++++++
>   gdb/features/i386/i386-avx-avx512-linux.xml        |  19 ++
>   gdb/features/i386/i386-avx-avx512.c                | 165 ++++++++++++
>   gdb/features/i386/i386-avx-avx512.xml              |  17 ++
>   ...512-linux.c => i386-avx-mpx-avx512-pku-linux.c} |  11 +-
>   ...linux.xml => i386-avx-mpx-avx512-pku-linux.xml} |   4 +-
>   .../{i386-avx512.c => i386-avx-mpx-avx512-pku.c}   |  11 +-
>   ...i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} |   3 +-
>   .../{x32-avx512-linux.c => x32-avx-avx512-linux.c} | 192 ++++++--------
>   ...2-avx512-linux.xml => x32-avx-avx512-linux.xml} |   3 +-
>   .../i386/{x32-avx512.c => x32-avx-avx512.c}        | 190 ++++++--------
>   .../i386/{x32-avx512.xml => x32-avx-avx512.xml}    |   3 +-
>   gdb/gdbserver/Makefile.in                          |  50 ++--
>   gdb/gdbserver/configure.srv                        |  25 +-
>   gdb/gdbserver/i387-fp.c                            |  51 +++-
>   gdb/gdbserver/linux-amd64-ipa.c                    |  15 +-
>   gdb/gdbserver/linux-i386-ipa.c                     |  10 +-
>   gdb/gdbserver/linux-x86-low.c                      |  45 +++-
>   gdb/gdbserver/linux-x86-tdesc.h                    |  29 ++-
>   gdb/i386-linux-nat.c                               |   2 +-
>   gdb/i386-linux-tdep.c                              |  14 +-
>   gdb/i386-linux-tdep.h                              |   6 +-
>   gdb/i386-tdep.c                                    |  76 +++++-
>   gdb/i386-tdep.h                                    |  14 +-
>   gdb/i387-tdep.c                                    | 116 ++++++++-
>   gdb/i387-tdep.h                                    |   5 +
>   gdb/nat/x86-gcc-cpuid.h                            | 108 ++++----
>   .../{x32-avx512.dat => amd64-avx-avx512-linux.dat} |  15 +-
>   .../{amd64-avx512.dat => amd64-avx-avx512.dat}     |  12 +-
>   ...inux.dat => amd64-avx-mpx-avx512-pku-linux.dat} |   6 +-
>   ...x512-linux.dat => amd64-avx-mpx-avx512-pku.dat} |   7 +-
>   gdb/regformats/i386/i386-avx-avx512-linux.dat      |  71 +++++
>   gdb/regformats/i386/i386-avx-avx512.dat            |  70 +++++
>   ...vx512.dat => i386-avx-mpx-avx512-pku-linux.dat} |   8 +-
>   ...vx512-linux.dat => i386-avx-mpx-avx512-pku.dat} |   8 +-
>   gdb/regformats/i386/x32-avx-avx512-linux.dat       | 153 +++++++++++
>   gdb/regformats/i386/x32-avx-avx512.dat             | 150 +++++++++++
>   gdb/testsuite/gdb.arch/i386-pkru.c                 |  90 +++++++
>   gdb/testsuite/gdb.arch/i386-pkru.exp               |  69 +++++
>   gdb/x86-linux-nat.c                                |  20 +-
>   59 files changed, 2351 insertions(+), 501 deletions(-)
>   create mode 100644 gdb/features/i386/32bit-pkeys.xml
>   create mode 100644 gdb/features/i386/64bit-pkeys.xml
>   create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
>   create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.xml
>   create mode 100644 gdb/features/i386/amd64-avx-avx512.c
>   create mode 100644 gdb/features/i386/amd64-avx-avx512.xml
>   rename gdb/features/i386/{amd64-avx512-linux.c => amd64-avx-mpx-avx512-pku-linux.c} (97%)
>   rename gdb/features/i386/{amd64-avx512-linux.xml => amd64-avx-mpx-avx512-pku-linux.xml} (83%)
>   rename gdb/features/i386/{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} (98%)
>   rename gdb/features/i386/{amd64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} (87%)
>   create mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
>   create mode 100644 gdb/features/i386/i386-avx-avx512-linux.xml
>   create mode 100644 gdb/features/i386/i386-avx-avx512.c
>   create mode 100644 gdb/features/i386/i386-avx-avx512.xml
>   rename gdb/features/i386/{i386-avx512-linux.c => i386-avx-mpx-avx512-pku-linux.c} (96%)
>   rename gdb/features/i386/{i386-avx512-linux.xml => i386-avx-mpx-avx512-pku-linux.xml} (82%)
>   rename gdb/features/i386/{i386-avx512.c => i386-avx-mpx-avx512-pku.c} (96%)
>   rename gdb/features/i386/{i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} (87%)
>   rename gdb/features/i386/{x32-avx512-linux.c => x32-avx-avx512-linux.c} (61%)
>   rename gdb/features/i386/{x32-avx512-linux.xml => x32-avx-avx512-linux.xml} (85%)
>   rename gdb/features/i386/{x32-avx512.c => x32-avx-avx512.c} (60%)
>   rename gdb/features/i386/{x32-avx512.xml => x32-avx-avx512.xml} (89%)
>   rename gdb/regformats/i386/{x32-avx512.dat => amd64-avx-avx512-linux.dat} (90%)
>   rename gdb/regformats/i386/{amd64-avx512.dat => amd64-avx-avx512.dat} (90%)
>   rename gdb/regformats/i386/{x32-avx512-linux.dat => amd64-avx-mpx-avx512-pku-linux.dat} (91%)
>   rename gdb/regformats/i386/{amd64-avx512-linux.dat => amd64-avx-mpx-avx512-pku.dat} (92%)
>   create mode 100644 gdb/regformats/i386/i386-avx-avx512-linux.dat
>   create mode 100644 gdb/regformats/i386/i386-avx-avx512.dat
>   rename gdb/regformats/i386/{i386-avx512.dat => i386-avx-mpx-avx512-pku-linux.dat} (81%)
>   rename gdb/regformats/i386/{i386-avx512-linux.dat => i386-avx-mpx-avx512-pku.dat} (84%)
>   create mode 100644 gdb/regformats/i386/x32-avx-avx512-linux.dat
>   create mode 100644 gdb/regformats/i386/x32-avx-avx512.dat
>   create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.c
>   create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.exp
>

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 4/5] Add target description for avx-avx512.
  2017-02-01 13:04 ` [PATCH 4/5] Add target description for avx-avx512 Michael Sturm
@ 2017-02-10 15:44   ` Pedro Alves
  0 siblings, 0 replies; 22+ messages in thread
From: Pedro Alves @ 2017-02-10 15:44 UTC (permalink / raw)
  To: Michael Sturm, mark.kettenis, eliz; +Cc: gdb-patches

On 02/01/2017 01:03 PM, Michael Sturm wrote:
> +<!-- Copyright (C) 2014-2016 Free Software Foundation, Inc.

There are a few instances of 2016 in the patch that need to
be updated to 2017.  But otherwise LGTM.  Please push.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
  2017-02-01 13:09   ` Eli Zaretskii
@ 2017-02-10 15:46   ` Pedro Alves
  2017-06-19 20:15   ` Simon Marchi
  2 siblings, 0 replies; 22+ messages in thread
From: Pedro Alves @ 2017-02-10 15:46 UTC (permalink / raw)
  To: Michael Sturm, mark.kettenis, eliz; +Cc: gdb-patches

Hi Michael,

On 02/01/2017 01:03 PM, Michael Sturm wrote:

> +#define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
> +(xsave + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])

Missing indentation in the second line.

> +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \

"failed to prepare" or some such instead of "${testfile}.exp"

> +     [list debug additional_flags=${comp_flags}]] } {
> +    untested "failed to compiler x86 PKEYS test.

typo: compileR

> +# Test pkru register at startup
> +# set test_string "0"
> +
> +gdb_test "print \$pkru" 0 "pkru register"

Write " = 0" instead of "0", since the latter matches
anything that ends in 0, like "= 10" too.

> +
> +# Read values from pseudo registers.
> +gdb_breakpoint [ gdb_get_line_number "break here 1" ]
> +gdb_continue_to_breakpoint "break here 1" ".*break here 1.*"
> +
> +# set test_string ".*0x12345678.*"
> +gdb_test "info register pkru" ".*pkru.*0x12345678.*" "read pkru register"
> +
> +# set test_string ".*0x44444444.*"
> +gdb_test "print /x \$pkru = 0x44444444" "= 0x44444444" "set pkru value"
> +gdb_test "info register pkru" ".*pkru.*0x44444444.*" "read value after setting value"

All those "set test_string" bits look like stale bits?  Should we
remove them?

Fix the nits above, and you're good to go for the whole series.
Please push.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [pushed] Add support for PKRU register to GDB and GDBServer.
  2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
                   ` (5 preceding siblings ...)
  2017-02-07 14:29 ` [ping][PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Sturm, Michael
@ 2017-02-17 13:47 ` Sturm, Michael
  6 siblings, 0 replies; 22+ messages in thread
From: Sturm, Michael @ 2017-02-17 13:47 UTC (permalink / raw)
  To: mark.kettenis, palves, eliz; +Cc: gdb-patches

Thanks and Regards,
Michael

On 01/02/2017 14:03, Michael Sturm wrote:
> This patch series adds support for the registers added by the
> Memory Protection Keys for Userspace (PKU aka PKEYs).
> Native and remote debugging are covered by this patch.
>
> The feedback I got during the first review of this patch raised
> questions regarding the naming of XSTATE masks and target descriptors.
> in addition, Walfred started working on patches that included renaming
> of XSTATE masks and target descriptors. These patches have been submitted
> by now.
> (https://sourceware.org/ml/gdb-patches/2016-04/msg00329.html)
> (https://sourceware.org/ml/gdb-patches/2016-04/msg00328.html)
>
> Adressed in V4:
> Updated copyrights to 2017 throughout the series.
>
> * [PATCH v3 2/5] Change xstate_bv handling to use 8 bytes of data
>    Moved explanatory text from Changelog to commit log.
> * [PATCH v3 3/5] Rename target descriptions to reflect actual content
>    Removed unneccessary new expedites. Added fs_base/gs_base registers.
> * [PATCH v3 5/5] Add support for Intel PKRU register to GDB and GDBserver
>    Changed returned type of i386_pkru_regnum_p to bool.
>    Removed "Contributed by..." text.
>    Include stddef.h instead of stdio.h in test source file.
>    Check for actual value in pkru read back test.
>
> Adressed in V3:
> * [PATCH v2 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch
>    Added copyright blurb that got lost by accident.
> * PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data
>    Shortened description of changes in Changelog.
> * [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver
>    Corrected spurious change in NEWS and some missing spaces in comments.
>    Removed some code in the test and improved the output as pointed out by Luis..
>    
> Adressed in V2:
> * [Patch v2 1/5] New patch to sync cpuid bits with GCC as suggested by
>    Pedro.
> * [PATCH v2 2/5] Change xstate_bv handling to use 8 bytes of data:
>    Read/write xstate_bc values using endianess-aware functions.
> * [PATCH v2 3/5] Rename target descriptions to reflect actual content:
>    Addressed comments by Pedro regarding wording in Changelog.
> * [PATCH v2 4/5] Add target description for avx-avx512:
>    Addressed comments by Pedro regarding Changelog.
>    Fixed wording of comments regarding MPX on x32.
>    Removed MPX from comment in x32*.xml files.
> * [PATCH v2 5/5] Add support for Intel PKRU register to GDB and GDBserver:
>    Adressed comments by Pedro regarding Changelog.
>    Added missing renames in GDBserver ipa-related files.
>    Changed test for PKU following comments by Pedro.
>    
>    
>    I'd like to answer Pedro's question regarding the approach of
>    adding PKRU to amd64-avx-mpx_avx512-* tdesc and renaming _without_
>    keeping a copy without PKU:
>    Q: "Is that really the right thing to do?  What about machines that
>    _don't_ support pkru?  Shouldn't we keep the older descriptions
>    for those?
>    A: The first machine to support PKU will have the xstate mask
>    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
>    The nearest existing xstate masks without PKU are
>    X86_XSTATE_AVX_AVX512_MASK, which was introduced in patch 4 of
>    this series, and X86_XSTATE_AVX_MPX_MASK.
>    I've only kept X86_XSTATE_AVX_MPX_AVX512_MASK in patch 4,
>    because it is reused in patch 5 to be renamed to
>    X86_XSTATE_AVX_MPX_AVX512_PKU_MASK.
>
> Michael Sturm (5):
>    Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch.
>    Change xstate_bv handling to use 8 bytes of data.
>    Rename target descriptions to reflect actual content of description.
>    Add target description for avx-avx512.
>    Add support for Intel PKRU register to GDB and GDBserver.
>
>   gdb/NEWS                                           |   4 +
>   gdb/amd64-linux-nat.c                              |   1 +
>   gdb/amd64-linux-tdep.c                             |  30 ++-
>   gdb/amd64-linux-tdep.h                             |   7 +-
>   gdb/amd64-tdep.c                                   |  28 +-
>   gdb/amd64-tdep.h                                   |   1 +
>   gdb/common/x86-xstate.h                            |  21 +-
>   gdb/doc/gdb.texinfo                                |   4 +
>   gdb/features/Makefile                              |  64 +++--
>   gdb/features/i386/32bit-pkeys.xml                  |  13 +
>   gdb/features/i386/64bit-pkeys.xml                  |  13 +
>   gdb/features/i386/amd64-avx-avx512-linux.c         | 288 +++++++++++++++++++++
>   gdb/features/i386/amd64-avx-avx512-linux.xml       |  20 ++
>   gdb/features/i386/amd64-avx-avx512.c               | 279 ++++++++++++++++++++
>   gdb/features/i386/amd64-avx-avx512.xml             |  17 ++
>   ...12-linux.c => amd64-avx-mpx-avx512-pku-linux.c} |  11 +-
>   ...inux.xml => amd64-avx-mpx-avx512-pku-linux.xml} |   4 +-
>   .../{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} |  11 +-
>   ...d64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} |   3 +-
>   gdb/features/i386/i386-avx-avx512-linux.c          | 170 ++++++++++++
>   gdb/features/i386/i386-avx-avx512-linux.xml        |  19 ++
>   gdb/features/i386/i386-avx-avx512.c                | 165 ++++++++++++
>   gdb/features/i386/i386-avx-avx512.xml              |  17 ++
>   ...512-linux.c => i386-avx-mpx-avx512-pku-linux.c} |  11 +-
>   ...linux.xml => i386-avx-mpx-avx512-pku-linux.xml} |   4 +-
>   .../{i386-avx512.c => i386-avx-mpx-avx512-pku.c}   |  11 +-
>   ...i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} |   3 +-
>   .../{x32-avx512-linux.c => x32-avx-avx512-linux.c} | 192 ++++++--------
>   ...2-avx512-linux.xml => x32-avx-avx512-linux.xml} |   3 +-
>   .../i386/{x32-avx512.c => x32-avx-avx512.c}        | 190 ++++++--------
>   .../i386/{x32-avx512.xml => x32-avx-avx512.xml}    |   3 +-
>   gdb/gdbserver/Makefile.in                          |  50 ++--
>   gdb/gdbserver/configure.srv                        |  25 +-
>   gdb/gdbserver/i387-fp.c                            |  51 +++-
>   gdb/gdbserver/linux-amd64-ipa.c                    |  15 +-
>   gdb/gdbserver/linux-i386-ipa.c                     |  10 +-
>   gdb/gdbserver/linux-x86-low.c                      |  45 +++-
>   gdb/gdbserver/linux-x86-tdesc.h                    |  29 ++-
>   gdb/i386-linux-nat.c                               |   2 +-
>   gdb/i386-linux-tdep.c                              |  14 +-
>   gdb/i386-linux-tdep.h                              |   6 +-
>   gdb/i386-tdep.c                                    |  76 +++++-
>   gdb/i386-tdep.h                                    |  14 +-
>   gdb/i387-tdep.c                                    | 116 ++++++++-
>   gdb/i387-tdep.h                                    |   5 +
>   gdb/nat/x86-gcc-cpuid.h                            | 108 ++++----
>   .../{x32-avx512.dat => amd64-avx-avx512-linux.dat} |  15 +-
>   .../{amd64-avx512.dat => amd64-avx-avx512.dat}     |  12 +-
>   ...inux.dat => amd64-avx-mpx-avx512-pku-linux.dat} |   6 +-
>   ...x512-linux.dat => amd64-avx-mpx-avx512-pku.dat} |   7 +-
>   gdb/regformats/i386/i386-avx-avx512-linux.dat      |  71 +++++
>   gdb/regformats/i386/i386-avx-avx512.dat            |  70 +++++
>   ...vx512.dat => i386-avx-mpx-avx512-pku-linux.dat} |   8 +-
>   ...vx512-linux.dat => i386-avx-mpx-avx512-pku.dat} |   8 +-
>   gdb/regformats/i386/x32-avx-avx512-linux.dat       | 153 +++++++++++
>   gdb/regformats/i386/x32-avx-avx512.dat             | 150 +++++++++++
>   gdb/testsuite/gdb.arch/i386-pkru.c                 |  90 +++++++
>   gdb/testsuite/gdb.arch/i386-pkru.exp               |  69 +++++
>   gdb/x86-linux-nat.c                                |  20 +-
>   59 files changed, 2351 insertions(+), 501 deletions(-)
>   create mode 100644 gdb/features/i386/32bit-pkeys.xml
>   create mode 100644 gdb/features/i386/64bit-pkeys.xml
>   create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.c
>   create mode 100644 gdb/features/i386/amd64-avx-avx512-linux.xml
>   create mode 100644 gdb/features/i386/amd64-avx-avx512.c
>   create mode 100644 gdb/features/i386/amd64-avx-avx512.xml
>   rename gdb/features/i386/{amd64-avx512-linux.c => amd64-avx-mpx-avx512-pku-linux.c} (97%)
>   rename gdb/features/i386/{amd64-avx512-linux.xml => amd64-avx-mpx-avx512-pku-linux.xml} (83%)
>   rename gdb/features/i386/{amd64-avx512.c => amd64-avx-mpx-avx512-pku.c} (98%)
>   rename gdb/features/i386/{amd64-avx512.xml => amd64-avx-mpx-avx512-pku.xml} (87%)
>   create mode 100644 gdb/features/i386/i386-avx-avx512-linux.c
>   create mode 100644 gdb/features/i386/i386-avx-avx512-linux.xml
>   create mode 100644 gdb/features/i386/i386-avx-avx512.c
>   create mode 100644 gdb/features/i386/i386-avx-avx512.xml
>   rename gdb/features/i386/{i386-avx512-linux.c => i386-avx-mpx-avx512-pku-linux.c} (96%)
>   rename gdb/features/i386/{i386-avx512-linux.xml => i386-avx-mpx-avx512-pku-linux.xml} (82%)
>   rename gdb/features/i386/{i386-avx512.c => i386-avx-mpx-avx512-pku.c} (96%)
>   rename gdb/features/i386/{i386-avx512.xml => i386-avx-mpx-avx512-pku.xml} (87%)
>   rename gdb/features/i386/{x32-avx512-linux.c => x32-avx-avx512-linux.c} (61%)
>   rename gdb/features/i386/{x32-avx512-linux.xml => x32-avx-avx512-linux.xml} (85%)
>   rename gdb/features/i386/{x32-avx512.c => x32-avx-avx512.c} (60%)
>   rename gdb/features/i386/{x32-avx512.xml => x32-avx-avx512.xml} (89%)
>   rename gdb/regformats/i386/{x32-avx512.dat => amd64-avx-avx512-linux.dat} (90%)
>   rename gdb/regformats/i386/{amd64-avx512.dat => amd64-avx-avx512.dat} (90%)
>   rename gdb/regformats/i386/{x32-avx512-linux.dat => amd64-avx-mpx-avx512-pku-linux.dat} (91%)
>   rename gdb/regformats/i386/{amd64-avx512-linux.dat => amd64-avx-mpx-avx512-pku.dat} (92%)
>   create mode 100644 gdb/regformats/i386/i386-avx-avx512-linux.dat
>   create mode 100644 gdb/regformats/i386/i386-avx-avx512.dat
>   rename gdb/regformats/i386/{i386-avx512.dat => i386-avx-mpx-avx512-pku-linux.dat} (81%)
>   rename gdb/regformats/i386/{i386-avx512-linux.dat => i386-avx-mpx-avx512-pku.dat} (84%)
>   create mode 100644 gdb/regformats/i386/x32-avx-avx512-linux.dat
>   create mode 100644 gdb/regformats/i386/x32-avx-avx512.dat
>   create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.c
>   create mode 100644 gdb/testsuite/gdb.arch/i386-pkru.exp
>

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and  GDBserver.
  2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
  2017-02-01 13:09   ` Eli Zaretskii
  2017-02-10 15:46   ` Pedro Alves
@ 2017-06-19 20:15   ` Simon Marchi
  2017-06-20  7:07     ` Tedeschi, Walfred
  2 siblings, 1 reply; 22+ messages in thread
From: Simon Marchi @ 2017-06-19 20:15 UTC (permalink / raw)
  To: Michael Sturm; +Cc: mark.kettenis, palves, eliz, gdb-patches

On 2017-02-01 14:03, Michael Sturm wrote:
> @@ -281,10 +281,12 @@ $(outdir)/i386/i386-avx-avx512.dat:
> i386/32bit-core.xml i386/32bit-avx.xml \
>  			       i386/32bit-avx512.xml
>  $(outdir)/i386/i386-avx-avx512-linux.dat: i386/32bit-core.xml
> i386/32bit-avx.xml \
>  			       i386/32bit-linux.xml i386/32bit-avx512.xml
> -$(outdir)/i386/i386-avx-mpx-avx512.dat: i386/32bit-core.xml
> i386/32bit-avx.xml \
> -			       i386/32bit-mpx.xml i386/32bit-avx512.xml
> -$(outdir)/i386/i386-avx-mpx-avx512-linux.dat: i386/32bit-core.xml
> i386/32bit-avx.xml \
> -			       i386/32bit-linux.xml i386/32bit-mpx.xml 
> i386/32bit-avx512.xml
> +$(outdir)/i386/i386-avx-mpx-avx512-pku.dat: i386/32bit-core.xml

Hi Michael,

I just noticed that there is a backslash missing at the end of a line 
here ^ (in features/Makefile).  That causes an error when doing make 
clean; make.  I would have added it myself, but it also changes the 
resulting dat files, so I think it's better if you have a look and see 
if that's right.

Thanks,

Simon

> +			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml 
> \
> +			       i386/32bit-pkeys.xml
> +$(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml 
> \
> +			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml 
> \
> +			       i386/32bit-pkeys.xml i386/32bit-linux.xml
>  $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml
>  $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml 
> i386/32bit-linux.xml
>  $(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml



^ permalink raw reply	[flat|nested] 22+ messages in thread

* RE: [PATCH 5/5] Add support for Intel PKRU register to GDB and  GDBserver.
  2017-06-19 20:15   ` Simon Marchi
@ 2017-06-20  7:07     ` Tedeschi, Walfred
  2017-06-20  8:49       ` Simon Marchi
  2017-06-20 10:07       ` Yao Qi
  0 siblings, 2 replies; 22+ messages in thread
From: Tedeschi, Walfred @ 2017-06-20  7:07 UTC (permalink / raw)
  To: Simon Marchi, Sturm, Michael; +Cc: mark.kettenis, palves, eliz, gdb-patches



-----Original Message-----
From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-owner@sourceware.org] On Behalf Of Simon Marchi
Sent: Monday, June 19, 2017 9:15 PM
To: Sturm, Michael <michael.sturm@intel.com>
Cc: mark.kettenis@xs4all.nl; palves@redhat.com; eliz@gnu.org; gdb-patches@sourceware.org
Subject: Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.

On 2017-02-01 14:03, Michael Sturm wrote:
> @@ -281,10 +281,12 @@ $(outdir)/i386/i386-avx-avx512.dat:
> i386/32bit-core.xml i386/32bit-avx.xml \
>  			       i386/32bit-avx512.xml
>  $(outdir)/i386/i386-avx-avx512-linux.dat: i386/32bit-core.xml 
> i386/32bit-avx.xml \
>  			       i386/32bit-linux.xml i386/32bit-avx512.xml
> -$(outdir)/i386/i386-avx-mpx-avx512.dat: i386/32bit-core.xml 
> i386/32bit-avx.xml \
> -			       i386/32bit-mpx.xml i386/32bit-avx512.xml
> -$(outdir)/i386/i386-avx-mpx-avx512-linux.dat: i386/32bit-core.xml 
> i386/32bit-avx.xml \
> -			       i386/32bit-linux.xml i386/32bit-mpx.xml 
> i386/32bit-avx512.xml
> +$(outdir)/i386/i386-avx-mpx-avx512-pku.dat: i386/32bit-core.xml

Hi Michael,

I just noticed that there is a backslash missing at the end of a line here ^ (in features/Makefile).  That causes an error when doing make clean; make.  I would have added it myself, but it also changes the resulting dat files, so I think it's better if you have a look and see if that's right.

Thanks,

Simon

> +			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml
> \
> +			       i386/32bit-pkeys.xml
> +$(outdir)/i386/i386-avx-mpx-avx512-pku-linux.dat: i386/32bit-core.xml
> \
> +			       i386/32bit-avx.xml i386/32bit-mpx.xml i386/32bit-avx512.xml
> \
> +			       i386/32bit-pkeys.xml i386/32bit-linux.xml
>  $(outdir)/i386/i386-mmx.dat: i386/32bit-core.xml
>  $(outdir)/i386/i386-mmx-linux.dat: i386/32bit-core.xml 
> i386/32bit-linux.xml
>  $(outdir)/i386/amd64-avx.dat: i386/64bit-core.xml i386/64bit-avx.xml


Hi Simon,

Michael I am taking over Michaels activities. May I prepare as an obvious patch?

Thanks and regards,
/Fred
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and  GDBserver.
  2017-06-20  7:07     ` Tedeschi, Walfred
@ 2017-06-20  8:49       ` Simon Marchi
  2017-06-20 10:07       ` Yao Qi
  1 sibling, 0 replies; 22+ messages in thread
From: Simon Marchi @ 2017-06-20  8:49 UTC (permalink / raw)
  To: Tedeschi, Walfred
  Cc: Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches

On 2017-06-20 09:07, Tedeschi, Walfred wrote:
> Hi Simon,
> 
> Michael I am taking over Michaels activities. May I prepare as an 
> obvious patch?

Hi Walfred,

It would be nice if you could send a patch, yes.  Whether it is obvious 
or not depends on what the patch contains.

Simon

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and  GDBserver.
  2017-06-20  7:07     ` Tedeschi, Walfred
  2017-06-20  8:49       ` Simon Marchi
@ 2017-06-20 10:07       ` Yao Qi
  2017-06-20 10:53         ` Tedeschi, Walfred
  1 sibling, 1 reply; 22+ messages in thread
From: Yao Qi @ 2017-06-20 10:07 UTC (permalink / raw)
  To: Tedeschi, Walfred
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches

"Tedeschi, Walfred" <walfred.tedeschi@intel.com> writes:

> Hi Simon,
>
> Michael I am taking over Michaels activities. May I prepare as an obvious patch?

FWIW, This patch series (being reviewed)

 [PATCH 00/25 V2] Make GDB builtin target descriptions more flexible
 https://sourceware.org/ml/gdb-patches/2017-06/msg00293.html

definitely helps reducing the number of xml files and c files added in
your patch.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-20 10:07       ` Yao Qi
@ 2017-06-20 10:53         ` Tedeschi, Walfred
  2017-06-20 11:03           ` Yao Qi
  0 siblings, 1 reply; 22+ messages in thread
From: Tedeschi, Walfred @ 2017-06-20 10:53 UTC (permalink / raw)
  To: Yao Qi
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches



Am 6/20/2017 um 11:07 AM schrieb Yao Qi:
> "Tedeschi, Walfred" <walfred.tedeschi@intel.com> writes:
>
>> Hi Simon,
>>
>> Michael I am taking over Michaels activities. May I prepare as an obvious patch?
> FWIW, This patch series (being reviewed)
>
>   [PATCH 00/25 V2] Make GDB builtin target descriptions more flexible
>   https://sourceware.org/ml/gdb-patches/2017-06/msg00293.html
>
> definitely helps reducing the number of xml files and c files added in
> your patch.
>

Hi Yao,

May i ask you to create a temporary branch for this patch series.
My intention is to apply and test around in some configurations we have.

Thanks and regards,
/Fred
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-20 10:53         ` Tedeschi, Walfred
@ 2017-06-20 11:03           ` Yao Qi
  2017-06-20 11:04             ` Tedeschi, Walfred
  2017-06-22 11:17             ` Tedeschi, Walfred
  0 siblings, 2 replies; 22+ messages in thread
From: Yao Qi @ 2017-06-20 11:03 UTC (permalink / raw)
  To: Tedeschi, Walfred
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches

"Tedeschi, Walfred" <walfred.tedeschi@intel.com> writes:

> May i ask you to create a temporary branch for this patch series.
> My intention is to apply and test around in some configurations we have.

It is users/qiyao/target-desc-2

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-20 11:03           ` Yao Qi
@ 2017-06-20 11:04             ` Tedeschi, Walfred
  2017-06-22 11:17             ` Tedeschi, Walfred
  1 sibling, 0 replies; 22+ messages in thread
From: Tedeschi, Walfred @ 2017-06-20 11:04 UTC (permalink / raw)
  To: Yao Qi
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches



Am 6/20/2017 um 12:03 PM schrieb Yao Qi:
> "Tedeschi, Walfred" <walfred.tedeschi@intel.com> writes:
>
>> May i ask you to create a temporary branch for this patch series.
>> My intention is to apply and test around in some configurations we have.
> It is users/qiyao/target-desc-2

Yao,

Thanks!

Best regards,
/Fred
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-20 11:03           ` Yao Qi
  2017-06-20 11:04             ` Tedeschi, Walfred
@ 2017-06-22 11:17             ` Tedeschi, Walfred
  2017-06-22 11:39               ` Yao Qi
  1 sibling, 1 reply; 22+ messages in thread
From: Tedeschi, Walfred @ 2017-06-22 11:17 UTC (permalink / raw)
  To: Yao Qi
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches



Am 6/20/2017 um 12:03 PM schrieb Yao Qi:
> "Tedeschi, Walfred" <walfred.tedeschi@intel.com> writes:
>
>> May i ask you to create a temporary branch for this patch series.
>> My intention is to apply and test around in some configurations we have.
> It is users/qiyao/target-desc-2
>
Yao,

Thanks a lot for doing this!
At first glance everything looks fine.  I will give it a try in some 
hardware we have and let you known.
Also, I will take a closer look on the patches.

I also saw that in the middle of your patches there is a part of the fix 
that Simon is asking here.
Basically adding the "\" and regenerating the removes one of your commits.
Do you want me to push?

Thanks again and best regards,
/Fred
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-22 11:17             ` Tedeschi, Walfred
@ 2017-06-22 11:39               ` Yao Qi
  2017-06-22 11:53                 ` Tedeschi, Walfred
  0 siblings, 1 reply; 22+ messages in thread
From: Yao Qi @ 2017-06-22 11:39 UTC (permalink / raw)
  To: Tedeschi, Walfred
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches

On Thu, Jun 22, 2017 at 12:17 PM, Tedeschi, Walfred
<walfred.tedeschi@intel.com> wrote:
>
> Thanks a lot for doing this!
> At first glance everything looks fine.  I will give it a try in some
> hardware we have and let you known.
> Also, I will take a closer look on the patches.
>

Please play them on some hardware, and comments
are welcome.  I think this patch series will significantly
simplify target descriptions for various Intel
architecture features.

> I also saw that in the middle of your patches there is a part of the fix
> that Simon is asking here.
> Basically adding the "\" and regenerating the removes one of your commits.
> Do you want me to push?
>

What is that?  Is it my patch
"[PATCH 22/25] Regenerate two regformats/i386/.dat files"?  FWIW, it
should be pushed in.

-- 
Yao (齐尧)

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver.
  2017-06-22 11:39               ` Yao Qi
@ 2017-06-22 11:53                 ` Tedeschi, Walfred
  0 siblings, 0 replies; 22+ messages in thread
From: Tedeschi, Walfred @ 2017-06-22 11:53 UTC (permalink / raw)
  To: Yao Qi
  Cc: Simon Marchi, Sturm, Michael, mark.kettenis, palves, eliz, gdb-patches



Am 6/22/2017 um 12:39 PM schrieb Yao Qi:
> On Thu, Jun 22, 2017 at 12:17 PM, Tedeschi, Walfred
> <walfred.tedeschi@intel.com> wrote:
>> Thanks a lot for doing this!
>> At first glance everything looks fine.  I will give it a try in some
>> hardware we have and let you known.
>> Also, I will take a closer look on the patches.
>>
> Please play them on some hardware, and comments
> are welcome.  I think this patch series will significantly
> simplify target descriptions for various Intel
> architecture features.
I am doing it right now! And yes it simplifies a lot!
Thanks again!
>> I also saw that in the middle of your patches there is a part of the fix
>> that Simon is asking here.
>> Basically adding the "\" and regenerating the removes one of your commits.
>> Do you want me to push?
>>
> What is that?  Is it my patch
> "[PATCH 22/25] Regenerate two regformats/i386/.dat files"?  FWIW, it
> should be pushed in.
Yes this one!

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2017-06-22 11:53 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-01 13:04 [PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Michael Sturm
2017-02-01 13:03 ` [PATCH 2/5] Change xstate_bv handling to use 8 bytes of data Michael Sturm
2017-02-01 13:03 ` [PATCH 1/5] Sync up x86-gcc-cpuid.h with cpuid.h from gcc-6 branch Michael Sturm
2017-02-01 13:03 ` [PATCH 3/5] Rename target descriptions to reflect actual content of description Michael Sturm
2017-02-01 13:04 ` [PATCH 5/5] Add support for Intel PKRU register to GDB and GDBserver Michael Sturm
2017-02-01 13:09   ` Eli Zaretskii
2017-02-03  9:20     ` Sturm, Michael
2017-02-10 15:46   ` Pedro Alves
2017-06-19 20:15   ` Simon Marchi
2017-06-20  7:07     ` Tedeschi, Walfred
2017-06-20  8:49       ` Simon Marchi
2017-06-20 10:07       ` Yao Qi
2017-06-20 10:53         ` Tedeschi, Walfred
2017-06-20 11:03           ` Yao Qi
2017-06-20 11:04             ` Tedeschi, Walfred
2017-06-22 11:17             ` Tedeschi, Walfred
2017-06-22 11:39               ` Yao Qi
2017-06-22 11:53                 ` Tedeschi, Walfred
2017-02-01 13:04 ` [PATCH 4/5] Add target description for avx-avx512 Michael Sturm
2017-02-10 15:44   ` Pedro Alves
2017-02-07 14:29 ` [ping][PATCH v4 0/5] Add support for PKRU register to GDB and GDBServer Sturm, Michael
2017-02-17 13:47 ` [pushed] " Sturm, Michael

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).