+ Jaben, Ruiyu and edk2 list
Hi Ard,
Internal Shell header ("../../../ShellPkg/Application/Shell/Shell.h") was added ONLY for being able to execute shell commands (tftp and our custom SPI flash control) from within a new command. This is now done with: RunShellCommand (TftpCmd, &Status); And it works fine.
Replacing above with: ShellExecute (&ImageHandle, TftpCmd, FALSE, NULL, &Status); allow to get rid of relative include and seems more appropriate, but there is completely no effect of calling it.
I checked in edk2 sources and see no relation between above problem and registering our command with help of ShellDynamicCommand protocol. Unless I don't know something. Anyway, I'll apreciate any hint, how to solve the issue in a nice way.
Best regards, Marcin
2016-11-15 17:09 GMT+01:00 Ard Biesheuvel ard.biesheuvel@linaro.org:
On 10 July 2016 at 00:21, Marcin Wojtas mw@semihalf.com wrote:
From: Jan Dąbroś jsd@semihalf.com
'fupdate' command performs updating firmware from file placed on local filesystem or on TFTP server. It uses tftp and sf commands.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jan Dabros jsd@semihalf.com Signed-off-by: Marcin Wojtas mw@semihalf.com
Please use the Shell dynamic command protocol to add commands to the shell. This will remove the need for including internal Shell headers, and even allow your commands to work with prebuilt Shell binaries.
MdePkg/Include/Protocol/ShellDynamicCommand.h
Thanks, Ard.
Applications/FirmwareUpdate/FUpdate.c | 448 ++++++++++++++++++++++++++++++++ Applications/FirmwareUpdate/FUpdate.inf | 68 +++++ Applications/FirmwareUpdate/FUpdate.uni | Bin 0 -> 5838 bytes Platforms/Marvell/Marvell.dec | 1 + 4 files changed, 517 insertions(+) create mode 100644 Applications/FirmwareUpdate/FUpdate.c create mode 100644 Applications/FirmwareUpdate/FUpdate.inf create mode 100644 Applications/FirmwareUpdate/FUpdate.uni
diff --git a/Applications/FirmwareUpdate/FUpdate.c b/Applications/FirmwareUpdate/FUpdate.c new file mode 100644 index 0000000..359a4ac --- /dev/null +++ b/Applications/FirmwareUpdate/FUpdate.c @@ -0,0 +1,448 @@ +/******************************************************************************* +Copyright (C) 2016 Marvell International Ltd.
+Marvell BSD License Option
+If you received this File from Marvell, you may opt to use, redistribute and/or +modify this File under the following licensing terms. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met:
+* Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
+* Neither the name of Marvell nor the names of its contributors may be
- used to endorse or promote products derived from this software without
- specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************/ +#include <Uefi.h> +#include <ShellBase.h>
+#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/ShellCommandLib.h> +#include <Library/ShellLib.h> +#include <Library/UefiLib.h> +#include <Library/PrintLib.h> +#include <Library/UefiLib.h> +#include <Library/ShellCEntryLib.h> +#include <Library/HiiLib.h> +#include <Guid/ShellLibHiiGuid.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/FileHandleLib.h> +// FIXME: Remove including relative path +#include "../../../ShellPkg/Application/Shell/Shell.h"
+#define CMD_NAME_STRING L"fupdate"
+#define TFTP_CMD_STRING L"tftp " +#define SPACE_STRING L" " +#define SF_PROBE_CMD_STRING L"sf probe" +#define SF_WRITE_CMD_STRING L"sf updatefile " +#define SF_LOAD_ADDR_STRING L"0x0"
+#define MAIN_HDR_MAGIC 0xB105B002
+typedef struct {
- UINT32 Magic; // 0-3
- UINT32 PrologSize; // 4-7
- UINT32 PrologChecksum; // 8-11
- UINT32 BootImageSize; // 12-15
- UINT32 BootImageChecksum; // 16-19
- UINT32 Reserved0; // 20-23
- UINT32 LoadAddr; // 24-27
- UINT32 ExecAddr; // 28-31
- UINT8 UartConfig; // 32
- UINT8 Baudrate; // 33
- UINT8 ExtCount; // 34
- UINT8 AuxFlags; // 35
- UINT32 IoArg0; // 36-39
- UINT32 IoArg1; // 40-43
- UINT32 IoArg2; // 43-47
- UINT32 IoArg3; // 48-51
- UINT32 Reserved1; // 52-55
- UINT32 Reserved2; // 56-59
- UINT32 Reserved3; // 60-63
+} MV_IMAGE_HEADER;
+STATIC +UINT32 +CountChecksum (
- UINT32 *Start,
- UINT32 Length
- )
+{
- UINT32 Sum = 0;
- UINT32 *Startp = Start;
- do {
- Sum += *Startp;
- Startp++;
- Length -= 4;
- } while (Length > 0);
- return Sum;
+}
+STATIC +EFI_STATUS +CheckImageHeader (
- IN VOID *ImageHeader
- )
+{
- MV_IMAGE_HEADER *Header;
- UINT32 HeaderLength, Checksum, ChecksumBackup;
- Header = (MV_IMAGE_HEADER *) ImageHeader;
- HeaderLength = Header->PrologSize;
- ChecksumBackup = Header->PrologChecksum;
- // Compare magic number
- if (Header->Magic != MAIN_HDR_MAGIC) {
- Print (L"%s: Bad Image magic 0x%08x != 0x%08x\n", CMD_NAME_STRING,
Header->Magic, MAIN_HDR_MAGIC);
- return EFI_DEVICE_ERROR;
- }
- // The checksum field is discarded from calculation
- Header->PrologChecksum = 0;
- Checksum = CountChecksum((UINT32 *)Header, HeaderLength);
- if (Checksum != ChecksumBackup) {
- Print (L"%s: Bad Image checksum. 0x%x != 0x%x\n", CMD_NAME_STRING, Checksum,
ChecksumBackup);
- return EFI_DEVICE_ERROR;
- }
- // Restore checksum backup
- Header->PrologChecksum = ChecksumBackup;
- return 0;
+}
+STATIC +EFI_STATUS +CheckFirmwareImage (
- CONST CHAR16* FirmwareImage
- )
+{
- EFI_STATUS Status;
- VOID *FileBuffer;
- UINT64 OpenMode;
- UINTN FileSize;
- SHELL_FILE_HANDLE FileHandle = NULL;
- OpenMode = EFI_FILE_MODE_READ;
- Status = ShellOpenFileByName (FirmwareImage, &FileHandle, OpenMode, 0);
- if (EFI_ERROR (Status)) {
Print (L"%s: Cannot open Image file\n", CMD_NAME_STRING);
return EFI_DEVICE_ERROR;
- }
- Status = FileHandleGetSize (FileHandle, &FileSize);
- if (EFI_ERROR (Status)) {
Print (L"%s: Cannot get Image file size\n", CMD_NAME_STRING);
- }
- FileBuffer = AllocateZeroPool (FileSize);
- // Read Image header into buffer
- Status = FileHandleRead (FileHandle, &FileSize, FileBuffer);
- if (EFI_ERROR (Status)) {
Print (L"%s: Cannot read Image file header\n", CMD_NAME_STRING);
ShellCloseFile (&FileHandle);
FreePool (FileBuffer);
return EFI_DEVICE_ERROR;
- }
- Status = CheckImageHeader (FileBuffer);
- if (EFI_ERROR(Status)) {
- return EFI_DEVICE_ERROR;
- }
- FreePool (FileBuffer);
- return EFI_SUCCESS;
+}
+STATIC +CONST CHAR16 * +FileNameFromFilePath (
- CONST CHAR16 *RemoteFilePath
- )
+{
- CONST CHAR16 *Walker;
- // Gather FileName from FilePath
- Walker = RemoteFilePath + StrLen (RemoteFilePath);
- while ((--Walker) >= RemoteFilePath) {
- if ((*Walker == L'\') || (*Walker == L'/')) {
break;
- }
- }
- return (Walker + 1);
+}
+STATIC +CONST CHAR16* +PrepareFile (
- LIST_ENTRY *CheckPackage
- )
+{
- EFI_STATUS Status;
- CONST CHAR16 *ValueStr;
- ValueStr = ShellCommandLineGetValue (CheckPackage, L"-f");
- if (ValueStr == NULL) {
- Print (L"%s: No LocalFilePath parameter!\n", CMD_NAME_STRING);
- return NULL;
- } else {
- Status = ShellIsFile (ValueStr);
- if (EFI_ERROR(Status)) {
Print (L"%s: Wrong LocalFilePath parameter!\n", CMD_NAME_STRING);
return NULL;
- }
- }
- return ValueStr;
+}
+CONST CHAR16 gShellFUpdateFileName[] = L"ShellCommand"; +EFI_HANDLE gShellFUpdateHiiHandle = NULL; +EFI_HANDLE gShellFUpdateHiiHandle;
+STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
- {L"help", TypeFlag},
- {L"-t", TypeFlag},
- {L"-f", TypeValue},
- {NULL , TypeMax}
- };
+/**
- Return the file name of the help text file if not using HII.
- @return The string pointer to the file name.
+**/ +CONST CHAR16* +EFIAPI +ShellCommandGetManFileNameFUpdate (
- VOID
- )
+{
- return gShellFUpdateFileName;
+}
+VOID +FUpdateUsage (
- VOID
- )
+{
- Print (L"\nFirmware update command\n"
"fupdate [-f <LocalFilePath>] [-t <Host> <RemoteFilePath>]\n\n"
"LocalFilePath - path to local firmware image file\n"
"Host - IP number of TFTP server\n"
"RemoteFilePath - path to firmware image file on TFTP server\n"
"Examples:\n"
"Update firmware from file fs2:Uefi.img\n"
" fupdate -f fs2:Uefi.img\n"
"Update firmware from file path/Uefi.img TFTP server with IP "
"address 10.0.0.200\n"
" fupdate -t 10.0.0.200 path/Uefi.img\n"
- );
+}
+SHELL_STATUS +EFIAPI +ShellCommandRunFUpdate (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
+{
- EFI_STATUS Status;
- LIST_ENTRY *CheckPackage;
- CHAR16 *ProblemParam, *TftpCmd = NULL, *SfCmd = NULL;
- CONST CHAR16 *RemoteFilePath, *Host, *FileToWrite;
- UINT8 CmdLen;
- BOOLEAN FileFlag, TftpFlag;
- Status = ShellInitialize ();
- if (EFI_ERROR (Status)) {
- Print (L"%s: Error while initializinf Shell\n", CMD_NAME_STRING);
- ASSERT_EFI_ERROR (Status);
- return SHELL_ABORTED;
- }
- Status = ShellCommandLineParse (ParamList, &CheckPackage, &ProblemParam,
- TRUE);
- if (EFI_ERROR (Status)) {
- Print (L"Parse error!\n");
- }
- if (ShellCommandLineGetFlag (CheckPackage, L"help")) {
- FUpdateUsage();
- return EFI_SUCCESS;
- }
- FileFlag = ShellCommandLineGetFlag (CheckPackage, L"-f");
- TftpFlag = ShellCommandLineGetFlag (CheckPackage, L"-t");
- if (!FileFlag && !TftpFlag) {
- Print (L"%s: Please specify -f or -t flag\n", CMD_NAME_STRING);
- return SHELL_ABORTED;
- } else if (FileFlag && !TftpFlag) {
- // Prepare local file to be burned into flash
- FileToWrite = PrepareFile (CheckPackage);
- if (FileToWrite == NULL) {
Print (L"%s: Error while preparing file for burn\n", CMD_NAME_STRING);
return SHELL_ABORTED;
- }
- } else if (TftpFlag && !FileFlag) {
- Host = ShellCommandLineGetRawValue (CheckPackage, 1);
- if (Host == NULL) {
Print (L"%s: No Host parameter!\n", CMD_NAME_STRING);
return SHELL_ABORTED;
- }
- RemoteFilePath = ShellCommandLineGetRawValue (CheckPackage, 2);
- if (RemoteFilePath == NULL) {
Print (L"%s: No remote_file_path parameter!\n", CMD_NAME_STRING);
return SHELL_ABORTED;
- }
- // Gather firmware image name from remote filepath
- FileToWrite = FileNameFromFilePath (RemoteFilePath);
- // Allocate buffer for tftp command string
- CmdLen = StrSize (TFTP_CMD_STRING) + StrSize (SPACE_STRING) +
StrSize (Host) + StrSize (RemoteFilePath);
- TftpCmd = (CHAR16 *) AllocateZeroPool (CmdLen + sizeof(CHAR16));
- if (TftpCmd == NULL) {
Print (L"%s: Cannot allocate memory\n", CMD_NAME_STRING);
return SHELL_ABORTED;
- }
- // Concatenate parameters and form tftp command string
- StrCatS (TftpCmd, CmdLen / sizeof(CHAR16), TFTP_CMD_STRING);
- StrCatS (TftpCmd, CmdLen / sizeof(CHAR16), (CHAR16 *)Host);
- // Insert space
- StrCatS (TftpCmd, CmdLen / sizeof(CHAR16), SPACE_STRING);
- StrCatS (TftpCmd, CmdLen / sizeof(CHAR16), (CHAR16 *)RemoteFilePath);
- RunShellCommand (TftpCmd, &Status);
- FreePool (TftpCmd);
- if (EFI_ERROR(Status)) {
Print (L"%s: Error while performing tftp command\n", CMD_NAME_STRING);
return SHELL_ABORTED;
- }
- } else {
- Print (L"%s: Both -f and -t flag specified, please choose one\n",
CMD_NAME_STRING);
- return SHELL_ABORTED;
- }
- // Check image checksum and magic
- Status = CheckFirmwareImage (FileToWrite);
- if (EFI_ERROR(Status)) {
- Print (L"%s: Wrong firmware Image\n", CMD_NAME_STRING);
- return SHELL_ABORTED;
- }
- // Probe spi bus
- RunShellCommand (SF_PROBE_CMD_STRING, &Status);
- if (EFI_ERROR(Status)) {
- Print (L"%s: Error while performing sf probe\n", CMD_NAME_STRING);
- return SHELL_ABORTED;
- }
- // Allocate buffer for sf command string
- CmdLen = StrSize (SF_WRITE_CMD_STRING) + StrSize (FileToWrite) +
- StrSize (SPACE_STRING) + StrSize (SF_LOAD_ADDR_STRING);
- SfCmd = (CHAR16 *) AllocateZeroPool (CmdLen + sizeof(CHAR16));
- if (SfCmd == NULL) {
- Print (L"%s: Cannot allocate memory\n");
- return SHELL_ABORTED;
- }
- // Concatenate parameters and form command string
- StrCatS (SfCmd, CmdLen / sizeof(CHAR16), SF_WRITE_CMD_STRING);
- StrCatS (SfCmd, CmdLen / sizeof(CHAR16), (CHAR16 *)FileToWrite);
- StrCatS (SfCmd, CmdLen / sizeof(CHAR16), SPACE_STRING);
- StrCatS (SfCmd, CmdLen / sizeof(CHAR16), SF_LOAD_ADDR_STRING);
- // Update firmware image in flash
- RunShellCommand (SfCmd, &Status);
- FreePool (SfCmd);
- if (EFI_ERROR(Status)) {
- Print (L"%s: Error while performing sf update\n", CMD_NAME_STRING);
- return SHELL_ABORTED;
- }
- return EFI_SUCCESS;
+}
+EFI_STATUS +EFIAPI +ShellFUpdateCommandConstructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
+{
- EFI_STATUS Status;
- gShellFUpdateHiiHandle = NULL;
- gShellFUpdateHiiHandle = HiiAddPackages (
&gShellFUpdateHiiGuid, gImageHandle,
UefiShellFUpdateCommandLibStrings, NULL
);
- if (gShellFUpdateHiiHandle == NULL) {
- Print (L"%s: Cannot add Hii package\n", CMD_NAME_STRING);
- return EFI_DEVICE_ERROR;
- }
- Status = ShellCommandRegisterCommandName (
CMD_NAME_STRING, ShellCommandRunFUpdate, ShellCommandGetManFileNameFUpdate,
0, CMD_NAME_STRING, TRUE , gShellFUpdateHiiHandle,
STRING_TOKEN (STR_GET_HELP_FUPDATE)
);
- if (EFI_ERROR(Status)) {
- Print (L"%s: Error while registering command\n", CMD_NAME_STRING);
- return SHELL_ABORTED;
- }
- return EFI_SUCCESS;
+}
+EFI_STATUS +EFIAPI +ShellFUpdateCommandDestructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
+{
- if (gShellFUpdateHiiHandle != NULL) {
- HiiRemovePackages (gShellFUpdateHiiHandle);
- }
- return EFI_SUCCESS;
+} diff --git a/Applications/FirmwareUpdate/FUpdate.inf b/Applications/FirmwareUpdate/FUpdate.inf new file mode 100644 index 0000000..53b5305 --- /dev/null +++ b/Applications/FirmwareUpdate/FUpdate.inf @@ -0,0 +1,68 @@ +# +# Marvell BSD License Option +# +# If you received this File from Marvell, you may opt to use, redistribute +# and/or modify this File under the following licensing terms. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of Marvell nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#
+[Defines]
- INF_VERSION = 0x00010006
- BASE_NAME = UefiShellFUpdateCommandLib
- FILE_GUID = 470292b2-926b-4ed8-8080-be7a260db627
- MODULE_TYPE = UEFI_APPLICATION
- VERSION_STRING = 0.1
- LIBRARY_CLASS = NULL|UEFI_APPLICATION UEFI_DRIVER
- CONSTRUCTOR = ShellFUpdateCommandConstructor
- DESTRUCTOR = ShellFUpdateCommandDestructor
+[Sources]
- FUpdate.c
- FUpdate.uni
+[Packages]
- MdePkg/MdePkg.dec
- ShellPkg/ShellPkg.dec
- MdeModulePkg/MdeModulePkg.dec
- OpenPlatformPkg/Platforms/Marvell/Marvell.dec
+[LibraryClasses]
- UefiLib
- UefiBootServicesTableLib
- MemoryAllocationLib
- BaseLib
- BaseMemoryLib
- DebugLib
- ShellCommandLib
- ShellLib
- UefiLib
- UefiRuntimeServicesTableLib
- PcdLib
- HiiLib
- FileHandleLib
+[Guids]
- gShellFUpdateHiiGuid
diff --git a/Applications/FirmwareUpdate/FUpdate.uni b/Applications/FirmwareUpdate/FUpdate.uni new file mode 100644 index 0000000000000000000000000000000000000000..6143c0580f1d1ef8ce4fe619a1df1ce380adf2c0 GIT binary patch literal 5838 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 QHyJ;b`f6NX>FQbZ9}*T`00000
literal 0 HcmV?d00001
diff --git a/Platforms/Marvell/Marvell.dec b/Platforms/Marvell/Marvell.dec index e63add4..f9d2660 100644 --- a/Platforms/Marvell/Marvell.dec +++ b/Platforms/Marvell/Marvell.dec @@ -54,6 +54,7 @@
gShellEepromHiiGuid = { 0xb2f4c714, 0x147f, 0x4ff7, { 0x82, 0x1b, 0xce, 0x7b, 0x91, 0x7f, 0x5f, 0x2f } } gShellSfHiiGuid = { 0x03a67756, 0x8cde, 0x4638, { 0x82, 0x34, 0x4a, 0x0f, 0x6d, 0x58, 0x81, 0x39 } }
- gShellFUpdateHiiGuid = { 0x9b5d2176, 0x590a, 0x49db, { 0x89, 0x5d, 0x4a, 0x70, 0xfe, 0xad, 0xbe, 0x24 } }
[PcdsFixedAtBuild.common]
#MPP
1.8.3.1