Linux 5.9.10
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.9.10 kernel.
All users of the 5.9 kernel series must upgrade.
The updated 5.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.9.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/admin-guide/kernel-parameters.txt | 7 Makefile | 2 arch/powerpc/include/asm/book3s/64/kup-radix.h | 66 +++-- arch/powerpc/include/asm/exception-64s.h | 12 - arch/powerpc/include/asm/feature-fixups.h | 19 + arch/powerpc/include/asm/kup.h | 26 +- arch/powerpc/include/asm/security_features.h | 7 arch/powerpc/include/asm/setup.h | 4 arch/powerpc/kernel/exceptions-64s.S | 80 +++--- arch/powerpc/kernel/setup_64.c | 122 ++++++++++ arch/powerpc/kernel/smp.c | 2 arch/powerpc/kernel/syscall_64.c | 2 arch/powerpc/kernel/vmlinux.lds.S | 14 + arch/powerpc/lib/feature-fixups.c | 104 ++++++++ arch/powerpc/platforms/powernv/setup.c | 17 + arch/powerpc/platforms/pseries/setup.c | 8 arch/x86/events/intel/uncore_snb.c | 2 arch/x86/kvm/emulate.c | 8 drivers/acpi/evged.c | 2 drivers/input/keyboard/sunkbd.c | 41 ++- drivers/leds/leds-lm3697.c | 8 net/can/proc.c | 6 net/mac80211/sta_info.c | 18 + tools/testing/selftests/kselftest_harness.h | 2 tools/testing/selftests/powerpc/security/.gitignore | 1 tools/testing/selftests/powerpc/security/Makefile | 2 tools/testing/selftests/powerpc/security/entry_flush.c | 198 +++++++++++++++++ tools/testing/selftests/powerpc/security/rfi_flush.c | 35 ++- 28 files changed, 718 insertions(+), 97 deletions(-)
Arnd Bergmann (1):
perf/x86/intel/uncore: Fix Add BW copypasta
Daniel Axtens (1):
selftests/powerpc: entry flush test
David Edmondson (1):
KVM: x86: clflushopt should be treated as a no-op by emulation
Dmitry Torokhov (1):
Input: sunkbd - avoid use-after-free in teardown paths
Gabriel David (1):
leds: lm3697: Fix out-of-bound access
Greg Kroah-Hartman (1):
Linux 5.9.10
Johannes Berg (1):
mac80211: always wind down STA state
Michael Ellerman (1):
powerpc: Only include kup-radix.h for 64-bit Book3S
Nicholas Piggin (2):
powerpc/64s: flush L1D on kernel entry
powerpc/64s: flush L1D after user accesses
Nick Desaulniers (1):
ACPI: GED: fix -Wformat
Qian Cai (1):
powerpc/smp: Call rcu_cpu_starting() earlier
Russell Currey (1):
selftests/powerpc: rfi_flush: disable entry flush if present
Tommi Rantala (1):
selftests/harness: prettify SKIP message whitespace again
Zhang Changzhong (1):
can: proc: can_remove_proc(): silence remove_proc_entry warning
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/kernel-parameters.txt +7 -0
@@ -2833,6 +2833,8 @@ mds=off [X86] tsx_async_abort=off [X86] kvm.nx_huge_pages=off [X86] + no_entry_flush [PPC] + no_uaccess_flush [PPC] Exceptions: This does not have any effect on
@@ -3157,6 +3159,8 @@ noefi Disable EFI runtime services support. + no_entry_flush [PPC] Don't flush the L1-D cache when entering the kernel. + noexec [IA-64] noexec [X86]
@@ -3206,6 +3210,9 @@ nospec_store_bypass_disable [HW] Disable all mitigations for the Speculative Store Bypass vulnerability + no_uaccess_flush + [PPC] Don't flush the L1-D cache after accessing user data. + noxsave [BUGS=X86] Disables x86 extended register state save and restore using xsave. The kernel will fallback to enabling legacy floating-point and sse state.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 9 -SUBLEVEL = 9 +SUBLEVEL = 10 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/powerpc/include/asm/book3s/64/kup-radix.h +42 -24
116 lines not on this page · raw message
arch/powerpc/include/asm/exception-64s.h +11 -1
@@ -57,11 +57,18 @@nop ; \ nop +#define ENTRY_FLUSH_SLOT \ + ENTRY_FLUSH_FIXUP_SECTION; \ + nop; \ + nop; \ + nop; +/* * r10 must be free to use, r13 must be paca */ #define INTERRUPT_TO_KERNEL \ - STF_ENTRY_BARRIER_SLOT + STF_ENTRY_BARRIER_SLOT; \ + ENTRY_FLUSH_SLOT/* * Macros for annotating the expected destination of (h)rfid
@@ -137,6 +144,9 @@RFSCV ; \ b rfscv_flush_fallback +#else /* __ASSEMBLY__ */ +/* Prototype for function defined in exceptions-64s.S */ +void do_uaccess_flush (void );#endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_EXCEPTION_H */
arch/powerpc/include/asm/feature-fixups.h +19 -0
@@ -205,6 +205,22 @@ label##3: \ FTR_ENTRY_OFFSET 955b-956b; \ .popsection; +#define UACCESS_FLUSH_FIXUP_SECTION \ +959: \ + .pushsection __uaccess_flush_fixup,"a"; \ + .align 2; \ +960: \ + FTR_ENTRY_OFFSET 959b-960b; \ + .popsection; + +#define ENTRY_FLUSH_FIXUP_SECTION \ +957: \ + .pushsection __entry_flush_fixup,"a"; \ + .align 2; \ +958: \ + FTR_ENTRY_OFFSET 957b-958b; \ + .popsection; +#define RFI_FLUSH_FIXUP_SECTION \ 951: \ .pushsection __rfi_flush_fixup,"a"; \
@@ -237,8 +253,11 @@ label##3: \#include <linux/types.h> extern long stf_barrier_fallback; +extern long entry_flush_fallback;extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup;extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; +extern long __start___uaccess_flush_fixup, __stop___uaccess_flush_fixup; +extern long __start___entry_flush_fixup, __stop___entry_flush_fixup;extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
arch/powerpc/include/asm/kup.h +20 -6
@@ -14,7 +14,7 @@#define KUAP_CURRENT_WRITE 8#define KUAP_CURRENT (KUAP_CURRENT_READ | KUAP_CURRENT_WRITE) -#ifdef CONFIG_PPC64 +#ifdef CONFIG_PPC_BOOK3S_64 #include <asm/book3s/64/kup-radix.h> #endif #ifdef CONFIG_PPC_8xx
@@ -35,6 +35,9 @@ .macro kuap_check current, gpr .endm +.macro kuap_check_amr gpr1, gpr2 +.endm +#endif #else /* !__ASSEMBLY__ */
@@ -53,17 +56,28 @@ static inline void setup_kuep(bool disabled) { }void setup_kuap (bool disabled);#else static inline void setup_kuap (bool disabled) { } + +static inline bool +bad_kuap_fault (struct pt_regs *regs,unsigned long address,bool is_write) +{ +return false; +} + +static inline void kuap_check_amr (void ) { } + +/* +* book3s/64/kup-radix.h defines these functions for the !KUAP case to flush +* the L1D cache after user accesses. Only include the empty stubs for other +* platforms. +*/ +#ifndef CONFIG_PPC_BOOK3S_64 static inline void allow_user_access (void __user *to,const void __user *from,unsigned long size,unsigned long dir) { }static inline void prevent_user_access (void __user *to,const void __user *from,unsigned long size,unsigned long dir) { }static inline unsigned long prevent_user_access_return (void ) {return 0UL ; }static inline void restore_user_access (unsigned long flags) { } -static inline bool -bad_kuap_fault (struct pt_regs *regs,unsigned long address,bool is_write) -{ -return false; -} +#endif /* CONFIG_PPC_BOOK3S_64 */ #endif /* CONFIG_PPC_KUAP */ static inline void allow_read_from_user (const void __user *from,unsigned long size)
arch/powerpc/include/asm/security_features.h +7 -0
@@ -86,12 +86,19 @@ static inline bool security_ftr_enabled(u64 feature)// Software required to flush link stack on context switch #define SEC_FTR_FLUSH_LINK_STACK 0x0000000000001000ull +// The L1-D cache should be flushed when entering the kernel +#define SEC_FTR_L1D_FLUSH_ENTRY 0x0000000000004000ull + +// The L1-D cache should be flushed after user accesses from the kernel +#define SEC_FTR_L1D_FLUSH_UACCESS 0x0000000000008000ull// Features enabled by default #define SEC_FTR_DEFAULT \ (SEC_FTR_L1D_FLUSH_HV | \ SEC_FTR_L1D_FLUSH_PR | \ SEC_FTR_BNDS_CHK_SPEC_BAR | \ + SEC_FTR_L1D_FLUSH_ENTRY | \ + SEC_FTR_L1D_FLUSH_UACCESS | \ SEC_FTR_FAVOUR_SECURITY)#endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
arch/powerpc/include/asm/setup.h +4 -0
@@ -52,12 +52,16 @@ enum l1d_flush_type { };void setup_rfi_flush (enum l1d_flush_type ,bool enable); +void setup_entry_flush (bool enable); +void setup_uaccess_flush (bool enable);void do_rfi_flush_fixups (enum l1d_flush_type types);#ifdef CONFIG_PPC_BARRIER_NOSPEC void setup_barrier_nospec (void );#else static inline void setup_barrier_nospec (void ) { };#endif +void do_uaccess_flush_fixups (enum l1d_flush_type types); +void do_entry_flush_fixups (enum l1d_flush_type types);void do_barrier_nospec_fixups (bool enable);extern bool barrier_nospec_enabled;
arch/powerpc/kernel/exceptions-64s.S +42 -38
111 lines not on this page · raw message
arch/powerpc/kernel/setup_64.c +121 -1
159 lines not on this page · raw message
arch/powerpc/kernel/smp.c +1 -1
@@ -1251,7 +1251,7 @@ static bool shared_caches;/* Activate a secondary processor. */ void start_secondary (void *unused) { -unsigned int cpu =smp_processor_id (); +unsigned int cpu =raw_smp_processor_id ();struct cpumask *(*sibling_mask)(int ) = cpu_sibling_mask;mmgrab (&init_mm);
arch/powerpc/kernel/syscall_64.c +1 -1
@@ -2,7 +2,7 @@#include <linux/err.h> #include <asm/asm-prototypes.h> -#include <asm/book3s/64/kup-radix.h> +#include <asm/kup.h> #include <asm/cputime.h> #include <asm/hw_irq.h> #include <asm/kprobes.h>
arch/powerpc/kernel/vmlinux.lds.S +14 -0
@@ -131,6 +131,20 @@ SECTIONS __stop___stf_entry_barrier_fixup = .; } + . = ALIGN(8); + __uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) { + __start___uaccess_flush_fixup = .; + *(__uaccess_flush_fixup) + __stop___uaccess_flush_fixup = .; + } + + . = ALIGN(8); + __entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) { + __start___entry_flush_fixup = .; + *(__entry_flush_fixup) + __stop___entry_flush_fixup = .; + } + . = ALIGN(8); __stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) { __start___stf_exit_barrier_fixup = .;
arch/powerpc/lib/feature-fixups.c +104 -0
110 lines not on this page · raw message
arch/powerpc/platforms/powernv/setup.c +17 -0
@@ -122,12 +122,29 @@ static void pnv_setup_rfi_flush(void) type =L1D_FLUSH_ORI ; } +/* +* If we are non-Power9 bare metal, we don't need to flush on kernel +* entry or after user access: they fix a P9 specific vulnerability. +*/ +if (!pvr_version_is (PVR_POWER9 )) { +security_ftr_clear (SEC_FTR_L1D_FLUSH_ENTRY ); +security_ftr_clear (SEC_FTR_L1D_FLUSH_UACCESS ); + } + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && \ (security_ftr_enabled (SEC_FTR_L1D_FLUSH_PR ) || \security_ftr_enabled (SEC_FTR_L1D_FLUSH_HV ));setup_rfi_flush (type, enable);setup_count_cache_flush (); + + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && +security_ftr_enabled (SEC_FTR_L1D_FLUSH_ENTRY ); +setup_entry_flush (enable); + + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && +security_ftr_enabled (SEC_FTR_L1D_FLUSH_UACCESS ); +setup_uaccess_flush (enable); }static void __init pnv_setup_arch (void )
arch/powerpc/platforms/pseries/setup.c +8 -0
@@ -573,6 +573,14 @@ void pseries_setup_rfi_flush(void)setup_rfi_flush (types, enable);setup_count_cache_flush (); + + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && +security_ftr_enabled (SEC_FTR_L1D_FLUSH_ENTRY ); +setup_entry_flush (enable); + + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && +security_ftr_enabled (SEC_FTR_L1D_FLUSH_UACCESS ); +setup_uaccess_flush (enable); }#ifdef CONFIG_PCI_IOV
arch/x86/events/intel/uncore_snb.c +1 -1
@@ -459,7 +459,7 @@ enum perf_snb_uncore_imc_freerunning_types {static struct freerunning_counters snb_uncore_imc_freerunning[] = { [SNB_PCI_UNCORE_IMC_DATA_READS ] = {SNB_UNCORE_PCI_IMC_DATA_READS_BASE ,0x0 ,0x0 ,1 ,32 }, - [SNB_PCI_UNCORE_IMC_DATA_READS ] = {SNB_UNCORE_PCI_IMC_DATA_WRITES_BASE , + [SNB_PCI_UNCORE_IMC_DATA_WRITES ] = {SNB_UNCORE_PCI_IMC_DATA_WRITES_BASE ,0x0 ,0x0 ,1 ,32 }, [SNB_PCI_UNCORE_IMC_GT_REQUESTS ] = {SNB_UNCORE_PCI_IMC_GT_REQUESTS_BASE ,0x0 ,0x0 ,1 ,32 },
arch/x86/kvm/emulate.c +7 -1
@@ -4032,6 +4032,12 @@ static int em_clflush(struct x86_emulate_ctxt *ctxt)return X86EMUL_CONTINUE ; } +static int em_clflushopt (struct x86_emulate_ctxt *ctxt) +{ +/* emulating clflushopt regardless of cpuid */ +return X86EMUL_CONTINUE ; +} +static int em_movsxd (struct x86_emulate_ctxt *ctxt) { ctxt->dst.val = (s32 ) ctxt->src.val;
@@ -4571,7 +4577,7 @@ static const struct opcode group11[] = { };static const struct gprefix pfx_0f_ae_7 = { -I (SrcMem | ByteOp, em_clflush),N ,N ,N , +I (SrcMem | ByteOp, em_clflush),I (SrcMem | ByteOp, em_clflushopt),N ,N , };static const struct group_dual group15 = { {
drivers/acpi/evged.c +1 -1
@@ -101,7 +101,7 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,switch (gsi) { case 0 ... 255: -sprintf (ev_name,"_%c%02hhX" , +sprintf (ev_name,"_%c%02X" , trigger ==ACPI_EDGE_SENSITIVE ?'E' :'L' , gsi);if (ACPI_SUCCESS (acpi_get_handle (handle, ev_name, &evt_handle)))
drivers/input/keyboard/sunkbd.c +33 -8
67 lines not on this page · raw message
drivers/leds/leds-lm3697.c +5 -3
@@ -78,6 +78,7 @@ struct lm3697 {struct mutex lock;int bank_cfg; +int num_banks;struct lm3697_led leds[]; };
@@ -180,7 +181,7 @@ static int lm3697_init(struct lm3697 *priv)if (ret)dev_err (&priv->client->dev,"Cannot write OUTPUT config\n" ); -for (i =0 ; i <LM3697_MAX_CONTROL_BANKS ; i++) { +for (i =0 ; i < priv->num_banks; i++) { led = &priv->leds[i]; ret =ti_lmu_common_set_ramp (&led->lmu_data);if (ret)
@@ -307,8 +308,8 @@ static int lm3697_probe(struct i2c_client *client,int ret; count =device_get_child_node_count (&client->dev); -if (!count) { -dev_err (&client->dev,"LEDs are not defined in device tree!" ); +if (!count || count >LM3697_MAX_CONTROL_BANKS ) { +dev_err (&client->dev,"Strange device tree!" );return -ENODEV ; }
@@ -322,6 +323,7 @@ static int lm3697_probe(struct i2c_client *client, led->client = client; led->dev = &client->dev; + led->num_banks = count; led->regmap =devm_regmap_init_i2c (client, &lm3697_regmap_config);if (IS_ERR (led->regmap)) { ret =PTR_ERR (led->regmap);
net/can/proc.c +4 -2
@@ -471,6 +471,9 @@ void can_init_proc(struct net *net)*/ void can_remove_proc (struct net *net) { +if (!net->can.proc_dir) +return ; +if (net->can.pde_version)remove_proc_entry (CAN_PROC_VERSION , net->can.proc_dir);
@@ -498,6 +501,5 @@ void can_remove_proc(struct net *net)if (net->can.pde_rcvlist_sff)remove_proc_entry (CAN_PROC_RCVLIST_SFF , net->can.proc_dir); -if (net->can.proc_dir) -remove_proc_entry ("can" , net->proc_net); +remove_proc_entry ("can" , net->proc_net); }
net/mac80211/sta_info.c +18 -0
@@ -258,6 +258,24 @@ struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,*/ void sta_info_free (struct ieee80211_local *local,struct sta_info *sta) { +/* +* If we had used sta_info_pre_move_state() then we might not +* have gone through the state transitions down again, so do +* it here now (and warn if it's inserted). +* +* This will clear state such as fast TX/RX that may have been +* allocated during state transitions. +*/ +while (sta->sta_state >IEEE80211_STA_NONE ) { +int ret; + +WARN_ON_ONCE (test_sta_flag (sta,WLAN_STA_INSERTED )); + + ret =sta_info_move_state (sta, sta->sta_state -1 ); +if (WARN_ONCE (ret,"sta_info_move_state() returned %d\n" , ret)) +break ; + } +if (sta->rate_ctrl)rate_control_free_sta (sta);
tools/testing/selftests/kselftest_harness.h +1 -1
@@ -126,7 +126,7 @@snprintf (_metadata->results->reason, \ sizeof(_metadata->results->reason), fmt, ##__VA_ARGS__); \if (TH_LOG_ENABLED ) { \ -fprintf (TH_LOG_STREAM ,"# SKIP %s\n" , \ +fprintf (TH_LOG_STREAM ,"# SKIP %s\n" , \ _metadata->results->reason); \ } \ _metadata->passed =1 ; \
tools/testing/selftests/powerpc/security/.gitignore +1 -0
@@ -1,2 +1,3 @@ # SPDX-License-Identifier: GPL-2.0-only rfi_flush +entry_flush
tools/testing/selftests/powerpc/security/Makefile +1 -1
@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0+ -TEST_GEN_PROGS := rfi_flush spectre_v2 +TEST_GEN_PROGS := rfi_flush entry_flush spectre_v2 top_srcdir = ../../../../.. CFLAGS += -I../../../../../usr/include
tools/testing/selftests/powerpc/security/entry_flush.c new file +198 -0
198 lines not on this page · raw message
tools/testing/selftests/powerpc/security/rfi_flush.c +29 -6
@@ -50,16 +50,30 @@ int rfi_flush_test(void)__u64 l1d_misses_total =0 ;unsigned long iterations =100000 , zero_size =24 *1024 ;unsigned long l1d_misses_expected; -int rfi_flush_org, rfi_flush; +int rfi_flush_orig, rfi_flush; +int have_entry_flush, entry_flush_orig;SKIP_IF (geteuid () !=0 ); -if (read_debugfs_file ("powerpc/rfi_flush" , &rfi_flush_org)) { +if (read_debugfs_file ("powerpc/rfi_flush" , &rfi_flush_orig) <0 ) {perror ("Unable to read powerpc/rfi_flush debugfs file" );SKIP_IF (1 ); } - rfi_flush = rfi_flush_org; +if (read_debugfs_file ("powerpc/entry_flush" , &entry_flush_orig) <0 ) { + have_entry_flush =0 ; + }else { + have_entry_flush =1 ; + +if (entry_flush_orig !=0 ) { +if (write_debugfs_file ("powerpc/entry_flush" ,0 ) <0 ) { +perror ("error writing to powerpc/entry_flush debugfs file" ); +return 1 ; + } + } + } + + rfi_flush = rfi_flush_orig; fd =perf_event_open_counter (PERF_TYPE_RAW ,/* L1d miss */ 0x400f0 ,-1 );FAIL_IF (fd <0 );
@@ -68,6 +82,7 @@ int rfi_flush_test(void)FAIL_IF (perf_event_enable (fd)); +// disable L1 prefetching set_dscr (1 ); iter = repetitions;
@@ -109,8 +124,8 @@ int rfi_flush_test(void) repetitions * l1d_misses_expected /2 , passes, repetitions); -if (rfi_flush == rfi_flush_org) { - rfi_flush = !rfi_flush_org; +if (rfi_flush == rfi_flush_orig) { + rfi_flush = !rfi_flush_orig;if (write_debugfs_file ("powerpc/rfi_flush" , rfi_flush) <0 ) {perror ("error writing to powerpc/rfi_flush debugfs file" );return 1 ;
@@ -126,11 +141,19 @@ int rfi_flush_test(void)set_dscr (0 ); -if (write_debugfs_file ("powerpc/rfi_flush" , rfi_flush_org) <0 ) { +if (write_debugfs_file ("powerpc/rfi_flush" , rfi_flush_orig) <0 ) {perror ("unable to restore original value of powerpc/rfi_flush debugfs file" );return 1 ; } +if (have_entry_flush) { +if (write_debugfs_file ("powerpc/entry_flush" , entry_flush_orig) <0 ) { +perror ("unable to restore original value of powerpc/entry_flush " +"debugfs file" ); +return 1 ; + } + } +return rc; }