6b0ef2792c
Instead of avoiding CFI entirely on the TLB flush helpers, reorganize the code so that the CFI machinery can deal with it. The important things to take into account are: - functions in asm called indirectly from C need to be defined using SYM_TYPED_FUNC_START() - a reference to the asm function needs to be visible to the compiler, in order to get it to emit the typeid symbol. The latter means that defining the cpu_tlb_fns structs is best done from C code, so that the references in the static initializers will be visible to the compiler. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Tested-by: Kees Cook <keescook@chromium.org> Reviewed-by: Sami Tolvanen <samitolvanen@google.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
61 lines
1.6 KiB
ArmAsm
61 lines
1.6 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* linux/arch/arm/mm/tlbv4wbi.S
|
|
*
|
|
* Copyright (C) 1997-2002 Russell King
|
|
*
|
|
* ARM architecture version 4 and version 5 TLB handling functions.
|
|
* These assume a split I/D TLBs, with a write buffer.
|
|
*
|
|
* Processors: ARM920 ARM922 ARM925 ARM926 XScale
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
#include <linux/cfi_types.h>
|
|
#include <asm/assembler.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/tlbflush.h>
|
|
#include "proc-macros.S"
|
|
|
|
/*
|
|
* v4wb_flush_user_tlb_range(start, end, mm)
|
|
*
|
|
* Invalidate a range of TLB entries in the specified address space.
|
|
*
|
|
* - start - range start address
|
|
* - end - range end address
|
|
* - mm - mm_struct describing address space
|
|
*/
|
|
.align 5
|
|
SYM_TYPED_FUNC_START(v4wbi_flush_user_tlb_range)
|
|
vma_vm_mm ip, r2
|
|
act_mm r3 @ get current->active_mm
|
|
eors r3, ip, r3 @ == mm ?
|
|
retne lr @ no, we dont do anything
|
|
mov r3, #0
|
|
mcr p15, 0, r3, c7, c10, 4 @ drain WB
|
|
vma_vm_flags r2, r2
|
|
bic r0, r0, #0x0ff
|
|
bic r0, r0, #0xf00
|
|
1: tst r2, #VM_EXEC
|
|
mcrne p15, 0, r0, c8, c5, 1 @ invalidate I TLB entry
|
|
mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry
|
|
add r0, r0, #PAGE_SZ
|
|
cmp r0, r1
|
|
blo 1b
|
|
ret lr
|
|
SYM_FUNC_END(v4wbi_flush_user_tlb_range)
|
|
|
|
SYM_TYPED_FUNC_START(v4wbi_flush_kern_tlb_range)
|
|
mov r3, #0
|
|
mcr p15, 0, r3, c7, c10, 4 @ drain WB
|
|
bic r0, r0, #0x0ff
|
|
bic r0, r0, #0xf00
|
|
1: mcr p15, 0, r0, c8, c5, 1 @ invalidate I TLB entry
|
|
mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry
|
|
add r0, r0, #PAGE_SZ
|
|
cmp r0, r1
|
|
blo 1b
|
|
ret lr
|
|
SYM_FUNC_END(v4wbi_flush_kern_tlb_range)
|