[edk2,v2] ArmVirtPkg: add FDF definition for empty varstore

Message ID 1466609766-9126-1-git-send-email-ard.biesheuvel@linaro.org
State Accepted
Commit bf57a42a0e2cf1c68e9db2f61c82ce93c806ab07
Headers show

Commit Message

Ard Biesheuvel June 22, 2016, 3:36 p.m.
Similar to how OVMF implements this, add a FD definition for the varstore
firmware volume and the FTW areas. The template was taken from the file
OvmfPkg/VarStore.fdf.inc, and subsequently modified to accommodate the
differences in NOR flash layout. This affects the FvLength, Checksum and
BlockMap[0] fields in the FV header, the Size field of the varstore header,
and the Crc and WriteQueueSize fields of the FTW header. The event log
region is not used by ArmVirtQemu, so it has been omitted.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---

This is v2 of my series 'ArmVirtPkg: add empty varstore definition to
ArmVirtQemu' [0], of which patches #1 - #3 have been merged already, so
this v2 consists of a single patch.

Changes:
- move PCD assignments that have a direct correspondence with the varstore
  layout to the varstore [FD] section
- attempted (but failed) to parametrize the boundaries like the OVMF original:
  the [FD] section attributes cannot be set from macros, as it turns out, and
  defining macros only to use them in some of the appropriate places is arguably
  worse
- updated header comment
- updated commit log to describe the delta with the OVMF original

[0] http://thread.gmane.org/gmane.comp.bios.edk2.devel/13501

 ArmVirtPkg/ArmVirtQemu.dsc       | 10 ---
 ArmVirtPkg/ArmVirtQemu.fdf       |  1 +
 ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 ---
 ArmVirtPkg/ArmVirtQemuKernel.fdf |  1 +
 ArmVirtPkg/VarStore.fdf.inc      | 82 ++++++++++++++++++++
 5 files changed, 84 insertions(+), 20 deletions(-)

-- 
2.7.4

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Laszlo Ersek June 22, 2016, 7:41 p.m. | #1
On 06/22/16 17:36, Ard Biesheuvel wrote:
> Similar to how OVMF implements this, add a FD definition for the varstore

> firmware volume and the FTW areas. The template was taken from the file

> OvmfPkg/VarStore.fdf.inc, and subsequently modified to accommodate the

> differences in NOR flash layout. This affects the FvLength, Checksum and

> BlockMap[0] fields in the FV header, the Size field of the varstore header,

> and the Crc and WriteQueueSize fields of the FTW header. The event log

> region is not used by ArmVirtQemu, so it has been omitted.

> 

> Contributed-under: TianoCore Contribution Agreement 1.0

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

> 

> This is v2 of my series 'ArmVirtPkg: add empty varstore definition to

> ArmVirtQemu' [0], of which patches #1 - #3 have been merged already, so

> this v2 consists of a single patch.

> 

> Changes:

> - move PCD assignments that have a direct correspondence with the varstore

>   layout to the varstore [FD] section

> - attempted (but failed) to parametrize the boundaries like the OVMF original:

>   the [FD] section attributes cannot be set from macros,


I disagree with this note: in OvmfPkg/OvmfPkg*.fdf, we set a bunch of
[FD.xxx] tokens (like BaseAddress, and more) from macros defined in
"OvmfPkg.fdf.inc".

Anyway, I don't see the point of obsessing about this; the result of
this patch is pretty self-contained and easy to understand without
macros too. It is definitely an improvement on what we have now.

Thanks for updating the commit message, it is great. It can double as a
recipe for similar updates in the future.

Reviewed-by: Laszlo Ersek <lersek@redhat.com>


Thanks
Laszlo


> as it turns out, and

>   defining macros only to use them in some of the appropriate places is arguably

>   worse

> - updated header comment

> - updated commit log to describe the delta with the OVMF original

> 

> [0] http://thread.gmane.org/gmane.comp.bios.edk2.devel/13501

> 

>  ArmVirtPkg/ArmVirtQemu.dsc       | 10 ---

>  ArmVirtPkg/ArmVirtQemu.fdf       |  1 +

>  ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 ---

>  ArmVirtPkg/ArmVirtQemuKernel.fdf |  1 +

>  ArmVirtPkg/VarStore.fdf.inc      | 82 ++++++++++++++++++++

>  5 files changed, 84 insertions(+), 20 deletions(-)

> 

> diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc

> index 10925c2bb414..8a5306bde0d0 100644

> --- a/ArmVirtPkg/ArmVirtQemu.dsc

> +++ b/ArmVirtPkg/ArmVirtQemu.dsc

> @@ -147,16 +147,6 @@ [PcdsFixedAtBuild.common]

>    #

>    gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0

>  

> -  #

> -  # NV Storage PCDs. Use base of 0x04000000 for NOR1

> -  #

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x04000000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x04040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x04080000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00040000

> -

>    # System Memory Base -- fixed at 0x4000_0000

>    gArmTokenSpaceGuid.PcdSystemMemoryBase|0x40000000

>  

> diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf

> index 422a2bf1f9a1..ac2f1f17a042 100644

> --- a/ArmVirtPkg/ArmVirtQemu.fdf

> +++ b/ArmVirtPkg/ArmVirtQemu.fdf

> @@ -69,6 +69,7 @@ [FD.QEMU_EFI]

>  gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize

>  FV = FVMAIN_COMPACT

>  

> +!include VarStore.fdf.inc

>  

>  ################################################################################

>  #

> diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc

> index 0b4383214209..52f1612179ba 100644

> --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc

> +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc

> @@ -136,16 +136,6 @@ [PcdsFixedAtBuild.common]

>    #

>    gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0

>  

> -  #

> -  # NV Storage PCDs. Use base of 0x04000000 for NOR1

> -  #

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x04000000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x04040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00040000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x04080000

> -  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00040000

> -

>  [PcdsPatchableInModule.common]

>    #

>    # This will be overridden in the code

> diff --git a/ArmVirtPkg/ArmVirtQemuKernel.fdf b/ArmVirtPkg/ArmVirtQemuKernel.fdf

> index 6db0668a882d..f6dcbc1d5417 100644

> --- a/ArmVirtPkg/ArmVirtQemuKernel.fdf

> +++ b/ArmVirtPkg/ArmVirtQemuKernel.fdf

> @@ -91,6 +91,7 @@ [FD.QEMU_EFI]

>  gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize

>  FV = FVMAIN_COMPACT

>  

> +!include VarStore.fdf.inc

>  

>  ################################################################################

>  #

> diff --git a/ArmVirtPkg/VarStore.fdf.inc b/ArmVirtPkg/VarStore.fdf.inc

> new file mode 100644

> index 000000000000..46852ff149cf

> --- /dev/null

> +++ b/ArmVirtPkg/VarStore.fdf.inc

> @@ -0,0 +1,82 @@

> +## @file

> +#  FDF include file with FD definition that defines an empty variable store.

> +#

> +#  Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>

> +#  Copyright (C) 2014, Red Hat, Inc.<BR>

> +#  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>

> +#

> +#  This program and the accompanying materials are licensed and made available

> +#  under the terms and conditions of the BSD License which accompanies this

> +#  distribution. The full text of the license may be found at

> +#  http://opensource.org/licenses/bsd-license.php

> +#

> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR

> +#  IMPLIED.

> +#

> +##

> +

> +[FD.QEMU_VARS]

> +BaseAddress   = 0x04000000

> +Size          = 0xc0000

> +ErasePolarity = 1

> +BlockSize     = 0x40000

> +NumBlocks     = 3

> +

> +

> +0x00000000|0x00040000

> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize

> +#NV_VARIABLE_STORE

> +DATA = {

> +  ## This is the EFI_FIRMWARE_VOLUME_HEADER

> +  # ZeroVector []

> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

> +  # FileSystemGuid: gEfiSystemNvDataFvGuid         =

> +  #   { 0xFFF12B8D, 0x7696, 0x4C8B,

> +  #     { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }}

> +  0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C,

> +  0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50,

> +  # FvLength: 0xC0000

> +  0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,

> +  # Signature "_FVH"       # Attributes

> +  0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00,

> +  # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision

> +  0x48, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x02,

> +  # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block

> +  0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,

> +  # Blockmap[1]: End

> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

> +  ## This is the VARIABLE_STORE_HEADER

> +  # It is compatible with SECURE_BOOT_ENABLE == FALSE as well.

> +  # Signature: gEfiAuthenticatedVariableGuid =

> +  #   { 0xaaf32c78, 0x947b, 0x439a,

> +  #     { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }}

> +  0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43,

> +  0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92,

> +  # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) -

> +  #         0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0x3ffb8

> +  # This can speed up the Variable Dispatch a bit.

> +  0xB8, 0xFF, 0x03, 0x00,

> +  # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32

> +  0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

> +}

> +

> +

> +0x00040000|0x00040000

> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize

> +#NV_FTW_WORKING

> +DATA = {

> +  # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid         =

> +  #  { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95 }}

> +  0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49,

> +  0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95,

> +  # Crc:UINT32            #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved

> +  0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF,

> +  # WriteQueueSize: UINT64

> +  0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00

> +}

> +

> +0x00080000|0x00040000

> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize

> +#NV_FTW_SPARE

> 


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Patch

diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index 10925c2bb414..8a5306bde0d0 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -147,16 +147,6 @@  [PcdsFixedAtBuild.common]
   #
   gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
 
-  #
-  # NV Storage PCDs. Use base of 0x04000000 for NOR1
-  #
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x04000000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x04040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x04080000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00040000
-
   # System Memory Base -- fixed at 0x4000_0000
   gArmTokenSpaceGuid.PcdSystemMemoryBase|0x40000000
 
diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf
index 422a2bf1f9a1..ac2f1f17a042 100644
--- a/ArmVirtPkg/ArmVirtQemu.fdf
+++ b/ArmVirtPkg/ArmVirtQemu.fdf
@@ -69,6 +69,7 @@  [FD.QEMU_EFI]
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
 FV = FVMAIN_COMPACT
 
+!include VarStore.fdf.inc
 
 ################################################################################
 #
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc
index 0b4383214209..52f1612179ba 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc
+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc
@@ -136,16 +136,6 @@  [PcdsFixedAtBuild.common]
   #
   gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
 
-  #
-  # NV Storage PCDs. Use base of 0x04000000 for NOR1
-  #
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x04000000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x04040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00040000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x04080000
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00040000
-
 [PcdsPatchableInModule.common]
   #
   # This will be overridden in the code
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.fdf b/ArmVirtPkg/ArmVirtQemuKernel.fdf
index 6db0668a882d..f6dcbc1d5417 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.fdf
+++ b/ArmVirtPkg/ArmVirtQemuKernel.fdf
@@ -91,6 +91,7 @@  [FD.QEMU_EFI]
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
 FV = FVMAIN_COMPACT
 
+!include VarStore.fdf.inc
 
 ################################################################################
 #
diff --git a/ArmVirtPkg/VarStore.fdf.inc b/ArmVirtPkg/VarStore.fdf.inc
new file mode 100644
index 000000000000..46852ff149cf
--- /dev/null
+++ b/ArmVirtPkg/VarStore.fdf.inc
@@ -0,0 +1,82 @@ 
+## @file
+#  FDF include file with FD definition that defines an empty variable store.
+#
+#  Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>
+#  Copyright (C) 2014, Red Hat, Inc.<BR>
+#  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials are licensed and made available
+#  under the terms and conditions of the BSD License which accompanies this
+#  distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
+#  IMPLIED.
+#
+##
+
+[FD.QEMU_VARS]
+BaseAddress   = 0x04000000
+Size          = 0xc0000
+ErasePolarity = 1
+BlockSize     = 0x40000
+NumBlocks     = 3
+
+
+0x00000000|0x00040000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
+#NV_VARIABLE_STORE
+DATA = {
+  ## This is the EFI_FIRMWARE_VOLUME_HEADER
+  # ZeroVector []
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  # FileSystemGuid: gEfiSystemNvDataFvGuid         =
+  #   { 0xFFF12B8D, 0x7696, 0x4C8B,
+  #     { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }}
+  0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C,
+  0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50,
+  # FvLength: 0xC0000
+  0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
+  # Signature "_FVH"       # Attributes
+  0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00,
+  # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision
+  0x48, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x02,
+  # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block
+  0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
+  # Blockmap[1]: End
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  ## This is the VARIABLE_STORE_HEADER
+  # It is compatible with SECURE_BOOT_ENABLE == FALSE as well.
+  # Signature: gEfiAuthenticatedVariableGuid =
+  #   { 0xaaf32c78, 0x947b, 0x439a,
+  #     { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }}
+  0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43,
+  0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92,
+  # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) -
+  #         0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0x3ffb8
+  # This can speed up the Variable Dispatch a bit.
+  0xB8, 0xFF, 0x03, 0x00,
+  # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32
+  0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+}
+
+
+0x00040000|0x00040000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
+#NV_FTW_WORKING
+DATA = {
+  # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid         =
+  #  { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95 }}
+  0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49,
+  0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95,
+  # Crc:UINT32            #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved
+  0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF,
+  # WriteQueueSize: UINT64
+  0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
+}
+
+0x00080000|0x00040000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
+#NV_FTW_SPARE