| 1 | |
| 2 | |
| 3 | * Copyright (C) 2017 ARM Ltd.
|
| 4 |
|
| 5 |
|
| 6 | #include <linux/uaccess.h>
|
| 7 | #include <asm/barrier.h>
|
| 8 | #include <asm/cacheflush.h>
|
| 9 |
|
| 10 | void memcpy_flushcache(void *dst, const void *src, size_t cnt)
|
| 11 | {
|
| 12 | |
| 13 | * We assume this should not be called with @dst pointing to
|
| 14 | * non-cacheable memory, such that we don't need an explicit
|
| 15 | * barrier to order the cache maintenance against the memcpy.
|
| 16 |
|
| 17 | memcpy(dst, src, cnt);
|
| 18 | dcache_clean_pop((unsigned long)dst, (unsigned long)dst + cnt);
|
| 19 | }
|
| 20 | EXPORT_SYMBOL_GPL(memcpy_flushcache);
|
| 21 |
|
| 22 | unsigned long __copy_user_flushcache(void *to, const void __user *from,
|
| 23 | unsigned long n)
|
| 24 | {
|
| 25 | unsigned long rc;
|
| 26 |
|
| 27 | rc = raw_copy_from_user(to, from, n);
|
| 28 |
|
| 29 |
|
| 30 | dcache_clean_pop((unsigned long)to, (unsigned long)to + n - rc);
|
| 31 | return rc;
|
| 32 | }
|