| 1 | |
| 2 | |
| 3 |
|
| 4 | #include <linux/syscalls.h>
|
| 5 | #include <asm/page.h>
|
| 6 | #include <asm/cacheflush.h>
|
| 7 | #include <asm/cachectl.h>
|
| 8 |
|
| 9 | SYSCALL_DEFINE3(cacheflush,
|
| 10 | void __user *, addr,
|
| 11 | unsigned long, bytes,
|
| 12 | int, cache)
|
| 13 | {
|
| 14 | switch (cache) {
|
| 15 | case BCACHE:
|
| 16 | case DCACHE:
|
| 17 | dcache_wb_range((unsigned long)addr,
|
| 18 | (unsigned long)addr + bytes);
|
| 19 | if (cache != BCACHE)
|
| 20 | break;
|
| 21 | fallthrough;
|
| 22 | case ICACHE:
|
| 23 | flush_icache_mm_range(current->mm,
|
| 24 | (unsigned long)addr,
|
| 25 | (unsigned long)addr + bytes);
|
| 26 | break;
|
| 27 | default:
|
| 28 | return -EINVAL;
|
| 29 | }
|
| 30 |
|
| 31 | return 0;
|
| 32 | }
|