[tip:x86/pti] x86/debug: Use UD2 for WARN()

2018-02-14 Thread tip-bot for Peter Zijlstra
Commit-ID:  3b3a371cc9bc980429baabe0a8e5f307f3d1f463
Gitweb: https://git.kernel.org/tip/3b3a371cc9bc980429baabe0a8e5f307f3d1f463
Author: Peter Zijlstra 
AuthorDate: Fri, 9 Feb 2018 13:16:59 +0100
Committer:  Ingo Molnar 
CommitDate: Thu, 15 Feb 2018 01:15:50 +0100

x86/debug: Use UD2 for WARN()

Since the Intel SDM added an ModR/M byte to UD0 and binutils followed
that specification, we now cannot disassemble our kernel anymore.

This now means Intel and AMD disagree on the encoding of UD0. And instead
of playing games with additional bytes that are valid ModR/M and single
byte instructions (0xd6 for instance), simply use UD2 for both WARN() and
BUG().

Requested-by: Linus Torvalds 
Signed-off-by: Peter Zijlstra (Intel) 
Acked-by: Linus Torvalds 
Cc: Andy Lutomirski 
Cc: Arjan van de Ven 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/20180208194406.gd25...@hirez.programming.kicks-ass.net
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/bug.h | 15 ++-
 arch/x86/kernel/traps.c|  2 +-
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 71e6f4bf..6804d66 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -5,23 +5,20 @@
 #include 
 
 /*
- * Since some emulators terminate on UD2, we cannot use it for WARN.
- * Since various instruction decoders disagree on the length of UD1,
- * we cannot use it either. So use UD0 for WARN.
+ * Despite that some emulators terminate on UD2, we use it for WARN().
  *
- * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas
- *  our kernel decoder thinks it takes a ModRM byte, which seems consistent
- *  with various things like the Intel SDM instruction encoding rules)
+ * Since various instruction decoders/specs disagree on the encoding of
+ * UD0/UD1.
  */
 
-#define ASM_UD0".byte 0x0f, 0xff"
+#define ASM_UD0".byte 0x0f, 0xff" /* + ModRM (for Intel) */
 #define ASM_UD1".byte 0x0f, 0xb9" /* + ModRM */
 #define ASM_UD2".byte 0x0f, 0x0b"
 
 #define INSN_UD0   0xff0f
 #define INSN_UD2   0x0b0f
 
-#define LEN_UD02
+#define LEN_UD22
 
 #ifdef CONFIG_GENERIC_BUG
 
@@ -79,7 +76,7 @@ do {  
\
 
 #define __WARN_FLAGS(flags)\
 do {   \
-   _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags));   \
+   _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));   \
annotate_reachable();   \
 } while (0)
 
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 446c9ef..3d9b230 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr)
break;
 
case BUG_TRAP_TYPE_WARN:
-   regs->ip += LEN_UD0;
+   regs->ip += LEN_UD2;
return 1;
}
 


[tip:x86/pti] x86/debug: Use UD2 for WARN()

2018-02-14 Thread tip-bot for Peter Zijlstra
Commit-ID:  3b3a371cc9bc980429baabe0a8e5f307f3d1f463
Gitweb: https://git.kernel.org/tip/3b3a371cc9bc980429baabe0a8e5f307f3d1f463
Author: Peter Zijlstra 
AuthorDate: Fri, 9 Feb 2018 13:16:59 +0100
Committer:  Ingo Molnar 
CommitDate: Thu, 15 Feb 2018 01:15:50 +0100

x86/debug: Use UD2 for WARN()

Since the Intel SDM added an ModR/M byte to UD0 and binutils followed
that specification, we now cannot disassemble our kernel anymore.

This now means Intel and AMD disagree on the encoding of UD0. And instead
of playing games with additional bytes that are valid ModR/M and single
byte instructions (0xd6 for instance), simply use UD2 for both WARN() and
BUG().

Requested-by: Linus Torvalds 
Signed-off-by: Peter Zijlstra (Intel) 
Acked-by: Linus Torvalds 
Cc: Andy Lutomirski 
Cc: Arjan van de Ven 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/20180208194406.gd25...@hirez.programming.kicks-ass.net
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/bug.h | 15 ++-
 arch/x86/kernel/traps.c|  2 +-
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 71e6f4bf..6804d66 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -5,23 +5,20 @@
 #include 
 
 /*
- * Since some emulators terminate on UD2, we cannot use it for WARN.
- * Since various instruction decoders disagree on the length of UD1,
- * we cannot use it either. So use UD0 for WARN.
+ * Despite that some emulators terminate on UD2, we use it for WARN().
  *
- * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas
- *  our kernel decoder thinks it takes a ModRM byte, which seems consistent
- *  with various things like the Intel SDM instruction encoding rules)
+ * Since various instruction decoders/specs disagree on the encoding of
+ * UD0/UD1.
  */
 
-#define ASM_UD0".byte 0x0f, 0xff"
+#define ASM_UD0".byte 0x0f, 0xff" /* + ModRM (for Intel) */
 #define ASM_UD1".byte 0x0f, 0xb9" /* + ModRM */
 #define ASM_UD2".byte 0x0f, 0x0b"
 
 #define INSN_UD0   0xff0f
 #define INSN_UD2   0x0b0f
 
-#define LEN_UD02
+#define LEN_UD22
 
 #ifdef CONFIG_GENERIC_BUG
 
@@ -79,7 +76,7 @@ do {  
\
 
 #define __WARN_FLAGS(flags)\
 do {   \
-   _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags));   \
+   _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));   \
annotate_reachable();   \
 } while (0)
 
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 446c9ef..3d9b230 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr)
break;
 
case BUG_TRAP_TYPE_WARN:
-   regs->ip += LEN_UD0;
+   regs->ip += LEN_UD2;
return 1;
}
 


[tip:x86/pti] x86/debug: Use UD2 for WARN()

2018-02-13 Thread tip-bot for Peter Zijlstra
Commit-ID:  0eb55de80e26f87cc26eab139c097eb5a6f2b159
Gitweb: https://git.kernel.org/tip/0eb55de80e26f87cc26eab139c097eb5a6f2b159
Author: Peter Zijlstra 
AuthorDate: Fri, 9 Feb 2018 13:16:59 +0100
Committer:  Ingo Molnar 
CommitDate: Tue, 13 Feb 2018 11:47:00 +0100

x86/debug: Use UD2 for WARN()

Since the Intel SDM added an ModR/M byte to UD0 and binutils followed
that specification, we now cannot disassemble our kernel anymore.

This now means Intel and AMD disagree on the encoding of UD0. And instead
of playing games with additional bytes that are valid ModR/M and single
byte instructions (0xd6 for instance), simply use UD2 for both WARN() and
BUG().

Requested-by: Linus Torvalds 
Signed-off-by: Peter Zijlstra (Intel) 
Acked-by: Linus Torvalds 
Cc: Andy Lutomirski 
Cc: Arjan van de Ven 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/20180208194406.gd25...@hirez.programming.kicks-ass.net
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/bug.h | 15 ++-
 arch/x86/kernel/traps.c|  2 +-
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 71e6f4bf..6804d66 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -5,23 +5,20 @@
 #include 
 
 /*
- * Since some emulators terminate on UD2, we cannot use it for WARN.
- * Since various instruction decoders disagree on the length of UD1,
- * we cannot use it either. So use UD0 for WARN.
+ * Despite that some emulators terminate on UD2, we use it for WARN().
  *
- * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas
- *  our kernel decoder thinks it takes a ModRM byte, which seems consistent
- *  with various things like the Intel SDM instruction encoding rules)
+ * Since various instruction decoders/specs disagree on the encoding of
+ * UD0/UD1.
  */
 
-#define ASM_UD0".byte 0x0f, 0xff"
+#define ASM_UD0".byte 0x0f, 0xff" /* + ModRM (for Intel) */
 #define ASM_UD1".byte 0x0f, 0xb9" /* + ModRM */
 #define ASM_UD2".byte 0x0f, 0x0b"
 
 #define INSN_UD0   0xff0f
 #define INSN_UD2   0x0b0f
 
-#define LEN_UD02
+#define LEN_UD22
 
 #ifdef CONFIG_GENERIC_BUG
 
@@ -79,7 +76,7 @@ do {  
\
 
 #define __WARN_FLAGS(flags)\
 do {   \
-   _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags));   \
+   _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));   \
annotate_reachable();   \
 } while (0)
 
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 446c9ef..3d9b230 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr)
break;
 
case BUG_TRAP_TYPE_WARN:
-   regs->ip += LEN_UD0;
+   regs->ip += LEN_UD2;
return 1;
}
 


[tip:x86/pti] x86/debug: Use UD2 for WARN()

2018-02-13 Thread tip-bot for Peter Zijlstra
Commit-ID:  0eb55de80e26f87cc26eab139c097eb5a6f2b159
Gitweb: https://git.kernel.org/tip/0eb55de80e26f87cc26eab139c097eb5a6f2b159
Author: Peter Zijlstra 
AuthorDate: Fri, 9 Feb 2018 13:16:59 +0100
Committer:  Ingo Molnar 
CommitDate: Tue, 13 Feb 2018 11:47:00 +0100

x86/debug: Use UD2 for WARN()

Since the Intel SDM added an ModR/M byte to UD0 and binutils followed
that specification, we now cannot disassemble our kernel anymore.

This now means Intel and AMD disagree on the encoding of UD0. And instead
of playing games with additional bytes that are valid ModR/M and single
byte instructions (0xd6 for instance), simply use UD2 for both WARN() and
BUG().

Requested-by: Linus Torvalds 
Signed-off-by: Peter Zijlstra (Intel) 
Acked-by: Linus Torvalds 
Cc: Andy Lutomirski 
Cc: Arjan van de Ven 
Cc: Borislav Petkov 
Cc: Brian Gerst 
Cc: Denys Vlasenko 
Cc: H. Peter Anvin 
Cc: Josh Poimboeuf 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Link: 
http://lkml.kernel.org/r/20180208194406.gd25...@hirez.programming.kicks-ass.net
Signed-off-by: Ingo Molnar 
---
 arch/x86/include/asm/bug.h | 15 ++-
 arch/x86/kernel/traps.c|  2 +-
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 71e6f4bf..6804d66 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -5,23 +5,20 @@
 #include 
 
 /*
- * Since some emulators terminate on UD2, we cannot use it for WARN.
- * Since various instruction decoders disagree on the length of UD1,
- * we cannot use it either. So use UD0 for WARN.
+ * Despite that some emulators terminate on UD2, we use it for WARN().
  *
- * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas
- *  our kernel decoder thinks it takes a ModRM byte, which seems consistent
- *  with various things like the Intel SDM instruction encoding rules)
+ * Since various instruction decoders/specs disagree on the encoding of
+ * UD0/UD1.
  */
 
-#define ASM_UD0".byte 0x0f, 0xff"
+#define ASM_UD0".byte 0x0f, 0xff" /* + ModRM (for Intel) */
 #define ASM_UD1".byte 0x0f, 0xb9" /* + ModRM */
 #define ASM_UD2".byte 0x0f, 0x0b"
 
 #define INSN_UD0   0xff0f
 #define INSN_UD2   0x0b0f
 
-#define LEN_UD02
+#define LEN_UD22
 
 #ifdef CONFIG_GENERIC_BUG
 
@@ -79,7 +76,7 @@ do {  
\
 
 #define __WARN_FLAGS(flags)\
 do {   \
-   _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags));   \
+   _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));   \
annotate_reachable();   \
 } while (0)
 
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 446c9ef..3d9b230 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr)
break;
 
case BUG_TRAP_TYPE_WARN:
-   regs->ip += LEN_UD0;
+   regs->ip += LEN_UD2;
return 1;
}