From: Greg Kroah-Hartman Date: Thu, 12 May 2022 14:01:36 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v4.9.314~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6d5720168cef292b883b0dd1e3e1e54ee13389bd;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: arm-remove-config_arch_has_holes_memorymodel.patch kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_hw_id.patch x86-asm-allow-to-pass-macros-to-__asm_form.patch x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch --- diff --git a/queue-5.4/arm-remove-config_arch_has_holes_memorymodel.patch b/queue-5.4/arm-remove-config_arch_has_holes_memorymodel.patch new file mode 100644 index 00000000000..e2be5eceb1d --- /dev/null +++ b/queue-5.4/arm-remove-config_arch_has_holes_memorymodel.patch @@ -0,0 +1,270 @@ +From 5e545df3292fbd3d5963c68980f1527ead2a2b3f Mon Sep 17 00:00:00 2001 +From: Mike Rapoport +Date: Mon, 14 Dec 2020 19:09:55 -0800 +Subject: arm: remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL + +From: Mike Rapoport + +commit 5e545df3292fbd3d5963c68980f1527ead2a2b3f upstream. + +ARM is the only architecture that defines CONFIG_ARCH_HAS_HOLES_MEMORYMODEL +which in turn enables memmap_valid_within() function that is intended to +verify existence of struct page associated with a pfn when there are holes +in the memory map. + +However, the ARCH_HAS_HOLES_MEMORYMODEL also enables HAVE_ARCH_PFN_VALID +and arch-specific pfn_valid() implementation that also deals with the holes +in the memory map. + +The only two users of memmap_valid_within() call this function after +a call to pfn_valid() so the memmap_valid_within() check becomes redundant. + +Remove CONFIG_ARCH_HAS_HOLES_MEMORYMODEL and memmap_valid_within() and rely +entirely on ARM's implementation of pfn_valid() that is now enabled +unconditionally. + +Link: https://lkml.kernel.org/r/20201101170454.9567-9-rppt@kernel.org +Signed-off-by: Mike Rapoport +Cc: Alexey Dobriyan +Cc: Catalin Marinas +Cc: Geert Uytterhoeven +Cc: Greg Ungerer +Cc: John Paul Adrian Glaubitz +Cc: Jonathan Corbet +Cc: Matt Turner +Cc: Meelis Roos +Cc: Michael Schmitz +Cc: Russell King +Cc: Tony Luck +Cc: Vineet Gupta +Cc: Will Deacon +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Reported-by: kernel test robot +Fixes: 8dd559d53b3b ("arm: ioremap: don't abuse pfn_valid() to check if pfn is in RAM") +Signed-off-by: Mike Rapoport +Signed-off-by: Greg Kroah-Hartman +--- + Documentation/vm/memory-model.rst | 3 +-- + arch/arm/Kconfig | 8 ++------ + arch/arm/mach-bcm/Kconfig | 1 - + arch/arm/mach-davinci/Kconfig | 1 - + arch/arm/mach-exynos/Kconfig | 1 - + arch/arm/mach-highbank/Kconfig | 1 - + arch/arm/mach-omap2/Kconfig | 2 +- + arch/arm/mach-s5pv210/Kconfig | 1 - + arch/arm/mach-tango/Kconfig | 1 - + fs/proc/kcore.c | 2 -- + include/linux/mmzone.h | 31 ------------------------------- + mm/mmzone.c | 14 -------------- + mm/vmstat.c | 4 ---- + 13 files changed, 4 insertions(+), 66 deletions(-) + +--- a/Documentation/vm/memory-model.rst ++++ b/Documentation/vm/memory-model.rst +@@ -52,8 +52,7 @@ wrapper :c:func:`free_area_init`. Yet, t + usable until the call to :c:func:`memblock_free_all` that hands all + the memory to the page allocator. + +-If an architecture enables `CONFIG_ARCH_HAS_HOLES_MEMORYMODEL` option, +-it may free parts of the `mem_map` array that do not cover the ++An architecture may free parts of the `mem_map` array that do not cover the + actual physical pages. In such case, the architecture specific + :c:func:`pfn_valid` implementation should take the holes in the + `mem_map` into account. +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -26,7 +26,7 @@ config ARM + select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST + select ARCH_HAVE_CUSTOM_GPIO_H + select ARCH_HAS_GCOV_PROFILE_ALL +- select ARCH_KEEP_MEMBLOCK if HAVE_ARCH_PFN_VALID || KEXEC ++ select ARCH_KEEP_MEMBLOCK + select ARCH_MIGHT_HAVE_PC_PARPORT + select ARCH_NO_SG_CHAIN if !ARM_HAS_SG_CHAIN + select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX +@@ -521,7 +521,6 @@ config ARCH_S3C24XX + config ARCH_OMAP1 + bool "TI OMAP1" + depends on MMU +- select ARCH_HAS_HOLES_MEMORYMODEL + select ARCH_OMAP + select CLKDEV_LOOKUP + select CLKSRC_MMIO +@@ -1518,9 +1517,6 @@ config OABI_COMPAT + UNPREDICTABLE (in fact it can be predicted that it won't work + at all). If in doubt say N. + +-config ARCH_HAS_HOLES_MEMORYMODEL +- bool +- + config ARCH_SPARSEMEM_ENABLE + bool + +@@ -1528,7 +1524,7 @@ config ARCH_SPARSEMEM_DEFAULT + def_bool ARCH_SPARSEMEM_ENABLE + + config HAVE_ARCH_PFN_VALID +- def_bool ARCH_HAS_HOLES_MEMORYMODEL || !SPARSEMEM ++ def_bool y + + config HIGHMEM + bool "High Memory Support" +--- a/arch/arm/mach-bcm/Kconfig ++++ b/arch/arm/mach-bcm/Kconfig +@@ -214,7 +214,6 @@ config ARCH_BRCMSTB + select HAVE_ARM_ARCH_TIMER + select BRCMSTB_L2_IRQ + select BCM7120_L2_IRQ +- select ARCH_HAS_HOLES_MEMORYMODEL + select ZONE_DMA if ARM_LPAE + select SOC_BRCMSTB + select SOC_BUS +--- a/arch/arm/mach-davinci/Kconfig ++++ b/arch/arm/mach-davinci/Kconfig +@@ -5,7 +5,6 @@ menuconfig ARCH_DAVINCI + depends on ARCH_MULTI_V5 + select DAVINCI_TIMER + select ZONE_DMA +- select ARCH_HAS_HOLES_MEMORYMODEL + select PM_GENERIC_DOMAINS if PM + select PM_GENERIC_DOMAINS_OF if PM && OF + select REGMAP_MMIO +--- a/arch/arm/mach-exynos/Kconfig ++++ b/arch/arm/mach-exynos/Kconfig +@@ -8,7 +8,6 @@ + menuconfig ARCH_EXYNOS + bool "Samsung EXYNOS" + depends on ARCH_MULTI_V7 +- select ARCH_HAS_HOLES_MEMORYMODEL + select ARCH_SUPPORTS_BIG_ENDIAN + select ARM_AMBA + select ARM_GIC +--- a/arch/arm/mach-highbank/Kconfig ++++ b/arch/arm/mach-highbank/Kconfig +@@ -2,7 +2,6 @@ + config ARCH_HIGHBANK + bool "Calxeda ECX-1000/2000 (Highbank/Midway)" + depends on ARCH_MULTI_V7 +- select ARCH_HAS_HOLES_MEMORYMODEL + select ARCH_SUPPORTS_BIG_ENDIAN + select ARM_AMBA + select ARM_ERRATA_764369 if SMP +--- a/arch/arm/mach-omap2/Kconfig ++++ b/arch/arm/mach-omap2/Kconfig +@@ -94,7 +94,7 @@ config SOC_DRA7XX + config ARCH_OMAP2PLUS + bool + select ARCH_HAS_BANDGAP +- select ARCH_HAS_HOLES_MEMORYMODEL ++ select ARCH_HAS_RESET_CONTROLLER + select ARCH_OMAP + select CLKSRC_MMIO + select GENERIC_IRQ_CHIP +--- a/arch/arm/mach-s5pv210/Kconfig ++++ b/arch/arm/mach-s5pv210/Kconfig +@@ -8,7 +8,6 @@ + config ARCH_S5PV210 + bool "Samsung S5PV210/S5PC110" + depends on ARCH_MULTI_V7 +- select ARCH_HAS_HOLES_MEMORYMODEL + select ARM_VIC + select CLKSRC_SAMSUNG_PWM + select COMMON_CLK_SAMSUNG +--- a/arch/arm/mach-tango/Kconfig ++++ b/arch/arm/mach-tango/Kconfig +@@ -3,7 +3,6 @@ config ARCH_TANGO + bool "Sigma Designs Tango4 (SMP87xx)" + depends on ARCH_MULTI_V7 + # Cortex-A9 MPCore r3p0, PL310 r3p2 +- select ARCH_HAS_HOLES_MEMORYMODEL + select ARM_ERRATA_754322 + select ARM_ERRATA_764369 if SMP + select ARM_ERRATA_775420 +--- a/fs/proc/kcore.c ++++ b/fs/proc/kcore.c +@@ -193,8 +193,6 @@ kclist_add_private(unsigned long pfn, un + return 1; + + p = pfn_to_page(pfn); +- if (!memmap_valid_within(pfn, p, page_zone(p))) +- return 1; + + ent = kmalloc(sizeof(*ent), GFP_KERNEL); + if (!ent) +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -1438,37 +1438,6 @@ void memory_present(int nid, unsigned lo + #define pfn_valid_within(pfn) (1) + #endif + +-#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL +-/* +- * pfn_valid() is meant to be able to tell if a given PFN has valid memmap +- * associated with it or not. This means that a struct page exists for this +- * pfn. The caller cannot assume the page is fully initialized in general. +- * Hotplugable pages might not have been onlined yet. pfn_to_online_page() +- * will ensure the struct page is fully online and initialized. Special pages +- * (e.g. ZONE_DEVICE) are never onlined and should be treated accordingly. +- * +- * In FLATMEM, it is expected that holes always have valid memmap as long as +- * there is valid PFNs either side of the hole. In SPARSEMEM, it is assumed +- * that a valid section has a memmap for the entire section. +- * +- * However, an ARM, and maybe other embedded architectures in the future +- * free memmap backing holes to save memory on the assumption the memmap is +- * never used. The page_zone linkages are then broken even though pfn_valid() +- * returns true. A walker of the full memmap must then do this additional +- * check to ensure the memmap they are looking at is sane by making sure +- * the zone and PFN linkages are still valid. This is expensive, but walkers +- * of the full memmap are extremely rare. +- */ +-bool memmap_valid_within(unsigned long pfn, +- struct page *page, struct zone *zone); +-#else +-static inline bool memmap_valid_within(unsigned long pfn, +- struct page *page, struct zone *zone) +-{ +- return true; +-} +-#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ +- + #endif /* !__GENERATING_BOUNDS.H */ + #endif /* !__ASSEMBLY__ */ + #endif /* _LINUX_MMZONE_H */ +--- a/mm/mmzone.c ++++ b/mm/mmzone.c +@@ -72,20 +72,6 @@ struct zoneref *__next_zones_zonelist(st + return z; + } + +-#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL +-bool memmap_valid_within(unsigned long pfn, +- struct page *page, struct zone *zone) +-{ +- if (page_to_pfn(page) != pfn) +- return false; +- +- if (page_zone(page) != zone) +- return false; +- +- return true; +-} +-#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ +- + void lruvec_init(struct lruvec *lruvec) + { + enum lru_list lru; +--- a/mm/vmstat.c ++++ b/mm/vmstat.c +@@ -1444,10 +1444,6 @@ static void pagetypeinfo_showblockcount_ + if (!page) + continue; + +- /* Watch for unexpected holes punched in the memmap */ +- if (!memmap_valid_within(pfn, page, zone)) +- continue; +- + if (page_zone(page) != zone) + continue; + diff --git a/queue-5.4/kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_hw_id.patch b/queue-5.4/kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_hw_id.patch new file mode 100644 index 00000000000..55ed2a01965 --- /dev/null +++ b/queue-5.4/kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_hw_id.patch @@ -0,0 +1,122 @@ +From 7c174f305cbee6bdba5018aae02b84369e7ab995 Mon Sep 17 00:00:00 2001 +From: Like Xu +Date: Tue, 30 Nov 2021 15:42:17 +0800 +Subject: KVM: x86/pmu: Refactoring find_arch_event() to pmc_perf_hw_id() + +From: Like Xu + +commit 7c174f305cbee6bdba5018aae02b84369e7ab995 upstream. + +The find_arch_event() returns a "unsigned int" value, +which is used by the pmc_reprogram_counter() to +program a PERF_TYPE_HARDWARE type perf_event. + +The returned value is actually the kernel defined generic +perf_hw_id, let's rename it to pmc_perf_hw_id() with simpler +incoming parameters for better self-explanation. + +Signed-off-by: Like Xu +Message-Id: <20211130074221.93635-3-likexu@tencent.com> +Signed-off-by: Paolo Bonzini +[Backport to 5.4: kvm_x86_ops is a pointer here] +Signed-off-by: Kyle Huey ] +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kvm/pmu.c | 8 +------- + arch/x86/kvm/pmu.h | 3 +-- + arch/x86/kvm/pmu_amd.c | 8 ++++---- + arch/x86/kvm/vmx/pmu_intel.c | 9 +++++---- + 4 files changed, 11 insertions(+), 17 deletions(-) + +--- a/arch/x86/kvm/pmu.c ++++ b/arch/x86/kvm/pmu.c +@@ -143,7 +143,6 @@ static void pmc_reprogram_counter(struct + void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) + { + unsigned config, type = PERF_TYPE_RAW; +- u8 event_select, unit_mask; + struct kvm *kvm = pmc->vcpu->kvm; + struct kvm_pmu_event_filter *filter; + int i; +@@ -175,17 +174,12 @@ void reprogram_gp_counter(struct kvm_pmc + if (!allow_event) + return; + +- event_select = eventsel & ARCH_PERFMON_EVENTSEL_EVENT; +- unit_mask = (eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; +- + if (!(eventsel & (ARCH_PERFMON_EVENTSEL_EDGE | + ARCH_PERFMON_EVENTSEL_INV | + ARCH_PERFMON_EVENTSEL_CMASK | + HSW_IN_TX | + HSW_IN_TX_CHECKPOINTED))) { +- config = kvm_x86_ops->pmu_ops->find_arch_event(pmc_to_pmu(pmc), +- event_select, +- unit_mask); ++ config = kvm_x86_ops->pmu_ops->pmc_perf_hw_id(pmc); + if (config != PERF_COUNT_HW_MAX) + type = PERF_TYPE_HARDWARE; + } +--- a/arch/x86/kvm/pmu.h ++++ b/arch/x86/kvm/pmu.h +@@ -22,8 +22,7 @@ struct kvm_event_hw_type_mapping { + }; + + struct kvm_pmu_ops { +- unsigned (*find_arch_event)(struct kvm_pmu *pmu, u8 event_select, +- u8 unit_mask); ++ unsigned int (*pmc_perf_hw_id)(struct kvm_pmc *pmc); + unsigned (*find_fixed_event)(int idx); + bool (*pmc_is_enabled)(struct kvm_pmc *pmc); + struct kvm_pmc *(*pmc_idx_to_pmc)(struct kvm_pmu *pmu, int pmc_idx); +--- a/arch/x86/kvm/pmu_amd.c ++++ b/arch/x86/kvm/pmu_amd.c +@@ -126,10 +126,10 @@ static inline struct kvm_pmc *get_gp_pmc + return &pmu->gp_counters[msr_to_index(msr)]; + } + +-static unsigned amd_find_arch_event(struct kvm_pmu *pmu, +- u8 event_select, +- u8 unit_mask) ++static unsigned int amd_pmc_perf_hw_id(struct kvm_pmc *pmc) + { ++ u8 event_select = pmc->eventsel & ARCH_PERFMON_EVENTSEL_EVENT; ++ u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; + int i; + + for (i = 0; i < ARRAY_SIZE(amd_event_mapping); i++) +@@ -300,7 +300,7 @@ static void amd_pmu_reset(struct kvm_vcp + } + + struct kvm_pmu_ops amd_pmu_ops = { +- .find_arch_event = amd_find_arch_event, ++ .pmc_perf_hw_id = amd_pmc_perf_hw_id, + .find_fixed_event = amd_find_fixed_event, + .pmc_is_enabled = amd_pmc_is_enabled, + .pmc_idx_to_pmc = amd_pmc_idx_to_pmc, +--- a/arch/x86/kvm/vmx/pmu_intel.c ++++ b/arch/x86/kvm/vmx/pmu_intel.c +@@ -64,10 +64,11 @@ static void global_ctrl_changed(struct k + reprogram_counter(pmu, bit); + } + +-static unsigned intel_find_arch_event(struct kvm_pmu *pmu, +- u8 event_select, +- u8 unit_mask) ++static unsigned int intel_pmc_perf_hw_id(struct kvm_pmc *pmc) + { ++ struct kvm_pmu *pmu = pmc_to_pmu(pmc); ++ u8 event_select = pmc->eventsel & ARCH_PERFMON_EVENTSEL_EVENT; ++ u8 unit_mask = (pmc->eventsel & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; + int i; + + for (i = 0; i < ARRAY_SIZE(intel_arch_events); i++) +@@ -374,7 +375,7 @@ static void intel_pmu_reset(struct kvm_v + } + + struct kvm_pmu_ops intel_pmu_ops = { +- .find_arch_event = intel_find_arch_event, ++ .pmc_perf_hw_id = intel_pmc_perf_hw_id, + .find_fixed_event = intel_find_fixed_event, + .pmc_is_enabled = intel_pmc_is_enabled, + .pmc_idx_to_pmc = intel_pmc_idx_to_pmc, diff --git a/queue-5.4/series b/queue-5.4/series index ea4e2bd545b..ec47a725357 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -5,3 +5,9 @@ drm-i915-cast-remain-to-unsigned-long-in-eb_relocate_vma.patch nfp-bpf-silence-bitwise-vs.-logical-or-warning.patch can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch can-grcan-only-use-the-napi-poll-budget-for-rx.patch +arm-remove-config_arch_has_holes_memorymodel.patch +kvm-x86-pmu-refactoring-find_arch_event-to-pmc_perf_hw_id.patch +x86-asm-allow-to-pass-macros-to-__asm_form.patch +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/queue-5.4/x86-asm-allow-to-pass-macros-to-__asm_form.patch b/queue-5.4/x86-asm-allow-to-pass-macros-to-__asm_form.patch new file mode 100644 index 00000000000..9cd52950408 --- /dev/null +++ b/queue-5.4/x86-asm-allow-to-pass-macros-to-__asm_form.patch @@ -0,0 +1,48 @@ +From f7919fd943abf0c77aed4441ea9897a323d132f5 Mon Sep 17 00:00:00 2001 +From: Masami Hiramatsu +Date: Fri, 6 Sep 2019 22:13:48 +0900 +Subject: x86/asm: Allow to pass macros to __ASM_FORM() + +From: Masami Hiramatsu + +commit f7919fd943abf0c77aed4441ea9897a323d132f5 upstream. + +Use __stringify() at __ASM_FORM() so that user can pass +code including macros to __ASM_FORM(). + +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/156777562873.25081.2288083344657460959.stgit@devnote2 +Signed-off-by: Maximilian Heyne +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/include/asm/asm.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/arch/x86/include/asm/asm.h ++++ b/arch/x86/include/asm/asm.h +@@ -7,9 +7,11 @@ + # define __ASM_FORM_RAW(x) x + # define __ASM_FORM_COMMA(x) x, + #else +-# define __ASM_FORM(x) " " #x " " +-# define __ASM_FORM_RAW(x) #x +-# define __ASM_FORM_COMMA(x) " " #x "," ++#include ++ ++# define __ASM_FORM(x) " " __stringify(x) " " ++# define __ASM_FORM_RAW(x) __stringify(x) ++# define __ASM_FORM_COMMA(x) " " __stringify(x) "," + #endif + + #ifndef __x86_64__ diff --git a/queue-5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch b/queue-5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch new file mode 100644 index 00000000000..d95099f83c2 --- /dev/null +++ b/queue-5.4/x86-kprobes-prohibit-probing-on-instruction-which-has-emulate-prefix.patch @@ -0,0 +1,46 @@ +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: Maximilian Heyne +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/kprobes/core.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -358,6 +358,10 @@ int __copy_instruction(u8 *dest, u8 *src + 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/queue-5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch b/queue-5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch new file mode 100644 index 00000000000..88177d0cbbe --- /dev/null +++ b/queue-5.4/x86-xen-insn-decode-xen-and-kvm-emulate-prefix-signature.patch @@ -0,0 +1,257 @@ +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 +[mheyne: resolved contextual conflict in tools/objtools/sync-check.sh] +Signed-off-by: Maximilian Heyne +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/include/asm/insn.h | 6 ++++ + arch/x86/lib/insn.c | 34 ++++++++++++++++++++++++++++ + tools/arch/x86/include/asm/emulate_prefix.h | 14 +++++++++++ + tools/arch/x86/include/asm/insn.h | 6 ++++ + tools/arch/x86/lib/insn.c | 34 ++++++++++++++++++++++++++++ + tools/objtool/sync-check.sh | 3 +- + tools/perf/check-headers.sh | 3 +- + 7 files changed, 98 insertions(+), 2 deletions(-) + create mode 100644 tools/arch/x86/include/asm/emulate_prefix.h + +--- 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 in + 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) + { +--- 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 + 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); +--- /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 +--- 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 in + 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) + { +--- 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 + 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); +--- 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,4 +47,4 @@ 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[\">]"' +--- 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_SY + 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/queue-5.4/x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch b/queue-5.4/x86-xen-kvm-gather-the-definition-of-emulate-prefixes.patch new file mode 100644 index 00000000000..d36f4203bfc --- /dev/null +++ b/queue-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: Maximilian Heyne +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/include/asm/emulate_prefix.h | 14 ++++++++++++++ + arch/x86/include/asm/xen/interface.h | 11 ++++------- + arch/x86/kvm/x86.c | 4 +++- + 3 files changed, 21 insertions(+), 8 deletions(-) + create mode 100644 arch/x86/include/asm/emulate_prefix.h + +--- /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 +--- 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 */ +--- 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 +@@ -5583,6 +5584,7 @@ EXPORT_SYMBOL_GPL(kvm_write_guest_virt_s + + 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; +@@ -5590,7 +5592,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; + }