Skip to content

Commit 0f22644

Browse files
committed
refactor(cpu-template-helper): Build mock kernels with build.rs
The mock kernel images were added in commit 8377e7f ("chore(cpu-template-helper): Add mock kernels") and were generated from C code with Makefile. During its review cycle, the kernel generation became cheap enough to run as part of Firecracker compilation process. Replaces Makefile with build.rs and generates at the Firecracker compilation time. Signed-off-by: Takahiro Itazuri <[email protected]>
1 parent 8e61646 commit 0f22644

File tree

8 files changed

+69
-64
lines changed

8 files changed

+69
-64
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ test_results/*
1111
*.core
1212
*.profraw
1313
.DS_Store
14+
*.bin

src/cpu-template-helper/build.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
use std::io::Write;
5+
6+
const MOCK_KERNEL_PATH: &str = "src/utils/mock_kernel/kernel.bin";
7+
8+
// Kernel header for aarch64 that comes from the kernel doc Documentation/arm64/booting.txt.
9+
#[derive(Default)]
10+
#[repr(C, packed)]
11+
struct KernelHeader {
12+
code0: u32, // Executable code
13+
code1: u32, // Executable code
14+
text_offset: u64, // Image load offset,
15+
image_size: u64, // Effective Image size, little endian
16+
flags: u64, // kernel flags, little endian
17+
res2: u64, // reserved
18+
res3: u64, // reserved
19+
res4: u64, // reserved
20+
magic: u32, // Magic number, little endian, "ARM\x64"
21+
res5: u32, // reserved (used for PE COFF offset)
22+
}
23+
24+
fn main() {
25+
if cfg!(target_arch = "x86_64") {
26+
println!("cargo:rerun-if-changed=src/utils/mock_kernel/main.c");
27+
let status = std::process::Command::new("gcc")
28+
.args([
29+
// Do not use the standard system startup files or libraries when linking.
30+
"-nostdlib",
31+
// Prevents linking with the shared libraries.
32+
"-static",
33+
// Do not generate unwind tables.
34+
"-fno-asynchronous-unwind-tables",
35+
// Remove all symbol table and relocation information.
36+
"-s",
37+
"-o",
38+
MOCK_KERNEL_PATH,
39+
"src/utils/mock_kernel/main.c",
40+
])
41+
.status()
42+
.expect("Failed to execute gcc command");
43+
if !status.success() {
44+
panic!("Failed to compile mock kernel");
45+
}
46+
} else if cfg!(target_arch = "aarch64") {
47+
let header = KernelHeader {
48+
magic: 0x644D5241,
49+
..std::default::Default::default()
50+
};
51+
// SAFETY: This is safe as long as `header` is valid as `KernelHeader`.
52+
let header_bytes = unsafe {
53+
std::slice::from_raw_parts(
54+
(&header as *const KernelHeader).cast::<u8>(),
55+
std::mem::size_of::<KernelHeader>(),
56+
)
57+
};
58+
59+
let mut file = std::fs::File::create(MOCK_KERNEL_PATH).expect("Failed to create a file");
60+
file.write_all(header_bytes)
61+
.expect("Failed to write kernel header to a file");
62+
} else {
63+
panic!("Unsupported arch");
64+
}
65+
}

src/cpu-template-helper/src/utils/mock_kernel/Makefile

Lines changed: 0 additions & 17 deletions
This file was deleted.
Binary file not shown.

src/cpu-template-helper/src/utils/mock_kernel/aarch64.c

Lines changed: 0 additions & 41 deletions
This file was deleted.
Binary file not shown.

src/cpu-template-helper/src/utils/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,9 @@ pub enum UtilsError {
7575
// Utility function to prepare scratch kernel image and rootfs and build mock Firecracker config.
7676
fn build_mock_config() -> Result<(TempFile, TempFile, String), UtilsError> {
7777
let kernel = TempFile::new()?;
78-
kernel.as_file().write_all(
79-
#[cfg(target_arch = "aarch64")]
80-
include_bytes!("mock_kernel/aarch64.bin"),
81-
#[cfg(target_arch = "x86_64")]
82-
include_bytes!("mock_kernel/x86_64.bin"),
83-
)?;
78+
kernel
79+
.as_file()
80+
.write_all(include_bytes!("mock_kernel/kernel.bin"))?;
8481
let rootfs = TempFile::new()?;
8582
let config = format!(
8683
r#"{{

0 commit comments

Comments
 (0)