]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PlatformPei/Platform.c
OvmfPkg: PlatformPei: take no-exec DXE settings from the QEMU command line
[mirror_edk2.git] / OvmfPkg / PlatformPei / Platform.c
index 6a7bc52c45db3e15138cf620a4b103bdeb1d737c..a6d961673d3ac16f62d725b0ef3889dd0e2dc944 100644 (file)
@@ -242,6 +242,68 @@ MemMapInitialization (
   }\r
 }\r
 \r
+EFI_STATUS\r
+GetNamedFwCfgBoolean (\r
+  IN  CHAR8   *FwCfgFileName,\r
+  OUT BOOLEAN *Setting\r
+  )\r
+{\r
+  EFI_STATUS           Status;\r
+  FIRMWARE_CONFIG_ITEM FwCfgItem;\r
+  UINTN                FwCfgSize;\r
+  UINT8                Value[3];\r
+\r
+  Status = QemuFwCfgFindFile (FwCfgFileName, &FwCfgItem, &FwCfgSize);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  if (FwCfgSize > sizeof Value) {\r
+    return EFI_BAD_BUFFER_SIZE;\r
+  }\r
+  QemuFwCfgSelectItem (FwCfgItem);\r
+  QemuFwCfgReadBytes (FwCfgSize, Value);\r
+\r
+  if ((FwCfgSize == 1) ||\r
+      (FwCfgSize == 2 && Value[1] == '\n') ||\r
+      (FwCfgSize == 3 && Value[1] == '\r' && Value[2] == '\n')) {\r
+    switch (Value[0]) {\r
+      case '0':\r
+      case 'n':\r
+      case 'N':\r
+        *Setting = FALSE;\r
+        return EFI_SUCCESS;\r
+\r
+      case '1':\r
+      case 'y':\r
+      case 'Y':\r
+        *Setting = TRUE;\r
+        return EFI_SUCCESS;\r
+\r
+      default:\r
+        break;\r
+    }\r
+  }\r
+  return EFI_PROTOCOL_ERROR;\r
+}\r
+\r
+#define UPDATE_BOOLEAN_PCD_FROM_FW_CFG(TokenName)                   \\r
+          do {                                                      \\r
+            BOOLEAN Setting;                                        \\r
+                                                                    \\r
+            if (!EFI_ERROR (GetNamedFwCfgBoolean (                  \\r
+                              "opt/ovmf/" #TokenName, &Setting))) { \\r
+              PcdSetBool (TokenName, Setting);                      \\r
+            }                                                       \\r
+          } while (0)\r
+\r
+VOID\r
+NoexecDxeInitialization (\r
+  VOID\r
+  )\r
+{\r
+  UPDATE_BOOLEAN_PCD_FROM_FW_CFG (PcdPropertiesTableEnable);\r
+  UPDATE_BOOLEAN_PCD_FROM_FW_CFG (PcdSetNxForStack);\r
+}\r
 \r
 VOID\r
 MiscInitialization (\r
@@ -438,10 +500,9 @@ InitializePlatform (
 \r
   if (mBootMode != BOOT_ON_S3_RESUME) {\r
     ReserveEmuVariableNvStore ();\r
-\r
     PeiFvInitialization ();\r
-\r
     MemMapInitialization ();\r
+    NoexecDxeInitialization ();\r
   }\r
 \r
   MiscInitialization ();\r