public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Leif Lindholm" <leif@nuviainc.com>
To: devel@edk2.groups.io
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>, macarl@microsoft.com
Subject: [RFC 5/5] EmbeddedPkg/PrePiLib: break section extraction info into helper function
Date: Wed,  1 Jul 2020 21:01:18 +0100	[thread overview]
Message-ID: <20200701200118.3972-6-leif@nuviainc.com> (raw)
In-Reply-To: <20200701200118.3972-1-leif@nuviainc.com>

Create a new helper function FfsGetExtractionInfo, which handles figuring
out the buffer sizes needed for extracting UefiCompressed or
GuidedSection sections, and also hides away some of the differences
between the two, getting rid of a bunch of local variables.

Signed-off-by: Leif Lindholm <leif@nuviainc.com>
---
 EmbeddedPkg/Library/PrePiLib/FwVol.c | 90 +++++++++++++++++-----------
 1 file changed, 55 insertions(+), 35 deletions(-)

diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c
index 083bc27efead..d0f91efa77a1 100644
--- a/EmbeddedPkg/Library/PrePiLib/FwVol.c
+++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c
@@ -318,6 +318,50 @@ FfsCompressionSectionHeaderSize (
   return sizeof (EFI_COMPRESSION_SECTION);
 }
 
+STATIC
+EFI_STATUS
+FfsGetExtractionInfo (
+  IN      EFI_COMMON_SECTION_HEADER               *Section,
+  OUT     UINT32                                  *SectionLength,
+  IN OUT  VOID                                    **SrcBuffer,
+  OUT     UINT32                                  *DstBufferSize,
+  OUT     UINT32                                  *ScratchBufferSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if (Section->Type == EFI_SECTION_COMPRESSION) {
+    *SectionLength = FfsSectionLength (Section);
+
+    if (FfsSectionCompressionType (Section) != EFI_STANDARD_COMPRESSION) {
+      return EFI_UNSUPPORTED;
+    }
+
+    *SrcBuffer = (VOID *)((UINTN)Section + FfsCompressionSectionHeaderSize (Section));
+    Status = UefiDecompressGetInfo (
+               *SrcBuffer,
+               *SectionLength - FfsCompressionSectionHeaderSize (Section),
+               DstBufferSize,
+               ScratchBufferSize
+               );
+  } else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
+    UINT16 Ignored;
+
+    *SrcBuffer = Section;
+
+    Status = ExtractGuidedSectionGetInfo (
+               *SrcBuffer,
+               DstBufferSize,
+               ScratchBufferSize,
+               &Ignored      // SectionAttribute not used by this library
+               );
+  } else {
+    Status = EFI_UNSUPPORTED;
+  }
+
+  return Status;
+}
+
 /**
   Go through the file to search SectionType section,
   when meeting an encapsuled section.
@@ -344,15 +388,11 @@ FfsProcessSection (
   VOID                                    *ScratchBuffer;
   UINT32                                  ScratchBufferSize;
   VOID                                    *DstBuffer;
-  UINT16                                  SectionAttribute;
-  UINT32                                  AuthenticationStatus;
-  CHAR8                                   *CompressedData;
-  UINTN                                   CompressedDataLength;
-
+  VOID                                    *SrcBuffer;
 
   *OutputBuffer = NULL;
   ParsedLength  = 0;
-  Status        = EFI_NOT_FOUND;
+
   while (ParsedLength < SectionSize) {
     if (IS_SECTION2 (Section)) {
       ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
@@ -364,32 +404,11 @@ FfsProcessSection (
       return EFI_SUCCESS;
     }
 
+    SectionLength = FfsSectionLength (Section);
+
     if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) {
-      if (Section->Type == EFI_SECTION_COMPRESSION) {
-        SectionLength = FfsSectionLength (Section);
-
-        if (FfsSectionCompressionType (Section) != EFI_STANDARD_COMPRESSION) {
-          return EFI_UNSUPPORTED;
-        }
-
-        CompressedData = (VOID *)((UINTN)Section + FfsCompressionSectionHeaderSize (Section));
-        CompressedDataLength = SectionLength - FfsCompressionSectionHeaderSize (Section);
-
-        Status = UefiDecompressGetInfo (
-                   CompressedData,
-                   CompressedDataLength,
-                   &DstBufferSize,
-                   &ScratchBufferSize
-                   );
-      } else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
-        Status = ExtractGuidedSectionGetInfo (
-                   Section,
-                   &DstBufferSize,
-                   &ScratchBufferSize,
-                   &SectionAttribute
-                   );
-      }
-
+      Status = FfsGetExtractionInfo (Section, &SectionLength, &SrcBuffer,
+                                     &DstBufferSize, &ScratchBufferSize);
       if (EFI_ERROR (Status)) {
         //
         // GetInfo failed
@@ -421,16 +440,18 @@ FfsProcessSection (
       //
       if (Section->Type == EFI_SECTION_COMPRESSION) {
         Status = UefiDecompress (
-                   CompressedData,
+                   SrcBuffer,
                    DstBuffer,
                    ScratchBuffer
                    );
       } else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
+        UINT32  Ignored;
+
         Status = ExtractGuidedSectionDecode (
-                   Section,
+                   SrcBuffer,
                    &DstBuffer,
                    ScratchBuffer,
-                   &AuthenticationStatus
+                   &Ignored  // AuthenticationStatus not used by this library
                    );
       }
 
@@ -450,7 +471,6 @@ FfsProcessSection (
        }
     }
 
-    SectionLength = FfsSectionLength (Section);
     //
     // SectionLength is adjusted it is 4 byte aligned.
     // Go to the next section
-- 
2.20.1


  parent reply	other threads:[~2020-07-01 20:01 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-01 20:01 [RFC 0/5] EmbeddedPkg/PrePiLib: rework FfsProcessSection Leif Lindholm
2020-07-01 20:01 ` [RFC 1/5] EmbeddedPkg/PrePiLib: style cleanup in FwVol.c Leif Lindholm
2020-07-01 20:01 ` [RFC 2/5] EmbeddedPkg/PrePiLib: drop else if after return Leif Lindholm
2020-07-01 20:01 ` [RFC 3/5] EmbeddedPkg/PrePiLib: refactor IS_SECTION2() handling Leif Lindholm
2020-07-01 20:01 ` [RFC 4/5] EmbeddedPkg/PrePiLib: drop spurious re-init of CompressedData Leif Lindholm
2020-07-01 20:01 ` Leif Lindholm [this message]
2020-07-02  6:22 ` [RFC 0/5] EmbeddedPkg/PrePiLib: rework FfsProcessSection Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200701200118.3972-6-leif@nuviainc.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox