From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x230.google.com (mail-it0-x230.google.com [IPv6:2607:f8b0:4001:c0b::230]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 6D61A821B9 for ; Tue, 28 Feb 2017 23:32:54 -0800 (PST) Received: by mail-it0-x230.google.com with SMTP id 203so25259310ith.0 for ; Tue, 28 Feb 2017 23:32:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=JXCNz2NYOJ77jNI9CYVQijR656rtOumugPzrVqaf78w=; b=OCDlcb4/jlskKYutwFRyPqV5IHs3NyfbTFkrXqQ57s6RM/fJ8/Bn6k7Cvpd1PShpjA BM83jFDOnobxEtagdz6irw2hefG9ZfxqYHMnKKJ0KRJXPX0Savi3x6iVWlvTyqK+s4ie VUKzipWXj4pMHJAineKXlEee4f9M/5DLufFlo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=JXCNz2NYOJ77jNI9CYVQijR656rtOumugPzrVqaf78w=; b=eQDniZcnbzDKY68sUVRz5HLg7EY5QcGcLrHD0zrzzLqzjwtq0/JkouSvgHgKB8IGAG tEuQnem0PC/J03BwhAv/JizyLH7tFpl9Iji4x2gzOKXZaVi9T4FK4Qwsc7IPt+oROSOI /MDPoPf123c1Y3XqOLoIyXE2b0uV28krRFzLdpuxWrlsKThbjF+NltfTs5EDH646dAb9 jsh2/CVu3SOvmIQQx9ReQ9pDl12ZseKcneNnWQiqM/hlcgBww2J1rfjCcE5hPZy+iZ2h 3rQe4CkeIUYNIkvC4lNvDps/Jhl+D0jgYjhdyiHMtfFqOhI6QI3MM2n+KvK8OG4yV2BF I0GA== X-Gm-Message-State: AMke39lgMCvVELSeq6zb7tYOj5VAVGQabma4RhIGUwJ16BHhPE68p+3GfXfSZSP2YfSLScz8BpWNMxS/IEicw/E3 X-Received: by 10.36.118.68 with SMTP id z65mr2772496itb.59.1488353573519; Tue, 28 Feb 2017 23:32:53 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.10.27 with HTTP; Tue, 28 Feb 2017 23:32:52 -0800 (PST) In-Reply-To: <20170227075002.322540-1-ruiyu.ni@intel.com> References: <20170227075002.322540-1-ruiyu.ni@intel.com> From: Ard Biesheuvel Date: Wed, 1 Mar 2017 07:32:52 +0000 Message-ID: To: Ruiyu Ni , Laszlo Ersek Cc: "edk2-devel@lists.01.org" , Jaben Carsey , Chen A Chen , chen881220 Subject: Re: [PATCH] ShellPkg/bcfg: Add Shell Spec 2.2 modification functionality X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Mar 2017 07:32:54 -0000 Content-Type: text/plain; charset=UTF-8 On 27 February 2017 at 07:50, Ruiyu Ni wrote: > From: chen881220 > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Chen A Chen > Cc: Jaben Carsey This patch has broken the ArmVirtXen.dsc build Processing meta-data . build.py... : error 4000: Instance of library class [UefiBootManagerLib] is not found in [ [ARM] consumed by module [ I take it that it is simply a matter of adding UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf to the broken platforms? > --- > .../UefiShellBcfgCommandLib.c | 352 ++++++++++++++++++++- > .../UefiShellBcfgCommandLib.inf | 3 +- > ShellPkg/ShellPkg.dsc | 8 + > 3 files changed, 360 insertions(+), 3 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c > index 62a52ad..1538bc6 100644 > --- a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c > +++ b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c > @@ -2,7 +2,7 @@ > Main file for BCFG command. > > (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.
> - Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.
> + Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD License > which accompanies this distribution. The full text of the license may be found at > @@ -41,6 +41,7 @@ > #include > #include > #include > +#include > > STATIC CONST CHAR16 mFileName[] = L"ShellCommands"; > STATIC EFI_HANDLE gShellBcfgHiiHandle = NULL; > @@ -59,7 +60,11 @@ typedef enum { > BcfgTypeRm = 4, > BcfgTypeMv = 5, > BcfgTypeOpt = 6, > - BcfgTypeMax = 7 > + BcfgTypeMod = 7, > + BcfgTypeModf = 8, > + BcfgTypeModp = 9, > + BcfgTypeModh = 10, > + BcfgTypeMax = 11 > } BCFG_OPERATION_TYPE; > > typedef struct { > @@ -275,6 +280,247 @@ GetDevicePathForDriverHandle ( > } > > /** > + Functino to get Device Path by a handle. > + > + @param[in] TheHandle Use it to get DevicePath. > + @param[in] Target Boot option target. > + @param[in, out] DevicePath On a sucessful return the device path to the handle. > + > + @retval SHELL_INVALID_PARAMETER The handle was NULL. > + @retval SHELL_NOT_FOUND Not found device path by handle. > + @retval SHELL_SUCCESS Get device path successfully. > +**/ > +SHELL_STATUS > +GetDevicePathByHandle( > + IN EFI_HANDLE TheHandle, > + IN BCFG_OPERATION_TARGET Target, > + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath > + ) > +{ > + EFI_STATUS Status; > + SHELL_STATUS ShellStatus; > + > + UINTN DriverBindingHandleCount; > + UINTN ParentControllerHandleCount; > + UINTN ChildControllerHandleCount; > + > + ShellStatus = SHELL_SUCCESS; > + > + if (TheHandle == NULL) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); > + return SHELL_INVALID_PARAMETER; > + } > + > + Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (TheHandle, &DriverBindingHandleCount, NULL); > + if (EFI_ERROR(Status)) { > + DriverBindingHandleCount = 0; > + } > + > + Status = PARSE_HANDLE_DATABASE_PARENTS (TheHandle, &ParentControllerHandleCount, NULL); > + if (EFI_ERROR (Status)) { > + ParentControllerHandleCount = 0; > + } > + > + Status = ParseHandleDatabaseForChildControllers (TheHandle, &ChildControllerHandleCount, NULL); > + if (EFI_ERROR (Status)) { > + ChildControllerHandleCount = 0; > + } > + > + Status = gBS->HandleProtocol (TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)DevicePath); > + > + if ( DriverBindingHandleCount > 0 || > + ParentControllerHandleCount > 0 || > + ChildControllerHandleCount > 0 || > + !EFI_ERROR(Status) > + ) { > + // > + // The handle points to a real controller which has a device path. > + // > + if (Target == BcfgTargetDriverOrder) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL,STRING_TOKEN (STR_GEN_PARAM_INV), > + gShellBcfgHiiHandle, > + L"bcfg", > + L"Handle should point to driver image." > + ); > + ShellStatus = SHELL_NOT_FOUND; > + } > + } else { > + // > + // The handle points to a driver image. > + // > + if (Target == BcfgTargetBootOrder) { > + ShellPrintHiiEx ( > + -1, > + -1, > + NULL, > + STRING_TOKEN (STR_GEN_PARAM_INV), > + gShellBcfgHiiHandle, > + L"bcfg", > + L"Handle should point to controller." > + ); > + ShellStatus = SHELL_NOT_FOUND; > + } else { > + if (EFI_ERROR (GetDevicePathForDriverHandle (TheHandle, DevicePath))) { > + ShellStatus = SHELL_NOT_FOUND; > + } > + } > + } > + > + return (ShellStatus); > +} > + > +/** > + Function to modify an option. > + > + @param[in] BcfgOperation Pointer to BCFG operation. > + @param[in] OrderCount The number if items in CurrentOrder. > + > + @retval SHELL_SUCCESS The operation was successful. > + @retval SHELL_INVALID_PARAMETER A parameter was invalid. > + @retval SHELL_OUT_OF_RESOUCES A memory allocation failed. > +**/ > +SHELL_STATUS > +BcfgMod ( > + IN CONST BGFG_OPERATION *BcfgOperation, > + IN CONST UINTN OrderCount > + ) > +{ > + EFI_STATUS Status; > + EFI_HANDLE CurHandle; > + SHELL_STATUS ShellStatus; > + CHAR16 OptionStr[40]; > + EFI_SHELL_FILE_INFO *FileList; > + EFI_SHELL_FILE_INFO *Arg; > + EFI_DEVICE_PATH_PROTOCOL *DevicePath; > + EFI_DEVICE_PATH_PROTOCOL *DevicePathBuffer; > + EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker; > + EFI_BOOT_MANAGER_LOAD_OPTION LoadOption; > + > + ShellStatus = SHELL_SUCCESS; > + FileList = NULL; > + DevicePath = NULL; > + > + ZeroMem (&LoadOption, sizeof(EFI_BOOT_MANAGER_LOAD_OPTION)); > + > + if ( (BcfgOperation->Type == BcfgTypeMod && BcfgOperation->Description == NULL) || > + (BcfgOperation->Type == BcfgTypeModf && BcfgOperation->FileName == NULL) || > + (BcfgOperation->Type == BcfgTypeModp && BcfgOperation->FileName == NULL) || > + (BcfgOperation->Type == BcfgTypeModh && BcfgOperation->HandleIndex == 0) || > + (BcfgOperation->Number1 > OrderCount) > + ) { > + return (SHELL_INVALID_PARAMETER); > + } > + > + if (BcfgOperation->Type == BcfgTypeModh) { > + CurHandle = ConvertHandleIndexToHandle (BcfgOperation->HandleIndex); > + ShellStatus = GetDevicePathByHandle (CurHandle, BcfgOperation->Target, &DevicePathBuffer); > + if (ShellStatus == SHELL_SUCCESS) { > + DevicePath = DuplicateDevicePath (DevicePathBuffer); > + } > + } else if (BcfgOperation->Type == BcfgTypeModf || BcfgOperation->Type == BcfgTypeModp) { > + // > + // Get Device Path by FileName. > + // > + ShellOpenFileMetaArg ((CHAR16 *)BcfgOperation->FileName, EFI_FILE_MODE_READ, &FileList); > + if (FileList == NULL) { > + // > + // The name of file matched nothing. > + // > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } > + else if (FileList->Link.ForwardLink != FileList->Link.BackLink) { > + // > + // If the name of file expanded to multiple names, it's fail. > + // > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + Arg = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link); > + if (EFI_ERROR (Arg->Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + DevicePathBuffer = gEfiShellProtocol->GetDevicePathFromFilePath (Arg->FullName); > + if (DevicePathBuffer == NULL) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellBcfgHiiHandle, L"bcfg", Arg->FullName); > + ShellStatus = SHELL_UNSUPPORTED; > + } > + } > + } > + > + if (ShellStatus == SHELL_SUCCESS) { > + if (BcfgOperation->Type == BcfgTypeModp) { > + ShellStatus = SHELL_INVALID_PARAMETER; > + DevicePathWalker = DevicePathBuffer; > + while (!IsDevicePathEnd (DevicePathWalker)) { > + if ( DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH && > + DevicePathSubType (DevicePathWalker) == MEDIA_HARDDRIVE_DP > + ) { > + // > + // We found the portion of device path starting with the hard driver partition. > + // > + ShellStatus = SHELL_SUCCESS; > + DevicePath = DuplicateDevicePath (DevicePathWalker); > + break; > + } else { > + DevicePathWalker = NextDevicePathNode (DevicePathWalker); > + } > + } > + } else { > + DevicePath = DuplicateDevicePath (DevicePathBuffer); > + } > + > + FreePool (DevicePathBuffer); > + } > + } > + > + if (ShellStatus == SHELL_SUCCESS) { > + if (BcfgOperation->Target == BcfgTargetBootOrder) { > + UnicodeSPrint (OptionStr, sizeof (OptionStr), L"Boot%04x", BcfgOperation->Order[BcfgOperation->Number1]); > + } else { > + UnicodeSPrint (OptionStr, sizeof (OptionStr), L"Driver%04x", BcfgOperation->Order[BcfgOperation->Number1]); > + } > + Status = EfiBootManagerVariableToLoadOption (OptionStr, &LoadOption); > + if (EFI_ERROR(Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NONE), gShellBcfgHiiHandle); > + ShellStatus = SHELL_NOT_FOUND; > + } > + } > + > + if (ShellStatus == SHELL_SUCCESS) { > + if (BcfgOperation->Type == BcfgTypeMod) { > + SHELL_FREE_NON_NULL (LoadOption.Description); > + LoadOption.Description = AllocateCopyPool (StrSize (BcfgOperation->Description), BcfgOperation->Description); > + } else { > + SHELL_FREE_NON_NULL (LoadOption.FilePath); > + LoadOption.FilePath = DuplicateDevicePath (DevicePath); > + } > + > + Status = EfiBootManagerLoadOptionToVariable (&LoadOption); > + if (EFI_ERROR(Status)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", OptionStr); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } > + } > + > + EfiBootManagerFreeLoadOption (&LoadOption); > + > + if (DevicePath != NULL) { > + FreePool (DevicePath); > + } > + > + if (FileList != NULL) { > + ShellCloseFileMetaArg (&FileList); > + } > + > + return (ShellStatus); > +} > + > +/** > Function to add a option. > > @param[in] Position The position to add Target at. > @@ -1404,6 +1650,102 @@ ShellCommandRunBcfg ( > } > } > } > + } > + else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)CurrentParam, L"mod") == 0) { > + if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + CurrentOperation.Type = BcfgTypeMod; > + CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); > + if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); > + CurrentOperation.Number1 = (UINT16)Intermediate; > + if (CurrentOperation.Number1 >= Count) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + ASSERT (CurrentOperation.Description == NULL); > + CurrentOperation.Description = StrnCatGrow (&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue (Package, ++ParamNumber), 0); > + } > + } > + } > + } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)CurrentParam, L"modf") == 0) { > + if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + CurrentOperation.Type = BcfgTypeModf; > + CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); > + if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); > + CurrentOperation.Number1 = (UINT16)Intermediate; > + if (CurrentOperation.Number1 >= Count) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + ASSERT (CurrentOperation.FileName == NULL); > + CurrentOperation.FileName = StrnCatGrow (&CurrentOperation.FileName, NULL, ShellCommandLineGetRawValue (Package, ++ParamNumber), 0); > + } > + } > + } > + } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)CurrentParam, L"modp") == 0) { > + if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + CurrentOperation.Type = BcfgTypeModp; > + CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); > + if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); > + CurrentOperation.Number1 = (UINT16)Intermediate; > + if (CurrentOperation.Number1 >= Count) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + ASSERT (CurrentOperation.FileName == NULL); > + CurrentOperation.FileName = StrnCatGrow (&CurrentOperation.FileName, NULL, ShellCommandLineGetRawValue (Package, ++ParamNumber), 0); > + } > + } > + } > + } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)CurrentParam, L"modh") == 0) { > + if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + CurrentOperation.Type = BcfgTypeModh; > + CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); > + if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } > + else { > + Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); > + CurrentOperation.Number1 = (UINT16)Intermediate; > + if (CurrentOperation.Number1 >= Count) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); > + if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > + ShellStatus = SHELL_INVALID_PARAMETER; > + } else { > + Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); > + CurrentOperation.HandleIndex = (UINT16)Intermediate; > + } > + } > + } > + } > } else { > ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); > ShellStatus = SHELL_INVALID_PARAMETER; > @@ -1451,6 +1793,12 @@ ShellCommandRunBcfg ( > (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp), > CurrentOperation.HandleIndex); > break; > + case BcfgTypeMod: > + case BcfgTypeModf: > + case BcfgTypeModp: > + case BcfgTypeModh: > + ShellStatus = BcfgMod (&CurrentOperation, Count); > + break; > case BcfgTypeOpt: > ShellStatus = BcfgAddOpt( > CurrentOperation.OptData, > diff --git a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf > index 44c8b7e..88b96ea 100644 > --- a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf > +++ b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf > @@ -1,7 +1,7 @@ > ## @file > # Provides shell install1 functions > # > -# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
> +# Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
> # > # This program and the accompanying materials > # are licensed and made available under the terms and conditions of the BSD License > @@ -41,6 +41,7 @@ [LibraryClasses] > UefiBootServicesTableLib > SortLib > PrintLib > + UefiBootManagerLib > > [Guids] > gShellBcfgHiiGuid ## SOMETIMES_CONSUMES ## HII > diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc > index 5c01933..a87428a 100644 > --- a/ShellPkg/ShellPkg.dsc > +++ b/ShellPkg/ShellPkg.dsc > @@ -55,6 +55,14 @@ [LibraryClasses.common] > BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf > IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > > + UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf > + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > + TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf > + PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf > + DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf > + DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > + ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf > + > [LibraryClasses.ARM] > # > # It is not possible to prevent the ARM compiler for generic intrinsic functions. > -- > 2.9.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel