Adds a new module (dynamic shell command) to ShellPkg that lists
variable policy information for all UEFI variables on the system.
Some other UEFI variable related functionality is also included to
give a greater sense of platform UEFI variable state. This command
is intended to help make variable policies more transparent and
easier to understand and configure on a platform.
Like all dynamic shell commands, a platform only needs to include
`VariablePolicyDynamicCommand.inf` in their flash image to have
the command registered in their UEFI shell.
Include the following lines in platform DSC (in DXE components section):
```
  ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicyDynamicCommand.inf {
    <PcdsFixedAtBuild>
      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
  }
```
Include the following line in platform FDF:
```
INF  ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicyDynamicCommand.inf
```
A standalone UEFI application can also be built that uses the same
underlying functional code as the dynamic shell command.
The path to use in the DSC and FDF for the app:
```
  ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicyApp.inf
```
Cc: Zhichao Gao <zhichao.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
Message-Id: <20231030203112.736-3-mikuback@linux.microsoft.com>
		
	
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Functionality specific for dynamic UEFI shell command support.
 | |
| 
 | |
|   This command can provide detailed UEFI variable policy configuration
 | |
|   information in the UEFI shell.
 | |
| 
 | |
|   Copyright (c) Microsoft Corporation.
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "VariablePolicy.h"
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/HiiLib.h>
 | |
| #include <Library/ShellLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/UefiRuntimeServicesTableLib.h>
 | |
| 
 | |
| #include <Protocol/ShellDynamicCommand.h>
 | |
| 
 | |
| extern EFI_HII_HANDLE  mVarPolicyShellCommandHiiHandle;
 | |
| 
 | |
| /**
 | |
|   This is the shell command handler function pointer callback type.
 | |
| 
 | |
|   This function handles the command when it is invoked in the shell.
 | |
| 
 | |
|   @param[in] This                   The instance of the
 | |
|                                     EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
 | |
|   @param[in] SystemTable            The pointer to the system table.
 | |
|   @param[in] ShellParameters        The parameters associated with the command.
 | |
|   @param[in] Shell                  The instance of the shell protocol used in
 | |
|                                     the context of processing this command.
 | |
| 
 | |
|   @return EFI_SUCCESS               the operation was successful
 | |
|   @return other                     the operation failed.
 | |
| 
 | |
| **/
 | |
| SHELL_STATUS
 | |
| EFIAPI
 | |
| VarPolicyCommandHandler (
 | |
|   IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL  *This,
 | |
|   IN EFI_SYSTEM_TABLE                    *SystemTable,
 | |
|   IN EFI_SHELL_PARAMETERS_PROTOCOL       *ShellParameters,
 | |
|   IN EFI_SHELL_PROTOCOL                  *Shell
 | |
|   )
 | |
| {
 | |
|   gEfiShellParametersProtocol = ShellParameters;
 | |
|   gEfiShellProtocol           = Shell;
 | |
| 
 | |
|   return RunVarPolicy (gImageHandle, SystemTable);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This is the command help handler function pointer callback type.  This
 | |
|   function is responsible for displaying help information for the associated
 | |
|   command.
 | |
| 
 | |
|   @param[in] This                   The instance of the
 | |
|                                     EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
 | |
|   @param[in] Language               The pointer to the language string to use.
 | |
| 
 | |
|   @return string                    Pool allocated help string, must be freed
 | |
|                                     by caller.
 | |
| 
 | |
| **/
 | |
| STATIC
 | |
| CHAR16 *
 | |
| EFIAPI
 | |
| VarPolicyCommandGetHelp (
 | |
|   IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL  *This,
 | |
|   IN CONST CHAR8                         *Language
 | |
|   )
 | |
| {
 | |
|   return HiiGetString (
 | |
|            mVarPolicyShellCommandHiiHandle,
 | |
|            STRING_TOKEN (STR_GET_HELP_VAR_POLICY),
 | |
|            Language
 | |
|            );
 | |
| }
 | |
| 
 | |
| STATIC EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL  mVarPolicyDynamicCommand = {
 | |
|   VAR_POLICY_COMMAND_NAME,
 | |
|   VarPolicyCommandHandler,
 | |
|   VarPolicyCommandGetHelp
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Entry point of the UEFI variable policy dynamic shell command.
 | |
| 
 | |
|   Produce the Dynamic Command Protocol to handle the "varpolicy" command.
 | |
| 
 | |
|   @param[in] ImageHandle        The image handle of the process.
 | |
|   @param[in] SystemTable        The EFI System Table pointer.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The "varpolicy" command executed successfully.
 | |
|   @retval EFI_ABORTED           HII package failed to initialize.
 | |
|   @retval others                Other errors when executing "varpolicy" command.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VariablePolicyDynamicCommandEntryPoint (
 | |
|   IN EFI_HANDLE        ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE  *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   mVarPolicyShellCommandHiiHandle = InitializeHiiPackage (ImageHandle);
 | |
|   if (mVarPolicyShellCommandHiiHandle == NULL) {
 | |
|     return EFI_ABORTED;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->InstallProtocolInterface (
 | |
|                   &ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   EFI_NATIVE_INTERFACE,
 | |
|                   &mVarPolicyDynamicCommand
 | |
|                   );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Unload the dynamic "varpolicy" UEFI Shell command.
 | |
| 
 | |
|   @param[in] ImageHandle        The image handle of the process.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The image is unloaded.
 | |
|   @retval Others                Failed to unload the image.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VariablePolicyDynamicCommandUnload (
 | |
|   IN EFI_HANDLE  ImageHandle
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   Status = gBS->UninstallProtocolInterface (
 | |
|                   ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   &mVarPolicyDynamicCommand
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   HiiRemovePackages (mVarPolicyShellCommandHiiHandle);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |