mirror of
https://github.com/torvalds/linux.git
synced 2024-12-21 02:21:36 +00:00
6ebbf2ce43
ARMv6 and greater introduced a new instruction ("bx") which can be used to return from function calls. Recent CPUs perform better when the "bx lr" instruction is used rather than the "mov pc, lr" instruction, and this sequence is strongly recommended to be used by the ARM architecture manual (section A.4.1.1). We provide a new macro "ret" with all its variants for the condition code which will resolve to the appropriate instruction. Rather than doing this piecemeal, and miss some instances, change all the "mov pc" instances to use the new macro, with the exception of the "movs" instruction and the kprobes code. This allows us to detect the "mov pc, lr" case and fix it up - and also gives us the possibility of deploying this for other registers depending on the CPU selection. Reported-by: Will Deacon <will.deacon@arm.com> Tested-by: Stephen Warren <swarren@nvidia.com> # Tegra Jetson TK1 Tested-by: Robert Jarzmik <robert.jarzmik@free.fr> # mioa701_bootresume.S Tested-by: Andrew Lunn <andrew@lunn.ch> # Kirkwood Tested-by: Shawn Guo <shawn.guo@freescale.com> Tested-by: Tony Lindgren <tony@atomide.com> # OMAPs Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com> # Armada XP, 375, 385 Acked-by: Sekhar Nori <nsekhar@ti.com> # DaVinci Acked-by: Christoffer Dall <christoffer.dall@linaro.org> # kvm/hyp Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com> # PXA3xx Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> # Xen Tested-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> # ARMv7M Tested-by: Simon Horman <horms+renesas@verge.net.au> # Shmobile Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
75 lines
1.9 KiB
ArmAsm
75 lines
1.9 KiB
ArmAsm
/*
|
|
* linux/arch/arm/mm/tlbv4wb.S
|
|
*
|
|
* Copyright (C) 1997-2002 Russell King
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* ARM architecture version 4 TLB handling functions.
|
|
* These assume a split I/D TLBs w/o I TLB entry, with a write buffer.
|
|
*
|
|
* Processors: SA110 SA1100 SA1110
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
#include <asm/assembler.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/tlbflush.h>
|
|
#include "proc-macros.S"
|
|
|
|
.align 5
|
|
/*
|
|
* 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
|
|
ENTRY(v4wb_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
|
|
vma_vm_flags r2, r2
|
|
mcr p15, 0, r3, c7, c10, 4 @ drain WB
|
|
tst r2, #VM_EXEC
|
|
mcrne p15, 0, r3, c8, c5, 0 @ invalidate I TLB
|
|
bic r0, r0, #0x0ff
|
|
bic r0, r0, #0xf00
|
|
1: mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry
|
|
add r0, r0, #PAGE_SZ
|
|
cmp r0, r1
|
|
blo 1b
|
|
ret lr
|
|
|
|
/*
|
|
* v4_flush_kern_tlb_range(start, end)
|
|
*
|
|
* Invalidate a range of TLB entries in the specified kernel
|
|
* address range.
|
|
*
|
|
* - start - virtual address (may not be aligned)
|
|
* - end - virtual address (may not be aligned)
|
|
*/
|
|
ENTRY(v4wb_flush_kern_tlb_range)
|
|
mov r3, #0
|
|
mcr p15, 0, r3, c7, c10, 4 @ drain WB
|
|
bic r0, r0, #0x0ff
|
|
bic r0, r0, #0xf00
|
|
mcr p15, 0, r3, c8, c5, 0 @ invalidate I TLB
|
|
1: mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry
|
|
add r0, r0, #PAGE_SZ
|
|
cmp r0, r1
|
|
blo 1b
|
|
ret lr
|
|
|
|
__INITDATA
|
|
|
|
/* define struct cpu_tlb_fns (see <asm/tlbflush.h> and proc-macros.S) */
|
|
define_tlb_functions v4wb, v4wb_tlb_flags
|