On Mon, Apr 18, 2016 at 01:35:07AM +0200, Marcin Wojtas 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
Applications/FirmwareUpdate/FUpdate.c | 438 ++++++++++++++++++++++++++++++++ Applications/FirmwareUpdate/FUpdate.inf | 69 +++++ Applications/FirmwareUpdate/FUpdate.uni | Bin 0 -> 5838 bytes Platforms/Marvell/Marvell.dec | 1 + 4 files changed, 508 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..40a1994 --- /dev/null +++ b/Applications/FirmwareUpdate/FUpdate.c @@ -0,0 +1,438 @@ +/******************************************************************************* +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> +#include "../../../ShellPkg/Application/Shell/Shell.h"
This relative search path should not be needed. Does #include <Protocol/EfiShell.h> not do what you need?
+#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 HEADER_SIZE 49152 +#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"fupdate: Bad Image magic 0x%08x != 0x%08x", 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"fupdate: Bad Image checksum. 0x%x != 0x%x", 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 HeaderSize;
- SHELL_FILE_HANDLE FileHandle = NULL;
- OpenMode = EFI_FILE_MODE_READ;
- HeaderSize = HEADER_SIZE;
- FileBuffer = AllocateZeroPool (HEADER_SIZE);
- Status = ShellOpenFileByName (FirmwareImage, &FileHandle, OpenMode, 0);
- if (EFI_ERROR (Status)) {
Print (L"fupdate: Cannot open Image file\n");
return EFI_DEVICE_ERROR;
- }
- // Read Image header into buffer
- Status = FileHandleRead (FileHandle, &HeaderSize, FileBuffer);
- if (EFI_ERROR (Status)) {
Print (L"fupdate: Cannot read Image file header\n");
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"fupdate: No LocalFilePath parameter!\n");
- return NULL;
- } else {
- Status = ShellIsFile (ValueStr);
- if (EFI_ERROR(Status)) {
Print (L"fupdate: Wrong LocalFilePath parameter!\n");
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"fupdate: Error while initializinf Shell\n");
- 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"fupdate: Please specify -f or -t flag\n");
- return SHELL_ABORTED;
- } else if (FileFlag && !TftpFlag) {
- // Prepare local file to be burned into flash
- FileToWrite = PrepareFile (CheckPackage);
- if (FileToWrite == NULL) {
Print (L"fupdate: Error while preparing file for burn\n");
return SHELL_ABORTED;
- }
- } else if (TftpFlag && !FileFlag) {
- Host = ShellCommandLineGetRawValue (CheckPackage, 1);
- if (Host == NULL) {
Print (L"fupdate: No Host parameter!\n");
return SHELL_ABORTED;
- }
- RemoteFilePath = ShellCommandLineGetRawValue (CheckPackage, 2);
- if (RemoteFilePath == NULL) {
Print (L"fupdate: No remote_file_path parameter!\n");
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"fupdate: Cannot allocate memory\n");
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"fupdate: Error while performing tftp command\n");
So ... these are an awful lot of "fupdate" misspellings waiting to happen :)
Could you change this to a static string used throughout the file and L"%s: ..."?
return SHELL_ABORTED;
- }
- } else {
- Print (L"fupdate: Both -f and -t flag specified, please choose one\n");
- return SHELL_ABORTED;
- }
- // Check image checksum and magic
- Status = CheckFirmwareImage (FileToWrite);
- if (EFI_ERROR(Status)) {
- Print (L"fupdate: Wrong firmware Image\n");
- return SHELL_ABORTED;
- }
- // Probe spi bus
- RunShellCommand (SF_PROBE_CMD_STRING, &Status);
- if (EFI_ERROR(Status)) {
- Print (L"fupdate: Error while performing sf probe\n");
- 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"fupdate: 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"fupdate: Error while performing sf update\n");
- return SHELL_ABORTED;
- }
- return EFI_SUCCESS;
+}
+EFI_STATUS +EFIAPI +FUpdateConstructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
+{
- EFI_STATUS Status;
- gShellFUpdateHiiHandle = NULL;
- gShellFUpdateHiiHandle = HiiAddPackages (
&gShellFUpdateHiiGuid, gImageHandle,
FUpdateShellStrings, NULL
);
- if (gShellFUpdateHiiHandle == NULL) {
- Print (L"fupdate: Cannot add Hii package\n");
- return EFI_DEVICE_ERROR;
- }
- Status = ShellCommandRegisterCommandName (
L"fupdate", ShellCommandRunFUpdate, ShellCommandGetManFileNameFUpdate, 0,
L"fupdate", TRUE , gShellFUpdateHiiHandle, STRING_TOKEN (STR_GET_HELP_FUPDATE)
);
- if (EFI_ERROR(Status)) {
- Print (L"fupdate: Error while registering command\n");
- return SHELL_ABORTED;
- }
- return EFI_SUCCESS;
+}
+EFI_STATUS +EFIAPI +FUpdateDestructor (
- 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..d7cd7ed --- /dev/null +++ b/Applications/FirmwareUpdate/FUpdate.inf @@ -0,0 +1,69 @@ +# 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. +#
+[Defines]
- INF_VERSION = 0x00010006
- BASE_NAME = FUpdateShell
UefiShellFUpdateCommandLib
- FILE_GUID = 470292b2-926b-4ed8-8080-be7a260db627
- MODULE_TYPE = UEFI_APPLICATION
- VERSION_STRING = 0.1
- LIBRARY_CLASS = NULL|UEFI_APPLICATION UEFI_DRIVER
- CONSTRUCTOR = FUpdateConstructor
- DESTRUCTOR = FUpdateDestructor
ShellFUpdateCommand*?
+[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 690062d..b17f23a 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