syscache.c 623 B

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