[Skiboot] [RFC PATCH] Use macros rather than static inline for mfspr and mtspr

Balbir Singh bsingharora at gmail.com
Tue Jul 19 13:08:41 AEST 2016

On Wed, Jul 13, 2016 at 04:20:38PM +1000, Stewart Smith wrote:
> Fixes building skiboot without optimization.
> Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
> ---
>  include/processor.h | 27 +++++++++++++++------------
>  1 file changed, 15 insertions(+), 12 deletions(-)

From: Balbir Singh <bsingharora at gmail.com>
Date: Tue, 19 Jul 2016 13:04:08 +1000
Subject: [PATCH] Allow mt/mfspr to compile indepdent of the optimization level

The compiler expects to see a constant value in the asm operations
involving spr's. When compiling with -O0, spr is treated as a
variable on stack when inline (this can be seen from the RTL).

We do two things to fix the issue, we mark the functions as
always_inline and we pass spr as a const so that the value is
propagated as constants to the inline asm statement

Tested with -O0

Signed-off-by: Balbir Singh <bsingharora at gmail.com>
 include/processor.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/include/processor.h b/include/processor.h
index 48bbf90..caca804 100644
--- a/include/processor.h
+++ b/include/processor.h
@@ -235,7 +235,8 @@ static inline void mtmsrd(unsigned long val, int l)
 	asm volatile("mtmsrd %0,%1" : : "r"(val), "i"(l) : "memory");
-static inline unsigned long mfspr(unsigned int spr)
+static inline __attribute__((always_inline))
+unsigned long mfspr(const unsigned int spr)
 	unsigned long val;
@@ -243,7 +244,8 @@ static inline unsigned long mfspr(unsigned int spr)
 	return val;
-static inline void mtspr(unsigned int spr, unsigned long val)
+static inline __attribute__((always_inline))
+void mtspr(const unsigned int spr, unsigned long val)
 	asm volatile("mtspr %0,%1" : : "i"(spr), "r"(val) : "memory");

More information about the Skiboot mailing list