00001 #ifndef QEMU_CACHE_UTILS_H
00002 #define QEMU_CACHE_UTILS_H
00003
00004 #if defined(_ARCH_PPC)
00005 struct qemu_cache_conf {
00006 unsigned long dcache_bsize;
00007 unsigned long icache_bsize;
00008 };
00009
00010 extern struct qemu_cache_conf qemu_cache_conf;
00011
00012 extern void qemu_cache_utils_init(char **envp);
00013
00014
00015 static inline void flush_icache_range(unsigned long start, unsigned long stop)
00016 {
00017 unsigned long p, start1, stop1;
00018 unsigned long dsize = qemu_cache_conf.dcache_bsize;
00019 unsigned long isize = qemu_cache_conf.icache_bsize;
00020
00021 start1 = start & ~(dsize - 1);
00022 stop1 = (stop + dsize - 1) & ~(dsize - 1);
00023 for (p = start1; p < stop1; p += dsize) {
00024 asm volatile ("dcbst 0,%0" : : "r"(p) : "memory");
00025 }
00026 asm volatile ("sync" : : : "memory");
00027
00028 start &= start & ~(isize - 1);
00029 stop1 = (stop + isize - 1) & ~(isize - 1);
00030 for (p = start1; p < stop1; p += isize) {
00031 asm volatile ("icbi 0,%0" : : "r"(p) : "memory");
00032 }
00033 asm volatile ("sync" : : : "memory");
00034 asm volatile ("isync" : : : "memory");
00035 }
00036
00037 #else
00038 #define qemu_cache_utils_init(envp) do { (void) (envp); } while (0)
00039 #endif
00040
00041 #endif