From: Greg Kroah-Hartman Date: Thu, 5 Nov 2020 21:18:00 +0000 (+0100) Subject: some 5.4 experiments for warning messages X-Git-Tag: v4.4.242~62 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc1df82ef3f395e8372aed5962d30854703f21c6;p=thirdparty%2Fkernel%2Fstable-queue.git some 5.4 experiments for warning messages Not quite working yet... --- diff --git a/pending/5.4/series b/pending/5.4/series new file mode 100644 index 00000000000..21bd87d9647 --- /dev/null +++ b/pending/5.4/series @@ -0,0 +1,3 @@ +x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch +x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch +x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch diff --git a/pending/5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch b/pending/5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch new file mode 100644 index 00000000000..afaf3444c9c --- /dev/null +++ b/pending/5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch @@ -0,0 +1,44 @@ +From 004e8dce9c5595697951f7cd0e9f66b35c92265e Mon Sep 17 00:00:00 2001 +From: Masami Hiramatsu +Date: Fri, 6 Sep 2019 22:14:20 +0900 +Subject: x86: kprobes: Prohibit probing on instruction which has emulate prefix + +From: Masami Hiramatsu + +commit 004e8dce9c5595697951f7cd0e9f66b35c92265e upstream. + +Prohibit probing on instruction which has XEN_EMULATE_PREFIX +or KVM's emulate prefix. Since that prefix is a marker for Xen +and KVM, if we modify the marker by kprobe's int3, that doesn't +work as expected. + +Signed-off-by: Masami Hiramatsu +Signed-off-by: Peter Zijlstra (Intel) +Cc: Juergen Gross +Cc: x86@kernel.org +Cc: Boris Ostrovsky +Cc: Ingo Molnar +Cc: Stefano Stabellini +Cc: Andrew Cooper +Cc: Borislav Petkov +Cc: xen-devel@lists.xenproject.org +Cc: Randy Dunlap +Cc: Josh Poimboeuf +Link: https://lkml.kernel.org/r/156777566048.25081.6296162369492175325.stgit@devnote2 +Signed-off-by: Greg Kroah-Hartman + +diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c +index 43fc13c831af..4f13af7cbcdb 100644 +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -351,6 +351,10 @@ int __copy_instruction(u8 *dest, u8 *src, u8 *real, struct insn *insn) + kernel_insn_init(insn, dest, MAX_INSN_SIZE); + insn_get_length(insn); + ++ /* We can not probe force emulate prefixed instruction */ ++ if (insn_has_emulate_prefix(insn)) ++ return 0; ++ + /* Another subsystem puts a breakpoint, failed to recover */ + if (insn->opcode.bytes[0] == BREAKPOINT_INSTRUCTION) + return 0; diff --git a/pending/5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch b/pending/5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch new file mode 100644 index 00000000000..0b1523b1d33 --- /dev/null +++ b/pending/5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch @@ -0,0 +1,262 @@ +From 4d65adfcd1196818659d3bd9b42dccab291e1751 Mon Sep 17 00:00:00 2001 +From: Masami Hiramatsu +Date: Fri, 6 Sep 2019 22:14:10 +0900 +Subject: x86: xen: insn: Decode Xen and KVM emulate-prefix signature + +From: Masami Hiramatsu + +commit 4d65adfcd1196818659d3bd9b42dccab291e1751 upstream. + +Decode Xen and KVM's emulate-prefix signature by x86 insn decoder. +It is called "prefix" but actually not x86 instruction prefix, so +this adds insn.emulate_prefix_size field instead of reusing +insn.prefixes. + +If x86 decoder finds a special sequence of instructions of +XEN_EMULATE_PREFIX and 'ud2a; .ascii "kvm"', it just counts the +length, set insn.emulate_prefix_size and fold it with the next +instruction. In other words, the signature and the next instruction +is treated as a single instruction. + +Signed-off-by: Masami Hiramatsu +Signed-off-by: Peter Zijlstra (Intel) +Acked-by: Josh Poimboeuf +Cc: Juergen Gross +Cc: x86@kernel.org +Cc: Boris Ostrovsky +Cc: Ingo Molnar +Cc: Stefano Stabellini +Cc: Andrew Cooper +Cc: Borislav Petkov +Cc: xen-devel@lists.xenproject.org +Cc: Randy Dunlap +Link: https://lkml.kernel.org/r/156777564986.25081.4964537658500952557.stgit@devnote2 +Signed-off-by: Greg Kroah-Hartman + +diff --git a/arch/x86/include/asm/insn.h b/arch/x86/include/asm/insn.h +index 154f27be8bfc..5c1ae3eff9d4 100644 +--- a/arch/x86/include/asm/insn.h ++++ b/arch/x86/include/asm/insn.h +@@ -45,6 +45,7 @@ struct insn { + struct insn_field immediate2; /* for 64bit imm or seg16 */ + }; + ++ int emulate_prefix_size; + insn_attr_t attr; + unsigned char opnd_bytes; + unsigned char addr_bytes; +@@ -128,6 +129,11 @@ static inline int insn_is_evex(struct insn *insn) + return (insn->vex_prefix.nbytes == 4); + } + ++static inline int insn_has_emulate_prefix(struct insn *insn) ++{ ++ return !!insn->emulate_prefix_size; ++} ++ + /* Ensure this instruction is decoded completely */ + static inline int insn_complete(struct insn *insn) + { +diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c +index 0b5862ba6a75..404279563891 100644 +--- a/arch/x86/lib/insn.c ++++ b/arch/x86/lib/insn.c +@@ -13,6 +13,8 @@ + #include + #include + ++#include ++ + /* Verify next sizeof(t) bytes can be on the same instruction */ + #define validate_next(t, insn, n) \ + ((insn)->next_byte + sizeof(t) + n <= (insn)->end_kaddr) +@@ -58,6 +60,36 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64) + insn->addr_bytes = 4; + } + ++static const insn_byte_t xen_prefix[] = { __XEN_EMULATE_PREFIX }; ++static const insn_byte_t kvm_prefix[] = { __KVM_EMULATE_PREFIX }; ++ ++static int __insn_get_emulate_prefix(struct insn *insn, ++ const insn_byte_t *prefix, size_t len) ++{ ++ size_t i; ++ ++ for (i = 0; i < len; i++) { ++ if (peek_nbyte_next(insn_byte_t, insn, i) != prefix[i]) ++ goto err_out; ++ } ++ ++ insn->emulate_prefix_size = len; ++ insn->next_byte += len; ++ ++ return 1; ++ ++err_out: ++ return 0; ++} ++ ++static void insn_get_emulate_prefix(struct insn *insn) ++{ ++ if (__insn_get_emulate_prefix(insn, xen_prefix, sizeof(xen_prefix))) ++ return; ++ ++ __insn_get_emulate_prefix(insn, kvm_prefix, sizeof(kvm_prefix)); ++} ++ + /** + * insn_get_prefixes - scan x86 instruction prefix bytes + * @insn: &struct insn containing instruction +@@ -76,6 +108,8 @@ void insn_get_prefixes(struct insn *insn) + if (prefixes->got) + return; + ++ insn_get_emulate_prefix(insn); ++ + nb = 0; + lb = 0; + b = peek_next(insn_byte_t, insn); +diff --git a/tools/arch/x86/include/asm/emulate_prefix.h b/tools/arch/x86/include/asm/emulate_prefix.h +new file mode 100644 +index 000000000000..70f5b98a5286 +--- /dev/null ++++ b/tools/arch/x86/include/asm/emulate_prefix.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _ASM_X86_EMULATE_PREFIX_H ++#define _ASM_X86_EMULATE_PREFIX_H ++ ++/* ++ * Virt escape sequences to trigger instruction emulation; ++ * ideally these would decode to 'whole' instruction and not destroy ++ * the instruction stream; sadly this is not true for the 'kvm' one :/ ++ */ ++ ++#define __XEN_EMULATE_PREFIX 0x0f,0x0b,0x78,0x65,0x6e /* ud2 ; .ascii "xen" */ ++#define __KVM_EMULATE_PREFIX 0x0f,0x0b,0x6b,0x76,0x6d /* ud2 ; .ascii "kvm" */ ++ ++#endif +diff --git a/tools/arch/x86/include/asm/insn.h b/tools/arch/x86/include/asm/insn.h +index 37a4c390750b..568854b14d0a 100644 +--- a/tools/arch/x86/include/asm/insn.h ++++ b/tools/arch/x86/include/asm/insn.h +@@ -45,6 +45,7 @@ struct insn { + struct insn_field immediate2; /* for 64bit imm or seg16 */ + }; + ++ int emulate_prefix_size; + insn_attr_t attr; + unsigned char opnd_bytes; + unsigned char addr_bytes; +@@ -128,6 +129,11 @@ static inline int insn_is_evex(struct insn *insn) + return (insn->vex_prefix.nbytes == 4); + } + ++static inline int insn_has_emulate_prefix(struct insn *insn) ++{ ++ return !!insn->emulate_prefix_size; ++} ++ + /* Ensure this instruction is decoded completely */ + static inline int insn_complete(struct insn *insn) + { +diff --git a/tools/arch/x86/lib/insn.c b/tools/arch/x86/lib/insn.c +index 79e048f1d902..0151dfc6da61 100644 +--- a/tools/arch/x86/lib/insn.c ++++ b/tools/arch/x86/lib/insn.c +@@ -13,6 +13,8 @@ + #include "../include/asm/inat.h" + #include "../include/asm/insn.h" + ++#include "../include/asm/emulate_prefix.h" ++ + /* Verify next sizeof(t) bytes can be on the same instruction */ + #define validate_next(t, insn, n) \ + ((insn)->next_byte + sizeof(t) + n <= (insn)->end_kaddr) +@@ -58,6 +60,36 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64) + insn->addr_bytes = 4; + } + ++static const insn_byte_t xen_prefix[] = { __XEN_EMULATE_PREFIX }; ++static const insn_byte_t kvm_prefix[] = { __KVM_EMULATE_PREFIX }; ++ ++static int __insn_get_emulate_prefix(struct insn *insn, ++ const insn_byte_t *prefix, size_t len) ++{ ++ size_t i; ++ ++ for (i = 0; i < len; i++) { ++ if (peek_nbyte_next(insn_byte_t, insn, i) != prefix[i]) ++ goto err_out; ++ } ++ ++ insn->emulate_prefix_size = len; ++ insn->next_byte += len; ++ ++ return 1; ++ ++err_out: ++ return 0; ++} ++ ++static void insn_get_emulate_prefix(struct insn *insn) ++{ ++ if (__insn_get_emulate_prefix(insn, xen_prefix, sizeof(xen_prefix))) ++ return; ++ ++ __insn_get_emulate_prefix(insn, kvm_prefix, sizeof(kvm_prefix)); ++} ++ + /** + * insn_get_prefixes - scan x86 instruction prefix bytes + * @insn: &struct insn containing instruction +@@ -76,6 +108,8 @@ void insn_get_prefixes(struct insn *insn) + if (prefixes->got) + return; + ++ insn_get_emulate_prefix(insn); ++ + nb = 0; + lb = 0; + b = peek_next(insn_byte_t, insn); +diff --git a/tools/objtool/sync-check.sh b/tools/objtool/sync-check.sh +index 0a832e265a50..9bd04bbed01e 100755 +--- a/tools/objtool/sync-check.sh ++++ b/tools/objtool/sync-check.sh +@@ -4,6 +4,7 @@ + FILES=' + arch/x86/include/asm/inat_types.h + arch/x86/include/asm/orc_types.h ++arch/x86/include/asm/emulate_prefix.h + arch/x86/lib/x86-opcode-map.txt + arch/x86/tools/gen-insn-attr-x86.awk + ' +@@ -46,6 +47,6 @@ done + check arch/x86/include/asm/inat.h '-I "^#include [\"<]\(asm/\)*inat_types.h[\">]"' + check arch/x86/include/asm/insn.h '-I "^#include [\"<]\(asm/\)*inat.h[\">]"' + check arch/x86/lib/inat.c '-I "^#include [\"<]\(../include/\)*asm/insn.h[\">]"' +-check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]"' ++check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]" -I "^#include [\"<]\(../include/\)*asm/emulate_prefix.h[\">]"' + + cd - +diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh +index cea13cb987d0..499235a41162 100755 +--- a/tools/perf/check-headers.sh ++++ b/tools/perf/check-headers.sh +@@ -28,6 +28,7 @@ arch/x86/include/asm/disabled-features.h + arch/x86/include/asm/required-features.h + arch/x86/include/asm/cpufeatures.h + arch/x86/include/asm/inat_types.h ++arch/x86/include/asm/emulate_prefix.h + arch/x86/include/uapi/asm/prctl.h + arch/x86/lib/x86-opcode-map.txt + arch/x86/tools/gen-insn-attr-x86.awk +@@ -116,7 +117,7 @@ check lib/ctype.c '-I "^EXPORT_SYMBOL" -I "^#include " -B + check arch/x86/include/asm/inat.h '-I "^#include [\"<]\(asm/\)*inat_types.h[\">]"' + check arch/x86/include/asm/insn.h '-I "^#include [\"<]\(asm/\)*inat.h[\">]"' + check arch/x86/lib/inat.c '-I "^#include [\"<]\(../include/\)*asm/insn.h[\">]"' +-check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]"' ++check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in\(at\|sn\).h[\">]" -I "^#include [\"<]\(../include/\)*asm/emulate_prefix.h[\">]"' + + # diff non-symmetric files + check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl diff --git a/pending/5.4/x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch b/pending/5.4/x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch new file mode 100644 index 00000000000..e2b51594196 --- /dev/null +++ b/pending/5.4/x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch @@ -0,0 +1,98 @@ +From b3dc0695fa40c3b280230fb6fb7fb7a94ce28bf4 Mon Sep 17 00:00:00 2001 +From: Masami Hiramatsu +Date: Fri, 6 Sep 2019 22:13:59 +0900 +Subject: x86: xen: kvm: Gather the definition of emulate prefixes + +From: Masami Hiramatsu + +commit b3dc0695fa40c3b280230fb6fb7fb7a94ce28bf4 upstream. + +Gather the emulate prefixes, which forcibly make the following +instruction emulated on virtualization, in one place. + +Suggested-by: Peter Zijlstra +Signed-off-by: Masami Hiramatsu +Signed-off-by: Peter Zijlstra (Intel) +Cc: Juergen Gross +Cc: x86@kernel.org +Cc: Ingo Molnar +Cc: Boris Ostrovsky +Cc: Andrew Cooper +Cc: Stefano Stabellini +Cc: Borislav Petkov +Cc: xen-devel@lists.xenproject.org +Cc: Randy Dunlap +Cc: Josh Poimboeuf +Link: https://lkml.kernel.org/r/156777563917.25081.7286628561790289995.stgit@devnote2 +Signed-off-by: Greg Kroah-Hartman + +diff --git a/arch/x86/include/asm/emulate_prefix.h b/arch/x86/include/asm/emulate_prefix.h +new file mode 100644 +index 000000000000..70f5b98a5286 +--- /dev/null ++++ b/arch/x86/include/asm/emulate_prefix.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _ASM_X86_EMULATE_PREFIX_H ++#define _ASM_X86_EMULATE_PREFIX_H ++ ++/* ++ * Virt escape sequences to trigger instruction emulation; ++ * ideally these would decode to 'whole' instruction and not destroy ++ * the instruction stream; sadly this is not true for the 'kvm' one :/ ++ */ ++ ++#define __XEN_EMULATE_PREFIX 0x0f,0x0b,0x78,0x65,0x6e /* ud2 ; .ascii "xen" */ ++#define __KVM_EMULATE_PREFIX 0x0f,0x0b,0x6b,0x76,0x6d /* ud2 ; .ascii "kvm" */ ++ ++#endif +diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h +index 62ca03ef5c65..9139b3e86316 100644 +--- a/arch/x86/include/asm/xen/interface.h ++++ b/arch/x86/include/asm/xen/interface.h +@@ -379,12 +379,9 @@ struct xen_pmu_arch { + * Prefix forces emulation of some non-trapping instructions. + * Currently only CPUID. + */ +-#ifdef __ASSEMBLY__ +-#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ; +-#define XEN_CPUID XEN_EMULATE_PREFIX cpuid +-#else +-#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; " +-#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" +-#endif ++#include ++ ++#define XEN_EMULATE_PREFIX __ASM_FORM(.byte __XEN_EMULATE_PREFIX ;) ++#define XEN_CPUID XEN_EMULATE_PREFIX __ASM_FORM(cpuid) + + #endif /* _ASM_X86_XEN_INTERFACE_H */ +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 661e2bf38526..777574f547c0 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -68,6 +68,7 @@ + #include + #include + #include ++#include + #include + + #define CREATE_TRACE_POINTS +@@ -5446,6 +5447,7 @@ EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system); + + int handle_ud(struct kvm_vcpu *vcpu) + { ++ static const char kvm_emulate_prefix[] = { __KVM_EMULATE_PREFIX }; + int emul_type = EMULTYPE_TRAP_UD; + char sig[5]; /* ud2; .ascii "kvm" */ + struct x86_exception e; +@@ -5453,7 +5455,7 @@ int handle_ud(struct kvm_vcpu *vcpu) + if (force_emulation_prefix && + kvm_read_guest_virt(vcpu, kvm_get_linear_rip(vcpu), + sig, sizeof(sig), &e) == 0 && +- memcmp(sig, "\xf\xbkvm", sizeof(sig)) == 0) { ++ memcmp(sig, kvm_emulate_prefix, sizeof(sig)) == 0) { + kvm_rip_write(vcpu, kvm_rip_read(vcpu) + sizeof(sig)); + emul_type = EMULTYPE_TRAP_UD_FORCED; + }