//\r
STATIC VOID *mGopTracker;\r
\r
+//\r
+// The driver image handle, used to obtain the device path for <ConfigHdr>.\r
+//\r
+STATIC EFI_HANDLE mImageHandle;\r
+\r
//\r
// Cache the resolutions we get from the GOP.\r
//\r
{\r
MAIN_FORM_STATE MainFormState;\r
EFI_STATUS Status;\r
+ EFI_STRING ConfigRequestHdr;\r
+ EFI_STRING ConfigRequest;\r
+ UINTN Size;\r
+ BOOLEAN AllocatedRequest;\r
\r
DEBUG ((DEBUG_VERBOSE, "%a: Request=\"%s\"\n", __FUNCTION__, Request));\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ ConfigRequestHdr = NULL;\r
+ ConfigRequest = NULL;\r
+ Size = 0;\r
+ AllocatedRequest = FALSE;\r
+\r
+ //\r
+ // Check if <ConfigHdr> matches the GUID and name\r
+ //\r
+ *Progress = Request;\r
+ if ((Request != NULL) &&\r
+ !HiiIsConfigHdrMatch (\r
+ Request,\r
+ &gOvmfPlatformConfigGuid,\r
+ mVariableName\r
+ )\r
+ )\r
+ {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
Status = PlatformConfigToFormState (&MainFormState);\r
if (EFI_ERROR (Status)) {\r
- *Progress = Request;\r
return Status;\r
}\r
\r
+ if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+ //\r
+ // Request has no <RequestElement>, so construct full request string.\r
+ // Allocate and fill a buffer large enough to hold <ConfigHdr>\r
+ // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a\r
+ // null terminator.\r
+ //\r
+ ConfigRequestHdr = HiiConstructConfigHdr (\r
+ &gOvmfPlatformConfigGuid,\r
+ mVariableName,\r
+ mImageHandle\r
+ );\r
+ if (ConfigRequestHdr == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+ ConfigRequest = AllocateZeroPool (Size);\r
+ AllocatedRequest = TRUE;\r
+ if (ConfigRequest == NULL) {\r
+ FreePool (ConfigRequestHdr);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ ConfigRequest,\r
+ Size,\r
+ L"%s&OFFSET=0&WIDTH=%016LX",\r
+ ConfigRequestHdr,\r
+ sizeof MainFormState\r
+ );\r
+ FreePool (ConfigRequestHdr);\r
+ } else {\r
+ ConfigRequest = Request;\r
+ }\r
+\r
//\r
// Answer the textual request keying off the binary form state.\r
//\r
Status = gHiiConfigRouting->BlockToConfig (\r
gHiiConfigRouting,\r
- Request,\r
+ ConfigRequest,\r
(VOID *)&MainFormState,\r
sizeof MainFormState,\r
Results,\r
DEBUG ((DEBUG_VERBOSE, "%a: Results=\"%s\"\n", __FUNCTION__, *Results));\r
}\r
\r
+ //\r
+ // If we used a newly allocated ConfigRequest, update Progress to point to\r
+ // original Request instead of ConfigRequest.\r
+ //\r
+ if (Request == NULL) {\r
+ *Progress = NULL;\r
+ } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Since we constructed ConfigRequest, failure can only occur if there\r
+ // is not enough memory. In this case, we point Progress to the first\r
+ // character of Request.\r
+ //\r
+ *Progress = Request;\r
+ } else {\r
+ //\r
+ // In case of success, we point Progress to the null terminator of\r
+ // Request.\r
+ //\r
+ *Progress = Request + StrLen (Request);\r
+ }\r
+ }\r
+\r
+ if (AllocatedRequest) {\r
+ FreePool (ConfigRequest);\r
+ }\r
+\r
return Status;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Check if <ConfigHdr> matches the GUID and name\r
+ //\r
+ *Progress = Configuration;\r
+ if ((Configuration != NULL) &&\r
+ !HiiIsConfigHdrMatch (\r
+ Configuration,\r
+ &gOvmfPlatformConfigGuid,\r
+ mVariableName\r
+ )\r
+ )\r
+ {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
//\r
// the "read" step in RMW\r
//\r
return Status;\r
}\r
\r
+ //\r
+ // Save the driver image handle.\r
+ //\r
+ mImageHandle = ImageHandle;\r
+\r
//\r
// Publish the HII package list to HII Database.\r
//\r