diff --git a/rust/lanzatool/bootspec.json b/rust/lanzatool/bootspec.json index 912982f..db25337 100644 --- a/rust/lanzatool/bootspec.json +++ b/rust/lanzatool/bootspec.json @@ -1,8 +1,8 @@ { "v1": { - "init": "/nix/store/7zrsjhxi0c93m2l89rj8jdp9khm8fc6s-nixos-system-tuxedo-22.11.20221115.85d6b39/init", - "initrd": "/nix/store/7a4plccwni1sldhyra75f7m44xgsgiqw-initrd-linux-6.0.8/initrd", - "kernel": "/nix/store/nsw0422iwp4linayqx727pi4fdyja0wv-linux-6.0.8/bzImage", + "init": "/run/current-system/init", + "initrd": "/run/current-system/initrd", + "kernel": "/run/current-system/kernel", "kernelParams": [ "amd_iommu=on", "amd_iommu=pt", @@ -13,12 +13,12 @@ "systemd.unified_cgroup_hierarchy=1", "loglevel=4" ], - "label": "NixOS 21.11.20210810.dirty (Linux 5.15.30)", - "toplevel": "/nix/store/7zrsjhxi0c93m2l89rj8jdp9khm8fc6s-nixos-system-tuxedo-22.11.20221115.85d6b39", + "label": "LanzaOS", + "toplevel": "/run/current-system", "extension": { - "esp": "test", - "bootctl": "/nix/store/89366aivz6v8a34yyni2m04ca9hwrl92-systemd-250.4/bin/bootctl", - "osRelease": "/nix/store/734vglb01ssz73wlihad7xa9yzvwlvx6-etc-os-release" + "esp": "esp", + "bootctl": "/run/current-system/sw/bin/bootctl", + "osRelease": "/etc/os-release" } } } \ No newline at end of file diff --git a/rust/lanzatool/src/install.rs b/rust/lanzatool/src/install.rs index 9f55cb6..7bd4fe2 100644 --- a/rust/lanzatool/src/install.rs +++ b/rust/lanzatool/src/install.rs @@ -21,7 +21,7 @@ pub fn install(_: &Path, bootspec: &Path, lanzaboote_bin: &Path) -> Result<()> { &esp_paths.kernel, &esp_paths.initrd, ) - .unwrap(); + .expect("Failed to assemble stub"); // Copy the files to the ESP fs::create_dir_all(&esp_paths.nixos)?; diff --git a/rust/lanzatool/src/stub.rs b/rust/lanzatool/src/stub.rs index 54ad410..dcbf49a 100644 --- a/rust/lanzatool/src/stub.rs +++ b/rust/lanzatool/src/stub.rs @@ -18,20 +18,29 @@ pub fn assemble( let kernel_cmdline_file = Path::new("/tmp/kernel_cmdline"); fs::write(kernel_cmdline_file, kernel_cmdline.join(" "))?; let kernel_path_file = Path::new("/tmp/kernel_path"); - fs::write(kernel_path_file, kernel_path.to_str().unwrap())?; + fs::write(kernel_path_file, path_to_string(kernel_path))?; let initrd_path_file = Path::new("/tmp/initrd_path"); - fs::write(initrd_path_file, initrd_path.to_str().unwrap())?; + fs::write(initrd_path_file, path_to_string(initrd_path))?; let pe_binary = fs::read(lanzaboote_bin)?; let pe = goblin::pe::PE::parse(&pe_binary)?; + let image_base = pe + .header + .optional_header + .expect("Failed to find optional header, you're fucked") + .windows_fields + .image_base; + let os_release_offs = u64::from( pe.sections - .iter() - .find(|s| s.name().unwrap() == ".sdmagic") - .and_then(|s| Some(s.size_of_raw_data + s.virtual_address)) - .unwrap(), + .last() + .and_then(|s| Some(s.virtual_size + s.virtual_address)) + .expect("Failed to find the offset"), ); + // The Virtual Memory Addresss (VMA) is relative ot the image base, aka the image base + // needs to be added to the virtual address to get the actual (but still virtual address) + let os_release_offs = os_release_offs + image_base; let kernel_cmdline_offs = os_release_offs + file_size(os_release)?; let initrd_path_offs = kernel_cmdline_offs + file_size(kernel_cmdline_file)?; @@ -54,8 +63,8 @@ pub fn assemble( format!(".kernelp={}", path_to_string(kernel_path_file)), String::from("--change-section-vma"), format!(".kernelp={:#x}", kernel_path_offs), - lanzaboote_bin.to_str().unwrap().to_owned(), - String::from("stub.efi"), + path_to_string(lanzaboote_bin), + String::from("lanzaboote-image.efi"), ]; let status = Command::new("objcopy").args(&args).status()?; @@ -68,7 +77,13 @@ pub fn assemble( // All Linux file paths should be convertable to strings fn path_to_string(path: &Path) -> String { - path.to_owned().into_os_string().into_string().unwrap() + path.to_owned() + .into_os_string() + .into_string() + .expect(&format!( + "Failed to convert path '{}' to a string", + path.display() + )) } fn file_size(path: &Path) -> Result {