[Skiboot] [PATCH 05/13] processor.h: implement sndmsg instructions
Joel Stanley
joel at jms.id.au
Wed May 2 18:37:45 AEST 2018
Clang doesn't know about msgsnd, msgclr, msgsync so grab some of the
infrastructure from the powerpc Linux kernel to define them.
Signed-off-by: Joel Stanley <joel at jms.id.au>
---
include/processor.h | 33 ++++++++++++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/include/processor.h b/include/processor.h
index 925cc7cd8ce1..69ed32df900f 100644
--- a/include/processor.h
+++ b/include/processor.h
@@ -219,6 +219,29 @@
#include <stdint.h>
#include <stdbool.h>
+#ifdef __ASSEMBLY__
+# define stringify_in_c(...) __VA_ARGS__
+# define ASM_CONST(x) x
+#else
+/* This version of stringify will deal with commas... */
+# define __stringify_in_c(...) #__VA_ARGS__
+# define stringify_in_c(...) __stringify_in_c(__VA_ARGS__) " "
+# define __ASM_CONST(x) x##UL
+# define ASM_CONST(x) __ASM_CONST(x)
+#endif
+
+#define PPC_INST_MSGSND 0x7c00019c
+#define PPC_INST_MSGCLR 0x7c0001dc
+#define PPC_INST_MSGSYNC 0x7c0006ec
+
+#define ___PPC_RB(b) (((b) & 0x1f) << 11)
+#define PPC_MSGSND(b) stringify_in_c(.long PPC_INST_MSGSND | \
+ ___PPC_RB(b))
+#define PPC_MSGSYNC stringify_in_c(.long PPC_INST_MSGSYNC)
+#define PPC_MSGCLR(b) stringify_in_c(.long PPC_INST_MSGCLR | \
+ ___PPC_RB(b))
+
+
static inline bool is_power9n(uint32_t version)
{
if (PVR_TYPE(version) != PVR_TYPE_P9)
@@ -328,20 +351,24 @@ static inline void sync_icache(void)
static inline void msgclr(void)
{
uint64_t rb = (0x05 << (63-36));
- asm volatile("msgclr %0" : : "r"(rb));
+ asm volatile(PPC_MSGCLR(%0) : : "r"(rb));
}
static inline void p9_dbell_receive(void)
{
uint64_t rb = (0x05 << (63-36));
/* msgclr ; msgsync ; lwsync */
- asm volatile("msgclr %0 ; .long 0x7c0006ec ; lwsync" : : "r"(rb));
+ asm volatile(PPC_MSGCLR(%0) : : "r"(rb));
+ asm volatile(PPC_MSGSYNC);
+ asm volatile("lwsync");
}
static inline void p9_dbell_send(uint32_t pir)
{
uint64_t rb = (0x05 << (63-36)) | pir;
- asm volatile("sync ; msgsnd %0" : : "r"(rb));
+ /* sync; msgsend %0 */
+ asm volatile("sync" : : );
+ asm volatile(PPC_MSGSND(%0) : : "r"(rb));
}
/*
--
2.17.0
More information about the Skiboot
mailing list