[Skiboot] [PATCH 15/16] io: endian annotations and fix

Nicholas Piggin npiggin at gmail.com
Mon Apr 27 21:08:12 AEST 2020


Annotate io accessor pointer types with endian.

sparse caught a bug in memcpy_from_ci, which is fixed.

From: Nicholas Piggin <npiggin at gmail.com>
---
 hw/npu2-opencapi.c           | 12 ++++-----
 include/io.h                 | 48 ++++++++++++++++++------------------
 libc/string/memcpy_from_ci.c |  7 +++++-
 3 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c
index b03aad345..035c6cdc3 100644
--- a/hw/npu2-opencapi.c
+++ b/hw/npu2-opencapi.c
@@ -1427,7 +1427,7 @@ static int64_t npu2_opencapi_pcicfg_read(struct phb *phb, uint32_t bdfn,
 	cfg_addr = SETFIELD(NPU2_CQ_CTL_CONFIG_ADDR_REGISTER_NUMBER,
 			    cfg_addr, offset & ~3u);
 
-	out_be64((uint64_t *)genid_base, cfg_addr);
+	out_be64((beint64_t *)genid_base, cfg_addr);
 	sync();
 
 	switch (size) {
@@ -1437,10 +1437,10 @@ static int64_t npu2_opencapi_pcicfg_read(struct phb *phb, uint32_t bdfn,
 		break;
 	case 2:
 		*((uint16_t *)data) =
-			in_le16((volatile uint16_t *)(genid_base + 128 + (offset & 2)));
+			in_le16((volatile leint16_t *)(genid_base + 128 + (offset & 2)));
 		break;
 	case 4:
-		*((uint32_t *)data) = in_le32((volatile uint32_t *)(genid_base + 128));
+		*((uint32_t *)data) = in_le32((volatile leint32_t *)(genid_base + 128));
 		break;
 	default:
 		return OPAL_PARAMETER;
@@ -1485,7 +1485,7 @@ static int64_t npu2_opencapi_pcicfg_write(struct phb *phb, uint32_t bdfn,
 	cfg_addr = SETFIELD(NPU2_CQ_CTL_CONFIG_ADDR_REGISTER_NUMBER,
 			    cfg_addr, offset & ~3u);
 
-	out_be64((uint64_t *)genid_base, cfg_addr);
+	out_be64((beint64_t *)genid_base, cfg_addr);
 	sync();
 
 	switch (size) {
@@ -1494,11 +1494,11 @@ static int64_t npu2_opencapi_pcicfg_write(struct phb *phb, uint32_t bdfn,
 		      data);
 		break;
 	case 2:
-		out_le16((volatile uint16_t *)(genid_base + 128 + (offset & 2)),
+		out_le16((volatile leint16_t *)(genid_base + 128 + (offset & 2)),
 					       data);
 		break;
 	case 4:
-		out_le32((volatile uint32_t *)(genid_base + 128), data);
+		out_le32((volatile leint32_t *)(genid_base + 128), data);
 		break;
 	default:
 		return OPAL_PARAMETER;
diff --git a/include/io.h b/include/io.h
index ecdd3d0bf..f00021dcd 100644
--- a/include/io.h
+++ b/include/io.h
@@ -34,7 +34,7 @@ static inline uint8_t in_8(const volatile uint8_t *addr)
 	return __in_8(addr);
 }
 
-static inline uint16_t __in_be16(const volatile uint16_t *addr)
+static inline uint16_t __in_be16(const volatile beint16_t *addr)
 {
 	__be16 val;
 	asm volatile("lhzcix %0,0,%1" :
@@ -42,13 +42,13 @@ static inline uint16_t __in_be16(const volatile uint16_t *addr)
 	return be16_to_cpu(val);
 }
 
-static inline uint16_t in_be16(const volatile uint16_t *addr)
+static inline uint16_t in_be16(const volatile beint16_t *addr)
 {
 	sync();
 	return __in_be16(addr);
 }
 
-static inline uint16_t __in_le16(const volatile uint16_t *addr)
+static inline uint16_t __in_le16(const volatile leint16_t *addr)
 {
 	__le16 val;
 	asm volatile("lhzcix %0,0,%1" :
@@ -56,13 +56,13 @@ static inline uint16_t __in_le16(const volatile uint16_t *addr)
 	return le16_to_cpu(val);
 }
 
-static inline uint16_t in_le16(const volatile uint16_t *addr)
+static inline uint16_t in_le16(const volatile leint16_t *addr)
 {
 	sync();
 	return __in_le16(addr);
 }
 
-static inline uint32_t __in_be32(const volatile uint32_t *addr)
+static inline uint32_t __in_be32(const volatile beint32_t *addr)
 {
 	__be32 val;
 	asm volatile("lwzcix %0,0,%1" :
@@ -70,13 +70,13 @@ static inline uint32_t __in_be32(const volatile uint32_t *addr)
 	return be32_to_cpu(val);
 }
 
-static inline uint32_t in_be32(const volatile uint32_t *addr)
+static inline uint32_t in_be32(const volatile beint32_t *addr)
 {
 	sync();
 	return __in_be32(addr);
 }
 
-static inline uint32_t __in_le32(const volatile uint32_t *addr)
+static inline uint32_t __in_le32(const volatile leint32_t *addr)
 {
 	__le32 val;
 	asm volatile("lwzcix %0,0,%1" :
@@ -84,13 +84,13 @@ static inline uint32_t __in_le32(const volatile uint32_t *addr)
 	return le32_to_cpu(val);
 }
 
-static inline uint32_t in_le32(const volatile uint32_t *addr)
+static inline uint32_t in_le32(const volatile leint32_t *addr)
 {
 	sync();
 	return __in_le32(addr);
 }
 
-static inline uint64_t __in_be64(const volatile uint64_t *addr)
+static inline uint64_t __in_be64(const volatile beint64_t *addr)
 {
 	__be64 val;
 	asm volatile("ldcix %0,0,%1" :
@@ -98,13 +98,13 @@ static inline uint64_t __in_be64(const volatile uint64_t *addr)
 	return be64_to_cpu(val);
 }
 
-static inline uint64_t in_be64(const volatile uint64_t *addr)
+static inline uint64_t in_be64(const volatile beint64_t *addr)
 {
 	sync();
 	return __in_be64(addr);
 }
 
-static inline uint64_t __in_le64(const volatile uint64_t *addr)
+static inline uint64_t __in_le64(const volatile leint64_t *addr)
 {
 	__le64 val;
 	asm volatile("ldcix %0,0,%1" :
@@ -112,7 +112,7 @@ static inline uint64_t __in_le64(const volatile uint64_t *addr)
 	return le64_to_cpu(val);
 }
 
-static inline uint64_t in_le64(const volatile uint64_t *addr)
+static inline uint64_t in_le64(const volatile leint64_t *addr)
 {
 	sync();
 	return __in_le64(addr);
@@ -130,73 +130,73 @@ static inline void out_8(volatile uint8_t *addr, uint8_t val)
 	return __out_8(addr, val);
 }
 
-static inline void __out_be16(volatile uint16_t *addr, uint16_t val)
+static inline void __out_be16(volatile beint16_t *addr, uint16_t val)
 {
 	asm volatile("sthcix %0,0,%1"
 		     : : "r"(cpu_to_be16(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_be16(volatile uint16_t *addr, uint16_t val)
+static inline void out_be16(volatile beint16_t *addr, uint16_t val)
 {
 	sync();
 	return __out_be16(addr, val);
 }
 
-static inline void __out_le16(volatile uint16_t *addr, uint16_t val)
+static inline void __out_le16(volatile leint16_t *addr, uint16_t val)
 {
 	asm volatile("sthcix %0,0,%1"
 		     : : "r"(cpu_to_le16(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_le16(volatile uint16_t *addr, uint16_t val)
+static inline void out_le16(volatile leint16_t *addr, uint16_t val)
 {
 	sync();
 	return __out_le16(addr, val);
 }
 
-static inline void __out_be32(volatile uint32_t *addr, uint32_t val)
+static inline void __out_be32(volatile beint32_t *addr, uint32_t val)
 {
 	asm volatile("stwcix %0,0,%1"
 		     : : "r"(cpu_to_be32(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_be32(volatile uint32_t *addr, uint32_t val)
+static inline void out_be32(volatile beint32_t *addr, uint32_t val)
 {
 	sync();
 	return __out_be32(addr, val);
 }
 
-static inline void __out_le32(volatile uint32_t *addr, uint32_t val)
+static inline void __out_le32(volatile leint32_t *addr, uint32_t val)
 {
 	asm volatile("stwcix %0,0,%1"
 		     : : "r"(cpu_to_le32(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_le32(volatile uint32_t *addr, uint32_t val)
+static inline void out_le32(volatile leint32_t *addr, uint32_t val)
 {
 	sync();
 	return __out_le32(addr, val);
 }
 
-static inline void __out_be64(volatile uint64_t *addr, uint64_t val)
+static inline void __out_be64(volatile beint64_t *addr, uint64_t val)
 {
 	asm volatile("stdcix %0,0,%1"
 		     : : "r"(cpu_to_be64(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_be64(volatile uint64_t *addr, uint64_t val)
+static inline void out_be64(volatile beint64_t *addr, uint64_t val)
 {
 	sync();
 	return __out_be64(addr, val);
 }
 
-static inline void __out_le64(volatile uint64_t *addr, uint64_t val)
+static inline void __out_le64(volatile leint64_t *addr, uint64_t val)
 {
 	asm volatile("stdcix %0,0,%1"
 		     : : "r"(cpu_to_le64(val)), "r"(addr), "m"(*addr) : "memory");
 }
 
-static inline void out_le64(volatile uint64_t *addr, uint64_t val)
+static inline void out_le64(volatile leint64_t *addr, uint64_t val)
 {
 	sync();
 	return __out_le64(addr, val);
diff --git a/libc/string/memcpy_from_ci.c b/libc/string/memcpy_from_ci.c
index 103853b45..dd4d94e02 100644
--- a/libc/string/memcpy_from_ci.c
+++ b/libc/string/memcpy_from_ci.c
@@ -16,7 +16,12 @@ void *memcpy_from_ci(void *destpp, const void *srcpp, size_t len)
 	/* Copy as many blocks as possible if srcp is block aligned */
 	if ((srcp % block) == 0) {
 		while ((len - block) > -1) {
-			*((uint64_t*) destp) = in_be64((uint64_t*)srcp);
+			uint64_t v;
+			if (HAVE_BIG_ENDIAN)
+				v = in_be64((beint64_t*)srcp);
+			else
+				v = in_le64((leint64_t*)srcp);
+			*((uint64_t *) destp) = v;
 			srcp += block;
 			destp += block;
 			len -= block;
-- 
2.23.0



More information about the Skiboot mailing list