[PATCH RFC 1/4] UAPI: Introduce 128-bit types and byteswap operations
From: Chenghai Huang <hidden>
Date: 2025-11-12 01:58:52
Also in:
linux-arch, linux-arm-kernel, linux-crypto, lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Weili Qian <qianweili@huawei.com> Architectures like ARM64 support 128-bit integer types and operations. This patch adds a generic byte order conversion interface for 128-bit. Signed-off-by: Weili Qian <qianweili@huawei.com> Signed-off-by: Chenghai Huang <redacted> --- include/uapi/linux/byteorder/big_endian.h | 6 ++++++ include/uapi/linux/byteorder/little_endian.h | 6 ++++++ include/uapi/linux/swab.h | 10 ++++++++++ include/uapi/linux/types.h | 3 +++ 4 files changed, 25 insertions(+)
diff --git a/include/uapi/linux/byteorder/big_endian.h b/include/uapi/linux/byteorder/big_endian.h
index 80aa5c41a763..318d51a18f43 100644
--- a/include/uapi/linux/byteorder/big_endian.h
+++ b/include/uapi/linux/byteorder/big_endian.h@@ -29,6 +29,12 @@ #define __constant_be32_to_cpu(x) ((__force __u32)(__be32)(x)) #define __constant_cpu_to_be16(x) ((__force __be16)(__u16)(x)) #define __constant_be16_to_cpu(x) ((__force __u16)(__be16)(x)) + +#ifdef __SIZEOF_INT128__ +#define __cpu_to_le128(x) ((__force __le128)__swab128((x))) +#define __le128_to_cpu(x) __swab128((__force __u128)(__le128)(x)) +#endif + #define __cpu_to_le64(x) ((__force __le64)__swab64((x))) #define __le64_to_cpu(x) __swab64((__force __u64)(__le64)(x)) #define __cpu_to_le32(x) ((__force __le32)__swab32((x)))
diff --git a/include/uapi/linux/byteorder/little_endian.h b/include/uapi/linux/byteorder/little_endian.h
index cd98982e7523..b2732452b825 100644
--- a/include/uapi/linux/byteorder/little_endian.h
+++ b/include/uapi/linux/byteorder/little_endian.h@@ -29,6 +29,12 @@ #define __constant_be32_to_cpu(x) ___constant_swab32((__force __u32)(__be32)(x)) #define __constant_cpu_to_be16(x) ((__force __be16)___constant_swab16((x))) #define __constant_be16_to_cpu(x) ___constant_swab16((__force __u16)(__be16)(x)) + +#ifdef __SIZEOF_INT128__ +#define __cpu_to_le128(x) ((__force __le128)(__u128)(x)) +#define __le128_to_cpu(x) ((__force __u128)(__le128)(x)) +#endif + #define __cpu_to_le64(x) ((__force __le64)(__u64)(x)) #define __le64_to_cpu(x) ((__force __u64)(__le64)(x)) #define __cpu_to_le32(x) ((__force __le32)(__u32)(x))
diff --git a/include/uapi/linux/swab.h b/include/uapi/linux/swab.h
index 01717181339e..7381b9a785ce 100644
--- a/include/uapi/linux/swab.h
+++ b/include/uapi/linux/swab.h@@ -133,6 +133,16 @@ static inline __attribute_const__ __u32 __fswahb32(__u32 val) __fswab64(x)) #endif +#ifdef __SIZEOF_INT128__ +static inline __attribute_const__ __u128 __swab128(__u128 val) +{ + __u64 h = val >> 64; + __u64 l = val; + + return (((__u128)__swab64(l)) << 64) | ((__u128)(__swab64(h))); +} +#endif + static __always_inline unsigned long __swab(const unsigned long y) { #if __BITS_PER_LONG == 64
diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h
index 48b933938877..9624ea43cd8a 100644
--- a/include/uapi/linux/types.h
+++ b/include/uapi/linux/types.h@@ -40,6 +40,9 @@ typedef __u32 __bitwise __be32; typedef __u64 __bitwise __le64; typedef __u64 __bitwise __be64; +#ifdef __SIZEOF_INT128__ +typedef __u128 __bitwise __le128; +#endif typedef __u16 __bitwise __sum16; typedef __u32 __bitwise __wsum;
--
2.33.0