diff options
Diffstat (limited to 'src/interface/efi/efi_shim.c')
-rw-r--r-- | src/interface/efi/efi_shim.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/src/interface/efi/efi_shim.c b/src/interface/efi/efi_shim.c index 673b2d8..42faaa6 100644 --- a/src/interface/efi/efi_shim.c +++ b/src/interface/efi/efi_shim.c @@ -24,9 +24,11 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <string.h> +#include <stdlib.h> #include <errno.h> #include <ipxe/image.h> #include <ipxe/efi/efi.h> +#include <ipxe/efi/efi_strings.h> #include <ipxe/efi/efi_shim.h> #include <ipxe/efi/Protocol/PxeBaseCode.h> #include <ipxe/efi/Protocol/ShimLock.h> @@ -175,12 +177,47 @@ static int efi_shim_inhibit_pxe ( EFI_HANDLE handle ) { } /** + * Update command line + * + * @v shim Shim image + * @v cmdline Command line to update + * @ret rc Return status code + */ +static int efi_shim_cmdline ( struct image *shim, wchar_t **cmdline ) { + wchar_t *shimcmdline; + int len; + int rc; + + /* Construct new command line */ + len = ( shim->cmdline ? + efi_asprintf ( &shimcmdline, "%s %s", shim->name, + shim->cmdline ) : + efi_asprintf ( &shimcmdline, "%s %ls", shim->name, + *cmdline ) ); + if ( len < 0 ) { + rc = len; + DBGC ( &efi_shim, "SHIM could not construct command line: " + "%s\n", strerror ( rc ) ); + return rc; + } + + /* Replace command line */ + free ( *cmdline ); + *cmdline = shimcmdline; + + return 0; +} + +/** * Install UEFI shim special handling * - * @v handle EFI handle + * @v shim Shim image + * @v handle EFI device handle + * @v cmdline Command line to update * @ret rc Return status code */ -int efi_shim_install ( EFI_HANDLE handle ) { +int efi_shim_install ( struct image *shim, EFI_HANDLE handle, + wchar_t **cmdline ) { EFI_BOOT_SERVICES *bs = efi_systab->BootServices; int rc; @@ -195,8 +232,13 @@ int efi_shim_install ( EFI_HANDLE handle ) { goto err_inhibit_pxe; } + /* Update command line */ + if ( ( rc = efi_shim_cmdline ( shim, cmdline ) ) != 0 ) + goto err_cmdline; + return 0; + err_cmdline: err_inhibit_pxe: bs->GetMemoryMap = efi_shim_orig_map; return rc; |