* [PATCH V11 0/4] Rust support for powerpc
@ 2026-04-17 15:22 Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error Mukesh Kumar Chaurasiya (IBM)
` (3 more replies)
0 siblings, 4 replies; 18+ messages in thread
From: Mukesh Kumar Chaurasiya (IBM) @ 2026-04-17 15:22 UTC (permalink / raw)
To: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Cc: Mukesh Kumar Chaurasiya (IBM)
Enable experimental rust support for ppc64le and ppc32be. The patch for
ppc32 has been provided by Link Mauve[1] and ppc64le support[2] has been
merged over it. ppc32 needs some toolchain fixes mentioned in the patch
`rust: Add PowerPC support` and the discussion for that is done here[1].
This has been tested on
- powernv9 hardware
- pseries P11 hardware
- pseries(9, 10) qemu
- powernv(9, 10) qemu
- rustdoc on x86 and powerpc64le
- rusttest on x86 and powerpc64le
We are actively working with our LLVM team to get the target for ppc,
ppc64 and ppc64le in the rust compiler.
[1] https://lore.kernel.org/all/20260204030507.8203-1-linkmauve@linkmauve.fr
[2] https://lore.kernel.org/all/20260204042417.83903-1-mkchauras@gmail.com
Changelog:
V10 -> V11:
- Updated `rust/Makefile`
- Not all libraries are move to `rust/host` directory now. Only
proc_macro2, quote and syn are moved
- Special handling for pin init is added. Details in commit
- Removed mkdir for `rust/host`, this is now handled by toolchain.
V10: https://lore.kernel.org/all/20260406200149.3727922-1-mkchauras@gmail.com/
V9 -> V10:
- rust/Makefile updated with review comments from Miguel
- Patch 1/4 updated with commit message and subject
V9: https://lore.kernel.org/all/20260404121610.1956528-1-mkchauras@gmail.com/
V8 -> V9:
- rust/Makefile updated with a directory instead of abspath
V8: https://lore.kernel.org/all/20260403145308.1042622-1-mkchauras@gmail.com/
V7 -> V8:
- rust/Makefile updated to separate host libraries from target
V7: https://lore.kernel.org/all/20260329160254.2592207-1-mkchauras@gmail.com/
Changelog:
V6 -> V7:
- Documentation removed as powerpc is still under development
- Added a fix for race condition in rust/Makefile
V6: https://lore.kernel.org/all/20260210090023.2587534-1-mkchauras@gmail.com
V5 -> V6:
- Added a missing Tested by from Venkat which got missed since V3
- Support is marked as Maintained instead of experimental
V5: https://lore.kernel.org/all/20260210053756.2088302-1-mkchauras@gmail.com
V4 -> V5:
- Removed a nested ifdef from PPC64 for Little endian toolchain
V4: https://lore.kernel.org/all/20260209105456.1551677-1-mkchauras@gmail.com
V3 -> V4:
- Co-developed-by header added in patch 1
V3: https://lore.kernel.org/all/20260205180429.3280657-1-mkchauras@gmail.com
V2 -> V3:
- Splited HAVE_RUST in 2 lines
- BINDGEN_TARGET_powerpc initialized before assigning the same to
BINDGEN_TARGET
V2: https://lore.kernel.org/all/20260204210125.613350-1-mkchauras@gmail.com
V1 -> V2:
- jump label fix for rust has been moved to a separate patch
- PPC32 support has been taken
- rust support has been marked experimental
- target.json dependency has been removed
- HAVE_RUST now depends on CPU_LITTLE_ENDIAN for PPC64
Link Mauve (1):
rust: Add PowerPC support
Mukesh Kumar Chaurasiya (IBM) (3):
rust: Fix "multiple candidates for rmeta dependency core" error
powerpc/jump_label: adjust inline asm to be consistent
powerpc: Enable Rust for ppc64le
arch/powerpc/Kconfig | 2 ++
arch/powerpc/Makefile | 7 ++++
arch/powerpc/include/asm/jump_label.h | 23 +++++++------
rust/Makefile | 48 +++++++++++++++++----------
4 files changed, 52 insertions(+), 28 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-17 15:22 [PATCH V11 0/4] Rust support for powerpc Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-17 15:22 ` Mukesh Kumar Chaurasiya (IBM)
2026-04-21 9:38 ` Link Mauve
2026-04-17 15:22 ` [PATCH V11 2/4] powerpc/jump_label: adjust inline asm to be consistent Mukesh Kumar Chaurasiya (IBM)
` (2 subsequent siblings)
3 siblings, 1 reply; 18+ messages in thread
From: Mukesh Kumar Chaurasiya (IBM) @ 2026-04-17 15:22 UTC (permalink / raw)
To: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Cc: Mukesh Kumar Chaurasiya (IBM)
When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
encounters an error: "multiple candidates for `rmeta` dependency `core`
found", with two candidates:
1. The host's standard library from the rustup toolchain
2. The kernel's custom libcore.rmeta in the rust/ directory
This occurs because the build system uses `-L$(objtree)/rust` for host
library builds (proc_macro2, quote, syn), which causes rustc to search
the rust/ directory. During this search, rustc finds both the kernel's
custom libcore.rmeta and gains access to the host's standard library,
creating a conflict.
The solution is to separate host libraries into a dedicated rust/host/
subdirectory and use `-L$(objtree)/rust/host` for host builds instead
of `-L$(objtree)/rust`. This ensures that:
1. Host library builds (proc_macro2, quote, syn) only search rust/host/
and never encounter the kernel's libcore.rmeta
2. Proc macro builds use `-L$(objtree)/rust/host` to find their
dependencies
Special handling is added for rustdoc-pin_init, which is a host build
(to access the alloc crate) but depends on proc macros from the main
rust/ directory. It uses explicit `--extern` paths to reference the
proc macros without adding `-L$(objtree)/rust`, which would reintroduce
the conflict.
The rust/host/ directory is added to clean-files to ensure it's removed
during `make clean`.
Link: https://github.com/Rust-for-Linux/linux/issues/105
Link: https://github.com/linuxppc/issues/issues/451
Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
---
rust/Makefile | 38 +++++++++++++++++++++-----------------
1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/rust/Makefile b/rust/Makefile
index 9801af2e1e02..e234b8a39358 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -3,6 +3,9 @@
# Where to place rustdoc generated documentation
rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
+# Clean generated host directory
+clean-files := host/
+
obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
always-$(CONFIG_RUST) += exports_core_generated.h
@@ -27,7 +30,7 @@ endif
obj-$(CONFIG_RUST) += exports.o
-always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
+always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
@@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
OBJTREE=$(abspath $(objtree)) \
$(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
- $(rustc_target_flags) -L$(objtree)/$(obj) \
+ $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
-Zunstable-options --generate-link-to-definition \
--output $(rustdoc_output) \
--crate-name $(subst rustdoc-,,$@) \
@@ -237,6 +240,7 @@ rustdoc-pin_init_internal: $(src)/pin-init/internal/src/lib.rs \
rustdoc-pin_init: private rustdoc_host = yes
rustdoc-pin_init: private rustc_target_flags = $(pin_init-flags) \
+ --extern pin_init_internal=$(objtree)/$(obj)/$(libpin_init_internal_name) \
--extern alloc --cfg feature=\"alloc\"
rustdoc-pin_init: $(src)/pin-init/src/lib.rs rustdoc-pin_init_internal \
rustdoc-macros FORCE
@@ -528,23 +532,23 @@ quiet_cmd_rustc_procmacrolibrary = $(RUSTC_OR_CLIPPY_QUIET) PL $@
$(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
$(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
--emit=dep-info=$(depfile) --emit=link=$@ --crate-type rlib -O \
- --out-dir $(objtree)/$(obj) -L$(objtree)/$(obj) \
+ --out-dir $(objtree)/$(obj)/host -\L$(objtree)/$(obj)/host \
--crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<
-$(obj)/libproc_macro2.rlib: private skip_clippy = 1
-$(obj)/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
-$(obj)/libproc_macro2.rlib: $(src)/proc-macro2/lib.rs FORCE
+$(obj)/host/libproc_macro2.rlib: private skip_clippy = 1
+$(obj)/host/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
+$(obj)/host/libproc_macro2.rlib: $(src)/proc-macro2/lib.rs FORCE
+$(call if_changed_dep,rustc_procmacrolibrary)
-$(obj)/libquote.rlib: private skip_clippy = 1
-$(obj)/libquote.rlib: private skip_flags = $(quote-skip_flags)
-$(obj)/libquote.rlib: private rustc_target_flags = $(quote-flags)
-$(obj)/libquote.rlib: $(src)/quote/lib.rs $(obj)/libproc_macro2.rlib FORCE
+$(obj)/host/libquote.rlib: private skip_clippy = 1
+$(obj)/host/libquote.rlib: private skip_flags = $(quote-skip_flags)
+$(obj)/host/libquote.rlib: private rustc_target_flags = $(quote-flags)
+$(obj)/host/libquote.rlib: $(src)/quote/lib.rs $(obj)/host/libproc_macro2.rlib FORCE
+$(call if_changed_dep,rustc_procmacrolibrary)
-$(obj)/libsyn.rlib: private skip_clippy = 1
-$(obj)/libsyn.rlib: private rustc_target_flags = $(syn-flags)
-$(obj)/libsyn.rlib: $(src)/syn/lib.rs $(obj)/libquote.rlib FORCE
+$(obj)/host/libsyn.rlib: private skip_clippy = 1
+$(obj)/host/libsyn.rlib: private rustc_target_flags = $(syn-flags)
+$(obj)/host/libsyn.rlib: $(src)/syn/lib.rs $(obj)/host/libquote.rlib FORCE
+$(call if_changed_dep,rustc_procmacrolibrary)
quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_QUIET) P $@
@@ -553,20 +557,20 @@ quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_QUIET) P $@
-Clinker-flavor=gcc -Clinker=$(HOSTCC) \
-Clink-args='$(call escsq,$(KBUILD_PROCMACROLDFLAGS))' \
--emit=dep-info=$(depfile) --emit=link=$@ --extern proc_macro \
- --crate-type proc-macro -L$(objtree)/$(obj) \
+ --crate-type proc-macro -L$(objtree)/$(obj)/host \
--crate-name $(patsubst lib%.$(libmacros_extension),%,$(notdir $@)) \
@$(objtree)/include/generated/rustc_cfg $<
# Procedural macros can only be used with the `rustc` that compiled it.
$(obj)/$(libmacros_name): private rustc_target_flags = \
--extern proc_macro2 --extern quote --extern syn
-$(obj)/$(libmacros_name): $(src)/macros/lib.rs $(obj)/libproc_macro2.rlib \
- $(obj)/libquote.rlib $(obj)/libsyn.rlib FORCE
+$(obj)/$(libmacros_name): $(src)/macros/lib.rs $(obj)/host/libproc_macro2.rlib \
+ $(obj)/host/libquote.rlib $(obj)/host/libsyn.rlib FORCE
+$(call if_changed_dep,rustc_procmacro)
$(obj)/$(libpin_init_internal_name): private rustc_target_flags = $(pin_init_internal-flags)
$(obj)/$(libpin_init_internal_name): $(src)/pin-init/internal/src/lib.rs \
- $(obj)/libproc_macro2.rlib $(obj)/libquote.rlib $(obj)/libsyn.rlib FORCE
+ $(obj)/host/libproc_macro2.rlib $(obj)/host/libquote.rlib $(obj)/host/libsyn.rlib FORCE
+$(call if_changed_dep,rustc_procmacro)
# `rustc` requires `-Zunstable-options` to use custom target specifications
--
2.53.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH V11 2/4] powerpc/jump_label: adjust inline asm to be consistent
2026-04-17 15:22 [PATCH V11 0/4] Rust support for powerpc Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-17 15:22 ` Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 3/4] rust: Add PowerPC support Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 4/4] powerpc: Enable Rust for ppc64le Mukesh Kumar Chaurasiya (IBM)
3 siblings, 0 replies; 18+ messages in thread
From: Mukesh Kumar Chaurasiya (IBM) @ 2026-04-17 15:22 UTC (permalink / raw)
To: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Cc: Mukesh Kumar Chaurasiya (IBM)
Added support for a new macro ARCH_STATIC_BRANCH_ASM in powerpc
to avoid duplication of inline asm between C and Rust. This is
inline with 'commit aecaf181651c ("jump_label: adjust inline asm to be consistent")'
Co-developed-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
Reviewed-by: Gary Guo <gary@garyguo.net>
Link: https://github.com/Rust-for-Linux/linux/issues/105
Link: https://github.com/linuxppc/issues/issues/451
Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
---
arch/powerpc/include/asm/jump_label.h | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/arch/powerpc/include/asm/jump_label.h b/arch/powerpc/include/asm/jump_label.h
index d4eaba459a0e..3016e9c8d6bc 100644
--- a/arch/powerpc/include/asm/jump_label.h
+++ b/arch/powerpc/include/asm/jump_label.h
@@ -15,14 +15,20 @@
#define JUMP_ENTRY_TYPE stringify_in_c(FTR_ENTRY_LONG)
#define JUMP_LABEL_NOP_SIZE 4
+#define JUMP_TABLE_ENTRY(key, label) \
+ ".pushsection __jump_table, \"aw\" \n\t" \
+ ".long 1b - ., " label " - . \n\t" \
+ JUMP_ENTRY_TYPE key " - . \n\t" \
+ ".popsection \n\t"
+
+#define ARCH_STATIC_BRANCH_ASM(key, label) \
+ "1: nop \n\t" \
+ JUMP_TABLE_ENTRY(key, label)
+
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
{
- asm goto("1:\n\t"
- "nop # arch_static_branch\n\t"
- ".pushsection __jump_table, \"aw\"\n\t"
- ".long 1b - ., %l[l_yes] - .\n\t"
- JUMP_ENTRY_TYPE "%c0 - .\n\t"
- ".popsection \n\t"
+ asm goto(
+ ARCH_STATIC_BRANCH_ASM("%c0", "%l[l_yes]")
: : "i" (&((char *)key)[branch]) : : l_yes);
return false;
@@ -34,10 +40,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key *key, bool
{
asm goto("1:\n\t"
"b %l[l_yes] # arch_static_branch_jump\n\t"
- ".pushsection __jump_table, \"aw\"\n\t"
- ".long 1b - ., %l[l_yes] - .\n\t"
- JUMP_ENTRY_TYPE "%c0 - .\n\t"
- ".popsection \n\t"
+ JUMP_TABLE_ENTRY("%c0", "%l[l_yes]")
: : "i" (&((char *)key)[branch]) : : l_yes);
return false;
--
2.53.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH V11 3/4] rust: Add PowerPC support
2026-04-17 15:22 [PATCH V11 0/4] Rust support for powerpc Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 2/4] powerpc/jump_label: adjust inline asm to be consistent Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-17 15:22 ` Mukesh Kumar Chaurasiya (IBM)
2026-04-21 15:59 ` Gary Guo
2026-04-17 15:22 ` [PATCH V11 4/4] powerpc: Enable Rust for ppc64le Mukesh Kumar Chaurasiya (IBM)
3 siblings, 1 reply; 18+ messages in thread
From: Mukesh Kumar Chaurasiya (IBM) @ 2026-04-17 15:22 UTC (permalink / raw)
To: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Cc: Link Mauve, Mukesh Kumar Chaurasiya (IBM)
From: Link Mauve <linkmauve@linkmauve.fr>
For now only Big Endian 32-bit PowerPC is supported, as that is the only
hardware I have. This has been tested on the Nintendo Wii so far, but I
plan on also using it on the GameCube, Wii U and Apple G4.
These changes aren’t the only ones required to get the kernel to compile
and link on PowerPC, libcore will also have to be changed to not use
integer division to format u64, u128 and core::time::Duration, otherwise
__udivdi3() and __umoddi3() will have to be added. I have tested this
change by replacing the three implementations with unimplemented!() and
it linked just fine.
Signed-off-by: Link Mauve <linkmauve@linkmauve.fr>
Link: https://github.com/Rust-for-Linux/linux/issues/105
Link: https://github.com/linuxppc/issues/issues/451
Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 2 ++
rust/Makefile | 4 +++-
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 10240cb80904..1246b3add8ff 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -284,6 +284,7 @@ config PPC
select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_RELIABLE_STACKTRACE
select HAVE_RSEQ
+ select HAVE_RUST if PPC32
select HAVE_SAMPLE_FTRACE_DIRECT if HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_SETUP_PER_CPU_AREA if PPC64
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index a58b1029592c..589613eaa5dc 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -61,6 +61,8 @@ else
KBUILD_LDFLAGS_MODULE += $(objtree)/arch/powerpc/lib/crtsavres.o
endif
+KBUILD_RUSTFLAGS += --target=powerpc-unknown-linux-gnu
+
ifdef CONFIG_CPU_LITTLE_ENDIAN
KBUILD_CPPFLAGS += -mlittle-endian
KBUILD_LDFLAGS += -EL
diff --git a/rust/Makefile b/rust/Makefile
index e234b8a39358..af0c8ab2e5b6 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -406,13 +406,15 @@ bindgen_skip_c_flags := -mno-fp-ret-in-387 -mpreferred-stack-boundary=% \
-fstrict-flex-arrays=% -fmin-function-alignment=% \
-fzero-init-padding-bits=% -mno-fdpic \
-fdiagnostics-show-context -fdiagnostics-show-context=% \
- --param=% --param asan-% -fno-isolate-erroneous-paths-dereference
+ --param=% --param asan-% -fno-isolate-erroneous-paths-dereference \
+ -ffixed-r2 -mmultiple -mno-readonly-in-sdata
# Derived from `scripts/Makefile.clang`.
BINDGEN_TARGET_x86 := x86_64-linux-gnu
BINDGEN_TARGET_arm64 := aarch64-linux-gnu
BINDGEN_TARGET_arm := arm-linux-gnueabi
BINDGEN_TARGET_loongarch := loongarch64-linux-gnusf
+BINDGEN_TARGET_powerpc := powerpc-linux-gnu
BINDGEN_TARGET_um := $(BINDGEN_TARGET_$(SUBARCH))
BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH))
--
2.53.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH V11 4/4] powerpc: Enable Rust for ppc64le
2026-04-17 15:22 [PATCH V11 0/4] Rust support for powerpc Mukesh Kumar Chaurasiya (IBM)
` (2 preceding siblings ...)
2026-04-17 15:22 ` [PATCH V11 3/4] rust: Add PowerPC support Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-17 15:22 ` Mukesh Kumar Chaurasiya (IBM)
2026-04-21 15:59 ` Gary Guo
3 siblings, 1 reply; 18+ messages in thread
From: Mukesh Kumar Chaurasiya (IBM) @ 2026-04-17 15:22 UTC (permalink / raw)
To: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Cc: Mukesh Kumar Chaurasiya (IBM), Link Mauve, Venkat Rao Bagalkote
Enabling rust support for ppc64le.
Tested on pseries Power11:
╰─❯ dmesg | grep rust
[ 0.225728] Initialise system trusted keyrings
[ 0.270961] rust_minimal: Rust minimal sample (init)
[ 0.270968] rust_minimal: Am I built-in? true
[ 0.270974] rust_minimal: test_parameter: 1
[ 0.270983] rust_misc_device: Initialising Rust Misc Device Sample
[ 0.271012] rust_print: Rust printing macros sample (init)
[ 0.271019] rust_print: Emergency message (level 0) without args
[ 0.271023] rust_print: Alert message (level 1) without args
[ 0.271026] rust_print: Critical message (level 2) without args
[ 0.271030] rust_print: Error message (level 3) without args
[ 0.271033] rust_print: Warning message (level 4) without args
[ 0.271037] rust_print: Notice message (level 5) without args
[ 0.271040] rust_print: Info message (level 6) without args
[ 0.271043] rust_print: A line that is continued without args
[ 0.271054] rust_print: Emergency message (level 0) with args
[ 0.271064] rust_print: Alert message (level 1) with args
[ 0.271072] rust_print: Critical message (level 2) with args
[ 0.271077] rust_print: Error message (level 3) with args
[ 0.271083] rust_print: Warning message (level 4) with args
[ 0.271091] rust_print: Notice message (level 5) with args
[ 0.271097] rust_print: Info message (level 6) with args
[ 0.271102] rust_print: A line that is continued with args
[ 0.271110] rust_print: 1
[ 0.271113] rust_print: "hello, world"
[ 0.271121] rust_print: [samples/rust/rust_print_main.rs:35:5] c = "hello, world"
[ 0.271129] rust_print: Arc<dyn Display> says 42
[ 0.271130] rust_print: Arc<dyn Display> says hello, world
[ 0.271136] rust_print: "hello, world"
[ 0.271198] usbcore: registered new interface driver rust_driver_usb
[ 0.271207] rust_faux_driver: Initialising Rust Faux Device Sample
[ 0.271227] faux_driver rust-faux-sample-device: Hello from faux device!
[ 0.271297] rust_configfs: Rust configfs sample (init)
Reviewed-by: Link Mauve <linkmauve@linkmauve.fr>
Tested-by: Link Mauve <linkmauve@linkmauve.fr>
Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Link: https://github.com/Rust-for-Linux/linux/issues/105
Link: https://github.com/linuxppc/issues/issues/451
Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 7 ++++++-
rust/Makefile | 6 ++++++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 1246b3add8ff..a5f50434daf3 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -285,6 +285,7 @@ config PPC
select HAVE_RELIABLE_STACKTRACE
select HAVE_RSEQ
select HAVE_RUST if PPC32
+ select HAVE_RUST if PPC64 && CPU_LITTLE_ENDIAN
select HAVE_SAMPLE_FTRACE_DIRECT if HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
select HAVE_SETUP_PER_CPU_AREA if PPC64
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 589613eaa5dc..9385db478c59 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -61,7 +61,12 @@ else
KBUILD_LDFLAGS_MODULE += $(objtree)/arch/powerpc/lib/crtsavres.o
endif
-KBUILD_RUSTFLAGS += --target=powerpc-unknown-linux-gnu
+ifdef CONFIG_PPC64
+KBUILD_RUSTFLAGS += --target=powerpc64le-unknown-linux-gnu
+KBUILD_RUSTFLAGS += -Ctarget-feature=-mma,-vsx,-hard-float,-altivec
+else
+KBUILD_RUSTFLAGS += --target=powerpc-unknown-linux-gnu
+endif
ifdef CONFIG_CPU_LITTLE_ENDIAN
KBUILD_CPPFLAGS += -mlittle-endian
diff --git a/rust/Makefile b/rust/Makefile
index af0c8ab2e5b6..99537c2c55ee 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -414,7 +414,13 @@ BINDGEN_TARGET_x86 := x86_64-linux-gnu
BINDGEN_TARGET_arm64 := aarch64-linux-gnu
BINDGEN_TARGET_arm := arm-linux-gnueabi
BINDGEN_TARGET_loongarch := loongarch64-linux-gnusf
+
+ifdef CONFIG_PPC64
+BINDGEN_TARGET_powerpc := powerpc64le-linux-gnu
+else
BINDGEN_TARGET_powerpc := powerpc-linux-gnu
+endif
+
BINDGEN_TARGET_um := $(BINDGEN_TARGET_$(SUBARCH))
BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH))
--
2.53.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-17 15:22 ` [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-21 9:38 ` Link Mauve
2026-04-21 9:55 ` Mukesh Kumar Chaurasiya
0 siblings, 1 reply; 18+ messages in thread
From: Link Mauve @ 2026-04-21 9:38 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya (IBM)
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
Hi Mukesh,
This patch doesn’t apply on top of mainline, which tree did you base it
off?
On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> encounters an error: "multiple candidates for `rmeta` dependency `core`
> found", with two candidates:
> 1. The host's standard library from the rustup toolchain
> 2. The kernel's custom libcore.rmeta in the rust/ directory
>
> This occurs because the build system uses `-L$(objtree)/rust` for host
> library builds (proc_macro2, quote, syn), which causes rustc to search
> the rust/ directory. During this search, rustc finds both the kernel's
> custom libcore.rmeta and gains access to the host's standard library,
> creating a conflict.
>
> The solution is to separate host libraries into a dedicated rust/host/
> subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> of `-L$(objtree)/rust`. This ensures that:
>
> 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> and never encounter the kernel's libcore.rmeta
> 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> dependencies
>
> Special handling is added for rustdoc-pin_init, which is a host build
> (to access the alloc crate) but depends on proc macros from the main
> rust/ directory. It uses explicit `--extern` paths to reference the
> proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> the conflict.
>
> The rust/host/ directory is added to clean-files to ensure it's removed
> during `make clean`.
>
> Link: https://github.com/Rust-for-Linux/linux/issues/105
> Link: https://github.com/linuxppc/issues/issues/451
> Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> ---
> rust/Makefile | 38 +++++++++++++++++++++-----------------
> 1 file changed, 21 insertions(+), 17 deletions(-)
>
> diff --git a/rust/Makefile b/rust/Makefile
> index 9801af2e1e02..e234b8a39358 100644
> --- a/rust/Makefile
> +++ b/rust/Makefile
> @@ -3,6 +3,9 @@
> # Where to place rustdoc generated documentation
> rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
>
> +# Clean generated host directory
> +clean-files := host/
> +
> obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> always-$(CONFIG_RUST) += exports_core_generated.h
>
> @@ -27,7 +30,7 @@ endif
>
> obj-$(CONFIG_RUST) += exports.o
>
> -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
>
> always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> OBJTREE=$(abspath $(objtree)) \
> $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
The issue is here ↑, --remap-path-prefix=% got removed and the two
previous lines got merged into one.
> - $(rustc_target_flags) -L$(objtree)/$(obj) \
> + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> -Zunstable-options --generate-link-to-definition \
> --output $(rustdoc_output) \
> --crate-name $(subst rustdoc-,,$@) \
[…]
Thanks anyway for iterating on this series! I’ve started writing a DRM
driver based off a previous version. :)
--
Link Mauve
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 9:38 ` Link Mauve
@ 2026-04-21 9:55 ` Mukesh Kumar Chaurasiya
2026-04-21 10:26 ` Link Mauve
0 siblings, 1 reply; 18+ messages in thread
From: Mukesh Kumar Chaurasiya @ 2026-04-21 9:55 UTC (permalink / raw)
To: Link Mauve
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
> Hi Mukesh,
>
> This patch doesn’t apply on top of mainline, which tree did you base it
> off?
>
It was on mainline v7.0 tag.
On latest there is a confilict. I'll send out a rebased version.
> On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> > encounters an error: "multiple candidates for `rmeta` dependency `core`
> > found", with two candidates:
> > 1. The host's standard library from the rustup toolchain
> > 2. The kernel's custom libcore.rmeta in the rust/ directory
> >
> > This occurs because the build system uses `-L$(objtree)/rust` for host
> > library builds (proc_macro2, quote, syn), which causes rustc to search
> > the rust/ directory. During this search, rustc finds both the kernel's
> > custom libcore.rmeta and gains access to the host's standard library,
> > creating a conflict.
> >
> > The solution is to separate host libraries into a dedicated rust/host/
> > subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> > of `-L$(objtree)/rust`. This ensures that:
> >
> > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> > and never encounter the kernel's libcore.rmeta
> > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> > dependencies
> >
> > Special handling is added for rustdoc-pin_init, which is a host build
> > (to access the alloc crate) but depends on proc macros from the main
> > rust/ directory. It uses explicit `--extern` paths to reference the
> > proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> > the conflict.
> >
> > The rust/host/ directory is added to clean-files to ensure it's removed
> > during `make clean`.
> >
> > Link: https://github.com/Rust-for-Linux/linux/issues/105
> > Link: https://github.com/linuxppc/issues/issues/451
> > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> > ---
> > rust/Makefile | 38 +++++++++++++++++++++-----------------
> > 1 file changed, 21 insertions(+), 17 deletions(-)
> >
> > diff --git a/rust/Makefile b/rust/Makefile
> > index 9801af2e1e02..e234b8a39358 100644
> > --- a/rust/Makefile
> > +++ b/rust/Makefile
> > @@ -3,6 +3,9 @@
> > # Where to place rustdoc generated documentation
> > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
> >
> > +# Clean generated host directory
> > +clean-files := host/
> > +
> > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> > always-$(CONFIG_RUST) += exports_core_generated.h
> >
> > @@ -27,7 +30,7 @@ endif
> >
> > obj-$(CONFIG_RUST) += exports.o
> >
> > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
> >
> > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> > OBJTREE=$(abspath $(objtree)) \
> > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> > $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
>
> The issue is here ↑, --remap-path-prefix=% got removed and the two
> previous lines got merged into one.
>
Yeah will fix this.
> > - $(rustc_target_flags) -L$(objtree)/$(obj) \
> > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> > -Zunstable-options --generate-link-to-definition \
> > --output $(rustdoc_output) \
> > --crate-name $(subst rustdoc-,,$@) \
> […]
>
> Thanks anyway for iterating on this series! I’ve started writing a DRM
> driver based off a previous version. :)
>
That's cool. Thanks.
Regards,
Mukesh
> --
> Link Mauve
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 9:55 ` Mukesh Kumar Chaurasiya
@ 2026-04-21 10:26 ` Link Mauve
2026-04-21 12:19 ` Mukesh Kumar Chaurasiya
2026-04-21 15:59 ` Gary Guo
0 siblings, 2 replies; 18+ messages in thread
From: Link Mauve @ 2026-04-21 10:26 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya
Cc: Link Mauve, maddy, mpe, npiggin, chleroy, peterz, jpoimboe,
jbaron, aliceryhl, rostedt, ardb, ojeda, boqun, gary, bjorn3_gh,
lossin, a.hindborg, tmgross, dakr, nathan, nick.desaulniers+lkml,
morbo, justinstitt, linuxppc-dev, linux-kernel, rust-for-linux,
llvm
[-- Attachment #1: Type: text/plain, Size: 4468 bytes --]
On Tue, Apr 21, 2026 at 03:25:22PM +0530, Mukesh Kumar Chaurasiya wrote:
> On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
> > Hi Mukesh,
> >
> > This patch doesn’t apply on top of mainline, which tree did you base it
> > off?
> >
> It was on mainline v7.0 tag.
Great thanks, they do apply there!
I needed three more patches for the kernel to build on PPC32, I’ve
attached them but they are absolutely not patches which could go into
the kernel (except for the second, enabling asm_experimental_arch).
What do you think we should do about them?
> On latest there is a confilict. I'll send out a rebased version.
>
> > On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> > > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> > > encounters an error: "multiple candidates for `rmeta` dependency `core`
> > > found", with two candidates:
> > > 1. The host's standard library from the rustup toolchain
> > > 2. The kernel's custom libcore.rmeta in the rust/ directory
> > >
> > > This occurs because the build system uses `-L$(objtree)/rust` for host
> > > library builds (proc_macro2, quote, syn), which causes rustc to search
> > > the rust/ directory. During this search, rustc finds both the kernel's
> > > custom libcore.rmeta and gains access to the host's standard library,
> > > creating a conflict.
> > >
> > > The solution is to separate host libraries into a dedicated rust/host/
> > > subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> > > of `-L$(objtree)/rust`. This ensures that:
> > >
> > > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> > > and never encounter the kernel's libcore.rmeta
> > > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> > > dependencies
> > >
> > > Special handling is added for rustdoc-pin_init, which is a host build
> > > (to access the alloc crate) but depends on proc macros from the main
> > > rust/ directory. It uses explicit `--extern` paths to reference the
> > > proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> > > the conflict.
> > >
> > > The rust/host/ directory is added to clean-files to ensure it's removed
> > > during `make clean`.
> > >
> > > Link: https://github.com/Rust-for-Linux/linux/issues/105
> > > Link: https://github.com/linuxppc/issues/issues/451
> > > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> > > ---
> > > rust/Makefile | 38 +++++++++++++++++++++-----------------
> > > 1 file changed, 21 insertions(+), 17 deletions(-)
> > >
> > > diff --git a/rust/Makefile b/rust/Makefile
> > > index 9801af2e1e02..e234b8a39358 100644
> > > --- a/rust/Makefile
> > > +++ b/rust/Makefile
> > > @@ -3,6 +3,9 @@
> > > # Where to place rustdoc generated documentation
> > > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
> > >
> > > +# Clean generated host directory
> > > +clean-files := host/
> > > +
> > > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> > > always-$(CONFIG_RUST) += exports_core_generated.h
> > >
> > > @@ -27,7 +30,7 @@ endif
> > >
> > > obj-$(CONFIG_RUST) += exports.o
> > >
> > > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> > > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
> > >
> > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> > > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> > > OBJTREE=$(abspath $(objtree)) \
> > > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> > > $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
> >
> > The issue is here ↑, --remap-path-prefix=% got removed and the two
> > previous lines got merged into one.
> >
> Yeah will fix this.
> > > - $(rustc_target_flags) -L$(objtree)/$(obj) \
> > > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> > > -Zunstable-options --generate-link-to-definition \
> > > --output $(rustdoc_output) \
> > > --crate-name $(subst rustdoc-,,$@) \
> > […]
> >
> > Thanks anyway for iterating on this series! I’ve started writing a DRM
> > driver based off a previous version. :)
> >
> That's cool. Thanks.
>
> Regards,
> Mukesh
> > --
> > Link Mauve
> >
--
Link Mauve
[-- Attachment #2: 0001-XXX-Workaround-sstep.c.patch --]
[-- Type: text/plain, Size: 1400 bytes --]
From 79b614dd7be16a1108e1f0176a7bc235fa163a4e Mon Sep 17 00:00:00 2001
From: Link Mauve <linkmauve@linkmauve.fr>
Date: Wed, 8 Apr 2026 14:16:04 +0200
Subject: [PATCH 1/3] XXX: Workaround sstep.c
These variables are used only on CONFIG_PPC64, which causes compilation
to fail on PPC32.
---
arch/powerpc/lib/sstep.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index ac3ee19531d8..dc129f0cb6a0 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -1354,15 +1354,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
#ifdef CONFIG_PPC64
unsigned int suffixopcode, prefixtype, prefix_r;
#endif
- unsigned int opcode, ra, rb, rc, rd, spr, u;
+ unsigned int opcode, ra, rb/*, rc*/, rd, spr, u;
unsigned long int imm;
unsigned long int val, val2;
unsigned int mb, me, sh;
- unsigned int word, suffix;
+ unsigned int word/*, suffix*/;
long ival;
word = ppc_inst_val(instr);
- suffix = ppc_inst_suffix(instr);
+ //suffix = ppc_inst_suffix(instr);
op->type = COMPUTE;
@@ -1480,7 +1480,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
rd = (word >> 21) & 0x1f;
ra = (word >> 16) & 0x1f;
rb = (word >> 11) & 0x1f;
- rc = (word >> 6) & 0x1f;
+ //rc = (word >> 6) & 0x1f;
switch (opcode) {
#ifdef __powerpc64__
--
2.54.0
[-- Attachment #3: 0002-XXX-Enable-asm_experimental_arch-for-PowerPC-asm.patch --]
[-- Type: text/plain, Size: 2350 bytes --]
From d4e72fad43175bde99287b8efdece900e5b53444 Mon Sep 17 00:00:00 2001
From: Link Mauve <linkmauve@linkmauve.fr>
Date: Fri, 10 Apr 2026 13:05:24 +0200
Subject: [PATCH 2/3] XXX: Enable asm_experimental_arch for PowerPC asm!()
This is needed to compile the kernel crate, otherwise this error
happens:
error[E0658]: inline assembly is not stable yet on this architecture
--> ../rust/kernel/sync/barrier.rs:19:14
|
19 | unsafe { core::arch::asm!("") };
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #93335 <https://github.com/rust-lang/rust/issues/93335> for more information
= help: add `#![feature(asm_experimental_arch)]` to the crate attributes to enable
= note: this compiler was built on 2026-03-25; consider upgrading it if it is out of date
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0658`.
---
rust/kernel/lib.rs | 3 +++
scripts/Makefile.build | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
index d93292d47420..92ccd47dc3ee 100644
--- a/rust/kernel/lib.rs
+++ b/rust/kernel/lib.rs
@@ -47,6 +47,9 @@
// To be determined.
#![feature(used_with_arg)]
//
+// Needed for PowerPC inline assembly.
+#![feature(asm_experimental_arch)]
+//
// `feature(derive_coerce_pointee)` is expected to become stable. Before Rust
// 1.84.0, it did not exist, so enable the predecessor features.
#![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 3652b85be545..c7cc21994c5a 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -321,7 +321,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
#
# Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
# the unstable features in use.
-rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
+rust_allowed_features := asm_const,asm_goto,asm_experimental_arch,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
# `--out-dir` is required to avoid temporaries being created by `rustc` in the
# current working directory, which may be not accessible in the out-of-tree
--
2.54.0
[-- Attachment #4: 0003-XXX-Workaround-for-__udivdi3-and-__umoddi3.patch --]
[-- Type: text/plain, Size: 1336 bytes --]
From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
From: Link Mauve <linkmauve@linkmauve.fr>
Date: Fri, 10 Apr 2026 13:51:24 +0200
Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The core crate currently depends on these two functions for i64/u64/
i128/u128/core::time::Duration formatting, but we shouldn’t use that in
the kernel so let’s panic if they are ever called.
---
rust/exports.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/rust/exports.c b/rust/exports.c
index 587f0e776aba..5f1cdf13882e 100644
--- a/rust/exports.c
+++ b/rust/exports.c
@@ -12,6 +12,7 @@
*/
#include <linux/export.h>
+#include <linux/panic.h>
#define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
@@ -20,6 +21,14 @@
#include "exports_bindings_generated.h"
#include "exports_kernel_generated.h"
+void __udivdi3(void) {
+ panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
+}
+
+void __umoddi3(void) {
+ panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
+}
+
// For modules using `rust/build_error.rs`.
#ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
EXPORT_SYMBOL_RUST_GPL(rust_build_error);
--
2.54.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 10:26 ` Link Mauve
@ 2026-04-21 12:19 ` Mukesh Kumar Chaurasiya
2026-04-21 12:26 ` Link Mauve
2026-04-21 15:59 ` Gary Guo
1 sibling, 1 reply; 18+ messages in thread
From: Mukesh Kumar Chaurasiya @ 2026-04-21 12:19 UTC (permalink / raw)
To: Link Mauve
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
On Tue, Apr 21, 2026 at 12:26:51PM +0200, Link Mauve wrote:
> On Tue, Apr 21, 2026 at 03:25:22PM +0530, Mukesh Kumar Chaurasiya wrote:
> > On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
> > > Hi Mukesh,
> > >
> > > This patch doesn’t apply on top of mainline, which tree did you base it
> > > off?
> > >
> > It was on mainline v7.0 tag.
>
> Great thanks, they do apply there!
>
> I needed three more patches for the kernel to build on PPC32, I’ve
> attached them but they are absolutely not patches which could go into
> the kernel (except for the second, enabling asm_experimental_arch).
>
> What do you think we should do about them?
>
Regarding the 2nd patch you sent, As the support is experimental as of
now, Let's wait till we get everything stablized, till then we'll use
nightly build for all variants of powerpc. Once we mark it as
maintained, then we can try to push that patch.
Maybe Miguel can comment better on this.
Regarding other patches, I am planning to work on ppc32 once ppc64le
stabilizes.
Regards,
Mukesh
> > On latest there is a confilict. I'll send out a rebased version.
> >
> > > On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> > > > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> > > > encounters an error: "multiple candidates for `rmeta` dependency `core`
> > > > found", with two candidates:
> > > > 1. The host's standard library from the rustup toolchain
> > > > 2. The kernel's custom libcore.rmeta in the rust/ directory
> > > >
> > > > This occurs because the build system uses `-L$(objtree)/rust` for host
> > > > library builds (proc_macro2, quote, syn), which causes rustc to search
> > > > the rust/ directory. During this search, rustc finds both the kernel's
> > > > custom libcore.rmeta and gains access to the host's standard library,
> > > > creating a conflict.
> > > >
> > > > The solution is to separate host libraries into a dedicated rust/host/
> > > > subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> > > > of `-L$(objtree)/rust`. This ensures that:
> > > >
> > > > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> > > > and never encounter the kernel's libcore.rmeta
> > > > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> > > > dependencies
> > > >
> > > > Special handling is added for rustdoc-pin_init, which is a host build
> > > > (to access the alloc crate) but depends on proc macros from the main
> > > > rust/ directory. It uses explicit `--extern` paths to reference the
> > > > proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> > > > the conflict.
> > > >
> > > > The rust/host/ directory is added to clean-files to ensure it's removed
> > > > during `make clean`.
> > > >
> > > > Link: https://github.com/Rust-for-Linux/linux/issues/105
> > > > Link: https://github.com/linuxppc/issues/issues/451
> > > > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> > > > ---
> > > > rust/Makefile | 38 +++++++++++++++++++++-----------------
> > > > 1 file changed, 21 insertions(+), 17 deletions(-)
> > > >
> > > > diff --git a/rust/Makefile b/rust/Makefile
> > > > index 9801af2e1e02..e234b8a39358 100644
> > > > --- a/rust/Makefile
> > > > +++ b/rust/Makefile
> > > > @@ -3,6 +3,9 @@
> > > > # Where to place rustdoc generated documentation
> > > > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
> > > >
> > > > +# Clean generated host directory
> > > > +clean-files := host/
> > > > +
> > > > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> > > > always-$(CONFIG_RUST) += exports_core_generated.h
> > > >
> > > > @@ -27,7 +30,7 @@ endif
> > > >
> > > > obj-$(CONFIG_RUST) += exports.o
> > > >
> > > > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> > > > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
> > > >
> > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> > > > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> > > > OBJTREE=$(abspath $(objtree)) \
> > > > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> > > > $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
> > >
> > > The issue is here ↑, --remap-path-prefix=% got removed and the two
> > > previous lines got merged into one.
> > >
> > Yeah will fix this.
> > > > - $(rustc_target_flags) -L$(objtree)/$(obj) \
> > > > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> > > > -Zunstable-options --generate-link-to-definition \
> > > > --output $(rustdoc_output) \
> > > > --crate-name $(subst rustdoc-,,$@) \
> > > […]
> > >
> > > Thanks anyway for iterating on this series! I’ve started writing a DRM
> > > driver based off a previous version. :)
> > >
> > That's cool. Thanks.
> >
> > Regards,
> > Mukesh
> > > --
> > > Link Mauve
> > >
>
> --
> Link Mauve
> From 79b614dd7be16a1108e1f0176a7bc235fa163a4e Mon Sep 17 00:00:00 2001
> From: Link Mauve <linkmauve@linkmauve.fr>
> Date: Wed, 8 Apr 2026 14:16:04 +0200
> Subject: [PATCH 1/3] XXX: Workaround sstep.c
>
> These variables are used only on CONFIG_PPC64, which causes compilation
> to fail on PPC32.
> ---
> arch/powerpc/lib/sstep.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
> index ac3ee19531d8..dc129f0cb6a0 100644
> --- a/arch/powerpc/lib/sstep.c
> +++ b/arch/powerpc/lib/sstep.c
> @@ -1354,15 +1354,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> #ifdef CONFIG_PPC64
> unsigned int suffixopcode, prefixtype, prefix_r;
> #endif
> - unsigned int opcode, ra, rb, rc, rd, spr, u;
> + unsigned int opcode, ra, rb/*, rc*/, rd, spr, u;
> unsigned long int imm;
> unsigned long int val, val2;
> unsigned int mb, me, sh;
> - unsigned int word, suffix;
> + unsigned int word/*, suffix*/;
> long ival;
>
> word = ppc_inst_val(instr);
> - suffix = ppc_inst_suffix(instr);
> + //suffix = ppc_inst_suffix(instr);
>
> op->type = COMPUTE;
>
> @@ -1480,7 +1480,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> rd = (word >> 21) & 0x1f;
> ra = (word >> 16) & 0x1f;
> rb = (word >> 11) & 0x1f;
> - rc = (word >> 6) & 0x1f;
> + //rc = (word >> 6) & 0x1f;
>
> switch (opcode) {
> #ifdef __powerpc64__
> --
> 2.54.0
>
> From d4e72fad43175bde99287b8efdece900e5b53444 Mon Sep 17 00:00:00 2001
> From: Link Mauve <linkmauve@linkmauve.fr>
> Date: Fri, 10 Apr 2026 13:05:24 +0200
> Subject: [PATCH 2/3] XXX: Enable asm_experimental_arch for PowerPC asm!()
>
> This is needed to compile the kernel crate, otherwise this error
> happens:
>
> error[E0658]: inline assembly is not stable yet on this architecture
> --> ../rust/kernel/sync/barrier.rs:19:14
> |
> 19 | unsafe { core::arch::asm!("") };
> | ^^^^^^^^^^^^^^^^^^^^
> |
> = note: see issue #93335 <https://github.com/rust-lang/rust/issues/93335> for more information
> = help: add `#![feature(asm_experimental_arch)]` to the crate attributes to enable
> = note: this compiler was built on 2026-03-25; consider upgrading it if it is out of date
>
> error: aborting due to 1 previous error
>
> For more information about this error, try `rustc --explain E0658`.
> ---
> rust/kernel/lib.rs | 3 +++
> scripts/Makefile.build | 2 +-
> 2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index d93292d47420..92ccd47dc3ee 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -47,6 +47,9 @@
> // To be determined.
> #![feature(used_with_arg)]
> //
> +// Needed for PowerPC inline assembly.
> +#![feature(asm_experimental_arch)]
> +//
> // `feature(derive_coerce_pointee)` is expected to become stable. Before Rust
> // 1.84.0, it did not exist, so enable the predecessor features.
> #![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 3652b85be545..c7cc21994c5a 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -321,7 +321,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> #
> # Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
> # the unstable features in use.
> -rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
> +rust_allowed_features := asm_const,asm_goto,asm_experimental_arch,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
>
> # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> # current working directory, which may be not accessible in the out-of-tree
> --
> 2.54.0
>
> From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
> From: Link Mauve <linkmauve@linkmauve.fr>
> Date: Fri, 10 Apr 2026 13:51:24 +0200
> Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> The core crate currently depends on these two functions for i64/u64/
> i128/u128/core::time::Duration formatting, but we shouldn’t use that in
> the kernel so let’s panic if they are ever called.
> ---
> rust/exports.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/rust/exports.c b/rust/exports.c
> index 587f0e776aba..5f1cdf13882e 100644
> --- a/rust/exports.c
> +++ b/rust/exports.c
> @@ -12,6 +12,7 @@
> */
>
> #include <linux/export.h>
> +#include <linux/panic.h>
>
> #define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
>
> @@ -20,6 +21,14 @@
> #include "exports_bindings_generated.h"
> #include "exports_kernel_generated.h"
>
> +void __udivdi3(void) {
> + panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
> +}
> +
> +void __umoddi3(void) {
> + panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
> +}
> +
> // For modules using `rust/build_error.rs`.
> #ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
> EXPORT_SYMBOL_RUST_GPL(rust_build_error);
> --
> 2.54.0
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 12:19 ` Mukesh Kumar Chaurasiya
@ 2026-04-21 12:26 ` Link Mauve
2026-04-21 15:53 ` Mukesh Kumar Chaurasiya
0 siblings, 1 reply; 18+ messages in thread
From: Link Mauve @ 2026-04-21 12:26 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya
Cc: Link Mauve, maddy, mpe, npiggin, chleroy, peterz, jpoimboe,
jbaron, aliceryhl, rostedt, ardb, ojeda, boqun, gary, bjorn3_gh,
lossin, a.hindborg, tmgross, dakr, nathan, nick.desaulniers+lkml,
morbo, justinstitt, linuxppc-dev, linux-kernel, rust-for-linux,
llvm
On Tue, Apr 21, 2026 at 05:49:32PM +0530, Mukesh Kumar Chaurasiya wrote:
> On Tue, Apr 21, 2026 at 12:26:51PM +0200, Link Mauve wrote:
> > On Tue, Apr 21, 2026 at 03:25:22PM +0530, Mukesh Kumar Chaurasiya wrote:
> > > On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
> > > > Hi Mukesh,
> > > >
> > > > This patch doesn’t apply on top of mainline, which tree did you base it
> > > > off?
> > > >
> > > It was on mainline v7.0 tag.
> >
> > Great thanks, they do apply there!
> >
> > I needed three more patches for the kernel to build on PPC32, I’ve
> > attached them but they are absolutely not patches which could go into
> > the kernel (except for the second, enabling asm_experimental_arch).
> >
> > What do you think we should do about them?
> >
> Regarding the 2nd patch you sent, As the support is experimental as of
> now, Let's wait till we get everything stablized, till then we'll use
> nightly build for all variants of powerpc. Once we mark it as
> maintained, then we can try to push that patch.
Enabling the feature is mandatory even on nightly or with
RUSTC_BOOTSTRAP=1, otherwise no asm!() macro can be called and so the
kernel crate can’t be built.
>
> Maybe Miguel can comment better on this.
>
> Regarding other patches, I am planning to work on ppc32 once ppc64le
> stabilizes.
Thanks!
>
> Regards,
> Mukesh
>
> > > On latest there is a confilict. I'll send out a rebased version.
> > >
> > > > On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> > > > > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> > > > > encounters an error: "multiple candidates for `rmeta` dependency `core`
> > > > > found", with two candidates:
> > > > > 1. The host's standard library from the rustup toolchain
> > > > > 2. The kernel's custom libcore.rmeta in the rust/ directory
> > > > >
> > > > > This occurs because the build system uses `-L$(objtree)/rust` for host
> > > > > library builds (proc_macro2, quote, syn), which causes rustc to search
> > > > > the rust/ directory. During this search, rustc finds both the kernel's
> > > > > custom libcore.rmeta and gains access to the host's standard library,
> > > > > creating a conflict.
> > > > >
> > > > > The solution is to separate host libraries into a dedicated rust/host/
> > > > > subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> > > > > of `-L$(objtree)/rust`. This ensures that:
> > > > >
> > > > > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> > > > > and never encounter the kernel's libcore.rmeta
> > > > > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> > > > > dependencies
> > > > >
> > > > > Special handling is added for rustdoc-pin_init, which is a host build
> > > > > (to access the alloc crate) but depends on proc macros from the main
> > > > > rust/ directory. It uses explicit `--extern` paths to reference the
> > > > > proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> > > > > the conflict.
> > > > >
> > > > > The rust/host/ directory is added to clean-files to ensure it's removed
> > > > > during `make clean`.
> > > > >
> > > > > Link: https://github.com/Rust-for-Linux/linux/issues/105
> > > > > Link: https://github.com/linuxppc/issues/issues/451
> > > > > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> > > > > ---
> > > > > rust/Makefile | 38 +++++++++++++++++++++-----------------
> > > > > 1 file changed, 21 insertions(+), 17 deletions(-)
> > > > >
> > > > > diff --git a/rust/Makefile b/rust/Makefile
> > > > > index 9801af2e1e02..e234b8a39358 100644
> > > > > --- a/rust/Makefile
> > > > > +++ b/rust/Makefile
> > > > > @@ -3,6 +3,9 @@
> > > > > # Where to place rustdoc generated documentation
> > > > > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
> > > > >
> > > > > +# Clean generated host directory
> > > > > +clean-files := host/
> > > > > +
> > > > > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> > > > > always-$(CONFIG_RUST) += exports_core_generated.h
> > > > >
> > > > > @@ -27,7 +30,7 @@ endif
> > > > >
> > > > > obj-$(CONFIG_RUST) += exports.o
> > > > >
> > > > > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> > > > > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
> > > > >
> > > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> > > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> > > > > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> > > > > OBJTREE=$(abspath $(objtree)) \
> > > > > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> > > > > $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
> > > >
> > > > The issue is here ↑, --remap-path-prefix=% got removed and the two
> > > > previous lines got merged into one.
> > > >
> > > Yeah will fix this.
> > > > > - $(rustc_target_flags) -L$(objtree)/$(obj) \
> > > > > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> > > > > -Zunstable-options --generate-link-to-definition \
> > > > > --output $(rustdoc_output) \
> > > > > --crate-name $(subst rustdoc-,,$@) \
> > > > […]
> > > >
> > > > Thanks anyway for iterating on this series! I’ve started writing a DRM
> > > > driver based off a previous version. :)
> > > >
> > > That's cool. Thanks.
> > >
> > > Regards,
> > > Mukesh
> > > > --
> > > > Link Mauve
> > > >
> >
> > --
> > Link Mauve
>
> > From 79b614dd7be16a1108e1f0176a7bc235fa163a4e Mon Sep 17 00:00:00 2001
> > From: Link Mauve <linkmauve@linkmauve.fr>
> > Date: Wed, 8 Apr 2026 14:16:04 +0200
> > Subject: [PATCH 1/3] XXX: Workaround sstep.c
> >
> > These variables are used only on CONFIG_PPC64, which causes compilation
> > to fail on PPC32.
> > ---
> > arch/powerpc/lib/sstep.c | 8 ++++----
> > 1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
> > index ac3ee19531d8..dc129f0cb6a0 100644
> > --- a/arch/powerpc/lib/sstep.c
> > +++ b/arch/powerpc/lib/sstep.c
> > @@ -1354,15 +1354,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> > #ifdef CONFIG_PPC64
> > unsigned int suffixopcode, prefixtype, prefix_r;
> > #endif
> > - unsigned int opcode, ra, rb, rc, rd, spr, u;
> > + unsigned int opcode, ra, rb/*, rc*/, rd, spr, u;
> > unsigned long int imm;
> > unsigned long int val, val2;
> > unsigned int mb, me, sh;
> > - unsigned int word, suffix;
> > + unsigned int word/*, suffix*/;
> > long ival;
> >
> > word = ppc_inst_val(instr);
> > - suffix = ppc_inst_suffix(instr);
> > + //suffix = ppc_inst_suffix(instr);
> >
> > op->type = COMPUTE;
> >
> > @@ -1480,7 +1480,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> > rd = (word >> 21) & 0x1f;
> > ra = (word >> 16) & 0x1f;
> > rb = (word >> 11) & 0x1f;
> > - rc = (word >> 6) & 0x1f;
> > + //rc = (word >> 6) & 0x1f;
> >
> > switch (opcode) {
> > #ifdef __powerpc64__
> > --
> > 2.54.0
> >
>
> > From d4e72fad43175bde99287b8efdece900e5b53444 Mon Sep 17 00:00:00 2001
> > From: Link Mauve <linkmauve@linkmauve.fr>
> > Date: Fri, 10 Apr 2026 13:05:24 +0200
> > Subject: [PATCH 2/3] XXX: Enable asm_experimental_arch for PowerPC asm!()
> >
> > This is needed to compile the kernel crate, otherwise this error
> > happens:
> >
> > error[E0658]: inline assembly is not stable yet on this architecture
> > --> ../rust/kernel/sync/barrier.rs:19:14
> > |
> > 19 | unsafe { core::arch::asm!("") };
> > | ^^^^^^^^^^^^^^^^^^^^
> > |
> > = note: see issue #93335 <https://github.com/rust-lang/rust/issues/93335> for more information
> > = help: add `#![feature(asm_experimental_arch)]` to the crate attributes to enable
> > = note: this compiler was built on 2026-03-25; consider upgrading it if it is out of date
> >
> > error: aborting due to 1 previous error
> >
> > For more information about this error, try `rustc --explain E0658`.
> > ---
> > rust/kernel/lib.rs | 3 +++
> > scripts/Makefile.build | 2 +-
> > 2 files changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> > index d93292d47420..92ccd47dc3ee 100644
> > --- a/rust/kernel/lib.rs
> > +++ b/rust/kernel/lib.rs
> > @@ -47,6 +47,9 @@
> > // To be determined.
> > #![feature(used_with_arg)]
> > //
> > +// Needed for PowerPC inline assembly.
> > +#![feature(asm_experimental_arch)]
> > +//
> > // `feature(derive_coerce_pointee)` is expected to become stable. Before Rust
> > // 1.84.0, it did not exist, so enable the predecessor features.
> > #![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
> > diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> > index 3652b85be545..c7cc21994c5a 100644
> > --- a/scripts/Makefile.build
> > +++ b/scripts/Makefile.build
> > @@ -321,7 +321,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> > #
> > # Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
> > # the unstable features in use.
> > -rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
> > +rust_allowed_features := asm_const,asm_goto,asm_experimental_arch,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
> >
> > # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> > # current working directory, which may be not accessible in the out-of-tree
> > --
> > 2.54.0
> >
>
> > From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
> > From: Link Mauve <linkmauve@linkmauve.fr>
> > Date: Fri, 10 Apr 2026 13:51:24 +0200
> > Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
> > MIME-Version: 1.0
> > Content-Type: text/plain; charset=UTF-8
> > Content-Transfer-Encoding: 8bit
> >
> > The core crate currently depends on these two functions for i64/u64/
> > i128/u128/core::time::Duration formatting, but we shouldn’t use that in
> > the kernel so let’s panic if they are ever called.
> > ---
> > rust/exports.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/rust/exports.c b/rust/exports.c
> > index 587f0e776aba..5f1cdf13882e 100644
> > --- a/rust/exports.c
> > +++ b/rust/exports.c
> > @@ -12,6 +12,7 @@
> > */
> >
> > #include <linux/export.h>
> > +#include <linux/panic.h>
> >
> > #define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
> >
> > @@ -20,6 +21,14 @@
> > #include "exports_bindings_generated.h"
> > #include "exports_kernel_generated.h"
> >
> > +void __udivdi3(void) {
> > + panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
> > +}
> > +
> > +void __umoddi3(void) {
> > + panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
> > +}
> > +
> > // For modules using `rust/build_error.rs`.
> > #ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
> > EXPORT_SYMBOL_RUST_GPL(rust_build_error);
> > --
> > 2.54.0
> >
>
>
--
Link Mauve
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 12:26 ` Link Mauve
@ 2026-04-21 15:53 ` Mukesh Kumar Chaurasiya
2026-04-21 15:57 ` Gary Guo
2026-04-21 16:00 ` Miguel Ojeda
0 siblings, 2 replies; 18+ messages in thread
From: Mukesh Kumar Chaurasiya @ 2026-04-21 15:53 UTC (permalink / raw)
To: Link Mauve
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
On Tue, Apr 21, 2026 at 02:26:19PM +0200, Link Mauve wrote:
> On Tue, Apr 21, 2026 at 05:49:32PM +0530, Mukesh Kumar Chaurasiya wrote:
> > On Tue, Apr 21, 2026 at 12:26:51PM +0200, Link Mauve wrote:
> > > On Tue, Apr 21, 2026 at 03:25:22PM +0530, Mukesh Kumar Chaurasiya wrote:
> > > > On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
> > > > > Hi Mukesh,
> > > > >
> > > > > This patch doesn’t apply on top of mainline, which tree did you base it
> > > > > off?
> > > > >
> > > > It was on mainline v7.0 tag.
> > >
> > > Great thanks, they do apply there!
> > >
> > > I needed three more patches for the kernel to build on PPC32, I’ve
> > > attached them but they are absolutely not patches which could go into
> > > the kernel (except for the second, enabling asm_experimental_arch).
> > >
> > > What do you think we should do about them?
> > >
> > Regarding the 2nd patch you sent, As the support is experimental as of
> > now, Let's wait till we get everything stablized, till then we'll use
> > nightly build for all variants of powerpc. Once we mark it as
> > maintained, then we can try to push that patch.
>
> Enabling the feature is mandatory even on nightly or with
> RUSTC_BOOTSTRAP=1, otherwise no asm!() macro can be called and so the
> kernel crate can’t be built.
>
The stable support is available on nightly.
Refer https://github.com/rust-lang/rust/pull/147996
Regards,
Mukesh
> >
> > Maybe Miguel can comment better on this.
> >
> > Regarding other patches, I am planning to work on ppc32 once ppc64le
> > stabilizes.
>
> Thanks!
>
> >
> > Regards,
> > Mukesh
> >
> > > > On latest there is a confilict. I'll send out a rebased version.
> > > >
> > > > > On Fri, Apr 17, 2026 at 08:52:50PM +0530, Mukesh Kumar Chaurasiya (IBM) wrote:
> > > > > > When building Rust code for powerpc64le with LLVM=1 and -j1, rustc
> > > > > > encounters an error: "multiple candidates for `rmeta` dependency `core`
> > > > > > found", with two candidates:
> > > > > > 1. The host's standard library from the rustup toolchain
> > > > > > 2. The kernel's custom libcore.rmeta in the rust/ directory
> > > > > >
> > > > > > This occurs because the build system uses `-L$(objtree)/rust` for host
> > > > > > library builds (proc_macro2, quote, syn), which causes rustc to search
> > > > > > the rust/ directory. During this search, rustc finds both the kernel's
> > > > > > custom libcore.rmeta and gains access to the host's standard library,
> > > > > > creating a conflict.
> > > > > >
> > > > > > The solution is to separate host libraries into a dedicated rust/host/
> > > > > > subdirectory and use `-L$(objtree)/rust/host` for host builds instead
> > > > > > of `-L$(objtree)/rust`. This ensures that:
> > > > > >
> > > > > > 1. Host library builds (proc_macro2, quote, syn) only search rust/host/
> > > > > > and never encounter the kernel's libcore.rmeta
> > > > > > 2. Proc macro builds use `-L$(objtree)/rust/host` to find their
> > > > > > dependencies
> > > > > >
> > > > > > Special handling is added for rustdoc-pin_init, which is a host build
> > > > > > (to access the alloc crate) but depends on proc macros from the main
> > > > > > rust/ directory. It uses explicit `--extern` paths to reference the
> > > > > > proc macros without adding `-L$(objtree)/rust`, which would reintroduce
> > > > > > the conflict.
> > > > > >
> > > > > > The rust/host/ directory is added to clean-files to ensure it's removed
> > > > > > during `make clean`.
> > > > > >
> > > > > > Link: https://github.com/Rust-for-Linux/linux/issues/105
> > > > > > Link: https://github.com/linuxppc/issues/issues/451
> > > > > > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
> > > > > > ---
> > > > > > rust/Makefile | 38 +++++++++++++++++++++-----------------
> > > > > > 1 file changed, 21 insertions(+), 17 deletions(-)
> > > > > >
> > > > > > diff --git a/rust/Makefile b/rust/Makefile
> > > > > > index 9801af2e1e02..e234b8a39358 100644
> > > > > > --- a/rust/Makefile
> > > > > > +++ b/rust/Makefile
> > > > > > @@ -3,6 +3,9 @@
> > > > > > # Where to place rustdoc generated documentation
> > > > > > rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
> > > > > >
> > > > > > +# Clean generated host directory
> > > > > > +clean-files := host/
> > > > > > +
> > > > > > obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
> > > > > > always-$(CONFIG_RUST) += exports_core_generated.h
> > > > > >
> > > > > > @@ -27,7 +30,7 @@ endif
> > > > > >
> > > > > > obj-$(CONFIG_RUST) += exports.o
> > > > > >
> > > > > > -always-$(CONFIG_RUST) += libproc_macro2.rlib libquote.rlib libsyn.rlib
> > > > > > +always-$(CONFIG_RUST) += host/libproc_macro2.rlib host/libquote.rlib host/libsyn.rlib
> > > > > >
> > > > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
> > > > > > always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
> > > > > > @@ -150,7 +153,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
> > > > > > OBJTREE=$(abspath $(objtree)) \
> > > > > > $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
> > > > > > $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
> > > > >
> > > > > The issue is here ↑, --remap-path-prefix=% got removed and the two
> > > > > previous lines got merged into one.
> > > > >
> > > > Yeah will fix this.
> > > > > > - $(rustc_target_flags) -L$(objtree)/$(obj) \
> > > > > > + $(rustc_target_flags) -L$(objtree)/$(obj)$(if $(rustdoc_host),/host) \
> > > > > > -Zunstable-options --generate-link-to-definition \
> > > > > > --output $(rustdoc_output) \
> > > > > > --crate-name $(subst rustdoc-,,$@) \
> > > > > […]
> > > > >
> > > > > Thanks anyway for iterating on this series! I’ve started writing a DRM
> > > > > driver based off a previous version. :)
> > > > >
> > > > That's cool. Thanks.
> > > >
> > > > Regards,
> > > > Mukesh
> > > > > --
> > > > > Link Mauve
> > > > >
> > >
> > > --
> > > Link Mauve
> >
> > > From 79b614dd7be16a1108e1f0176a7bc235fa163a4e Mon Sep 17 00:00:00 2001
> > > From: Link Mauve <linkmauve@linkmauve.fr>
> > > Date: Wed, 8 Apr 2026 14:16:04 +0200
> > > Subject: [PATCH 1/3] XXX: Workaround sstep.c
> > >
> > > These variables are used only on CONFIG_PPC64, which causes compilation
> > > to fail on PPC32.
> > > ---
> > > arch/powerpc/lib/sstep.c | 8 ++++----
> > > 1 file changed, 4 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
> > > index ac3ee19531d8..dc129f0cb6a0 100644
> > > --- a/arch/powerpc/lib/sstep.c
> > > +++ b/arch/powerpc/lib/sstep.c
> > > @@ -1354,15 +1354,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> > > #ifdef CONFIG_PPC64
> > > unsigned int suffixopcode, prefixtype, prefix_r;
> > > #endif
> > > - unsigned int opcode, ra, rb, rc, rd, spr, u;
> > > + unsigned int opcode, ra, rb/*, rc*/, rd, spr, u;
> > > unsigned long int imm;
> > > unsigned long int val, val2;
> > > unsigned int mb, me, sh;
> > > - unsigned int word, suffix;
> > > + unsigned int word/*, suffix*/;
> > > long ival;
> > >
> > > word = ppc_inst_val(instr);
> > > - suffix = ppc_inst_suffix(instr);
> > > + //suffix = ppc_inst_suffix(instr);
> > >
> > > op->type = COMPUTE;
> > >
> > > @@ -1480,7 +1480,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
> > > rd = (word >> 21) & 0x1f;
> > > ra = (word >> 16) & 0x1f;
> > > rb = (word >> 11) & 0x1f;
> > > - rc = (word >> 6) & 0x1f;
> > > + //rc = (word >> 6) & 0x1f;
> > >
> > > switch (opcode) {
> > > #ifdef __powerpc64__
> > > --
> > > 2.54.0
> > >
> >
> > > From d4e72fad43175bde99287b8efdece900e5b53444 Mon Sep 17 00:00:00 2001
> > > From: Link Mauve <linkmauve@linkmauve.fr>
> > > Date: Fri, 10 Apr 2026 13:05:24 +0200
> > > Subject: [PATCH 2/3] XXX: Enable asm_experimental_arch for PowerPC asm!()
> > >
> > > This is needed to compile the kernel crate, otherwise this error
> > > happens:
> > >
> > > error[E0658]: inline assembly is not stable yet on this architecture
> > > --> ../rust/kernel/sync/barrier.rs:19:14
> > > |
> > > 19 | unsafe { core::arch::asm!("") };
> > > | ^^^^^^^^^^^^^^^^^^^^
> > > |
> > > = note: see issue #93335 <https://github.com/rust-lang/rust/issues/93335> for more information
> > > = help: add `#![feature(asm_experimental_arch)]` to the crate attributes to enable
> > > = note: this compiler was built on 2026-03-25; consider upgrading it if it is out of date
> > >
> > > error: aborting due to 1 previous error
> > >
> > > For more information about this error, try `rustc --explain E0658`.
> > > ---
> > > rust/kernel/lib.rs | 3 +++
> > > scripts/Makefile.build | 2 +-
> > > 2 files changed, 4 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> > > index d93292d47420..92ccd47dc3ee 100644
> > > --- a/rust/kernel/lib.rs
> > > +++ b/rust/kernel/lib.rs
> > > @@ -47,6 +47,9 @@
> > > // To be determined.
> > > #![feature(used_with_arg)]
> > > //
> > > +// Needed for PowerPC inline assembly.
> > > +#![feature(asm_experimental_arch)]
> > > +//
> > > // `feature(derive_coerce_pointee)` is expected to become stable. Before Rust
> > > // 1.84.0, it did not exist, so enable the predecessor features.
> > > #![cfg_attr(CONFIG_RUSTC_HAS_COERCE_POINTEE, feature(derive_coerce_pointee))]
> > > diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> > > index 3652b85be545..c7cc21994c5a 100644
> > > --- a/scripts/Makefile.build
> > > +++ b/scripts/Makefile.build
> > > @@ -321,7 +321,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE
> > > #
> > > # Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
> > > # the unstable features in use.
> > > -rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
> > > +rust_allowed_features := asm_const,asm_goto,asm_experimental_arch,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
> > >
> > > # `--out-dir` is required to avoid temporaries being created by `rustc` in the
> > > # current working directory, which may be not accessible in the out-of-tree
> > > --
> > > 2.54.0
> > >
> >
> > > From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
> > > From: Link Mauve <linkmauve@linkmauve.fr>
> > > Date: Fri, 10 Apr 2026 13:51:24 +0200
> > > Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
> > > MIME-Version: 1.0
> > > Content-Type: text/plain; charset=UTF-8
> > > Content-Transfer-Encoding: 8bit
> > >
> > > The core crate currently depends on these two functions for i64/u64/
> > > i128/u128/core::time::Duration formatting, but we shouldn’t use that in
> > > the kernel so let’s panic if they are ever called.
> > > ---
> > > rust/exports.c | 9 +++++++++
> > > 1 file changed, 9 insertions(+)
> > >
> > > diff --git a/rust/exports.c b/rust/exports.c
> > > index 587f0e776aba..5f1cdf13882e 100644
> > > --- a/rust/exports.c
> > > +++ b/rust/exports.c
> > > @@ -12,6 +12,7 @@
> > > */
> > >
> > > #include <linux/export.h>
> > > +#include <linux/panic.h>
> > >
> > > #define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
> > >
> > > @@ -20,6 +21,14 @@
> > > #include "exports_bindings_generated.h"
> > > #include "exports_kernel_generated.h"
> > >
> > > +void __udivdi3(void) {
> > > + panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
> > > +}
> > > +
> > > +void __umoddi3(void) {
> > > + panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
> > > +}
> > > +
> > > // For modules using `rust/build_error.rs`.
> > > #ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
> > > EXPORT_SYMBOL_RUST_GPL(rust_build_error);
> > > --
> > > 2.54.0
> > >
> >
> >
>
> --
> Link Mauve
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 15:53 ` Mukesh Kumar Chaurasiya
@ 2026-04-21 15:57 ` Gary Guo
2026-04-21 16:00 ` Miguel Ojeda
1 sibling, 0 replies; 18+ messages in thread
From: Gary Guo @ 2026-04-21 15:57 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya, Link Mauve
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
On Tue Apr 21, 2026 at 4:53 PM BST, Mukesh Kumar Chaurasiya wrote:
> On Tue, Apr 21, 2026 at 02:26:19PM +0200, Link Mauve wrote:
>> On Tue, Apr 21, 2026 at 05:49:32PM +0530, Mukesh Kumar Chaurasiya wrote:
>> > On Tue, Apr 21, 2026 at 12:26:51PM +0200, Link Mauve wrote:
>> > > On Tue, Apr 21, 2026 at 03:25:22PM +0530, Mukesh Kumar Chaurasiya wrote:
>> > > > On Tue, Apr 21, 2026 at 11:38:08AM +0200, Link Mauve wrote:
>> > > > > Hi Mukesh,
>> > > > >
>> > > > > This patch doesn’t apply on top of mainline, which tree did you base it
>> > > > > off?
>> > > > >
>> > > > It was on mainline v7.0 tag.
>> > >
>> > > Great thanks, they do apply there!
>> > >
>> > > I needed three more patches for the kernel to build on PPC32, I’ve
>> > > attached them but they are absolutely not patches which could go into
>> > > the kernel (except for the second, enabling asm_experimental_arch).
>> > >
>> > > What do you think we should do about them?
>> > >
>> > Regarding the 2nd patch you sent, As the support is experimental as of
>> > now, Let's wait till we get everything stablized, till then we'll use
>> > nightly build for all variants of powerpc. Once we mark it as
>> > maintained, then we can try to push that patch.
>>
>> Enabling the feature is mandatory even on nightly or with
>> RUSTC_BOOTSTRAP=1, otherwise no asm!() macro can be called and so the
>> kernel crate can’t be built.
>>
> The stable support is available on nightly.
> Refer https://github.com/rust-lang/rust/pull/147996
In that case you should add the feature with a comment that it's needed for PPC
only and is stable in 1.95.
Best,
Gary
>
> Regards,
> Mukesh
>> >
>> > Maybe Miguel can comment better on this.
>> >
>> > Regarding other patches, I am planning to work on ppc32 once ppc64le
>> > stabilizes.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 10:26 ` Link Mauve
2026-04-21 12:19 ` Mukesh Kumar Chaurasiya
@ 2026-04-21 15:59 ` Gary Guo
2026-04-21 16:36 ` Link Mauve
1 sibling, 1 reply; 18+ messages in thread
From: Gary Guo @ 2026-04-21 15:59 UTC (permalink / raw)
To: Link Mauve, Mukesh Kumar Chaurasiya
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
linuxppc-dev, linux-kernel, rust-for-linux, llvm
On Tue Apr 21, 2026 at 11:26 AM BST, Link Mauve wrote:
> From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
> From: Link Mauve <linkmauve@linkmauve.fr>
> Date: Fri, 10 Apr 2026 13:51:24 +0200
> Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> The core crate currently depends on these two functions for i64/u64/
> i128/u128/core::time::Duration formatting, but we shouldn’t use that in
> the kernel so let’s panic if they are ever called.
> ---
> rust/exports.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/rust/exports.c b/rust/exports.c
> index 587f0e776aba..5f1cdf13882e 100644
> --- a/rust/exports.c
> +++ b/rust/exports.c
> @@ -12,6 +12,7 @@
> */
>
> #include <linux/export.h>
> +#include <linux/panic.h>
>
> #define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
>
> @@ -20,6 +21,14 @@
> #include "exports_bindings_generated.h"
> #include "exports_kernel_generated.h"
>
> +void __udivdi3(void) {
> + panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
> +}
> +
> +void __umoddi3(void) {
> + panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
> +}
> +
This should be added to compiler_builtins.rs and gated for PPC32.
Best,
Gary
> // For modules using `rust/build_error.rs`.
> #ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
> EXPORT_SYMBOL_RUST_GPL(rust_build_error);
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 3/4] rust: Add PowerPC support
2026-04-17 15:22 ` [PATCH V11 3/4] rust: Add PowerPC support Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-21 15:59 ` Gary Guo
0 siblings, 0 replies; 18+ messages in thread
From: Gary Guo @ 2026-04-21 15:59 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya (IBM), maddy, mpe, npiggin, chleroy,
peterz, jpoimboe, jbaron, aliceryhl, rostedt, ardb, ojeda, boqun,
gary, bjorn3_gh, lossin, a.hindborg, tmgross, dakr, nathan,
nick.desaulniers+lkml, morbo, justinstitt, linuxppc-dev,
linux-kernel, rust-for-linux, llvm
Cc: Link Mauve
On Fri Apr 17, 2026 at 4:22 PM BST, Mukesh Kumar Chaurasiya (IBM) wrote:
> From: Link Mauve <linkmauve@linkmauve.fr>
>
> For now only Big Endian 32-bit PowerPC is supported, as that is the only
> hardware I have. This has been tested on the Nintendo Wii so far, but I
> plan on also using it on the GameCube, Wii U and Apple G4.
>
> These changes aren’t the only ones required to get the kernel to compile
> and link on PowerPC, libcore will also have to be changed to not use
> integer division to format u64, u128 and core::time::Duration, otherwise
> __udivdi3() and __umoddi3() will have to be added. I have tested this
> change by replacing the three implementations with unimplemented!() and
> it linked just fine.
>
> Signed-off-by: Link Mauve <linkmauve@linkmauve.fr>
> Link: https://github.com/Rust-for-Linux/linux/issues/105
> Link: https://github.com/linuxppc/issues/issues/451
> Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Acked-by: Gary Guo <gary@garyguo.net>
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/Makefile | 2 ++
> rust/Makefile | 4 +++-
> 3 files changed, 6 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 4/4] powerpc: Enable Rust for ppc64le
2026-04-17 15:22 ` [PATCH V11 4/4] powerpc: Enable Rust for ppc64le Mukesh Kumar Chaurasiya (IBM)
@ 2026-04-21 15:59 ` Gary Guo
0 siblings, 0 replies; 18+ messages in thread
From: Gary Guo @ 2026-04-21 15:59 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya (IBM), maddy, mpe, npiggin, chleroy,
peterz, jpoimboe, jbaron, aliceryhl, rostedt, ardb, ojeda, boqun,
gary, bjorn3_gh, lossin, a.hindborg, tmgross, dakr, nathan,
nick.desaulniers+lkml, morbo, justinstitt, linuxppc-dev,
linux-kernel, rust-for-linux, llvm
Cc: Link Mauve, Venkat Rao Bagalkote
On Fri Apr 17, 2026 at 4:22 PM BST, Mukesh Kumar Chaurasiya (IBM) wrote:
> Enabling rust support for ppc64le.
>
> Tested on pseries Power11:
> ╰─❯ dmesg | grep rust
> [ 0.225728] Initialise system trusted keyrings
> [ 0.270961] rust_minimal: Rust minimal sample (init)
> [ 0.270968] rust_minimal: Am I built-in? true
> [ 0.270974] rust_minimal: test_parameter: 1
> [ 0.270983] rust_misc_device: Initialising Rust Misc Device Sample
> [ 0.271012] rust_print: Rust printing macros sample (init)
> [ 0.271019] rust_print: Emergency message (level 0) without args
> [ 0.271023] rust_print: Alert message (level 1) without args
> [ 0.271026] rust_print: Critical message (level 2) without args
> [ 0.271030] rust_print: Error message (level 3) without args
> [ 0.271033] rust_print: Warning message (level 4) without args
> [ 0.271037] rust_print: Notice message (level 5) without args
> [ 0.271040] rust_print: Info message (level 6) without args
> [ 0.271043] rust_print: A line that is continued without args
> [ 0.271054] rust_print: Emergency message (level 0) with args
> [ 0.271064] rust_print: Alert message (level 1) with args
> [ 0.271072] rust_print: Critical message (level 2) with args
> [ 0.271077] rust_print: Error message (level 3) with args
> [ 0.271083] rust_print: Warning message (level 4) with args
> [ 0.271091] rust_print: Notice message (level 5) with args
> [ 0.271097] rust_print: Info message (level 6) with args
> [ 0.271102] rust_print: A line that is continued with args
> [ 0.271110] rust_print: 1
> [ 0.271113] rust_print: "hello, world"
> [ 0.271121] rust_print: [samples/rust/rust_print_main.rs:35:5] c = "hello, world"
> [ 0.271129] rust_print: Arc<dyn Display> says 42
> [ 0.271130] rust_print: Arc<dyn Display> says hello, world
> [ 0.271136] rust_print: "hello, world"
> [ 0.271198] usbcore: registered new interface driver rust_driver_usb
> [ 0.271207] rust_faux_driver: Initialising Rust Faux Device Sample
> [ 0.271227] faux_driver rust-faux-sample-device: Hello from faux device!
> [ 0.271297] rust_configfs: Rust configfs sample (init)
>
> Reviewed-by: Link Mauve <linkmauve@linkmauve.fr>
> Tested-by: Link Mauve <linkmauve@linkmauve.fr>
> Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
> Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
> Link: https://github.com/Rust-for-Linux/linux/issues/105
> Link: https://github.com/linuxppc/issues/issues/451
> Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Acked-by: Gary Guo <gary@garyguo.net>
> ---
> arch/powerpc/Kconfig | 1 +
> arch/powerpc/Makefile | 7 ++++++-
> rust/Makefile | 6 ++++++
> 3 files changed, 13 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 15:53 ` Mukesh Kumar Chaurasiya
2026-04-21 15:57 ` Gary Guo
@ 2026-04-21 16:00 ` Miguel Ojeda
1 sibling, 0 replies; 18+ messages in thread
From: Miguel Ojeda @ 2026-04-21 16:00 UTC (permalink / raw)
To: Mukesh Kumar Chaurasiya
Cc: Link Mauve, maddy, mpe, npiggin, chleroy, peterz, jpoimboe,
jbaron, aliceryhl, rostedt, ardb, ojeda, boqun, gary, bjorn3_gh,
lossin, a.hindborg, tmgross, dakr, nathan, nick.desaulniers+lkml,
morbo, justinstitt, linuxppc-dev, linux-kernel, rust-for-linux,
llvm
On Tue, Apr 21, 2026 at 5:54 PM Mukesh Kumar Chaurasiya
<mkchauras@gmail.com> wrote:
>
> The stable support is available on nightly.
> Refer https://github.com/rust-lang/rust/pull/147996
That PR was merged for 1.95.0, so it is already available in the
latest release, no? Or do you mean something else?
Thanks!
Cheers,
Miguel
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 15:59 ` Gary Guo
@ 2026-04-21 16:36 ` Link Mauve
2026-04-21 16:51 ` Gary Guo
0 siblings, 1 reply; 18+ messages in thread
From: Link Mauve @ 2026-04-21 16:36 UTC (permalink / raw)
To: Gary Guo
Cc: Link Mauve, Mukesh Kumar Chaurasiya, maddy, mpe, npiggin, chleroy,
peterz, jpoimboe, jbaron, aliceryhl, rostedt, ardb, ojeda, boqun,
bjorn3_gh, lossin, a.hindborg, tmgross, dakr, nathan,
nick.desaulniers+lkml, morbo, justinstitt, linuxppc-dev,
linux-kernel, rust-for-linux, llvm
[-- Attachment #1: Type: text/plain, Size: 2748 bytes --]
Hi,
On Tue, Apr 21, 2026 at 04:59:11PM +0100, Gary Guo wrote:
> On Tue Apr 21, 2026 at 11:26 AM BST, Link Mauve wrote:
> > From 2c0a3ec3da6fa1f0151225c05159f7a812317d32 Mon Sep 17 00:00:00 2001
> > From: Link Mauve <linkmauve@linkmauve.fr>
> > Date: Fri, 10 Apr 2026 13:51:24 +0200
> > Subject: [PATCH 3/3] XXX: Workaround for __udivdi3() and __umoddi3()
> > MIME-Version: 1.0
> > Content-Type: text/plain; charset=UTF-8
> > Content-Transfer-Encoding: 8bit
> >
> > The core crate currently depends on these two functions for i64/u64/
> > i128/u128/core::time::Duration formatting, but we shouldn’t use that in
> > the kernel so let’s panic if they are ever called.
> > ---
> > rust/exports.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
> >
> > diff --git a/rust/exports.c b/rust/exports.c
> > index 587f0e776aba..5f1cdf13882e 100644
> > --- a/rust/exports.c
> > +++ b/rust/exports.c
> > @@ -12,6 +12,7 @@
> > */
> >
> > #include <linux/export.h>
> > +#include <linux/panic.h>
> >
> > #define EXPORT_SYMBOL_RUST_GPL(sym) extern int sym; EXPORT_SYMBOL_GPL(sym)
> >
> > @@ -20,6 +21,14 @@
> > #include "exports_bindings_generated.h"
> > #include "exports_kernel_generated.h"
> >
> > +void __udivdi3(void) {
> > + panic("__udivdi3() called but shouldn’t be made available on this architecture!\n");
> > +}
> > +
> > +void __umoddi3(void) {
> > + panic("__umoddi3() called but shouldn’t be made available on this architecture!\n");
> > +}
> > +
>
> This should be added to compiler_builtins.rs and gated for PPC32.
Thanks for the suggestion, this already seems like a much better
location for that!
This works fine for the core crate, but now panic_qr also gets the same
issue, here it is with V=1:
```
+ powerpc-linux-musl-ld -EB -m elf32ppc -z noexecstack --no-warn-rwx-segments -Bstatic --build-id=sha1 --orphan-handling=warn --script=./arch/powerpc/kernel/vmlinux.lds --strip-debug -o .tmp_vmlinux1 --whole-archive vmlinux.a .vmlinux.export.o init/version-timestamp.o --no-whole-archive --start-group --end-group .tmp_vmlinux0.kallsyms.o
powerpc-linux-musl-ld: drivers/gpu/drm/drm_panic_qr.o: in function `<drm_panic_qr::SegmentIterator as core::iter::traits::iterator::Iterator>::next':
drm_panic_qr.f39a15fa3c72e9fe-cgu.0:(.text+0x200c): undefined reference to `__udivdi3'
```
From a cursory look at the SegmentIterator::next() function I don’t
understand where the division could come up, but it’s actually nice to
get an error when operations which shouldn’t happen happen anyway, it
makes it more likely to get them fixed.
>
> Best,
> Gary
>
> > // For modules using `rust/build_error.rs`.
> > #ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW
> > EXPORT_SYMBOL_RUST_GPL(rust_build_error);
>
--
Link Mauve
[-- Attachment #2: 0001-rust-Make-__udivdi3-and-__umoddi3-panic.patch --]
[-- Type: text/plain, Size: 1613 bytes --]
From c938984c5974ba636699ce0e2cfabeb45a8d861d Mon Sep 17 00:00:00 2001
From: Link Mauve <linkmauve@linkmauve.fr>
Date: Fri, 10 Apr 2026 13:51:24 +0200
Subject: [PATCH] rust: Make __udivdi3() and __umoddi3() panic
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The core crate currently depends on these two functions for i64/u64/
i128/u128/core::time::Duration formatting, but we shouldn’t use that in
the kernel so let’s panic if they are ever called.
Signed-off-by: Link Mauve <linkmauve@linkmauve.fr>
---
rust/Makefile | 4 ++++
rust/compiler_builtins.rs | 6 ++++++
2 files changed, 10 insertions(+)
diff --git a/rust/Makefile b/rust/Makefile
index 99537c2c55ee..568f241a21a7 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -626,6 +626,10 @@ ifneq ($(or $(CONFIG_ARM64),$(and $(CONFIG_RISCV),$(CONFIG_64BIT))),)
__ashrti3 \
__ashlti3 __lshrti3
endif
+ifdef CONFIG_PPC32
+ redirect-intrinsics += \
+ __udivdi3 __umoddi3
+endif
ifdef CONFIG_MODVERSIONS
cmd_gendwarfksyms = $(if $(skip_gendwarfksyms),, \
diff --git a/rust/compiler_builtins.rs b/rust/compiler_builtins.rs
index dd16c1dc899c..fc6b54636dd5 100644
--- a/rust/compiler_builtins.rs
+++ b/rust/compiler_builtins.rs
@@ -97,5 +97,11 @@ pub extern "C" fn $ident() {
__aeabi_uldivmod,
});
+#[cfg(target_arch = "powerpc")]
+define_panicking_intrinsics!("`u64` division/modulo should not be used", {
+ __udivdi3,
+ __umoddi3,
+});
+
// NOTE: if you are adding a new intrinsic here, you should also add it to
// `redirect-intrinsics` in `rust/Makefile`.
--
2.54.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error
2026-04-21 16:36 ` Link Mauve
@ 2026-04-21 16:51 ` Gary Guo
0 siblings, 0 replies; 18+ messages in thread
From: Gary Guo @ 2026-04-21 16:51 UTC (permalink / raw)
To: Link Mauve, Gary Guo
Cc: Mukesh Kumar Chaurasiya, maddy, mpe, npiggin, chleroy, peterz,
jpoimboe, jbaron, aliceryhl, rostedt, ardb, ojeda, boqun,
bjorn3_gh, lossin, a.hindborg, tmgross, dakr, nathan,
nick.desaulniers+lkml, morbo, justinstitt, linuxppc-dev,
linux-kernel, rust-for-linux, llvm
On Tue Apr 21, 2026 at 5:36 PM BST, Link Mauve wrote:
> This works fine for the core crate, but now panic_qr also gets the same
> issue, here it is with V=1:
> ```
> + powerpc-linux-musl-ld -EB -m elf32ppc -z noexecstack --no-warn-rwx-segments -Bstatic --build-id=sha1 --orphan-handling=warn --script=./arch/powerpc/kernel/vmlinux.lds --strip-debug -o .tmp_vmlinux1 --whole-archive vmlinux.a .vmlinux.export.o init/version-timestamp.o --no-whole-archive --start-group --end-group .tmp_vmlinux0.kallsyms.o
> powerpc-linux-musl-ld: drivers/gpu/drm/drm_panic_qr.o: in function `<drm_panic_qr::SegmentIterator as core::iter::traits::iterator::Iterator>::next':
> drm_panic_qr.f39a15fa3c72e9fe-cgu.0:(.text+0x200c): undefined reference to `__udivdi3'
> ```
>
> From a cursory look at the SegmentIterator::next() function I don’t
> understand where the division could come up, but it’s actually nice to
> get an error when operations which shouldn’t happen happen anyway, it
> makes it more likely to get them fixed.
There is divide / modular by 10 code. Although, this shouldn't really cause
__udivdi3 to be generated for constant divisor, unless `-C opt-level=s` is used.
Do you happen to use that opt-level?
Best,
Gary
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-04-21 16:51 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-17 15:22 [PATCH V11 0/4] Rust support for powerpc Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 1/4] rust: Fix "multiple candidates for rmeta dependency core" error Mukesh Kumar Chaurasiya (IBM)
2026-04-21 9:38 ` Link Mauve
2026-04-21 9:55 ` Mukesh Kumar Chaurasiya
2026-04-21 10:26 ` Link Mauve
2026-04-21 12:19 ` Mukesh Kumar Chaurasiya
2026-04-21 12:26 ` Link Mauve
2026-04-21 15:53 ` Mukesh Kumar Chaurasiya
2026-04-21 15:57 ` Gary Guo
2026-04-21 16:00 ` Miguel Ojeda
2026-04-21 15:59 ` Gary Guo
2026-04-21 16:36 ` Link Mauve
2026-04-21 16:51 ` Gary Guo
2026-04-17 15:22 ` [PATCH V11 2/4] powerpc/jump_label: adjust inline asm to be consistent Mukesh Kumar Chaurasiya (IBM)
2026-04-17 15:22 ` [PATCH V11 3/4] rust: Add PowerPC support Mukesh Kumar Chaurasiya (IBM)
2026-04-21 15:59 ` Gary Guo
2026-04-17 15:22 ` [PATCH V11 4/4] powerpc: Enable Rust for ppc64le Mukesh Kumar Chaurasiya (IBM)
2026-04-21 15:59 ` Gary Guo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox