Fix PR16193 - gdbserver aborts.
authorWalfred Tedeschi <walfred.tedeschi@intel.com>
Tue, 26 Nov 2013 08:32:16 +0000 (08:32 +0000)
committerWalfred Tedeschi <walfred.tedeschi@intel.com>
Tue, 26 Nov 2013 08:32:16 +0000 (08:32 +0000)
The MPX patch has broken the I386_XSTATE_SIZE macro.  For AVX machines,
it ends up returning I386_XSTATE_SSE_SIZE.  Where it first reads
I386_XSTATE_AVX_SIZE, it should have read I386_XSTATE_AVX:

 #define I386_XSTATE_SIZE(XCR0) \
     (((XCR0) & I386_XSTATE_BNDCFG) != 0 ? I386_XSTATE_BNDCFG_SIZE \
        : (((XCR0) & I386_XSTATE_BNDREGS) != 0 ? I386_XSTATE_BNDCFG_SIZE \
 -       : (((XCR0) & I386_XSTATE_AVX_SIZE) != 0 ? I386_XSTATE_AVX_SIZE \
 +       : (((XCR0) & I386_XSTATE_AVX) != 0 ? I386_XSTATE_AVX_SIZE \
        : I386_XSTATE_SSE_SIZE)))

The patch goes a step further and improves readability of the macro,
by adding a couple other auxiliary macros.

2013-11-26  Walfred Tedeschi  <walfred.tedeschi@intel.com>

* i386-xstate.h (I386_XSTATE_MPX): New Macro.
(I386_XSTATE_MPX_MASK): Makes use of I386_XSTATE_MPX.
(HAS_MPX): New macro.
(HAS_AVX): New macro.
(I386_XSTATE_SIZE): Uses HAS_MPX and HAS_AVX.

gdb/ChangeLog
gdb/common/i386-xstate.h

index cb5dd15..eb30c9d 100644 (file)
@@ -1,3 +1,11 @@
+2013-11-26  Walfred Tedeschi  <walfred.tedeschi@intel.com>
+
+       * i386-xstate.h (I386_XSTATE_MPX): New Macro.
+       (I386_XSTATE_MPX_MASK): Makes use of I386_XSTATE_MPX.
+       (HAS_MPX): New macro.
+       (HAS_AVX): New macro.
+       (I386_XSTATE_SIZE): Uses HAS_MPX and HAS_AVX.
+
 2013-11-25  Keith Seitz  <keiths@redhat.com>
 
        PR c++/14819
index e76ecc1..c4b8c8a 100644 (file)
 #define I386_XSTATE_AVX                (1ULL << 2)
 #define I386_XSTATE_BNDREGS    (1ULL << 3)
 #define I386_XSTATE_BNDCFG     (1ULL << 4)
+#define I386_XSTATE_MPX                (I386_XSTATE_BNDREGS | I386_XSTATE_BNDCFG)
 
 /* Supported mask and size of the extended state.  */
 #define I386_XSTATE_X87_MASK   I386_XSTATE_X87
 #define I386_XSTATE_SSE_MASK   (I386_XSTATE_X87 | I386_XSTATE_SSE)
 #define I386_XSTATE_AVX_MASK   (I386_XSTATE_SSE_MASK | I386_XSTATE_AVX)
-#define I386_XSTATE_MPX_MASK   (I386_XSTATE_AVX_MASK \
-                                | I386_XSTATE_BNDREGS \
-                                | I386_XSTATE_BNDCFG)
+#define I386_XSTATE_MPX_MASK   (I386_XSTATE_AVX_MASK | I386_XSTATE_MPX)
 
 #define I386_XSTATE_ALL_MASK    I386_XSTATE_MPX_MASK
 
 
 #define I386_XSTATE_MAX_SIZE   1088
 
+/* In case one of the MPX XCR0 bits is set we consider we have MPX.  */
+#define HAS_MPX(XCR0) (((XCR0) & I386_XSTATE_MPX) != 0)
+#define HAS_AVX(XCR0) (((XCR0) & I386_XSTATE_AVX) != 0)
+
 /* Get I386 XSAVE extended state size.  */
 #define I386_XSTATE_SIZE(XCR0) \
-    (((XCR0) & I386_XSTATE_BNDCFG) != 0 ? I386_XSTATE_BNDCFG_SIZE \
-       : (((XCR0) & I386_XSTATE_BNDREGS) != 0 ? I386_XSTATE_BNDCFG_SIZE \
-       : (((XCR0) & I386_XSTATE_AVX_SIZE) != 0 ? I386_XSTATE_AVX_SIZE \
-       : I386_XSTATE_SSE_SIZE)))
+    (HAS_MPX (XCR0) ? I386_XSTATE_BNDCFG_SIZE : \
+     (HAS_AVX (XCR0) ? I386_XSTATE_AVX_SIZE : I386_XSTATE_SSE_SIZE))
 
 #endif /* I386_XSTATE_H */