git: a60b5778dd04 - stable/14 - compat32: provide a type and a macro for (u)int64_t handling on non-x86 arches
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 12 Apr 2026 05:57:04 UTC
The branch stable/14 has been updated by des:
URL: https://cgit.FreeBSD.org/src/commit/?id=a60b5778dd043214e9e094f1b7d41adc3b9ee972
commit a60b5778dd043214e9e094f1b7d41adc3b9ee972
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-12 04:45:36 +0000
Commit: Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2026-04-12 05:56:45 +0000
compat32: provide a type and a macro for (u)int64_t handling on non-x86 arches
uint64_t is 4-byte aligned on i386, but is 8-bytes aligned on all other
32bit arches FreeBSD supports. Provide the freebsd32_uint64_t type and
the FU64_CP() macro, which are intended to be used where 32bit ABI uses
(u)int64_t type, and do proper layout and copying for the aggregate type.
Reviewed by: des, emaste
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D54663
(cherry picked from commit 96acaa960023c20e852e04e7cc5c6a5faca36c67)
---
sys/compat/freebsd32/freebsd32.h | 11 ++++++++++-
sys/sys/abi_compat.h | 8 ++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 9d7a99535288..36deb6bd06f2 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -36,8 +36,17 @@
#include <sys/_ffcounter.h>
/*
- * i386 is the only arch with a 32-bit time_t
+ * i386 is the only arch with a 32-bit time_t.
+ * Also it is the only arch with (u)int64_t having 4-bytes alignment.
*/
+typedef struct {
+#ifdef __amd64__
+ uint32_t val[2];
+#else
+ uint64_t val;
+#endif
+} freebsd32_uint64_t;
+
#ifdef __amd64__
typedef int32_t time32_t;
#else
diff --git a/sys/sys/abi_compat.h b/sys/sys/abi_compat.h
index c2233f2eac2c..0a7110191430 100644
--- a/sys/sys/abi_compat.h
+++ b/sys/sys/abi_compat.h
@@ -67,6 +67,14 @@
TS_CP((src), (dst), it_value); \
} while (0)
+#define FU64_CP(src, dst, fld) do { \
+ _Static_assert(sizeof((src).fld) == sizeof(uint64_t), \
+ "FU64_CP src: " #src "." #fld "is not 8 bytes"); \
+ _Static_assert(sizeof((dst).fld) == sizeof(uint64_t), \
+ "FU64_CP dst: " #dst "." #fld "is not 8 bytes"); \
+ memcpy(&(dst).fld, &(src).fld, sizeof(uint64_t)); \
+} while (0)
+
#define BT_CP(src, dst, fld) do { \
CP((src).fld, (dst).fld, sec); \
*(uint64_t *)&(dst).fld.frac[0] = (src).fld.frac; \