+++ /dev/null
-From bbbf9cd770a7ba5109e077ca099dc062d1ad9518 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 14 Jun 2022 23:16:04 +0200
-Subject: x86/cpu/amd: Add Spectral Chicken
-
-From: Peter Zijlstra <peterz@infradead.org>
-
-[ Upstream commit d7caac991feeef1b871ee6988fd2c9725df09039 ]
-
-Zen2 uarchs have an undocumented, unnamed, MSR that contains a chicken
-bit for some speculation behaviour. It needs setting.
-
-Note: very belatedly AMD released naming; it's now officially called
- MSR_AMD64_DE_CFG2 and MSR_AMD64_DE_CFG2_SUPPRESS_NOBR_PRED_BIT
- but shall remain the SPECTRAL CHICKEN.
-
-Suggested-by: Andrew Cooper <Andrew.Cooper3@citrix.com>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Signed-off-by: Borislav Petkov <bp@suse.de>
-Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org>
-Signed-off-by: Borislav Petkov <bp@suse.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/x86/include/asm/msr-index.h | 3 +++
- arch/x86/kernel/cpu/amd.c | 23 ++++++++++++++++++++++-
- arch/x86/kernel/cpu/cpu.h | 2 ++
- arch/x86/kernel/cpu/hygon.c | 6 ++++++
- 4 files changed, 33 insertions(+), 1 deletion(-)
-
-diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
-index 4425d6773183..d15d0ef6b357 100644
---- a/arch/x86/include/asm/msr-index.h
-+++ b/arch/x86/include/asm/msr-index.h
-@@ -552,6 +552,9 @@
- /* Fam 17h MSRs */
- #define MSR_F17H_IRPERF 0xc00000e9
-
-+#define MSR_ZEN2_SPECTRAL_CHICKEN 0xc00110e3
-+#define MSR_ZEN2_SPECTRAL_CHICKEN_BIT BIT_ULL(1)
-+
- /* Fam 16h MSRs */
- #define MSR_F16H_L2I_PERF_CTL 0xc0010230
- #define MSR_F16H_L2I_PERF_CTR 0xc0010231
-diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
-index 0c0b09796ced..8cf0659c0521 100644
---- a/arch/x86/kernel/cpu/amd.c
-+++ b/arch/x86/kernel/cpu/amd.c
-@@ -862,6 +862,26 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
- clear_rdrand_cpuid_bit(c);
- }
-
-+void init_spectral_chicken(struct cpuinfo_x86 *c)
-+{
-+ u64 value;
-+
-+ /*
-+ * On Zen2 we offer this chicken (bit) on the altar of Speculation.
-+ *
-+ * This suppresses speculation from the middle of a basic block, i.e. it
-+ * suppresses non-branch predictions.
-+ *
-+ * We use STIBP as a heuristic to filter out Zen2 from the rest of F17H
-+ */
-+ if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && cpu_has(c, X86_FEATURE_AMD_STIBP)) {
-+ if (!rdmsrl_safe(MSR_ZEN2_SPECTRAL_CHICKEN, &value)) {
-+ value |= MSR_ZEN2_SPECTRAL_CHICKEN_BIT;
-+ wrmsrl_safe(MSR_ZEN2_SPECTRAL_CHICKEN, value);
-+ }
-+ }
-+}
-+
- static void init_amd_zn(struct cpuinfo_x86 *c)
- {
- set_cpu_cap(c, X86_FEATURE_ZEN);
-@@ -907,7 +927,8 @@ static void init_amd(struct cpuinfo_x86 *c)
- case 0x12: init_amd_ln(c); break;
- case 0x15: init_amd_bd(c); break;
- case 0x16: init_amd_jg(c); break;
-- case 0x17: fallthrough;
-+ case 0x17: init_spectral_chicken(c);
-+ fallthrough;
- case 0x19: init_amd_zn(c); break;
- }
-
-diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
-index 2a8e584fc991..7c9b5893c30a 100644
---- a/arch/x86/kernel/cpu/cpu.h
-+++ b/arch/x86/kernel/cpu/cpu.h
-@@ -61,6 +61,8 @@ static inline void tsx_init(void) { }
- static inline void tsx_ap_init(void) { }
- #endif /* CONFIG_CPU_SUP_INTEL */
-
-+extern void init_spectral_chicken(struct cpuinfo_x86 *c);
-+
- extern void get_cpu_cap(struct cpuinfo_x86 *c);
- extern void get_cpu_address_sizes(struct cpuinfo_x86 *c);
- extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
-diff --git a/arch/x86/kernel/cpu/hygon.c b/arch/x86/kernel/cpu/hygon.c
-index 3fcdda4c1e11..21fd425088fe 100644
---- a/arch/x86/kernel/cpu/hygon.c
-+++ b/arch/x86/kernel/cpu/hygon.c
-@@ -302,6 +302,12 @@ static void init_hygon(struct cpuinfo_x86 *c)
- /* get apicid instead of initial apic id from cpuid */
- c->apicid = hard_smp_processor_id();
-
-+ /*
-+ * XXX someone from Hygon needs to confirm this DTRT
-+ *
-+ init_spectral_chicken(c);
-+ */
-+
- set_cpu_cap(c, X86_FEATURE_ZEN);
- set_cpu_cap(c, X86_FEATURE_CPB);
-
---
-2.35.1
-
+++ /dev/null
-From 8656f768ea3921fb8f9789696dd2b95e46b94c02 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 14 Jun 2022 23:16:00 +0200
-Subject: x86/xen: Rename SYS* entry points
-
-From: Peter Zijlstra <peterz@infradead.org>
-
-[ Upstream commit b75b7f8ef1148be1b9321ffc2f6c19238904b438 ]
-
-Native SYS{CALL,ENTER} entry points are called
-entry_SYS{CALL,ENTER}_{64,compat}, make sure the Xen versions are
-named consistently.
-
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Signed-off-by: Borislav Petkov <bp@suse.de>
-Reviewed-by: Josh Poimboeuf <jpoimboe@kernel.org>
-Signed-off-by: Borislav Petkov <bp@suse.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/x86/xen/setup.c | 6 +++---
- arch/x86/xen/xen-asm.S | 20 ++++++++++----------
- arch/x86/xen/xen-ops.h | 6 +++---
- 3 files changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
-index 81aa46f770c5..cfa99e8f054b 100644
---- a/arch/x86/xen/setup.c
-+++ b/arch/x86/xen/setup.c
-@@ -918,7 +918,7 @@ void xen_enable_sysenter(void)
- if (!boot_cpu_has(sysenter_feature))
- return;
-
-- ret = register_callback(CALLBACKTYPE_sysenter, xen_sysenter_target);
-+ ret = register_callback(CALLBACKTYPE_sysenter, xen_entry_SYSENTER_compat);
- if(ret != 0)
- setup_clear_cpu_cap(sysenter_feature);
- }
-@@ -927,7 +927,7 @@ void xen_enable_syscall(void)
- {
- int ret;
-
-- ret = register_callback(CALLBACKTYPE_syscall, xen_syscall_target);
-+ ret = register_callback(CALLBACKTYPE_syscall, xen_entry_SYSCALL_64);
- if (ret != 0) {
- printk(KERN_ERR "Failed to set syscall callback: %d\n", ret);
- /* Pretty fatal; 64-bit userspace has no other
-@@ -936,7 +936,7 @@ void xen_enable_syscall(void)
-
- if (boot_cpu_has(X86_FEATURE_SYSCALL32)) {
- ret = register_callback(CALLBACKTYPE_syscall32,
-- xen_syscall32_target);
-+ xen_entry_SYSCALL_compat);
- if (ret != 0)
- setup_clear_cpu_cap(X86_FEATURE_SYSCALL32);
- }
-diff --git a/arch/x86/xen/xen-asm.S b/arch/x86/xen/xen-asm.S
-index caa9bc2fa100..6bf9d45b9178 100644
---- a/arch/x86/xen/xen-asm.S
-+++ b/arch/x86/xen/xen-asm.S
-@@ -234,7 +234,7 @@ SYM_CODE_END(xenpv_restore_regs_and_return_to_usermode)
- */
-
- /* Normal 64-bit system call target */
--SYM_CODE_START(xen_syscall_target)
-+SYM_CODE_START(xen_entry_SYSCALL_64)
- UNWIND_HINT_EMPTY
- ENDBR
- popq %rcx
-@@ -249,12 +249,12 @@ SYM_CODE_START(xen_syscall_target)
- movq $__USER_CS, 1*8(%rsp)
-
- jmp entry_SYSCALL_64_after_hwframe
--SYM_CODE_END(xen_syscall_target)
-+SYM_CODE_END(xen_entry_SYSCALL_64)
-
- #ifdef CONFIG_IA32_EMULATION
-
- /* 32-bit compat syscall target */
--SYM_CODE_START(xen_syscall32_target)
-+SYM_CODE_START(xen_entry_SYSCALL_compat)
- UNWIND_HINT_EMPTY
- ENDBR
- popq %rcx
-@@ -269,10 +269,10 @@ SYM_CODE_START(xen_syscall32_target)
- movq $__USER32_CS, 1*8(%rsp)
-
- jmp entry_SYSCALL_compat_after_hwframe
--SYM_CODE_END(xen_syscall32_target)
-+SYM_CODE_END(xen_entry_SYSCALL_compat)
-
- /* 32-bit compat sysenter target */
--SYM_CODE_START(xen_sysenter_target)
-+SYM_CODE_START(xen_entry_SYSENTER_compat)
- UNWIND_HINT_EMPTY
- ENDBR
- /*
-@@ -291,19 +291,19 @@ SYM_CODE_START(xen_sysenter_target)
- movq $__USER32_CS, 1*8(%rsp)
-
- jmp entry_SYSENTER_compat_after_hwframe
--SYM_CODE_END(xen_sysenter_target)
-+SYM_CODE_END(xen_entry_SYSENTER_compat)
-
- #else /* !CONFIG_IA32_EMULATION */
-
--SYM_CODE_START(xen_syscall32_target)
--SYM_CODE_START(xen_sysenter_target)
-+SYM_CODE_START(xen_entry_SYSCALL_compat)
-+SYM_CODE_START(xen_entry_SYSENTER_compat)
- UNWIND_HINT_EMPTY
- ENDBR
- lea 16(%rsp), %rsp /* strip %rcx, %r11 */
- mov $-ENOSYS, %rax
- pushq $0
- jmp hypercall_iret
--SYM_CODE_END(xen_sysenter_target)
--SYM_CODE_END(xen_syscall32_target)
-+SYM_CODE_END(xen_entry_SYSENTER_compat)
-+SYM_CODE_END(xen_entry_SYSCALL_compat)
-
- #endif /* CONFIG_IA32_EMULATION */
-diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
-index fd0fec6e92f4..9a8bb972193d 100644
---- a/arch/x86/xen/xen-ops.h
-+++ b/arch/x86/xen/xen-ops.h
-@@ -10,10 +10,10 @@
- /* These are code, but not functions. Defined in entry.S */
- extern const char xen_failsafe_callback[];
-
--void xen_sysenter_target(void);
-+void xen_entry_SYSENTER_compat(void);
- #ifdef CONFIG_X86_64
--void xen_syscall_target(void);
--void xen_syscall32_target(void);
-+void xen_entry_SYSCALL_64(void);
-+void xen_entry_SYSCALL_compat(void);
- #endif
-
- extern void *xen_initial_gdt;
---
-2.35.1
-