diff options
Diffstat (limited to 'MdeModulePkg')
-rw-r--r-- | MdeModulePkg/Universal/CapsulePei/Capsule.h | 4 | ||||
-rw-r--r-- | MdeModulePkg/Universal/CapsulePei/CapsulePei.inf | 12 | ||||
-rw-r--r-- | MdeModulePkg/Universal/CapsulePei/Common/CommonHeader.h | 9 | ||||
-rw-r--r-- | MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 121 | ||||
-rw-r--r-- | MdeModulePkg/Universal/CapsulePei/X64/X64Entry.c | 1 |
5 files changed, 78 insertions, 69 deletions
diff --git a/MdeModulePkg/Universal/CapsulePei/Capsule.h b/MdeModulePkg/Universal/CapsulePei/Capsule.h index 8d8658a..5b7caae 100644 --- a/MdeModulePkg/Universal/CapsulePei/Capsule.h +++ b/MdeModulePkg/Universal/CapsulePei/Capsule.h @@ -38,6 +38,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <IndustryStandard/PeImage.h>
#include "Common/CommonHeader.h"
+#ifdef MDE_CPU_IA32
+
#pragma pack(1)
//
@@ -99,3 +101,5 @@ EFI_STATUS );
#endif
+
+#endif
diff --git a/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf b/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf index 2599cdb..72f1ba5 100644 --- a/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf +++ b/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf @@ -49,22 +49,26 @@ DebugLib
PeiServicesTablePointerLib
PrintLib
- PeCoffLib
+ ReportStatusCodeLib
+
+[LibraryClasses.IA32]
PeCoffGetEntryPointLib
PcdLib
- ReportStatusCodeLib
[Guids]
gEfiCapsuleVendorGuid # ALWAYS_CONSUMED
-
[Ppis]
gEfiPeiReadOnlyVariable2PpiGuid # PPI ALWAYS_CONSUMED
gPeiCapsulePpiGuid # PPI ALWAYS_CONSUMED
+
+[Ppis.IA32]
gEfiPeiLoadFilePpiGuid # PPI ALWAYS_CONSUMED
-[Pcd]
+[Pcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleCoalesceFile
+
+[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode
[Depex]
diff --git a/MdeModulePkg/Universal/CapsulePei/Common/CommonHeader.h b/MdeModulePkg/Universal/CapsulePei/Common/CommonHeader.h index 5c0aa30..0f7f7ae 100644 --- a/MdeModulePkg/Universal/CapsulePei/Common/CommonHeader.h +++ b/MdeModulePkg/Universal/CapsulePei/Common/CommonHeader.h @@ -12,11 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/
-#ifndef _CAPSULE_THUNK_32_TO_64_
-#define _CAPSULE_THUNK_32_TO_64_
-
-#include <Uefi.h>
-#include "PiPei.h"
+#ifndef _CAPSULE_COMMON_HEADER_
+#define _CAPSULE_COMMON_HEADER_
//
// This capsule PEIM puts its private data at the start of the
@@ -31,6 +28,7 @@ typedef struct { #define CAPSULE_TEST_SIGNATURE SIGNATURE_32('T', 'E', 'S', 'T')
+#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
typedef struct {
EFI_PHYSICAL_ADDRESS EntryPoint;
EFI_PHYSICAL_ADDRESS StackBufferBase;
@@ -47,6 +45,7 @@ typedef struct { UINT64 ReturnStatus;
IA32_DESCRIPTOR Gdtr;
} SWITCH_64_TO_32_CONTEXT;
+#endif
/**
The function to coalesce a fragmented capsule in memory.
diff --git a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c index 5598755..da37e67 100644 --- a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c +++ b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c @@ -16,6 +16,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Capsule.h"
+#ifdef MDE_CPU_IA32
//
// Global Descriptor Table (GDT)
//
@@ -418,6 +419,67 @@ ModeSwitch ( }
/**
+ Locates the coalesce image entry point, and detects its machine type.
+
+ @param CoalesceImageEntryPoint Pointer to coalesce image entry point for output.
+ @param CoalesceImageMachineType Pointer to machine type of coalesce image.
+
+ @retval EFI_SUCCESS Coalesce image successfully located.
+ @retval Others Failed to locate the coalesce image.
+
+**/
+EFI_STATUS
+FindCapsuleCoalesceImage (
+ OUT EFI_PHYSICAL_ADDRESS *CoalesceImageEntryPoint,
+ OUT UINT16 *CoalesceImageMachineType
+ )
+{
+ EFI_STATUS Status;
+ UINTN Instance;
+ EFI_PEI_LOAD_FILE_PPI *LoadFile;
+ EFI_PEI_FV_HANDLE VolumeHandle;
+ EFI_PEI_FILE_HANDLE FileHandle;
+ EFI_PHYSICAL_ADDRESS CoalesceImageAddress;
+ UINT64 CoalesceImageSize;
+ UINT32 AuthenticationState;
+
+ Instance = 0;
+
+ while (TRUE) {
+ Status = PeiServicesFfsFindNextVolume (Instance++, &VolumeHandle);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ Status = PeiServicesFfsFindFileByName (PcdGetPtr(PcdCapsuleCoalesceFile), VolumeHandle, &FileHandle);
+ if (!EFI_ERROR (Status)) {
+ Status = PeiServicesLocatePpi (&gEfiPeiLoadFilePpiGuid, 0, NULL, (VOID **) &LoadFile);
+ ASSERT_EFI_ERROR (Status);
+
+ Status = LoadFile->LoadFile (
+ LoadFile,
+ FileHandle,
+ &CoalesceImageAddress,
+ &CoalesceImageSize,
+ CoalesceImageEntryPoint,
+ &AuthenticationState
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((EFI_D_ERROR, "Unable to find PE32 section in CapsuleRelocate image ffs %r!\n", Status));
+ return Status;
+ }
+ *CoalesceImageMachineType = PeCoffLoaderGetMachineType ((VOID *) (UINTN) CoalesceImageAddress);
+ break;
+ } else {
+ continue;
+ }
+ }
+
+ return Status;
+}
+
+#endif
+
+/**
Checks for the presence of capsule descriptors.
Get capsule descriptors from variable CapsuleUpdateData, CapsuleUpdateData1, CapsuleUpdateData2...
and save to DescriptorBuffer.
@@ -527,65 +589,6 @@ GetCapsuleDescriptors ( }
/**
- Locates the coalesce image entry point, and detects its machine type.
-
- @param CoalesceImageEntryPoint Pointer to coalesce image entry point for output.
- @param CoalesceImageMachineType Pointer to machine type of coalesce image.
-
- @retval EFI_SUCCESS Coalesce image successfully located.
- @retval Others Failed to locate the coalesce image.
-
-**/
-EFI_STATUS
-FindCapsuleCoalesceImage (
- OUT EFI_PHYSICAL_ADDRESS *CoalesceImageEntryPoint,
- OUT UINT16 *CoalesceImageMachineType
- )
-{
- EFI_STATUS Status;
- UINTN Instance;
- EFI_PEI_LOAD_FILE_PPI *LoadFile;
- EFI_PEI_FV_HANDLE VolumeHandle;
- EFI_PEI_FILE_HANDLE FileHandle;
- EFI_PHYSICAL_ADDRESS CoalesceImageAddress;
- UINT64 CoalesceImageSize;
- UINT32 AuthenticationState;
-
- Instance = 0;
-
- while (TRUE) {
- Status = PeiServicesFfsFindNextVolume (Instance++, &VolumeHandle);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = PeiServicesFfsFindFileByName (PcdGetPtr(PcdCapsuleCoalesceFile), VolumeHandle, &FileHandle);
- if (!EFI_ERROR (Status)) {
- Status = PeiServicesLocatePpi (&gEfiPeiLoadFilePpiGuid, 0, NULL, (VOID **) &LoadFile);
- ASSERT_EFI_ERROR (Status);
-
- Status = LoadFile->LoadFile (
- LoadFile,
- FileHandle,
- &CoalesceImageAddress,
- &CoalesceImageSize,
- CoalesceImageEntryPoint,
- &AuthenticationState
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "Unable to find PE32 section in CapsuleRelocate image ffs %r!\n", Status));
- return Status;
- }
- *CoalesceImageMachineType = PeCoffLoaderGetMachineType ((VOID *) (UINTN) CoalesceImageAddress);
- break;
- } else {
- continue;
- }
- }
-
- return Status;
-}
-
-/**
Gets the reserved long mode buffer.
@param LongModeBuffer Pointer to the long mode buffer for output.
diff --git a/MdeModulePkg/Universal/CapsulePei/X64/X64Entry.c b/MdeModulePkg/Universal/CapsulePei/X64/X64Entry.c index c64fe10..a4e44a4 100644 --- a/MdeModulePkg/Universal/CapsulePei/X64/X64Entry.c +++ b/MdeModulePkg/Universal/CapsulePei/X64/X64Entry.c @@ -12,7 +12,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/
-#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include "CommonHeader.h"
|