\r
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
\r
- This program and the accompanying materials are licensed and made available\r
- under the terms and conditions of the BSD License which accompanies this\r
- distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
\r
**/\r
\r
//\r
-// The package level header files this module uses\r
-//\r
-#include <PiDxe.h>\r
-\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
+// The protocols, PPI and GUID definitions for this module\r
//\r
-#include <Guid/EventGroup.h>\r
-#include <Protocol/FirmwareVolumeBlock.h>\r
#include <Protocol/DevicePath.h>\r
+#include <Protocol/FirmwareVolumeBlock.h>\r
\r
//\r
// The Library classes this module consumes\r
//\r
-#include <Library/UefiLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
#include <Library/BaseLib.h>\r
-#include <Library/DxeServicesTableLib.h>\r
-#include <Library/UefiRuntimeLib.h>\r
-#include <Library/DebugLib.h>\r
#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/DxeServicesTableLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
\r
#include "FwBlockService.h"\r
#include "QemuFlash.h"\r
#define EFI_FVB2_STATUS \\r
(EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)\r
\r
-ESAL_FWB_GLOBAL *mFvbModuleGlobal;\r
+ESAL_FWB_GLOBAL *mFvbModuleGlobal;\r
\r
-FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate = {\r
+FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate = {\r
{\r
{\r
HARDWARE_DEVICE_PATH,\r
}\r
},\r
EfiMemoryMappedIO,\r
- (EFI_PHYSICAL_ADDRESS) 0,\r
- (EFI_PHYSICAL_ADDRESS) 0,\r
+ (EFI_PHYSICAL_ADDRESS)0,\r
+ (EFI_PHYSICAL_ADDRESS)0,\r
},\r
{\r
END_DEVICE_PATH_TYPE,\r
}\r
};\r
\r
-FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate = {\r
+FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate = {\r
{\r
{\r
MEDIA_DEVICE_PATH,\r
}\r
};\r
\r
-EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {\r
+EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {\r
FVB_DEVICE_SIGNATURE,\r
NULL,\r
0,\r
}\r
};\r
\r
-\r
-\r
-VOID\r
-EFIAPI\r
-FvbVirtualddressChangeEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Fixup internal data so that EFI and SAL can be call in virtual mode.\r
- Call the passed in Child Notify event and convert the mFvbModuleGlobal\r
- date items to there virtual address.\r
-\r
- mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] - Physical copy of instance\r
- data\r
- mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] - Virtual pointer to common\r
- instance data.\r
-\r
- Arguments:\r
-\r
- (Standard EFI notify event - EFI_EVENT_NOTIFY)\r
-\r
- Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- EFI_FW_VOL_INSTANCE *FwhInstance;\r
- UINTN Index;\r
-\r
- EfiConvertPointer (0x0,\r
- (VOID **) &mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]);\r
-\r
- //\r
- // Convert the base address of all the instances\r
- //\r
- Index = 0;\r
- FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];\r
- while (Index < mFvbModuleGlobal->NumFv) {\r
- EfiConvertPointer (0x0, (VOID **) &FwhInstance->FvBase[FVB_VIRTUAL]);\r
- FwhInstance = (EFI_FW_VOL_INSTANCE *)\r
- (\r
- (UINTN) ((UINT8 *) FwhInstance) +\r
- FwhInstance->VolumeHeader.HeaderLength +\r
- (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))\r
- );\r
- Index++;\r
- }\r
-\r
- EfiConvertPointer (0x0,\r
- (VOID **) &mFvbModuleGlobal->FvbScratchSpace[FVB_VIRTUAL]);\r
- EfiConvertPointer (0x0, (VOID **) &mFvbModuleGlobal);\r
- QemuFlashConvertPointers ();\r
-}\r
-\r
EFI_STATUS\r
GetFvbInstance (\r
- IN UINTN Instance,\r
- IN ESAL_FWB_GLOBAL *Global,\r
- OUT EFI_FW_VOL_INSTANCE **FwhInstance,\r
- IN BOOLEAN Virtual\r
+ IN UINTN Instance,\r
+ IN ESAL_FWB_GLOBAL *Global,\r
+ OUT EFI_FW_VOL_INSTANCE **FwhInstance\r
)\r
+\r
/*++\r
\r
Routine Description:\r
returned\r
Global - Pointer to ESAL_FWB_GLOBAL that contains all\r
instance data\r
- FwhInstance - The EFI_FW_VOL_INSTANCE fimrware instance structure\r
- Virtual - Whether CPU is in virtual or physical mode\r
+ FwhInstance - The EFI_FW_VOL_INSTANCE firmware instance structure\r
\r
Returns:\r
EFI_SUCCESS - Successfully returns\r
\r
--*/\r
{\r
- EFI_FW_VOL_INSTANCE *FwhRecord;\r
+ EFI_FW_VOL_INSTANCE *FwhRecord;\r
\r
*FwhInstance = NULL;\r
if (Instance >= Global->NumFv) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Find the right instance of the FVB private data\r
//\r
- FwhRecord = Global->FvInstance[Virtual];\r
+ FwhRecord = Global->FvInstance;\r
while (Instance > 0) {\r
FwhRecord = (EFI_FW_VOL_INSTANCE *)\r
- (\r
- (UINTN) ((UINT8 *) FwhRecord) + FwhRecord->VolumeHeader.HeaderLength +\r
- (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))\r
- );\r
+ (\r
+ (UINTN)((UINT8 *)FwhRecord) + FwhRecord->VolumeHeader.HeaderLength +\r
+ (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))\r
+ );\r
Instance--;\r
}\r
\r
\r
EFI_STATUS\r
FvbGetPhysicalAddress (\r
- IN UINTN Instance,\r
- OUT EFI_PHYSICAL_ADDRESS *Address,\r
- IN ESAL_FWB_GLOBAL *Global,\r
- IN BOOLEAN Virtual\r
+ IN UINTN Instance,\r
+ OUT EFI_PHYSICAL_ADDRESS *Address,\r
+ IN ESAL_FWB_GLOBAL *Global\r
)\r
+\r
/*++\r
\r
Routine Description:\r
address of the firmware volume.\r
Global - Pointer to ESAL_FWB_GLOBAL that contains all\r
instance data\r
- Virtual - Whether CPU is in virtual or physical mode\r
\r
Returns:\r
EFI_SUCCESS - Successfully returns\r
\r
--*/\r
{\r
- EFI_FW_VOL_INSTANCE *FwhInstance;\r
- EFI_STATUS Status;\r
+ EFI_FW_VOL_INSTANCE *FwhInstance;\r
+ EFI_STATUS Status;\r
\r
//\r
// Find the right instance of the FVB private data\r
//\r
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);\r
+ Status = GetFvbInstance (Instance, Global, &FwhInstance);\r
ASSERT_EFI_ERROR (Status);\r
- *Address = FwhInstance->FvBase[Virtual];\r
+ *Address = FwhInstance->FvBase;\r
\r
return EFI_SUCCESS;\r
}\r
\r
EFI_STATUS\r
FvbGetVolumeAttributes (\r
- IN UINTN Instance,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
- IN ESAL_FWB_GLOBAL *Global,\r
- IN BOOLEAN Virtual\r
+ IN UINTN Instance,\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ IN ESAL_FWB_GLOBAL *Global\r
)\r
+\r
/*++\r
\r
Routine Description:\r
Attributes - Output buffer which contains attributes\r
Global - Pointer to ESAL_FWB_GLOBAL that contains all\r
instance data\r
- Virtual - Whether CPU is in virtual or physical mode\r
\r
Returns:\r
EFI_SUCCESS - Successfully returns\r
\r
--*/\r
{\r
- EFI_FW_VOL_INSTANCE *FwhInstance;\r
- EFI_STATUS Status;\r
+ EFI_FW_VOL_INSTANCE *FwhInstance;\r
+ EFI_STATUS Status;\r
\r
//\r
// Find the right instance of the FVB private data\r
//\r
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);\r
+ Status = GetFvbInstance (Instance, Global, &FwhInstance);\r
ASSERT_EFI_ERROR (Status);\r
*Attributes = FwhInstance->VolumeHeader.Attributes;\r
\r
\r
EFI_STATUS\r
FvbGetLbaAddress (\r
- IN UINTN Instance,\r
- IN EFI_LBA Lba,\r
- OUT UINTN *LbaAddress,\r
- OUT UINTN *LbaLength,\r
- OUT UINTN *NumOfBlocks,\r
- IN ESAL_FWB_GLOBAL *Global,\r
- IN BOOLEAN Virtual\r
+ IN UINTN Instance,\r
+ IN EFI_LBA Lba,\r
+ OUT UINTN *LbaAddress,\r
+ OUT UINTN *LbaLength,\r
+ OUT UINTN *NumOfBlocks,\r
+ IN ESAL_FWB_GLOBAL *Global\r
)\r
+\r
/*++\r
\r
Routine Description:\r
BlockSize\r
Global - Pointer to ESAL_FWB_GLOBAL that contains all\r
instance data\r
- Virtual - Whether CPU is in virtual or physical mode\r
\r
Returns:\r
EFI_SUCCESS - Successfully returns\r
//\r
// Find the right instance of the FVB private data\r
//\r
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);\r
+ Status = GetFvbInstance (Instance, Global, &FwhInstance);\r
ASSERT_EFI_ERROR (Status);\r
\r
- StartLba = 0;\r
- Offset = 0;\r
- BlockMap = &(FwhInstance->VolumeHeader.BlockMap[0]);\r
+ StartLba = 0;\r
+ Offset = 0;\r
+ BlockMap = &(FwhInstance->VolumeHeader.BlockMap[0]);\r
\r
//\r
// Parse the blockmap of the FV to find which map entry the Lba belongs to\r
NumBlocks = BlockMap->NumBlocks;\r
BlockLength = BlockMap->Length;\r
\r
- if (NumBlocks == 0 || BlockLength == 0) {\r
+ if ((NumBlocks == 0) || (BlockLength == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// The map entry found\r
//\r
- if (Lba >= StartLba && Lba < NextLba) {\r
- Offset = Offset + (UINTN) MultU64x32 ((Lba - StartLba), BlockLength);\r
+ if ((Lba >= StartLba) && (Lba < NextLba)) {\r
+ Offset = Offset + (UINTN)MultU64x32 ((Lba - StartLba), BlockLength);\r
if (LbaAddress != NULL) {\r
- *LbaAddress = FwhInstance->FvBase[Virtual] + Offset;\r
+ *LbaAddress = FwhInstance->FvBase + Offset;\r
}\r
\r
if (LbaLength != NULL) {\r
}\r
\r
if (NumOfBlocks != NULL) {\r
- *NumOfBlocks = (UINTN) (NextLba - Lba);\r
+ *NumOfBlocks = (UINTN)(NextLba - Lba);\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
- StartLba = NextLba;\r
- Offset = Offset + NumBlocks * BlockLength;\r
+ StartLba = NextLba;\r
+ Offset = Offset + NumBlocks * BlockLength;\r
BlockMap++;\r
}\r
}\r
\r
EFI_STATUS\r
FvbSetVolumeAttributes (\r
- IN UINTN Instance,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
- IN ESAL_FWB_GLOBAL *Global,\r
- IN BOOLEAN Virtual\r
+ IN UINTN Instance,\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
+ IN ESAL_FWB_GLOBAL *Global\r
)\r
+\r
/*++\r
\r
Routine Description:\r
of the firmware volume\r
Global - Pointer to ESAL_FWB_GLOBAL that contains all\r
instance data\r
- Virtual - Whether CPU is in virtual or physical mode\r
\r
Returns:\r
EFI_SUCCESS - Successfully returns\r
//\r
// Find the right instance of the FVB private data\r
//\r
- Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);\r
+ Status = GetFvbInstance (Instance, Global, &FwhInstance);\r
ASSERT_EFI_ERROR (Status);\r
\r
- AttribPtr =\r
- (EFI_FVB_ATTRIBUTES_2 *) &(FwhInstance->VolumeHeader.Attributes);\r
+ AttribPtr =\r
+ (EFI_FVB_ATTRIBUTES_2 *)&(FwhInstance->VolumeHeader.Attributes);\r
OldAttributes = *AttribPtr;\r
Capabilities = OldAttributes & (EFI_FVB2_READ_DISABLED_CAP | \\r
EFI_FVB2_READ_ENABLED_CAP | \\r
EFI_FVB2_WRITE_ENABLED_CAP | \\r
EFI_FVB2_LOCK_CAP \\r
);\r
- OldStatus = OldAttributes & EFI_FVB2_STATUS;\r
- NewStatus = *Attributes & EFI_FVB2_STATUS;\r
+ OldStatus = OldAttributes & EFI_FVB2_STATUS;\r
+ NewStatus = *Attributes & EFI_FVB2_STATUS;\r
\r
UnchangedAttributes = EFI_FVB2_READ_DISABLED_CAP | \\r
EFI_FVB2_READ_ENABLED_CAP | \\r
// Some attributes of FV is read only can *not* be set\r
//\r
if ((OldAttributes & UnchangedAttributes) ^\r
- (*Attributes & UnchangedAttributes)) {\r
+ (*Attributes & UnchangedAttributes))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// If firmware volume is locked, no status bit can be updated\r
//\r
return EFI_ACCESS_DENIED;\r
}\r
}\r
+\r
//\r
// Test read disable\r
//\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Test read enable\r
//\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Test write disable\r
//\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Test write enable\r
//\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
+\r
//\r
// Test lock\r
//\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolGetPhysicalAddress (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- OUT EFI_PHYSICAL_ADDRESS *Address\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ OUT EFI_PHYSICAL_ADDRESS *Address\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
\r
FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
\r
- return FvbGetPhysicalAddress (FvbDevice->Instance, Address,\r
- mFvbModuleGlobal, EfiGoneVirtual ());\r
+ return FvbGetPhysicalAddress (\r
+ FvbDevice->Instance,\r
+ Address,\r
+ mFvbModuleGlobal\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolGetBlockSize (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN CONST EFI_LBA Lba,\r
- OUT UINTN *BlockSize,\r
- OUT UINTN *NumOfBlocks\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ IN CONST EFI_LBA Lba,\r
+ OUT UINTN *BlockSize,\r
+ OUT UINTN *NumOfBlocks\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
\r
FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
\r
return FvbGetLbaAddress (\r
- FvbDevice->Instance,\r
- Lba,\r
- NULL,\r
- BlockSize,\r
- NumOfBlocks,\r
- mFvbModuleGlobal,\r
- EfiGoneVirtual ()\r
- );\r
+ FvbDevice->Instance,\r
+ Lba,\r
+ NULL,\r
+ BlockSize,\r
+ NumOfBlocks,\r
+ mFvbModuleGlobal\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolGetAttributes (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
\r
FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
\r
- return FvbGetVolumeAttributes (FvbDevice->Instance, Attributes,\r
- mFvbModuleGlobal, EfiGoneVirtual ());\r
+ return FvbGetVolumeAttributes (\r
+ FvbDevice->Instance,\r
+ Attributes,\r
+ mFvbModuleGlobal\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolSetAttributes (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
\r
FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
\r
- return FvbSetVolumeAttributes (FvbDevice->Instance, Attributes,\r
- mFvbModuleGlobal, EfiGoneVirtual ());\r
+ return FvbSetVolumeAttributes (\r
+ FvbDevice->Instance,\r
+ Attributes,\r
+ mFvbModuleGlobal\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolEraseBlocks (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
...\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
- EFI_FW_VOL_INSTANCE *FwhInstance;\r
- UINTN NumOfBlocks;\r
- VA_LIST args;\r
- EFI_LBA StartingLba;\r
- UINTN NumOfLba;\r
- EFI_STATUS Status;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ EFI_FW_VOL_INSTANCE *FwhInstance;\r
+ UINTN NumOfBlocks;\r
+ VA_LIST args;\r
+ EFI_LBA StartingLba;\r
+ UINTN NumOfLba;\r
+ EFI_STATUS Status;\r
\r
FvbDevice = FVB_DEVICE_FROM_THIS (This);\r
\r
- Status = GetFvbInstance (FvbDevice->Instance, mFvbModuleGlobal,\r
- &FwhInstance, EfiGoneVirtual ());\r
+ Status = GetFvbInstance (\r
+ FvbDevice->Instance,\r
+ mFvbModuleGlobal,\r
+ &FwhInstance\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
NumOfBlocks = FwhInstance->NumOfBlocks;\r
break;\r
}\r
\r
- NumOfLba = VA_ARG (args, UINT32);\r
+ NumOfLba = VA_ARG (args, UINTN);\r
\r
//\r
// Check input parameters\r
break;\r
}\r
\r
- NumOfLba = VA_ARG (args, UINT32);\r
+ NumOfLba = VA_ARG (args, UINTN);\r
\r
while (NumOfLba > 0) {\r
Status = QemuFlashEraseBlock (StartingLba);\r
StartingLba++;\r
NumOfLba--;\r
}\r
-\r
} while (1);\r
\r
VA_END (args);\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolWrite (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN EFI_LBA Lba,\r
- IN UINTN Offset,\r
- IN OUT UINTN *NumBytes,\r
- IN UINT8 *Buffer\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ IN EFI_LBA Lba,\r
+ IN UINTN Offset,\r
+ IN OUT UINTN *NumBytes,\r
+ IN UINT8 *Buffer\r
)\r
+\r
/*++\r
\r
Routine Description:\r
Writes data beginning at Lba:Offset from FV. The write terminates either\r
when *NumBytes of data have been written, or when a block boundary is\r
reached. *NumBytes is updated to reflect the actual number of bytes\r
- written. The write opertion does not include erase. This routine will\r
+ written. The write operation does not include erase. This routine will\r
attempt to write only the specified bytes. If the writes do not stick,\r
it will return an error.\r
\r
\r
--*/\r
{\r
- return QemuFlashWrite ((EFI_LBA)Lba, (UINTN)Offset, NumBytes,\r
- (UINT8 *)Buffer);\r
+ return QemuFlashWrite (\r
+ (EFI_LBA)Lba,\r
+ (UINTN)Offset,\r
+ NumBytes,\r
+ (UINT8 *)Buffer\r
+ );\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
FvbProtocolRead (\r
- IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
- IN CONST EFI_LBA Lba,\r
- IN CONST UINTN Offset,\r
- IN OUT UINTN *NumBytes,\r
- IN UINT8 *Buffer\r
+ IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
+ IN CONST EFI_LBA Lba,\r
+ IN CONST UINTN Offset,\r
+ IN OUT UINTN *NumBytes,\r
+ IN UINT8 *Buffer\r
)\r
+\r
/*++\r
\r
Routine Description:\r
Reads data beginning at Lba:Offset from FV. The Read terminates either\r
when *NumBytes of data have been read, or when a block boundary is\r
reached. *NumBytes is updated to reflect the actual number of bytes\r
- written. The write opertion does not include erase. This routine will\r
+ written. The write operation does not include erase. This routine will\r
attempt to write only the specified bytes. If the writes do not stick,\r
it will return an error.\r
\r
\r
--*/\r
{\r
- return QemuFlashRead ((EFI_LBA)Lba, (UINTN)Offset, NumBytes,\r
- (UINT8 *)Buffer);\r
+ return QemuFlashRead (\r
+ (EFI_LBA)Lba,\r
+ (UINTN)Offset,\r
+ NumBytes,\r
+ (UINT8 *)Buffer\r
+ );\r
}\r
\r
EFI_STATUS\r
ValidateFvHeader (\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- UINT16 Checksum;\r
+ UINT16 Checksum;\r
\r
//\r
// Verify the header revision, header signature, length\r
//\r
if ((FwVolHeader->Revision != EFI_FVH_REVISION) ||\r
(FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||\r
- (FwVolHeader->FvLength == ((UINTN) -1)) ||\r
+ (FwVolHeader->FvLength == ((UINTN)-1)) ||\r
((FwVolHeader->HeaderLength & 0x01) != 0)\r
- ) {\r
+ )\r
+ {\r
return EFI_NOT_FOUND;\r
}\r
\r
// Verify the header checksum\r
//\r
\r
- Checksum = CalculateSum16 ((UINT16 *) FwVolHeader,\r
- FwVolHeader->HeaderLength);\r
+ Checksum = CalculateSum16 (\r
+ (UINT16 *)FwVolHeader,\r
+ FwVolHeader->HeaderLength\r
+ );\r
if (Checksum != 0) {\r
- UINT16 Expected;\r
+ UINT16 Expected;\r
\r
Expected =\r
- (UINT16) (((UINTN) FwVolHeader->Checksum + 0x10000 - Checksum) & 0xffff);\r
-\r
- DEBUG ((EFI_D_INFO, "FV@%p Checksum is 0x%x, expected 0x%x\n",\r
- FwVolHeader, FwVolHeader->Checksum, Expected));\r
+ (UINT16)(((UINTN)FwVolHeader->Checksum + 0x10000 - Checksum) & 0xffff);\r
+\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FV@%p Checksum is 0x%x, expected 0x%x\n",\r
+ FwVolHeader,\r
+ FwVolHeader->Checksum,\r
+ Expected\r
+ ));\r
return EFI_NOT_FOUND;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
-EFI_STATUS\r
-MarkMemoryRangeForRuntimeAccess (\r
- EFI_PHYSICAL_ADDRESS BaseAddress,\r
- UINTN Length\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Mark flash region as runtime memory\r
- //\r
- Status = gDS->RemoveMemorySpace (\r
- BaseAddress,\r
- Length\r
- );\r
-\r
- Status = gDS->AddMemorySpace (\r
- EfiGcdMemoryTypeSystemMemory,\r
- BaseAddress,\r
- Length,\r
- EFI_MEMORY_UC | EFI_MEMORY_RUNTIME\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = gBS->AllocatePages (\r
- AllocateAddress,\r
- EfiRuntimeServicesData,\r
- EFI_SIZE_TO_PAGES (Length),\r
- &BaseAddress\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r
-\r
STATIC\r
EFI_STATUS\r
InitializeVariableFvHeader (\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_HEADER *GoodFwVolHeader;\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
- UINTN Length;\r
- UINTN WriteLength;\r
- UINTN BlockSize;\r
+ EFI_STATUS Status;\r
+ EFI_FIRMWARE_VOLUME_HEADER *GoodFwVolHeader;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+ UINTN Length;\r
+ UINTN WriteLength;\r
+ UINTN BlockSize;\r
\r
FwVolHeader =\r
- (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN)\r
- PcdGet32 (PcdOvmfFlashNvStorageVariableBase);\r
+ (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)\r
+ PcdGet32 (PcdOvmfFlashNvStorageVariableBase);\r
\r
Length =\r
(FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
\r
BlockSize = PcdGet32 (PcdOvmfFirmwareBlockSize);\r
\r
- Status = ValidateFvHeader (FwVolHeader);\r
+ Status = ValidateFvHeader (FwVolHeader);\r
if (!EFI_ERROR (Status)) {\r
- if (FwVolHeader->FvLength != Length ||\r
- FwVolHeader->BlockMap[0].Length != BlockSize) {\r
+ if ((FwVolHeader->FvLength != Length) ||\r
+ (FwVolHeader->BlockMap[0].Length != BlockSize))\r
+ {\r
Status = EFI_VOLUME_CORRUPTED;\r
}\r
}\r
+\r
if (EFI_ERROR (Status)) {\r
- UINTN Offset;\r
- UINTN Start;\r
+ UINTN Offset;\r
+ UINTN Start;\r
\r
- DEBUG ((EFI_D_INFO,\r
- "Variable FV header is not valid. It will be reinitialized.\n"));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Variable FV header is not valid. It will be reinitialized.\n"\r
+ ));\r
\r
//\r
// Get FvbInfo to provide in FwhInstance.\r
Status = GetFvbInfo (Length, &GoodFwVolHeader);\r
ASSERT (!EFI_ERROR (Status));\r
\r
- Start = (UINTN)(UINT8*) FwVolHeader - PcdGet32 (PcdOvmfFdBaseAddress);\r
+ Start = (UINTN)(UINT8 *)FwVolHeader - PcdGet32 (PcdOvmfFdBaseAddress);\r
ASSERT (Start % BlockSize == 0 && Length % BlockSize == 0);\r
ASSERT (GoodFwVolHeader->HeaderLength <= BlockSize);\r
\r
// Write good FV header\r
//\r
WriteLength = GoodFwVolHeader->HeaderLength;\r
- Status = QemuFlashWrite (\r
- Start / BlockSize,\r
- 0,\r
- &WriteLength,\r
- (UINT8 *) GoodFwVolHeader);\r
+ Status = QemuFlashWrite (\r
+ Start / BlockSize,\r
+ 0,\r
+ &WriteLength,\r
+ (UINT8 *)GoodFwVolHeader\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
ASSERT (WriteLength == GoodFwVolHeader->HeaderLength);\r
}\r
EFI_STATUS\r
EFIAPI\r
FvbInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
+\r
/*++\r
\r
Routine Description:\r
\r
--*/\r
{\r
- EFI_STATUS Status;\r
- EFI_FW_VOL_INSTANCE *FwhInstance;\r
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
- UINT32 BufferSize;\r
- EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;\r
- EFI_HANDLE FwbHandle;\r
- EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
- EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *OldFwbInterface;\r
- UINT32 MaxLbaSize;\r
- EFI_PHYSICAL_ADDRESS BaseAddress;\r
- UINTN Length;\r
- UINTN NumOfBlocks;\r
- EFI_EVENT VirtualAddressChangeEvent;\r
+ EFI_STATUS Status;\r
+ EFI_FW_VOL_INSTANCE *FwhInstance;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;\r
+ UINT32 BufferSize;\r
+ EFI_FV_BLOCK_MAP_ENTRY *PtrBlockMapEntry;\r
+ EFI_FW_VOL_BLOCK_DEVICE *FvbDevice;\r
+ UINT32 MaxLbaSize;\r
+ EFI_PHYSICAL_ADDRESS BaseAddress;\r
+ UINTN Length;\r
+ UINTN NumOfBlocks;\r
+ RETURN_STATUS PcdStatus;\r
\r
if (EFI_ERROR (QemuFlashInitialize ())) {\r
//\r
// Return an error so image will be unloaded\r
//\r
- DEBUG ((EFI_D_INFO,\r
- "QEMU flash was not detected. Writable FVB is not being installed.\n"));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "QEMU flash was not detected. Writable FVB is not being installed.\n"\r
+ ));\r
return EFI_WRITE_PROTECTED;\r
}\r
\r
mFvbModuleGlobal = AllocateRuntimePool (sizeof (ESAL_FWB_GLOBAL));\r
ASSERT (mFvbModuleGlobal != NULL);\r
\r
- BaseAddress = (UINTN) PcdGet32 (PcdOvmfFdBaseAddress);\r
- Length = PcdGet32 (PcdOvmfFirmwareFdSize);\r
+ BaseAddress = (UINTN)PcdGet32 (PcdOvmfFdBaseAddress);\r
+ Length = PcdGet32 (PcdOvmfFirmwareFdSize);\r
\r
Status = InitializeVariableFvHeader ();\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_INFO,\r
- "QEMU Flash: Unable to initialize variable FV header\n"));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "QEMU Flash: Unable to initialize variable FV header\n"\r
+ ));\r
return EFI_WRITE_PROTECTED;\r
}\r
\r
- FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) BaseAddress;\r
+ FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)BaseAddress;\r
Status = ValidateFvHeader (FwVolHeader);\r
if (EFI_ERROR (Status)) {\r
//\r
//\r
Status = GetFvbInfo (Length, &FwVolHeader);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_INFO, "EFI_ERROR (GetFvbInfo (Length, &FwVolHeader))\n"));\r
+ DEBUG ((DEBUG_INFO, "EFI_ERROR (GetFvbInfo (Length, &FwVolHeader))\n"));\r
return EFI_WRITE_PROTECTED;\r
}\r
}\r
FwVolHeader->HeaderLength -\r
sizeof (EFI_FIRMWARE_VOLUME_HEADER)\r
);\r
+ mFvbModuleGlobal->FvInstance = AllocateRuntimePool (BufferSize);\r
+ ASSERT (mFvbModuleGlobal->FvInstance != NULL);\r
\r
- //\r
- // Only need to allocate once. There is only one copy of physical memory for\r
- // the private data of each FV instance. But in virtual mode or in physical\r
- // mode, the address of the the physical memory may be different.\r
- //\r
- mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] = AllocateRuntimePool (\r
- BufferSize);\r
- ASSERT (mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] != NULL);\r
+ FwhInstance = mFvbModuleGlobal->FvInstance;\r
\r
- //\r
- // Make a virtual copy of the FvInstance pointer.\r
- //\r
- FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];\r
- mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] = FwhInstance;\r
-\r
- mFvbModuleGlobal->NumFv = 0;\r
- MaxLbaSize = 0;\r
+ mFvbModuleGlobal->NumFv = 0;\r
+ MaxLbaSize = 0;\r
\r
FwVolHeader =\r
- (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN)\r
- PcdGet32 (PcdOvmfFlashNvStorageVariableBase);\r
+ (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)\r
+ PcdGet32 (PcdOvmfFlashNvStorageVariableBase);\r
\r
- FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN) BaseAddress;\r
- FwhInstance->FvBase[FVB_VIRTUAL] = (UINTN) BaseAddress;\r
+ FwhInstance->FvBase = (UINTN)BaseAddress;\r
\r
- CopyMem ((UINTN *) &(FwhInstance->VolumeHeader), (UINTN *) FwVolHeader,\r
- FwVolHeader->HeaderLength);\r
+ CopyMem (\r
+ (UINTN *)&(FwhInstance->VolumeHeader),\r
+ (UINTN *)FwVolHeader,\r
+ FwVolHeader->HeaderLength\r
+ );\r
FwVolHeader = &(FwhInstance->VolumeHeader);\r
- EfiInitializeLock (&(FwhInstance->FvbDevLock), TPL_HIGH_LEVEL);\r
\r
NumOfBlocks = 0;\r
\r
for (PtrBlockMapEntry = FwVolHeader->BlockMap;\r
PtrBlockMapEntry->NumBlocks != 0;\r
- PtrBlockMapEntry++) {\r
+ PtrBlockMapEntry++)\r
+ {\r
//\r
// Get the maximum size of a block.\r
//\r
// Set up the devicepath\r
//\r
if (FwVolHeader->ExtHeaderOffset == 0) {\r
- FV_MEMMAP_DEVICE_PATH *FvMemmapDevicePath;\r
+ FV_MEMMAP_DEVICE_PATH *FvMemmapDevicePath;\r
\r
//\r
// FV does not contains extension header, then produce MEMMAP_DEVICE_PATH\r
//\r
- FvMemmapDevicePath = AllocateCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH),\r
- &mFvMemmapDevicePathTemplate);\r
+ FvMemmapDevicePath = AllocateCopyPool (\r
+ sizeof (FV_MEMMAP_DEVICE_PATH),\r
+ &mFvMemmapDevicePathTemplate\r
+ );\r
FvMemmapDevicePath->MemMapDevPath.StartingAddress = BaseAddress;\r
FvMemmapDevicePath->MemMapDevPath.EndingAddress =\r
BaseAddress + FwVolHeader->FvLength - 1;\r
FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)FvMemmapDevicePath;\r
} else {\r
- FV_PIWG_DEVICE_PATH *FvPiwgDevicePath;\r
+ FV_PIWG_DEVICE_PATH *FvPiwgDevicePath;\r
\r
- FvPiwgDevicePath = AllocateCopyPool (sizeof (FV_PIWG_DEVICE_PATH),\r
- &mFvPIWGDevicePathTemplate);\r
+ FvPiwgDevicePath = AllocateCopyPool (\r
+ sizeof (FV_PIWG_DEVICE_PATH),\r
+ &mFvPIWGDevicePathTemplate\r
+ );\r
CopyGuid (\r
&FvPiwgDevicePath->FvDevPath.FvName,\r
(GUID *)(UINTN)(BaseAddress + FwVolHeader->ExtHeaderOffset)\r
}\r
\r
//\r
- // Find a handle with a matching device path that has supports FW Block\r
- // protocol\r
+ // Module type specific hook.\r
//\r
- Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid,\r
- &FvbDevice->DevicePath, &FwbHandle);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // LocateDevicePath fails so install a new interface and device path\r
- //\r
- FwbHandle = NULL;\r
- DEBUG ((EFI_D_INFO, "Installing QEMU flash FVB\n"));\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &FwbHandle,\r
- &gEfiFirmwareVolumeBlockProtocolGuid,\r
- &FvbDevice->FwVolBlockInstance,\r
- &gEfiDevicePathProtocolGuid,\r
- FvbDevice->DevicePath,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- } else if (IsDevicePathEnd (FvbDevice->DevicePath)) {\r
- //\r
- // Device already exists, so reinstall the FVB protocol\r
- //\r
- Status = gBS->HandleProtocol (\r
- FwbHandle,\r
- &gEfiFirmwareVolumeBlockProtocolGuid,\r
- (VOID**)&OldFwbInterface\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ InstallProtocolInterfaces (FvbDevice);\r
\r
- DEBUG ((EFI_D_INFO, "Reinstalling FVB for QEMU flash region\n"));\r
- Status = gBS->ReinstallProtocolInterface (\r
- FwbHandle,\r
- &gEfiFirmwareVolumeBlockProtocolGuid,\r
- OldFwbInterface,\r
- &FvbDevice->FwVolBlockInstance\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- } else {\r
- //\r
- // There was a FVB protocol on an End Device Path node\r
- //\r
- ASSERT (FALSE);\r
- }\r
-\r
- MarkMemoryRangeForRuntimeAccess (BaseAddress, Length);\r
+ MarkIoMemoryRangeForRuntimeAccess (BaseAddress, Length);\r
\r
- //\r
- // Set several PCD values to point to flash\r
- //\r
- PcdSet64 (\r
- PcdFlashNvStorageVariableBase64,\r
- (UINTN) PcdGet32 (PcdOvmfFlashNvStorageVariableBase)\r
- );\r
- PcdSet32 (\r
- PcdFlashNvStorageFtwWorkingBase,\r
- PcdGet32 (PcdOvmfFlashNvStorageFtwWorkingBase)\r
- );\r
- PcdSet32 (\r
- PcdFlashNvStorageFtwSpareBase,\r
- PcdGet32 (PcdOvmfFlashNvStorageFtwSpareBase)\r
- );\r
+ SetPcdFlashNvStorageBaseAddresses ();\r
\r
FwhInstance = (EFI_FW_VOL_INSTANCE *)\r
- (\r
- (UINTN) ((UINT8 *) FwhInstance) + FwVolHeader->HeaderLength +\r
- (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))\r
- );\r
+ (\r
+ (UINTN)((UINT8 *)FwhInstance) + FwVolHeader->HeaderLength +\r
+ (sizeof (EFI_FW_VOL_INSTANCE) - sizeof (EFI_FIRMWARE_VOLUME_HEADER))\r
+ );\r
\r
- VirtualAddressChangeEvent = NULL;\r
- Status = gBS->CreateEventEx (\r
- EVT_NOTIFY_SIGNAL,\r
- TPL_NOTIFY,\r
- FvbVirtualddressChangeEvent,\r
- NULL,\r
- &gEfiEventVirtualAddressChangeGuid,\r
- &VirtualAddressChangeEvent\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Module type specific hook.\r
+ //\r
+ InstallVirtualAddressChangeHandler ();\r
\r
- PcdSetBool (PcdOvmfFlashVariablesEnable, TRUE);\r
+ PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE);\r
+ ASSERT_RETURN_ERROR (PcdStatus);\r
return EFI_SUCCESS;\r
}\r