aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/ppcp7/cache.h37
1 files changed, 27 insertions, 10 deletions
diff --git a/include/ppcp7/cache.h b/include/ppcp7/cache.h
index ecbec1c..64389ae 100644
--- a/include/ppcp7/cache.h
+++ b/include/ppcp7/cache.h
@@ -17,16 +17,33 @@
#include <stdint.h>
// XXX FIXME: Use proper CI load/store */
-#define cache_inhibited_access(type,name) \
- static inline type ci_read_##name(type * addr) \
- { \
- type val; \
- val = *addr; \
- return val; \
- } \
- static inline void ci_write_##name(type * addr, type data) \
- { \
- *addr = data; \
+#define cache_inhibited_access(type,size) \
+ static inline type ci_read_##size(type * addr) \
+ { \
+ type val; \
+ register int bytes asm ("r4") = size / 8; \
+ register uint64_t _addr asm ("r5") = (long)addr; \
+ asm volatile(" li 3, 0x3c \n" /* H_LOGICAL_CI_LOAD */ \
+ ".long 0x44000022 \n" /* HVCALL */ \
+ " cmpdi cr0,3,0 \n" \
+ " mr %0,4 \n" \
+ " beq 0f \n" \
+ " li %0,-1 \n" \
+ "0:\n" \
+ : "=r"(val) \
+ : "r"(bytes), "r"(_addr) \
+ : "r3", "memory", "cr0"); \
+ return val; \
+ } \
+ static inline void ci_write_##size(type * addr, type data) \
+ { \
+ register int bytes asm ("r4") = size / 8; \
+ register uint64_t _addr asm ("r5") = (uint64_t)addr; \
+ register uint64_t _data asm ("r6") = (uint64_t)data; \
+ asm volatile(" li 3, 0x40 \n" /* H_LOGICAL_CI_STORE */ \
+ ".long 0x44000022 \n" /* HVCALL */ \
+ : : "r"(bytes), "r"(_addr), "r"(_data) \
+ : "r3", "memory"); \
}
cache_inhibited_access(uint8_t, 8)