From: "Dimitrije Pavlov" <Dimitrije.Pavlov@arm.com>
To: devel@edk2.groups.io
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
Jiewen Yao <jiewen.yao@intel.com>,
Liming Gao <gaoliming@byosoft.com.cn>,
Sunny Wang <Sunny.Wang@arm.com>,
Jeff Booher-Kaeding <Jeff.Booher-Kaeding@arm.com>,
Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
Subject: [PATCH v1 1/1] OvmfPkg/PlatformDxe: Handle all requests in ExtractConfig and RouteConfig
Date: Thu, 18 Aug 2022 14:58:42 -0500 [thread overview]
Message-ID: <20220818195842.3318813-1-dimitrije.pavlov@arm.com> (raw)
Per the UEFI specification, if the Request argument in
EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig() is NULL or does not contain
any request elements, the implementation should return all of the settings
being abstracted for the particular ConfigHdr reference.
The current implementation returns EFI_INVALID_PARAMETER if Request is
NULL or does not contain any request elements. Instead, construct
a new ConfigRequest to handle these cases per the specification.
In addition, per the UEFI specification, if the Configuration argument in
EFI_HII_CONFIG_ACCESS_PROTOCOL.RouteConfig() has a ConfigHdr that
specifies a non-existing target, the implementation should return
EFI_NOT_FOUND.
The current implementation returns EFI_INVALID_PARAMETER if Configuration
has a non-existing target in ConfigHdr. Instead, perform a check and
return EFI_NOT_FOUND in this case.
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Sunny Wang <Sunny.Wang@arm.com>
Cc: Jeff Booher-Kaeding <Jeff.Booher-Kaeding@arm.com>
Cc: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
Signed-off-by: Dimitrije Pavlov <Dimitrije.Pavlov@arm.com>
---
OvmfPkg/PlatformDxe/PlatformConfig.h | 2 +
OvmfPkg/PlatformDxe/Platform.c | 115 +++++++++++++++++++-
OvmfPkg/PlatformDxe/PlatformConfig.c | 2 +-
3 files changed, 116 insertions(+), 3 deletions(-)
diff --git a/OvmfPkg/PlatformDxe/PlatformConfig.h b/OvmfPkg/PlatformDxe/PlatformConfig.h
index 902c9b2ce043..5d9b457b1b4b 100644
--- a/OvmfPkg/PlatformDxe/PlatformConfig.h
+++ b/OvmfPkg/PlatformDxe/PlatformConfig.h
@@ -50,4 +50,6 @@ PlatformConfigLoad (
#define PLATFORM_CONFIG_F_GRAPHICS_RESOLUTION BIT0
#define PLATFORM_CONFIG_F_DOWNGRADE BIT63
+extern CHAR16 mVariableName[];
+
#endif // _PLATFORM_CONFIG_H_
diff --git a/OvmfPkg/PlatformDxe/Platform.c b/OvmfPkg/PlatformDxe/Platform.c
index a6d459f3dfd7..0e32c6e76037 100644
--- a/OvmfPkg/PlatformDxe/Platform.c
+++ b/OvmfPkg/PlatformDxe/Platform.c
@@ -108,6 +108,11 @@ STATIC EFI_EVENT mGopEvent;
//
STATIC VOID *mGopTracker;
+//
+// The driver image handle, used to obtain the device path for <ConfigHdr>.
+//
+STATIC EFI_HANDLE mImageHandle;
+
//
// Cache the resolutions we get from the GOP.
//
@@ -229,6 +234,10 @@ ExtractConfig (
{
MAIN_FORM_STATE MainFormState;
EFI_STATUS Status;
+ EFI_STRING ConfigRequestHdr;
+ EFI_STRING ConfigRequest;
+ UINTN Size;
+ BOOLEAN AllocatedRequest;
DEBUG ((DEBUG_VERBOSE, "%a: Request=\"%s\"\n", __FUNCTION__, Request));
@@ -236,18 +245,73 @@ ExtractConfig (
return EFI_INVALID_PARAMETER;
}
+ ConfigRequestHdr = NULL;
+ ConfigRequest = NULL;
+ Size = 0;
+ AllocatedRequest = FALSE;
+
+ //
+ // Check if <ConfigHdr> matches the GUID and name
+ //
+ *Progress = Request;
+ if ((Request != NULL) &&
+ !HiiIsConfigHdrMatch (
+ Request,
+ &gOvmfPlatformConfigGuid,
+ mVariableName
+ )
+ )
+ {
+ return EFI_NOT_FOUND;
+ }
+
Status = PlatformConfigToFormState (&MainFormState);
if (EFI_ERROR (Status)) {
- *Progress = Request;
return Status;
}
+ if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
+ //
+ // Request has no <RequestElement>, so construct full request string.
+ // Allocate and fill a buffer large enough to hold <ConfigHdr>
+ // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a
+ // null terminator.
+ //
+ ConfigRequestHdr = HiiConstructConfigHdr (
+ &gOvmfPlatformConfigGuid,
+ mVariableName,
+ mImageHandle
+ );
+ if (ConfigRequestHdr == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+ ConfigRequest = AllocateZeroPool (Size);
+ AllocatedRequest = TRUE;
+ if (ConfigRequest == NULL) {
+ FreePool (ConfigRequestHdr);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ UnicodeSPrint (
+ ConfigRequest,
+ Size,
+ L"%s&OFFSET=0&WIDTH=%016LX",
+ ConfigRequestHdr,
+ sizeof MainFormState
+ );
+ FreePool (ConfigRequestHdr);
+ } else {
+ ConfigRequest = Request;
+ }
+
//
// Answer the textual request keying off the binary form state.
//
Status = gHiiConfigRouting->BlockToConfig (
gHiiConfigRouting,
- Request,
+ ConfigRequest,
(VOID *)&MainFormState,
sizeof MainFormState,
Results,
@@ -265,6 +329,33 @@ ExtractConfig (
DEBUG ((DEBUG_VERBOSE, "%a: Results=\"%s\"\n", __FUNCTION__, *Results));
}
+ //
+ // If we used a newly allocated ConfigRequest, update Progress to point to
+ // original Request instead of ConfigRequest.
+ //
+ if (Request == NULL) {
+ *Progress = NULL;
+ } else if (StrStr (Request, L"OFFSET") == NULL) {
+ if (EFI_ERROR (Status)) {
+ //
+ // Since we constructed ConfigRequest, failure can only occur if there
+ // is not enough memory. In this case, we point Progress to the first
+ // character of Request.
+ //
+ *Progress = Request;
+ } else {
+ //
+ // In case of success, we point Progress to the null terminator of
+ // Request.
+ //
+ *Progress = Request + StrLen (Request);
+ }
+ }
+
+ if (AllocatedRequest) {
+ FreePool (ConfigRequest);
+ }
+
return Status;
}
@@ -348,6 +439,21 @@ RouteConfig (
return EFI_INVALID_PARAMETER;
}
+ //
+ // Check if <ConfigHdr> matches the GUID and name
+ //
+ *Progress = Configuration;
+ if ((Configuration != NULL) &&
+ !HiiIsConfigHdrMatch (
+ Configuration,
+ &gOvmfPlatformConfigGuid,
+ mVariableName
+ )
+ )
+ {
+ return EFI_NOT_FOUND;
+ }
+
//
// the "read" step in RMW
//
@@ -866,6 +972,11 @@ PlatformInit (
return Status;
}
+ //
+ // Save the driver image handle.
+ //
+ mImageHandle = ImageHandle;
+
//
// Publish the HII package list to HII Database.
//
diff --git a/OvmfPkg/PlatformDxe/PlatformConfig.c b/OvmfPkg/PlatformDxe/PlatformConfig.c
index e202ac5b4798..f5ac2d0609ff 100644
--- a/OvmfPkg/PlatformDxe/PlatformConfig.c
+++ b/OvmfPkg/PlatformDxe/PlatformConfig.c
@@ -21,7 +21,7 @@
//
// Name of the UEFI variable that we use for persistent storage.
//
-STATIC CHAR16 mVariableName[] = L"PlatformConfig";
+CHAR16 mVariableName[] = L"PlatformConfig";
/**
Serialize and persistently save platform configuration.
--
2.37.2
next reply other threads:[~2022-08-18 19:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-18 19:58 Dimitrije Pavlov [this message]
2022-09-05 12:01 ` [PATCH v1 1/1] OvmfPkg/PlatformDxe: Handle all requests in ExtractConfig and RouteConfig Ard Biesheuvel
2022-09-05 12:11 ` Samer El-Haj-Mahmoud
2022-09-05 13:53 ` [edk2-devel] " 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=20220818195842.3318813-1-dimitrije.pavlov@arm.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