cache-utils.h 1.2 KB

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