Skip to content

Commit

Permalink
samples: add first Rust examples
Browse files Browse the repository at this point in the history
The beginning of a set of Rust modules that showcase how Rust
modules look like and how to use the abstracted kernel features.

It also includes an example of a Rust host program with
several modules.

These samples also double as tests in the CI.

Reviewed-by: Kees Cook <[email protected]>
Reviewed-by: Greg Kroah-Hartman <[email protected]>
Co-developed-by: Alex Gaynor <[email protected]>
Signed-off-by: Alex Gaynor <[email protected]>
Co-developed-by: Finn Behrens <[email protected]>
Signed-off-by: Finn Behrens <[email protected]>
Co-developed-by: Wedson Almeida Filho <[email protected]>
Signed-off-by: Wedson Almeida Filho <[email protected]>
Co-developed-by: Milan Landaverde <[email protected]>
Signed-off-by: Milan Landaverde <[email protected]>
Signed-off-by: Miguel Ojeda <[email protected]>
  • Loading branch information
ojeda committed Sep 28, 2022
1 parent 0949813 commit e4fc658
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 0 deletions.
2 changes: 2 additions & 0 deletions samples/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ config SAMPLE_CORESIGHT_SYSCFG
This demonstrates how a user may create their own CoreSight
configurations and easily load them into the system at runtime.

source "samples/rust/Kconfig"

endif # SAMPLES

config HAVE_SAMPLE_FTRACE_DIRECT
Expand Down
1 change: 1 addition & 0 deletions samples/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ subdir-$(CONFIG_SAMPLE_WATCH_QUEUE) += watch_queue
obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak/
obj-$(CONFIG_SAMPLE_CORESIGHT_SYSCFG) += coresight/
obj-$(CONFIG_SAMPLE_FPROBE) += fprobe/
obj-$(CONFIG_SAMPLES_RUST) += rust/
30 changes: 30 additions & 0 deletions samples/rust/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-License-Identifier: GPL-2.0

menuconfig SAMPLES_RUST
bool "Rust samples"
depends on RUST
help
You can build sample Rust kernel code here.

If unsure, say N.

if SAMPLES_RUST

config SAMPLE_RUST_MINIMAL
tristate "Minimal"
help
This option builds the Rust minimal module sample.

To compile this as a module, choose M here:
the module will be called rust_minimal.

If unsure, say N.

config SAMPLE_RUST_HOSTPROGS
bool "Host programs"
help
This option builds the Rust host program samples.

If unsure, say N.

endif # SAMPLES_RUST
5 changes: 5 additions & 0 deletions samples/rust/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SPDX-License-Identifier: GPL-2.0

obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o

subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs
3 changes: 3 additions & 0 deletions samples/rust/hostprogs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# SPDX-License-Identifier: GPL-2.0

single
5 changes: 5 additions & 0 deletions samples/rust/hostprogs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SPDX-License-Identifier: GPL-2.0

hostprogs-always-y := single

single-rust := y
7 changes: 7 additions & 0 deletions samples/rust/hostprogs/a.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// SPDX-License-Identifier: GPL-2.0

//! Rust single host program sample: module `a`.

pub(crate) fn f(x: i32) {
println!("The number is {}.", x);
}
5 changes: 5 additions & 0 deletions samples/rust/hostprogs/b.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// SPDX-License-Identifier: GPL-2.0

//! Rust single host program sample: module `b`.

pub(crate) const CONSTANT: i32 = 42;
12 changes: 12 additions & 0 deletions samples/rust/hostprogs/single.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// SPDX-License-Identifier: GPL-2.0

//! Rust single host program sample.

mod a;
mod b;

fn main() {
println!("Hello world!");

a::f(b::CONSTANT);
}
38 changes: 38 additions & 0 deletions samples/rust/rust_minimal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// SPDX-License-Identifier: GPL-2.0

//! Rust minimal sample.

use kernel::prelude::*;

module! {
type: RustMinimal,
name: b"rust_minimal",
author: b"Rust for Linux Contributors",
description: b"Rust minimal sample",
license: b"GPL",
}

struct RustMinimal {
numbers: Vec<i32>,
}

impl kernel::Module for RustMinimal {
fn init(_module: &'static ThisModule) -> Result<Self> {
pr_info!("Rust minimal sample (init)\n");
pr_info!("Am I built-in? {}\n", !cfg!(MODULE));

let mut numbers = Vec::new();
numbers.try_push(72)?;
numbers.try_push(108)?;
numbers.try_push(200)?;

Ok(RustMinimal { numbers })
}
}

impl Drop for RustMinimal {
fn drop(&mut self) {
pr_info!("My numbers are {:?}\n", self.numbers);
pr_info!("Rust minimal sample (exit)\n");
}
}

0 comments on commit e4fc658

Please sign in to comment.