* [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