public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH] BaseTools/GenSec: Support EFI_SECTION_FREEFORM_SUBTYPE_GUID sections
@ 2022-07-20 14:08 Konstantin Aladyshev
  2022-08-04 15:43 ` Bob Feng
  0 siblings, 1 reply; 2+ messages in thread
From: Konstantin Aladyshev @ 2022-07-20 14:08 UTC (permalink / raw)
  To: devel; +Cc: bob.c.feng, gaoliming, yuwei.chen, Konstantin Aladyshev

Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com>
---
 BaseTools/Source/C/GenSec/GenSec.c | 171 ++++++++++++++++++++++++++++-
 1 file changed, 169 insertions(+), 2 deletions(-)

diff --git a/BaseTools/Source/C/GenSec/GenSec.c b/BaseTools/Source/C/GenSec/GenSec.c
index 35a1ac64ea..d86cc197cc 100644
--- a/BaseTools/Source/C/GenSec/GenSec.c
+++ b/BaseTools/Source/C/GenSec/GenSec.c
@@ -988,6 +988,155 @@ Returns:
   return EFI_SUCCESS;
 }
 
+EFI_STATUS
+GenSectionSubtypeGuidSection (
+  CHAR8    **InputFileName,
+  UINT32   *InputFileAlign,
+  UINT32   InputFileNum,
+  EFI_GUID *SubTypeGuid,
+  UINT8    **OutFileBuffer
+  )
+/*++
+
+Routine Description:
+
+  Generate a section of type EFI_SECTION_FREEFORM_SUBTYPE_GUID
+  The function won't validate the input file contents.
+  The utility will add section header to the file.
+
+Arguments:
+
+  InputFileName - Name of the input file.
+
+  InputFileAlign - Alignment required by the input file data.
+
+  InputFileNum - Number of input files. Should be 1 for this section.
+
+  SubTypeGuid - Specify vendor guid value.
+
+  OutFileBuffer   - Buffer pointer to Output file contents
+
+Returns:
+
+  EFI_SUCCESS on successful return
+  EFI_INVALID_PARAMETER if InputFileNum is less than 1
+  EFI_ABORTED if unable to open input file.
+  EFI_OUT_OF_RESOURCES  No resource to complete the operation.
+
+--*/
+{
+  UINT32                TotalLength;
+  UINT32                InputLength;
+  UINT32                Offset;
+  UINT8                 *FileBuffer;
+  EFI_STATUS            Status;
+  EFI_FREEFORM_SUBTYPE_GUID_SECTION  *SubtypeGuidSect;
+  EFI_FREEFORM_SUBTYPE_GUID_SECTION2  *SubtypeGuidSect2;
+
+
+  InputLength = 0;
+  Offset      = 0;
+  FileBuffer  = NULL;
+  TotalLength = 0;
+
+  if (InputFileNum > 1) {
+    Error (NULL, 0, 2000, "Invalid parameter", "more than one input file specified");
+    return STATUS_ERROR;
+  } else if (InputFileNum < 1) {
+    Error (NULL, 0, 2000, "Invalid parameter", "no input file specified");
+    return STATUS_ERROR;
+  }
+
+  //
+  // read all input file contents into a buffer
+  // first get the size of all file contents
+  //
+  Status = GetSectionContents (
+            InputFileName,
+            InputFileAlign,
+            InputFileNum,
+            FileBuffer,
+            &InputLength
+            );
+
+  if (Status == EFI_BUFFER_TOO_SMALL) {
+    Offset = sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION);
+    if (InputLength + Offset >= MAX_SECTION_SIZE) {
+      Offset = sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION2);
+    }
+    TotalLength = InputLength + Offset;
+
+    FileBuffer = (UINT8 *) malloc (InputLength + Offset);
+    if (FileBuffer == NULL) {
+      Error (NULL, 0, 4001, "Resource", "memory cannot be allocated");
+      return EFI_OUT_OF_RESOURCES;
+    }
+    //
+    // read all input file contents into a buffer
+    //
+    Status = GetSectionContents (
+              InputFileName,
+              InputFileAlign,
+              InputFileNum,
+              FileBuffer + Offset,
+              &InputLength
+              );
+  }
+
+  if (EFI_ERROR (Status)) {
+    if (FileBuffer != NULL) {
+      free (FileBuffer);
+    }
+    Error (NULL, 0, 0001, "Error opening file for reading", InputFileName[0]);
+    return Status;
+  }
+
+  if (InputLength == 0) {
+    if (FileBuffer != NULL) {
+      free (FileBuffer);
+    }
+    Error (NULL, 0, 2000, "Invalid parameter", "the size of input file %s can't be zero", InputFileName);
+    return EFI_NOT_FOUND;
+  }
+
+  //
+  // InputLength != 0, but FileBuffer == NULL means out of resources.
+  //
+  if (FileBuffer == NULL) {
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated");
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  //
+  // Now data is in FileBuffer + Offset
+  //
+  if (TotalLength >= MAX_SECTION_SIZE) {
+    SubtypeGuidSect2 = (EFI_FREEFORM_SUBTYPE_GUID_SECTION2 *) FileBuffer;
+    SubtypeGuidSect2->CommonHeader.Type     = EFI_SECTION_GUID_DEFINED;
+    SubtypeGuidSect2->CommonHeader.Size[0]  = (UINT8) 0xff;
+    SubtypeGuidSect2->CommonHeader.Size[1]  = (UINT8) 0xff;
+    SubtypeGuidSect2->CommonHeader.Size[2]  = (UINT8) 0xff;
+    SubtypeGuidSect2->CommonHeader.ExtendedSize = InputLength + sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION2);
+    memcpy (&(SubtypeGuidSect2->SubTypeGuid), SubTypeGuid, sizeof (EFI_GUID));
+  } else {
+    SubtypeGuidSect = (EFI_FREEFORM_SUBTYPE_GUID_SECTION *) FileBuffer;
+    SubtypeGuidSect->CommonHeader.Type     = EFI_SECTION_FREEFORM_SUBTYPE_GUID;
+    SubtypeGuidSect->CommonHeader.Size[0]  = (UINT8) (TotalLength & 0xff);
+    SubtypeGuidSect->CommonHeader.Size[1]  = (UINT8) ((TotalLength & 0xff00) >> 8);
+    SubtypeGuidSect->CommonHeader.Size[2]  = (UINT8) ((TotalLength & 0xff0000) >> 16);
+    memcpy (&(SubtypeGuidSect->SubTypeGuid), SubTypeGuid, sizeof (EFI_GUID));
+  }
+
+  VerboseMsg ("the size of the created section file is %u bytes", (unsigned) TotalLength);
+
+  //
+  // Set OutFileBuffer
+  //
+  *OutFileBuffer = FileBuffer;
+
+  return EFI_SUCCESS;
+}
+
 EFI_STATUS
 FfsRebaseImageRead (
     IN      VOID    *FileHandle,
@@ -1591,14 +1740,22 @@ Returns:
   }
 
   //
-  // GuidValue is only required by Guided section.
+  // GuidValue is only required by Guided section and SubtypeGuid section.
   //
-  if ((SectType != EFI_SECTION_GUID_DEFINED) &&
+  if ((SectType != EFI_SECTION_GUID_DEFINED) && (SectType != EFI_SECTION_FREEFORM_SUBTYPE_GUID) &&
     (SectionName != NULL) &&
     (CompareGuid (&VendorGuid, &mZeroGuid) != 0)) {
     fprintf (stdout, "Warning: the input guid value is not required for this section type %s\n", SectionName);
   }
 
+  //
+  // Check whether there is GUID for the SubtypeGuid section
+  //
+  if ((SectType == EFI_SECTION_FREEFORM_SUBTYPE_GUID) && (CompareGuid (&VendorGuid, &mZeroGuid) == 0)) {
+    Error (NULL, 0, 1001, "Missing options", "GUID");
+    goto Finish;
+  }
+
   //
   // Check whether there is input file
   //
@@ -1667,6 +1824,16 @@ Returns:
               );
     break;
 
+  case EFI_SECTION_FREEFORM_SUBTYPE_GUID:
+    Status = GenSectionSubtypeGuidSection (
+              InputFileName,
+              InputFileAlign,
+              InputFileNum,
+              &VendorGuid,
+              &OutFileBuffer
+              );
+    break;
+
   case EFI_SECTION_VERSION:
     Index           = sizeof (EFI_COMMON_SECTION_HEADER);
     //
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] BaseTools/GenSec: Support EFI_SECTION_FREEFORM_SUBTYPE_GUID sections
  2022-07-20 14:08 [PATCH] BaseTools/GenSec: Support EFI_SECTION_FREEFORM_SUBTYPE_GUID sections Konstantin Aladyshev
@ 2022-08-04 15:43 ` Bob Feng
  0 siblings, 0 replies; 2+ messages in thread
From: Bob Feng @ 2022-08-04 15:43 UTC (permalink / raw)
  To: Konstantin Aladyshev, devel@edk2.groups.io; +Cc: Gao, Liming, Chen, Christine

Reviewed-by: Bob Feng <bob.c.feng@intel.com>

-----Original Message-----
From: Konstantin Aladyshev <aladyshev22@gmail.com> 
Sent: Wednesday, July 20, 2022 10:08 PM
To: devel@edk2.groups.io
Cc: Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>; Chen, Christine <yuwei.chen@intel.com>; Konstantin Aladyshev <aladyshev22@gmail.com>
Subject: [PATCH] BaseTools/GenSec: Support EFI_SECTION_FREEFORM_SUBTYPE_GUID sections

Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com>
---
 BaseTools/Source/C/GenSec/GenSec.c | 171 ++++++++++++++++++++++++++++-
 1 file changed, 169 insertions(+), 2 deletions(-)

diff --git a/BaseTools/Source/C/GenSec/GenSec.c b/BaseTools/Source/C/GenSec/GenSec.c
index 35a1ac64ea..d86cc197cc 100644
--- a/BaseTools/Source/C/GenSec/GenSec.c
+++ b/BaseTools/Source/C/GenSec/GenSec.c
@@ -988,6 +988,155 @@ Returns:
   return EFI_SUCCESS;

 }

 

+EFI_STATUS

+GenSectionSubtypeGuidSection (

+  CHAR8    **InputFileName,

+  UINT32   *InputFileAlign,

+  UINT32   InputFileNum,

+  EFI_GUID *SubTypeGuid,

+  UINT8    **OutFileBuffer

+  )

+/*++

+

+Routine Description:

+

+  Generate a section of type EFI_SECTION_FREEFORM_SUBTYPE_GUID

+  The function won't validate the input file contents.

+  The utility will add section header to the file.

+

+Arguments:

+

+  InputFileName - Name of the input file.

+

+  InputFileAlign - Alignment required by the input file data.

+

+  InputFileNum - Number of input files. Should be 1 for this section.

+

+  SubTypeGuid - Specify vendor guid value.

+

+  OutFileBuffer   - Buffer pointer to Output file contents

+

+Returns:

+

+  EFI_SUCCESS on successful return

+  EFI_INVALID_PARAMETER if InputFileNum is less than 1

+  EFI_ABORTED if unable to open input file.

+  EFI_OUT_OF_RESOURCES  No resource to complete the operation.

+

+--*/

+{

+  UINT32                TotalLength;

+  UINT32                InputLength;

+  UINT32                Offset;

+  UINT8                 *FileBuffer;

+  EFI_STATUS            Status;

+  EFI_FREEFORM_SUBTYPE_GUID_SECTION  *SubtypeGuidSect;

+  EFI_FREEFORM_SUBTYPE_GUID_SECTION2  *SubtypeGuidSect2;

+

+

+  InputLength = 0;

+  Offset      = 0;

+  FileBuffer  = NULL;

+  TotalLength = 0;

+

+  if (InputFileNum > 1) {

+    Error (NULL, 0, 2000, "Invalid parameter", "more than one input file specified");

+    return STATUS_ERROR;

+  } else if (InputFileNum < 1) {

+    Error (NULL, 0, 2000, "Invalid parameter", "no input file specified");

+    return STATUS_ERROR;

+  }

+

+  //

+  // read all input file contents into a buffer

+  // first get the size of all file contents

+  //

+  Status = GetSectionContents (

+            InputFileName,

+            InputFileAlign,

+            InputFileNum,

+            FileBuffer,

+            &InputLength

+            );

+

+  if (Status == EFI_BUFFER_TOO_SMALL) {

+    Offset = sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION);

+    if (InputLength + Offset >= MAX_SECTION_SIZE) {

+      Offset = sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION2);

+    }

+    TotalLength = InputLength + Offset;

+

+    FileBuffer = (UINT8 *) malloc (InputLength + Offset);

+    if (FileBuffer == NULL) {

+      Error (NULL, 0, 4001, "Resource", "memory cannot be allocated");

+      return EFI_OUT_OF_RESOURCES;

+    }

+    //

+    // read all input file contents into a buffer

+    //

+    Status = GetSectionContents (

+              InputFileName,

+              InputFileAlign,

+              InputFileNum,

+              FileBuffer + Offset,

+              &InputLength

+              );

+  }

+

+  if (EFI_ERROR (Status)) {

+    if (FileBuffer != NULL) {

+      free (FileBuffer);

+    }

+    Error (NULL, 0, 0001, "Error opening file for reading", InputFileName[0]);

+    return Status;

+  }

+

+  if (InputLength == 0) {

+    if (FileBuffer != NULL) {

+      free (FileBuffer);

+    }

+    Error (NULL, 0, 2000, "Invalid parameter", "the size of input file %s can't be zero", InputFileName);

+    return EFI_NOT_FOUND;

+  }

+

+  //

+  // InputLength != 0, but FileBuffer == NULL means out of resources.

+  //

+  if (FileBuffer == NULL) {

+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated");

+    return EFI_OUT_OF_RESOURCES;

+  }

+

+  //

+  // Now data is in FileBuffer + Offset

+  //

+  if (TotalLength >= MAX_SECTION_SIZE) {

+    SubtypeGuidSect2 = (EFI_FREEFORM_SUBTYPE_GUID_SECTION2 *) FileBuffer;

+    SubtypeGuidSect2->CommonHeader.Type     = EFI_SECTION_GUID_DEFINED;

+    SubtypeGuidSect2->CommonHeader.Size[0]  = (UINT8) 0xff;

+    SubtypeGuidSect2->CommonHeader.Size[1]  = (UINT8) 0xff;

+    SubtypeGuidSect2->CommonHeader.Size[2]  = (UINT8) 0xff;

+    SubtypeGuidSect2->CommonHeader.ExtendedSize = InputLength + sizeof (EFI_FREEFORM_SUBTYPE_GUID_SECTION2);

+    memcpy (&(SubtypeGuidSect2->SubTypeGuid), SubTypeGuid, sizeof (EFI_GUID));

+  } else {

+    SubtypeGuidSect = (EFI_FREEFORM_SUBTYPE_GUID_SECTION *) FileBuffer;

+    SubtypeGuidSect->CommonHeader.Type     = EFI_SECTION_FREEFORM_SUBTYPE_GUID;

+    SubtypeGuidSect->CommonHeader.Size[0]  = (UINT8) (TotalLength & 0xff);

+    SubtypeGuidSect->CommonHeader.Size[1]  = (UINT8) ((TotalLength & 0xff00) >> 8);

+    SubtypeGuidSect->CommonHeader.Size[2]  = (UINT8) ((TotalLength & 0xff0000) >> 16);

+    memcpy (&(SubtypeGuidSect->SubTypeGuid), SubTypeGuid, sizeof (EFI_GUID));

+  }

+

+  VerboseMsg ("the size of the created section file is %u bytes", (unsigned) TotalLength);

+

+  //

+  // Set OutFileBuffer

+  //

+  *OutFileBuffer = FileBuffer;

+

+  return EFI_SUCCESS;

+}

+

 EFI_STATUS

 FfsRebaseImageRead (

     IN      VOID    *FileHandle,

@@ -1591,14 +1740,22 @@ Returns:
   }

 

   //

-  // GuidValue is only required by Guided section.

+  // GuidValue is only required by Guided section and SubtypeGuid section.

   //

-  if ((SectType != EFI_SECTION_GUID_DEFINED) &&

+  if ((SectType != EFI_SECTION_GUID_DEFINED) && (SectType != EFI_SECTION_FREEFORM_SUBTYPE_GUID) &&

     (SectionName != NULL) &&

     (CompareGuid (&VendorGuid, &mZeroGuid) != 0)) {

     fprintf (stdout, "Warning: the input guid value is not required for this section type %s\n", SectionName);

   }

 

+  //

+  // Check whether there is GUID for the SubtypeGuid section

+  //

+  if ((SectType == EFI_SECTION_FREEFORM_SUBTYPE_GUID) && (CompareGuid (&VendorGuid, &mZeroGuid) == 0)) {

+    Error (NULL, 0, 1001, "Missing options", "GUID");

+    goto Finish;

+  }

+

   //

   // Check whether there is input file

   //

@@ -1667,6 +1824,16 @@ Returns:
               );

     break;

 

+  case EFI_SECTION_FREEFORM_SUBTYPE_GUID:

+    Status = GenSectionSubtypeGuidSection (

+              InputFileName,

+              InputFileAlign,

+              InputFileNum,

+              &VendorGuid,

+              &OutFileBuffer

+              );

+    break;

+

   case EFI_SECTION_VERSION:

     Index           = sizeof (EFI_COMMON_SECTION_HEADER);

     //

-- 
2.25.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-08-04 15:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-20 14:08 [PATCH] BaseTools/GenSec: Support EFI_SECTION_FREEFORM_SUBTYPE_GUID sections Konstantin Aladyshev
2022-08-04 15:43 ` Bob Feng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox