kmemcheck has it's own tiny opcode decoder, and is not using the
kernel's decoder for historic reasons.

While the decoder works for more cases, it fails on quite a few
opcodes and returns incorrect values, which leads to either a
failure to detect an issue, or a false positive.

This patch adds a few of those opcodes: setne, btsl and callq,
thus causing selfcheck to fail during boot.

Signed-off-by: Sasha Levin <sasha.le...@oracle.com>
---
 arch/x86/mm/kmemcheck/selftest.c |    9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/arch/x86/mm/kmemcheck/selftest.c b/arch/x86/mm/kmemcheck/selftest.c
index aef7140..c898d33 100644
--- a/arch/x86/mm/kmemcheck/selftest.c
+++ b/arch/x86/mm/kmemcheck/selftest.c
@@ -23,6 +23,12 @@ static const struct selftest_opcode selftest_opcodes[] = {
        {1, "\x66\x0f\xbe\x51\xf8",     "movswq <mem8>, <reg16>"},
        {1, "\x0f\xbe\x51\xf8",         "movswq <mem8>, <reg32>"},
 
+       /* SETNE */
+       {1, "\x0f\x95\xc0",             "setne <reg8>"},
+
+       /* BTSL */
+       {4, "\x0f\xba\x6b\x10\x00",     "btsl <imm8>, <mem32>"},
+
 #ifdef CONFIG_X86_64
        /* MOVZX / MOVZXD */
        {1, "\x49\x0f\xb6\x51\xf8",     "movzbq <mem8>, <reg64>"},
@@ -32,6 +38,9 @@ static const struct selftest_opcode selftest_opcodes[] = {
        {1, "\x49\x0f\xbe\x51\xf8",     "movsbq <mem8>, <reg64>"},
        {2, "\x49\x0f\xbf\x51\xf8",     "movsbq <mem16>, <reg64>"},
        {4, "\x49\x63\x51\xf8",         "movslq <mem32>, <reg64>"},
+
+       /* CALLQ */
+       {8, "\xe8\x00\x00\x00",         "call <mem64>"},
 #endif
 };
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to