From 8a15b9e83e72a53462c32c501719d17f13ec5915 Mon Sep 17 00:00:00 2001 From: Broc Going Date: Fri, 3 Apr 2026 11:33:55 -0600 Subject: [PATCH] windows: added platform abstraction headers Added Windows and LInux platform abstraction headers. Updated files that include platform-specific files to include the new platform compatibility headers. Platform abstraction headers get installed under the platform subfolder. Signed-off-by: Broc Going --- libnvme/src/meson.build | 11 ++++ libnvme/src/nvme/accessors.h | 2 +- libnvme/src/nvme/cleanup.h | 5 +- libnvme/src/nvme/cmds.h | 3 +- libnvme/src/nvme/lib-types.h | 2 +- libnvme/src/nvme/lib.h | 3 +- libnvme/src/nvme/log.c | 5 +- libnvme/src/nvme/mi-mctp-compat.h | 2 +- libnvme/src/nvme/mi-mctp.c | 6 +- libnvme/src/nvme/mi.h | 3 +- libnvme/src/nvme/nbft.c | 4 +- libnvme/src/nvme/nbft.h | 2 +- libnvme/src/nvme/private.h | 7 +- libnvme/src/nvme/tree.c | 6 +- libnvme/src/nvme/types.h | 2 +- libnvme/src/nvme/util.c | 5 +- libnvme/src/platform/includes.h | 18 ++++++ libnvme/src/platform/linux.h | 30 +++++++++ libnvme/src/platform/types.h | 47 ++++++++++++++ libnvme/src/platform/windows.h | 64 +++++++++++++++++++ libnvme/tools/generator/generate-accessors.md | 2 +- libnvme/tools/generator/generate-accessors.py | 2 +- logging.c | 6 +- nvme-dummy.c | 1 + nvme-print-json.c | 4 +- nvme-print-stdout.c | 3 +- util/argconfig.h | 2 +- util/mem.c | 3 +- util/types.h | 2 +- 29 files changed, 201 insertions(+), 51 deletions(-) create mode 100644 libnvme/src/platform/includes.h create mode 100644 libnvme/src/platform/linux.h create mode 100644 libnvme/src/platform/types.h create mode 100644 libnvme/src/platform/windows.h diff --git a/libnvme/src/meson.build b/libnvme/src/meson.build index 15f08f1a84..e17d9e5b84 100644 --- a/libnvme/src/meson.build +++ b/libnvme/src/meson.build @@ -160,3 +160,14 @@ install_headers( subdir: 'nvme', install_mode: mode, ) + +# Install platform abstraction headers +install_headers([ + 'platform/includes.h', + 'platform/linux.h', + 'platform/windows.h', + 'platform/types.h' + ], + subdir: 'platform', + install_mode: mode, +) diff --git a/libnvme/src/nvme/accessors.h b/libnvme/src/nvme/accessors.h index 5c594dd127..ea0b20f74b 100644 --- a/libnvme/src/nvme/accessors.h +++ b/libnvme/src/nvme/accessors.h @@ -24,7 +24,7 @@ #include #include #include -#include /* __u32, __u64, etc. */ +#include /* __u32, __u64, etc. */ /* Forward declarations. These are internal (opaque) structs. */ struct nvme_path; diff --git a/libnvme/src/nvme/cleanup.h b/libnvme/src/nvme/cleanup.h index ac3461c655..ae35561696 100644 --- a/libnvme/src/nvme/cleanup.h +++ b/libnvme/src/nvme/cleanup.h @@ -3,13 +3,10 @@ #define __CLEANUP_H #include -#include #include #include -#include -#include -#include +#include #include "fabrics.h" diff --git a/libnvme/src/nvme/cmds.h b/libnvme/src/nvme/cmds.h index 47ea8ea55c..66969368e3 100644 --- a/libnvme/src/nvme/cmds.h +++ b/libnvme/src/nvme/cmds.h @@ -10,10 +10,11 @@ #pragma once -#include #include #include +#include + #include #include diff --git a/libnvme/src/nvme/lib-types.h b/libnvme/src/nvme/lib-types.h index 43eab2ddac..04a8afd017 100644 --- a/libnvme/src/nvme/lib-types.h +++ b/libnvme/src/nvme/lib-types.h @@ -8,7 +8,7 @@ */ #pragma once -#include +#include struct nvme_global_ctx; struct nvme_transport_handle; diff --git a/libnvme/src/nvme/lib.h b/libnvme/src/nvme/lib.h index 6efc245d9b..eae8483d8a 100644 --- a/libnvme/src/nvme/lib.h +++ b/libnvme/src/nvme/lib.h @@ -10,7 +10,8 @@ #include #include -#include + +#include #include diff --git a/libnvme/src/nvme/log.c b/libnvme/src/nvme/log.c index 705217a069..18cfc02531 100644 --- a/libnvme/src/nvme/log.c +++ b/libnvme/src/nvme/log.c @@ -10,10 +10,9 @@ #include #include -#include -#include #include -#include + +#include #include diff --git a/libnvme/src/nvme/mi-mctp-compat.h b/libnvme/src/nvme/mi-mctp-compat.h index b6427dda01..b60807fe7a 100644 --- a/libnvme/src/nvme/mi-mctp-compat.h +++ b/libnvme/src/nvme/mi-mctp-compat.h @@ -3,7 +3,7 @@ #ifndef _MI_MCTP_COMPAT_H #define _MI_MCTP_COMPAT_H -#include +#include /* As of kernel v5.15, these AF_MCTP-related definitions are provided by * linux/mctp.h. However, we provide a set here while that header percolates diff --git a/libnvme/src/nvme/mi-mctp.c b/libnvme/src/nvme/mi-mctp.c index d8daff4620..b90c392bc8 100644 --- a/libnvme/src/nvme/mi-mctp.c +++ b/libnvme/src/nvme/mi-mctp.c @@ -12,12 +12,8 @@ #include #include #include -#include -#include -#include -#include -#include +#include #if HAVE_LINUX_MCTP_H #include diff --git a/libnvme/src/nvme/mi.h b/libnvme/src/nvme/mi.h index d7beda872c..d131476654 100644 --- a/libnvme/src/nvme/mi.h +++ b/libnvme/src/nvme/mi.h @@ -82,9 +82,10 @@ */ #pragma once -#include #include +#include + #include /** diff --git a/libnvme/src/nvme/nbft.c b/libnvme/src/nvme/nbft.c index c2b96804c5..24c2ec8f78 100644 --- a/libnvme/src/nvme/nbft.c +++ b/libnvme/src/nvme/nbft.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include @@ -19,8 +19,6 @@ #include "private.h" #include "compiler_attributes.h" -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - static __u8 csum(const __u8 *buffer, ssize_t length) { int n; diff --git a/libnvme/src/nvme/nbft.h b/libnvme/src/nvme/nbft.h index 48d60ffb1b..7e2ff4c15f 100644 --- a/libnvme/src/nvme/nbft.h +++ b/libnvme/src/nvme/nbft.h @@ -10,7 +10,7 @@ #include -#include +#include #include #include diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index c3651fb958..048a305cbf 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -7,14 +7,9 @@ */ #pragma once -#include -#include -#include - -#include -#include #include #include +#include #include diff --git a/libnvme/src/nvme/tree.c b/libnvme/src/nvme/tree.c index 377f6e8ead..b54fb9f2f2 100644 --- a/libnvme/src/nvme/tree.c +++ b/libnvme/src/nvme/tree.c @@ -9,19 +9,17 @@ #include #include #include -#include #include #include #include #include #include -#include -#include -#include #include #include +#include + #include #include diff --git a/libnvme/src/nvme/types.h b/libnvme/src/nvme/types.h index 5eaaccb2bf..9f78b88ad6 100644 --- a/libnvme/src/nvme/types.h +++ b/libnvme/src/nvme/types.h @@ -12,7 +12,7 @@ #include #include -#include +#include /** * DOC: types.h diff --git a/libnvme/src/nvme/util.c b/libnvme/src/nvme/util.c index 70916d566d..a8c2d38e3e 100644 --- a/libnvme/src/nvme/util.c +++ b/libnvme/src/nvme/util.c @@ -16,12 +16,11 @@ #include #include -#include -#include -#include #include #include +#include + #include #include diff --git a/libnvme/src/platform/includes.h b/libnvme/src/platform/includes.h new file mode 100644 index 0000000000..bb1fc06386 --- /dev/null +++ b/libnvme/src/platform/includes.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * This file is part of libnvme. + * Copyright (c) 2025 Micron Technology, Inc. + * + * Common platform-specific includes and definitions. + */ + +#pragma once + +#include "platform/types.h" + +/* Platform-specific includes */ +#ifdef _WIN32 + #include "platform/windows.h" +#else + #include "platform/linux.h" +#endif diff --git a/libnvme/src/platform/linux.h b/libnvme/src/platform/linux.h new file mode 100644 index 0000000000..bdcf738543 --- /dev/null +++ b/libnvme/src/platform/linux.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * This file is part of libnvme. + * Copyright (c) 2026 Micron Technology, Inc. + * + * Linux platform-specific definitions and includes. + */ + +#pragma once + +/* Linux-specific includes */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include diff --git a/libnvme/src/platform/types.h b/libnvme/src/platform/types.h new file mode 100644 index 0000000000..60eda396e6 --- /dev/null +++ b/libnvme/src/platform/types.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * This file is part of libnvme. + * Copyright (c) 2026 Micron Technology, Inc. + * + * Platform compatibility for linux/types.h + */ +#ifndef _PLATFORM_TYPES_H +#define _PLATFORM_TYPES_H + +#ifdef _WIN32 + +#include + +/* Standard type definitions for linux/types.h compatibility */ +typedef uint8_t __u8; +typedef uint16_t __u16; +typedef uint32_t __u32; +typedef uint64_t __u64; +typedef int8_t __s8; +typedef int16_t __s16; +typedef int32_t __s32; +typedef int64_t __s64; + +/* Little-endian types (Windows is little-endian) */ +typedef __u16 __le16; +typedef __u32 __le32; +typedef __u64 __le64; +typedef __s16 __le16s; +typedef __s32 __le32s; +typedef __s64 __le64s; + +/* Big-endian types for completeness */ +typedef __u16 __be16; +typedef __u32 __be32; +typedef __u64 __be64; +typedef __s16 __be16s; +typedef __s32 __be32s; +typedef __s64 __be64s; + +#else + +#include + +#endif + +#endif /* _PLATFORM_TYPES_H */ diff --git a/libnvme/src/platform/windows.h b/libnvme/src/platform/windows.h new file mode 100644 index 0000000000..f9e2aad043 --- /dev/null +++ b/libnvme/src/platform/windows.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * This file is part of libnvme. + * Copyright (c) 2026 Micron Technology, Inc. + * + * Windows platform-specific definitions and includes. + */ + +#pragma once + +/* Windows-specific includes - winsock2 before windows.h to avoid warnings */ +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* endian.h compatibility */ + +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + #define htobe16(x) (x) + #define htobe32(x) (x) + #define htobe64(x) (x) + #define htole16(x) __builtin_bswap16(x) + #define htole32(x) __builtin_bswap32(x) + #define htole64(x) __builtin_bswap64(x) + #define le16toh(x) __builtin_bswap16(x) + #define le32toh(x) __builtin_bswap32(x) + #define le64toh(x) __builtin_bswap64(x) +#else + /* Little-endian (most common case for Windows) */ + #define htobe16(x) __builtin_bswap16(x) + #define htobe32(x) __builtin_bswap32(x) + #define htobe64(x) __builtin_bswap64(x) + #define htole16(x) (x) + #define htole32(x) (x) + #define htole64(x) (x) + #define le16toh(x) (x) + #define le32toh(x) (x) + #define le64toh(x) (x) +#endif + + +/* sys/param.h compatibility */ + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + + +/* + * More compatibility definitions and method implementations will be needed + * as Windows support is developed. For now, this file serves as a base + * implementation and an example of the proposed structure. + */ diff --git a/libnvme/tools/generator/generate-accessors.md b/libnvme/tools/generator/generate-accessors.md index 42702d9a12..48cac8d2c6 100644 --- a/libnvme/tools/generator/generate-accessors.md +++ b/libnvme/tools/generator/generate-accessors.md @@ -124,7 +124,7 @@ python3 generate-accessors.py person.h #include #include #include -#include /* __u32, __u64, etc. */ +#include /* __u32, __u64, etc. */ /* Forward declarations. These are internal (opaque) structs. */ struct person; diff --git a/libnvme/tools/generator/generate-accessors.py b/libnvme/tools/generator/generate-accessors.py index e8085eedb7..4967872f9d 100755 --- a/libnvme/tools/generator/generate-accessors.py +++ b/libnvme/tools/generator/generate-accessors.py @@ -622,7 +622,7 @@ def main(): f'#include \n' f'#include \n' f'#include \n' - f'#include /* __u32, __u64, etc. */\n' + f'#include /* __u32, __u64, etc. */\n' f'\n' ) f.write('/* Forward declarations. These are internal (opaque) structs. */\n') diff --git a/logging.c b/logging.c index 556d383893..0d87fba367 100644 --- a/logging.c +++ b/logging.c @@ -6,11 +6,7 @@ #include #include -#include - -#include -#include -#include +#include #include diff --git a/nvme-dummy.c b/nvme-dummy.c index 15cf908226..009884c8ee 100644 --- a/nvme-dummy.c +++ b/nvme-dummy.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include int main(int argc, char **argv) { diff --git a/nvme-print-json.c b/nvme-print-json.c index 4b58ad25c9..f037ae0c2b 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -4,10 +4,8 @@ #include #include #include -#include -#include +#include #include - #include #include "nvme-print.h" diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 404dd363dc..826c74eba6 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -7,8 +7,7 @@ #include #include #include -#include -#include +#include #include #include #include diff --git a/util/argconfig.h b/util/argconfig.h index 2bbd567628..5b426e2c7b 100644 --- a/util/argconfig.h +++ b/util/argconfig.h @@ -41,7 +41,7 @@ #include #include -#include +#include enum argconfig_types { CFG_FLAG, diff --git a/util/mem.c b/util/mem.c index 2b97632d82..4d48c838a0 100644 --- a/util/mem.c +++ b/util/mem.c @@ -3,7 +3,8 @@ #include #include #include -#include + +#include #include "mem.h" diff --git a/util/types.h b/util/types.h index c009f2f1fa..bb032227cf 100644 --- a/util/types.h +++ b/util/types.h @@ -7,7 +7,7 @@ #include #include -#include +#include #include