Export `nova-core`'s Rust symbols so that other loadable modules, particularly `nova-drm`, can resolve references to `nova-core` at runtime.
This is done by generating declarations and `EXPORT_SYMBOL_GPL()` calls for Rust global text symbols using `nm` and compiling them into the module as `nova_core_exports.o`. This is a workaround until the build system supports Rust cross-crate dependencies natively. Signed-off-by: Alexandre Courbot <[email protected]> Reviewed-by: Joel Fernandes <[email protected]> --- drivers/gpu/nova-core/Makefile | 24 +++++++++++++++++++++++- drivers/gpu/nova-core/nova_core_exports.c | 13 +++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/Makefile b/drivers/gpu/nova-core/Makefile index 4ae544f808f4..59ac25488896 100644 --- a/drivers/gpu/nova-core/Makefile +++ b/drivers/gpu/nova-core/Makefile @@ -1,4 +1,26 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_NOVA_CORE) += nova-core.o -nova-core-y := nova_core.o +nova-core-y := nova_core.o nova_core_exports.o + +# Export Rust symbols so dependent modules can use them at runtime. +# +# This is a workaround until the build system supports Rust cross-module +# dependencies natively. +# Kbuild uses Rust v0 mangling, whose symbols start with "_R". +rust_exports = \ + $(NM) -p --defined-only $(1) | \ + awk '$$2 == "T" && $$3 ~ /^_R/ { \ + printf "extern void %s(void); EXPORT_SYMBOL_GPL(%s);\n", $$3, $$3 \ + }' + +define filechk_nova_core_exports + $(call rust_exports,$(obj)/nova_core.o) +endef + +$(obj)/exports_nova_core_generated.h: $(obj)/nova_core.o FORCE + $(call filechk,nova_core_exports) + +targets += exports_nova_core_generated.h + +$(obj)/nova_core_exports.o: $(obj)/exports_nova_core_generated.h diff --git a/drivers/gpu/nova-core/nova_core_exports.c b/drivers/gpu/nova-core/nova_core_exports.c new file mode 100644 index 000000000000..480472b039db --- /dev/null +++ b/drivers/gpu/nova-core/nova_core_exports.c @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + +/* + * Exports Rust symbols from the `nova_core` crate for use by dependent modules. + * + * This is a workaround until the build system supports Rust cross-module + * dependencies natively. + */ + +#include <linux/export.h> + +#include "exports_nova_core_generated.h" -- 2.54.0
