Enabling rust support for ppc64 only.
To support rust a new macro ARCH_STATIC_BRANCH_ASM in powerpc
is added to avoid duplication of inline asm between C and Rust.
This is inline with commit
aecaf181651c '("jump_label: adjust inline asm to be consistent")'
Tested on powernv9:
$ uname -rm
6.19.0-rc8+ ppc64le
$ sudo modprobe rust_minimal
[ 632.890850] rust_minimal: Rust minimal sample (init)
[ 632.890881] rust_minimal: Am I built-in? false
[ 632.890898] rust_minimal: test_parameter: 1
$ sudo rmmod rust_minimal
[ 648.272832] rust_minimal: My numbers are [72, 108, 200]
[ 648.272873] rust_minimal: Rust minimal sample (exit)
$ sudo modprobe rust_print
[ 843.410391] rust_print: Rust printing macros sample (init)
[ 843.410424] rust_print: Emergency message (level 0) without args
[ 843.410451] rust_print: Alert message (level 1) without args
[ 843.410477] rust_print: Critical message (level 2) without args
[ 843.410503] rust_print: Error message (level 3) without args
[ 843.410530] rust_print: Warning message (level 4) without args
[ 843.410557] rust_print: Notice message (level 5) without args
[ 843.410594] rust_print: Info message (level 6) without args
[ 843.410617] rust_print: A line that is continued without args
[ 843.410646] rust_print: Emergency message (level 0) with args
[ 843.410675] rust_print: Alert message (level 1) with args
[ 843.410691] rust_print: Critical message (level 2) with args
[ 843.410727] rust_print: Error message (level 3) with args
[ 843.410761] rust_print: Warning message (level 4) with args
[ 843.410796] rust_print: Notice message (level 5) with args
[ 843.410821] rust_print: Info message (level 6) with args
[ 843.410854] rust_print: A line that is continued with args
[ 843.410892] rust_print: 1
[ 843.410895] rust_print: "hello, world"
[ 843.410924] rust_print: [samples/rust/rust_print_main.rs:35:5] c = "hello,
world"
[ 843.410977] rust_print: Arc<dyn Display> says 42
[ 843.410979] rust_print: Arc<dyn Display> says hello, world
$ sudo rmmod rust_print
[ 843.411003] rust_print: "hello, world"
[ 888.499935] rust_print: Rust printing macros sample (exit)
Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <[email protected]>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/Makefile | 9 +++++----
arch/powerpc/include/asm/jump_label.h | 23 +++++++++++++----------
rust/Makefile | 1 +
scripts/generate_rust_target.rs | 24 ++++++++++++++++++++++++
5 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 9537a61ebae0..e9b8d761ed52 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -285,6 +285,7 @@ config PPC
select HAVE_RSEQ
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_RUST if PPC64
select HAVE_SETUP_PER_CPU_AREA if PPC64
select HAVE_SOFTIRQ_ON_OWN_STACK
select HAVE_STACKPROTECTOR if PPC32 &&
$(cc-option,$(m32-flag) -mstack-protector-guard=tls
-mstack-protector-guard-reg=r2 -mstack-protector-guard-offset=0)
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index a58b1029592c..7ad28cf0fd35 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -172,10 +172,11 @@ CFLAGS-y += $(CONFIG_TUNE_CPU)
asinstr := $(call as-instr,lis 9$(comma)foo@high,-DHAVE_AS_ATHIGH=1)
-KBUILD_CPPFLAGS += -I $(srctree)/arch/powerpc $(asinstr)
-KBUILD_AFLAGS += $(AFLAGS-y)
-KBUILD_CFLAGS += $(CC_FLAGS_NO_FPU)
-KBUILD_CFLAGS += $(CFLAGS-y)
+KBUILD_CPPFLAGS += -I $(srctree)/arch/powerpc $(asinstr)
+KBUILD_AFLAGS += $(AFLAGS-y)
+KBUILD_CFLAGS += $(CC_FLAGS_NO_FPU)
+KBUILD_CFLAGS += $(CFLAGS-y)
+KBUILD_RUSTFLAGS += -Ctarget-feature=-mma,-vsx,-hard-float,-altivec
CHECKFLAGS += -m$(BITS) -D__powerpc__ -D__powerpc$(BITS)__
ifdef CONFIG_CPU_BIG_ENDIAN
diff --git a/arch/powerpc/include/asm/jump_label.h
b/arch/powerpc/include/asm/jump_label.h
index d4eaba459a0e..a6b211502bfe 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;
diff --git a/rust/Makefile b/rust/Makefile
index 5d357dce1704..7a6daa822cbc 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -390,6 +390,7 @@ 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 := powerpc64le-linux-gnu
BINDGEN_TARGET_um := $(BINDGEN_TARGET_$(SUBARCH))
BINDGEN_TARGET := $(BINDGEN_TARGET_$(SRCARCH))
diff --git a/scripts/generate_rust_target.rs b/scripts/generate_rust_target.rs
index 38b3416bb979..875579b37424 100644
--- a/scripts/generate_rust_target.rs
+++ b/scripts/generate_rust_target.rs
@@ -256,6 +256,30 @@ fn main() {
}
} else if cfg.has("LOONGARCH") {
panic!("loongarch uses the builtin rustc
loongarch64-unknown-none-softfloat target");
+ } else if cfg.has("PPC64") {
+ ts.push("arch", "powerpc64");
+ ts.push(
+ "data-layout",
+ if cfg.has("CPU_LITTLE_ENDIAN") {
+ "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
+ } else {
+ "E-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
+ },
+ );
+ ts.push("features", "-mma,-altivec,-vsx,-hard-float");
+ ts.push(
+ "llvm-target",
+ if cfg.has("CPU_LITTLE_ENDIAN") {
+ "powerpc64le-linux-gnu"
+ } else {
+ "powerpc64-linux-gnu"
+ },
+ );
+ if cfg.rustc_version_atleast(1, 91, 0) {
+ ts.push("target-pointer-width", 64);
+ } else {
+ ts.push("target-pointer-width", "64");
+ }
} else {
panic!("Unsupported architecture");
}
--
2.52.0