mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-28 00:04:17 +00:00 
			
		
		
		
	 ff5a4bcff3
			
		
	
	
		ff5a4bcff3
		
	
	
	
	
		
			
			When dynamic command drivers are built into FV and start during boot, they fails. Because Shell protocol doesn't exist during boot. The patch sets Shell protocol and also set PcdShellLibAutoInitialize to FALSE to ensure that 1. Shell protocol check doesn't happen in driver's entry point. 2. Driver can get the Shell protocol in DynamicCommand.Handler(). Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Produce "tftp" shell dynamic command.
 | |
| 
 | |
|   Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved. <BR>
 | |
|   Copyright (c) 2015, ARM Ltd. All rights reserved.<BR>
 | |
| 
 | |
|   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
 | |
|   http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| #include "Tftp.h"
 | |
| #include <Protocol/ShellDynamicCommand.h>
 | |
| 
 | |
| /**
 | |
|   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 sucessful
 | |
|   @return other                     the operation failed.
 | |
| **/
 | |
| SHELL_STATUS
 | |
| EFIAPI
 | |
| TftpCommandHandler (
 | |
|   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 RunTftp (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
 | |
| **/
 | |
| CHAR16 *
 | |
| EFIAPI
 | |
| TftpCommandGetHelp (
 | |
|   IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL    *This,
 | |
|   IN CONST CHAR8                           *Language
 | |
|   )
 | |
| {
 | |
|   return HiiGetString (mTftpHiiHandle, STRING_TOKEN (STR_GET_HELP_TFTP), Language);
 | |
| }
 | |
| 
 | |
| EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL mTftpDynamicCommand = {
 | |
|   L"tftp",
 | |
|   TftpCommandHandler,
 | |
|   TftpCommandGetHelp
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Entry point of Tftp Dynamic Command.
 | |
| 
 | |
|   Produce the DynamicCommand protocol to handle "tftp" command.
 | |
| 
 | |
|   @param ImageHandle            The image handle of the process.
 | |
|   @param SystemTable            The EFI System Table pointer.
 | |
| 
 | |
|   @retval EFI_SUCCESS           Tftp command is executed sucessfully.
 | |
|   @retval EFI_ABORTED           HII package was failed to initialize.
 | |
|   @retval others                Other errors when executing tftp command.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TftpCommandInitialize (
 | |
|   IN EFI_HANDLE               ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE         *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   mTftpHiiHandle = InitializeHiiPackage (ImageHandle);
 | |
|   if (mTftpHiiHandle == NULL) {
 | |
|     return EFI_ABORTED;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->InstallProtocolInterface (
 | |
|                   &ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   EFI_NATIVE_INTERFACE,
 | |
|                   &mTftpDynamicCommand
 | |
|                   );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Tftp driver unload handler.
 | |
| 
 | |
|   @param ImageHandle            The image handle of the process.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The image is unloaded.
 | |
|   @retval Others                Failed to unload the image.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TftpUnload (
 | |
|   IN EFI_HANDLE               ImageHandle
 | |
| )
 | |
| {
 | |
|   EFI_STATUS                  Status;
 | |
|   Status = gBS->UninstallProtocolInterface (
 | |
|                   ImageHandle,
 | |
|                   &gEfiShellDynamicCommandProtocolGuid,
 | |
|                   &mTftpDynamicCommand
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   HiiRemovePackages (mTftpHiiHandle);
 | |
|   return EFI_SUCCESS;
 | |
| }
 |