Page MenuHomeFreeBSD

D54663.diff
No OneTemporary

D54663.diff

diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
--- 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
@@ -61,7 +70,7 @@
struct bintime32 {
time32_t sec;
- uint32_t frac[2];
+ freebsd32_uint64_t frac;
};
struct ffclock_estimate32 {
diff --git a/sys/sys/abi_compat.h b/sys/sys/abi_compat.h
--- a/sys/sys/abi_compat.h
+++ b/sys/sys/abi_compat.h
@@ -67,9 +67,17 @@
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; \
+ FU64_CP((src).fld, (dst).fld, frac); \
} while (0)
#endif /* !_COMPAT_H_ */

File Metadata

Mime Type
text/plain
Expires
Sun, Jan 18, 9:11 AM (10 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27701991
Default Alt Text
D54663.diff (1 KB)

Event Timeline