Skip to content

Commit e76b7e1

Browse files
committed
Update builder executable for new bootloader design (UEFI only)
1 parent 9a3470f commit e76b7e1

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/bin/builder.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ type ExitCode = i32;
1515
#[derive(FromArgs)]
1616
/// Build the bootloader
1717
struct BuildArguments {
18-
/// path to the `Cargo.toml` of the kernel
19-
#[argh(option)]
20-
kernel_manifest: PathBuf,
21-
2218
/// path to the kernel ELF binary
2319
#[argh(option)]
2420
kernel_binary: PathBuf,
@@ -107,8 +103,6 @@ fn main() -> anyhow::Result<()> {
107103
if args.quiet {
108104
cmd.arg("--quiet");
109105
}
110-
cmd.env("KERNEL", &args.kernel_binary);
111-
cmd.env("KERNEL_MANIFEST", &args.kernel_manifest);
112106
assert!(cmd.status()?.success());
113107

114108
// Retrieve binary paths
@@ -155,7 +149,7 @@ fn main() -> anyhow::Result<()> {
155149

156150
if let Some(out_dir) = &args.out_dir {
157151
let efi_file = out_dir.join(format!("boot-{}-{}.efi", executable_name, kernel_name));
158-
create_uefi_disk_image(&executable_path, &efi_file)
152+
create_uefi_disk_image(&executable_path, &efi_file, &args.kernel_binary)
159153
.context("failed to create UEFI disk image")?;
160154
}
161155
}
@@ -176,8 +170,6 @@ fn main() -> anyhow::Result<()> {
176170
if args.quiet {
177171
cmd.arg("--quiet");
178172
}
179-
cmd.env("KERNEL", &args.kernel_binary);
180-
cmd.env("KERNEL_MANIFEST", &args.kernel_manifest);
181173
cmd.env("RUSTFLAGS", "-C opt-level=s");
182174
assert!(cmd.status()?.success());
183175

@@ -233,13 +225,21 @@ fn main() -> anyhow::Result<()> {
233225
Ok(())
234226
}
235227

236-
fn create_uefi_disk_image(executable_path: &Path, efi_file: &Path) -> anyhow::Result<()> {
228+
fn create_uefi_disk_image(
229+
executable_path: &Path,
230+
efi_file: &Path,
231+
kernel_binary: &Path,
232+
) -> anyhow::Result<()> {
237233
fs::copy(&executable_path, &efi_file).context("failed to copy efi file to out dir")?;
238234

239235
let efi_size = fs::metadata(&efi_file)
240236
.context("failed to read metadata of efi file")?
241237
.len();
242238

239+
let kernel_size = fs::metadata(&kernel_binary)
240+
.context("failed to read metadata of kernel binary")?
241+
.len();
242+
243243
// create fat partition
244244
let fat_file_path = {
245245
const MB: u64 = 1024 * 1024;
@@ -252,9 +252,10 @@ fn create_uefi_disk_image(executable_path: &Path, efi_file: &Path) -> anyhow::Re
252252
.truncate(true)
253253
.open(&fat_path)
254254
.context("Failed to create UEFI FAT file")?;
255-
let efi_size_padded_and_rounded = ((efi_size + 1024 * 64 - 1) / MB + 1) * MB;
255+
let fat_size = efi_size + kernel_size;
256+
let fat_size_padded_and_rounded = ((fat_size + 1024 * 64 - 1) / MB + 1) * MB;
256257
fat_file
257-
.set_len(efi_size_padded_and_rounded)
258+
.set_len(fat_size_padded_and_rounded)
258259
.context("failed to set UEFI FAT file length")?;
259260

260261
// create new FAT partition
@@ -272,6 +273,11 @@ fn create_uefi_disk_image(executable_path: &Path, efi_file: &Path) -> anyhow::Re
272273
bootx64.truncate()?;
273274
io::copy(&mut fs::File::open(&executable_path)?, &mut bootx64)?;
274275

276+
// copy kernel to FAT filesystem
277+
let mut kernel_file = root_dir.create_file("kernel-x86_64")?;
278+
kernel_file.truncate()?;
279+
io::copy(&mut fs::File::open(&kernel_binary)?, &mut kernel_file)?;
280+
275281
fat_path
276282
};
277283

@@ -315,7 +321,7 @@ fn create_uefi_disk_image(executable_path: &Path, efi_file: &Path) -> anyhow::Re
315321

316322
// add add EFI system partition
317323
let partition_id = disk
318-
.add_partition("boot", partition_size, gpt::partition_types::EFI, 0)
324+
.add_partition("boot", partition_size, gpt::partition_types::EFI, 0, None)
319325
.context("failed to add boot partition")?;
320326

321327
let partition = disk

0 commit comments

Comments
 (0)