ArmPlatformPkg/NorFlashDxe: initialize varstore headers eagerly

The lazy initialization of the varstore FVB makes no longer sense at this
point:

- "mNorFlashInstanceTemplate.Initialize" is NULL;

- in NorFlashCreateInstance(), we only set Instance->Initialize to
  non-NULL -- namely NorFlashFvbInitialize() -- if the FVB stands for the
  variable store (see "ContainVariableStorage" / "SupportFvb");

- we call Instance->Initialize() from three places:

  - from NorFlashWriteSingleBlock(), which is too late for the variable
    read service ("variable write" depends on "variable read");

  - from InitializeFvAndVariableStoreHeaders(), but that is only reachable
    from NorFlashFvbInitialize(), i.e. recursively from
    Instance->Initialize() itself;

  - and from FvbRead(), which is never called by the variable driver, only
    by the FTW driver. However, the variable driver may read (not write)
    the memory-mapped varstore flash chip before the FTW driver is
    dispatched.

Therefore the lazy initialization is both superfluous and insufficient.
Initialize the varstore headers eagerly, before we install the FVB
protocol interface.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Steve Capper <steve.capper@linaro.org>
Cc: Supreeth Venkatesh <Supreeth.Venkatesh@arm.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Tested-by: Steve Capper <steve.capper@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
Laszlo Ersek 2018-04-11 22:18:24 +02:00
parent 7ab26d5180
commit 0f87c53d0d
3 changed files with 1 additions and 27 deletions

View File

@ -32,9 +32,6 @@ NOR_FLASH_INSTANCE mNorFlashInstanceTemplate = {
NOR_FLASH_SIGNATURE, // Signature NOR_FLASH_SIGNATURE, // Signature
NULL, // Handle ... NEED TO BE FILLED NULL, // Handle ... NEED TO BE FILLED
FALSE, // Initialized
NULL, // Initialize
0, // DeviceBaseAddress ... NEED TO BE FILLED 0, // DeviceBaseAddress ... NEED TO BE FILLED
0, // RegionBaseAddress ... NEED TO BE FILLED 0, // RegionBaseAddress ... NEED TO BE FILLED
0, // Size ... NEED TO BE FILLED 0, // Size ... NEED TO BE FILLED
@ -69,7 +66,6 @@ NOR_FLASH_INSTANCE mNorFlashInstanceTemplate = {
NorFlashDiskIoWriteDisk // WriteDisk NorFlashDiskIoWriteDisk // WriteDisk
}, },
FALSE, // SupportFvb ... NEED TO BE FILLED
{ {
FvbGetAttributes, // GetAttributes FvbGetAttributes, // GetAttributes
FvbSetAttributes, // SetAttributes FvbSetAttributes, // SetAttributes
@ -137,8 +133,7 @@ NorFlashCreateInstance (
} }
if (SupportFvb) { if (SupportFvb) {
Instance->SupportFvb = TRUE; NorFlashFvbInitialize (Instance);
Instance->Initialize = NorFlashFvbInitialize;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&Instance->Handle, &Instance->Handle,
@ -152,8 +147,6 @@ NorFlashCreateInstance (
return Status; return Status;
} }
} else { } else {
Instance->Initialized = TRUE;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&Instance->Handle, &Instance->Handle,
&gEfiDevicePathProtocolGuid, &Instance->DevicePath, &gEfiDevicePathProtocolGuid, &Instance->DevicePath,
@ -924,10 +917,6 @@ NorFlashWriteSingleBlock (
PrevBlockAddress = 0; PrevBlockAddress = 0;
if (!Instance->Initialized && Instance->Initialize) {
Instance->Initialize(Instance);
}
DEBUG ((DEBUG_BLKIO, "NorFlashWriteSingleBlock(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Lba, Offset, *NumBytes, Buffer)); DEBUG ((DEBUG_BLKIO, "NorFlashWriteSingleBlock(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Lba, Offset, *NumBytes, Buffer));
// Detect WriteDisabled state // Detect WriteDisabled state

View File

@ -122,8 +122,6 @@
typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE; typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE;
typedef EFI_STATUS (*NOR_FLASH_INITIALIZE) (NOR_FLASH_INSTANCE* Instance);
typedef struct { typedef struct {
VENDOR_DEVICE_PATH Vendor; VENDOR_DEVICE_PATH Vendor;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
@ -133,9 +131,6 @@ struct _NOR_FLASH_INSTANCE {
UINT32 Signature; UINT32 Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
BOOLEAN Initialized;
NOR_FLASH_INITIALIZE Initialize;
UINTN DeviceBaseAddress; UINTN DeviceBaseAddress;
UINTN RegionBaseAddress; UINTN RegionBaseAddress;
UINTN Size; UINTN Size;
@ -145,7 +140,6 @@ struct _NOR_FLASH_INSTANCE {
EFI_BLOCK_IO_MEDIA Media; EFI_BLOCK_IO_MEDIA Media;
EFI_DISK_IO_PROTOCOL DiskIoProtocol; EFI_DISK_IO_PROTOCOL DiskIoProtocol;
BOOLEAN SupportFvb;
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;
VOID* ShadowBuffer; VOID* ShadowBuffer;

View File

@ -59,10 +59,6 @@ InitializeFvAndVariableStoreHeaders (
EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumeHeader; EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumeHeader;
VARIABLE_STORE_HEADER *VariableStoreHeader; VARIABLE_STORE_HEADER *VariableStoreHeader;
if (!Instance->Initialized && Instance->Initialize) {
Instance->Initialize (Instance);
}
HeadersLength = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(VARIABLE_STORE_HEADER); HeadersLength = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(VARIABLE_STORE_HEADER);
Headers = AllocateZeroPool(HeadersLength); Headers = AllocateZeroPool(HeadersLength);
@ -431,10 +427,6 @@ FvbRead (
DEBUG ((DEBUG_BLKIO, "FvbRead(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Instance->StartLba + Lba, Offset, *NumBytes, Buffer)); DEBUG ((DEBUG_BLKIO, "FvbRead(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Instance->StartLba + Lba, Offset, *NumBytes, Buffer));
if (!Instance->Initialized && Instance->Initialize) {
Instance->Initialize(Instance);
}
TempStatus = EFI_SUCCESS; TempStatus = EFI_SUCCESS;
// Cache the block size to avoid de-referencing pointers all the time // Cache the block size to avoid de-referencing pointers all the time
@ -749,7 +741,6 @@ NorFlashFvbInitialize (
EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); EFI_MEMORY_UC | EFI_MEMORY_RUNTIME);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Instance->Initialized = TRUE;
mFlashNvStorageVariableBase = FixedPcdGet32 (PcdFlashNvStorageVariableBase); mFlashNvStorageVariableBase = FixedPcdGet32 (PcdFlashNvStorageVariableBase);
// Set the index of the first LBA for the FVB // Set the index of the first LBA for the FVB