0001
0002
0003
0004 #include <linux/syscalls.h>
0005 #include <asm/page.h>
0006 #include <asm/cacheflush.h>
0007 #include <asm/cachectl.h>
0008
0009 SYSCALL_DEFINE3(cacheflush,
0010 void __user *, addr,
0011 unsigned long, bytes,
0012 int, cache)
0013 {
0014 switch (cache) {
0015 case BCACHE:
0016 case DCACHE:
0017 dcache_wb_range((unsigned long)addr,
0018 (unsigned long)addr + bytes);
0019 if (cache != BCACHE)
0020 break;
0021 fallthrough;
0022 case ICACHE:
0023 flush_icache_mm_range(current->mm,
0024 (unsigned long)addr,
0025 (unsigned long)addr + bytes);
0026 break;
0027 default:
0028 return -EINVAL;
0029 }
0030
0031 return 0;
0032 }