From nobody Mon Feb 9 07:23:38 2026 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1495120495664537.8122438308337; Thu, 18 May 2017 08:14:55 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 8D1A52195FD4A; Thu, 18 May 2017 08:14:50 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1B4852195FD78 for ; Thu, 18 May 2017 08:14:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 88E7340F17; Thu, 18 May 2017 15:14:48 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-86.phx2.redhat.com [10.3.116.86]) by smtp.corp.redhat.com (Postfix) with ESMTP id BAE1A80E62; Thu, 18 May 2017 15:14:47 +0000 (UTC) X-Original-To: edk2-devel@lists.01.org DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 88E7340F17 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=lersek@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 88E7340F17 From: Laszlo Ersek To: edk2-devel-01 Date: Thu, 18 May 2017 17:14:33 +0200 Message-Id: <20170518151436.16566-3-lersek@redhat.com> In-Reply-To: <20170518151436.16566-1-lersek@redhat.com> References: <20170518151436.16566-1-lersek@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 18 May 2017 15:14:48 +0000 (UTC) Subject: [edk2] [PATCH v2 2/5] OvmfPkg/EmuVariableFvbRuntimeDxe: change block size to 4KB X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jordan Justen MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" EmuVariableFvbRuntimeDxe currently produces a Firmware Volume Block protocol that is based on a block map of two blocks, each block having PcdFlashNvStorageFtwSpareSize for size. (The total size is 2 * PcdFlashNvStorageFtwSpareSize.) FaultTolerantWriteDxe in turn expects the block size to be a power of two. In the 4MB build of OVMF, PcdFlashNvStorageFtwSpareSize is 264KB, which is not a power of two. In order to equip EmuVariableFvbRuntimeDxe for this build, shrink the block size to 4KB (EFI_PAGE_SIZE), and grow the block count from 2 to EFI_SIZE_TO_PAGES(2 * PcdFlashNvStorageFtwSpareSize). The total size remains 2 * PcdFlashNvStorageFtwSpareSize --------------------------------- * EFI_PAGE_SIZE EFI_PAGE_SIZE Right now EmuVariableFvbRuntimeDxe open-codes the block count of 2 in various limit checks, so introduce a few new macros: - EMU_FVB_NUM_TOTAL_BLOCKS, for the LHS of the above product, - EMU_FVB_NUM_SPARE_BLOCKS for the half of that. Also rework the FVB protocol members to support an arbitrary count of blocks. Keep the invariant intact that the first half of the firmware volume hosts the variable store and the FTW working block, and that the second half maps the FTW spare area. Cc: Jordan Justen Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D527 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Regression-tested-by: Gary Lin --- Notes: v2: - rebase to separated-out patch "OvmfPkg/EmuVariableFvbRuntimeDxe: correct NumOfLba vararg type in EraseBlocks()"; end result is identical to v1 [Jordan] - add Gary's R-t-b OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.h | 10 +- OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c | 147 +++++++++----------- 2 files changed, 75 insertions(+), 82 deletions(-) diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.h b/OvmfPkg/EmuVariableFv= bRuntimeDxe/Fvb.h index 4247d21d72f8..beb11e3f9a90 100644 --- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.h +++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.h @@ -58,8 +58,14 @@ typedef struct { // // Constants // -#define EMU_FVB_BLOCK_SIZE (FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize)) -#define EMU_FVB_SIZE (2 * FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize)) +#define EMU_FVB_BLOCK_SIZE \ + EFI_PAGE_SIZE +#define EMU_FVB_NUM_SPARE_BLOCKS \ + EFI_SIZE_TO_PAGES ((UINTN)FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize)) +#define EMU_FVB_NUM_TOTAL_BLOCKS \ + (2 * EMU_FVB_NUM_SPARE_BLOCKS) +#define EMU_FVB_SIZE \ + (EMU_FVB_NUM_TOTAL_BLOCKS * EMU_FVB_BLOCK_SIZE) #define FTW_WRITE_QUEUE_SIZE \ (FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) - \ sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)) diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c b/OvmfPkg/EmuVariableFv= bRuntimeDxe/Fvb.c index 30f69b999ab0..11c8b1b75cb8 100644 --- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c +++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c @@ -74,8 +74,8 @@ EFI_FW_VOL_BLOCK_DEVICE mEmuVarsFvb =3D { } }, NULL, // BufferPtr - FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize), // BlockSize - 2 * FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize), // Size + EMU_FVB_BLOCK_SIZE, // BlockSize + EMU_FVB_SIZE, // Size { // FwVolBlockInstance FvbProtocolGetAttributes, FvbProtocolSetAttributes, @@ -185,14 +185,14 @@ FvbProtocolGetBlockSize ( { EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; =20 - if (Lba > 1) { + if (Lba >=3D EMU_FVB_NUM_TOTAL_BLOCKS) { return EFI_INVALID_PARAMETER; } =20 FvbDevice =3D FVB_DEVICE_FROM_THIS (This); =20 *BlockSize =3D FvbDevice->BlockSize; - *NumberOfBlocks =3D (UINTN) (2 - (UINTN) Lba); + *NumberOfBlocks =3D (UINTN)(EMU_FVB_NUM_TOTAL_BLOCKS - Lba); =20 return EFI_SUCCESS; } @@ -322,68 +322,58 @@ FvbProtocolEraseBlocks ( ) { EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; - VA_LIST args; + VA_LIST Args; EFI_LBA StartingLba; UINTN NumOfLba; - UINT8 Erase; - VOID *ErasePtr; + UINT8 *ErasePtr; UINTN EraseSize; =20 FvbDevice =3D FVB_DEVICE_FROM_THIS (This); - Erase =3D 0; - - VA_START (args, This); =20 + // + // Check input parameters + // + VA_START (Args, This); do { - StartingLba =3D VA_ARG (args, EFI_LBA); + StartingLba =3D VA_ARG (Args, EFI_LBA); if (StartingLba =3D=3D EFI_LBA_LIST_TERMINATOR) { break; } + NumOfLba =3D VA_ARG (Args, UINTN); =20 - NumOfLba =3D VA_ARG (args, UINTN); - - // - // Check input parameters - // - if ((NumOfLba =3D=3D 0) || (StartingLba > 1) || ((StartingLba + NumOfL= ba) > 2)) { - VA_END (args); + if (StartingLba > EMU_FVB_NUM_TOTAL_BLOCKS || + NumOfLba > EMU_FVB_NUM_TOTAL_BLOCKS - StartingLba) { + VA_END (Args); return EFI_INVALID_PARAMETER; } - - if (StartingLba =3D=3D 0) { - Erase =3D (UINT8) (Erase | BIT0); - } - if ((StartingLba + NumOfLba) =3D=3D 2) { - Erase =3D (UINT8) (Erase | BIT1); - } - } while (1); + VA_END (Args); =20 - VA_END (args); - - ErasePtr =3D (UINT8*) FvbDevice->BufferPtr; - EraseSize =3D 0; + // + // Erase blocks + // + VA_START (Args, This); + do { + StartingLba =3D VA_ARG (Args, EFI_LBA); + if (StartingLba =3D=3D EFI_LBA_LIST_TERMINATOR) { + break; + } + NumOfLba =3D VA_ARG (Args, UINTN); =20 - if ((Erase & BIT0) !=3D 0) { - EraseSize =3D EraseSize + FvbDevice->BlockSize; - } else { - ErasePtr =3D (VOID*) ((UINT8*)ErasePtr + FvbDevice->BlockSize); - } + ErasePtr =3D FvbDevice->BufferPtr; + ErasePtr +=3D (UINTN)StartingLba * FvbDevice->BlockSize; + EraseSize =3D NumOfLba * FvbDevice->BlockSize; =20 - if ((Erase & BIT1) !=3D 0) { - EraseSize =3D EraseSize + FvbDevice->BlockSize; - } + SetMem (ErasePtr, EraseSize, ERASED_UINT8); + } while (1); + VA_END (Args); =20 - if (EraseSize !=3D 0) { - SetMem ( - (VOID*) ErasePtr, - EraseSize, - ERASED_UINT8 - ); - VA_START (args, This); - PlatformFvbBlocksErased (This, args); - VA_END (args); - } + // + // Call platform hook + // + VA_START (Args, This); + PlatformFvbBlocksErased (This, Args); + VA_END (Args); =20 return EFI_SUCCESS; } @@ -458,31 +448,30 @@ FvbProtocolWrite ( IN UINT8 *Buffer ) { - EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; UINT8 *FvbDataPtr; + EFI_STATUS Status; =20 FvbDevice =3D FVB_DEVICE_FROM_THIS (This); =20 - if ((Lba > 1) || (Offset > FvbDevice->BlockSize)) { + if (Lba >=3D EMU_FVB_NUM_TOTAL_BLOCKS || + Offset > FvbDevice->BlockSize) { return EFI_INVALID_PARAMETER; } =20 - if ((Offset + *NumBytes) > FvbDevice->BlockSize) { + Status =3D EFI_SUCCESS; + if (*NumBytes > FvbDevice->BlockSize - Offset) { *NumBytes =3D FvbDevice->BlockSize - Offset; + Status =3D EFI_BAD_BUFFER_SIZE; } =20 - FvbDataPtr =3D - (UINT8*) FvbDevice->BufferPtr + - MultU64x32 (Lba, (UINT32) FvbDevice->BlockSize) + - Offset; + FvbDataPtr =3D FvbDevice->BufferPtr; + FvbDataPtr +=3D (UINTN)Lba * FvbDevice->BlockSize; + FvbDataPtr +=3D Offset; =20 - if (*NumBytes > 0) { - CopyMem (FvbDataPtr, Buffer, *NumBytes); - PlatformFvbDataWritten (This, Lba, Offset, *NumBytes, Buffer); - } - - return EFI_SUCCESS; + CopyMem (FvbDataPtr, Buffer, *NumBytes); + PlatformFvbDataWritten (This, Lba, Offset, *NumBytes, Buffer); + return Status; } =20 =20 @@ -545,28 +534,28 @@ FvbProtocolRead ( { EFI_FW_VOL_BLOCK_DEVICE *FvbDevice; UINT8 *FvbDataPtr; + EFI_STATUS Status; =20 FvbDevice =3D FVB_DEVICE_FROM_THIS (This); =20 - if ((Lba > 1) || (Offset > FvbDevice->BlockSize)) { + if (Lba >=3D EMU_FVB_NUM_TOTAL_BLOCKS || + Offset > FvbDevice->BlockSize) { return EFI_INVALID_PARAMETER; } =20 - if ((Offset + *NumBytes) > FvbDevice->BlockSize) { + Status =3D EFI_SUCCESS; + if (*NumBytes > FvbDevice->BlockSize - Offset) { *NumBytes =3D FvbDevice->BlockSize - Offset; + Status =3D EFI_BAD_BUFFER_SIZE; } =20 - FvbDataPtr =3D - (UINT8*) FvbDevice->BufferPtr + - MultU64x32 (Lba, (UINT32) FvbDevice->BlockSize) + - Offset; + FvbDataPtr =3D FvbDevice->BufferPtr; + FvbDataPtr +=3D (UINTN)Lba * FvbDevice->BlockSize; + FvbDataPtr +=3D Offset; =20 - if (*NumBytes > 0) { - CopyMem (Buffer, FvbDataPtr, *NumBytes); - PlatformFvbDataRead (This, Lba, Offset, *NumBytes, Buffer); - } - - return EFI_SUCCESS; + CopyMem (Buffer, FvbDataPtr, *NumBytes); + PlatformFvbDataRead (This, Lba, Offset, *NumBytes, Buffer); + return Status; } =20 =20 @@ -663,7 +652,7 @@ InitializeFvAndVariableStoreHeaders ( // EFI_FV_BLOCK_MAP_ENTRY BlockMap[1]; { { - 2, // UINT32 NumBlocks; + EMU_FVB_NUM_TOTAL_BLOCKS, // UINT32 NumBlocks; EMU_FVB_BLOCK_SIZE // UINT32 Length; } } @@ -745,7 +734,7 @@ FvbInitialize ( (PcdGet32 (PcdVariableStoreSize) + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) ) > - EMU_FVB_BLOCK_SIZE + EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE ) { DEBUG ((EFI_D_ERROR, "EMU Variable invalid PCD sizes\n")); return EFI_INVALID_PARAMETER; @@ -779,10 +768,7 @@ FvbInitialize ( Initialize =3D FALSE; } } else { - Ptr =3D AllocateAlignedRuntimePages ( - EFI_SIZE_TO_PAGES (EMU_FVB_SIZE), - SIZE_64KB - ); + Ptr =3D AllocateRuntimePages (EFI_SIZE_TO_PAGES (EMU_FVB_SIZE)); } =20 mEmuVarsFvb.BufferPtr =3D Ptr; @@ -808,7 +794,8 @@ FvbInitialize ( // // Initialize the Fault Tolerant Write spare block // - SubPtr =3D (VOID*) ((UINT8*) Ptr + EMU_FVB_BLOCK_SIZE); + SubPtr =3D (VOID*) ((UINT8*) Ptr + + EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE); PcdStatus =3D PcdSet32S (PcdFlashNvStorageFtwSpareBase, (UINT32)(UINTN) SubPtr); ASSERT_RETURN_ERROR (PcdStatus); --=20 2.9.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel