blob: c82423908fff592b195710800ebdf5cd1cb33095 [file] [log] [blame]
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05001From e4a29888cb52c1eafd3ab57a6e220b38147ecfbe Mon Sep 17 00:00:00 2001
2From: Etienne Cordonnier <ecordonnier@snap.com>
3Date: Tue, 14 Mar 2023 13:39:23 +0100
4Subject: [PATCH] adb: Fix build on big endian systems
5
6The usb_linux_client.c file defines cpu_to_le16/32 by using the C
7library htole16/32 function calls. However, cpu_to_le16/32 are used
8when initializing structures, i.e in a context where a function call
9is not allowed.
10
11It works fine on little endian systems because htole16/32 are defined
12by the C library as no-ops. But on big-endian systems, they are
13actually doing something, which might involve calling a function,
14causing build failures.
15
16To solve this, we simply open-code cpu_to_le16/32 in a way that allows
17them to be used when initializing structures.
18
19Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
20[Forward-ported to version 29]
21Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
22
23---
Andrew Geissler220dafd2023-10-04 10:18:08 -050024Upstream-Status: Pending
25
Andrew Geisslerfc113ea2023-03-31 09:59:46 -050026 system/core/adb/daemon/usb_ffs.cpp | 11 +++++++++--
27 1 file changed, 9 insertions(+), 2 deletions(-)
28
29diff --git a/system/core/adb/daemon/usb_ffs.cpp b/system/core/adb/daemon/usb_ffs.cpp
30index b19fa5d5..ef2291ca 100644
31--- a/system/core/adb/daemon/usb_ffs.cpp
32+++ b/system/core/adb/daemon/usb_ffs.cpp
33@@ -39,8 +39,15 @@
34
35 #define USB_EXT_PROP_UNICODE 1
36
37-#define cpu_to_le16(x) htole16(x)
38-#define cpu_to_le32(x) htole32(x)
39+#if __BYTE_ORDER == __LITTLE_ENDIAN
40+# define cpu_to_le16(x) (x)
41+# define cpu_to_le32(x) (x)
42+#else
43+# define cpu_to_le16(x) ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))
44+# define cpu_to_le32(x) \
45+ ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \
46+ (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24))
47+#endif
48
49 // clang-format off
50 struct func_desc {