Add documentation to initrd loader

This commit is contained in:
Julian Stecklina 2022-11-24 12:11:17 +01:00
parent 521bf343f5
commit 30b61baf38
1 changed files with 14 additions and 0 deletions

View File

@ -49,6 +49,9 @@ static mut DEVICE_PATH_PROTOCOL: [u8; 24] = [
0x52, 0x31, 0xcc, 0x68, 0x7f, 0xff, 0x04, 0x00, 0x52, 0x31, 0xcc, 0x68, 0x7f, 0xff, 0x04, 0x00,
]; ];
/// The UEFI LoadFile2 protocol.
///
/// This protocol has a single method to load a file.
#[repr(C)] #[repr(C)]
#[unsafe_guid("4006c0c1-fcb3-403e-996d-4a6c8724e06d")] #[unsafe_guid("4006c0c1-fcb3-403e-996d-4a6c8724e06d")]
#[derive(Protocol)] #[derive(Protocol)]
@ -120,6 +123,11 @@ unsafe extern "efiapi" fn raw_load_file(
.status() .status()
} }
/// A RAII wrapper to install and uninstall the Linux initrd loading
/// protocol.
///
/// **Note:** You need to call [`InitrdLoader::uninstall`], before
/// this is dropped.
pub struct InitrdLoader { pub struct InitrdLoader {
proto: Pin<Box<LoadFile2Protocol>>, proto: Pin<Box<LoadFile2Protocol>>,
handle: Handle, handle: Handle,
@ -127,6 +135,8 @@ pub struct InitrdLoader {
} }
/// Returns the data range of the initrd in the PE binary. /// Returns the data range of the initrd in the PE binary.
///
/// The initrd has to be embedded in the file as a .initrd PE section.
fn initrd_location(initrd_efi: &mut RegularFile) -> Result<Range<usize>> { fn initrd_location(initrd_efi: &mut RegularFile) -> Result<Range<usize>> {
initrd_efi.set_position(0)?; initrd_efi.set_position(0)?;
@ -149,6 +159,10 @@ fn initrd_location(initrd_efi: &mut RegularFile) -> Result<Range<usize>> {
.ok_or(Status::END_OF_FILE.into()) .ok_or(Status::END_OF_FILE.into())
} }
/// Check the signature of the initrd.
///
/// For this to work, the initrd needs to be a PE binary. We misuse
/// [`BootServices::load_image`] for this.
fn initrd_verify(boot_services: &BootServices, initrd_efi: &mut RegularFile) -> Result<()> { fn initrd_verify(boot_services: &BootServices, initrd_efi: &mut RegularFile) -> Result<()> {
initrd_efi.set_position(0)?; initrd_efi.set_position(0)?;
let file_data = read_all(initrd_efi)?; let file_data = read_all(initrd_efi)?;