Pass on command line from UKI to Linux kernel
This commit is contained in:
		
							parent
							
								
									8f2f11aa1b
								
							
						
					
					
						commit
						5a6c05cf11
					
				| 
						 | 
				
			
			@ -72,7 +72,7 @@
 | 
			
		|||
        VERSION="${lanzaboote.version}"
 | 
			
		||||
      '';
 | 
			
		||||
 | 
			
		||||
      cmdline = pkgs.writeText "lanzaboote-cmdline" "";
 | 
			
		||||
      cmdline = pkgs.writeText "lanzaboote-cmdline" "console=ttyS0";
 | 
			
		||||
 | 
			
		||||
      lanzaboote-uki = pkgs.runCommand "lanzboote-uki" {
 | 
			
		||||
        nativeBuildInputs = [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,18 +14,15 @@ use uefi::{
 | 
			
		|||
    prelude::*,
 | 
			
		||||
    proto::{
 | 
			
		||||
        console::text::Output,
 | 
			
		||||
        device_path::text::{AllowShortcuts, DevicePathToText, DisplayOnly},
 | 
			
		||||
        loaded_image::LoadedImage,
 | 
			
		||||
        media::file::{File, FileAttribute, FileMode, RegularFile},
 | 
			
		||||
        media::file::{File, FileAttribute, FileMode},
 | 
			
		||||
    },
 | 
			
		||||
    table::boot::{OpenProtocolAttributes, OpenProtocolParams},
 | 
			
		||||
    Result,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    linux_loader::InitrdLoader,
 | 
			
		||||
    pe_section::pe_section,
 | 
			
		||||
    uefi_helpers::{booted_image_file, read_all},
 | 
			
		||||
    uefi_helpers::{booted_image_cmdline, booted_image_file, read_all},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
fn print_logo(output: &mut Output) {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,17 +49,19 @@ fn main(handle: Handle, mut system_table: SystemTable<Boot>) -> Status {
 | 
			
		|||
 | 
			
		||||
    print_logo(system_table.stdout());
 | 
			
		||||
 | 
			
		||||
    let boot_services = system_table.boot_services();
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        let image_data = read_all(&mut booted_image_file(boot_services).unwrap()).unwrap();
 | 
			
		||||
        let image_data =
 | 
			
		||||
            read_all(&mut booted_image_file(system_table.boot_services()).unwrap()).unwrap();
 | 
			
		||||
 | 
			
		||||
        if let Some(data) = pe_section(&image_data, ".osrel") {
 | 
			
		||||
            info!("osrel = {}", core::str::from_utf8(data).unwrap_or("???"))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut file_system = boot_services.get_image_file_system(handle).unwrap();
 | 
			
		||||
    let mut file_system = system_table
 | 
			
		||||
        .boot_services()
 | 
			
		||||
        .get_image_file_system(handle)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let mut root = file_system.open_volume().unwrap();
 | 
			
		||||
 | 
			
		||||
    let mut file = root
 | 
			
		||||
| 
						 | 
				
			
			@ -77,23 +76,47 @@ fn main(handle: Handle, mut system_table: SystemTable<Boot>) -> Status {
 | 
			
		|||
        .into_regular_file()
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    // We need to manually drop those to be able to touch the system_table again.
 | 
			
		||||
    drop(root);
 | 
			
		||||
    drop(file_system);
 | 
			
		||||
 | 
			
		||||
    debug!("Opened file");
 | 
			
		||||
 | 
			
		||||
    let kernel = read_all(&mut file).unwrap();
 | 
			
		||||
    let kernel_cmdline = booted_image_cmdline(system_table.boot_services()).unwrap();
 | 
			
		||||
 | 
			
		||||
    let kernel_image = boot_services
 | 
			
		||||
    let kernel_data = read_all(&mut file).unwrap();
 | 
			
		||||
    let kernel_handle = system_table
 | 
			
		||||
        .boot_services()
 | 
			
		||||
        .load_image(
 | 
			
		||||
            handle,
 | 
			
		||||
            uefi::table::boot::LoadImageSource::FromBuffer {
 | 
			
		||||
                buffer: &kernel,
 | 
			
		||||
                buffer: &kernel_data,
 | 
			
		||||
                file_path: None,
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let mut initrd_loader = InitrdLoader::new(&boot_services, handle, initrd).unwrap();
 | 
			
		||||
    let status = boot_services.start_image(kernel_image).status();
 | 
			
		||||
    let mut kernel_image = system_table
 | 
			
		||||
        .boot_services()
 | 
			
		||||
        .open_protocol_exclusive::<LoadedImage>(kernel_handle)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    initrd_loader.uninstall(&boot_services).unwrap();
 | 
			
		||||
    unsafe {
 | 
			
		||||
        kernel_image.set_load_options(
 | 
			
		||||
            kernel_cmdline.as_ptr() as *const u8,
 | 
			
		||||
            u32::try_from(kernel_cmdline.len()).unwrap(),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut initrd_loader =
 | 
			
		||||
        InitrdLoader::new(&system_table.boot_services(), handle, initrd).unwrap();
 | 
			
		||||
    let status = system_table
 | 
			
		||||
        .boot_services()
 | 
			
		||||
        .start_image(kernel_handle)
 | 
			
		||||
        .status();
 | 
			
		||||
 | 
			
		||||
    initrd_loader
 | 
			
		||||
        .uninstall(&system_table.boot_services())
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    status
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,3 +56,15 @@ pub fn booted_image_file(boot_services: &BootServices) -> Result<RegularFile> {
 | 
			
		|||
        .into_regular_file()
 | 
			
		||||
        .ok_or(Status::INVALID_PARAMETER)?)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Return the command line of the currently executing image.
 | 
			
		||||
pub fn booted_image_cmdline(boot_services: &BootServices) -> Result<Vec<u8>> {
 | 
			
		||||
    let loaded_image =
 | 
			
		||||
        boot_services.open_protocol_exclusive::<LoadedImage>(boot_services.image_handle())?;
 | 
			
		||||
 | 
			
		||||
    Ok(loaded_image
 | 
			
		||||
        // If this fails, we have no load options and we return an empty string.
 | 
			
		||||
        .load_options_as_bytes()
 | 
			
		||||
        .map(|b| b.to_vec())
 | 
			
		||||
        .unwrap_or_else(|| Vec::new()))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue