aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/cache-v7.S
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2012-04-27 08:08:53 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-05-02 06:12:49 -0400
commitc5102f5935503ebebad46e137d0eef68f272cc16 (patch)
tree888332340ca07cbd2a648fa603b8b252af02252a /arch/arm/mm/cache-v7.S
parent435a7ef52db7d86e67a009b36cac1457f8972391 (diff)
ARM: 7408/1: cacheflush: return error to userspace when flushing syscall fails
The cacheflush syscall can fail for two reasons: (1) The arguments are invalid (nonsensical address range or no VMA) (2) The region generates a translation fault on a VIPT or PIPT cache This patch allows do_cache_op to return an error code to userspace in the case of the above. The various coherent_user_range implementations are modified to return 0 in the case of VIVT caches or -EFAULT in the case of an abort on v6/v7 cores. Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/cache-v7.S')
-rw-r--r--arch/arm/mm/cache-v7.S10
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index a655d3da386d..39e3fb3db801 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -13,6 +13,7 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <linux/init.h> 14#include <linux/init.h>
15#include <asm/assembler.h> 15#include <asm/assembler.h>
16#include <asm/errno.h>
16#include <asm/unwind.h> 17#include <asm/unwind.h>
17 18
18#include "proc-macros.S" 19#include "proc-macros.S"
@@ -198,7 +199,6 @@ ENTRY(v7_coherent_user_range)
198 add r12, r12, r2 199 add r12, r12, r2
199 cmp r12, r1 200 cmp r12, r1
200 blo 2b 201 blo 2b
2013:
202 mov r0, #0 202 mov r0, #0
203 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable 203 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable
204 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB 204 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB
@@ -208,13 +208,11 @@ ENTRY(v7_coherent_user_range)
208 208
209/* 209/*
210 * Fault handling for the cache operation above. If the virtual address in r0 210 * Fault handling for the cache operation above. If the virtual address in r0
211 * isn't mapped, just try the next page. 211 * isn't mapped, fail with -EFAULT.
212 */ 212 */
2139001: 2139001:
214 mov r12, r12, lsr #12 214 mov r0, #-EFAULT
215 mov r12, r12, lsl #12 215 mov pc, lr
216 add r12, r12, #4096
217 b 3b
218 UNWIND(.fnend ) 216 UNWIND(.fnend )
219ENDPROC(v7_coherent_kern_range) 217ENDPROC(v7_coherent_kern_range)
220ENDPROC(v7_coherent_user_range) 218ENDPROC(v7_coherent_user_range)