Skip to content

Commit a54cdba

Browse files
author
Ard Biesheuvel
committed
Platforms/AMD/Overdrive: add signed capsule update support
Wire up the various modules and boilerplate configuration snippets to implement signed capsule update for AMD Overdrive. Note that this uses the insecure default key. The secure firmware on this SoC does not implement warm reboot, so we cannot support capsules that persist across reset. Instead, the capsule may be installed using CapsuleApp (from MdeModulePkg), from the UEFI Shell prompt. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <[email protected]>
1 parent 7cb9786 commit a54cdba

File tree

6 files changed

+328
-1
lines changed

6 files changed

+328
-1
lines changed

Platform/AMD/OverdriveBoard/OverdriveBoard.dsc

+26-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,15 @@ DEFINE DO_FLASHER = FALSE
123123
ResetSystemLib|ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
124124
RealTimeClockLib|Silicon/AMD/Styx/Library/RealTimeClockLib/RealTimeClockLib.inf
125125

126-
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
126+
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
127+
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
128+
OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
129+
IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
130+
EdkiiSystemCapsuleLib|SignedCapsulePkg/Library/EdkiiSystemCapsuleLib/EdkiiSystemCapsuleLib.inf
131+
FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
132+
IniParsingLib|SignedCapsulePkg/Library/IniParsingLib/IniParsingLib.inf
133+
PlatformFlashAccessLib|Silicon/AMD/Styx/Library/StyxPlatformFlashAccessLib/StyxPlatformFlashAccessLib.inf
134+
127135
UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
128136
PlatformBootManagerLib|ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
129137
BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
@@ -499,6 +507,15 @@ DEFINE DO_FLASHER = FALSE
499507
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0x0
500508
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0x0
501509

510+
[PcdsDynamicExDefault.common.DEFAULT]
511+
gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
512+
513+
# 642e4fcf-2df7-4415-8b70-a03909c57b55
514+
gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0xcf, 0x4f, 0x2e, 0x64, 0xf7, 0x2d, 0x15, 0x44, 0x8b, 0x70, 0xa0, 0x39, 0x09, 0xc5, 0x7b, 0x55}
515+
516+
# d34b3d29-0085-4ab3-8be8-84188cc50489
517+
gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x29, 0x3d, 0x4b, 0xd3, 0x85, 0x0, 0xb3, 0x4a, 0x8b, 0xe8, 0x84, 0x18, 0x8c, 0xc5, 0x04, 0x89}
518+
502519
[PcdsDynamicHii]
503520
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|5
504521

@@ -745,3 +762,11 @@ DEFINE DO_FLASHER = FALSE
745762
ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
746763
}
747764
!endif
765+
766+
#
767+
# Firmware update
768+
#
769+
MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
770+
SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
771+
SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
772+
Platform/AMD/OverdriveBoard/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf

Platform/AMD/OverdriveBoard/OverdriveBoard.fdf

+83
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,12 @@ READ_LOCK_STATUS = TRUE
249249
#
250250
INF Silicon/AMD/Styx/Drivers/StyxRngDxe/StyxRngDxe.inf
251251

252+
#
253+
# Firmware update
254+
#
255+
INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
256+
INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
257+
252258
[FV.STYX_EFI]
253259
FvAlignment = 16
254260
ERASE_POLARITY = 1
@@ -277,13 +283,82 @@ READ_LOCK_STATUS = TRUE
277283
INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
278284
INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
279285
INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
286+
INF RuleOverride = FMP_IMAGE_DESC Platform/AMD/OverdriveBoard/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
287+
280288

281289
FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
282290
SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
283291
SECTION FV_IMAGE = FVMAIN
284292
}
285293
}
286294

295+
[FV.CapsuleDispatchFv]
296+
FvAlignment = 16
297+
ERASE_POLARITY = 1
298+
MEMORY_MAPPED = TRUE
299+
STICKY_WRITE = TRUE
300+
LOCK_CAP = TRUE
301+
LOCK_STATUS = TRUE
302+
WRITE_DISABLED_CAP = TRUE
303+
WRITE_ENABLED_CAP = TRUE
304+
WRITE_STATUS = TRUE
305+
WRITE_LOCK_CAP = TRUE
306+
WRITE_LOCK_STATUS = TRUE
307+
READ_DISABLED_CAP = TRUE
308+
READ_ENABLED_CAP = TRUE
309+
READ_STATUS = TRUE
310+
READ_LOCK_CAP = TRUE
311+
READ_LOCK_STATUS = TRUE
312+
313+
INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
314+
315+
[FV.SystemFirmwareUpdateCargo]
316+
FvAlignment = 16
317+
ERASE_POLARITY = 1
318+
MEMORY_MAPPED = TRUE
319+
STICKY_WRITE = TRUE
320+
LOCK_CAP = TRUE
321+
LOCK_STATUS = TRUE
322+
WRITE_DISABLED_CAP = TRUE
323+
WRITE_ENABLED_CAP = TRUE
324+
WRITE_STATUS = TRUE
325+
WRITE_LOCK_CAP = TRUE
326+
WRITE_LOCK_STATUS = TRUE
327+
READ_DISABLED_CAP = TRUE
328+
READ_ENABLED_CAP = TRUE
329+
READ_STATUS = TRUE
330+
READ_LOCK_CAP = TRUE
331+
READ_LOCK_STATUS = TRUE
332+
333+
FILE RAW = 642e4fcf-2df7-4415-8b70-a03909c57b55 { # PcdEdkiiSystemFirmwareFileGuid
334+
FV = STYX_EFI
335+
}
336+
337+
FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
338+
FV = CapsuleDispatchFv
339+
}
340+
341+
FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
342+
Platform/AMD/OverdriveBoard/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
343+
}
344+
345+
[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
346+
IMAGE_HEADER_INIT_VERSION = 0x02
347+
IMAGE_TYPE_ID = d34b3d29-0085-4ab3-8be8-84188cc50489 # PcdSystemFmpCapsuleImageTypeIdGuid
348+
IMAGE_INDEX = 0x1
349+
HARDWARE_INSTANCE = 0x0
350+
MONOTONIC_COUNT = 0x1
351+
CERTIFICATE_GUID = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
352+
353+
FV = SystemFirmwareUpdateCargo
354+
355+
[Capsule.StyxFirmwareUpdateCapsuleFmpPkcs7]
356+
CAPSULE_GUID = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
357+
CAPSULE_HEADER_SIZE = 0x20
358+
CAPSULE_HEADER_INIT_VERSION = 0x1
359+
360+
FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
361+
287362

288363
################################################################################
289364
#
@@ -413,3 +488,11 @@ READ_LOCK_STATUS = TRUE
413488
RAW ASL |.aml
414489
}
415490

491+
[Rule.Common.PEIM.FMP_IMAGE_DESC]
492+
FILE PEIM = $(NAMED_GUID) {
493+
RAW BIN |.acpi
494+
PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
495+
PE32 PE32 Align=4K $(INF_OUTPUT)/$(MODULE_NAME).efi
496+
UI STRING="$(MODULE_NAME)" Optional
497+
VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
498+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/** @file
2+
System Firmware descriptor.
3+
4+
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5+
Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>
6+
7+
This program and the accompanying materials
8+
are licensed and made available under the terms and conditions of the BSD License
9+
which accompanies this distribution. The full text of the license may be found at
10+
http://opensource.org/licenses/bsd-license.php
11+
12+
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14+
15+
**/
16+
17+
#include <PiPei.h>
18+
#include <Protocol/FirmwareManagement.h>
19+
#include <Guid/EdkiiSystemFmpCapsule.h>
20+
21+
#define PACKAGE_VERSION 0xFFFFFFFF
22+
#define PACKAGE_VERSION_STRING L"Unknown"
23+
24+
#define CURRENT_FIRMWARE_VERSION 0x00000001
25+
#define CURRENT_FIRMWARE_VERSION_STRING L"0x00000001"
26+
#define LOWEST_SUPPORTED_FIRMWARE_VERSION 0x00000001
27+
28+
#define IMAGE_ID SIGNATURE_64('O', 'V', 'R', 'D', 'R', 'I', 'V', 'E')
29+
#define IMAGE_ID_STRING L"AMD Seattle Overdrive UEFI"
30+
31+
// PcdSystemFmpCapsuleImageTypeIdGuid
32+
#define IMAGE_TYPE_ID_GUID { 0xd34b3d29, 0x0085, 0x4ab3, { 0x8b, 0xe8, 0x84, 0x18, 0x8c, 0xc5, 0x04, 0x89 } }
33+
34+
typedef struct {
35+
EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR Descriptor;
36+
// real string data
37+
CHAR16 ImageIdNameStr[sizeof(IMAGE_ID_STRING)/sizeof(CHAR16)];
38+
CHAR16 VersionNameStr[sizeof(CURRENT_FIRMWARE_VERSION_STRING)/sizeof(CHAR16)];
39+
CHAR16 PackageVersionNameStr[sizeof(PACKAGE_VERSION_STRING)/sizeof(CHAR16)];
40+
} IMAGE_DESCRIPTOR;
41+
42+
STATIC IMAGE_DESCRIPTOR mImageDescriptor =
43+
{
44+
{
45+
EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE,
46+
sizeof(EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR),
47+
sizeof(IMAGE_DESCRIPTOR),
48+
PACKAGE_VERSION, // PackageVersion
49+
OFFSET_OF (IMAGE_DESCRIPTOR, PackageVersionNameStr), // PackageVersionName
50+
1, // ImageIndex;
51+
{0x0}, // Reserved
52+
IMAGE_TYPE_ID_GUID, // ImageTypeId;
53+
IMAGE_ID, // ImageId;
54+
OFFSET_OF (IMAGE_DESCRIPTOR, ImageIdNameStr), // ImageIdName;
55+
CURRENT_FIRMWARE_VERSION, // Version;
56+
OFFSET_OF (IMAGE_DESCRIPTOR, VersionNameStr), // VersionName;
57+
{0x0}, // Reserved2
58+
FixedPcdGet32(PcdFdSize), // Size;
59+
IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
60+
IMAGE_ATTRIBUTE_RESET_REQUIRED |
61+
IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
62+
IMAGE_ATTRIBUTE_IN_USE, // AttributesSupported;
63+
IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
64+
IMAGE_ATTRIBUTE_RESET_REQUIRED |
65+
IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
66+
IMAGE_ATTRIBUTE_IN_USE, // AttributesSetting;
67+
0x0, // Compatibilities;
68+
LOWEST_SUPPORTED_FIRMWARE_VERSION, // LowestSupportedImageVersion;
69+
0x00000000, // LastAttemptVersion;
70+
0, // LastAttemptStatus;
71+
{0x0}, // Reserved3
72+
0, // HardwareInstance;
73+
},
74+
// real string data
75+
IMAGE_ID_STRING,
76+
CURRENT_FIRMWARE_VERSION_STRING,
77+
PACKAGE_VERSION_STRING,
78+
};
79+
80+
VOID* CONST ReferenceAcpiTable = &mImageDescriptor;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
## @file
2+
# System Firmware descriptor.
3+
#
4+
# Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5+
# This program and the accompanying materials
6+
# are licensed and made available under the terms and conditions of the BSD License
7+
# which accompanies this distribution. The full text of the license may be found at
8+
# http://opensource.org/licenses/bsd-license.php
9+
#
10+
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12+
#
13+
##
14+
15+
[Defines]
16+
INF_VERSION = 0x0001001A
17+
BASE_NAME = SystemFirmwareDescriptor
18+
FILE_GUID = 90B2B846-CA6D-4D6E-A8D3-C140A8E110AC
19+
MODULE_TYPE = PEIM
20+
VERSION_STRING = 1.0
21+
ENTRY_POINT = SystemFirmwareDescriptorPeimEntry
22+
23+
[Sources]
24+
SystemFirmwareDescriptorPei.c
25+
SystemFirmwareDescriptor.aslc
26+
27+
[Packages]
28+
ArmPkg/ArmPkg.dec
29+
MdeModulePkg/MdeModulePkg.dec
30+
MdePkg/MdePkg.dec
31+
SignedCapsulePkg/SignedCapsulePkg.dec
32+
33+
[LibraryClasses]
34+
DebugLib
35+
PcdLib
36+
PeimEntryPoint
37+
PeiServicesLib
38+
39+
[FixedPcd]
40+
gArmTokenSpaceGuid.PcdFdSize
41+
42+
[Pcd]
43+
gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor
44+
45+
[Depex]
46+
TRUE
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/** @file
2+
System Firmware descriptor producer.
3+
4+
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5+
This program and the accompanying materials
6+
are licensed and made available under the terms and conditions of the BSD License
7+
which accompanies this distribution. The full text of the license may be found at
8+
http://opensource.org/licenses/bsd-license.php
9+
10+
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12+
13+
**/
14+
15+
#include <PiPei.h>
16+
#include <Guid/EdkiiSystemFmpCapsule.h>
17+
#include <Library/DebugLib.h>
18+
#include <Library/PcdLib.h>
19+
#include <Library/PeiServicesLib.h>
20+
#include <Protocol/FirmwareManagement.h>
21+
22+
/**
23+
Entrypoint for SystemFirmwareDescriptor PEIM.
24+
25+
@param[in] FileHandle Handle of the file being invoked.
26+
@param[in] PeiServices Describes the list of possible PEI Services.
27+
28+
@retval EFI_SUCCESS PPI successfully installed.
29+
**/
30+
EFI_STATUS
31+
EFIAPI
32+
SystemFirmwareDescriptorPeimEntry (
33+
IN EFI_PEI_FILE_HANDLE FileHandle,
34+
IN CONST EFI_PEI_SERVICES **PeiServices
35+
)
36+
{
37+
EFI_STATUS Status;
38+
EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR *Descriptor;
39+
UINTN Size;
40+
UINTN Index;
41+
UINT32 AuthenticationStatus;
42+
43+
//
44+
// Search RAW section.
45+
//
46+
Index = 0;
47+
while (TRUE) {
48+
Status = PeiServicesFfsFindSectionData3(EFI_SECTION_RAW, Index, FileHandle,
49+
(VOID **)&Descriptor, &AuthenticationStatus);
50+
if (EFI_ERROR(Status)) {
51+
// Should not happen, must something wrong in FDF.
52+
ASSERT(FALSE);
53+
return EFI_NOT_FOUND;
54+
}
55+
if (Descriptor->Signature == EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE) {
56+
break;
57+
}
58+
Index++;
59+
}
60+
61+
DEBUG((DEBUG_INFO, "EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR size - 0x%x\n",
62+
Descriptor->Length));
63+
64+
Size = Descriptor->Length;
65+
PcdSetPtrS (PcdEdkiiSystemFirmwareImageDescriptor, &Size, Descriptor);
66+
67+
return EFI_SUCCESS;
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## @file
2+
#
3+
# Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
4+
# This program and the accompanying materials
5+
# are licensed and made available under the terms and conditions of the BSD License
6+
# which accompanies this distribution. The full text of the license may be found at
7+
# http://opensource.org/licenses/bsd-license.php
8+
#
9+
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11+
#
12+
##
13+
14+
[Head]
15+
NumOfUpdate = 1
16+
NumOfRecovery = 0
17+
Update0 = StyxFvMain
18+
19+
[StyxFvMain]
20+
FirmwareType = 0 # SystemFirmware
21+
AddressType = 0 # 0 - relative address, 1 - absolute address.
22+
BaseAddress = 0x00200000 # Base address offset on flash
23+
Length = 0x00260000 # Length
24+
ImageOffset = 0x00000000 # Image offset of this SystemFirmware image
25+
FileGuid = 642e4fcf-2df7-4415-8b70-a03909c57b55 # PcdEdkiiSystemFirmwareFileGuid

0 commit comments

Comments
 (0)