diff options
author | Will Deacon <will.deacon@arm.com> | 2012-04-27 08:08:53 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-05-02 06:12:49 -0400 |
commit | c5102f5935503ebebad46e137d0eef68f272cc16 (patch) | |
tree | 888332340ca07cbd2a648fa603b8b252af02252a /arch/arm/include/asm/cacheflush.h | |
parent | 435a7ef52db7d86e67a009b36cac1457f8972391 (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/include/asm/cacheflush.h')
-rw-r--r-- | arch/arm/include/asm/cacheflush.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 1252a2675ca9..004c1bc95d2b 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
@@ -101,7 +101,7 @@ struct cpu_cache_fns { | |||
101 | void (*flush_user_range)(unsigned long, unsigned long, unsigned int); | 101 | void (*flush_user_range)(unsigned long, unsigned long, unsigned int); |
102 | 102 | ||
103 | void (*coherent_kern_range)(unsigned long, unsigned long); | 103 | void (*coherent_kern_range)(unsigned long, unsigned long); |
104 | void (*coherent_user_range)(unsigned long, unsigned long); | 104 | int (*coherent_user_range)(unsigned long, unsigned long); |
105 | void (*flush_kern_dcache_area)(void *, size_t); | 105 | void (*flush_kern_dcache_area)(void *, size_t); |
106 | 106 | ||
107 | void (*dma_map_area)(const void *, size_t, int); | 107 | void (*dma_map_area)(const void *, size_t, int); |
@@ -142,7 +142,7 @@ extern void __cpuc_flush_kern_all(void); | |||
142 | extern void __cpuc_flush_user_all(void); | 142 | extern void __cpuc_flush_user_all(void); |
143 | extern void __cpuc_flush_user_range(unsigned long, unsigned long, unsigned int); | 143 | extern void __cpuc_flush_user_range(unsigned long, unsigned long, unsigned int); |
144 | extern void __cpuc_coherent_kern_range(unsigned long, unsigned long); | 144 | extern void __cpuc_coherent_kern_range(unsigned long, unsigned long); |
145 | extern void __cpuc_coherent_user_range(unsigned long, unsigned long); | 145 | extern int __cpuc_coherent_user_range(unsigned long, unsigned long); |
146 | extern void __cpuc_flush_dcache_area(void *, size_t); | 146 | extern void __cpuc_flush_dcache_area(void *, size_t); |
147 | 147 | ||
148 | /* | 148 | /* |