Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / include / ppc970 / cache.h
diff --git a/qemu/roms/SLOF/include/ppc970/cache.h b/qemu/roms/SLOF/include/ppc970/cache.h
new file mode 100644 (file)
index 0000000..b748689
--- /dev/null
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#ifndef __CACHE_H
+#define __CACHE_H
+
+#include <cpu.h>
+#include <stdint.h>
+
+#define cache_inhibited_access(type,name)                      \
+       static inline type ci_read_##name(type * addr)          \
+       {                                                       \
+               type val;                                       \
+               set_ci();                                       \
+               val = *addr;                                    \
+               clr_ci();                                       \
+               return val;                                     \
+       }                                                       \
+       static inline void ci_write_##name(type * addr, type data)      \
+       {                                                       \
+               set_ci();                                       \
+               *addr = data;                                   \
+               clr_ci();                                       \
+       }
+
+cache_inhibited_access(uint8_t,  8)
+cache_inhibited_access(uint16_t, 16)
+cache_inhibited_access(uint32_t, 32)
+cache_inhibited_access(uint64_t, 64)
+
+#define _FWOVERLAP(s, d, size) ((d >= s) && ((type_u)d < ((type_u)s + size)))
+
+// 3.1
+#define _FWMOVE(s, d, size, t) \
+       { t *s1=(t *)s, *d1=(t *)d; \
+               while (size > 0) { *d1++ = *s1++; size -= sizeof(t); } }
+
+#define _BWMOVE(s, d, size, t) { \
+       t *s1=(t *)((char *)s+size), *d1=(t *)((char *)d+size); \
+       while (size > 0) { *--d1 = *--s1; size -= sizeof(t); } \
+}
+
+
+#define        _MOVE(s, d, size, t) if _FWOVERLAP(s, d, size) _BWMOVE(s, d, size, t) else  _FWMOVE(s, d, size, t)
+
+#define _FASTMOVE(s, d, size) \
+       switch (((type_u)s | (type_u)d | size) & (sizeof(type_u)-1)) { \
+               case 0:                 _MOVE(s, d, size, type_u); break; \
+               case sizeof(type_l):    _MOVE(s, d, size, type_l); break; \
+               case sizeof(type_w):    _MOVE(s, d, size, type_w); break; \
+               default:                _MOVE(s, d, size, type_c); break; \
+       }
+
+// Device IO block data helpers
+#define _FWRMOVE(s, d, size, t)        \
+       { t *s1=(t *)s, *d1=(t *)d; SET_CI; \
+               while (size > 0) { *d1++ = *s1++; size -= sizeof(t); } \
+               CLR_CI; \
+}
+
+#define _BWRMOVE(s, d, size, t)        { \
+       t *s1=(t *)((char *)s+size), *d1=(t *)((char *)d+size); SET_CI; \
+       while (size > 0) { *--d1 = *--s1; size -= sizeof(t); } \
+               CLR_CI; \
+}
+
+#define        _RMOVE(s, d, size, t) if _FWOVERLAP(s, d, size) _BWRMOVE(s, d, size, t) else  _FWRMOVE(s, d, size, t)
+
+#define _FASTRMOVE(s, d, size) \
+       switch (((type_u)s | (type_u)d | size) & (sizeof(type_u)-1)) { \
+               case 0:                 _RMOVE(s, d, size, type_u); break; \
+               case sizeof(type_l):    _RMOVE(s, d, size, type_l); break; \
+               case sizeof(type_w):    _RMOVE(s, d, size, type_w); break; \
+               default:                _RMOVE(s, d, size, type_c); break; \
+       }
+
+#endif