|
@@ -149,7 +149,25 @@ memcpy_mcsafe(void *dst, const void *src, size_t cnt)
|
|
|
|
|
|
#ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
|
|
|
#define __HAVE_ARCH_MEMCPY_FLUSHCACHE 1
|
|
|
-void memcpy_flushcache(void *dst, const void *src, size_t cnt);
|
|
|
+void __memcpy_flushcache(void *dst, const void *src, size_t cnt);
|
|
|
+static __always_inline void memcpy_flushcache(void *dst, const void *src, size_t cnt)
|
|
|
+{
|
|
|
+ if (__builtin_constant_p(cnt)) {
|
|
|
+ switch (cnt) {
|
|
|
+ case 4:
|
|
|
+ asm ("movntil %1, %0" : "=m"(*(u32 *)dst) : "r"(*(u32 *)src));
|
|
|
+ return;
|
|
|
+ case 8:
|
|
|
+ asm ("movntiq %1, %0" : "=m"(*(u64 *)dst) : "r"(*(u64 *)src));
|
|
|
+ return;
|
|
|
+ case 16:
|
|
|
+ asm ("movntiq %1, %0" : "=m"(*(u64 *)dst) : "r"(*(u64 *)src));
|
|
|
+ asm ("movntiq %1, %0" : "=m"(*(u64 *)(dst + 8)) : "r"(*(u64 *)(src + 8)));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ __memcpy_flushcache(dst, src, cnt);
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
#endif /* __KERNEL__ */
|