Skip to content

Commit 3d0ce32

Browse files
committed
move uefi test to run-make
1 parent 29a5872 commit 3d0ce32

File tree

9 files changed

+96
-151
lines changed

9 files changed

+96
-151
lines changed

src/ci/docker/host-x86_64/test-various/Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ ENV MUSL_TARGETS=x86_64-unknown-linux-musl \
7979
CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++
8080
ENV MUSL_SCRIPT python3 /checkout/x.py --stage 2 test --host='' --target $MUSL_TARGETS
8181

82-
COPY host-x86_64/test-various/uefi_qemu_test /uefi_qemu_test
8382
ENV UEFI_TARGETS=aarch64-unknown-uefi,i686-unknown-uefi,x86_64-unknown-uefi \
8483
CC_aarch64_unknown_uefi=clang-11 \
8584
CXX_aarch64_unknown_uefi=clang++-11 \
@@ -88,6 +87,8 @@ ENV UEFI_TARGETS=aarch64-unknown-uefi,i686-unknown-uefi,x86_64-unknown-uefi \
8887
CC_x86_64_unknown_uefi=clang-11 \
8988
CXX_x86_64_unknown_uefi=clang++-11
9089
ENV UEFI_SCRIPT python3 /checkout/x.py --stage 2 build --host='' --target $UEFI_TARGETS && \
91-
python3 -u /uefi_qemu_test/run.py
90+
python3 /checkout/x.py --stage 2 test tests/run-make/uefi-qemu/rmake.rs --target aarch64-unknown-uefi && \
91+
python3 /checkout/x.py --stage 2 test tests/run-make/uefi-qemu/rmake.rs --target i686-unknown-uefi && \
92+
python3 /checkout/x.py --stage 2 test tests/run-make/uefi-qemu/rmake.rs --target x86_64-unknown-uefi
9293

9394
ENV SCRIPT $WASM_SCRIPT && $NVPTX_SCRIPT && $MUSL_SCRIPT && $UEFI_SCRIPT

src/ci/docker/host-x86_64/test-various/uefi_qemu_test/run.py

Lines changed: 0 additions & 140 deletions
This file was deleted.

src/tools/compiletest/src/directives.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,7 @@ const KNOWN_DIRECTIVE_NAMES: &[&str] = &[
991991
"only-stable",
992992
"only-thumb",
993993
"only-tvos",
994+
"only-uefi",
994995
"only-unix",
995996
"only-visionos",
996997
"only-wasm32",

src/tools/compiletest/src/directives/cfg.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ fn parse_cfg_name_directive<'a>(
164164
message: "when the architecture is part of the Thumb family"
165165
}
166166

167+
condition! {
168+
name: "uefi",
169+
condition: config.target.ends_with("uefi"),
170+
message: "when target platform is UEFI"
171+
}
172+
167173
condition! {
168174
name: "apple",
169175
condition: config.target.contains("apple"),

src/tools/tidy/src/deps.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ pub(crate) const WORKSPACES: &[(&str, ExceptionList, Option<(&[&str], &[&str])>,
7373
// tidy-alphabetical-start
7474
("compiler/rustc_codegen_gcc", EXCEPTIONS_GCC, None, &[]),
7575
("src/bootstrap", EXCEPTIONS_BOOTSTRAP, None, &[]),
76-
("src/ci/docker/host-x86_64/test-various/uefi_qemu_test", EXCEPTIONS_UEFI_QEMU_TEST, None, &[]),
7776
("src/tools/cargo", EXCEPTIONS_CARGO, None, &["src/tools/cargo"]),
7877
//("src/tools/miri/test-cargo-miri", &[], None), // FIXME uncomment once all deps are vendored
7978
//("src/tools/miri/test_dependencies", &[], None), // FIXME uncomment once all deps are vendored
8079
("src/tools/rust-analyzer", EXCEPTIONS_RUST_ANALYZER, None, &[]),
8180
("src/tools/rustbook", EXCEPTIONS_RUSTBOOK, None, &["src/doc/book", "src/doc/reference"]),
8281
("src/tools/rustc-perf", EXCEPTIONS_RUSTC_PERF, None, &["src/tools/rustc-perf"]),
8382
("src/tools/test-float-parse", EXCEPTIONS, None, &[]),
83+
("tests/run-make/uefi-qemu/uefi_qemu_test", EXCEPTIONS_UEFI_QEMU_TEST, None, &[]),
8484
// tidy-alphabetical-end
8585
];
8686

tests/run-make/uefi-qemu/rmake.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
//! This test builds and runs a basic UEFI application on QEMU for various targets.
2+
//!
3+
//! You must have the relevant OVMF or AAVMF firmware installed for this to work.
4+
//!
5+
//! Requires: qemu-system-x86_64, qemu-system-aarch64
6+
//! OVMF/AAVMF firmware
7+
//!
8+
//! Note: test assumes `/uefi_qemu_test` exists and is a self-contained crate.
9+
10+
//@ only-uefi
11+
12+
use std::path::Path;
13+
14+
use run_make_support::{cargo, cmd, path, rfs};
15+
16+
fn main() {
17+
let target = run_make_support::target();
18+
19+
let (boot_filename, ovmf_dir, ovmf_code_name, ovmf_vars_name, qemu, machine, cpu) =
20+
match target.as_str() {
21+
"aarch64-unknown-uefi" => (
22+
"bootaa64.efi",
23+
Path::new("/usr/share/AAVMF"),
24+
"AAVMF_CODE.fd",
25+
"AAVMF_VARS.fd",
26+
"qemu-system-aarch64",
27+
"virt",
28+
"cortex-a72",
29+
),
30+
"i686-unknown-uefi" => (
31+
"bootia32.efi",
32+
Path::new("/usr/share/OVMF"),
33+
"OVMF32_CODE_4M.secboot.fd",
34+
"OVMF32_VARS_4M.fd",
35+
"qemu-system-x86_64",
36+
"q35",
37+
"qemu64",
38+
),
39+
"x86_64-unknown-uefi" => (
40+
"bootx64.efi",
41+
Path::new("/usr/share/OVMF"),
42+
"OVMF_CODE_4M.fd",
43+
"OVMF_VARS_4M.fd",
44+
"qemu-system-x86_64",
45+
"q35",
46+
"qemu64",
47+
),
48+
_ => panic!("unsupported target {target}"),
49+
};
50+
51+
let tmp = std::env::temp_dir();
52+
let test_crate = tmp.join("uefi_qemu_test");
53+
rfs::copy_dir_all(path("uefi_qemu_test"), &test_crate);
54+
55+
cargo().args(&["build", "--target", &target]).current_dir(&test_crate).run();
56+
57+
// Prepare ESP
58+
let esp = test_crate.join("esp");
59+
let boot = esp.join("efi/boot");
60+
std::fs::create_dir_all(&boot).unwrap();
61+
62+
let src_efi = test_crate.join("target").join(&target).join("debug/uefi_qemu_test.efi");
63+
let dst_efi = boot.join(boot_filename);
64+
std::fs::copy(&src_efi, &dst_efi).unwrap();
65+
66+
// Copy OVMF files
67+
let code = ovmf_dir.join(ovmf_code_name);
68+
let vars_src = ovmf_dir.join(ovmf_vars_name);
69+
let vars_dst = tmp.join("vars.fd");
70+
std::fs::copy(&vars_src, &vars_dst).unwrap();
71+
72+
let output = cmd(qemu)
73+
.args(["-machine", machine])
74+
.args(["-cpu", cpu])
75+
.args(["-display", "none"])
76+
.args(["-serial", "stdio"])
77+
.args(["-drive", &format!("if=pflash,format=raw,readonly=on,file={}", code.display())])
78+
.args(["-drive", &format!("if=pflash,format=raw,readonly=off,file={}", vars_dst.display())])
79+
.args(["-drive", &format!("format=raw,file=fat:rw:{}", esp.display())])
80+
.run()
81+
.stdout_utf8();
82+
83+
assert!(output.contains("Hello World!"), "invalid output for {target}:\n{output}");
84+
}

src/ci/docker/host-x86_64/test-various/uefi_qemu_test/src/main.rs renamed to tests/run-make/uefi-qemu/uefi_qemu_test/src/main.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,7 @@ fn panic_handler(_info: &panic::PanicInfo) -> ! {
1515

1616
#[export_name = "efi_main"]
1717
pub extern "C" fn main(_h: Handle, st: *mut SystemTable) -> Status {
18-
let s = [
19-
0x0048u16, 0x0065u16, 0x006cu16, 0x006cu16, 0x006fu16, // "Hello"
20-
0x0020u16, // " "
21-
0x0057u16, 0x006fu16, 0x0072u16, 0x006cu16, 0x0064u16, // "World"
22-
0x0021u16, // "!"
23-
0x000au16, // "\n"
24-
0x0000u16, // NUL
25-
];
18+
let s = b"Hello World!\n\0".map(|c| u16::from(c));
2619

2720
// Print "Hello World!".
2821
let r = unsafe { ((*(*st).con_out).output_string)((*st).con_out, s.as_ptr() as *mut Char16) };

0 commit comments

Comments
 (0)