2
0

cache-utils.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #ifndef QEMU_CACHE_UTILS_H
  2. #define QEMU_CACHE_UTILS_H
  3. #if defined(_ARCH_PPC)
  4. struct qemu_cache_conf {
  5. unsigned long dcache_bsize;
  6. unsigned long icache_bsize;
  7. };
  8. extern struct qemu_cache_conf qemu_cache_conf;
  9. void qemu_cache_utils_init(char **envp);
  10. /* mildly adjusted code from tcg-dyngen.c */
  11. static inline void flush_icache_range(unsigned long start, unsigned long stop)
  12. {
  13. unsigned long p, start1, stop1;
  14. unsigned long dsize = qemu_cache_conf.dcache_bsize;
  15. unsigned long isize = qemu_cache_conf.icache_bsize;
  16. start1 = start & ~(dsize - 1);
  17. stop1 = (stop + dsize - 1) & ~(dsize - 1);
  18. for (p = start1; p < stop1; p += dsize) {
  19. asm volatile ("dcbst 0,%0" : : "r"(p) : "memory");
  20. }
  21. asm volatile ("sync" : : : "memory");
  22. start &= start & ~(isize - 1);
  23. stop1 = (stop + isize - 1) & ~(isize - 1);
  24. for (p = start1; p < stop1; p += isize) {
  25. asm volatile ("icbi 0,%0" : : "r"(p) : "memory");
  26. }
  27. asm volatile ("sync" : : : "memory");
  28. asm volatile ("isync" : : : "memory");
  29. }
  30. #else
  31. #define qemu_cache_utils_init(envp) do { (void) (envp); } while (0)
  32. #endif
  33. #endif /* QEMU_CACHE_UTILS_H */