FROMLIST: arm: Add BTB invalidation on switch_mm for Cortex-A9, A12 and A17
In order to avoid aliasing attacks against the branch predictor, some implementations require to invalidate the BTB when switching from one user context to another. For this, we reuse the existing implementation for Cortex-A8, and apply it to A9, A12 and A17. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> (cherry picked from git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git kpti commit efcd0e857a656bbd1c1da15ff984ad6402332c61) CVE-2017-5715 Change-Id: Ica839802de678a5456abadf09bb6434efd43da2c Signed-off-by: Tao Huang <huangtao@rock-chips.com>
This commit is contained in:
parent
25cfc3a020
commit
d3e24532c5
3 changed files with 23 additions and 17 deletions
|
|
@ -41,7 +41,7 @@
|
|||
* even on Cortex-A8 revisions not affected by 430973.
|
||||
* If IBE is not set, the flush BTAC/BTB won't do anything.
|
||||
*/
|
||||
ENTRY(cpu_ca8_switch_mm)
|
||||
ENTRY(cpu_v7_btbinv_switch_mm)
|
||||
#ifdef CONFIG_MMU
|
||||
mov r2, #0
|
||||
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
|
||||
|
|
@ -66,7 +66,7 @@ ENTRY(cpu_v7_switch_mm)
|
|||
#endif
|
||||
bx lr
|
||||
ENDPROC(cpu_v7_switch_mm)
|
||||
ENDPROC(cpu_ca8_switch_mm)
|
||||
ENDPROC(cpu_v7_btbinv_switch_mm)
|
||||
|
||||
/*
|
||||
* cpu_v7_set_pte_ext(ptep, pte)
|
||||
|
|
|
|||
|
|
@ -54,6 +54,11 @@
|
|||
* Set the translation table base pointer to be pgd_phys (physical address of
|
||||
* the new TTB).
|
||||
*/
|
||||
ENTRY(cpu_v7_btbinv_switch_mm)
|
||||
#ifdef CONFIG_MMU
|
||||
mov r2, #0
|
||||
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
|
||||
#endif
|
||||
ENTRY(cpu_v7_switch_mm)
|
||||
#ifdef CONFIG_MMU
|
||||
mmid r2, r2
|
||||
|
|
@ -64,6 +69,7 @@ ENTRY(cpu_v7_switch_mm)
|
|||
#endif
|
||||
ret lr
|
||||
ENDPROC(cpu_v7_switch_mm)
|
||||
ENDPROC(cpu_v7_btbinv_switch_mm)
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define rl r3
|
||||
|
|
|
|||
|
|
@ -153,18 +153,18 @@ ENDPROC(cpu_v7_do_resume)
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Cortex-A8
|
||||
* Cortex-A8/A12/A17 that require a BTB invalidation on switch_mm
|
||||
*/
|
||||
globl_equ cpu_ca8_proc_init, cpu_v7_proc_init
|
||||
globl_equ cpu_ca8_proc_fin, cpu_v7_proc_fin
|
||||
globl_equ cpu_ca8_reset, cpu_v7_reset
|
||||
globl_equ cpu_ca8_do_idle, cpu_v7_do_idle
|
||||
globl_equ cpu_ca8_dcache_clean_area, cpu_v7_dcache_clean_area
|
||||
globl_equ cpu_ca8_set_pte_ext, cpu_v7_set_pte_ext
|
||||
globl_equ cpu_ca8_suspend_size, cpu_v7_suspend_size
|
||||
globl_equ cpu_v7_btbinv_proc_init, cpu_v7_proc_init
|
||||
globl_equ cpu_v7_btbinv_proc_fin, cpu_v7_proc_fin
|
||||
globl_equ cpu_v7_btbinv_reset, cpu_v7_reset
|
||||
globl_equ cpu_v7_btbinv_do_idle, cpu_v7_do_idle
|
||||
globl_equ cpu_v7_btbinv_dcache_clean_area, cpu_v7_dcache_clean_area
|
||||
globl_equ cpu_v7_btbinv_set_pte_ext, cpu_v7_set_pte_ext
|
||||
globl_equ cpu_v7_btbinv_suspend_size, cpu_v7_suspend_size
|
||||
#ifdef CONFIG_ARM_CPU_SUSPEND
|
||||
globl_equ cpu_ca8_do_suspend, cpu_v7_do_suspend
|
||||
globl_equ cpu_ca8_do_resume, cpu_v7_do_resume
|
||||
globl_equ cpu_v7_btbinv_do_suspend, cpu_v7_do_suspend
|
||||
globl_equ cpu_v7_btbinv_do_resume, cpu_v7_do_resume
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -175,7 +175,7 @@ ENDPROC(cpu_v7_do_resume)
|
|||
globl_equ cpu_ca9mp_reset, cpu_v7_reset
|
||||
globl_equ cpu_ca9mp_do_idle, cpu_v7_do_idle
|
||||
globl_equ cpu_ca9mp_dcache_clean_area, cpu_v7_dcache_clean_area
|
||||
globl_equ cpu_ca9mp_switch_mm, cpu_v7_switch_mm
|
||||
globl_equ cpu_ca9mp_switch_mm, cpu_v7_btbinv_switch_mm
|
||||
globl_equ cpu_ca9mp_set_pte_ext, cpu_v7_set_pte_ext
|
||||
.globl cpu_ca9mp_suspend_size
|
||||
.equ cpu_ca9mp_suspend_size, cpu_v7_suspend_size + 4 * 2
|
||||
|
|
@ -490,8 +490,8 @@ __v7_setup_stack:
|
|||
|
||||
@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
|
||||
define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
|
||||
define_processor_functions v7_btbinv, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
|
||||
#ifndef CONFIG_ARM_LPAE
|
||||
define_processor_functions ca8, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
|
||||
define_processor_functions ca9mp, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_PJ4B
|
||||
|
|
@ -556,7 +556,7 @@ __v7_ca9mp_proc_info:
|
|||
__v7_ca8_proc_info:
|
||||
.long 0x410fc080
|
||||
.long 0xff0ffff0
|
||||
__v7_proc __v7_ca8_proc_info, __v7_setup, proc_fns = ca8_processor_functions
|
||||
__v7_proc __v7_ca8_proc_info, __v7_setup, proc_fns = v7_btbinv_processor_functions
|
||||
.size __v7_ca8_proc_info, . - __v7_ca8_proc_info
|
||||
|
||||
#endif /* CONFIG_ARM_LPAE */
|
||||
|
|
@ -600,7 +600,7 @@ __v7_ca7mp_proc_info:
|
|||
__v7_ca12mp_proc_info:
|
||||
.long 0x410fc0d0
|
||||
.long 0xff0ffff0
|
||||
__v7_proc __v7_ca12mp_proc_info, __v7_ca12mp_setup
|
||||
__v7_proc __v7_ca12mp_proc_info, __v7_ca12mp_setup, proc_fns = v7_btbinv_processor_functions
|
||||
.size __v7_ca12mp_proc_info, . - __v7_ca12mp_proc_info
|
||||
|
||||
/*
|
||||
|
|
@ -630,7 +630,7 @@ __v7_b15mp_proc_info:
|
|||
__v7_ca17mp_proc_info:
|
||||
.long 0x410fc0e0
|
||||
.long 0xff0ffff0
|
||||
__v7_proc __v7_ca17mp_proc_info, __v7_ca17mp_setup
|
||||
__v7_proc __v7_ca17mp_proc_info, __v7_ca17mp_setup, proc_fns = v7_btbinv_processor_functions
|
||||
.size __v7_ca17mp_proc_info, . - __v7_ca17mp_proc_info
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue