aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/io.h
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2015-07-03 10:22:54 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2015-07-03 15:46:15 -0400
commit1bd46782d08b01b73df0085b51ea1021b19b44fd (patch)
tree12f984aae768b67a6406e5e076f0ba17badc11d7 /arch/arm/include/asm/io.h
parent9ab79bb22cc77adcca5ebbadea6caec6a478f283 (diff)
ARM: avoid unwanted GCC memset()/memcpy() optimisations for IO variants
We don't want GCC optimising our memset_io(), memcpy_fromio() or memcpy_toio() variants, so we must not call one of the standard functions. Provide a separate name for our assembly memcpy() and memset() functions, and use that instead, thereby bypassing GCC's ability to optimise these operations. GCCs optimisation may introduce unaligned accesses which are invalid for device mappings. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/include/asm/io.h')
-rw-r--r--arch/arm/include/asm/io.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
index a5ed237c87d9..485982084fe9 100644
--- a/arch/arm/include/asm/io.h
+++ b/arch/arm/include/asm/io.h
@@ -316,21 +316,24 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
316static inline void memset_io(volatile void __iomem *dst, unsigned c, 316static inline void memset_io(volatile void __iomem *dst, unsigned c,
317 size_t count) 317 size_t count)
318{ 318{
319 memset((void __force *)dst, c, count); 319 extern void mmioset(void *, unsigned int, size_t);
320 mmioset((void __force *)dst, c, count);
320} 321}
321#define memset_io(dst,c,count) memset_io(dst,c,count) 322#define memset_io(dst,c,count) memset_io(dst,c,count)
322 323
323static inline void memcpy_fromio(void *to, const volatile void __iomem *from, 324static inline void memcpy_fromio(void *to, const volatile void __iomem *from,
324 size_t count) 325 size_t count)
325{ 326{
326 memcpy(to, (const void __force *)from, count); 327 extern void mmiocpy(void *, const void *, size_t);
328 mmiocpy(to, (const void __force *)from, count);
327} 329}
328#define memcpy_fromio(to,from,count) memcpy_fromio(to,from,count) 330#define memcpy_fromio(to,from,count) memcpy_fromio(to,from,count)
329 331
330static inline void memcpy_toio(volatile void __iomem *to, const void *from, 332static inline void memcpy_toio(volatile void __iomem *to, const void *from,
331 size_t count) 333 size_t count)
332{ 334{
333 memcpy((void __force *)to, from, count); 335 extern void mmiocpy(void *, const void *, size_t);
336 mmiocpy((void __force *)to, from, count);
334} 337}
335#define memcpy_toio(to,from,count) memcpy_toio(to,from,count) 338#define memcpy_toio(to,from,count) memcpy_toio(to,from,count)
336 339