diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3ddca01..d2f93d4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -191,6 +191,10 @@ jobs: workingDirectory: example-kernels/runner displayName: 'Run `cargo xrun` for "runner" kernel' + - script: cargo xtest -Z doctest-xcompile + workingDirectory: example-kernels/runner-doctest + displayName: 'Run `cargo xtest -Z doctest-xcompile` for "runner-doctest" kernel' + - script: cargo xtest workingDirectory: example-kernels/runner-test displayName: 'Run `cargo xtest` for "runner-test" kernel' diff --git a/example-kernels/Cargo.lock b/example-kernels/Cargo.lock index 8549198..c04784c 100644 --- a/example-kernels/Cargo.lock +++ b/example-kernels/Cargo.lock @@ -12,7 +12,7 @@ dependencies = [ name = "basic" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -28,14 +28,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bootloader" -version = "0.5.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixedvec 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "font8x8 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "llvm-tools 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "usize_conversions 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "x86_64 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "x86_64 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", "xmas-elf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -53,7 +52,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "default-target-bootimage" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -61,7 +60,7 @@ dependencies = [ name = "default-target-cargo" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -73,11 +72,6 @@ dependencies = [ "skeptic 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "font8x8" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -182,7 +176,15 @@ dependencies = [ name = "runner" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "runner-doctest" +version = "0.1.0" +dependencies = [ + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -190,7 +192,7 @@ dependencies = [ name = "runner-test" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -247,7 +249,7 @@ dependencies = [ name = "testing-qemu-exit-code" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -255,7 +257,7 @@ dependencies = [ name = "testing-serial-result" version = "0.1.0" dependencies = [ - "bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "uart_16550 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -319,27 +321,26 @@ dependencies = [ [[package]] name = "x86_64" -version = "0.3.6" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "array-init 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "os_bootinfo 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "usize_conversions 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "raw-cpuid 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ux 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "x86_64" -version = "0.5.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "array-init 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "raw-cpuid 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ux 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -360,11 +361,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum array-init 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" "checksum bit_field 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed8765909f9009617974ab6b7d332625b320b33c326b1e9321382ef1999b5d56" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" -"checksum bootloader 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a8f7c11b70b5781deec899276f7d67611eaf296a8bd7dcc9b9d37c71a5389c52" +"checksum bootloader 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b15e5b7b9d9a8e427cf4270894f51ce288632a3a1a2cc6f8fda669d5446f98bd" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" "checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "checksum fixedvec 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c6c16d316ccdac21a4dd648e314e76facbbaf316e83ca137d0857a9c07419d0" -"checksum font8x8 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "44226c40489fb1d602344a1d8f1b544570c3435e396dda1eda7b5ef010d8f1be" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum getopts 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)" = "72327b15c228bfe31f1390f93dd5e9279587f0463836393c9df719ce62a3e450" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" @@ -394,7 +394,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum x86_64 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd647af1614659e1febec1d681231aea4ebda4818bf55a578aff02f3e4db4b4" -"checksum x86_64 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f9258d7e2dd25008d69e8c9e9ee37865887a5e1e3d06a62f1cb3f6c209e6f177" "checksum x86_64 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bb8f09c32a991cc758ebcb9b7984f530095d32578a4e7b85db6ee1f0bbe4c9c6" +"checksum x86_64 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1f27d9168654aee1b0c1b73746caeb4aa33248f8b8c8f6e100e697fcc2a794b2" "checksum xmas-elf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "22678df5df766e8d1e5d609da69f0c3132d794edf6ab5e75e7abcd2270d4cf58" "checksum zero 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f1bc8a6b2005884962297587045002d8cfb8dcec9db332f4ca216ddc5de82c5" diff --git a/example-kernels/Cargo.toml b/example-kernels/Cargo.toml index ee84626..e2ee131 100644 --- a/example-kernels/Cargo.toml +++ b/example-kernels/Cargo.toml @@ -4,6 +4,7 @@ members = [ "default-target-bootimage", "default-target-cargo", "runner", + "runner-doctest", "runner-test", "testing-qemu-exit-code", "testing-serial-result", diff --git a/example-kernels/runner-doctest/.cargo/config b/example-kernels/runner-doctest/.cargo/config new file mode 100644 index 0000000..3b4d89e --- /dev/null +++ b/example-kernels/runner-doctest/.cargo/config @@ -0,0 +1,5 @@ +[build] +target = "../x86_64-bootimage-example-kernels.json" + +[target.'cfg(target_os = "none")'] +runner = "bootimage runner" diff --git a/example-kernels/runner-doctest/.gitignore b/example-kernels/runner-doctest/.gitignore new file mode 100644 index 0000000..eccd7b4 --- /dev/null +++ b/example-kernels/runner-doctest/.gitignore @@ -0,0 +1,2 @@ +/target/ +**/*.rs.bk diff --git a/example-kernels/runner-doctest/Cargo.toml b/example-kernels/runner-doctest/Cargo.toml new file mode 100644 index 0000000..d3c440f --- /dev/null +++ b/example-kernels/runner-doctest/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "runner-doctest" +version = "0.1.0" +authors = ["Philipp Oppermann "] +edition = "2018" + +[dependencies] +bootloader = "0.6.4" +x86_64 = "0.5.3" + +[package.metadata.bootimage] +test-success-exit-code = 33 # (0x10 << 1) | 1 +test-args = ["-device", "isa-debug-exit,iobase=0xf4,iosize=0x04", "-display", "none"] diff --git a/example-kernels/runner-doctest/src/lib.rs b/example-kernels/runner-doctest/src/lib.rs new file mode 100644 index 0000000..df474a2 --- /dev/null +++ b/example-kernels/runner-doctest/src/lib.rs @@ -0,0 +1,84 @@ +#![no_std] +#![cfg_attr(test, no_main)] + +#![feature(custom_test_frameworks)] +#![test_runner(crate::test_runner)] +#![reexport_test_harness_main = "test_main"] + +/// add two numbers +/// +/// ``` +/// #![no_std] +/// #![no_main] +/// use runner_doctest::{add, exit_qemu, ExitCode}; +/// #[export_name = "_start"] +/// extern "C" fn main() { +/// assert_eq!(add(1, 2), 3); +/// unsafe { exit_qemu(ExitCode::Success); } +/// } +/// ``` +pub fn add(a: u32, b: u32) -> u32 { + a + b +} + +/// multiply two numbers +/// +/// ``` +/// #![no_std] +/// #![no_main] +/// use runner_doctest::{mul, exit_qemu, ExitCode}; +/// #[export_name = "_start"] +/// extern "C" fn main() { +/// assert_eq!(mul(2, 3), 6); +/// unsafe { exit_qemu(ExitCode::Success); } +/// } +/// ``` +pub fn mul(a: u32, b: u32) -> u32 { + a * b +} + +fn test_runner(tests: &[&dyn Fn()]) { + for test in tests.iter() { + test(); + } + + unsafe { exit_qemu(ExitCode::Success); } +} + +pub enum ExitCode { + Success, + Failed +} + +impl ExitCode { + fn code(&self) -> u32 { + match self { + ExitCode::Success => 0x10, + ExitCode::Failed => 0x11, + } + } +} + +/// exit QEMU (see https://os.phil-opp.com/integration-tests/#shutting-down-qemu) +pub unsafe fn exit_qemu(exit_code: ExitCode) { + use x86_64::instructions::port::Port; + + let mut port = Port::::new(0xf4); + port.write(exit_code.code()); +} + +#[cfg(test)] +#[no_mangle] +pub extern "C" fn _start() -> ! { + test_main(); + + unsafe { exit_qemu(ExitCode::Failed); } + + loop {} +} + +#[panic_handler] +fn panic(_info: &core::panic::PanicInfo) -> ! { + unsafe { exit_qemu(ExitCode::Failed); } + loop {} +}