All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Add endianness conversion support
@ 2023-01-28  7:46 Rahul Pathak
  2023-01-28  7:46 ` [PATCH 1/2] include: Add support for byteorder/endianness conversion Rahul Pathak
  2023-01-28  7:46 ` [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h Rahul Pathak
  0 siblings, 2 replies; 9+ messages in thread
From: Rahul Pathak @ 2023-01-28  7:46 UTC (permalink / raw)
  To: opensbi

This series adds a new header which defines the generic
endianness conversion functions.
These new functions replaces the existing byte-swapping
functions defined in libfdt_env.h

Rahul Pathak (2):
  include: Add support for byteorder/endianness conversion
  lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h

 include/sbi/sbi_byteorder.h   | 57 +++++++++++++++++++++++++++++++++++
 lib/utils/libfdt/libfdt_env.h | 29 ++++++------------
 2 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 include/sbi/sbi_byteorder.h

-- 
2.34.1



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-01-28  7:46 [PATCH 0/2] Add endianness conversion support Rahul Pathak
@ 2023-01-28  7:46 ` Rahul Pathak
  2023-01-28 13:12   ` Xiang W
  2023-01-31  8:11   ` Sergey Matyukevich
  2023-01-28  7:46 ` [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h Rahul Pathak
  1 sibling, 2 replies; 9+ messages in thread
From: Rahul Pathak @ 2023-01-28  7:46 UTC (permalink / raw)
  To: opensbi

Define macros for general byteorder conversion
Define functions for endianness conversion
using general byteorder conversion macros

Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
---
 include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 include/sbi/sbi_byteorder.h

diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
new file mode 100644
index 000000000000..680710fe6d91
--- /dev/null
+++ b/include/sbi/sbi_byteorder.h
@@ -0,0 +1,57 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2023 Ventana Micro Systems Inc.
+ */
+
+#ifndef __SBI_BYTEORDER_H__
+#define __SBI_BYTEORDER_H__
+
+#include <sbi/sbi_types.h>
+
+#define EXTRACT_BYTE(x, n)	((unsigned long long)((uint8_t *)&x)[n])
+
+#define BSWAP16(x)	((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
+#define BSWAP32(x)	((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
+			 (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
+#define BSWAP64(x)	((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
+			 (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
+			 (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
+			 (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
+
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* CPU(little-endian) */
+#define cpu_to_be16(x)		((uint16_t)BSWAP16(x))
+#define cpu_to_be32(x)		((uint32_t)BSWAP32(x))
+#define cpu_to_be64(x)		((uint64_t)BSWAP64(x))
+
+#define be16_to_cpu(x)		((uint16_t)BSWAP16(x))
+#define be32_to_cpu(x)		((uint32_t)BSWAP32(x))
+#define be64_to_cpu(x)		((uint64_t)BSWAP64(x))
+
+#define cpu_to_le16(x)		((uint16_t)(x))
+#define cpu_to_le32(x)		((uint32_t)(x))
+#define cpu_to_le64(x)		((uint64_t)(x))
+
+#define le16_to_cpu(x)		((uint16_t)(x))
+#define le32_to_cpu(x)		((uint32_t)(x))
+#define le64_to_cpu(x)		((uint64_t)(x))
+#else /* CPU(big-endian) */
+#define cpu_to_be16(x)		((uint16_t)(x))
+#define cpu_to_be32(x)		((uint32_t)(x))
+#define cpu_to_be64(x)		((uint64_t)(x))
+
+#define be16_to_cpu(x)		((uint16_t)(x))
+#define be32_to_cpu(x)		((uint32_t)(x))
+#define be64_to_cpu(x)		((uint64_t)(x))
+
+#define cpu_to_le16(x)		((uint16_t)BSWAP16(x))
+#define cpu_to_le32(x)		((uint32_t)BSWAP32(x))
+#define cpu_to_le64(x)		((uint64_t)BSWAP64(x))
+
+#define le16_to_cpu(x)		((uint16_t)BSWAP16(x))
+#define le32_to_cpu(x)		((uint32_t)BSWAP32(x))
+#define le64_to_cpu(x)		((uint64_t)BSWAP64(x))
+#endif
+
+#endif /* __SBI_BYTEORDER_H__ */
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h
  2023-01-28  7:46 [PATCH 0/2] Add endianness conversion support Rahul Pathak
  2023-01-28  7:46 ` [PATCH 1/2] include: Add support for byteorder/endianness conversion Rahul Pathak
@ 2023-01-28  7:46 ` Rahul Pathak
  2023-01-28 13:13   ` Xiang W
  1 sibling, 1 reply; 9+ messages in thread
From: Rahul Pathak @ 2023-01-28  7:46 UTC (permalink / raw)
  To: opensbi

FDT follows big-endian and CPU can be little or big
endian as per the implementation.
libfdt_env.h defines function for conversion between
fdt and cpu byteorder according to the endianness.

Currently, libfdt_env.h defines custom byte swapping
macros and then undefines them. Instead, use the generic
endianness conversion functions

Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
---
 lib/utils/libfdt/libfdt_env.h | 29 ++++++++++-------------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git a/lib/utils/libfdt/libfdt_env.h b/lib/utils/libfdt/libfdt_env.h
index f9d9c6783c52..e5ad7698efca 100644
--- a/lib/utils/libfdt/libfdt_env.h
+++ b/lib/utils/libfdt/libfdt_env.h
@@ -9,6 +9,7 @@
 
 #include <sbi/sbi_string.h>
 #include <sbi/sbi_types.h>
+#include <sbi/sbi_byteorder.h>
 
 #define INT_MAX		((int)(~0U >> 1))
 #define UINT_MAX	((unsigned int)~0U)
@@ -41,45 +42,35 @@ typedef uint16_t FDT_BITWISE fdt16_t;
 typedef uint32_t FDT_BITWISE fdt32_t;
 typedef uint64_t FDT_BITWISE fdt64_t;
 
-#define EXTRACT_BYTE(x, n)	((unsigned long long)((uint8_t *)&x)[n])
-#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
-#define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
-			 (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
-#define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
-			 (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
-			 (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
-			 (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
-
 static inline uint16_t fdt16_to_cpu(fdt16_t x)
 {
-	return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);
+	return (FDT_FORCE uint16_t)be16_to_cpu(x);
 }
+
 static inline fdt16_t cpu_to_fdt16(uint16_t x)
 {
-	return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);
+	return (FDT_FORCE fdt16_t)cpu_to_be16(x);
 }
 
 static inline uint32_t fdt32_to_cpu(fdt32_t x)
 {
-	return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);
+	return (FDT_FORCE uint32_t)be32_to_cpu(x);
 }
+
 static inline fdt32_t cpu_to_fdt32(uint32_t x)
 {
-	return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);
+	return (FDT_FORCE fdt32_t)cpu_to_be32(x);
 }
 
 static inline uint64_t fdt64_to_cpu(fdt64_t x)
 {
-	return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);
+	return (FDT_FORCE uint64_t)be64_to_cpu(x);
 }
+
 static inline fdt64_t cpu_to_fdt64(uint64_t x)
 {
-	return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);
+	return (FDT_FORCE fdt64_t)cpu_to_be64(x);
 }
-#undef CPU_TO_FDT64
-#undef CPU_TO_FDT32
-#undef CPU_TO_FDT16
-#undef EXTRACT_BYTE
 
 #ifdef __APPLE__
 #include <AvailabilityMacros.h>
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-01-28  7:46 ` [PATCH 1/2] include: Add support for byteorder/endianness conversion Rahul Pathak
@ 2023-01-28 13:12   ` Xiang W
  2023-01-31  8:11   ` Sergey Matyukevich
  1 sibling, 0 replies; 9+ messages in thread
From: Xiang W @ 2023-01-28 13:12 UTC (permalink / raw)
  To: opensbi

? 2023-01-28???? 13:16 +0530?Rahul Pathak???
> Define macros for general byteorder conversion
> Define functions for endianness conversion
> using general byteorder conversion macros
> 
> Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
> ?1 file changed, 57 insertions(+)
> ?create mode 100644 include/sbi/sbi_byteorder.h
> 
> diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
> new file mode 100644
> index 000000000000..680710fe6d91
> --- /dev/null
> +++ b/include/sbi/sbi_byteorder.h
> @@ -0,0 +1,57 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2023 Ventana Micro Systems Inc.
> + */
> +
> +#ifndef __SBI_BYTEORDER_H__
> +#define __SBI_BYTEORDER_H__
> +
> +#include <sbi/sbi_types.h>
> +
> +#define EXTRACT_BYTE(x, n)?????((unsigned long long)((uint8_t *)&x)[n])
> +
> +#define BSWAP16(x)?????((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> +#define BSWAP32(x)?????((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> +??????????????????????? (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> +#define BSWAP64(x)?????((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> +??????????????????????? (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> +??????????????????????? (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> +??????????????????????? (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> +
> +
> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__? /* CPU(little-endian) */
> +#define cpu_to_be16(x)?????????((uint16_t)BSWAP16(x))
> +#define cpu_to_be32(x)?????????((uint32_t)BSWAP32(x))
> +#define cpu_to_be64(x)?????????((uint64_t)BSWAP64(x))
> +
> +#define be16_to_cpu(x)?????????((uint16_t)BSWAP16(x))
> +#define be32_to_cpu(x)?????????((uint32_t)BSWAP32(x))
> +#define be64_to_cpu(x)?????????((uint64_t)BSWAP64(x))
> +
> +#define cpu_to_le16(x)?????????((uint16_t)(x))
> +#define cpu_to_le32(x)?????????((uint32_t)(x))
> +#define cpu_to_le64(x)?????????((uint64_t)(x))
> +
> +#define le16_to_cpu(x)?????????((uint16_t)(x))
> +#define le32_to_cpu(x)?????????((uint32_t)(x))
> +#define le64_to_cpu(x)?????????((uint64_t)(x))
> +#else /* CPU(big-endian) */
> +#define cpu_to_be16(x)?????????((uint16_t)(x))
> +#define cpu_to_be32(x)?????????((uint32_t)(x))
> +#define cpu_to_be64(x)?????????((uint64_t)(x))
> +
> +#define be16_to_cpu(x)?????????((uint16_t)(x))
> +#define be32_to_cpu(x)?????????((uint32_t)(x))
> +#define be64_to_cpu(x)?????????((uint64_t)(x))
> +
> +#define cpu_to_le16(x)?????????((uint16_t)BSWAP16(x))
> +#define cpu_to_le32(x)?????????((uint32_t)BSWAP32(x))
> +#define cpu_to_le64(x)?????????((uint64_t)BSWAP64(x))
> +
> +#define le16_to_cpu(x)?????????((uint16_t)BSWAP16(x))
> +#define le32_to_cpu(x)?????????((uint32_t)BSWAP32(x))
> +#define le64_to_cpu(x)?????????((uint64_t)BSWAP64(x))
> +#endif
> +
> +#endif /* __SBI_BYTEORDER_H__ */
> -- 
> 2.34.1
> 
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h
  2023-01-28  7:46 ` [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h Rahul Pathak
@ 2023-01-28 13:13   ` Xiang W
  0 siblings, 0 replies; 9+ messages in thread
From: Xiang W @ 2023-01-28 13:13 UTC (permalink / raw)
  To: opensbi

? 2023-01-28???? 13:16 +0530?Rahul Pathak???
> FDT follows big-endian and CPU can be little or big
> endian as per the implementation.
> libfdt_env.h defines function for conversion between
> fdt and cpu byteorder according to the endianness.
> 
> Currently, libfdt_env.h defines custom byte swapping
> macros and then undefines them. Instead, use the generic
> endianness conversion functions
> 
> Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
Look good to me

Reviewed-by: Xiang W <wxjstz@126.com>
> ---
> ?lib/utils/libfdt/libfdt_env.h | 29 ++++++++++-------------------
> ?1 file changed, 10 insertions(+), 19 deletions(-)
> 
> diff --git a/lib/utils/libfdt/libfdt_env.h b/lib/utils/libfdt/libfdt_env.h
> index f9d9c6783c52..e5ad7698efca 100644
> --- a/lib/utils/libfdt/libfdt_env.h
> +++ b/lib/utils/libfdt/libfdt_env.h
> @@ -9,6 +9,7 @@
> ?
> ?#include <sbi/sbi_string.h>
> ?#include <sbi/sbi_types.h>
> +#include <sbi/sbi_byteorder.h>
> ?
> ?#define INT_MAX????????????????((int)(~0U >> 1))
> ?#define UINT_MAX???????((unsigned int)~0U)
> @@ -41,45 +42,35 @@ typedef uint16_t FDT_BITWISE fdt16_t;
> ?typedef uint32_t FDT_BITWISE fdt32_t;
> ?typedef uint64_t FDT_BITWISE fdt64_t;
> ?
> -#define EXTRACT_BYTE(x, n)?????((unsigned long long)((uint8_t *)&x)[n])
> -#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> -#define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> -??????????????????????? (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> -#define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> -??????????????????????? (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> -??????????????????????? (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> -??????????????????????? (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> -
> ?static inline uint16_t fdt16_to_cpu(fdt16_t x)
> ?{
> -???????return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);
> +???????return (FDT_FORCE uint16_t)be16_to_cpu(x);
> ?}
> +
> ?static inline fdt16_t cpu_to_fdt16(uint16_t x)
> ?{
> -???????return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);
> +???????return (FDT_FORCE fdt16_t)cpu_to_be16(x);
> ?}
> ?
> ?static inline uint32_t fdt32_to_cpu(fdt32_t x)
> ?{
> -???????return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);
> +???????return (FDT_FORCE uint32_t)be32_to_cpu(x);
> ?}
> +
> ?static inline fdt32_t cpu_to_fdt32(uint32_t x)
> ?{
> -???????return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);
> +???????return (FDT_FORCE fdt32_t)cpu_to_be32(x);
> ?}
> ?
> ?static inline uint64_t fdt64_to_cpu(fdt64_t x)
> ?{
> -???????return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);
> +???????return (FDT_FORCE uint64_t)be64_to_cpu(x);
> ?}
> +
> ?static inline fdt64_t cpu_to_fdt64(uint64_t x)
> ?{
> -???????return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);
> +???????return (FDT_FORCE fdt64_t)cpu_to_be64(x);
> ?}
> -#undef CPU_TO_FDT64
> -#undef CPU_TO_FDT32
> -#undef CPU_TO_FDT16
> -#undef EXTRACT_BYTE
> ?
> ?#ifdef __APPLE__
> ?#include <AvailabilityMacros.h>
> -- 
> 2.34.1
> 
> 



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-01-28  7:46 ` [PATCH 1/2] include: Add support for byteorder/endianness conversion Rahul Pathak
  2023-01-28 13:12   ` Xiang W
@ 2023-01-31  8:11   ` Sergey Matyukevich
  2023-02-01  7:38     ` Rahul Pathak
  1 sibling, 1 reply; 9+ messages in thread
From: Sergey Matyukevich @ 2023-01-31  8:11 UTC (permalink / raw)
  To: opensbi

On Sat, Jan 28, 2023 at 01:16:16PM +0530, Rahul Pathak wrote:
> Define macros for general byteorder conversion
> Define functions for endianness conversion
> using general byteorder conversion macros
> 
> Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
> ---
>  include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 57 insertions(+)
>  create mode 100644 include/sbi/sbi_byteorder.h

Reviewed-by: Sergey Matyukevich <sergey.matyukevich@syntacore.com>

By the way, is there any advantage of using custom macros instead of
compiler builtins ? E.g. see my patch loosely based on FreeBSD code:
http://lists.infradead.org/pipermail/opensbi/2022-December/003766.html

Regards,
Sergey


> diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
> new file mode 100644
> index 000000000000..680710fe6d91
> --- /dev/null
> +++ b/include/sbi/sbi_byteorder.h
> @@ -0,0 +1,57 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2023 Ventana Micro Systems Inc.
> + */
> +
> +#ifndef __SBI_BYTEORDER_H__
> +#define __SBI_BYTEORDER_H__
> +
> +#include <sbi/sbi_types.h>
> +
> +#define EXTRACT_BYTE(x, n)	((unsigned long long)((uint8_t *)&x)[n])
> +
> +#define BSWAP16(x)	((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> +#define BSWAP32(x)	((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> +			 (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> +#define BSWAP64(x)	((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> +			 (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> +			 (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> +			 (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> +
> +
> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* CPU(little-endian) */
> +#define cpu_to_be16(x)		((uint16_t)BSWAP16(x))
> +#define cpu_to_be32(x)		((uint32_t)BSWAP32(x))
> +#define cpu_to_be64(x)		((uint64_t)BSWAP64(x))
> +
> +#define be16_to_cpu(x)		((uint16_t)BSWAP16(x))
> +#define be32_to_cpu(x)		((uint32_t)BSWAP32(x))
> +#define be64_to_cpu(x)		((uint64_t)BSWAP64(x))
> +
> +#define cpu_to_le16(x)		((uint16_t)(x))
> +#define cpu_to_le32(x)		((uint32_t)(x))
> +#define cpu_to_le64(x)		((uint64_t)(x))
> +
> +#define le16_to_cpu(x)		((uint16_t)(x))
> +#define le32_to_cpu(x)		((uint32_t)(x))
> +#define le64_to_cpu(x)		((uint64_t)(x))
> +#else /* CPU(big-endian) */
> +#define cpu_to_be16(x)		((uint16_t)(x))
> +#define cpu_to_be32(x)		((uint32_t)(x))
> +#define cpu_to_be64(x)		((uint64_t)(x))
> +
> +#define be16_to_cpu(x)		((uint16_t)(x))
> +#define be32_to_cpu(x)		((uint32_t)(x))
> +#define be64_to_cpu(x)		((uint64_t)(x))
> +
> +#define cpu_to_le16(x)		((uint16_t)BSWAP16(x))
> +#define cpu_to_le32(x)		((uint32_t)BSWAP32(x))
> +#define cpu_to_le64(x)		((uint64_t)BSWAP64(x))
> +
> +#define le16_to_cpu(x)		((uint16_t)BSWAP16(x))
> +#define le32_to_cpu(x)		((uint32_t)BSWAP32(x))
> +#define le64_to_cpu(x)		((uint64_t)BSWAP64(x))
> +#endif
> +
> +#endif /* __SBI_BYTEORDER_H__ */
> -- 
> 2.34.1
> 
> 
> -- 
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-01-31  8:11   ` Sergey Matyukevich
@ 2023-02-01  7:38     ` Rahul Pathak
  2023-02-02  9:24       ` Sergey Matyukevich
  0 siblings, 1 reply; 9+ messages in thread
From: Rahul Pathak @ 2023-02-01  7:38 UTC (permalink / raw)
  To: opensbi

Hi Sergey,

Using __builtins_bswapX causes weird issues on gcc,
due to reasons unknown the functions in libfdt_env.h
like below emit the library call to __bswapdi2
which causes errors.

static inline fdt32_t cpu_to_fdt32(uint32_t x)
{
return (FDT_FORCE fdt32_t)cpu_to_be32(x);
}

Errors -
fdt_reset_gpio.c:135: undefined reference to `__bswapsi2'
/fdt_reset_thead.c:77: undefined reference to `__bswapsi2'

Clang works perfectly

Did you face such issues?

Thanks
Rahul


On Tue, Jan 31, 2023 at 1:41 PM Sergey Matyukevich <geomatsi@gmail.com> wrote:
>
> On Sat, Jan 28, 2023 at 01:16:16PM +0530, Rahul Pathak wrote:
> > Define macros for general byteorder conversion
> > Define functions for endianness conversion
> > using general byteorder conversion macros
> >
> > Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
> > ---
> >  include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
> >  1 file changed, 57 insertions(+)
> >  create mode 100644 include/sbi/sbi_byteorder.h
>
> Reviewed-by: Sergey Matyukevich <sergey.matyukevich@syntacore.com>
>
> By the way, is there any advantage of using custom macros instead of
> compiler builtins ? E.g. see my patch loosely based on FreeBSD code:
> http://lists.infradead.org/pipermail/opensbi/2022-December/003766.html
>
> Regards,
> Sergey
>
>
> > diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
> > new file mode 100644
> > index 000000000000..680710fe6d91
> > --- /dev/null
> > +++ b/include/sbi/sbi_byteorder.h
> > @@ -0,0 +1,57 @@
> > +/*
> > + * SPDX-License-Identifier: BSD-2-Clause
> > + *
> > + * Copyright (c) 2023 Ventana Micro Systems Inc.
> > + */
> > +
> > +#ifndef __SBI_BYTEORDER_H__
> > +#define __SBI_BYTEORDER_H__
> > +
> > +#include <sbi/sbi_types.h>
> > +
> > +#define EXTRACT_BYTE(x, n)   ((unsigned long long)((uint8_t *)&x)[n])
> > +
> > +#define BSWAP16(x)   ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> > +#define BSWAP32(x)   ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> > +                      (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> > +#define BSWAP64(x)   ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> > +                      (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> > +                      (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> > +                      (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> > +
> > +
> > +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* CPU(little-endian) */
> > +#define cpu_to_be16(x)               ((uint16_t)BSWAP16(x))
> > +#define cpu_to_be32(x)               ((uint32_t)BSWAP32(x))
> > +#define cpu_to_be64(x)               ((uint64_t)BSWAP64(x))
> > +
> > +#define be16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > +#define be32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > +#define be64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > +
> > +#define cpu_to_le16(x)               ((uint16_t)(x))
> > +#define cpu_to_le32(x)               ((uint32_t)(x))
> > +#define cpu_to_le64(x)               ((uint64_t)(x))
> > +
> > +#define le16_to_cpu(x)               ((uint16_t)(x))
> > +#define le32_to_cpu(x)               ((uint32_t)(x))
> > +#define le64_to_cpu(x)               ((uint64_t)(x))
> > +#else /* CPU(big-endian) */
> > +#define cpu_to_be16(x)               ((uint16_t)(x))
> > +#define cpu_to_be32(x)               ((uint32_t)(x))
> > +#define cpu_to_be64(x)               ((uint64_t)(x))
> > +
> > +#define be16_to_cpu(x)               ((uint16_t)(x))
> > +#define be32_to_cpu(x)               ((uint32_t)(x))
> > +#define be64_to_cpu(x)               ((uint64_t)(x))
> > +
> > +#define cpu_to_le16(x)               ((uint16_t)BSWAP16(x))
> > +#define cpu_to_le32(x)               ((uint32_t)BSWAP32(x))
> > +#define cpu_to_le64(x)               ((uint64_t)BSWAP64(x))
> > +
> > +#define le16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > +#define le32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > +#define le64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > +#endif
> > +
> > +#endif /* __SBI_BYTEORDER_H__ */
> > --
> > 2.34.1
> >
> >
> > --
> > opensbi mailing list
> > opensbi at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/opensbi



-- 

Thanks
Rahul Pathak


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-02-01  7:38     ` Rahul Pathak
@ 2023-02-02  9:24       ` Sergey Matyukevich
  2023-02-02  9:32         ` Rahul Pathak
  0 siblings, 1 reply; 9+ messages in thread
From: Sergey Matyukevich @ 2023-02-02  9:24 UTC (permalink / raw)
  To: opensbi

Hi Rahul,

> Using __builtins_bswapX causes weird issues on gcc,
> due to reasons unknown the functions in libfdt_env.h
> like below emit the library call to __bswapdi2
> which causes errors.
> 
> static inline fdt32_t cpu_to_fdt32(uint32_t x)
> {
> return (FDT_FORCE fdt32_t)cpu_to_be32(x);
> }
> 
> Errors -
> fdt_reset_gpio.c:135: undefined reference to `__bswapsi2'
> /fdt_reset_thead.c:77: undefined reference to `__bswapsi2'
> 
> Clang works perfectly
> 
> Did you face such issues?

Right. I see such issues for gcc revisions v10.2, v11.2, v12.1.
Missing references could be be pulled from libgcc, e.g.: 

diff --git a/Makefile b/Makefile
index 8db6eab..8cae625 100644
--- a/Makefile
+++ b/Makefile
@@ -369,7 +369,7 @@ ASFLAGS		+=	$(firmware-asflags-y)
 ARFLAGS		=	rcs
 
 ELFFLAGS	+=	$(USE_LD_FLAG)
-ELFFLAGS	+=	-Wl,--build-id=none -Wl,-N
+ELFFLAGS	+=	-Wl,--build-id=none -Wl,-N -Wl,-lgcc
 ELFFLAGS	+=	$(platform-ldflags-y)
 ELFFLAGS	+=	$(firmware-ldflags-y)


Regards,
Sergey

> On Tue, Jan 31, 2023 at 1:41 PM Sergey Matyukevich <geomatsi@gmail.com> wrote:
> >
> > On Sat, Jan 28, 2023 at 01:16:16PM +0530, Rahul Pathak wrote:
> > > Define macros for general byteorder conversion
> > > Define functions for endianness conversion
> > > using general byteorder conversion macros
> > >
> > > Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
> > > ---
> > >  include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 57 insertions(+)
> > >  create mode 100644 include/sbi/sbi_byteorder.h
> >
> > Reviewed-by: Sergey Matyukevich <sergey.matyukevich@syntacore.com>
> >
> > By the way, is there any advantage of using custom macros instead of
> > compiler builtins ? E.g. see my patch loosely based on FreeBSD code:
> > http://lists.infradead.org/pipermail/opensbi/2022-December/003766.html
> >
> > Regards,
> > Sergey
> >
> >
> > > diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
> > > new file mode 100644
> > > index 000000000000..680710fe6d91
> > > --- /dev/null
> > > +++ b/include/sbi/sbi_byteorder.h
> > > @@ -0,0 +1,57 @@
> > > +/*
> > > + * SPDX-License-Identifier: BSD-2-Clause
> > > + *
> > > + * Copyright (c) 2023 Ventana Micro Systems Inc.
> > > + */
> > > +
> > > +#ifndef __SBI_BYTEORDER_H__
> > > +#define __SBI_BYTEORDER_H__
> > > +
> > > +#include <sbi/sbi_types.h>
> > > +
> > > +#define EXTRACT_BYTE(x, n)   ((unsigned long long)((uint8_t *)&x)[n])
> > > +
> > > +#define BSWAP16(x)   ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> > > +#define BSWAP32(x)   ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> > > +                      (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> > > +#define BSWAP64(x)   ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> > > +                      (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> > > +                      (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> > > +                      (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> > > +
> > > +
> > > +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* CPU(little-endian) */
> > > +#define cpu_to_be16(x)               ((uint16_t)BSWAP16(x))
> > > +#define cpu_to_be32(x)               ((uint32_t)BSWAP32(x))
> > > +#define cpu_to_be64(x)               ((uint64_t)BSWAP64(x))
> > > +
> > > +#define be16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > > +#define be32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > > +#define be64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > > +
> > > +#define cpu_to_le16(x)               ((uint16_t)(x))
> > > +#define cpu_to_le32(x)               ((uint32_t)(x))
> > > +#define cpu_to_le64(x)               ((uint64_t)(x))
> > > +
> > > +#define le16_to_cpu(x)               ((uint16_t)(x))
> > > +#define le32_to_cpu(x)               ((uint32_t)(x))
> > > +#define le64_to_cpu(x)               ((uint64_t)(x))
> > > +#else /* CPU(big-endian) */
> > > +#define cpu_to_be16(x)               ((uint16_t)(x))
> > > +#define cpu_to_be32(x)               ((uint32_t)(x))
> > > +#define cpu_to_be64(x)               ((uint64_t)(x))
> > > +
> > > +#define be16_to_cpu(x)               ((uint16_t)(x))
> > > +#define be32_to_cpu(x)               ((uint32_t)(x))
> > > +#define be64_to_cpu(x)               ((uint64_t)(x))
> > > +
> > > +#define cpu_to_le16(x)               ((uint16_t)BSWAP16(x))
> > > +#define cpu_to_le32(x)               ((uint32_t)BSWAP32(x))
> > > +#define cpu_to_le64(x)               ((uint64_t)BSWAP64(x))
> > > +
> > > +#define le16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > > +#define le32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > > +#define le64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > > +#endif
> > > +
> > > +#endif /* __SBI_BYTEORDER_H__ */
> > > --
> > > 2.34.1
> > >
> > >
> > > --
> > > opensbi mailing list
> > > opensbi at lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/opensbi
> 
> 
> 
> -- 
> 
> Thanks
> Rahul Pathak


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 1/2] include: Add support for byteorder/endianness conversion
  2023-02-02  9:24       ` Sergey Matyukevich
@ 2023-02-02  9:32         ` Rahul Pathak
  0 siblings, 0 replies; 9+ messages in thread
From: Rahul Pathak @ 2023-02-02  9:32 UTC (permalink / raw)
  To: opensbi

But should libgcc be pulled in the opensbi, I doubt that.

Also just for trying i did tried linking with libgcc, it was giving me
build errors
libgcc.a(_bswapdi2.o): can't link double-float modules with soft-float modules

On Thu, Feb 2, 2023 at 2:54 PM Sergey Matyukevich <geomatsi@gmail.com> wrote:
>
> Hi Rahul,
>
> > Using __builtins_bswapX causes weird issues on gcc,
> > due to reasons unknown the functions in libfdt_env.h
> > like below emit the library call to __bswapdi2
> > which causes errors.
> >
> > static inline fdt32_t cpu_to_fdt32(uint32_t x)
> > {
> > return (FDT_FORCE fdt32_t)cpu_to_be32(x);
> > }
> >
> > Errors -
> > fdt_reset_gpio.c:135: undefined reference to `__bswapsi2'
> > /fdt_reset_thead.c:77: undefined reference to `__bswapsi2'
> >
> > Clang works perfectly
> >
> > Did you face such issues?
>
> Right. I see such issues for gcc revisions v10.2, v11.2, v12.1.
> Missing references could be be pulled from libgcc, e.g.:
>
> diff --git a/Makefile b/Makefile
> index 8db6eab..8cae625 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -369,7 +369,7 @@ ASFLAGS             +=      $(firmware-asflags-y)
>  ARFLAGS                =       rcs
>
>  ELFFLAGS       +=      $(USE_LD_FLAG)
> -ELFFLAGS       +=      -Wl,--build-id=none -Wl,-N
> +ELFFLAGS       +=      -Wl,--build-id=none -Wl,-N -Wl,-lgcc
>  ELFFLAGS       +=      $(platform-ldflags-y)
>  ELFFLAGS       +=      $(firmware-ldflags-y)
>
>
> Regards,
> Sergey
>
> > On Tue, Jan 31, 2023 at 1:41 PM Sergey Matyukevich <geomatsi@gmail.com> wrote:
> > >
> > > On Sat, Jan 28, 2023 at 01:16:16PM +0530, Rahul Pathak wrote:
> > > > Define macros for general byteorder conversion
> > > > Define functions for endianness conversion
> > > > using general byteorder conversion macros
> > > >
> > > > Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
> > > > ---
> > > >  include/sbi/sbi_byteorder.h | 57 +++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 57 insertions(+)
> > > >  create mode 100644 include/sbi/sbi_byteorder.h
> > >
> > > Reviewed-by: Sergey Matyukevich <sergey.matyukevich@syntacore.com>
> > >
> > > By the way, is there any advantage of using custom macros instead of
> > > compiler builtins ? E.g. see my patch loosely based on FreeBSD code:
> > > http://lists.infradead.org/pipermail/opensbi/2022-December/003766.html
> > >
> > > Regards,
> > > Sergey
> > >
> > >
> > > > diff --git a/include/sbi/sbi_byteorder.h b/include/sbi/sbi_byteorder.h
> > > > new file mode 100644
> > > > index 000000000000..680710fe6d91
> > > > --- /dev/null
> > > > +++ b/include/sbi/sbi_byteorder.h
> > > > @@ -0,0 +1,57 @@
> > > > +/*
> > > > + * SPDX-License-Identifier: BSD-2-Clause
> > > > + *
> > > > + * Copyright (c) 2023 Ventana Micro Systems Inc.
> > > > + */
> > > > +
> > > > +#ifndef __SBI_BYTEORDER_H__
> > > > +#define __SBI_BYTEORDER_H__
> > > > +
> > > > +#include <sbi/sbi_types.h>
> > > > +
> > > > +#define EXTRACT_BYTE(x, n)   ((unsigned long long)((uint8_t *)&x)[n])
> > > > +
> > > > +#define BSWAP16(x)   ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
> > > > +#define BSWAP32(x)   ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
> > > > +                      (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
> > > > +#define BSWAP64(x)   ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
> > > > +                      (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
> > > > +                      (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
> > > > +                      (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
> > > > +
> > > > +
> > > > +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  /* CPU(little-endian) */
> > > > +#define cpu_to_be16(x)               ((uint16_t)BSWAP16(x))
> > > > +#define cpu_to_be32(x)               ((uint32_t)BSWAP32(x))
> > > > +#define cpu_to_be64(x)               ((uint64_t)BSWAP64(x))
> > > > +
> > > > +#define be16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > > > +#define be32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > > > +#define be64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > > > +
> > > > +#define cpu_to_le16(x)               ((uint16_t)(x))
> > > > +#define cpu_to_le32(x)               ((uint32_t)(x))
> > > > +#define cpu_to_le64(x)               ((uint64_t)(x))
> > > > +
> > > > +#define le16_to_cpu(x)               ((uint16_t)(x))
> > > > +#define le32_to_cpu(x)               ((uint32_t)(x))
> > > > +#define le64_to_cpu(x)               ((uint64_t)(x))
> > > > +#else /* CPU(big-endian) */
> > > > +#define cpu_to_be16(x)               ((uint16_t)(x))
> > > > +#define cpu_to_be32(x)               ((uint32_t)(x))
> > > > +#define cpu_to_be64(x)               ((uint64_t)(x))
> > > > +
> > > > +#define be16_to_cpu(x)               ((uint16_t)(x))
> > > > +#define be32_to_cpu(x)               ((uint32_t)(x))
> > > > +#define be64_to_cpu(x)               ((uint64_t)(x))
> > > > +
> > > > +#define cpu_to_le16(x)               ((uint16_t)BSWAP16(x))
> > > > +#define cpu_to_le32(x)               ((uint32_t)BSWAP32(x))
> > > > +#define cpu_to_le64(x)               ((uint64_t)BSWAP64(x))
> > > > +
> > > > +#define le16_to_cpu(x)               ((uint16_t)BSWAP16(x))
> > > > +#define le32_to_cpu(x)               ((uint32_t)BSWAP32(x))
> > > > +#define le64_to_cpu(x)               ((uint64_t)BSWAP64(x))
> > > > +#endif
> > > > +
> > > > +#endif /* __SBI_BYTEORDER_H__ */
> > > > --
> > > > 2.34.1
> > > >
> > > >
> > > > --
> > > > opensbi mailing list
> > > > opensbi at lists.infradead.org
> > > > http://lists.infradead.org/mailman/listinfo/opensbi
> >
> >
> >
> > --
> >
> > Thanks
> > Rahul Pathak



-- 

Thanks
Rahul Pathak


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-02-02  9:32 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-28  7:46 [PATCH 0/2] Add endianness conversion support Rahul Pathak
2023-01-28  7:46 ` [PATCH 1/2] include: Add support for byteorder/endianness conversion Rahul Pathak
2023-01-28 13:12   ` Xiang W
2023-01-31  8:11   ` Sergey Matyukevich
2023-02-01  7:38     ` Rahul Pathak
2023-02-02  9:24       ` Sergey Matyukevich
2023-02-02  9:32         ` Rahul Pathak
2023-01-28  7:46 ` [PATCH 2/2] lib: utils/fdt: Use byteorder conversion functions in libfdt_env.h Rahul Pathak
2023-01-28 13:13   ` Xiang W

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.