diff --git a/.cargo/config.toml b/.cargo/config.toml index 652c4cb..35049cb 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,2 @@ -[build] -target = "aarch64-unknown-uefi" - [alias] xtask = "run --package xtask --" diff --git a/Cargo.lock b/Cargo.lock index deef902..98a9981 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,6 +110,7 @@ checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" name = "efigife" version = "0.1.0" dependencies = [ + "byteorder", "embedded-graphics", "tinygif", "uefi", diff --git a/Cargo.toml b/Cargo.toml index acfb009..b79150b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,3 +2,12 @@ members = ["efi-bin", "xtask"] resolver = "2" +[profile.release] +strip = true +opt-level = "z" +lto = true +codegen-units = 1 +panic = "abort" + +[workspace.dependencies] +byteorder = { version = "*", default-features = false } diff --git a/efi-bin/Cargo.toml b/efi-bin/Cargo.toml index 05fcc4c..fd6e1e1 100644 --- a/efi-bin/Cargo.toml +++ b/efi-bin/Cargo.toml @@ -6,14 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +byteorder.workspace = true embedded-graphics = "0.8.1" tinygif = { version = "0.0.4", features = ["8k"] } uefi = { version = "0.28.0", features = ["global_allocator", "panic_handler", "alloc"] } uefi-graphics2 = "0.1.3" - -[profile.release] -strip = true -opt-level = "z" -lto = true -codegen-units = 1 -panic = "abort" diff --git a/xtask/src/main.rs b/xtask/src/main.rs index ca82811..47b803e 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -5,10 +5,10 @@ use std::{ process::{Command, Stdio}, }; -use fatfs::{FileSystem, FsOptions}; +use fatfs::{FileSystem, FormatVolumeOptions, FsOptions}; fn main() { - let mut args: VecDeque<_> = std::env::args().collect(); + let mut args: VecDeque<_> = std::env::args().skip(1).collect(); match args.pop_front() { Some(cmd) => match cmd.as_str() { @@ -16,26 +16,32 @@ fn main() { "run" => do_run(args), x => eprintln!("unknown command {:?}", x), }, - None => eprintln!("usage: cargo xtask [build|run]"), + None => eprintln!("usage: cargo xtask [build|run] [x86_64|aarch64]"), } } fn do_build(mut args: VecDeque) { - let mut cmd = Command::new(env!("CARGO")); - cmd.arg("build") + let build_success = Command::new(env!("CARGO")) + .arg("build") .arg("--bin") - .arg("efi-bin") - .arg("--release") // TODO: target according to arg + .arg("efigife") + .arg("--release") + .arg("--target") + .arg("aarch64-unknown-uefi") // TODO: target according to arg .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() - .unwrap(); + .unwrap() + .status + .success(); + assert!(build_success); let efi_bin_path = concat!( env!("CARGO_MANIFEST_DIR"), - "/target/aarch64-unknown-uefi/efi-bin.efi" + "/../target/aarch64-unknown-uefi/release/efigife.efi" ); + eprintln!("{}", efi_bin_path); let mut efi_bin_buf = Vec::new(); let mut efi_bin_file = File::open(efi_bin_path).unwrap(); let efi_bin_size = efi_bin_file.read_to_end(&mut efi_bin_buf); @@ -44,7 +50,12 @@ fn do_build(mut args: VecDeque) { let fat_disk_size = 256 * 1024; // todo!("get size from efi_bin_size"); let mut fat_disk = Cursor::new(vec![0; fat_disk_size]); - let mut fat_fs = FileSystem::new(&mut fat_disk, FsOptions::new()).unwrap(); + fatfs::format_volume( + &mut fat_disk, + FormatVolumeOptions::new().fat_type(fatfs::FatType::Fat12), + ) + .unwrap(); + let fat_fs = FileSystem::new(&mut fat_disk, FsOptions::new()).unwrap(); let boot_efi_name = "BOOTAA64.EFI"; // TODO: parameterize on arg let mut boot_efi = fat_fs .root_dir() @@ -55,12 +66,12 @@ fn do_build(mut args: VecDeque) { .create_file(boot_efi_name) .unwrap(); - boot_efi.write_all(&efi_bin_buf); + boot_efi.write_all(&efi_bin_buf).unwrap(); drop(boot_efi); fat_fs.unmount().unwrap(); // TODO: do the gif format juggling to add the comment in this xtask - let src_gif_path = concat!(env!("CARGO_MANIFEST_DIR"), "/efi-bin/src/bad-apple.gif"); + let src_gif_path = concat!(env!("CARGO_MANIFEST_DIR"), "/../efi-bin/src/bad-apple.gif"); let mut src_gif_file = File::open(src_gif_path).unwrap(); let mut buf = Vec::new(); let src_gif_size = src_gif_file.read_to_end(&mut buf).unwrap(); @@ -68,9 +79,17 @@ fn do_build(mut args: VecDeque) { let fat_start_sector = (src_gif_size + 511) / 512; buf.extend(std::iter::repeat(0).take(fat_start_sector * 512 - buf.len())); buf.extend(fat_disk.into_inner()); + + let out_img_path = format!( + "{}/../target/bad-apple.{}-efi.raw.gif", + env!("CARGO_MANIFEST_DIR"), + "aarch64" + ); + let mut out_img_file = File::create(out_img_path).unwrap(); + out_img_file.write_all(&buf).unwrap(); } -fn do_run(mut args: VecDeque) { +fn do_run(args: VecDeque) { do_build(args.clone()); let mut cmd = match args[0].as_str() { @@ -89,12 +108,17 @@ fn do_run(mut args: VecDeque) { cmd } "x86_64" | "x64" => { - let mut cmd = Command::new("qemu-system-x86_64"); + //let mut cmd = Command::new("qemu-system-x86_64"); todo!(); } x => unimplemented!("target cpu {:?}", x), }; - cmd.arg(todo!("disk image")) + let out_img_path = format!( + "{}/../target/bad-apple.{}-efi.raw.gif", + env!("CARGO_MANIFEST_DIR"), + "aarch64" + ); + cmd.arg(out_img_path) .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit())