Clang is pickier than GCC for the register size in asm statement. It
expects the register size to match the value size.
The instructions msr/mrs are expecting a 64-bit register. This means the
implementation of the 32-bit helpers is not correct. The easiest
solution is to implement the 32-bit helpers using the 64-bit helpers.
Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Stefano <sstabellini@kernel.org>
/* Access to system registers */
-#define READ_SYSREG32(name) ({ \
- uint32_t _r; \
- asm volatile("mrs %0, "__stringify(name) : "=r" (_r)); \
- _r; })
-#define WRITE_SYSREG32(v, name) do { \
- uint32_t _r = v; \
- asm volatile("msr "__stringify(name)", %0" : : "r" (_r)); \
-} while (0)
+#define READ_SYSREG32(name) ((uint32_t)READ_SYSREG64(name))
+
+#define WRITE_SYSREG32(v, name) WRITE_SYSREG64((uint64_t)v, name)
#define WRITE_SYSREG64(v, name) do { \
uint64_t _r = v; \