5.10.105-rc2 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.10.105-rc2 review
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.10.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.10.105-rc2
Greg Kroah-Hartman <[email protected]>
Revert "ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE"
Juergen Gross <[email protected]>
xen/netfront: react properly to failing gnttab_end_foreign_access_ref()
Juergen Gross <[email protected]>
xen/gnttab: fix gnttab_end_foreign_access() without page specified
Juergen Gross <[email protected]>
xen/pvcalls: use alloc/free_pages_exact()
Juergen Gross <[email protected]>
xen/9p: use alloc/free_pages_exact()
Juergen Gross <[email protected]>
xen: remove gnttab_query_foreign_access()
Juergen Gross <[email protected]>
xen/gntalloc: don't use gnttab_query_foreign_access()
Juergen Gross <[email protected]>
xen/scsifront: don't use gnttab_query_foreign_access() for mapped status
Juergen Gross <[email protected]>
xen/netfront: don't use gnttab_query_foreign_access() for mapped status
Juergen Gross <[email protected]>
xen/blkfront: don't use gnttab_query_foreign_access() for mapped status
Juergen Gross <[email protected]>
xen/grant-table: add gnttab_try_end_foreign_access()
Juergen Gross <[email protected]>
xen/xenbus: don't let xenbus_grant_ring() remove grants in error case
Russell King (Oracle) <[email protected]>
ARM: fix build warning in proc-v7-bugs.c
Nathan Chancellor <[email protected]>
ARM: Do not use NOCROSSREFS directive with ld.lld
Russell King (Oracle) <[email protected]>
ARM: fix co-processor register typo
Emmanuel Gil Peyrot <[email protected]>
ARM: fix build error when BPF_SYSCALL is disabled
James Morse <[email protected]>
arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 mitigation reporting
James Morse <[email protected]>
arm64: Use the clearbhb instruction in mitigations
James Morse <[email protected]>
KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated
James Morse <[email protected]>
arm64: Mitigate spectre style branch history side channels
James Morse <[email protected]>
KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
James Morse <[email protected]>
arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2
James Morse <[email protected]>
arm64: Add percpu vectors for EL1
James Morse <[email protected]>
arm64: entry: Add macro for reading symbol addresses from the trampoline
James Morse <[email protected]>
arm64: entry: Add vectors that have the bhb mitigation sequences
James Morse <[email protected]>
arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations
James Morse <[email protected]>
arm64: entry: Allow the trampoline text to occupy multiple pages
James Morse <[email protected]>
arm64: entry: Make the kpti trampoline's kpti sequence optional
James Morse <[email protected]>
arm64: entry: Move trampoline macros out of ifdef'd section
James Morse <[email protected]>
arm64: entry: Don't assume tramp_vectors is the start of the vectors
James Morse <[email protected]>
arm64: entry: Allow tramp_alias to access symbols after the 4K boundary
James Morse <[email protected]>
arm64: entry: Move the trampoline data page before the text page
James Morse <[email protected]>
arm64: entry: Free up another register on kpti's tramp_exit path
James Morse <[email protected]>
arm64: entry: Make the trampoline cleanup optional
James Morse <[email protected]>
arm64: spectre: Rename spectre_v4_patch_fw_mitigation_conduit
James Morse <[email protected]>
arm64: entry.S: Add ventry overflow sanity checks
Joey Gouly <[email protected]>
arm64: cpufeature: add HWCAP for FEAT_RPRES
Joey Gouly <[email protected]>
arm64: cpufeature: add HWCAP for FEAT_AFP
Joey Gouly <[email protected]>
arm64: add ID_AA64ISAR2_EL1 sys register
Marc Zyngier <[email protected]>
arm64: Add HWCAP for self-synchronising virtual counter
Anshuman Khandual <[email protected]>
arm64: Add Cortex-A510 CPU part definition
Anshuman Khandual <[email protected]>
arm64: Add Cortex-X2 CPU part definition
Suzuki K Poulose <[email protected]>
arm64: Add Neoverse-N2, Cortex-A710 CPU part definition
Hector Martin <[email protected]>
arm64: cputype: Add CPU implementor & types for the Apple M1 cores
Russell King (Oracle) <[email protected]>
ARM: include unprivileged BPF status in Spectre V2 reporting
Russell King (Oracle) <[email protected]>
ARM: Spectre-BHB workaround
Russell King (Oracle) <[email protected]>
ARM: use LOADADDR() to get load address of sections
Russell King (Oracle) <[email protected]>
ARM: early traps initialisation
Russell King (Oracle) <[email protected]>
ARM: report Spectre v2 status through sysfs
Josh Poimboeuf <[email protected]>
x86/speculation: Warn about eIBRS + LFENCE + Unprivileged eBPF + SMT
Josh Poimboeuf <[email protected]>
x86/speculation: Warn about Spectre v2 LFENCE mitigation
Kim Phillips <[email protected]>
x86/speculation: Update link to AMD speculation whitepaper
Kim Phillips <[email protected]>
x86/speculation: Use generic retpoline by default on AMD
Josh Poimboeuf <[email protected]>
x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation reporting
Peter Zijlstra <[email protected]>
Documentation/hw-vuln: Update spectre doc
Peter Zijlstra <[email protected]>
x86/speculation: Add eIBRS + Retpoline options
Peter Zijlstra (Intel) <[email protected]>
x86/speculation: Rename RETPOLINE_AMD to RETPOLINE_LFENCE
Peter Zijlstra <[email protected]>
x86,bugs: Unconditionally allow spectre_v2=retpoline,amd
-------------
Diffstat:
Documentation/admin-guide/hw-vuln/spectre.rst | 48 ++-- Documentation/admin-guide/kernel-parameters.txt | 8 +- Documentation/arm64/cpu-feature-registers.rst | 29 +- Documentation/arm64/elf_hwcaps.rst | 12 + Makefile | 4 +- arch/arm/include/asm/assembler.h | 10 + arch/arm/include/asm/spectre.h | 32 +++ arch/arm/include/asm/vmlinux.lds.h | 43 ++- arch/arm/kernel/Makefile | 2 + arch/arm/kernel/entry-armv.S | 79 +++++- arch/arm/kernel/entry-common.S | 24 ++ arch/arm/kernel/spectre.c | 71 +++++ arch/arm/kernel/traps.c | 65 ++++- arch/arm/mm/Kconfig | 11 + arch/arm/mm/proc-v7-bugs.c | 208 +++++++++++--- arch/arm64/Kconfig | 9 + arch/arm64/include/asm/assembler.h | 33 +++ arch/arm64/include/asm/cpu.h | 1 + arch/arm64/include/asm/cpucaps.h | 3 +- arch/arm64/include/asm/cpufeature.h | 28 ++ arch/arm64/include/asm/cputype.h | 22 ++ arch/arm64/include/asm/fixmap.h | 6 +- arch/arm64/include/asm/hwcap.h | 3 + arch/arm64/include/asm/insn.h | 1 + arch/arm64/include/asm/kvm_asm.h | 8 + arch/arm64/include/asm/kvm_mmu.h | 3 +- arch/arm64/include/asm/mmu.h | 6 + arch/arm64/include/asm/sections.h | 5 + arch/arm64/include/asm/spectre.h | 4 + arch/arm64/include/asm/sysreg.h | 18 ++ arch/arm64/include/asm/vectors.h | 73 +++++ arch/arm64/include/uapi/asm/hwcap.h | 3 + arch/arm64/include/uapi/asm/kvm.h | 5 + arch/arm64/kernel/cpu_errata.c | 7 + arch/arm64/kernel/cpufeature.c | 28 +- arch/arm64/kernel/cpuinfo.c | 4 + arch/arm64/kernel/entry.S | 213 ++++++++++---- arch/arm64/kernel/proton-pack.c | 359 +++++++++++++++++++++++- arch/arm64/kernel/vmlinux.lds.S | 2 +- arch/arm64/kvm/arm.c | 3 +- arch/arm64/kvm/hyp/hyp-entry.S | 4 + arch/arm64/kvm/hyp/smccc_wa.S | 75 +++++ arch/arm64/kvm/hyp/vhe/switch.c | 9 +- arch/arm64/kvm/hypercalls.c | 12 + arch/arm64/kvm/psci.c | 18 +- arch/arm64/kvm/sys_regs.c | 2 +- arch/arm64/mm/mmu.c | 12 +- arch/x86/include/asm/cpufeatures.h | 2 +- arch/x86/include/asm/nospec-branch.h | 16 +- arch/x86/kernel/cpu/bugs.c | 205 ++++++++++---- drivers/acpi/ec.c | 10 - drivers/acpi/sleep.c | 14 +- drivers/block/xen-blkfront.c | 63 +++-- drivers/net/xen-netfront.c | 54 ++-- drivers/scsi/xen-scsifront.c | 3 +- drivers/xen/gntalloc.c | 25 +- drivers/xen/grant-table.c | 71 ++--- drivers/xen/pvcalls-front.c | 8 +- drivers/xen/xenbus/xenbus_client.c | 24 +- include/linux/arm-smccc.h | 5 + include/linux/bpf.h | 12 + include/xen/grant_table.h | 19 +- kernel/sysctl.c | 7 + net/9p/trans_xen.c | 14 +- tools/arch/x86/include/asm/cpufeatures.h | 2 +- 65 files changed, 1825 insertions(+), 354 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/58 x86,bugs: Unconditionally allow spectre_v2=retpoline,amd
From: Peter Zijlstra <[email protected]>
commit f8a66d608a3e471e1202778c2a36cbdc96bae73b upstream.
Currently Linux prevents usage of retpoline,amd on !AMD hardware, this is unfriendly and gets in the way of testing. Remove this restriction.
--- arch/x86/kernel/cpu/bugs.c | 7 ------- 1 file changed, 7 deletions(-)
arch/x86/kernel/cpu/bugs.c +0 -7
@@ -845,13 +845,6 @@ static enum spectre_v2_mitigation_cmd __return SPECTRE_V2_CMD_AUTO ; } -if (cmd ==SPECTRE_V2_CMD_RETPOLINE_AMD && - boot_cpu_data.x86_vendor !=X86_VENDOR_HYGON && - boot_cpu_data.x86_vendor !=X86_VENDOR_AMD ) { -pr_err ("retpoline,amd selected but CPU is not AMD. Switching to AUTO select\n" ); -return SPECTRE_V2_CMD_AUTO ; - } -spec_v2_print_cond (mitigation_options[i].option, mitigation_options[i].secure);return cmd;
Greg Kroah-Hartman
maintainerPATCH 2/58 x86/speculation: Rename RETPOLINE_AMD to RETPOLINE_LFENCE
In reply to Greg Kroah-HartmanFrom: "Peter Zijlstra (Intel)" <[email protected]>
commit d45476d9832409371537013ebdd8dc1a7781f97a upstream.
The RETPOLINE_AMD name is unfortunate since it isn't necessarily AMD only, in fact Hygon also uses it. Furthermore it will likely be sufficient for some Intel processors. Therefore rename the thing to RETPOLINE_LFENCE to better describe what it is.
Add the spectre_v2=retpoline,lfence option as an alias to spectre_v2=retpoline,amd to preserve existing setups. However, the output of /sys/devices/system/cpu/vulnerabilities/spectre_v2 will be changed.
[ bp: Fix typos, massage. ]
--- arch/x86/include/asm/cpufeatures.h | 2 +- arch/x86/include/asm/nospec-branch.h | 12 ++++++------ arch/x86/kernel/cpu/bugs.c | 29 ++++++++++++++++++----------- tools/arch/x86/include/asm/cpufeatures.h | 2 +- 4 files changed, 26 insertions(+), 19 deletions(-)
arch/x86/include/asm/cpufeatures.h +1 -1
@@ -204,7 +204,7 @@#define X86_FEATURE_SME ( 7*32+10)/* AMD Secure Memory Encryption */ #define X86_FEATURE_PTI ( 7*32+11)/* Kernel Page Table Isolation enabled */ #define X86_FEATURE_RETPOLINE ( 7*32+12)/* "" Generic Retpoline mitigation for Spectre variant 2 */ -#define X86_FEATURE_RETPOLINE_AMD ( 7*32+13)/* "" AMD Retpoline mitigation for Spectre variant 2 */ +#define X86_FEATURE_RETPOLINE_LFENCE ( 7*32+13)/* "" Use LFENCE for Spectre variant 2 */ #define X86_FEATURE_INTEL_PPIN ( 7*32+14)/* Intel Processor Inventory Number */ #define X86_FEATURE_CDP_L2 ( 7*32+15)/* Code and Data Prioritization L2 */ #define X86_FEATURE_MSR_SPEC_CTRL ( 7*32+16)/* "" MSR SPEC_CTRL is implemented */
arch/x86/include/asm/nospec-branch.h +6 -6
@@ -82,7 +82,7 @@#ifdef CONFIG_RETPOLINE ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *%\reg), \ __stringify(jmp __x86_retpoline_\reg), X86_FEATURE_RETPOLINE, \ - __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *%\reg), X86_FEATURE_RETPOLINE_AMD + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *%\reg), X86_FEATURE_RETPOLINE_LFENCE#else jmp *%\reg#endif
@@ -92,7 +92,7 @@#ifdef CONFIG_RETPOLINE ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; call *%\reg), \ __stringify(call __x86_retpoline_\reg), X86_FEATURE_RETPOLINE, \ - __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; call *%\reg), X86_FEATURE_RETPOLINE_AMD + __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; call *%\reg), X86_FEATURE_RETPOLINE_LFENCE#else call *%\reg#endif
@@ -134,7 +134,7 @@ "lfence;\n" \ ANNOTATE_RETPOLINE_SAFE \ "call *%[thunk_target]\n", \ - X86_FEATURE_RETPOLINE_AMD) + X86_FEATURE_RETPOLINE_LFENCE)# define THUNK_TARGET (addr) [thunk_target] "r" (addr)
@@ -164,7 +164,7 @@ "lfence;\n" \ ANNOTATE_RETPOLINE_SAFE \ "call *%[thunk_target]\n", \ - X86_FEATURE_RETPOLINE_AMD) + X86_FEATURE_RETPOLINE_LFENCE)# define THUNK_TARGET (addr) [thunk_target] "rm" (addr)#endif
@@ -176,8 +176,8 @@/* The Spectre V2 mitigation variants */ enum spectre_v2_mitigation {SPECTRE_V2_NONE , -SPECTRE_V2_RETPOLINE_GENERIC , -SPECTRE_V2_RETPOLINE_AMD , +SPECTRE_V2_RETPOLINE , +SPECTRE_V2_LFENCE ,SPECTRE_V2_IBRS_ENHANCED , };
arch/x86/kernel/cpu/bugs.c +18 -11
@@ -627,7 +627,7 @@ enum spectre_v2_mitigation_cmd {SPECTRE_V2_CMD_FORCE ,SPECTRE_V2_CMD_RETPOLINE ,SPECTRE_V2_CMD_RETPOLINE_GENERIC , - SPECTRE_V2_CMD_RETPOLINE_AMD, + SPECTRE_V2_CMD_RETPOLINE_LFENCE, }; enum spectre_v2_user_cmd {
@@ -787,8 +787,8 @@ set_mode:static const char *const spectre_v2_strings[] = { [SPECTRE_V2_NONE ] ="Vulnerable" , - [SPECTRE_V2_RETPOLINE_GENERIC ] ="Mitigation: Full generic retpoline" , - [SPECTRE_V2_RETPOLINE_AMD ] ="Mitigation: Full AMD retpoline" , + [SPECTRE_V2_RETPOLINE ] ="Mitigation: Retpolines" , + [SPECTRE_V2_LFENCE ] ="Mitigation: LFENCE" , [SPECTRE_V2_IBRS_ENHANCED ] ="Mitigation: Enhanced IBRS" , };
@@ -800,7 +800,8 @@ static const struct { { "off", SPECTRE_V2_CMD_NONE, false }, { "on", SPECTRE_V2_CMD_FORCE, true }, { "retpoline", SPECTRE_V2_CMD_RETPOLINE, false }, - { "retpoline,amd", SPECTRE_V2_CMD_RETPOLINE_AMD, false }, + { "retpoline,amd", SPECTRE_V2_CMD_RETPOLINE_LFENCE, false }, + { "retpoline,lfence", SPECTRE_V2_CMD_RETPOLINE_LFENCE, false }, { "retpoline,generic", SPECTRE_V2_CMD_RETPOLINE_GENERIC, false }, { "auto", SPECTRE_V2_CMD_AUTO, false }, };
@@ -838,13 +839,19 @@ static enum spectre_v2_mitigation_cmd __ }if ((cmd ==SPECTRE_V2_CMD_RETPOLINE || - cmd ==SPECTRE_V2_CMD_RETPOLINE_AMD || + cmd ==SPECTRE_V2_CMD_RETPOLINE_LFENCE || cmd ==SPECTRE_V2_CMD_RETPOLINE_GENERIC ) && !IS_ENABLED (CONFIG_RETPOLINE )) {pr_err ("%s selected but not compiled in. Switching to AUTO select\n" , mitigation_options[i].option);return SPECTRE_V2_CMD_AUTO ; } +if ((cmd ==SPECTRE_V2_CMD_RETPOLINE_LFENCE ) && + !boot_cpu_has (X86_FEATURE_LFENCE_RDTSC )) { +pr_err ("%s selected, but CPU doesn't have a serializing LFENCE. Switching to AUTO select\n" , mitigation_options[i].option); +return SPECTRE_V2_CMD_AUTO ; + } +spec_v2_print_cond (mitigation_options[i].option, mitigation_options[i].secure);return cmd;
@@ -879,9 +886,9 @@ static void __init spectre_v2_select_mitif (IS_ENABLED (CONFIG_RETPOLINE )) goto retpoline_auto;break ; -case SPECTRE_V2_CMD_RETPOLINE_AMD : +case SPECTRE_V2_CMD_RETPOLINE_LFENCE :if (IS_ENABLED (CONFIG_RETPOLINE )) - goto retpoline_amd; + goto retpoline_lfence;break ;case SPECTRE_V2_CMD_RETPOLINE_GENERIC :if (IS_ENABLED (CONFIG_RETPOLINE ))
@@ -898,17 +905,17 @@ static void __init spectre_v2_select_mit retpoline_auto:if (boot_cpu_data.x86_vendor ==X86_VENDOR_AMD || boot_cpu_data.x86_vendor ==X86_VENDOR_HYGON ) { - retpoline_amd: + retpoline_lfence:if (!boot_cpu_has (X86_FEATURE_LFENCE_RDTSC )) {pr_err ("Spectre mitigation: LFENCE not serializing, switching to generic retpoline\n" ); goto retpoline_generic; } - mode =SPECTRE_V2_RETPOLINE_AMD ; -setup_force_cpu_cap (X86_FEATURE_RETPOLINE_AMD ); + mode =SPECTRE_V2_LFENCE ; +setup_force_cpu_cap (X86_FEATURE_RETPOLINE_LFENCE );setup_force_cpu_cap (X86_FEATURE_RETPOLINE ); }else { retpoline_generic: - mode =SPECTRE_V2_RETPOLINE_GENERIC ; + mode =SPECTRE_V2_RETPOLINE ;setup_force_cpu_cap (X86_FEATURE_RETPOLINE ); }
tools/arch/x86/include/asm/cpufeatures.h +1 -1
@@ -204,7 +204,7 @@#define X86_FEATURE_SME ( 7*32+10)/* AMD Secure Memory Encryption */ #define X86_FEATURE_PTI ( 7*32+11)/* Kernel Page Table Isolation enabled */ #define X86_FEATURE_RETPOLINE ( 7*32+12)/* "" Generic Retpoline mitigation for Spectre variant 2 */ -#define X86_FEATURE_RETPOLINE_AMD ( 7*32+13)/* "" AMD Retpoline mitigation for Spectre variant 2 */ +#define X86_FEATURE_RETPOLINE_LFENCE ( 7*32+13)/* "" Use LFENCEs for Spectre variant 2 */ #define X86_FEATURE_INTEL_PPIN ( 7*32+14)/* Intel Processor Inventory Number */ #define X86_FEATURE_CDP_L2 ( 7*32+15)/* Code and Data Prioritization L2 */ #define X86_FEATURE_MSR_SPEC_CTRL ( 7*32+16)/* "" MSR SPEC_CTRL is implemented */
Greg Kroah-Hartman
maintainerPATCH 3/58 x86/speculation: Add eIBRS + Retpoline options
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 1e19da8522c81bf46b335f84137165741e0d82b7 upstream.
Thanks to the chaps at VUsec it is now clear that eIBRS is not sufficient, therefore allow enabling of retpolines along with eIBRS.
Add spectre_v2=eibrs, spectre_v2=eibrs,lfence and spectre_v2=eibrs,retpoline options to explicitly pick your preferred means of mitigation.
Since there's new mitigations there's also user visible changes in /sys/devices/system/cpu/vulnerabilities/spectre_v2 to reflect these new mitigations.
[ bp: Massage commit message, trim error messages,
do more precise eIBRS mode checking. ]
--- arch/x86/include/asm/nospec-branch.h | 4 - arch/x86/kernel/cpu/bugs.c | 133 +++++++++++++++++++++++++---------- 2 files changed, 99 insertions(+), 38 deletions(-)
arch/x86/include/asm/nospec-branch.h +3 -1
@@ -178,7 +178,9 @@ enum spectre_v2_mitigation {SPECTRE_V2_NONE ,SPECTRE_V2_RETPOLINE ,SPECTRE_V2_LFENCE , - SPECTRE_V2_IBRS_ENHANCED, +SPECTRE_V2_EIBRS , +SPECTRE_V2_EIBRS_RETPOLINE , + SPECTRE_V2_EIBRS_LFENCE, };/* The indirect branch speculation control variants */
arch/x86/kernel/cpu/bugs.c +96 -37
212 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 4/58 Documentation/hw-vuln: Update spectre doc
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 5ad3eb1132453b9795ce5fd4572b1c18b292cca9 upstream.
Update the doc with the new fun.
[ bp: Massage commit message. ]
--- Documentation/admin-guide/hw-vuln/spectre.rst | 42 ++++++++++++++++-------- Documentation/admin-guide/kernel-parameters.txt | 8 +++- 2 files changed, 35 insertions(+), 15 deletions(-)
Documentation/admin-guide/hw-vuln/spectre.rst +29 -13
@@ -131,6 +131,19 @@ steer its indirect branch speculations t speculative execution's side effects left in level 1 cache to infer the victim's data. +Yet another variant 2 attack vector is for the attacker to poison the +Branch History Buffer (BHB) to speculatively steer an indirect branch +to a specific Branch Target Buffer (BTB) entry, even if the entry isn't +associated with the source address of the indirect branch. Specifically, +the BHB might be shared across privilege levels even in the presence of +Enhanced IBRS. + +Currently the only known real-world BHB attack vector is via +unprivileged eBPF. Therefore, it's highly recommended to not enable +unprivileged eBPF, especially when eIBRS is used (without retpolines). +For a full mitigation against BHB attacks, it's recommended to use +retpolines (or eIBRS combined with retpolines). + Attack scenarios ----------------
@@ -364,13 +377,15 @@ The possible values in this file are: - Kernel status: - ==================================== ================================= - 'Not affected' The processor is not vulnerable - 'Vulnerable' Vulnerable, no mitigation - 'Mitigation: Full generic retpoline' Software-focused mitigation - 'Mitigation: Full AMD retpoline' AMD-specific software mitigation - 'Mitigation: Enhanced IBRS' Hardware-focused mitigation - ==================================== ================================= + ======================================== ================================= + 'Not affected' The processor is not vulnerable + 'Mitigation: None' Vulnerable, no mitigation + 'Mitigation: Retpolines' Use Retpoline thunks + 'Mitigation: LFENCE' Use LFENCE instructions + 'Mitigation: Enhanced IBRS' Hardware-focused mitigation + 'Mitigation: Enhanced IBRS + Retpolines' Hardware-focused + Retpolines + 'Mitigation: Enhanced IBRS + LFENCE' Hardware-focused + LFENCE + ======================================== ================================= - Firmware status: Show if Indirect Branch Restricted Speculation (IBRS) is used to protect against Spectre variant 2 attacks when calling firmware (x86 only).
@@ -584,12 +599,13 @@ kernel command line. Specific mitigations can also be selected manually: - retpoline - replace indirect branches - retpoline,generic - google's original retpoline - retpoline,amd - AMD-specific minimal thunk + retpoline auto pick between generic,lfence + retpoline,generic Retpolines + retpoline,lfence LFENCE; indirect branch + retpoline,amd alias for retpoline,lfence + eibrs enhanced IBRS + eibrs,retpoline enhanced IBRS + Retpolines + eibrs,lfence enhanced IBRS + LFENCE Not specifying this option is equivalent to spectre_v2=auto.
Documentation/admin-guide/kernel-parameters.txt +6 -2
@@ -4957,8 +4957,12 @@ Specific mitigations can also be selected manually: retpoline - replace indirect branches - retpoline,generic - google's original retpoline - retpoline,amd - AMD-specific minimal thunk + retpoline,generic - Retpolines + retpoline,lfence - LFENCE; indirect branch + retpoline,amd - alias for retpoline,lfence + eibrs - enhanced IBRS + eibrs,retpoline - enhanced IBRS + Retpolines + eibrs,lfence - enhanced IBRS + LFENCE Not specifying this option is equivalent to spectre_v2=auto.
Greg Kroah-Hartman
maintainerPATCH 5/58 x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation reporting
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
commit 44a3918c8245ab10c6c9719dd12e7a8d291980d8 upstream.
With unprivileged eBPF enabled, eIBRS (without retpoline) is vulnerable to Spectre v2 BHB-based attacks.
When both are enabled, print a warning message and report it in the 'spectre_v2' sysfs vulnerabilities file.
--- arch/x86/kernel/cpu/bugs.c | 35 +++++++++++++++++++++++++++++------ include/linux/bpf.h | 12 ++++++++++++ kernel/sysctl.c | 7 +++++++ 3 files changed, 48 insertions(+), 6 deletions(-)
arch/x86/kernel/cpu/bugs.c +29 -6
@@ -16,6 +16,7 @@#include <linux/prctl.h> #include <linux/sched/smt.h> #include <linux/pgtable.h> +#include <linux/bpf.h> #include <asm/spec-ctrl.h> #include <asm/cmdline.h>
@@ -613,6 +614,16 @@ static inline const char *spectre_v2_modstatic inline const char *spectre_v2_module_string (void ) {return "" ; }#endif +#define SPECTRE_V2_EIBRS_EBPF_MSG "WARNING: Unprivileged eBPF is enabled with eIBRS on, data leaks possible via Spectre v2 BHB attacks!\n" + +#ifdef CONFIG_BPF_SYSCALL +void unpriv_ebpf_notify (int new_state) +{ +if (spectre_v2_enabled ==SPECTRE_V2_EIBRS && !new_state) +pr_err (SPECTRE_V2_EIBRS_EBPF_MSG ); +} +#endif +static inline bool match_option (const char *arg,int arglen,const char *opt) {int len =strlen (opt);
@@ -957,6 +968,9 @@ static void __init spectre_v2_select_mitbreak ; } +if (mode ==SPECTRE_V2_EIBRS &&unprivileged_ebpf_enabled ()) +pr_err (SPECTRE_V2_EIBRS_EBPF_MSG ); +if (spectre_v2_in_eibrs_mode (mode)) {/* Force it so VMEXIT will restore correctly */ x86_spec_ctrl_base |=SPEC_CTRL_IBRS ;
@@ -1710,6 +1724,20 @@ static char *ibpb_state(void)return "" ; } +static ssize_t spectre_v2_show_state (char *buf) +{ +if (spectre_v2_enabled ==SPECTRE_V2_EIBRS &&unprivileged_ebpf_enabled ()) +return sprintf (buf,"Vulnerable: Unprivileged eBPF enabled\n" ); + +return sprintf (buf,"%s%s%s%s%s%s\n" , + spectre_v2_strings[spectre_v2_enabled], +ibpb_state (), +boot_cpu_has (X86_FEATURE_USE_IBRS_FW ) ?", IBRS_FW" :"" , +stibp_state (), +boot_cpu_has (X86_FEATURE_RSB_CTXSW ) ?", RSB filling" :"" , +spectre_v2_module_string ()); +} +static ssize_t srbds_show_state (char *buf) {return sprintf (buf,"%s\n" , srbds_strings[srbds_mitigation]);
@@ -1735,12 +1763,7 @@ static ssize_t cpu_show_common(struct dereturn sprintf (buf,"%s\n" , spectre_v1_strings[spectre_v1_mitigation]);case X86_BUG_SPECTRE_V2 : -return sprintf (buf,"%s%s%s%s%s%s\n" , spectre_v2_strings[spectre_v2_enabled], -ibpb_state (), -boot_cpu_has (X86_FEATURE_USE_IBRS_FW ) ?", IBRS_FW" :"" , -stibp_state (), -boot_cpu_has (X86_FEATURE_RSB_CTXSW ) ?", RSB filling" :"" , -spectre_v2_module_string ()); +return spectre_v2_show_state (buf);case X86_BUG_SPEC_STORE_BYPASS :return sprintf (buf,"%s\n" , ssb_strings[ssb_mode]);
include/linux/bpf.h +12 -0
@@ -1485,6 +1485,12 @@ struct bpf_prog *bpf_prog_by_id(u32 id);struct bpf_link *bpf_link_by_id (u32 id);const struct bpf_func_proto *bpf_base_func_proto (enum bpf_func_id func_id); + +static inline bool unprivileged_ebpf_enabled (void ) +{ +return !sysctl_unprivileged_bpf_disabled; +} +#else /* !CONFIG_BPF_SYSCALL */ static inline struct bpf_prog *bpf_prog_get (u32 ufd) {
@@ -1679,6 +1685,12 @@ bpf_base_func_proto(enum bpf_func_id fun {return NULL ; } + +static inline bool unprivileged_ebpf_enabled (void ) +{ +return false; +} +#endif /* CONFIG_BPF_SYSCALL */ static inline struct bpf_prog *bpf_prog_get_type(u32 ufd,
kernel/sysctl.c +7 -0
@@ -234,6 +234,10 @@ static int bpf_stats_handler(struct ctl_return ret; } +void __weak unpriv_ebpf_notify (int new_state) +{ +} +static int bpf_unpriv_handler (struct ctl_table *table,int write,void *buffer,size_t *lenp,loff_t *ppos) {
@@ -251,6 +255,9 @@ static int bpf_unpriv_handler(struct ctlreturn -EPERM ; *(int *)table->data = unpriv_enable; } + +unpriv_ebpf_notify (unpriv_enable); +return ret; }#endif /* CONFIG_BPF_SYSCALL && CONFIG_SYSCTL */
Greg Kroah-Hartman
maintainerPATCH 6/58 x86/speculation: Use generic retpoline by default on AMD
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
commit 244d00b5dd4755f8df892c86cab35fb2cfd4f14b upstream.
AMD retpoline may be susceptible to speculation. The speculation execution window for an incorrect indirect branch prediction using LFENCE/JMP sequence may potentially be large enough to allow exploitation using Spectre V2.
By default, don't use retpoline,lfence on AMD. Instead, use the generic retpoline.
--- arch/x86/kernel/cpu/bugs.c | 9 --------- 1 file changed, 9 deletions(-)
arch/x86/kernel/cpu/bugs.c +0 -9
@@ -904,15 +904,6 @@ static enum spectre_v2_mitigation __initreturn SPECTRE_V2_NONE ; } -if (boot_cpu_data.x86_vendor ==X86_VENDOR_AMD || - boot_cpu_data.x86_vendor ==X86_VENDOR_HYGON ) { -if (!boot_cpu_has (X86_FEATURE_LFENCE_RDTSC )) { -pr_err ("LFENCE not serializing, switching to generic retpoline\n" ); -return SPECTRE_V2_RETPOLINE ; - } -return SPECTRE_V2_LFENCE ; - } -return SPECTRE_V2_RETPOLINE ; }
Greg Kroah-Hartman
maintainerPATCH 7/58 x86/speculation: Update link to AMD speculation whitepaper
In reply to Greg Kroah-HartmanFrom: Kim Phillips <[email protected]>
commit e9b6013a7ce31535b04b02ba99babefe8a8599fa upstream.
Update the link to the "Software Techniques for Managing Speculation on AMD Processors" whitepaper.
--- Documentation/admin-guide/hw-vuln/spectre.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
Documentation/admin-guide/hw-vuln/spectre.rst +3 -3
@@ -60,8 +60,8 @@ privileged data touched during the specu Spectre variant 1 attacks take advantage of speculative execution of conditional branches, while Spectre variant 2 attacks use speculative execution of indirect branches to leak privileged memory. -See :ref:`[1] <spec_ref1>` :ref:`[5] <spec_ref5>` :ref:`[7] <spec_ref7>` -:ref:`[10] <spec_ref10>` :ref:`[11] <spec_ref11>`. +See :ref:`[1] <spec_ref1>` :ref:`[5] <spec_ref5>` :ref:`[6] <spec_ref6>` +:ref:`[7] <spec_ref7>` :ref:`[10] <spec_ref10>` :ref:`[11] <spec_ref11>`. Spectre variant 1 (Bounds Check Bypass) ---------------------------------------
@@ -746,7 +746,7 @@ AMD white papers: .. _spec_ref6: -[6] `Software techniques for managing speculation on AMD processors <https://developer.amd.com/wp-content/resources/90343-B_SoftwareTechniquesforManagingSpeculation_WP_7-18Update_FNL.pdf>`_. +[6] `Software techniques for managing speculation on AMD processors <https://developer.amd.com/wp-content/resources/Managing-Speculation-on-AMD-Processors.pdf>`_. ARM white papers:
Greg Kroah-Hartman
maintainerPATCH 8/58 x86/speculation: Warn about Spectre v2 LFENCE mitigation
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
commit eafd987d4a82c7bb5aa12f0e3b4f8f3dea93e678 upstream.
With:
f8a66d608a3e ("x86,bugs: Unconditionally allow spectre_v2=retpoline,amd")
it became possible to enable the LFENCE "retpoline" on Intel. However, Intel doesn't recommend it, as it has some weaknesses compared to retpoline.
Now AMD doesn't recommend it either.
It can still be left available as a cmdline option. It's faster than retpoline but is weaker in certain scenarios -- particularly SMT, but even non-SMT may be vulnerable in some cases.
So just unconditionally warn if the user requests it on the cmdline.
[ bp: Massage commit message. ]
--- arch/x86/kernel/cpu/bugs.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/x86/kernel/cpu/bugs.c +5 -0
@@ -614,6 +614,7 @@ static inline const char *spectre_v2_modstatic inline const char *spectre_v2_module_string (void ) {return "" ; }#endif +#define SPECTRE_V2_LFENCE_MSG "WARNING: LFENCE mitigation is not recommended for this CPU, data leaks possible!\n"#define SPECTRE_V2_EIBRS_EBPF_MSG "WARNING: Unprivileged eBPF is enabled with eIBRS on, data leaks possible via Spectre v2 BHB attacks!\n"#ifdef CONFIG_BPF_SYSCALL
@@ -935,6 +936,7 @@ static void __init spectre_v2_select_mitbreak ;case SPECTRE_V2_CMD_RETPOLINE_LFENCE : +pr_err (SPECTRE_V2_LFENCE_MSG ); mode =SPECTRE_V2_LFENCE ;break ;
@@ -1717,6 +1719,9 @@ static char *ibpb_state(void)static ssize_t spectre_v2_show_state (char *buf) { +if (spectre_v2_enabled ==SPECTRE_V2_LFENCE ) +return sprintf (buf,"Vulnerable: LFENCE\n" ); +if (spectre_v2_enabled ==SPECTRE_V2_EIBRS &&unprivileged_ebpf_enabled ())return sprintf (buf,"Vulnerable: Unprivileged eBPF enabled\n" );
Greg Kroah-Hartman
maintainerPATCH 9/58 x86/speculation: Warn about eIBRS + LFENCE + Unprivileged eBPF + SMT
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
commit 0de05d056afdb00eca8c7bbb0c79a3438daf700c upstream.
The commit
44a3918c8245 ("x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation reporting")
added a warning for the "eIBRS + unprivileged eBPF" combination, which has been shown to be vulnerable against Spectre v2 BHB-based attacks.
However, there's no warning about the "eIBRS + LFENCE retpoline + unprivileged eBPF" combo. The LFENCE adds more protection by shortening the speculation window after a mispredicted branch. That makes an attack significantly more difficult, even with unprivileged eBPF. So at least for now the logic doesn't warn about that combination.
But if you then add SMT into the mix, the SMT attack angle weakens the effectiveness of the LFENCE considerably.
So extend the "eIBRS + unprivileged eBPF" warning to also include the "eIBRS + LFENCE + unprivileged eBPF + SMT" case.
[ bp: Massage commit message. ]
--- arch/x86/kernel/cpu/bugs.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/bugs.c +25 -2
@@ -616,12 +616,27 @@ static inline const char *spectre_v2_mod#define SPECTRE_V2_LFENCE_MSG "WARNING: LFENCE mitigation is not recommended for this CPU, data leaks possible!\n"#define SPECTRE_V2_EIBRS_EBPF_MSG "WARNING: Unprivileged eBPF is enabled with eIBRS on, data leaks possible via Spectre v2 BHB attacks!\n" +#define SPECTRE_V2_EIBRS_LFENCE_EBPF_SMT_MSG "WARNING: Unprivileged eBPF is enabled with eIBRS+LFENCE mitigation and SMT, data leaks possible via Spectre v2 BHB attacks!\n"#ifdef CONFIG_BPF_SYSCALL void unpriv_ebpf_notify (int new_state) { -if (spectre_v2_enabled ==SPECTRE_V2_EIBRS && !new_state) +if (new_state) +return ; + +/* Unprivileged eBPF is enabled */ + +switch (spectre_v2_enabled) { +case SPECTRE_V2_EIBRS :pr_err (SPECTRE_V2_EIBRS_EBPF_MSG ); +break ; +case SPECTRE_V2_EIBRS_LFENCE : +if (sched_smt_active ()) +pr_err (SPECTRE_V2_EIBRS_LFENCE_EBPF_SMT_MSG ); +break ; +default : +break ; + } }#endif
@@ -1081,6 +1096,10 @@ void cpu_bugs_smt_update(void) {mutex_lock (&spec_ctrl_mutex); +if (sched_smt_active () &&unprivileged_ebpf_enabled () && + spectre_v2_enabled ==SPECTRE_V2_EIBRS_LFENCE ) +pr_warn_once (SPECTRE_V2_EIBRS_LFENCE_EBPF_SMT_MSG ); +switch (spectre_v2_user_stibp) {case SPECTRE_V2_USER_NONE :break ;
@@ -1723,7 +1742,11 @@ static ssize_t spectre_v2_show_state(chareturn sprintf (buf,"Vulnerable: LFENCE\n" );if (spectre_v2_enabled ==SPECTRE_V2_EIBRS &&unprivileged_ebpf_enabled ()) -return sprintf (buf,"Vulnerable: Unprivileged eBPF enabled\n" ); +return sprintf (buf,"Vulnerable: eIBRS with unprivileged eBPF\n" ); + +if (sched_smt_active () &&unprivileged_ebpf_enabled () && + spectre_v2_enabled ==SPECTRE_V2_EIBRS_LFENCE ) +return sprintf (buf,"Vulnerable: eIBRS+LFENCE with unprivileged eBPF and SMT\n" ); return sprintf(buf, "%s%s%s%s%s%s\n", spectre_v2_strings[spectre_v2_enabled],
Greg Kroah-Hartman
maintainerPATCH 10/58 ARM: report Spectre v2 status through sysfs
In reply to Greg Kroah-HartmanFrom: "Russell King (Oracle)" <[email protected]>
commit 9dd78194a3722fa6712192cdd4f7032d45112a9a upstream.
As per other architectures, add support for reporting the Spectre vulnerability status via sysfs CPU.
--- arch/arm/include/asm/spectre.h | 28 ++++++++ arch/arm/kernel/Makefile | 2 arch/arm/kernel/spectre.c | 54 +++++++++++++++ arch/arm/mm/Kconfig | 1 arch/arm/mm/proc-v7-bugs.c | 141 +++++++++++++++++++++++++++++------------ 5 files changed, 187 insertions(+), 39 deletions(-) create mode 100644 arch/arm/include/asm/spectre.h create mode 100644 arch/arm/kernel/spectre.c
arch/arm/include/asm/spectre.h new file +28 -0
@@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __ASM_SPECTRE_H +#define __ASM_SPECTRE_H + +enum { +SPECTRE_UNAFFECTED , +SPECTRE_MITIGATED , +SPECTRE_VULNERABLE , +}; + +enum { + __SPECTRE_V2_METHOD_BPIALL, + __SPECTRE_V2_METHOD_ICIALLU, + __SPECTRE_V2_METHOD_SMC, + __SPECTRE_V2_METHOD_HVC, +}; + +enum { +SPECTRE_V2_METHOD_BPIALL =BIT (__SPECTRE_V2_METHOD_BPIALL), +SPECTRE_V2_METHOD_ICIALLU =BIT (__SPECTRE_V2_METHOD_ICIALLU), +SPECTRE_V2_METHOD_SMC =BIT (__SPECTRE_V2_METHOD_SMC), +SPECTRE_V2_METHOD_HVC =BIT (__SPECTRE_V2_METHOD_HVC), +}; + +void spectre_v2_update_state (unsigned int state,unsigned int methods); + +#endif
arch/arm/kernel/Makefile +2 -0
@@ -106,4 +106,6 @@ endif obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o +obj-$(CONFIG_GENERIC_CPU_VULNERABILITIES) += spectre.o + extra-y := $(head-y) vmlinux.lds
arch/arm/kernel/spectre.c new file +54 -0
54 lines not on this page · raw message
arch/arm/mm/Kconfig +1 -0
@@ -833,6 +833,7 @@ config CPU_BPREDICT_DISABLE config CPU_SPECTRE bool + select GENERIC_CPU_VULNERABILITIES config HARDEN_BRANCH_PREDICTOR bool "Harden the branch predictor against aliasing attacks" if EXPERT
arch/arm/mm/proc-v7-bugs.c +102 -39
207 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 11/58 ARM: early traps initialisation
In reply to Greg Kroah-HartmanFrom: "Russell King (Oracle)" <[email protected]>
commit 04e91b7324760a377a725e218b5ee783826d30f5 upstream.
Provide a couple of helpers to copy the vectors and stubs, and also to flush the copied vectors and stubs.
--- arch/arm/kernel/traps.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)
arch/arm/kernel/traps.c +21 -6
@@ -806,10 +806,22 @@ static inline void __init kuser_init(voi }#endif +#ifndef CONFIG_CPU_V7M +static void copy_from_lma (void *vma,void *lma_start,void *lma_end) +{ +memcpy (vma, lma_start, lma_end - lma_start); +} + +static void flush_vectors (void *vma,size_t offset,size_t size) +{ +unsigned long start = (unsigned long )vma + offset; +unsigned long end = start + size; + +flush_icache_range (start, end); +} +void __init early_trap_init (void *vectors_base) { -#ifndef CONFIG_CPU_V7M -unsigned long vectors = (unsigned long )vectors_base;extern char __stubs_start[], __stubs_end[];extern char __vectors_start[], __vectors_end[];unsigned i;
@@ -830,17 +842,20 @@ void __init early_trap_init(void *vector* into the vector page, mapped at 0xffff0000, and ensure these * are visible to the instruction stream. */ -memcpy ((void *)vectors, __vectors_start, __vectors_end - __vectors_start); -memcpy ((void *)vectors +0x1000 , __stubs_start, __stubs_end - __stubs_start); +copy_from_lma (vectors_base, __vectors_start, __vectors_end); +copy_from_lma (vectors_base +0x1000 , __stubs_start, __stubs_end);kuser_init (vectors_base); -flush_icache_range (vectors, vectors +PAGE_SIZE *2 ); + flush_vectors(vectors_base, 0, PAGE_SIZE * 2); +}#else /* ifndef CONFIG_CPU_V7M */ +void __init early_trap_init (void *vectors_base) +{/* * on V7-M there is no need to copy the vector table to a dedicated * memory area. The address is configurable and so a table in the kernel * image can be used. */ -#endif } +#endif
Greg Kroah-Hartman
maintainerPATCH 12/58 ARM: use LOADADDR() to get load address of sections
In reply to Greg Kroah-HartmanFrom: "Russell King (Oracle)" <[email protected]>
commit 8d9d651ff2270a632e9dc497b142db31e8911315 upstream.
Use the linker's LOADADDR() macro to get the load address of the sections, and provide a macro to set the start and end symbols.
--- arch/arm/include/asm/vmlinux.lds.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
arch/arm/include/asm/vmlinux.lds.h +12 -7
@@ -26,6 +26,11 @@#define ARM_MMU_DISCARD (x) x#endif +/* Set start/end symbol names to the LMA for the section */ +#define ARM_LMA (sym, section) \ + sym##_start = LOADADDR(section); \ + sym##_end = LOADADDR(section) + SIZEOF(section) +#define PROC_INFO \ . = ALIGN(4); \ __proc_info_begin = .; \
@@ -110,19 +115,19 @@* only thing that matters is their relative offsets */ #define ARM_VECTORS \ - __vectors_start = .; \ + __vectors_lma = .; \ .vectors 0xffff0000 : AT(__vectors_start) { \ *(.vectors) \ } \ - . = __vectors_start + SIZEOF(.vectors); \ - __vectors_end = .; \ + ARM_LMA(__vectors, .vectors); \ + . = __vectors_lma + SIZEOF(.vectors); \ \ - __stubs_start = .; \ - .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \ + __stubs_lma = .; \ + .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ *(.stubs) \ } \ - . = __stubs_start + SIZEOF(.stubs); \ - __stubs_end = .; \ + ARM_LMA(__stubs, .stubs); \ + . = __stubs_lma + SIZEOF(.stubs); \ \ PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
Greg Kroah-Hartman
maintainerPATCH 13/58 ARM: Spectre-BHB workaround
In reply to Greg Kroah-HartmanFrom: "Russell King (Oracle)" <[email protected]>
commit b9baf5c8c5c356757f4f9d8180b5e9d234065bc3 upstream.
Workaround the Spectre BHB issues for Cortex-A15, Cortex-A57, Cortex-A72, Cortex-A73 and Cortex-A75. We also include Brahma B15 as well to be safe, which is affected by Spectre V2 in the same ways as Cortex-A15.
--- arch/arm/include/asm/assembler.h | 10 ++++ arch/arm/include/asm/spectre.h | 4 + arch/arm/include/asm/vmlinux.lds.h | 18 +++++++- arch/arm/kernel/entry-armv.S | 79 ++++++++++++++++++++++++++++++++++--- arch/arm/kernel/entry-common.S | 24 +++++++++++ arch/arm/kernel/spectre.c | 4 + arch/arm/kernel/traps.c | 38 +++++++++++++++++ arch/arm/mm/Kconfig | 10 ++++ arch/arm/mm/proc-v7-bugs.c | 76 +++++++++++++++++++++++++++++++++++ 9 files changed, 254 insertions(+), 9 deletions(-)
arch/arm/include/asm/assembler.h +10 -0
@@ -107,6 +107,16 @@ .endm#endif +#if __LINUX_ARM_ARCH__ <7 + .macro dsb, args + mcr p15, 0, r0, c7, c10, 4 + .endm + + .macro isb, args + mcr p15, 0, r0, c7, r5, 4 + .endm +#endif + .macro asm_trace_hardirqs_off, save=1#if defined(CONFIG_TRACE_IRQFLAGS ) .if \save
arch/arm/include/asm/spectre.h +4 -0
@@ -14,6 +14,7 @@ enum { __SPECTRE_V2_METHOD_ICIALLU, __SPECTRE_V2_METHOD_SMC, __SPECTRE_V2_METHOD_HVC, + __SPECTRE_V2_METHOD_LOOP8, }; enum {
@@ -21,8 +22,11 @@ enum {SPECTRE_V2_METHOD_ICIALLU =BIT (__SPECTRE_V2_METHOD_ICIALLU),SPECTRE_V2_METHOD_SMC =BIT (__SPECTRE_V2_METHOD_SMC),SPECTRE_V2_METHOD_HVC =BIT (__SPECTRE_V2_METHOD_HVC), + SPECTRE_V2_METHOD_LOOP8 = BIT(__SPECTRE_V2_METHOD_LOOP8), };void spectre_v2_update_state (unsigned int state,unsigned int methods); +int spectre_bhb_update_vectors (unsigned int method); +#endif
arch/arm/include/asm/vmlinux.lds.h +15 -3
@@ -116,11 +116,23 @@*/ #define ARM_VECTORS \ __vectors_lma = .; \ - .vectors 0xffff0000 : AT(__vectors_start) { \ - *(.vectors) \ + OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ + .vectors { \ + *(.vectors) \ + } \ + .vectors.bhb.loop8 { \ + *(.vectors.bhb.loop8) \ + } \ + .vectors.bhb.bpiall { \ + *(.vectors.bhb.bpiall) \ + } \ } \ ARM_LMA(__vectors, .vectors); \ - . = __vectors_lma + SIZEOF(.vectors); \ + ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8); \ + ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall); \ + . = __vectors_lma + SIZEOF(.vectors) + \ + SIZEOF(.vectors.bhb.loop8) + \ + SIZEOF(.vectors.bhb.bpiall); \ \ __stubs_lma = .; \ .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \
arch/arm/kernel/entry-armv.S +73 -6
111 lines not on this page · raw message
arch/arm/kernel/entry-common.S +24 -0
@@ -163,12 +163,36 @@ ENDPROC(ret_from_fork) */ .align 5 +#ifdef CONFIG_HARDEN_BRANCH_HISTORY +ENTRY(vector_bhb_loop8_swi) + sub sp, sp, #PT_REGS_SIZE + stmia sp, {r0 - r12} + mov r8, #8 +1: b 2f +2: subs r8, r8, #1 + bne 1b + dsb + isb + b 3f +ENDPROC(vector_bhb_loop8_swi) + + .align 5 +ENTRY(vector_bhb_bpiall_swi) + sub sp, sp, #PT_REGS_SIZE + stmia sp, {r0 - r12} + mcr p15, 0, r8, c7, c5, 6 @ BPIALL + isb + b 3f +ENDPROC(vector_bhb_bpiall_swi) +#endif + .align 5 ENTRY(vector_swi) #ifdef CONFIG_CPU_V7M v7m_exception_entry #else sub sp, sp, #PT_REGS_SIZE stmia sp, {r0 - r12} @ Calling r0 - r12 +3: ARM( add r8, sp, #S_PC ) ARM( stmdb r8, {sp, lr}^ ) @ Calling sp, lr THUMB( mov r8, sp )
arch/arm/kernel/spectre.c +4 -0
@@ -45,6 +45,10 @@ ssize_t cpu_show_spectre_v2(struct devic method ="Firmware call" ;break ; +case SPECTRE_V2_METHOD_LOOP8 : + method ="History overwrite" ; +break ; +default : method ="Multiple mitigations" ;break ;
arch/arm/kernel/traps.c +38 -0
@@ -30,6 +30,7 @@#include <linux/atomic.h> #include <asm/cacheflush.h> #include <asm/exception.h> +#include <asm/spectre.h> #include <asm/unistd.h> #include <asm/traps.h> #include <asm/ptrace.h>
@@ -820,6 +821,43 @@ static void flush_vectors(void *vma, sizflush_icache_range (start, end); } +#ifdef CONFIG_HARDEN_BRANCH_HISTORY +int spectre_bhb_update_vectors (unsigned int method) +{ +extern char __vectors_bhb_bpiall_start[], __vectors_bhb_bpiall_end[]; +extern char __vectors_bhb_loop8_start[], __vectors_bhb_loop8_end[]; +void *vec_start, *vec_end; + +if (system_state >SYSTEM_SCHEDULING ) { +pr_err ("CPU%u: Spectre BHB workaround too late - system vulnerable\n" , +smp_processor_id ()); +return SPECTRE_VULNERABLE ; + } + +switch (method) { +case SPECTRE_V2_METHOD_LOOP8 : + vec_start = __vectors_bhb_loop8_start; + vec_end = __vectors_bhb_loop8_end; +break ; + +case SPECTRE_V2_METHOD_BPIALL : + vec_start = __vectors_bhb_bpiall_start; + vec_end = __vectors_bhb_bpiall_end; +break ; + +default : +pr_err ("CPU%u: unknown Spectre BHB state %d\n" , +smp_processor_id (), method); +return SPECTRE_VULNERABLE ; + } + +copy_from_lma (vectors_page, vec_start, vec_end); +flush_vectors (vectors_page,0 , vec_end - vec_start); + +return SPECTRE_MITIGATED ; +} +#endif +void __init early_trap_init (void *vectors_base) {extern char __stubs_start[], __stubs_end[];
arch/arm/mm/Kconfig +10 -0
@@ -854,6 +854,16 @@ config HARDEN_BRANCH_PREDICTOR If unsure, say Y. +config HARDEN_BRANCH_HISTORY + bool "Harden Spectre style attacks against branch history" if EXPERT + depends on CPU_SPECTRE + default y + help + Speculation attacks against some high-performance processors can + make use of branch history to influence future speculation. When + taking an exception, a sequence of branches overwrites the branch + history, or branch history is invalidated. + config TLS_REG_EMUL bool select NEED_KUSER_HELPERS
arch/arm/mm/proc-v7-bugs.c +76 -0
86 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 14/58 ARM: include unprivileged BPF status in Spectre V2 reporting
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
commit 25875aa71dfefd1959f07e626c4d285b88b27ac2 upstream.
The mitigations for Spectre-BHB are only applied when an exception is taken, but when unprivileged BPF is enabled, userspace can load BPF programs that can be used to exploit the problem.
When unprivileged BPF is enabled, report the vulnerable status via the spectre_v2 sysfs file.
--- arch/arm/kernel/spectre.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
arch/arm/kernel/spectre.c +13 -0
@@ -1,9 +1,19 @@// SPDX-License-Identifier: GPL-2.0-only +#include <linux/bpf.h> #include <linux/cpu.h> #include <linux/device.h> #include <asm/spectre.h> +static bool _unprivileged_ebpf_enabled (void ) +{ +#ifdef CONFIG_BPF_SYSCALL +return !sysctl_unprivileged_bpf_disabled; +#else + return false +#endif +} +ssize_t cpu_show_spectre_v1 (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -31,6 +41,9 @@ ssize_t cpu_show_spectre_v2(struct devicif (spectre_v2_state !=SPECTRE_MITIGATED )return sprintf (buf,"%s\n" ,"Vulnerable" ); +if (_unprivileged_ebpf_enabled ()) +return sprintf (buf,"Vulnerable: Unprivileged eBPF enabled\n" ); +switch (spectre_v2_methods) {case SPECTRE_V2_METHOD_BPIALL : method ="Branch predictor hardening" ;
Greg Kroah-Hartman
maintainerPATCH 15/58 arm64: cputype: Add CPU implementor & types for the Apple M1 cores
In reply to Greg Kroah-HartmanFrom: Hector Martin <[email protected]>
commit 11ecdad722daafcac09c4859dddf31b3d46449bc upstream.
The implementor will be used to condition the FIQ support quirk.
The specific CPU types are not used at the moment, but let's add them for documentation purposes.
--- arch/arm64/include/asm/cputype.h | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm64/include/asm/cputype.h +6 -0
@@ -59,6 +59,7 @@#define ARM_CPU_IMP_NVIDIA 0x4E#define ARM_CPU_IMP_FUJITSU 0x46#define ARM_CPU_IMP_HISI 0x48 +#define ARM_CPU_IMP_APPLE 0x61#define ARM_CPU_PART_AEM_V8 0xD0F#define ARM_CPU_PART_FOUNDATION 0xD00
@@ -99,6 +100,9 @@#define HISI_CPU_PART_TSV110 0xD01 +#define APPLE_CPU_PART_M1_ICESTORM 0x022 +#define APPLE_CPU_PART_M1_FIRESTORM 0x023 +#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
@@ -127,6 +131,8 @@#define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)#define MIDR_FUJITSU_A64FX MIDR_CPU_MODEL(ARM_CPU_IMP_FUJITSU, FUJITSU_CPU_PART_A64FX)#define MIDR_HISI_TSV110 MIDR_CPU_MODEL(ARM_CPU_IMP_HISI, HISI_CPU_PART_TSV110) +#define MIDR_APPLE_M1_ICESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_ICESTORM) +#define MIDR_APPLE_M1_FIRESTORM MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM)/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */ #define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX
Greg Kroah-Hartman
maintainerPATCH 16/58 arm64: Add Neoverse-N2, Cortex-A710 CPU part definition
In reply to Greg Kroah-HartmanFrom: Suzuki K Poulose <[email protected]>
commit 2d0d656700d67239a57afaf617439143d8dac9be upstream.
Add the CPU Partnumbers for the new Arm designs.
--- arch/arm64/include/asm/cputype.h | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/include/asm/cputype.h +4 -0
@@ -73,6 +73,8 @@#define ARM_CPU_PART_CORTEX_A76 0xD0B#define ARM_CPU_PART_NEOVERSE_N1 0xD0C#define ARM_CPU_PART_CORTEX_A77 0xD0D +#define ARM_CPU_PART_CORTEX_A710 0xD47 +#define ARM_CPU_PART_NEOVERSE_N2 0xD49#define APM_CPU_PART_POTENZA 0x000
@@ -113,6 +115,8 @@#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77) +#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710) +#define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2)#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
Greg Kroah-Hartman
maintainerPATCH 17/58 arm64: Add Cortex-X2 CPU part definition
In reply to Greg Kroah-HartmanFrom: Anshuman Khandual <[email protected]>
commit 72bb9dcb6c33cfac80282713c2b4f2b254cd24d1 upstream.
Add the CPU Partnumbers for the new Arm designs.
--- arch/arm64/include/asm/cputype.h | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/include/asm/cputype.h +2 -0
@@ -74,6 +74,7 @@#define ARM_CPU_PART_NEOVERSE_N1 0xD0C#define ARM_CPU_PART_CORTEX_A77 0xD0D#define ARM_CPU_PART_CORTEX_A710 0xD47 +#define ARM_CPU_PART_CORTEX_X2 0xD48#define ARM_CPU_PART_NEOVERSE_N2 0xD49#define APM_CPU_PART_POTENZA 0x000
@@ -116,6 +117,7 @@#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77)#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710) +#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)#define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2)#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 18/58 arm64: Add Cortex-A510 CPU part definition
In reply to Greg Kroah-HartmanFrom: Anshuman Khandual <[email protected]>
commit 53960faf2b731dd2f9ed6e1334634b8ba6286850 upstream.
Add the CPU Partnumbers for the new Arm designs.
--- arch/arm64/include/asm/cputype.h | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/include/asm/cputype.h +2 -0
@@ -73,6 +73,7 @@#define ARM_CPU_PART_CORTEX_A76 0xD0B#define ARM_CPU_PART_NEOVERSE_N1 0xD0C#define ARM_CPU_PART_CORTEX_A77 0xD0D +#define ARM_CPU_PART_CORTEX_A510 0xD46#define ARM_CPU_PART_CORTEX_A710 0xD47#define ARM_CPU_PART_CORTEX_X2 0xD48#define ARM_CPU_PART_NEOVERSE_N2 0xD49
@@ -116,6 +117,7 @@#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77) +#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)#define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2)
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 19/58 arm64: Add HWCAP for self-synchronising virtual counter
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit fee29f008aa3f2aff01117f28b57b1145d92cb9b upstream.
Since userspace can make use of the CNTVSS_EL0 instruction, expose it via a HWCAP.
--- Documentation/arm64/cpu-feature-registers.rst | 12 ++++++++++-- Documentation/arm64/elf_hwcaps.rst | 4 ++++ arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/uapi/asm/hwcap.h | 1 + arch/arm64/kernel/cpufeature.c | 3 ++- arch/arm64/kernel/cpuinfo.c | 1 + 6 files changed, 19 insertions(+), 3 deletions(-)
Documentation/arm64/cpu-feature-registers.rst +10 -2
@@ -235,7 +235,15 @@ infrastructure: | DPB | [3-0] | y | +------------------------------+---------+---------+ - 6) ID_AA64MMFR2_EL1 - Memory model feature register 2 + 6) ID_AA64MMFR0_EL1 - Memory model feature register 0 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | ECV | [63-60] | y | + +------------------------------+---------+---------+ + + 7) ID_AA64MMFR2_EL1 - Memory model feature register 2 +------------------------------+---------+---------+ | Name | bits | visible |
@@ -243,7 +251,7 @@ infrastructure: | AT | [35-32] | y | +------------------------------+---------+---------+ - 7) ID_AA64ZFR0_EL1 - SVE feature ID register 0 + 8) ID_AA64ZFR0_EL1 - SVE feature ID register 0 +------------------------------+---------+---------+ | Name | bits | visible |
Documentation/arm64/elf_hwcaps.rst +4 -0
@@ -245,6 +245,10 @@ HWCAP2_MTE Functionality implied by ID_AA64PFR1_EL1.MTE == 0b0010, as described by Documentation/arm64/memory-tagging-extension.rst. +HWCAP2_ECV + + Functionality implied by ID_AA64MMFR0_EL1.ECV == 0b0001. + 4. Unused AT_HWCAP bits -----------------------
arch/arm64/include/asm/hwcap.h +1 -0
@@ -105,6 +105,7 @@#define KERNEL_HWCAP_RNG __khwcap2_feature(RNG)#define KERNEL_HWCAP_BTI __khwcap2_feature(BTI)#define KERNEL_HWCAP_MTE __khwcap2_feature(MTE) +#define KERNEL_HWCAP_ECV __khwcap2_feature(ECV)/* * This yields a mask that user programs can use to figure out what
arch/arm64/include/uapi/asm/hwcap.h +1 -0
@@ -75,5 +75,6 @@#define HWCAP2_RNG (1 << 16)#define HWCAP2_BTI (1 << 17)#define HWCAP2_MTE (1 << 18) +#define HWCAP2_ECV (1 << 19)#endif /* _UAPI__ASM_HWCAP_H */
arch/arm64/kernel/cpufeature.c +2 -1
@@ -259,7 +259,7 @@ static const struct arm64_ftr_bits ftr_i };static const struct arm64_ftr_bits ftr_id_aa64mmfr0[] = { -ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR0_ECV_SHIFT ,4 ,0 ), +ARM64_FTR_BITS (FTR_VISIBLE ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR0_ECV_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR0_FGT_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR0_EXS_SHIFT ,4 ,0 ),/*
@@ -2252,6 +2252,7 @@ static const struct arm64_cpu_capabiliti#ifdef CONFIG_ARM64_MTE HWCAP_CAP (SYS_ID_AA64PFR1_EL1 ,ID_AA64PFR1_MTE_SHIFT ,FTR_UNSIGNED ,ID_AA64PFR1_MTE ,CAP_HWCAP ,KERNEL_HWCAP_MTE ), #endif /* CONFIG_ARM64_MTE */ + HWCAP_CAP(SYS_ID_AA64MMFR0_EL1, ID_AA64MMFR0_ECV_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_ECV), {}, };
arch/arm64/kernel/cpuinfo.c +1 -0
@@ -94,6 +94,7 @@ static const char *const hwcap_str[] = { [KERNEL_HWCAP_RNG] = "rng", [KERNEL_HWCAP_BTI] = "bti", [KERNEL_HWCAP_MTE] = "mte", + [KERNEL_HWCAP_ECV] = "ecv", };#ifdef CONFIG_COMPAT
Greg Kroah-Hartman
maintainerPATCH 20/58 arm64: add ID_AA64ISAR2_EL1 sys register
In reply to Greg Kroah-HartmanFrom: Joey Gouly <[email protected]>
commit 9e45365f1469ef2b934f9d035975dbc9ad352116 upstream.
This is a new ID register, introduced in 8.7.
--- arch/arm64/include/asm/cpu.h | 1 + arch/arm64/include/asm/sysreg.h | 15 +++++++++++++++ arch/arm64/kernel/cpufeature.c | 9 +++++++++ arch/arm64/kernel/cpuinfo.c | 1 + arch/arm64/kvm/sys_regs.c | 2 +- 5 files changed, 27 insertions(+), 1 deletion(-)
arch/arm64/include/asm/cpu.h +1 -0
@@ -25,6 +25,7 @@ struct cpuinfo_arm64 {u64 reg_id_aa64dfr1;u64 reg_id_aa64isar0;u64 reg_id_aa64isar1; +u64 reg_id_aa64isar2;u64 reg_id_aa64mmfr0;u64 reg_id_aa64mmfr1;u64 reg_id_aa64mmfr2;
arch/arm64/include/asm/sysreg.h +15 -0
@@ -175,6 +175,7 @@#define SYS_ID_AA64ISAR0_EL1 sys_reg(3, 0, 0, 6, 0)#define SYS_ID_AA64ISAR1_EL1 sys_reg(3, 0, 0, 6, 1) +#define SYS_ID_AA64ISAR2_EL1 sys_reg(3, 0, 0, 6, 2)#define SYS_ID_AA64MMFR0_EL1 sys_reg(3, 0, 0, 7, 0)#define SYS_ID_AA64MMFR1_EL1 sys_reg(3, 0, 0, 7, 1)
@@ -687,6 +688,20 @@#define ID_AA64ISAR1_GPI_NI 0x0#define ID_AA64ISAR1_GPI_IMP_DEF 0x1 +/* id_aa64isar2 */ +#define ID_AA64ISAR2_RPRES_SHIFT 4 +#define ID_AA64ISAR2_WFXT_SHIFT 0 + +#define ID_AA64ISAR2_RPRES_8BIT 0x0 +#define ID_AA64ISAR2_RPRES_12BIT 0x1 +/* +* Value 0x1 has been removed from the architecture, and is +* reserved, but has not yet been removed from the ARM ARM +* as of ARM DDI 0487G.b. +*/ +#define ID_AA64ISAR2_WFXT_NI 0x0 +#define ID_AA64ISAR2_WFXT_SUPPORTED 0x2 +/* id_aa64pfr0 */ #define ID_AA64PFR0_CSV3_SHIFT 60#define ID_AA64PFR0_CSV2_SHIFT 56
arch/arm64/kernel/cpufeature.c +9 -0
@@ -205,6 +205,10 @@ static const struct arm64_ftr_bits ftr_i ARM64_FTR_END, }; +static const struct arm64_ftr_bits ftr_id_aa64isar2[] = { +ARM64_FTR_END , +}; +static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {ARM64_FTR_BITS (FTR_HIDDEN ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64PFR0_CSV3_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64PFR0_CSV2_SHIFT ,4 ,0 ),
@@ -596,6 +600,7 @@ static const struct __ftr_reg_entry {/* Op1 = 0, CRn = 0, CRm = 6 */ ARM64_FTR_REG (SYS_ID_AA64ISAR0_EL1 , ftr_id_aa64isar0),ARM64_FTR_REG (SYS_ID_AA64ISAR1_EL1 , ftr_id_aa64isar1), +ARM64_FTR_REG (SYS_ID_AA64ISAR2_EL1 , ftr_id_aa64isar2),/* Op1 = 0, CRn = 0, CRm = 7 */ ARM64_FTR_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0),
@@ -830,6 +835,7 @@ void __init init_cpu_features(struct cpuinit_cpu_ftr_reg (SYS_ID_AA64DFR1_EL1 , info->reg_id_aa64dfr1);init_cpu_ftr_reg (SYS_ID_AA64ISAR0_EL1 , info->reg_id_aa64isar0);init_cpu_ftr_reg (SYS_ID_AA64ISAR1_EL1 , info->reg_id_aa64isar1); +init_cpu_ftr_reg (SYS_ID_AA64ISAR2_EL1 , info->reg_id_aa64isar2);init_cpu_ftr_reg (SYS_ID_AA64MMFR0_EL1 , info->reg_id_aa64mmfr0);init_cpu_ftr_reg (SYS_ID_AA64MMFR1_EL1 , info->reg_id_aa64mmfr1);init_cpu_ftr_reg (SYS_ID_AA64MMFR2_EL1 , info->reg_id_aa64mmfr2);
@@ -1058,6 +1064,8 @@ void update_cpu_features(int cpu, info->reg_id_aa64isar0, boot->reg_id_aa64isar0); taint |=check_update_ftr_reg (SYS_ID_AA64ISAR1_EL1 , cpu, info->reg_id_aa64isar1, boot->reg_id_aa64isar1); + taint |=check_update_ftr_reg (SYS_ID_AA64ISAR2_EL1 , cpu, + info->reg_id_aa64isar2, boot->reg_id_aa64isar2);/* * Differing PARange support is fine as long as all peripherals and
@@ -1157,6 +1165,7 @@ static u64 __read_sysreg_by_encoding(u32read_sysreg_case (SYS_ID_AA64MMFR2_EL1 );read_sysreg_case (SYS_ID_AA64ISAR0_EL1 );read_sysreg_case (SYS_ID_AA64ISAR1_EL1 ); +read_sysreg_case (SYS_ID_AA64ISAR2_EL1 );read_sysreg_case (SYS_CNTFRQ_EL0 );read_sysreg_case (SYS_CTR_EL0 );
arch/arm64/kernel/cpuinfo.c +1 -0
@@ -365,6 +365,7 @@ static void __cpuinfo_store_cpu(struct c info->reg_id_aa64dfr1 =read_cpuid (ID_AA64DFR1_EL1 ); info->reg_id_aa64isar0 =read_cpuid (ID_AA64ISAR0_EL1 ); info->reg_id_aa64isar1 =read_cpuid (ID_AA64ISAR1_EL1 ); + info->reg_id_aa64isar2 =read_cpuid (ID_AA64ISAR2_EL1 ); info->reg_id_aa64mmfr0 =read_cpuid (ID_AA64MMFR0_EL1 ); info->reg_id_aa64mmfr1 =read_cpuid (ID_AA64MMFR1_EL1 ); info->reg_id_aa64mmfr2 =read_cpuid (ID_AA64MMFR2_EL1 );
arch/arm64/kvm/sys_regs.c +1 -1
@@ -1517,7 +1517,7 @@ static const struct sys_reg_desc sys_reg/* CRm=6 */ ID_SANITISED (ID_AA64ISAR0_EL1 ),ID_SANITISED (ID_AA64ISAR1_EL1 ), -ID_UNALLOCATED (6 ,2 ), +ID_SANITISED (ID_AA64ISAR2_EL1 ),ID_UNALLOCATED (6 ,3 ),ID_UNALLOCATED (6 ,4 ), ID_UNALLOCATED(6,5),
Greg Kroah-Hartman
maintainerPATCH 21/58 arm64: cpufeature: add HWCAP for FEAT_AFP
In reply to Greg Kroah-HartmanFrom: Joey Gouly <[email protected]>
commit 5c13f042e73200b50573ace63e1a6b94e2917616 upstream.
Add a new HWCAP to detect the Alternate Floating-point Behaviour feature (FEAT_AFP), introduced in Armv8.7.
Also expose this to userspace in the ID_AA64MMFR1_EL1 feature register.
--- Documentation/arm64/cpu-feature-registers.rst | 9 +++++++++ Documentation/arm64/elf_hwcaps.rst | 4 ++++ arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/asm/sysreg.h | 1 + arch/arm64/include/uapi/asm/hwcap.h | 1 + arch/arm64/kernel/cpufeature.c | 2 ++ arch/arm64/kernel/cpuinfo.c | 1 + 7 files changed, 19 insertions(+)
Documentation/arm64/cpu-feature-registers.rst +9 -0
@@ -275,6 +275,15 @@ infrastructure: | SVEVer | [3-0] | y | +------------------------------+---------+---------+ + 8) ID_AA64MMFR1_EL1 - Memory model feature register 1 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | AFP | [47-44] | y | + +------------------------------+---------+---------+ + + Appendix I: Example -------------------
Documentation/arm64/elf_hwcaps.rst +4 -0
@@ -249,6 +249,10 @@ HWCAP2_ECV Functionality implied by ID_AA64MMFR0_EL1.ECV == 0b0001. +HWCAP2_AFP + + Functionality implied by ID_AA64MFR1_EL1.AFP == 0b0001. + 4. Unused AT_HWCAP bits -----------------------
arch/arm64/include/asm/hwcap.h +1 -0
@@ -106,6 +106,7 @@#define KERNEL_HWCAP_BTI __khwcap2_feature(BTI)#define KERNEL_HWCAP_MTE __khwcap2_feature(MTE)#define KERNEL_HWCAP_ECV __khwcap2_feature(ECV) +#define KERNEL_HWCAP_AFP __khwcap2_feature(AFP)/* * This yields a mask that user programs can use to figure out what
arch/arm64/include/asm/sysreg.h +1 -0
@@ -801,6 +801,7 @@#endif /* id_aa64mmfr1 */ +#define ID_AA64MMFR1_AFP_SHIFT 44#define ID_AA64MMFR1_ETS_SHIFT 36#define ID_AA64MMFR1_TWED_SHIFT 32#define ID_AA64MMFR1_XNX_SHIFT 28
arch/arm64/include/uapi/asm/hwcap.h +1 -0
@@ -76,5 +76,6 @@#define HWCAP2_BTI (1 << 17)#define HWCAP2_MTE (1 << 18)#define HWCAP2_ECV (1 << 19) +#define HWCAP2_AFP (1 << 20)#endif /* _UAPI__ASM_HWCAP_H */
arch/arm64/kernel/cpufeature.c +2 -0
@@ -309,6 +309,7 @@ static const struct arm64_ftr_bits ftr_i };static const struct arm64_ftr_bits ftr_id_aa64mmfr1[] = { +ARM64_FTR_BITS (FTR_VISIBLE ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR1_AFP_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR1_ETS_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR1_TWED_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,ID_AA64MMFR1_XNX_SHIFT ,4 ,0 ),
@@ -2262,6 +2263,7 @@ static const struct arm64_cpu_capabilitiHWCAP_CAP (SYS_ID_AA64PFR1_EL1 ,ID_AA64PFR1_MTE_SHIFT ,FTR_UNSIGNED ,ID_AA64PFR1_MTE ,CAP_HWCAP ,KERNEL_HWCAP_MTE ), #endif /* CONFIG_ARM64_MTE */HWCAP_CAP (SYS_ID_AA64MMFR0_EL1 ,ID_AA64MMFR0_ECV_SHIFT ,FTR_UNSIGNED ,1 ,CAP_HWCAP ,KERNEL_HWCAP_ECV ), + HWCAP_CAP(SYS_ID_AA64MMFR1_EL1, ID_AA64MMFR1_AFP_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_AFP), {}, };
arch/arm64/kernel/cpuinfo.c +1 -0
@@ -95,6 +95,7 @@ static const char *const hwcap_str[] = { [KERNEL_HWCAP_BTI] = "bti", [KERNEL_HWCAP_MTE] = "mte", [KERNEL_HWCAP_ECV] = "ecv", + [KERNEL_HWCAP_AFP] = "afp", };#ifdef CONFIG_COMPAT
Greg Kroah-Hartman
maintainerPATCH 22/58 arm64: cpufeature: add HWCAP for FEAT_RPRES
In reply to Greg Kroah-HartmanFrom: Joey Gouly <[email protected]>
commit 1175011a7d0030d49dc9c10bde36f08f26d0a8ee upstream.
Add a new HWCAP to detect the Increased precision of Reciprocal Estimate and Reciprocal Square Root Estimate feature (FEAT_RPRES), introduced in Armv8.7.
Also expose this to userspace in the ID_AA64ISAR2_EL1 feature register.
--- Documentation/arm64/cpu-feature-registers.rst | 8 ++++++++ Documentation/arm64/elf_hwcaps.rst | 4 ++++ arch/arm64/include/asm/hwcap.h | 1 + arch/arm64/include/uapi/asm/hwcap.h | 1 + arch/arm64/kernel/cpufeature.c | 2 ++ arch/arm64/kernel/cpuinfo.c | 1 + 6 files changed, 17 insertions(+)
Documentation/arm64/cpu-feature-registers.rst +8 -0
@@ -283,6 +283,14 @@ infrastructure: | AFP | [47-44] | y | +------------------------------+---------+---------+ + 9) ID_AA64ISAR2_EL1 - Instruction set attribute register 2 + + +------------------------------+---------+---------+ + | Name | bits | visible | + +------------------------------+---------+---------+ + | RPRES | [7-4] | y | + +------------------------------+---------+---------+ + Appendix I: Example -------------------
Documentation/arm64/elf_hwcaps.rst +4 -0
@@ -253,6 +253,10 @@ HWCAP2_AFP Functionality implied by ID_AA64MFR1_EL1.AFP == 0b0001. +HWCAP2_RPRES + + Functionality implied by ID_AA64ISAR2_EL1.RPRES == 0b0001. + 4. Unused AT_HWCAP bits -----------------------
arch/arm64/include/asm/hwcap.h +1 -0
@@ -107,6 +107,7 @@#define KERNEL_HWCAP_MTE __khwcap2_feature(MTE)#define KERNEL_HWCAP_ECV __khwcap2_feature(ECV)#define KERNEL_HWCAP_AFP __khwcap2_feature(AFP) +#define KERNEL_HWCAP_RPRES __khwcap2_feature(RPRES)/* * This yields a mask that user programs can use to figure out what
arch/arm64/include/uapi/asm/hwcap.h +1 -0
@@ -77,5 +77,6 @@#define HWCAP2_MTE (1 << 18)#define HWCAP2_ECV (1 << 19)#define HWCAP2_AFP (1 << 20) +#define HWCAP2_RPRES (1 << 21)#endif /* _UAPI__ASM_HWCAP_H */
arch/arm64/kernel/cpufeature.c +2 -0
@@ -206,6 +206,7 @@ static const struct arm64_ftr_bits ftr_i };static const struct arm64_ftr_bits ftr_id_aa64isar2[] = { +ARM64_FTR_BITS (FTR_VISIBLE ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64ISAR2_RPRES_SHIFT ,4 ,0 ),ARM64_FTR_END , };
@@ -2264,6 +2265,7 @@ static const struct arm64_cpu_capabiliti#endif /* CONFIG_ARM64_MTE */ HWCAP_CAP (SYS_ID_AA64MMFR0_EL1 ,ID_AA64MMFR0_ECV_SHIFT ,FTR_UNSIGNED ,1 ,CAP_HWCAP ,KERNEL_HWCAP_ECV ),HWCAP_CAP (SYS_ID_AA64MMFR1_EL1 ,ID_AA64MMFR1_AFP_SHIFT ,FTR_UNSIGNED ,1 ,CAP_HWCAP ,KERNEL_HWCAP_AFP ), + HWCAP_CAP(SYS_ID_AA64ISAR2_EL1, ID_AA64ISAR2_RPRES_SHIFT, FTR_UNSIGNED, 1, CAP_HWCAP, KERNEL_HWCAP_RPRES), {}, };
arch/arm64/kernel/cpuinfo.c +1 -0
@@ -96,6 +96,7 @@ static const char *const hwcap_str[] = { [KERNEL_HWCAP_MTE] = "mte", [KERNEL_HWCAP_ECV] = "ecv", [KERNEL_HWCAP_AFP] = "afp", + [KERNEL_HWCAP_RPRES] = "rpres", };#ifdef CONFIG_COMPAT
Greg Kroah-Hartman
maintainerPATCH 23/58 arm64: entry.S: Add ventry overflow sanity checks
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 4330e2c5c04c27bebf89d34e0bc14e6943413067 upstream.
Subsequent patches add even more code to the ventry slots. Ensure kernels that overflow a ventry slot don't get built.
--- arch/arm64/kernel/entry.S | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/kernel/entry.S +3 -0
@@ -62,6 +62,7 @@ .macro kernel_ventry, el, label, regsize = 64 .align 7 +.Lventry_start\@: #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 .if \el == 0 alternative_if ARM64_UNMAP_KERNEL_AT_EL0
@@ -120,6 +121,7 @@ alternative_else_nop_endif mrs x0, tpidrro_el0 #endif b el\()\el\()_\label +.org .Lventry_start\@ + 128 // Did we overflow the ventry slot? .endm .macro tramp_alias, dst, sym
@@ -832,6 +834,7 @@ alternative_else_nop_endif add x30, x30, #(1b - tramp_vectors) isb ret +.org 1b + 128 // Did we overflow the ventry slot? .endm .macro tramp_exit, regsize = 64
Greg Kroah-Hartman
maintainerPATCH 24/58 arm64: spectre: Rename spectre_v4_patch_fw_mitigation_conduit
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 1b33d4860deaecf1d8eec3061b7e7ed7ab0bae8d upstream.
The spectre-v4 sequence includes an SMC from the assembly entry code. spectre_v4_patch_fw_mitigation_conduit is the patching callback that generates an HVC or SMC depending on the SMCCC conduit type.
As this isn't specific to spectre-v4, rename it smccc_patch_fw_mitigation_conduit so it can be re-used.
--- arch/arm64/kernel/entry.S | 2 +- arch/arm64/kernel/proton-pack.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm64/kernel/entry.S +1 -1
@@ -143,7 +143,7 @@ alternative_cb_end tbnz \tmp2, #TIF_SSBD, .L__asm_ssbd_skip\@ mov w0, #ARM_SMCCC_ARCH_WORKAROUND_2 mov w1, #\state -alternative_cb spectre_v4_patch_fw_mitigation_conduit +alternative_cb smccc_patch_fw_mitigation_conduit nop // Patched to SMC/HVC #0 alternative_cb_end .L__asm_ssbd_skip\@:
arch/arm64/kernel/proton-pack.c +3 -3
@@ -571,9 +571,9 @@ void __init spectre_v4_patch_fw_mitigati* Patch a NOP in the Spectre-v4 mitigation code with an SMC/HVC instruction * to call into firmware to adjust the mitigation state. */ -void __init spectre_v4_patch_fw_mitigation_conduit (struct alt_instr *alt, -__le32 *origptr, -__le32 *updptr,int nr_inst) +void __init smccc_patch_fw_mitigation_conduit (struct alt_instr *alt, +__le32 *origptr, +__le32 *updptr,int nr_inst) {u32 insn;
Greg Kroah-Hartman
maintainerPATCH 25/58 arm64: entry: Make the trampoline cleanup optional
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit d739da1694a0eaef0358a42b76904b611539b77b upstream.
Subsequent patches will add additional sets of vectors that use the same tricks as the kpti vectors to reach the full-fat vectors. The full-fat vectors contain some cleanup for kpti that is patched in by alternatives when kpti is in use. Once there are additional vectors, the cleanup will be needed in more cases.
But on big/little systems, the cleanup would be harmful if no trampoline vector were in use. Instead of forcing CPUs that don't need a trampoline vector to use one, make the trampoline cleanup optional.
Entry at the top of the vectors will skip the cleanup. The trampoline vectors can then skip the first instruction, triggering the cleanup to run.
--- arch/arm64/kernel/entry.S | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/arm64/kernel/entry.S +7 -3
@@ -65,14 +65,18 @@ .Lventry_start\@: #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 .if \el == 0 -alternative_if ARM64_UNMAP_KERNEL_AT_EL0 + /* + * This must be the first instruction of the EL0 vector entries. It is + * skipped by the trampoline vectors, to trigger the cleanup. + */ + b .Lskip_tramp_vectors_cleanup\@ .if \regsize == 64 mrs x30, tpidrro_el0 msr tpidrro_el0, xzr .else mov x30, xzr .endif -alternative_else_nop_endif +.Lskip_tramp_vectors_cleanup\@: .endif #endif
@@ -831,7 +835,7 @@ alternative_if_not ARM64_WORKAROUND_CAVI prfm plil1strm, [x30, #(1b - tramp_vectors)] alternative_else_nop_endif msr vbar_el1, x30 - add x30, x30, #(1b - tramp_vectors) + add x30, x30, #(1b - tramp_vectors + 4) isb ret .org 1b + 128 // Did we overflow the ventry slot?
Greg Kroah-Hartman
maintainerPATCH 26/58 arm64: entry: Free up another register on kptis tramp_exit path
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 03aff3a77a58b5b52a77e00537a42090ad57b80b upstream.
Kpti stashes x30 in far_el1 while it uses x30 for all its work.
Making the vectors a per-cpu data structure will require a second register.
Allow tramp_exit two registers before it unmaps the kernel, by leaving x30 on the stack, and stashing x29 in far_el1.
--- arch/arm64/kernel/entry.S | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
arch/arm64/kernel/entry.S +13 -6
@@ -357,14 +357,16 @@ alternative_else_nop_endif ldp x24, x25, [sp, #16 * 12] ldp x26, x27, [sp, #16 * 13] ldp x28, x29, [sp, #16 * 14] - ldr lr, [sp, #S_LR] - add sp, sp, #S_FRAME_SIZE // restore sp .if \el == 0 -alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0 +alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0 + ldr lr, [sp, #S_LR] + add sp, sp, #S_FRAME_SIZE // restore sp + eret +alternative_else_nop_endif #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 bne 4f - msr far_el1, x30 + msr far_el1, x29 tramp_alias x30, tramp_exit_native br x30 4:
@@ -372,6 +374,9 @@ alternative_insn eret, nop, ARM64_UNMAP_ br x30 #endif .else + ldr lr, [sp, #S_LR] + add sp, sp, #S_FRAME_SIZE // restore sp + /* Ensure any device/NC reads complete */ alternative_insn nop, "dmb sy", ARM64_WORKAROUND_1508412
@@ -844,10 +849,12 @@ alternative_else_nop_endif .macro tramp_exit, regsize = 64 adr x30, tramp_vectors msr vbar_el1, x30 - tramp_unmap_kernel x30 + ldr lr, [sp, #S_LR] + tramp_unmap_kernel x29 .if \regsize == 64 - mrs x30, far_el1 + mrs x29, far_el1 .endif + add sp, sp, #S_FRAME_SIZE // restore sp eret sb .endm
Greg Kroah-Hartman
maintainerPATCH 27/58 arm64: entry: Move the trampoline data page before the text page
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit c091fb6ae059cda563b2a4d93fdbc548ef34e1d6 upstream.
The trampoline code has a data page that holds the address of the vectors, which is unmapped when running in user-space. This ensures that with CONFIG_RANDOMIZE_BASE, the randomised address of the kernel can't be discovered until after the kernel has been mapped.
If the trampoline text page is extended to include multiple sets of vectors, it will be larger than a single page, making it tricky to find the data page without knowing the size of the trampoline text pages, which will vary with PAGE_SIZE.
Move the data page to appear before the text page. This allows the data page to be found without knowing the size of the trampoline text pages. 'tramp_vectors' is used to refer to the beginning of the .entry.tramp.text section, do that explicitly.
--- arch/arm64/include/asm/fixmap.h | 2 +- arch/arm64/kernel/entry.S | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-)
arch/arm64/include/asm/fixmap.h +1 -1
@@ -62,8 +62,8 @@ enum fixed_addresses {#endif /* CONFIG_ACPI_APEI_GHES */ #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 -FIX_ENTRY_TRAMP_DATA ,FIX_ENTRY_TRAMP_TEXT , +FIX_ENTRY_TRAMP_DATA , #define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT))#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ __end_of_permanent_fixed_addresses,
arch/arm64/kernel/entry.S +7 -2
@@ -814,6 +814,11 @@ alternative_else_nop_endif */ .endm + .macro tramp_data_page dst + adr \dst, .entry.tramp.text + sub \dst, \dst, PAGE_SIZE + .endm + .macro tramp_ventry, regsize = 64 .align 7 1:
@@ -830,7 +835,7 @@ alternative_else_nop_endif 2: tramp_map_kernel x30 #ifdef CONFIG_RANDOMIZE_BASE - adr x30, tramp_vectors + PAGE_SIZE + tramp_data_page x30 alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003 ldr x30, [x30] #else
@@ -984,7 +989,7 @@ SYM_CODE_START(__sdei_asm_entry_trampoli 1: str x4, [x1, #(SDEI_EVENT_INTREGS + S_ORIG_ADDR_LIMIT)] #ifdef CONFIG_RANDOMIZE_BASE - adr x4, tramp_vectors + PAGE_SIZE + tramp_data_page x4 add x4, x4, #:lo12:__sdei_asm_trampoline_next_handler ldr x4, [x4] #else
Greg Kroah-Hartman
maintainerPATCH 28/58 arm64: entry: Allow tramp_alias to access symbols after the 4K boundary
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 6c5bf79b69f911560fbf82214c0971af6e58e682 upstream.
Systems using kpti enter and exit the kernel through a trampoline mapping that is always mapped, even when the kernel is not. tramp_valias is a macro to find the address of a symbol in the trampoline mapping.
Adding extra sets of vectors will expand the size of the entry.tramp.text section to beyond 4K. tramp_valias will be unable to generate addresses for symbols beyond 4K as it uses the 12 bit immediate of the add instruction.
As there are now two registers available when tramp_alias is called, use the extra register to avoid the 4K limit of the 12 bit immediate.
--- arch/arm64/kernel/entry.S | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
arch/arm64/kernel/entry.S +8 -5
@@ -128,9 +128,12 @@ .org .Lventry_start\@ + 128 // Did we overflow the ventry slot? .endm - .macro tramp_alias, dst, sym + .macro tramp_alias, dst, sym, tmp mov_q \dst, TRAMP_VALIAS - add \dst, \dst, #(\sym - .entry.tramp.text) + adr_l \tmp, \sym + add \dst, \dst, \tmp + adr_l \tmp, .entry.tramp.text + sub \dst, \dst, \tmp .endm /*
@@ -367,10 +370,10 @@ alternative_else_nop_endif #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 bne 4f msr far_el1, x29 - tramp_alias x30, tramp_exit_native + tramp_alias x30, tramp_exit_native, x29 br x30 4: - tramp_alias x30, tramp_exit_compat + tramp_alias x30, tramp_exit_compat, x29 br x30 #endif .else
@@ -1131,7 +1134,7 @@ alternative_if_not ARM64_UNMAP_KERNEL_AT alternative_else_nop_endif #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 - tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline + tramp_alias dst=x5, sym=__sdei_asm_exit_trampoline, tmp=x3 br x5 #endif SYM_CODE_END(__sdei_asm_handler)
Greg Kroah-Hartman
maintainerPATCH 29/58 arm64: entry: Dont assume tramp_vectors is the start of the vectors
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit ed50da7764535f1e24432ded289974f2bf2b0c5a upstream.
The tramp_ventry macro uses tramp_vectors as the address of the vectors when calculating which ventry in the 'full fat' vectors to branch to.
While there is one set of tramp_vectors, this will be true. Adding multiple sets of vectors will break this assumption.
Move the generation of the vectors to a macro, and pass the start of the vectors as an argument to tramp_ventry.
--- arch/arm64/kernel/entry.S | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-)
arch/arm64/kernel/entry.S +16 -14
@@ -822,7 +822,7 @@ alternative_else_nop_endif sub \dst, \dst, PAGE_SIZE .endm - .macro tramp_ventry, regsize = 64 + .macro tramp_ventry, vector_start, regsize .align 7 1: .if \regsize == 64
@@ -845,10 +845,10 @@ alternative_insn isb, nop, ARM64_WORKARO ldr x30, =vectors #endif alternative_if_not ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM - prfm plil1strm, [x30, #(1b - tramp_vectors)] + prfm plil1strm, [x30, #(1b - \vector_start)] alternative_else_nop_endif msr vbar_el1, x30 - add x30, x30, #(1b - tramp_vectors + 4) + add x30, x30, #(1b - \vector_start + 4) isb ret .org 1b + 128 // Did we overflow the ventry slot?
@@ -867,19 +867,21 @@ alternative_else_nop_endif sb .endm - .align 11 -SYM_CODE_START_NOALIGN(tramp_vectors) + .macro generate_tramp_vector +.Lvector_start\@: .space 0x400 - tramp_ventry - tramp_ventry - tramp_ventry - tramp_ventry - - tramp_ventry 32 - tramp_ventry 32 - tramp_ventry 32 - tramp_ventry 32 + .rept 4 + tramp_ventry .Lvector_start\@, 64 + .endr + .rept 4 + tramp_ventry .Lvector_start\@, 32 + .endr + .endm + + .align 11 +SYM_CODE_START_NOALIGN(tramp_vectors) + generate_tramp_vector SYM_CODE_END(tramp_vectors) SYM_CODE_START(tramp_exit_native)
Greg Kroah-Hartman
maintainerPATCH 30/58 arm64: entry: Move trampoline macros out of ifdefd section
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 13d7a08352a83ef2252aeb464a5e08dfc06b5dfd upstream.
The macros for building the kpti trampoline are all behind CONFIG_UNMAP_KERNEL_AT_EL0, and in a region that outputs to the .entry.tramp.text section.
Move the macros out so they can be used to generate other kinds of trampoline. Only the symbols need to be guarded by CONFIG_UNMAP_KERNEL_AT_EL0 and appear in the .entry.tramp.text section.
--- arch/arm64/kernel/entry.S | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
arch/arm64/kernel/entry.S +5 -6
@@ -778,12 +778,6 @@ SYM_CODE_END(ret_to_user) .popsection // .entry.text -#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 -/* - * Exception vectors trampoline. - */ - .pushsection ".entry.tramp.text", "ax" - // Move from tramp_pg_dir to swapper_pg_dir .macro tramp_map_kernel, tmp mrs \tmp, ttbr1_el1
@@ -879,6 +873,11 @@ alternative_else_nop_endif .endr .endm +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 +/* + * Exception vectors trampoline. + */ + .pushsection ".entry.tramp.text", "ax" .align 11 SYM_CODE_START_NOALIGN(tramp_vectors) generate_tramp_vector
Greg Kroah-Hartman
maintainerPATCH 31/58 arm64: entry: Make the kpti trampolines kpti sequence optional
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit c47e4d04ba0f1ea17353d85d45f611277507e07a upstream.
Spectre-BHB needs to add sequences to the vectors. Having one global set of vectors is a problem for big/little systems where the sequence is costly on cpus that are not vulnerable.
Making the vectors per-cpu in the style of KVM's bh_harden_hyp_vecs requires the vectors to be generated by macros.
Make the kpti re-mapping of the kernel optional, so the macros can be used without kpti.
--- arch/arm64/kernel/entry.S | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
arch/arm64/kernel/entry.S +12 -6
@@ -816,9 +816,10 @@ alternative_else_nop_endif sub \dst, \dst, PAGE_SIZE .endm - .macro tramp_ventry, vector_start, regsize + .macro tramp_ventry, vector_start, regsize, kpti .align 7 1: + .if \kpti == 1 .if \regsize == 64 msr tpidrro_el0, x30 // Restored in kernel_ventry .endif
@@ -841,9 +842,14 @@ alternative_insn isb, nop, ARM64_WORKARO alternative_if_not ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM prfm plil1strm, [x30, #(1b - \vector_start)] alternative_else_nop_endif + msr vbar_el1, x30 - add x30, x30, #(1b - \vector_start + 4) isb + .else + ldr x30, =vectors + .endif // \kpti == 1 + + add x30, x30, #(1b - \vector_start + 4) ret .org 1b + 128 // Did we overflow the ventry slot? .endm
@@ -861,15 +867,15 @@ alternative_else_nop_endif sb .endm - .macro generate_tramp_vector + .macro generate_tramp_vector, kpti .Lvector_start\@: .space 0x400 .rept 4 - tramp_ventry .Lvector_start\@, 64 + tramp_ventry .Lvector_start\@, 64, \kpti .endr .rept 4 - tramp_ventry .Lvector_start\@, 32 + tramp_ventry .Lvector_start\@, 32, \kpti .endr .endm
@@ -880,7 +886,7 @@ alternative_else_nop_endif .pushsection ".entry.tramp.text", "ax" .align 11 SYM_CODE_START_NOALIGN(tramp_vectors) - generate_tramp_vector + generate_tramp_vector kpti=1 SYM_CODE_END(tramp_vectors) SYM_CODE_START(tramp_exit_native)
Greg Kroah-Hartman
maintainerPATCH 32/58 arm64: entry: Allow the trampoline text to occupy multiple pages
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit a9c406e6462ff14956d690de7bbe5131a5677dc9 upstream.
Adding a second set of vectors to .entry.tramp.text will make it larger than a single 4K page.
Allow the trampoline text to occupy up to three pages by adding two more fixmap slots. Previous changes to tramp_valias allowed it to reach beyond a single page.
--- arch/arm64/include/asm/fixmap.h | 6 ++++-- arch/arm64/include/asm/sections.h | 5 +++++ arch/arm64/kernel/entry.S | 2 +- arch/arm64/kernel/vmlinux.lds.S | 2 +- arch/arm64/mm/mmu.c | 12 +++++++++--- 5 files changed, 20 insertions(+), 7 deletions(-)
arch/arm64/include/asm/fixmap.h +4 -2
@@ -62,9 +62,11 @@ enum fixed_addresses {#endif /* CONFIG_ACPI_APEI_GHES */ #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 -FIX_ENTRY_TRAMP_TEXT , +FIX_ENTRY_TRAMP_TEXT3 , +FIX_ENTRY_TRAMP_TEXT2 , +FIX_ENTRY_TRAMP_TEXT1 ,FIX_ENTRY_TRAMP_DATA , -#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT)) +#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT1))#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ __end_of_permanent_fixed_addresses,
arch/arm64/include/asm/sections.h +5 -0
@@ -19,4 +19,9 @@ extern char __irqentry_text_start[], __iextern char __mmuoff_data_start[], __mmuoff_data_end[];extern char __entry_tramp_text_start[], __entry_tramp_text_end[]; +static inline size_t entry_tramp_text_size (void ) +{ +return __entry_tramp_text_end - __entry_tramp_text_start; +} +#endif /* __ASM_SECTIONS_H */
arch/arm64/kernel/entry.S +1 -1
@@ -812,7 +812,7 @@ alternative_else_nop_endif .endm .macro tramp_data_page dst - adr \dst, .entry.tramp.text + adr_l \dst, .entry.tramp.text sub \dst, \dst, PAGE_SIZE .endm
arch/arm64/kernel/vmlinux.lds.S +1 -1
@@ -299,7 +299,7 @@ ASSERT(__hibernate_exit_text_end - (__hi <= SZ_4K, "Hibernate exit text too big or misaligned") #endif #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 -ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == PAGE_SIZE, +ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) <= 3*PAGE_SIZE, "Entry trampoline text too big") #endif /*
arch/arm64/mm/mmu.c +9 -3
@@ -592,6 +592,8 @@ early_param("rodata", parse_rodata);#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 static int __init map_entry_trampoline (void ) { +int i; +pgprot_t prot = rodata_enabled ?PAGE_KERNEL_ROX :PAGE_KERNEL_EXEC ;phys_addr_t pa_start =__pa_symbol (__entry_tramp_text_start);
@@ -600,11 +602,15 @@ static int __init map_entry_trampoline(v/* Map only the text into the trampoline page table */ memset (tramp_pg_dir,0 ,PGD_SIZE ); -__create_pgd_mapping (tramp_pg_dir, pa_start,TRAMP_VALIAS ,PAGE_SIZE , - prot, __pgd_pgtable_alloc,0 ); +__create_pgd_mapping (tramp_pg_dir, pa_start,TRAMP_VALIAS , +entry_tramp_text_size (), prot, + __pgd_pgtable_alloc,NO_BLOCK_MAPPINGS );/* Map both the text and data into the kernel page table */ -__set_fixmap (FIX_ENTRY_TRAMP_TEXT , pa_start, prot); +for (i =0 ; i <DIV_ROUND_UP (entry_tramp_text_size (),PAGE_SIZE ); i++) +__set_fixmap (FIX_ENTRY_TRAMP_TEXT1 - i, + pa_start + i *PAGE_SIZE , prot); +if (IS_ENABLED (CONFIG_RANDOMIZE_BASE )) {extern char __entry_tramp_data_start[];
Greg Kroah-Hartman
maintainerPATCH 33/58 arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit aff65393fa1401e034656e349abd655cfe272de0 upstream.
kpti is an optional feature, for systems not using kpti a set of vectors for the spectre-bhb mitigations is needed.
Add another set of vectors, __bp_harden_el1_vectors, that will be used if a mitigation is needed and kpti is not in use.
The EL1 ventries are repeated verbatim as there is no additional work needed for entry from EL1.
--- arch/arm64/kernel/entry.S | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
arch/arm64/kernel/entry.S +34 -1
@@ -819,10 +819,11 @@ alternative_else_nop_endif .macro tramp_ventry, vector_start, regsize, kpti .align 7 1: - .if \kpti == 1 .if \regsize == 64 msr tpidrro_el0, x30 // Restored in kernel_ventry .endif + + .if \kpti == 1 /* * Defend against branch aliasing attacks by pushing a dummy * entry onto the return stack and using a RET instruction to
@@ -910,6 +911,38 @@ SYM_DATA_END(__entry_tramp_data_start) #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ /* + * Exception vectors for spectre mitigations on entry from EL1 when + * kpti is not in use. + */ + .macro generate_el1_vector +.Lvector_start\@: + kernel_ventry 1, sync_invalid // Synchronous EL1t + kernel_ventry 1, irq_invalid // IRQ EL1t + kernel_ventry 1, fiq_invalid // FIQ EL1t + kernel_ventry 1, error_invalid // Error EL1t + + kernel_ventry 1, sync // Synchronous EL1h + kernel_ventry 1, irq // IRQ EL1h + kernel_ventry 1, fiq_invalid // FIQ EL1h + kernel_ventry 1, error // Error EL1h + + .rept 4 + tramp_ventry .Lvector_start\@, 64, kpti=0 + .endr + .rept 4 + tramp_ventry .Lvector_start\@, 32, kpti=0 + .endr + .endm + + .pushsection ".entry.text", "ax" + .align 11 +SYM_CODE_START(__bp_harden_el1_vectors) + generate_el1_vector +SYM_CODE_END(__bp_harden_el1_vectors) + .popsection + + +/* * Register switch for AArch64. The callee-saved registers need to be saved * and restored. On entry: * x0 = previous task_struct (must be preserved across the switch)
Greg Kroah-Hartman
maintainerPATCH 34/58 arm64: entry: Add vectors that have the bhb mitigation sequences
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit ba2689234be92024e5635d30fe744f4853ad97db upstream.
Some CPUs affected by Spectre-BHB need a sequence of branches, or a firmware call to be run before any indirect branch. This needs to go in the vectors. No CPU needs both.
While this can be patched in, it would run on all CPUs as there is a single set of vectors. If only one part of a big/little combination is affected, the unaffected CPUs have to run the mitigation too.
Create extra vectors that include the sequence. Subsequent patches will allow affected CPUs to select this set of vectors. Later patches will modify the loop count to match what the CPU requires.
--- arch/arm64/include/asm/assembler.h | 24 ++++++++++++++++ arch/arm64/include/asm/vectors.h | 34 +++++++++++++++++++++++ arch/arm64/kernel/entry.S | 53 ++++++++++++++++++++++++++++++------- include/linux/arm-smccc.h | 5 +++ 4 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 arch/arm64/include/asm/vectors.h
arch/arm64/include/asm/assembler.h +24 -0
@@ -795,4 +795,28 @@ USER(\label, ic ivau, \tmp2) // invali #endif /* GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT */ + .macro __mitigate_spectre_bhb_loop tmp +#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY + mov \tmp, #32 +.Lspectre_bhb_loop\@: + b . + 4 + subs \tmp, \tmp, #1 + b.ne .Lspectre_bhb_loop\@ + sb +#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ + .endm + + /* Save/restores x0-x3 to the stack */ + .macro __mitigate_spectre_bhb_fw +#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY + stp x0, x1, [sp, #-16]! + stp x2, x3, [sp, #-16]! + mov w0, #ARM_SMCCC_ARCH_WORKAROUND_3 +alternative_cb smccc_patch_fw_mitigation_conduit + nop // Patched to SMC/HVC #0 +alternative_cb_end + ldp x2, x3, [sp], #16 + ldp x0, x1, [sp], #16 +#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ + .endm #endif /* __ASM_ASSEMBLER_H */
arch/arm64/include/asm/vectors.h new file +34 -0
@@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +* Copyright (C) 2022 ARM Ltd. +*/ +#ifndef __ASM_VECTORS_H +#define __ASM_VECTORS_H + +/* +* Note: the order of this enum corresponds to two arrays in entry.S: +* tramp_vecs and __bp_harden_el1_vectors. By default the canonical +* 'full fat' vectors are used directly. +*/ +enum arm64_bp_harden_el1_vectors { +#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY +/* +* Perform the BHB loop mitigation, before branching to the canonical +* vectors. +*/ +EL1_VECTOR_BHB_LOOP , + +/* +* Make the SMC call for firmware mitigation, before branching to the +* canonical vectors. +*/ +EL1_VECTOR_BHB_FW , +#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ + +/* +* Remap the kernel before branching to the canonical vectors. +*/ +EL1_VECTOR_KPTI , ++}; + +#endif /* __ASM_VECTORS_H */
arch/arm64/kernel/entry.S +44 -9
119 lines not on this page · raw message
include/linux/arm-smccc.h +5 -0
@@ -87,6 +87,11 @@ ARM_SMCCC_SMC_32, \ 0, 0x7fff) +#define ARM_SMCCC_ARCH_WORKAROUND_3 \ + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ + ARM_SMCCC_SMC_32, \ + 0, 0x3fff) +#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1/* Paravirtualised time calls (defined by ARM DEN0057A) */
Greg Kroah-Hartman
maintainerPATCH 35/58 arm64: entry: Add macro for reading symbol addresses from the trampoline
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit b28a8eebe81c186fdb1a0078263b30576c8e1f42 upstream.
The trampoline code needs to use the address of symbols in the wider kernel, e.g. vectors. PC-relative addressing wouldn't work as the trampoline code doesn't run at the address the linker expected.
tramp_ventry uses a literal pool, unless CONFIG_RANDOMIZE_BASE is set, in which case it uses the data page as a literal pool because the data page can be unmapped when running in user-space, which is required for CPUs vulnerable to meltdown.
Pull this logic out as a macro, instead of adding a third copy of it.
--- arch/arm64/kernel/entry.S | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-)
arch/arm64/kernel/entry.S +16 -20
@@ -816,6 +816,15 @@ alternative_else_nop_endif sub \dst, \dst, PAGE_SIZE .endm + .macro tramp_data_read_var dst, var +#ifdef CONFIG_RANDOMIZE_BASE + tramp_data_page \dst + add \dst, \dst, #:lo12:__entry_tramp_data_\var + ldr \dst, [\dst] +#else + ldr \dst, =\var +#endif + .endm #define BHB_MITIGATION_NONE 0 #define BHB_MITIGATION_LOOP 1
@@ -846,13 +855,8 @@ alternative_else_nop_endif b . 2: tramp_map_kernel x30 -#ifdef CONFIG_RANDOMIZE_BASE - tramp_data_page x30 alternative_insn isb, nop, ARM64_WORKAROUND_QCOM_FALKOR_E1003 - ldr x30, [x30] -#else - ldr x30, =vectors -#endif + tramp_data_read_var x30, vectors alternative_if_not ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM prfm plil1strm, [x30, #(1b - \vector_start)] alternative_else_nop_endif
@@ -935,7 +939,12 @@ SYM_CODE_END(tramp_exit_compat) .pushsection ".rodata", "a" .align PAGE_SHIFT SYM_DATA_START(__entry_tramp_data_start) +__entry_tramp_data_vectors: .quad vectors +#ifdef CONFIG_ARM_SDE_INTERFACE +__entry_tramp_data___sdei_asm_handler: + .quad __sdei_asm_handler +#endif /* CONFIG_ARM_SDE_INTERFACE */ SYM_DATA_END(__entry_tramp_data_start) .popsection // .rodata #endif /* CONFIG_RANDOMIZE_BASE */
@@ -1066,13 +1075,7 @@ SYM_CODE_START(__sdei_asm_entry_trampoli */ 1: str x4, [x1, #(SDEI_EVENT_INTREGS + S_ORIG_ADDR_LIMIT)] -#ifdef CONFIG_RANDOMIZE_BASE - tramp_data_page x4 - add x4, x4, #:lo12:__sdei_asm_trampoline_next_handler - ldr x4, [x4] -#else - ldr x4, =__sdei_asm_handler -#endif + tramp_data_read_var x4, __sdei_asm_handler br x4 SYM_CODE_END(__sdei_asm_entry_trampoline) NOKPROBE(__sdei_asm_entry_trampoline)
@@ -1095,13 +1098,6 @@ SYM_CODE_END(__sdei_asm_exit_trampoline) NOKPROBE(__sdei_asm_exit_trampoline) .ltorg .popsection // .entry.tramp.text -#ifdef CONFIG_RANDOMIZE_BASE -.pushsection ".rodata", "a" -SYM_DATA_START(__sdei_asm_trampoline_next_handler) - .quad __sdei_asm_handler -SYM_DATA_END(__sdei_asm_trampoline_next_handler) -.popsection // .rodata -#endif /* CONFIG_RANDOMIZE_BASE */ #endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ /*
Greg Kroah-Hartman
maintainerPATCH 36/58 arm64: Add percpu vectors for EL1
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit bd09128d16fac3c34b80bd6a29088ac632e8ce09 upstream.
The Spectre-BHB workaround adds a firmware call to the vectors. This is needed on some CPUs, but not others. To avoid the unaffected CPU in a big/little pair from making the firmware call, create per cpu vectors.
The per-cpu vectors only apply when returning from EL0.
Systems using KPTI can use the canonical 'full-fat' vectors directly at EL1, the trampoline exit code will switch to this_cpu_vector on exit to EL0. Systems not using KPTI should always use this_cpu_vector.
this_cpu_vector will point at a vector in tramp_vecs or __bp_harden_el1_vectors, depending on whether KPTI is in use.
--- arch/arm64/include/asm/vectors.h | 29 ++++++++++++++++++++++++++++- arch/arm64/kernel/cpufeature.c | 11 +++++++++++ arch/arm64/kernel/entry.S | 12 ++++++------ arch/arm64/kvm/hyp/vhe/switch.c | 9 +++++++-- 4 files changed, 52 insertions(+), 9 deletions(-)
arch/arm64/include/asm/vectors.h +28 -1
@@ -5,6 +5,15 @@#ifndef __ASM_VECTORS_H#define __ASM_VECTORS_H +#include <linux/bug.h> +#include <linux/percpu.h> + +#include <asm/fixmap.h> + +extern char vectors[]; +extern char tramp_vectors[]; +extern char __bp_harden_el1_vectors[]; +/* * Note: the order of this enum corresponds to two arrays in entry.S: * tramp_vecs and __bp_harden_el1_vectors. By default the canonical
@@ -29,6 +38,24 @@ enum arm64_bp_harden_el1_vectors {* Remap the kernel before branching to the canonical vectors. */ EL1_VECTOR_KPTI, -+}; +}; + +/* The vectors to use on return from EL0. e.g. to remap the kernel */ +DECLARE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector); + +#ifndef CONFIG_UNMAP_KERNEL_AT_EL0 +#define TRAMP_VALIAS 0 +#endif + +static inline const char * +arm64_get_bp_hardening_vector (enum arm64_bp_harden_el1_vectors slot) +{ +if (arm64_kernel_unmapped_at_el0 ()) +return (char *)TRAMP_VALIAS +SZ_2K * slot; + +WARN_ON_ONCE (slot ==EL1_VECTOR_KPTI ); + +return __bp_harden_el1_vectors +SZ_2K * slot; +}#endif /* __ASM_VECTORS_H */
arch/arm64/kernel/cpufeature.c +11 -0
@@ -65,11 +65,13 @@#include <linux/bsearch.h> #include <linux/cpumask.h> #include <linux/crash_dump.h> +#include <linux/percpu.h> #include <linux/sort.h> #include <linux/stop_machine.h> #include <linux/types.h> #include <linux/mm.h> #include <linux/cpu.h> +#include <asm/cpu.h> #include <asm/cpufeature.h> #include <asm/cpu_ops.h>
@@ -79,6 +81,7 @@#include <asm/processor.h> #include <asm/sysreg.h> #include <asm/traps.h> +#include <asm/vectors.h> #include <asm/virt.h> /* Kernel representation of AT_HWCAP and AT_HWCAP2 */
@@ -104,6 +107,8 @@ DECLARE_BITMAP(boot_capabilities, ARM64_bool arm64_use_ng_mappings = false;EXPORT_SYMBOL (arm64_use_ng_mappings); +DEFINE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector) = vectors; +/* * Flag to indicate if we have computed the system wide * capabilities based on the boot time active CPUs. This
@@ -1413,6 +1418,12 @@ kpti_install_ng_mappings(const struct arint cpu =smp_processor_id (); +if (__this_cpu_read (this_cpu_vector) == vectors) { +const char *v =arm64_get_bp_hardening_vector (EL1_VECTOR_KPTI ); + +__this_cpu_write (this_cpu_vector, v); + } +/* * We don't need to rewrite the page-tables if either we've done * it already or we have KASLR enabled and therefore have not
arch/arm64/kernel/entry.S +6 -6
@@ -63,7 +63,6 @@ .macro kernel_ventry, el, label, regsize = 64 .align 7 .Lventry_start\@: -#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 .if \el == 0 /* * This must be the first instruction of the EL0 vector entries. It is
@@ -78,7 +77,6 @@ .endif .Lskip_tramp_vectors_cleanup\@: .endif -#endif sub sp, sp, #S_FRAME_SIZE #ifdef CONFIG_VMAP_STACK
@@ -882,10 +880,10 @@ alternative_else_nop_endif .endm .macro tramp_exit, regsize = 64 - adr x30, tramp_vectors -#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY - add x30, x30, SZ_4K -#endif + tramp_data_read_var x30, this_cpu_vector + this_cpu_offset x29 + ldr x30, [x30, x29] + msr vbar_el1, x30 ldr lr, [sp, #S_LR] tramp_unmap_kernel x29
@@ -945,6 +943,8 @@ __entry_tramp_data_vectors: __entry_tramp_data___sdei_asm_handler: .quad __sdei_asm_handler #endif /* CONFIG_ARM_SDE_INTERFACE */ +__entry_tramp_data_this_cpu_vector: + .quad this_cpu_vector SYM_DATA_END(__entry_tramp_data_start) .popsection // .rodata #endif /* CONFIG_RANDOMIZE_BASE */
arch/arm64/kvm/hyp/vhe/switch.c +7 -2
@@ -10,6 +10,7 @@#include <linux/kvm_host.h> #include <linux/types.h> #include <linux/jump_label.h> +#include <linux/percpu.h> #include <uapi/linux/psci.h> #include <kvm/arm_psci.h>
@@ -25,6 +26,7 @@#include <asm/debug-monitors.h> #include <asm/processor.h> #include <asm/thread_info.h> +#include <asm/vectors.h> const char __hyp_panic_string[] ="HYP panic:\nPS:%08llx PC:%016llx ESR:%08llx\nFAR:%016llx HPFAR:%016llx PAR:%016llx\nVCPU:%p\n" ;
@@ -70,7 +72,7 @@ NOKPROBE_SYMBOL(__activate_traps);static void __deactivate_traps (struct kvm_vcpu *vcpu) { -extern char vectors[];/* kernel exception vectors */ +const char *host_vectors = vectors;___deactivate_traps (vcpu);
@@ -84,7 +86,10 @@ static void __deactivate_traps(struct kv asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));write_sysreg (CPACR_EL1_DEFAULT , cpacr_el1); -write_sysreg (vectors, vbar_el1); + +if (!arm64_kernel_unmapped_at_el0 ()) + host_vectors =__this_cpu_read (this_cpu_vector); +write_sysreg (host_vectors, vbar_el1); }NOKPROBE_SYMBOL (__deactivate_traps);
Greg Kroah-Hartman
maintainerPATCH 37/58 arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit dee435be76f4117410bbd90573a881fd33488f37 upstream.
Speculation attacks against some high-performance processors can make use of branch history to influence future speculation as part of a spectre-v2 attack. This is not mitigated by CSV2, meaning CPUs that previously reported 'Not affected' are now moderately mitigated by CSV2.
Update the value in /sys/devices/system/cpu/vulnerabilities/spectre_v2 to also show the state of the BHB mitigation.
--- arch/arm64/include/asm/spectre.h | 2 ++ arch/arm64/kernel/proton-pack.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-)
arch/arm64/include/asm/spectre.h +2 -0
@@ -29,4 +29,6 @@ bool has_spectre_v4(const struct arm64_cvoid spectre_v4_enable_mitigation (const struct arm64_cpu_capabilities *__unused);void spectre_v4_enable_task_mitigation (struct task_struct *tsk); +enum mitigation_state arm64_get_spectre_bhb_state (void ); +#endif /* __ASM_SPECTRE_H */
arch/arm64/kernel/proton-pack.c +34 -2
@@ -94,14 +94,39 @@ static bool spectre_v2_mitigations_off(vreturn ret; } +static const char *get_bhb_affected_string (enum mitigation_state bhb_state) +{ +switch (bhb_state) { +case SPECTRE_UNAFFECTED : +return "" ; +default : +case SPECTRE_VULNERABLE : +return ", but not BHB" ; +case SPECTRE_MITIGATED : +return ", BHB" ; + } +} +ssize_t cpu_show_spectre_v2 (struct device *dev,struct device_attribute *attr,char *buf) { +enum mitigation_state bhb_state =arm64_get_spectre_bhb_state (); +const char *bhb_str =get_bhb_affected_string (bhb_state); +const char *v2_str ="Branch predictor hardening" ; +switch (spectre_v2_state) {case SPECTRE_UNAFFECTED : -return sprintf (buf,"Not affected\n" ); +if (bhb_state ==SPECTRE_UNAFFECTED ) +return sprintf (buf,"Not affected\n" ); + +/* +* Platforms affected by Spectre-BHB can't report +* "Not affected" for Spectre-v2. +*/ + v2_str ="CSV2" ; + fallthrough;case SPECTRE_MITIGATED : -return sprintf (buf,"Mitigation: Branch predictor hardening\n" ); +return sprintf (buf,"Mitigation: %s%s\n" , v2_str, bhb_str);case SPECTRE_VULNERABLE : fallthrough;default :
@@ -787,3 +812,10 @@ int arch_prctl_spec_ctrl_get(struct taskreturn -ENODEV ; } } + +static enum mitigation_state spectre_bhb_state; + +enum mitigation_state arm64_get_spectre_bhb_state (void ) +{ +return spectre_bhb_state; +}
Greg Kroah-Hartman
maintainerPATCH 38/58 KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 5bdf3437603d4af87f9c7f424b0c8aeed2420745 upstream.
CPUs vulnerable to Spectre-BHB either need to make an SMC-CC firmware call from the vectors, or run a sequence of branches. This gets added to the hyp vectors. If there is no support for arch-workaround-1 in firmware, the indirect vector will be used.
kvm_init_vector_slots() only initialises the two indirect slots if the platform is vulnerable to Spectre-v3a. pKVM's hyp_map_vectors() only initialises __hyp_bp_vect_base if the platform is vulnerable to Spectre-v3a.
As there are about to more users of the indirect vectors, ensure their entries in hyp_spectre_vector_selector[] are always initialised, and __hyp_bp_vect_base defaults to the regular VA mapping.
The Spectre-v3a check is moved to a helper kvm_system_needs_idmapped_vectors(), and merged with the code that creates the hyp mappings.
--- arch/arm64/include/asm/cpucaps.h | 3 + arch/arm64/include/asm/kvm_asm.h | 6 +++ arch/arm64/include/asm/kvm_mmu.h | 3 + arch/arm64/include/asm/mmu.h | 6 +++ arch/arm64/kernel/proton-pack.c | 47 +++++++++++++++++++++++++++ arch/arm64/kvm/arm.c | 3 + arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 130 insertions(+), 4 deletions(-)
arch/arm64/include/asm/cpucaps.h +2 -1
@@ -66,7 +66,8 @@#define ARM64_HAS_TLB_RANGE 56#define ARM64_MTE 57#define ARM64_WORKAROUND_1508412 58 +#define ARM64_SPECTRE_BHB 59 -#define ARM64_NCAPS 59 +#define ARM64_NCAPS 60#endif /* __ASM_CPUCAPS_H */
arch/arm64/include/asm/kvm_asm.h +6 -0
@@ -35,6 +35,8 @@#define KVM_VECTOR_PREAMBLE (2 * AARCH64_INSN_SIZE)#define __SMCCC_WORKAROUND_1_SMC_SZ 36 +#define __SMCCC_WORKAROUND_3_SMC_SZ 36 +#define __SPECTRE_BHB_LOOP_SZ 44#define KVM_HOST_SMCCC_ID (id) \ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
@@ -199,6 +201,10 @@ extern void __vgic_v3_init_lrs(void);extern u32 __kvm_get_mdcr_el2 (void );extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ]; +extern char __smccc_workaround_3_smc[__SMCCC_WORKAROUND_3_SMC_SZ]; +extern char __spectre_bhb_loop_k8[__SPECTRE_BHB_LOOP_SZ]; +extern char __spectre_bhb_loop_k24[__SPECTRE_BHB_LOOP_SZ]; +extern char __spectre_bhb_loop_k32[__SPECTRE_BHB_LOOP_SZ];/* * Obtain the PC-relative address of a kernel symbol
arch/arm64/include/asm/kvm_mmu.h +2 -1
@@ -237,7 +237,8 @@ static inline void *kvm_get_hyp_vector(vvoid *vect =kern_hyp_va (kvm_ksym_ref (__kvm_hyp_vector));int slot =-1 ; -if (cpus_have_const_cap (ARM64_SPECTRE_V2 ) && data->fn) { +if ((cpus_have_const_cap (ARM64_SPECTRE_V2 ) || +cpus_have_const_cap (ARM64_SPECTRE_BHB )) && data->template_start) { vect =kern_hyp_va (kvm_ksym_ref (__bp_harden_hyp_vecs)); slot = data->hyp_vectors_slot; }
arch/arm64/include/asm/mmu.h +6 -0
@@ -67,6 +67,12 @@ typedef void (*bp_hardening_cb_t)(void);struct bp_hardening_data {int hyp_vectors_slot;bp_hardening_cb_t fn; + +/* +* template_start is only used by the BHB mitigation to identify the +* hyp_vectors_slot sequence. +*/ +const char *template_start; }; DECLARE_PER_CPU_READ_MOSTLY(struct bp_hardening_data, bp_hardening_data);
arch/arm64/kernel/proton-pack.c +46 -1
64 lines not on this page · raw message
arch/arm64/kvm/arm.c +2 -1
@@ -1337,7 +1337,8 @@ static int kvm_map_vectors(void)* !SV2 + HEL2 -> allocate one vector slot and use exec mapping * SV2 + HEL2 -> use hardened vectors and use exec mapping */ -if (cpus_have_const_cap (ARM64_SPECTRE_V2 )) { +if (cpus_have_const_cap (ARM64_SPECTRE_V2 ) || +cpus_have_const_cap (ARM64_SPECTRE_BHB )) { __kvm_bp_vect_base =kvm_ksym_ref (__bp_harden_hyp_vecs); __kvm_bp_vect_base =kern_hyp_va (__kvm_bp_vect_base); }
arch/arm64/kvm/hyp/smccc_wa.S +66 -0
69 lines not on this page · raw message
Re: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
Hi!
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.
Upstream commit 5bdf is very different from this. In particular,
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++
I can't find smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspect loop_k24 should loop 24 times, but it does 8 loops AFAICT. Same problem with loop_k32.
Best regards,
Pavel
Quoted 37 lines
arch/arm64/kvm/hyp/smccc_wa.S +34
-0+ + .global __spectre_bhb_loop_k24 +SYM_DATA_START(__spectre_bhb_loop_k24) + esb + sub sp, sp, #(8 * 2) + stp x0, x1, [sp, #(8 * 0)] + mov x0, #8 +2: b . + 4 + subs x0, x0, #1 + b.ne 2b + dsb nsh + isb + ldp x0, x1, [sp, #(8 * 0)] + add sp, sp, #(8 * 2) +1: .org __spectre_bhb_loop_k24 + __SPECTRE_BHB_LOOP_SZ + .org 1b +SYM_DATA_END(__spectre_bhb_loop_k24) + + .global __spectre_bhb_loop_k32 +SYM_DATA_START(__spectre_bhb_loop_k32) + esb + sub sp, sp, #(8 * 2) + stp x0, x1, [sp, #(8 * 0)] + mov x0, #8 +2: b . + 4 + subs x0, x0, #1 + b.ne 2b + dsb nsh + isb + ldp x0, x1, [sp, #(8 * 0)] + add sp, sp, #(8 * 2) +1: .org __spectre_bhb_loop_k32 + __SPECTRE_BHB_LOOP_SZ + .org 1b +SYM_DATA_END(__spectre_bhb_loop_k32)
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
Quoted 6 lines · Pavel Machek
Hi!
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.
Quoted 7 lines
Upstream commit 5bdf is very different from this. In particular,
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++I can't find
smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspectloop_k24should loop 24 times, but it does 8 loops AFAICT. Same problem withloop_k32.
The kvm portion of these patches is the "trickiest" portions. I'll let James explain them, as he did so to me when sending the backports.
thanks,
greg k-h
Re: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
Hi guys,
Quoted 5 lines · Greg Kroah-Hartman
Quoted 4 lines · Pavel Machek
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.
Quoted 7 lines
Quoted 7 lines
Upstream commit 5bdf is very different from this. In particular,
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++I can't find
smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspectloop_k24should loop 24 times, but it does 8 loops AFAICT. Same problem withloop_k32.
Yup, that's a bug. Thanks for spotting it!
I'll post a replacement for this patch.
I only have A57 I can test this on, guess what its K value is.
Quoted 2 lines
The kvm portion of these patches is the "trickiest" portions. I'll let James explain them, as he did so to me when sending the backports.
KVM gets re-written fairly frequently. Earlier kernels don't have any of the infrastructure for generating the vectors at compile time and selecting a pre-built vector at boot. Instead, kernels of this vintage have bunch of empty vectors, and some templates they use to create the appropriate vector at boot. See commit b881cdce77b4.
I've looked at backporting all that - its about 60 patches. I don't think its a good idea.
Thanks,
James
Re: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
Quoted 8 lines · James Morse
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Pavel Machek
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.Upstream commit 5bdf is very different from this. In particular,
Quoted 8 lines
Quoted 5 lines
Quoted 5 lines
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++
I can't find
smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspectloop_k24should loop 24 times, but it does 8 loops AFAICT. Same problem withloop_k32.Yup, that's a bug. Thanks for spotting it!
I'll post a replacement for this patch.
Looking more closely at this: when I originally did this the 'new' code for stable was in a separate patch to make it clear it was new code. Here it looks like Greg has merged it into this patch.
I'm not sure what the 'rules' are for this sort of thing, obviously Greg gets the last say.
I'll try and restructure the other backports to look like this, it is certainly simpler than trrying to pull all the prerequisites for all the upstream patches in.
Thanks,
James
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
Quoted 15 lines · James Morse
Quoted 14 lines · James Morse
Quoted 12 lines · Greg Kroah-Hartman
Quoted 11 lines · Pavel Machek
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.Upstream commit 5bdf is very different from this. In particular,
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++
I can't find
smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspectloop_k24should loop 24 times, but it does 8 loops AFAICT. Same problem withloop_k32.
Quoted 6 lines
Quoted 2 lines
Yup, that's a bug. Thanks for spotting it!
I'll post a replacement for this patch.Looking more closely at this: when I originally did this the 'new' code for stable was in a separate patch to make it clear it was new code. Here it looks like Greg has merged it into this patch.
I did? I don't recall doing that at all, sorry. But getting the 5.10 arm64 tree into the stable queue was not easy from what I recall.
Quoted 4 lines
I'm not sure what the 'rules' are for this sort of thing, obviously Greg gets the last say.
I'll try and restructure the other backports to look like this, it is certainly simpler than trrying to pull all the prerequisites for all the upstream patches in.
I tried to also take a lot of prerequisite patches for the cpu id stuff, to make those merges easier, so I have no problem with taking what is in Linus's tree to make backports simpler. But it's a balencing act, especially for tougher stuff like this :(
thanks,
greg k-h
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 38/58] KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A
In reply to James MorseQuoted 10 lines · James Morse
Hi guys,
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Pavel Machek
What is going on here?
Quoted 1 line
commit
5bdf3437603d4af87f9c7f424b0c8aeed2420745upstream.Upstream commit 5bdf is very different from this. In particular,
Quoted 8 lines
Quoted 5 lines
Quoted 5 lines
Quoted 1 line
arch/arm64/kvm/hyp/smccc_wa.S | 66 +++++++++++++++++++++++++++++++++++++++I can't find
smccc_wa.S, neither in mainline, nor in -next. And it looks buggy. I suspectloop_k24should loop 24 times, but it does 8 loops AFAICT. Same problem withloop_k32.Yup, that's a bug. Thanks for spotting it!
I'll post a replacement for this patch.
That's going to be hard as this is now in a merged tree :(
Can you just send a fixup?
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 39/58 arm64: Mitigate spectre style branch history side channels
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 558c303c9734af5a813739cd284879227f7297d2 upstream.
Speculation attacks against some high-performance processors can make use of branch history to influence future speculation. When taking an exception from user-space, a sequence of branches or a firmware call overwrites or invalidates the branch history.
The sequence of branches is added to the vectors, and should appear before the first indirect branch. For systems using KPTI the sequence is added to the kpti trampoline where it has a free register as the exit from the trampoline is via a 'ret'. For systems not using KPTI, the same register tricks are used to free up a register in the vectors.
For the firmware call, arch-workaround-3 clobbers 4 registers, so there is no choice but to save them to the EL1 stack. This only happens for entry from EL0, so if we take an exception due to the stack access, it will not become re-entrant.
For KVM, the existing branch-predictor-hardening vectors are used. When a spectre version of these vectors is in use, the firmware call is sufficient to mitigate against Spectre-BHB. For the non-spectre versions, the sequence of branches is added to the indirect vector.
[ modified for stable, removed bitmap of mitigations, use kvm template
infrastructure ]
--- arch/arm64/Kconfig | 9 + arch/arm64/include/asm/assembler.h | 4 arch/arm64/include/asm/cpufeature.h | 15 ++ arch/arm64/include/asm/cputype.h | 8 + arch/arm64/include/asm/spectre.h | 4 arch/arm64/include/asm/sysreg.h | 1 arch/arm64/include/asm/vectors.h | 5 arch/arm64/kernel/cpu_errata.c | 7 + arch/arm64/kernel/proton-pack.c | 234 +++++++++++++++++++++++++++++++++++- arch/arm64/kvm/hyp/hyp-entry.S | 4 10 files changed, 288 insertions(+), 3 deletions(-)
arch/arm64/Kconfig +9 -0
@@ -1184,6 +1184,15 @@ config UNMAP_KERNEL_AT_EL0 If unsure, say Y. +config MITIGATE_SPECTRE_BRANCH_HISTORY + bool "Mitigate Spectre style attacks against branch history" if EXPERT + default y + help + Speculation attacks against some high-performance processors can + make use of branch history to influence future speculation. + When taking an exception from user-space, a sequence of branches + or a firmware call overwrites the branch history. + config RODATA_FULL_DEFAULT_ENABLED bool "Apply r/o permissions of VM areas also to their linear aliases" default y
arch/arm64/include/asm/assembler.h +3 -1
@@ -797,7 +797,9 @@ USER(\label, ic ivau, \tmp2) // invali .macro __mitigate_spectre_bhb_loop tmp#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY - mov \tmp, #32 +alternative_cb spectre_bhb_patch_loop_iter + mov \tmp, #32 // Patched to correct the immediate +alternative_cb_end .Lspectre_bhb_loop\@: b . + 4 subs \tmp, \tmp, #1
arch/arm64/include/asm/cpufeature.h +15 -0
@@ -606,6 +606,21 @@ static inline bool cpu_supports_mixed_enreturn id_aa64mmfr0_mixed_endian_el0 (read_cpuid (ID_AA64MMFR0_EL1 )); } +static inline bool supports_csv2p3 (int scope) +{ +u64 pfr0; +u8 csv2_val; + +if (scope ==SCOPE_LOCAL_CPU ) + pfr0 =read_sysreg_s (SYS_ID_AA64PFR0_EL1 ); +else + pfr0 =read_sanitised_ftr_reg (SYS_ID_AA64PFR0_EL1 ); + + csv2_val =cpuid_feature_extract_unsigned_field (pfr0, +ID_AA64PFR0_CSV2_SHIFT ); +return csv2_val ==3 ; +} +static inline bool system_supports_32bit_el0 (void ) {return cpus_have_const_cap (ARM64_HAS_32BIT_EL0 );
arch/arm64/include/asm/cputype.h +8 -0
@@ -73,10 +73,14 @@#define ARM_CPU_PART_CORTEX_A76 0xD0B#define ARM_CPU_PART_NEOVERSE_N1 0xD0C#define ARM_CPU_PART_CORTEX_A77 0xD0D +#define ARM_CPU_PART_NEOVERSE_V1 0xD40 +#define ARM_CPU_PART_CORTEX_A78 0xD41 +#define ARM_CPU_PART_CORTEX_X1 0xD44#define ARM_CPU_PART_CORTEX_A510 0xD46#define ARM_CPU_PART_CORTEX_A710 0xD47#define ARM_CPU_PART_CORTEX_X2 0xD48#define ARM_CPU_PART_NEOVERSE_N2 0xD49 +#define ARM_CPU_PART_CORTEX_A78C 0xD4B#define APM_CPU_PART_POTENZA 0x000
@@ -117,10 +121,14 @@#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1)#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77) +#define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1) +#define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78) +#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)#define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2) +#define MIDR_CORTEX_A78C MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78C)#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
arch/arm64/include/asm/spectre.h +3 -1
@@ -30,5 +30,7 @@ void spectre_v4_enable_mitigation(constvoid spectre_v4_enable_task_mitigation (struct task_struct *tsk);enum mitigation_state arm64_get_spectre_bhb_state (void ); - +bool is_spectre_bhb_affected (const struct arm64_cpu_capabilities *entry,int scope); +u8 spectre_bhb_loop_affected (int scope); +void spectre_bhb_enable_mitigation (const struct arm64_cpu_capabilities *__unused);#endif /* __ASM_SPECTRE_H */
arch/arm64/include/asm/sysreg.h +1 -0
@@ -801,6 +801,7 @@#endif /* id_aa64mmfr1 */ +#define ID_AA64MMFR1_ECBHB_SHIFT 60#define ID_AA64MMFR1_AFP_SHIFT 44#define ID_AA64MMFR1_ETS_SHIFT 36#define ID_AA64MMFR1_TWED_SHIFT 32
arch/arm64/include/asm/vectors.h +5 -0
@@ -40,6 +40,11 @@ enum arm64_bp_harden_el1_vectors { EL1_VECTOR_KPTI, }; +#ifndef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY +#define EL1_VECTOR_BHB_LOOP -1 +#define EL1_VECTOR_BHB_FW -1 +#endif /* !CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ +/* The vectors to use on return from EL0. e.g. to remap the kernel */ DECLARE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector);
arch/arm64/kernel/cpu_errata.c +7 -0
@@ -473,6 +473,13 @@ const struct arm64_cpu_capabilities arm6 .matches = has_spectre_v4, .cpu_enable = spectre_v4_enable_mitigation, }, + { + .desc = "Spectre-BHB", + .capability = ARM64_SPECTRE_BHB, + .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, + .matches = is_spectre_bhb_affected, + .cpu_enable = spectre_bhb_enable_mitigation, + }, #ifdef CONFIG_ARM64_ERRATUM_1418040 { .desc = "ARM erratum 1418040",
arch/arm64/kernel/proton-pack.c +233 -1
263 lines not on this page · raw message
arch/arm64/kvm/hyp/hyp-entry.S +4 -0
@@ -61,6 +61,10 @@ el1_sync: // Guest trapped into EL2 /* ARM_SMCCC_ARCH_WORKAROUND_2 handling */ eor w1, w1, #(ARM_SMCCC_ARCH_WORKAROUND_1 ^ \ ARM_SMCCC_ARCH_WORKAROUND_2) + cbz w1, wa_epilogue + + eor w1, w1, #(ARM_SMCCC_ARCH_WORKAROUND_2 ^ \ + ARM_SMCCC_ARCH_WORKAROUND_3) cbnz w1, el1_trap wa_epilogue:
Greg Kroah-Hartman
maintainerPATCH 40/58 KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit a5905d6af492ee6a4a2205f0d550b3f931b03d03 upstream.
KVM allows the guest to discover whether the ARCH_WORKAROUND SMCCC are implemented, and to preserve that state during migration through its firmware register interface.
Add the necessary boiler plate for SMCCC_ARCH_WORKAROUND_3.
--- arch/arm64/include/uapi/asm/kvm.h | 5 +++++ arch/arm64/kvm/hypercalls.c | 12 ++++++++++++ arch/arm64/kvm/psci.c | 18 +++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-)
arch/arm64/include/uapi/asm/kvm.h +5 -0
@@ -273,6 +273,11 @@ struct kvm_vcpu_events {#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED 3#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED (1U << 4) +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 KVM_REG_ARM_FW_REG(3) +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL 0 +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL 1 +#define KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED 2 +/* SVE registers */ #define KVM_REG_ARM64_SVE (0x15 << KVM_REG_ARM_COPROC_SHIFT)
arch/arm64/kvm/hypercalls.c +12 -0
@@ -58,6 +58,18 @@ int kvm_hvc_call_handler(struct kvm_vcpubreak ; }break ; +case ARM_SMCCC_ARCH_WORKAROUND_3 : +switch (arm64_get_spectre_bhb_state ()) { +case SPECTRE_VULNERABLE : +break ; +case SPECTRE_MITIGATED : + val =SMCCC_RET_SUCCESS ; +break ; +case SPECTRE_UNAFFECTED : + val =SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED ; +break ; + } +break ;case ARM_SMCCC_HV_PV_TIME_FEATURES : val =SMCCC_RET_SUCCESS ;break ;
arch/arm64/kvm/psci.c +17 -1
@@ -397,7 +397,7 @@ int kvm_psci_call(struct kvm_vcpu *vcpu)int kvm_arm_get_fw_num_regs (struct kvm_vcpu *vcpu) { -return 3 ;/* PSCI version and two workaround registers */ +return 4 ;/* PSCI version and three workaround registers */ }int kvm_arm_copy_fw_reg_indices (struct kvm_vcpu *vcpu,u64 __user *uindices)
@@ -411,6 +411,9 @@ int kvm_arm_copy_fw_reg_indices(struct kif (put_user (KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 , uindices++))return -EFAULT ; +if (put_user (KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 , uindices++)) +return -EFAULT ; +return 0 ; }
@@ -450,6 +453,17 @@ static int get_kernel_wa_level(u64 regidcase SPECTRE_VULNERABLE :return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL ; } +break ; +case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 : +switch (arm64_get_spectre_bhb_state ()) { +case SPECTRE_VULNERABLE : +return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL ; +case SPECTRE_MITIGATED : +return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL ; +case SPECTRE_UNAFFECTED : +return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED ; + } +return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL ; }return -EINVAL ;
@@ -466,6 +480,7 @@ int kvm_arm_get_fw_reg(struct kvm_vcpu *break ;case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 :case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 : +case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 : val =get_kernel_wa_level (reg->id) &KVM_REG_FEATURE_LEVEL_MASK ;break ;default :
@@ -511,6 +526,7 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu * }case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 : +case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 :if (val & ~KVM_REG_FEATURE_LEVEL_MASK )return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 41/58 arm64: Use the clearbhb instruction in mitigations
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 228a26b912287934789023b4132ba76065d9491c upstream.
Future CPUs may implement a clearbhb instruction that is sufficient to mitigate SpectreBHB. CPUs that implement this instruction, but not CSV2.3 must be affected by Spectre-BHB.
Add support to use this instruction as the BHB mitigation on CPUs that support it. The instruction is in the hint space, so it will be treated by a NOP as older CPUs.
[ modified for stable: Use a KVM vector template instead of alternatives,
removed bitmap of mitigations ]
--- arch/arm64/include/asm/assembler.h | 7 +++++++ arch/arm64/include/asm/cpufeature.h | 13 +++++++++++++ arch/arm64/include/asm/insn.h | 1 + arch/arm64/include/asm/kvm_asm.h | 2 ++ arch/arm64/include/asm/sysreg.h | 1 + arch/arm64/include/asm/vectors.h | 7 +++++++ arch/arm64/kernel/cpufeature.c | 1 + arch/arm64/kernel/entry.S | 8 ++++++++ arch/arm64/kernel/proton-pack.c | 12 ++++++++++++ arch/arm64/kvm/hyp/smccc_wa.S | 9 +++++++++ 10 files changed, 61 insertions(+)
arch/arm64/include/asm/assembler.h +7 -0
@@ -98,6 +98,13 @@ .endm /* + * Clear Branch History instruction + */ + .macro clearbhb + hint #22 + .endm + +/* * Speculation barrier */ .macro sb
arch/arm64/include/asm/cpufeature.h +13 -0
@@ -621,6 +621,19 @@ static inline bool supports_csv2p3(int sreturn csv2_val ==3 ; } +static inline bool supports_clearbhb (int scope) +{ +u64 isar2; + +if (scope ==SCOPE_LOCAL_CPU ) + isar2 =read_sysreg_s (SYS_ID_AA64ISAR2_EL1 ); +else + isar2 =read_sanitised_ftr_reg (SYS_ID_AA64ISAR2_EL1 ); + +return cpuid_feature_extract_unsigned_field (isar2, +ID_AA64ISAR2_CLEARBHB_SHIFT ); +} +static inline bool system_supports_32bit_el0 (void ) {return cpus_have_const_cap (ARM64_HAS_32BIT_EL0 );
arch/arm64/include/asm/insn.h +1 -0
@@ -65,6 +65,7 @@ enum aarch64_insn_hint_cr_op {AARCH64_INSN_HINT_PSB =0x11 <<5 ,AARCH64_INSN_HINT_TSB =0x12 <<5 ,AARCH64_INSN_HINT_CSDB =0x14 <<5 , +AARCH64_INSN_HINT_CLEARBHB =0x16 <<5 ,AARCH64_INSN_HINT_BTI =0x20 <<5 , AARCH64_INSN_HINT_BTIC = 0x22 << 5,
arch/arm64/include/asm/kvm_asm.h +2 -0
@@ -37,6 +37,7 @@#define __SMCCC_WORKAROUND_1_SMC_SZ 36#define __SMCCC_WORKAROUND_3_SMC_SZ 36#define __SPECTRE_BHB_LOOP_SZ 44 +#define __SPECTRE_BHB_CLEARBHB_SZ 12#define KVM_HOST_SMCCC_ID (id) \ ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
@@ -205,6 +206,7 @@ extern char __smccc_workaround_3_smc[__Sextern char __spectre_bhb_loop_k8[__SPECTRE_BHB_LOOP_SZ];extern char __spectre_bhb_loop_k24[__SPECTRE_BHB_LOOP_SZ];extern char __spectre_bhb_loop_k32[__SPECTRE_BHB_LOOP_SZ]; +extern char __spectre_bhb_clearbhb[__SPECTRE_BHB_LOOP_SZ];/* * Obtain the PC-relative address of a kernel symbol
arch/arm64/include/asm/sysreg.h +1 -0
@@ -689,6 +689,7 @@#define ID_AA64ISAR1_GPI_IMP_DEF 0x1/* id_aa64isar2 */ +#define ID_AA64ISAR2_CLEARBHB_SHIFT 28#define ID_AA64ISAR2_RPRES_SHIFT 4#define ID_AA64ISAR2_WFXT_SHIFT 0
arch/arm64/include/asm/vectors.h +7 -0
@@ -32,6 +32,12 @@ enum arm64_bp_harden_el1_vectors {* canonical vectors. */ EL1_VECTOR_BHB_FW , + +/* +* Use the ClearBHB instruction, before branching to the canonical +* vectors. +*/ + EL1_VECTOR_BHB_CLEAR_INSN, #endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY *//*
@@ -43,6 +49,7 @@ enum arm64_bp_harden_el1_vectors {#ifndef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY #define EL1_VECTOR_BHB_LOOP -1#define EL1_VECTOR_BHB_FW -1 +#define EL1_VECTOR_BHB_CLEAR_INSN -1#endif /* !CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ /* The vectors to use on return from EL0. e.g. to remap the kernel */
arch/arm64/kernel/cpufeature.c +1 -0
@@ -211,6 +211,7 @@ static const struct arm64_ftr_bits ftr_i };static const struct arm64_ftr_bits ftr_id_aa64isar2[] = { +ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_HIGHER_SAFE ,ID_AA64ISAR2_CLEARBHB_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_VISIBLE ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64ISAR2_RPRES_SHIFT ,4 ,0 ),ARM64_FTR_END , };
arch/arm64/kernel/entry.S +8 -0
@@ -827,6 +827,7 @@ alternative_else_nop_endif #define BHB_MITIGATION_NONE 0 #define BHB_MITIGATION_LOOP 1 #define BHB_MITIGATION_FW 2 +#define BHB_MITIGATION_INSN 3 .macro tramp_ventry, vector_start, regsize, kpti, bhb .align 7
@@ -843,6 +844,11 @@ alternative_else_nop_endif __mitigate_spectre_bhb_loop x30 .endif // \bhb == BHB_MITIGATION_LOOP + .if \bhb == BHB_MITIGATION_INSN + clearbhb + isb + .endif // \bhb == BHB_MITIGATION_INSN + .if \kpti == 1 /* * Defend against branch aliasing attacks by pushing a dummy
@@ -919,6 +925,7 @@ SYM_CODE_START_NOALIGN(tramp_vectors) #ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY generate_tramp_vector kpti=1, bhb=BHB_MITIGATION_LOOP generate_tramp_vector kpti=1, bhb=BHB_MITIGATION_FW + generate_tramp_vector kpti=1, bhb=BHB_MITIGATION_INSN #endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ generate_tramp_vector kpti=1, bhb=BHB_MITIGATION_NONE SYM_CODE_END(tramp_vectors)
@@ -981,6 +988,7 @@ SYM_CODE_START(__bp_harden_el1_vectors) #ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY generate_el1_vector bhb=BHB_MITIGATION_LOOP generate_el1_vector bhb=BHB_MITIGATION_FW + generate_el1_vector bhb=BHB_MITIGATION_INSN #endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ SYM_CODE_END(__bp_harden_el1_vectors) .popsection
arch/arm64/kernel/proton-pack.c +12 -0
@@ -824,6 +824,7 @@ int arch_prctl_spec_ctrl_get(struct task* - Mitigated by a branchy loop a CPU specific number of times, and listed * in our "loop mitigated list". * - Mitigated in software by the firmware Spectre v2 call. +* - Has the ClearBHB instruction to perform the mitigation. * - Has the 'Exception Clears Branch History Buffer' (ECBHB) feature, so no * software mitigation in the vectors is needed. * - Has CSV2.3, so is unaffected.
@@ -949,6 +950,9 @@ bool is_spectre_bhb_affected(const strucif (supports_csv2p3 (scope))return false; +if (supports_clearbhb (scope)) +return true; +if (spectre_bhb_loop_affected (scope))return true;
@@ -987,6 +991,8 @@ static int kvm_bhb_get_vecs_size(const c start == __spectre_bhb_loop_k24 || start == __spectre_bhb_loop_k32)return __SPECTRE_BHB_LOOP_SZ; + else if (start == __spectre_bhb_clearbhb) + return __SPECTRE_BHB_CLEARBHB_SZ;return 0 ; }
@@ -1027,6 +1033,7 @@ static void kvm_setup_bhb_slot(const cha#define __spectre_bhb_loop_k8 NULL#define __spectre_bhb_loop_k24 NULL#define __spectre_bhb_loop_k32 NULL +#define __spectre_bhb_clearbhb NULLstatic void kvm_setup_bhb_slot (const char *hyp_vecs_start) { }#endif /* CONFIG_KVM */
@@ -1046,6 +1053,11 @@ void spectre_bhb_enable_mitigation(constpr_info_once ("spectre-bhb mitigation disabled by command line option\n" ); }else if (supports_ecbhb (SCOPE_LOCAL_CPU )) { state =SPECTRE_MITIGATED ; + }else if (supports_clearbhb (SCOPE_LOCAL_CPU )) { +kvm_setup_bhb_slot (__spectre_bhb_clearbhb); +this_cpu_set_vectors (EL1_VECTOR_BHB_CLEAR_INSN ); + + state =SPECTRE_MITIGATED ; }else if (spectre_bhb_loop_affected (SCOPE_LOCAL_CPU )) {switch (spectre_bhb_loop_affected (SCOPE_SYSTEM )) {case 8 :
arch/arm64/kvm/hyp/smccc_wa.S +9 -0
@@ -96,3 +96,12 @@ SYM_DATA_START(__spectre_bhb_loop_k32) 1: .org __spectre_bhb_loop_k32 + __SPECTRE_BHB_LOOP_SZ .org 1b SYM_DATA_END(__spectre_bhb_loop_k32) + + .global __spectre_bhb_clearbhb +SYM_DATA_START(__spectre_bhb_clearbhb) + esb + clearbhb + isb +1: .org __spectre_bhb_clearbhb + __SPECTRE_BHB_CLEARBHB_SZ + .org 1b +SYM_DATA_END(__spectre_bhb_clearbhb)
Greg Kroah-Hartman
maintainerPATCH 42/58 arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 mitigation reporting
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
commit 58c9a5060cb7cd529d49c93954cdafe81c1d642a upstream.
The mitigations for Spectre-BHB are only applied when an exception is taken from user-space. The mitigation status is reported via the spectre_v2 sysfs vulnerabilities file.
When unprivileged eBPF is enabled the mitigation in the exception vectors can be avoided by an eBPF program.
When unprivileged eBPF is enabled, print a warning and report vulnerable via the sysfs vulnerabilities file.
--- arch/arm64/kernel/proton-pack.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
arch/arm64/kernel/proton-pack.c +26 -0
@@ -18,6 +18,7 @@*/ #include <linux/arm-smccc.h> +#include <linux/bpf.h> #include <linux/cpu.h> #include <linux/device.h> #include <linux/nospec.h>
@@ -110,6 +111,15 @@ static const char *get_bhb_affected_stri } } +static bool _unprivileged_ebpf_enabled (void ) +{ +#ifdef CONFIG_BPF_SYSCALL +return !sysctl_unprivileged_bpf_disabled; +#else +return false; +#endif +} +ssize_t cpu_show_spectre_v2 (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -129,6 +139,9 @@ ssize_t cpu_show_spectre_v2(struct devic v2_str ="CSV2" ; fallthrough;case SPECTRE_MITIGATED : +if (bhb_state ==SPECTRE_MITIGATED &&_unprivileged_ebpf_enabled ()) +return sprintf (buf,"Vulnerable: Unprivileged eBPF enabled\n" ); +return sprintf (buf,"Mitigation: %s%s\n" , v2_str, bhb_str);case SPECTRE_VULNERABLE : fallthrough;
@@ -1108,3 +1121,16 @@ void noinstr spectre_bhb_patch_loop_iter AARCH64_INSN_MOVEWIDE_ZERO); *updptr++ =cpu_to_le32 (insn); } + +#ifdef CONFIG_BPF_SYSCALL +#define EBPF_WARN "Unprivileged eBPF is enabled, data leaks possible via Spectre v2 BHB attacks!\n" +void unpriv_ebpf_notify (int new_state) +{ +if (spectre_v2_state ==SPECTRE_VULNERABLE || + spectre_bhb_state !=SPECTRE_MITIGATED ) +return ; + +if (!new_state) +pr_err ("WARNING: %s" ,EBPF_WARN ); +} +#endif
Greg Kroah-Hartman
maintainerPATCH 43/58 ARM: fix build error when BPF_SYSCALL is disabled
In reply to Greg Kroah-HartmanFrom: Emmanuel Gil Peyrot <[email protected]>
commit 330f4c53d3c2d8b11d86ec03a964b86dc81452f5 upstream.
It was missing a semicolon.
--- arch/arm/kernel/spectre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/kernel/spectre.c +1 -1
@@ -10,7 +10,7 @@ static bool _unprivileged_ebpf_enabled(v#ifdef CONFIG_BPF_SYSCALL return !sysctl_unprivileged_bpf_disabled;#else - return false +return false;#endif }
Greg Kroah-Hartman
maintainerPATCH 44/58 ARM: fix co-processor register typo
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
commit 33970b031dc4653cc9dc80f2886976706c4c8ef1 upstream.
In the recent Spectre BHB patches, there was a typo that is only exposed in certain configurations: mcr p15,0,XX,c7,r5,4 should have been mcr p15,0,XX,c7,c5,4
--- arch/arm/include/asm/assembler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/include/asm/assembler.h +1 -1
@@ -113,7 +113,7 @@ .endm .macro isb, args - mcr p15, 0, r0, c7, r5, 4 + mcr p15, 0, r0, c7, c5, 4 .endm#endif
Greg Kroah-Hartman
maintainerPATCH 45/58 ARM: Do not use NOCROSSREFS directive with ld.lld
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 36168e387fa7d0f1fe0cd5cf76c8cea7aee714fa upstream.
ld.lld does not support the NOCROSSREFS directive at the moment, which breaks the build after commit b9baf5c8c5c3 ("ARM: Spectre-BHB workaround"):
ld.lld: error: ./arch/arm/kernel/vmlinux.lds:34: AT expected, but got NOCROSSREFS
Support for this directive will eventually be implemented, at which point a version check can be added. To avoid breaking the build in the meantime, just define NOCROSSREFS to nothing when using ld.lld, with a link to the issue for tracking.
--- arch/arm/include/asm/vmlinux.lds.h | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/include/asm/vmlinux.lds.h +8 -0
@@ -26,6 +26,14 @@#define ARM_MMU_DISCARD (x) x#endif +/* +* ld.lld does not support NOCROSSREFS: +* https://github.com/ClangBuiltLinux/linux/issues/1609 +*/ +#ifdef CONFIG_LD_IS_LLD +#define NOCROSSREFS +#endif +/* Set start/end symbol names to the LMA for the section */ #define ARM_LMA (sym, section) \ sym##_start = LOADADDR(section); \
Greg Kroah-Hartman
maintainerPATCH 46/58 ARM: fix build warning in proc-v7-bugs.c
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
commit b1a384d2cbccb1eb3f84765020d25e2c1929706e upstream.
The kernel test robot discovered that building without HARDEN_BRANCH_PREDICTOR issues a warning due to a missing argument to pr_info().
Add the missing argument.
--- arch/arm/mm/proc-v7-bugs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm/mm/proc-v7-bugs.c +2 -1
@@ -108,7 +108,8 @@ static unsigned int spectre_v2_install_w#else static unsigned int spectre_v2_install_workaround (unsigned int method) { -pr_info ("CPU%u: Spectre V2: workarounds disabled by configuration\n" ); +pr_info ("CPU%u: Spectre V2: workarounds disabled by configuration\n" , +smp_processor_id ());return SPECTRE_VULNERABLE ; }
Greg Kroah-Hartman
maintainerPATCH 47/58 xen/xenbus: dont let xenbus_grant_ring() remove grants in error case
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 3777ea7bac3113005b7180e6b9dadf16d19a5827 upstream.
Letting xenbus_grant_ring() tear down grants in the error case is problematic, as the other side could already have used these grants. Calling gnttab_end_foreign_access_ref() without checking success is resulting in an unclear situation for any caller of xenbus_grant_ring() as in the error case the memory pages of the ring page might be partially mapped. Freeing them would risk unwanted foreign access to them, while not freeing them would leak memory.
In order to remove the need to undo any gnttab_grant_foreign_access() calls, use gnttab_alloc_grant_references() to make sure no further error can occur in the loop granting access to the ring pages.
It should be noted that this way of handling removes leaking of grant entries in the error case, too.
This is CVE-2022-23040 / part of XSA-396.
--- drivers/xen/xenbus/xenbus_client.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-)
drivers/xen/xenbus/xenbus_client.c +11 -13
@@ -379,7 +379,14 @@ int xenbus_grant_ring(struct xenbus_devi unsigned int nr_pages, grant_ref_t *grefs) { int err; -int i, j; +unsigned int i; +grant_ref_t gref_head; + + err =gnttab_alloc_grant_references (nr_pages, &gref_head); +if (err) { +xenbus_dev_fatal (dev, err,"granting access to ring page" ); +return err; + }for (i =0 ; i < nr_pages; i++) {unsigned long gfn;
@@ -389,23 +396,14 @@ int xenbus_grant_ring(struct xenbus_devielse gfn =virt_to_gfn (vaddr); - err =gnttab_grant_foreign_access (dev->otherend_id, gfn,0 ); -if (err <0 ) { -xenbus_dev_fatal (dev, err, -"granting access to ring page" ); - goto fail; - } - grefs[i] = err; + grefs[i] =gnttab_claim_grant_reference (&gref_head); +gnttab_grant_foreign_access_ref (grefs[i], dev->otherend_id, + gfn,0 ); vaddr = vaddr +XEN_PAGE_SIZE ; }return 0 ; - -fail: -for (j =0 ; j < i; j++) -gnttab_end_foreign_access_ref (grefs[j],0 ); -return err; }EXPORT_SYMBOL_GPL (xenbus_grant_ring);
Greg Kroah-Hartman
maintainerPATCH 48/58 xen/grant-table: add gnttab_try_end_foreign_access()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 6b1775f26a2da2b05a6dc8ec2b5d14e9a4701a1a upstream.
Add a new grant table function gnttab_try_end_foreign_access(), which will remove and free a grant if it is not in use.
Its main use case is to either free a grant if it is no longer in use, or to take some other action if it is still in use. This other action can be an error exit, or (e.g. in the case of blkfront persistent grant feature) some special handling.
This is CVE-2022-23036, CVE-2022-23038 / part of XSA-396.
--- drivers/xen/grant-table.c | 14 ++++++++++++-- include/xen/grant_table.h | 12 ++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-)
drivers/xen/grant-table.c +12 -2
@@ -435,11 +435,21 @@ static void gnttab_add_deferred(grant_re what, ref, page ? page_to_pfn(page) : -1); } +int gnttab_try_end_foreign_access (grant_ref_t ref) +{ +int ret =_gnttab_end_foreign_access_ref (ref,0 ); + +if (ret) +put_free_entry (ref); + +return ret; +} +EXPORT_SYMBOL_GPL (gnttab_try_end_foreign_access); +void gnttab_end_foreign_access (grant_ref_t ref,int readonly,unsigned long page) { -if (gnttab_end_foreign_access_ref (ref, readonly)) { -put_free_entry (ref); +if (gnttab_try_end_foreign_access (ref)) {if (page !=0 )put_page (virt_to_page (page)); }else
include/xen/grant_table.h +12 -0
@@ -97,10 +97,22 @@ int gnttab_end_foreign_access_ref(grant_* access has been ended, free the given page too. Access will be ended * immediately iff the grant entry is not in use, otherwise it will happen * some time later. page may be 0, in which case no freeing will occur. +* Note that the granted page might still be accessed (read or write) by the +* other side after gnttab_end_foreign_access() returns, so even if page was +* specified as 0 it is not allowed to just reuse the page for other +* purposes immediately. */ void gnttab_end_foreign_access (grant_ref_t ref,int readonly,unsigned long page); +/* +* End access through the given grant reference, iff the grant entry is +* no longer in use. In case of success ending foreign access, the +* grant reference is deallocated. +* Return 1 if the grant entry was freed, 0 if it is still in use. +*/ +int gnttab_try_end_foreign_access (grant_ref_t ref); +int gnttab_grant_foreign_transfer (domid_t domid,unsigned long pfn);unsigned long gnttab_end_foreign_transfer_ref (grant_ref_t ref);
Greg Kroah-Hartman
maintainerPATCH 49/58 xen/blkfront: dont use gnttab_query_foreign_access() for mapped status
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit abf1fd5919d6238ee3bc5eb4a9b6c3947caa6638 upstream.
It isn't enough to check whether a grant is still being in use by calling gnttab_query_foreign_access(), as a mapping could be realized by the other side just after having called that function.
In case the call was done in preparation of revoking a grant it is better to do so via gnttab_end_foreign_access_ref() and check the success of that operation instead.
For the ring allocation use alloc_pages_exact() in order to avoid high order pages in case of a multi-page ring.
If a grant wasn't unmapped by the backend without persistent grants being used, set the device state to "error".
This is CVE-2022-23036 / part of XSA-396.
--- drivers/block/xen-blkfront.c | 63 +++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 26 deletions(-)
drivers/block/xen-blkfront.c +37 -26
@@ -1352,7 +1352,8 @@ free_shadow: rinfo->ring_ref[i] =GRANT_INVALID_REF ; } } -free_pages ((unsigned long )rinfo->ring.sring,get_order (info->nr_ring_pages *XEN_PAGE_SIZE )); +free_pages_exact (rinfo->ring.sring, + info->nr_ring_pages *XEN_PAGE_SIZE ); rinfo->ring.sring =NULL ;if (rinfo->irq)
@@ -1436,9 +1437,15 @@ static int blkif_get_final_status(enum breturn BLKIF_RSP_OKAY ; } -static bool blkif_completion (unsigned long *id, -struct blkfront_ring_info *rinfo, -struct blkif_response *bret) +/* +* Return values: +* 1 response processed. +* 0 missing further responses. +* -1 error while processing. +*/ +static int blkif_completion (unsigned long *id, +struct blkfront_ring_info *rinfo, +struct blkif_response *bret) {int i =0 ;struct scatterlist *sg;
@@ -1461,7 +1468,7 @@ static bool blkif_completion(unsigned lo/* Wait the second response if not yet here. */ if (s2->status <REQ_DONE ) -return false; +return 0 ; bret->status =blkif_get_final_status (s->status, s2->status);
@@ -1512,42 +1519,43 @@ static bool blkif_completion(unsigned lo }/* Add the persistent grant into the list of free grants */ for (i =0 ; i < num_grant; i++) { -if (gnttab_query_foreign_access (s->grants_used[i]->gref)) { +if (!gnttab_try_end_foreign_access (s->grants_used[i]->gref)) {/* * If the grant is still mapped by the backend (the * backend has chosen to make this grant persistent) * we add it at the head of the list, so it will be * reused first. */ -if (!info->feature_persistent) -pr_alert_ratelimited ("backed has not unmapped grant: %u\n" , - s->grants_used[i]->gref); +if (!info->feature_persistent) { +pr_alert ("backed has not unmapped grant: %u\n" , + s->grants_used[i]->gref); +return -1 ; + }list_add (&s->grants_used[i]->node, &rinfo->grants); rinfo->persistent_gnts_c++; }else {/* -* If the grant is not mapped by the backend we end the -* foreign access and add it to the tail of the list, -* so it will not be picked again unless we run out of -* persistent grants. +* If the grant is not mapped by the backend we add it +* to the tail of the list, so it will not be picked +* again unless we run out of persistent grants. */ -gnttab_end_foreign_access (s->grants_used[i]->gref,0 ,0UL ); s->grants_used[i]->gref =GRANT_INVALID_REF ;list_add_tail (&s->grants_used[i]->node, &rinfo->grants); } }if (s->req.operation ==BLKIF_OP_INDIRECT ) {for (i =0 ; i <INDIRECT_GREFS (num_grant); i++) { -if (gnttab_query_foreign_access (s->indirect_grants[i]->gref)) { -if (!info->feature_persistent) -pr_alert_ratelimited ("backed has not unmapped grant: %u\n" , - s->indirect_grants[i]->gref); +if (!gnttab_try_end_foreign_access (s->indirect_grants[i]->gref)) { +if (!info->feature_persistent) { +pr_alert ("backed has not unmapped grant: %u\n" , + s->indirect_grants[i]->gref); +return -1 ; + }list_add (&s->indirect_grants[i]->node, &rinfo->grants); rinfo->persistent_gnts_c++; }else {struct page *indirect_page; -gnttab_end_foreign_access (s->indirect_grants[i]->gref,0 ,0UL );/* * Add the used indirect page back to the list of * available pages for indirect grefs.
@@ -1562,7 +1570,7 @@ static bool blkif_completion(unsigned lo } } -return true; +return 1 ; }static irqreturn_t blkif_interrupt (int irq,void *dev_id)
@@ -1628,12 +1636,17 @@ static irqreturn_t blkif_interrupt(int i }if (bret.operation !=BLKIF_OP_DISCARD ) { +int ret; +/* * We may need to wait for an extra response if the * I/O request is split in 2 */ -if (!blkif_completion (&id, rinfo, &bret)) + ret =blkif_completion (&id, rinfo, &bret); +if (!ret)continue ; +if (unlikely (ret <0 )) + goto err; }if (add_id_to_freelist (rinfo, id)) {
@@ -1740,8 +1753,7 @@ static int setup_blkring(struct xenbus_dfor (i =0 ; i < info->nr_ring_pages; i++) rinfo->ring_ref[i] =GRANT_INVALID_REF ; - sring = (struct blkif_sring *)__get_free_pages (GFP_NOIO | __GFP_HIGH, -get_order (ring_size)); + sring =alloc_pages_exact (ring_size,GFP_NOIO );if (!sring) {xenbus_dev_fatal (dev, -ENOMEM ,"allocating shared ring" );return -ENOMEM ;
@@ -1751,7 +1763,7 @@ static int setup_blkring(struct xenbus_d err =xenbus_grant_ring (dev, rinfo->ring.sring, info->nr_ring_pages, gref);if (err <0 ) { -free_pages ((unsigned long )sring,get_order (ring_size)); +free_pages_exact (sring, ring_size); rinfo->ring.sring =NULL ; goto fail; }
@@ -2729,11 +2741,10 @@ static void purge_persistent_grants(strulist_for_each_entry_safe (gnt_list_entry, tmp, &rinfo->grants, node) {if (gnt_list_entry->gref ==GRANT_INVALID_REF || -gnttab_query_foreign_access (gnt_list_entry->gref)) + !gnttab_try_end_foreign_access (gnt_list_entry->gref))continue ;list_del (&gnt_list_entry->node); -gnttab_end_foreign_access (gnt_list_entry->gref,0 ,0UL ); rinfo->persistent_gnts_c--; gnt_list_entry->gref =GRANT_INVALID_REF ;list_add_tail (&gnt_list_entry->node, &rinfo->grants);
Greg Kroah-Hartman
maintainerPATCH 50/58 xen/netfront: dont use gnttab_query_foreign_access() for mapped status
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 31185df7e2b1d2fa1de4900247a12d7b9c7087eb upstream.
It isn't enough to check whether a grant is still being in use by calling gnttab_query_foreign_access(), as a mapping could be realized by the other side just after having called that function.
In case the call was done in preparation of revoking a grant it is better to do so via gnttab_end_foreign_access_ref() and check the success of that operation instead.
This is CVE-2022-23037 / part of XSA-396.
--- drivers/net/xen-netfront.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/net/xen-netfront.c +2 -4
@@ -424,14 +424,12 @@ static bool xennet_tx_buf_gc(struct netf queue->tx_link[id] =TX_LINK_NONE ; skb = queue->tx_skbs[id]; queue->tx_skbs[id] =NULL ; -if (unlikely (gnttab_query_foreign_access ( - queue->grant_tx_ref[id]) !=0 )) { +if (unlikely (!gnttab_end_foreign_access_ref ( + queue->grant_tx_ref[id], GNTMAP_readonly))) {dev_alert (dev,"Grant still in use by backend domain\n" ); goto err; } -gnttab_end_foreign_access_ref ( - queue->grant_tx_ref[id], GNTMAP_readonly);gnttab_release_grant_reference ( &queue->gref_tx_head, queue->grant_tx_ref[id]); queue->grant_tx_ref[id] =GRANT_INVALID_REF ;
Greg Kroah-Hartman
maintainerPATCH 51/58 xen/scsifront: dont use gnttab_query_foreign_access() for mapped status
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 33172ab50a53578a95691310f49567c9266968b0 upstream.
It isn't enough to check whether a grant is still being in use by calling gnttab_query_foreign_access(), as a mapping could be realized by the other side just after having called that function.
In case the call was done in preparation of revoking a grant it is better to do so via gnttab_try_end_foreign_access() and check the success of that operation instead.
This is CVE-2022-23038 / part of XSA-396.
--- drivers/scsi/xen-scsifront.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/xen-scsifront.c +1 -2
@@ -233,12 +233,11 @@ static void scsifront_gnttab_done(structreturn ;for (i =0 ; i < shadow->nr_grants; i++) { -if (unlikely (gnttab_query_foreign_access (shadow->gref[i]))) { +if (unlikely (!gnttab_try_end_foreign_access (shadow->gref[i]))) {shost_printk (KERN_ALERT , info->host,KBUILD_MODNAME "grant still in use by backend\n" );BUG (); } -gnttab_end_foreign_access (shadow->gref[i],0 ,0UL ); }kfree (shadow->sg);
Greg Kroah-Hartman
maintainerPATCH 52/58 xen/gntalloc: dont use gnttab_query_foreign_access()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit d3b6372c5881cb54925212abb62c521df8ba4809 upstream.
Using gnttab_query_foreign_access() is unsafe, as it is racy by design.
The use case in the gntalloc driver is not needed at all. While at it replace the call of gnttab_end_foreign_access_ref() with a call of gnttab_end_foreign_access(), which is what is really wanted there. In case the grant wasn't used due to an allocation failure, just free the grant via gnttab_free_grant_reference().
This is CVE-2022-23039 / part of XSA-396.
--- drivers/xen/gntalloc.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-)
drivers/xen/gntalloc.c +7 -18
@@ -169,20 +169,14 @@ undo:__del_gref (gref); } -/* It's possible for the target domain to map the just-allocated grant -* references by blindly guessing their IDs; if this is done, then -* __del_gref will leave them in the queue_gref list. They need to be -* added to the global list so that we can free them when they are no -* longer referenced. -*/ -if (unlikely (!list_empty (&queue_gref))) -list_splice_tail (&queue_gref, &gref_list);mutex_unlock (&gref_mutex);return rc; }static void __del_gref (struct gntalloc_gref *gref) { +unsigned long addr; +if (gref->notify.flags &UNMAP_NOTIFY_CLEAR_BYTE ) {uint8_t *tmp =kmap (gref->page); tmp[gref->notify.pgoff] =0 ;
@@ -196,21 +190,16 @@ static void __del_gref(struct gntalloc_g gref->notify.flags =0 ;if (gref->gref_id) { -if (gnttab_query_foreign_access (gref->gref_id)) -return ; - -if (!gnttab_end_foreign_access_ref (gref->gref_id,0 )) -return ; - -gnttab_free_grant_reference (gref->gref_id); +if (gref->page) { + addr = (unsigned long )page_to_virt (gref->page); +gnttab_end_foreign_access (gref->gref_id,0 , addr); + }else +gnttab_free_grant_reference (gref->gref_id); } gref_size--;list_del (&gref->next_gref); -if (gref->page) -__free_page (gref->page); -kfree (gref); }
Greg Kroah-Hartman
maintainerPATCH 53/58 xen: remove gnttab_query_foreign_access()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 1dbd11ca75fe664d3e54607547771d021f531f59 upstream.
Remove gnttab_query_foreign_access(), as it is unused and unsafe to use.
All previous use cases assumed a grant would not be in use after gnttab_query_foreign_access() returned 0. This information is useless in best case, as it only refers to a situation in the past, which could have changed already.
--- drivers/xen/grant-table.c | 25 ------------------------- include/xen/grant_table.h | 2 -- 2 files changed, 27 deletions(-)
drivers/xen/grant-table.c +0 -25
@@ -133,13 +133,6 @@ struct gnttab_ops {* return the frame. */ unsigned long (*end_foreign_transfer_ref)(grant_ref_t ref); -/* -* Query the status of a grant entry. Ref parameter is reference of -* queried grant entry, return value is the status of queried entry. -* Detailed status(writing/reading) can be gotten from the return value -* by bit operations. -*/ -int (*query_foreign_access)(grant_ref_t ref); };struct unmap_refs_callback_data {
@@ -284,22 +277,6 @@ int gnttab_grant_foreign_access(domid_t }EXPORT_SYMBOL_GPL (gnttab_grant_foreign_access); -static int gnttab_query_foreign_access_v1 (grant_ref_t ref) -{ -return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing); -} - -static int gnttab_query_foreign_access_v2 (grant_ref_t ref) -{ -return grstatus[ref] & (GTF_reading|GTF_writing); -} - -int gnttab_query_foreign_access (grant_ref_t ref) -{ -return gnttab_interface->query_foreign_access (ref); -} -EXPORT_SYMBOL_GPL (gnttab_query_foreign_access); -static int gnttab_end_foreign_access_ref_v1 (grant_ref_t ref,int readonly) {u16 flags, nflags;
@@ -1427,7 +1404,6 @@ static const struct gnttab_ops gnttab_v1 .update_entry = gnttab_update_entry_v1, .end_foreign_access_ref = gnttab_end_foreign_access_ref_v1, .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v1, - .query_foreign_access = gnttab_query_foreign_access_v1, };static const struct gnttab_ops gnttab_v2_ops = {
@@ -1439,7 +1415,6 @@ static const struct gnttab_ops gnttab_v2 .update_entry = gnttab_update_entry_v2, .end_foreign_access_ref = gnttab_end_foreign_access_ref_v2, .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2, - .query_foreign_access = gnttab_query_foreign_access_v2, };static bool gnttab_need_v2 (void )
include/xen/grant_table.h +0 -2
@@ -118,8 +118,6 @@ int gnttab_grant_foreign_transfer(domid_unsigned long gnttab_end_foreign_transfer_ref (grant_ref_t ref);unsigned long gnttab_end_foreign_transfer (grant_ref_t ref); -int gnttab_query_foreign_access (grant_ref_t ref); -/* * operations on reserved batches of grant references */
Greg Kroah-Hartman
maintainerPATCH 54/58 xen/9p: use alloc/free_pages_exact()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 5cadd4bb1d7fc9ab201ac14620d1a478357e4ebd upstream.
Instead of __get_free_pages() and free_pages() use alloc_pages_exact() and free_pages_exact(). This is in preparation of a change of gnttab_end_foreign_access() which will prohibit use of high-order pages.
By using the local variable "order" instead of ring->intf->ring_order in the error path of xen_9pfs_front_alloc_dataring() another bug is fixed, as the error path can be entered before ring->intf->ring_order is being set.
By using alloc_pages_exact() the size in bytes is specified for the allocation, which fixes another bug for the case of order < (PAGE_SHIFT - XEN_PAGE_SHIFT).
This is part of CVE-2022-23041 / XSA-396.
--- net/9p/trans_xen.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
net/9p/trans_xen.c +6 -8
@@ -304,9 +304,9 @@ static void xen_9pfs_front_free(struct x ref = priv->rings[i].intf->ref[j];gnttab_end_foreign_access (ref,0 ,0 ); } -free_pages ((unsigned long )priv->rings[i].data.in, - priv->rings[i].intf->ring_order - - (PAGE_SHIFT -XEN_PAGE_SHIFT )); +free_pages_exact (priv->rings[i].data.in, +1UL << (priv->rings[i].intf->ring_order + +XEN_PAGE_SHIFT )); }gnttab_end_foreign_access (priv->rings[i].ref,0 ,0 );free_page ((unsigned long )priv->rings[i].intf);
@@ -345,8 +345,8 @@ static int xen_9pfs_front_alloc_dataringif (ret <0 ) goto out; ring->ref = ret; - bytes = (void *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, - order - (PAGE_SHIFT -XEN_PAGE_SHIFT )); + bytes =alloc_pages_exact (1UL << (order +XEN_PAGE_SHIFT ), +GFP_KERNEL | __GFP_ZERO);if (!bytes) { ret = -ENOMEM ; goto out;
@@ -377,9 +377,7 @@ out:if (bytes) {for (i--; i >=0 ; i--)gnttab_end_foreign_access (ring->intf->ref[i],0 ,0 ); -free_pages ((unsigned long )bytes, - ring->intf->ring_order - - (PAGE_SHIFT -XEN_PAGE_SHIFT )); +free_pages_exact (bytes,1UL << (order +XEN_PAGE_SHIFT )); }gnttab_end_foreign_access (ring->ref,0 ,0 );free_page ((unsigned long )ring->intf);
Greg Kroah-Hartman
maintainerPATCH 55/58 xen/pvcalls: use alloc/free_pages_exact()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit b0576cc9c6b843d99c6982888d59a56209341888 upstream.
Instead of __get_free_pages() and free_pages() use alloc_pages_exact() and free_pages_exact(). This is in preparation of a change of gnttab_end_foreign_access() which will prohibit use of high-order pages.
This is part of CVE-2022-23041 / XSA-396.
--- drivers/xen/pvcalls-front.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/xen/pvcalls-front.c +4 -4
@@ -337,8 +337,8 @@ static void free_active_ring(struct sockif (!map->active.ring)return ; -free_pages ((unsigned long )map->active.data.in, - map->active.ring->ring_order); +free_pages_exact (map->active.data.in, +PAGE_SIZE << map->active.ring->ring_order);free_page ((unsigned long )map->active.ring); }
@@ -352,8 +352,8 @@ static int alloc_active_ring(struct sock goto out; map->active.ring->ring_order =PVCALLS_RING_ORDER ; - bytes = (void *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, -PVCALLS_RING_ORDER ); + bytes =alloc_pages_exact (PAGE_SIZE <<PVCALLS_RING_ORDER , +GFP_KERNEL | __GFP_ZERO);if (!bytes) goto out;
Greg Kroah-Hartman
maintainerPATCH 56/58 xen/gnttab: fix gnttab_end_foreign_access() without page specified
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 42baefac638f06314298087394b982ead9ec444b upstream.
gnttab_end_foreign_access() is used to free a grant reference and optionally to free the associated page. In case the grant is still in use by the other side processing is being deferred. This leads to a problem in case no page to be freed is specified by the caller: the caller doesn't know that the page is still mapped by the other side and thus should not be used for other purposes.
The correct way to handle this situation is to take an additional reference to the granted page in case handling is being deferred and to drop that reference when the grant reference could be freed finally.
This requires that there are no users of gnttab_end_foreign_access() left directly repurposing the granted page after the call, as this might result in clobbered data or information leaks via the not yet freed grant reference.
This is part of CVE-2022-23041 / XSA-396.
--- drivers/xen/grant-table.c | 36 +++++++++++++++++++++++++++++------- include/xen/grant_table.h | 7 ++++++- 2 files changed, 35 insertions(+), 8 deletions(-)
drivers/xen/grant-table.c +29 -7
@@ -133,6 +133,10 @@ struct gnttab_ops {* return the frame. */ unsigned long (*end_foreign_transfer_ref)(grant_ref_t ref); +/* +* Read the frame number related to a given grant reference. +*/ +unsigned long (*read_frame)(grant_ref_t ref); };struct unmap_refs_callback_data {
@@ -330,6 +334,16 @@ int gnttab_end_foreign_access_ref(grant_ }EXPORT_SYMBOL_GPL (gnttab_end_foreign_access_ref); +static unsigned long gnttab_read_frame_v1 (grant_ref_t ref) +{ +return gnttab_shared.v1[ref].frame; +} + +static unsigned long gnttab_read_frame_v2 (grant_ref_t ref) +{ +return gnttab_shared.v2[ref].full_page.frame; +} +struct deferred_entry {struct list_head list;grant_ref_t ref;
@@ -359,12 +373,9 @@ static void gnttab_handle_deferred(strucspin_unlock_irqrestore (&gnttab_list_lock, flags);if (_gnttab_end_foreign_access_ref (entry->ref, entry->ro)) {put_free_entry (entry->ref); -if (entry->page) { -pr_debug ("freeing g.e. %#x (pfn %#lx)\n" , - entry->ref,page_to_pfn (entry->page)); -put_page (entry->page); - }else -pr_info ("freeing g.e. %#x\n" , entry->ref); +pr_debug ("freeing g.e. %#x (pfn %#lx)\n" , + entry->ref,page_to_pfn (entry->page)); +put_page (entry->page);kfree (entry); entry =NULL ; }else {
@@ -389,9 +400,18 @@ static void gnttab_handle_deferred(strucstatic void gnttab_add_deferred (grant_ref_t ref,bool readonly,struct page *page) { -struct deferred_entry *entry =kmalloc (sizeof (*entry),GFP_ATOMIC ); +struct deferred_entry *entry; +gfp_t gfp = (in_atomic () ||irqs_disabled ()) ?GFP_ATOMIC :GFP_KERNEL ;const char *what =KERN_WARNING "leaking" ; + entry =kmalloc (sizeof (*entry), gfp); +if (!page) { +unsigned long gfn = gnttab_interface->read_frame (ref); + + page =pfn_to_page (gfn_to_pfn (gfn)); +get_page (page); + } +if (entry) {unsigned long flags;
@@ -1404,6 +1424,7 @@ static const struct gnttab_ops gnttab_v1 .update_entry = gnttab_update_entry_v1, .end_foreign_access_ref = gnttab_end_foreign_access_ref_v1, .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v1, + .read_frame = gnttab_read_frame_v1, };static const struct gnttab_ops gnttab_v2_ops = {
@@ -1415,6 +1436,7 @@ static const struct gnttab_ops gnttab_v2 .update_entry = gnttab_update_entry_v2, .end_foreign_access_ref = gnttab_end_foreign_access_ref_v2, .end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2, + .read_frame = gnttab_read_frame_v2, };static bool gnttab_need_v2 (void )
include/xen/grant_table.h +6 -1
@@ -100,7 +100,12 @@ int gnttab_end_foreign_access_ref(grant_* Note that the granted page might still be accessed (read or write) by the * other side after gnttab_end_foreign_access() returns, so even if page was * specified as 0 it is not allowed to just reuse the page for other -* purposes immediately. +* purposes immediately. gnttab_end_foreign_access() will take an additional +* reference to the granted page in this case, which is dropped only after +* the grant is no longer in use. +* This requires that multi page allocations for areas subject to +* gnttab_end_foreign_access() are done via alloc_pages_exact() (and freeing +* via free_pages_exact()) in order to avoid high order pages. */ void gnttab_end_foreign_access (grant_ref_t ref,int readonly,unsigned long page);
Greg Kroah-Hartman
maintainerPATCH 57/58 xen/netfront: react properly to failing gnttab_end_foreign_access_ref()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
Commit 66e3531b33ee51dad17c463b4d9c9f52e341503d upstream.
When calling gnttab_end_foreign_access_ref() the returned value must be tested and the reaction to that value should be appropriate.
In case of failure in xennet_get_responses() the reaction should not be to crash the system, but to disable the network device.
The calls in setup_netfront() can be replaced by calls of gnttab_end_foreign_access(). While at it avoid double free of ring pages and grant references via xennet_disconnect_backend() in this case.
This is CVE-2022-23042 / part of XSA-396.
--- drivers/net/xen-netfront.c | 48 +++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 17 deletions(-)
drivers/net/xen-netfront.c +31 -17
@@ -990,7 +990,6 @@ static int xennet_get_responses(struct nstruct device *dev = &queue->info->netdev->dev;struct bpf_prog *xdp_prog;struct xdp_buff xdp; -unsigned long ret;int slots =1 ;int err =0 ;u32 verdict;
@@ -1032,8 +1031,13 @@ static int xennet_get_responses(struct n goto next; } - ret =gnttab_end_foreign_access_ref (ref,0 ); -BUG_ON (!ret); +if (!gnttab_end_foreign_access_ref (ref,0 )) { +dev_alert (dev, +"Grant still in use by backend domain\n" ); + queue->info->broken = true; +dev_alert (dev,"Disabled for further use\n" ); +return -EINVAL ; + }gnttab_release_grant_reference (&queue->gref_rx_head, ref);
@@ -1254,6 +1258,10 @@ static int xennet_poll(struct napi_struc &need_xdp_flush);if (unlikely (err)) { +if (queue->info->broken) { +spin_unlock (&queue->rx_lock); +return 0 ; + } err:while ((skb =__skb_dequeue (&tmpq)))__skb_queue_tail (&errq, skb);
@@ -1918,7 +1926,7 @@ static int setup_netfront(struct xenbus_ struct netfront_queue *queue, unsigned int feature_split_evtchn) { struct xen_netif_tx_sring *txs; -struct xen_netif_rx_sring *rxs; +struct xen_netif_rx_sring *rxs =NULL ;grant_ref_t gref;int err;
@@ -1938,21 +1946,21 @@ static int setup_netfront(struct xenbus_ err =xenbus_grant_ring (dev, txs,1 , &gref);if (err <0 ) - goto grant_tx_ring_fail; + goto fail; queue->tx_ring_ref = gref; rxs = (struct xen_netif_rx_sring *)get_zeroed_page (GFP_NOIO | __GFP_HIGH);if (!rxs) { err = -ENOMEM ;xenbus_dev_fatal (dev, err,"allocating rx ring page" ); - goto alloc_rx_ring_fail; + goto fail; }SHARED_RING_INIT (rxs);FRONT_RING_INIT (&queue->rx, rxs,XEN_PAGE_SIZE ); err =xenbus_grant_ring (dev, rxs,1 , &gref);if (err <0 ) - goto grant_rx_ring_fail; + goto fail; queue->rx_ring_ref = gref;if (feature_split_evtchn)
@@ -1965,22 +1973,28 @@ static int setup_netfront(struct xenbus_ err =setup_netfront_single (queue);if (err) - goto alloc_evtchn_fail; + goto fail;return 0 ;/* If we fail to setup netfront, it is safe to just revoke access to * granted pages because backend is not accessing it at this point. */ -alloc_evtchn_fail: -gnttab_end_foreign_access_ref (queue->rx_ring_ref,0 ); -grant_rx_ring_fail: -free_page ((unsigned long )rxs); -alloc_rx_ring_fail: -gnttab_end_foreign_access_ref (queue->tx_ring_ref,0 ); -grant_tx_ring_fail: -free_page ((unsigned long )txs); -fail: + fail: +if (queue->rx_ring_ref !=GRANT_INVALID_REF ) { +gnttab_end_foreign_access (queue->rx_ring_ref,0 , + (unsigned long )rxs); + queue->rx_ring_ref =GRANT_INVALID_REF ; + }else { +free_page ((unsigned long )rxs); + } +if (queue->tx_ring_ref !=GRANT_INVALID_REF ) { +gnttab_end_foreign_access (queue->tx_ring_ref,0 , + (unsigned long )txs); + queue->tx_ring_ref =GRANT_INVALID_REF ; + }else { +free_page ((unsigned long )txs); + }return err; }
Greg Kroah-Hartman
maintainerPATCH 58/58 Revert "ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE"
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
This reverts commit 48e413087de1bc688ad732839efc0a5627f38d34 which is commit dc0075ba7f387fe4c48a8c674b11ab6f374a6acc upstream.
It's been reported to cause problems with a number of Fedora and Arch Linux users, so drop it for now until that is resolved.
--- drivers/acpi/ec.c | 10 ---------- drivers/acpi/sleep.c | 14 ++++++++++---- 2 files changed, 10 insertions(+), 14 deletions(-)
drivers/acpi/ec.c +0 -10
@@ -2065,16 +2065,6 @@ bool acpi_ec_dispatch_gpe(void)return true;/* -* Cancel the SCI wakeup and process all pending events in case there -* are any wakeup ones in there. -* -* Note that if any non-EC GPEs are active at this point, the SCI will -* retrigger after the rearming in acpi_s2idle_wake(), so no events -* should be missed by canceling the wakeup here. -*/ -pm_system_cancel_wakeup (); - -/* * Dispatch the EC GPE in-band, but do not report wakeup in any case * to allow the caller to process events properly after that. */
drivers/acpi/sleep.c +10 -4
@@ -1012,15 +1012,21 @@ static bool acpi_s2idle_wake(void)return true; } -/* -* Check non-EC GPE wakeups and if there are none, cancel the -* SCI-related wakeup and dispatch the EC GPE. -*/ +/* Check non-EC GPE wakeups and dispatch the EC GPE. */ if (acpi_ec_dispatch_gpe ()) {pm_pr_dbg ("ACPI non-EC GPE wakeup\n" );return true; } +/* +* Cancel the SCI wakeup and process all pending events in case +* there are any wakeup ones in there. +* +* Note that if any non-EC GPEs are active at this point, the +* SCI will retrigger after the rearming below, so no events +* should be missed by canceling the wakeup here. +*/ +pm_system_cancel_wakeup ();acpi_os_wait_events_complete ();/*
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.10.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.10:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
75 tests: 75 pass, 0 failLinux version: 5.10.105-rc2-g222eae858936
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
Build results:
total: 161 pass: 161 fail: 0 Qemu test results: total: 477 pass: 477 fail: 0
Guenter
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Successfully cross-compiled for arm64 (bcm2711_defconfig, gcc 10.2.0) and powerpc (ps3_defconfig, gcc 11.2.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.2.1 20220301): 63 configs -> no new failure arm (gcc version 11.2.1 20220301): 105 configs -> no new failure arm64 (gcc version 11.2.1 20220301): 3 configs -> no failure x86_64 (gcc version 11.2.1 20220301): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
[1]. https://openqa.qa.codethink.co.uk/tests/862
[2]. https://openqa.qa.codethink.co.uk/tests/867
--
Regards
Sudip
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.10.105-rc2
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git branch: linux-5.10.y
* git commit: 222eae85893657f02832253fe1c164f7d0b2c88c
* git describe: v5.10.104-59-g222eae858936
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.104-59-g222eae858936
## Test Regressions (compared to v5.10.104-43-ge5e4a8f0fb6e) No test regressions found.
## Metric Regressions (compared to v5.10.104-43-ge5e4a8f0fb6e) No metric regressions found.
## Test Fixes (compared to v5.10.104-43-ge5e4a8f0fb6e) No test fixes found.
## Metric Fixes (compared to v5.10.104-43-ge5e4a8f0fb6e) No metric fixes found.
## Test result summary
total: 103231, pass: 87446, fail: 919, skip: 13751, xfail: 1115
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 291 total, 291 passed, 0 failed
* arm64: 41 total, 41 passed, 0 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 40 total, 40 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 37 total, 37 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 60 total, 46 passed, 14 failed
* riscv: 27 total, 27 passed, 0 failed
* s390: 21 total, 21 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x15: 1 total, 1 passed, 0 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 41 total, 41 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-bpf
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* perf/Zstd-perf.data-compression
* rcutorture
* ssuite
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.105 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 12 Mar 2022 14:07:58 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.105-rc2.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
5.10.105-rc2 Successfully Compiled and booted on my Raspberry PI 4b (8g) (bcm2711)