forked from rust-osdev/bootloader
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request rust-osdev#304 from AlexJMohr/cargo-features
Add bios and uefi cargo features (closes rust-osdev#287)
- Loading branch information
Showing
11 changed files
with
235 additions
and
185 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
use crate::fat; | ||
use anyhow::Context; | ||
use std::{ | ||
collections::BTreeMap, | ||
path::{Path, PathBuf}, | ||
}; | ||
use tempfile::NamedTempFile; | ||
|
||
mod mbr; | ||
|
||
const BIOS_STAGE_3: &str = "boot-stage-3"; | ||
const BIOS_STAGE_4: &str = "boot-stage-4"; | ||
|
||
/// Create disk images for booting on legacy BIOS systems. | ||
pub struct BiosBoot { | ||
kernel: PathBuf, | ||
} | ||
|
||
impl BiosBoot { | ||
/// Start creating a disk image for the given bootloader ELF executable. | ||
pub fn new(kernel_path: &Path) -> Self { | ||
Self { | ||
kernel: kernel_path.to_owned(), | ||
} | ||
} | ||
|
||
/// Create a bootable UEFI disk image at the given path. | ||
pub fn create_disk_image(&self, out_path: &Path) -> anyhow::Result<()> { | ||
let bootsector_path = Path::new(env!("BIOS_BOOT_SECTOR_PATH")); | ||
let stage_2_path = Path::new(env!("BIOS_STAGE_2_PATH")); | ||
|
||
let fat_partition = self | ||
.create_fat_partition() | ||
.context("failed to create FAT partition")?; | ||
|
||
mbr::create_mbr_disk( | ||
bootsector_path, | ||
stage_2_path, | ||
fat_partition.path(), | ||
out_path, | ||
) | ||
.context("failed to create BIOS MBR disk image")?; | ||
|
||
fat_partition | ||
.close() | ||
.context("failed to delete FAT partition after disk image creation")?; | ||
|
||
Ok(()) | ||
} | ||
|
||
/// Creates an BIOS-bootable FAT partition with the kernel. | ||
fn create_fat_partition(&self) -> anyhow::Result<NamedTempFile> { | ||
let stage_3_path = Path::new(env!("BIOS_STAGE_3_PATH")); | ||
let stage_4_path = Path::new(env!("BIOS_STAGE_4_PATH")); | ||
|
||
let mut files = BTreeMap::new(); | ||
files.insert(crate::KERNEL_FILE_NAME, self.kernel.as_path()); | ||
files.insert(BIOS_STAGE_3, stage_3_path); | ||
files.insert(BIOS_STAGE_4, stage_4_path); | ||
|
||
let out_file = NamedTempFile::new().context("failed to create temp file")?; | ||
fat::create_fat_filesystem(files, out_file.path()) | ||
.context("failed to create BIOS FAT filesystem")?; | ||
|
||
Ok(out_file) | ||
} | ||
} |
Oops, something went wrong.