]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Duplicate the original boot script data copy, because it may have INSERT boot...
authorlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 7 Dec 2012 07:56:59 +0000 (07:56 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 7 Dec 2012 07:56:59 +0000 (07:56 +0000)
2. Sync the change into LockBox for S3BootScriptMoveLastOpcode() at runtime in SMM.

Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13986 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c

index afb5ed1bb345f80d472b393297b62faa5765be65..bc3daad9160ef81298816cee4a5fca3f7bd3d134 100644 (file)
@@ -50,6 +50,10 @@ EFI_GUID                         mBootScriptDataGuid = {
   0xaea6b965, 0xdcf5, 0x4311, { 0xb4, 0xb8, 0xf, 0x12, 0x46, 0x44, 0x94, 0xd2 }\r
 };\r
 \r
+EFI_GUID                         mBootScriptDataOrgGuid = {\r
+  0xb5af1d7a, 0xb8cf, 0x4eb3, { 0x89, 0x25, 0xa8, 0x20, 0xe1, 0x6b, 0x68, 0x7d }\r
+};\r
+\r
 EFI_GUID                         mBootScriptHeaderDataGuid = {\r
   0x1810ab4a, 0x2314, 0x4df6, { 0x81, 0xeb, 0x67, 0xc6, 0xec, 0x5, 0x85, 0x91 }\r
 };\r
@@ -127,6 +131,18 @@ SaveBootScriptDataToLockBox (
   Status = SetLockBoxAttributes (&mBootScriptDataGuid, LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  //\r
+  // We need duplicate the original copy, because it may have INSERT boot script at runtime in SMM.\r
+  // If so, we should use original copy to restore data after OS rewrites the ACPINvs region.\r
+  // Or the data inserted may cause some original boot script data lost.\r
+  //\r
+  Status = SaveLockBox (\r
+             &mBootScriptDataOrgGuid,\r
+             (VOID *)mS3BootScriptTablePtr->TableBase,\r
+             mS3BootScriptTablePtr->TableLength + sizeof(EFI_BOOT_SCRIPT_TERMINATE)\r
+             );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Just need save TableBase.\r
   // Do not update other field because they will NOT be used in S3.\r
@@ -502,6 +518,7 @@ S3BootScriptGetEntryAddAddress (
   UINT8*                         NewEntryPtr;\r
   EFI_BOOT_SCRIPT_TABLE_HEADER   TableHeader;\r
   EFI_STATUS                     Status;\r
+  UINTN                          OrgLockBoxLength;\r
 \r
   if (mS3BootScriptTablePtr->AtRuntime) {\r
     //\r
@@ -528,27 +545,48 @@ S3BootScriptGetEntryAddAddress (
       //\r
       // Restore it to use original value\r
       //\r
-      RestoreLockBox (&mBootScriptDataGuid, NULL, NULL);\r
+      OrgLockBoxLength = mLockBoxLength;\r
+      Status = RestoreLockBox (\r
+                 &mBootScriptDataOrgGuid,\r
+                 (VOID *)mS3BootScriptTablePtr->TableBase,\r
+                 &OrgLockBoxLength\r
+                 );\r
+     ASSERT_EFI_ERROR (Status);\r
+     ASSERT (OrgLockBoxLength == mLockBoxLength);\r
+\r
+      //\r
+      // Update the current BootScriptData into LockBox as well\r
+      //\r
+      Status = UpdateLockBox (\r
+                 &mBootScriptDataGuid,\r
+                 0,\r
+                 (VOID *)mS3BootScriptTablePtr->TableBase,\r
+                 OrgLockBoxLength\r
+                 );\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
       //\r
-      // Copy it again to get original value\r
       // NOTE: We should NOT use TableHeader.TableLength, because it is already updated to be whole length.\r
       //\r
       mS3BootScriptTablePtr->TableLength = (UINT32)(mLockBoxLength - sizeof(EFI_BOOT_SCRIPT_TERMINATE));\r
     }\r
 \r
     NewEntryPtr  = S3BootScriptGetRuntimeEntryAddAddress (EntryLength);\r
-    //\r
-    // Now the length field is updated, need sync to lockbox.\r
-    // So in S3 resume, the data can be restored correctly.\r
-    //\r
-    CopyMem ((VOID*)&TableHeader, (VOID*)mS3BootScriptTablePtr->TableBase, sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER));\r
-    Status = UpdateLockBox (\r
-               &mBootScriptDataGuid,\r
-               OFFSET_OF(EFI_BOOT_SCRIPT_TABLE_HEADER, TableLength),\r
-               &TableHeader.TableLength,\r
-               sizeof(TableHeader.TableLength)\r
-               );\r
-    ASSERT_EFI_ERROR (Status);\r
+\r
+    if (EntryLength != 0) {\r
+      //\r
+      // Now the length field is updated, need sync to lockbox.\r
+      // So in S3 resume, the data can be restored correctly.\r
+      //\r
+      CopyMem ((VOID*)&TableHeader, (VOID*)mS3BootScriptTablePtr->TableBase, sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER));\r
+      Status = UpdateLockBox (\r
+                 &mBootScriptDataGuid,\r
+                 OFFSET_OF(EFI_BOOT_SCRIPT_TABLE_HEADER, TableLength),\r
+                 &TableHeader.TableLength,\r
+                 sizeof(TableHeader.TableLength)\r
+                 );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
   } else {   \r
     NewEntryPtr  = S3BootScriptGetBootTimeEntryAddAddress (EntryLength);\r
   }  \r
@@ -558,26 +596,36 @@ S3BootScriptGetEntryAddAddress (
 \r
 /**\r
   Sync BootScript LockBox data.\r
+\r
+  @param Script           The address from where the boot script has been added or updated.\r
+\r
 **/\r
 VOID\r
 SyncBootScript (\r
-  VOID\r
+  IN UINT8      *Script\r
   )\r
 {\r
   EFI_STATUS  Status;\r
+  UINTN       ScriptOffset;\r
+\r
+  ScriptOffset = (UINTN) (Script - mS3BootScriptTablePtr->TableBase);\r
 \r
-  if (!mS3BootScriptTablePtr->AtRuntime || !mS3BootScriptTablePtr->InSmm) {\r
+  if (!mS3BootScriptTablePtr->AtRuntime || !mS3BootScriptTablePtr->InSmm || ScriptOffset >= mLockBoxLength) {\r
+    //\r
+    // If it is not at runtime in SMM or in the range that needs to be synced in LockBox, just return.\r
+    //\r
     return ;\r
   }\r
+\r
   //\r
-  // Update Terminate\r
+  // Update BootScriptData\r
   // So in S3 resume, the data can be restored correctly.\r
   //\r
   Status = UpdateLockBox (\r
              &mBootScriptDataGuid,\r
-             mLockBoxLength - sizeof(EFI_BOOT_SCRIPT_TERMINATE),\r
-             (VOID *)((UINTN)mS3BootScriptTablePtr->TableBase + mLockBoxLength - sizeof(EFI_BOOT_SCRIPT_TERMINATE)),\r
-             sizeof(EFI_BOOT_SCRIPT_TERMINATE)\r
+             ScriptOffset,\r
+             (VOID *)((UINTN)mS3BootScriptTablePtr->TableBase + ScriptOffset),\r
+             mLockBoxLength - ScriptOffset\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 }\r
@@ -698,7 +746,7 @@ S3BootScriptSaveIoWrite (
   CopyMem ((VOID*)Script, (VOID*)&ScriptIoWrite, sizeof(EFI_BOOT_SCRIPT_IO_WRITE));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_IO_WRITE)), Buffer, WidthInByte * Count);\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -747,7 +795,7 @@ S3BootScriptSaveIoReadWrite (
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_IO_READ_WRITE)), Data, WidthInByte);\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_IO_READ_WRITE) + WidthInByte), DataMask, WidthInByte);\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -795,7 +843,7 @@ S3BootScriptSaveMemWrite (
   CopyMem ((VOID*)Script, (VOID*)&ScriptMemWrite, sizeof(EFI_BOOT_SCRIPT_MEM_WRITE));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_MEM_WRITE)), Buffer, WidthInByte * Count);\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -843,7 +891,7 @@ S3BootScriptSaveMemReadWrite (
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_MEM_READ_WRITE)), Data, WidthInByte);\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_MEM_READ_WRITE) + WidthInByte), DataMask, WidthInByte);\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -891,7 +939,7 @@ S3BootScriptSavePciCfgWrite (
   CopyMem ((VOID*)Script, (VOID*)&ScriptPciWrite,  sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE)), Buffer, WidthInByte * Count);\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -943,12 +991,12 @@ S3BootScriptSavePciCfgReadWrite (
     WidthInByte\r
     );\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 /**\r
-  Adds a record for a PCI configuration space modify operation into a specified boot script table.\r
+  Adds a record for a PCI configuration 2 space write operation into a specified boot script table.\r
 \r
   @param Width     The width of the I/O operations.Enumerated in S3_BOOT_SCRIPT_LIB_WIDTH.\r
   @param Segment   The PCI segment number for Address.\r
@@ -994,12 +1042,12 @@ S3BootScriptSavePciCfg2Write (
   CopyMem ((VOID*)Script, (VOID*)&ScriptPciWrite2, sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE)), Buffer, WidthInByte * Count);\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 /**\r
-  Adds a record for a PCI configuration space modify operation into a specified boot script table.\r
+  Adds a record for a PCI configuration space modify operation into a specified boot script table.\r
 \r
   @param Width     The width of the I/O operations.Enumerated in S3_BOOT_SCRIPT_LIB_WIDTH.\r
   @param Segment   The PCI segment number for Address.\r
@@ -1049,7 +1097,7 @@ S3BootScriptSavePciCfg2ReadWrite (
     WidthInByte\r
     );\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1100,7 +1148,7 @@ S3BootScriptSaveSmbusExecute (
     (*Length)\r
     );\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1137,12 +1185,12 @@ S3BootScriptSaveStall (
   \r
   CopyMem ((VOID*)Script, (VOID*)&ScriptStall, sizeof (EFI_BOOT_SCRIPT_STALL));\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 /**\r
-  Adds a record for an execution stall on the processor into a specified boot script table.\r
+  Adds a record for dispatching specified arbitrary code into a specified boot script table.\r
 \r
   @param EntryPoint   Entry point of the code to be dispatched.\r
   @param Context      Argument to be passed into the EntryPoint of the code to be dispatched.\r
@@ -1176,7 +1224,7 @@ S3BootScriptSaveDispatch2 (
   \r
   CopyMem ((VOID*)Script, (VOID*)&ScriptDispatch2, sizeof (EFI_BOOT_SCRIPT_DISPATCH_2));\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 \r
@@ -1234,7 +1282,7 @@ S3BootScriptSaveMemPoll (
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_MEM_POLL) + WidthInByte), BitMask, WidthInByte);\r
   CopyMem ((VOID*)Script, (VOID*)&ScriptMemPoll, sizeof (EFI_BOOT_SCRIPT_MEM_POLL)); \r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1278,7 +1326,7 @@ S3BootScriptSaveInformation (
   CopyMem ((VOID*)Script, (VOID*)&ScriptInformation, sizeof (EFI_BOOT_SCRIPT_INFORMATION));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_INFORMATION)), (VOID *) Information, (UINTN) InformationLength);\r
 \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 \r
@@ -1337,7 +1385,7 @@ S3BootScriptSaveDispatch (
   \r
   CopyMem ((VOID*)Script, (VOID*)&ScriptDispatch, sizeof (EFI_BOOT_SCRIPT_DISPATCH)); \r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 \r
@@ -1394,7 +1442,7 @@ S3BootScriptSaveIoPoll (
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_IO_POLL)), Data, WidthInByte);\r
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_IO_POLL) + WidthInByte), DataMask, WidthInByte);\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1450,7 +1498,7 @@ S3BootScriptSavePciPoll (
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_POLL)), Data, WidthInByte);\r
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG_POLL) + WidthInByte), DataMask, WidthInByte);\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1510,7 +1558,7 @@ S3BootScriptSavePci2Poll (
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL)), Data, WidthInByte);\r
   CopyMem ((UINT8 *) (Script + sizeof (EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL) + WidthInByte), DataMask, WidthInByte);\r
   \r
-  SyncBootScript ();\r
+  SyncBootScript (Script);\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -1612,10 +1660,16 @@ S3BootScriptMoveLastOpcode (
   \r
   ValidatePosition = FALSE;\r
   TempPosition = (Position == NULL) ? NULL:(*Position);\r
-  Script = mS3BootScriptTablePtr->TableBase;\r
-  if (Script == 0) {    \r
-    return EFI_OUT_OF_RESOURCES;\r
+\r
+  //\r
+  // Check that the script is initialized and synced without adding an entry to the script.\r
+  //\r
+  Script = S3BootScriptGetEntryAddAddress (0);\r
+  if (Script == NULL) {\r
+    return RETURN_OUT_OF_RESOURCES;\r
   }\r
+  Script = mS3BootScriptTablePtr->TableBase;\r
+\r
   StartAddress  = (UINTN) Script;\r
   TableLength   = mS3BootScriptTablePtr->TableLength;\r
   Script        = Script + sizeof(EFI_BOOT_SCRIPT_TABLE_HEADER);\r
@@ -1658,7 +1712,10 @@ S3BootScriptMoveLastOpcode (
   //\r
   // Copy the node to Boot script table\r
   //\r
-  CopyMem((VOID*)Script, (VOID*)TempBootScriptEntry, ScriptHeader.Length); \r
+  CopyMem((VOID*)Script, (VOID*)TempBootScriptEntry, ScriptHeader.Length);\r
+\r
+  SyncBootScript (Script);\r
+\r
   //\r
   // return out the Position\r
   //\r
@@ -1716,6 +1773,8 @@ S3BootScriptLabelInternal (
   CopyMem ((VOID*)Script, (VOID*)&ScriptInformation, sizeof (EFI_BOOT_SCRIPT_INFORMATION));\r
   CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_INFORMATION)), (VOID *) Information, (UINTN) InformationLength);\r
 \r
+  SyncBootScript (Script);\r
+\r
   return S3BootScriptMoveLastOpcode (BeforeOrAfter, Position);\r
 \r
 }\r
@@ -1770,8 +1829,8 @@ S3BootScriptLabel (
   }\r
   \r
   //\r
-  // Check that the script is initialized without adding an entry to the script.\r
-  // The code must search for the label first befor it knows if a new entry needs\r
+  // Check that the script is initialized and synced without adding an entry to the script.\r
+  // The code must search for the label first before it knows if a new entry needs\r
   // to be added.\r
   //\r
   Script = S3BootScriptGetEntryAddAddress (0);\r
@@ -1834,13 +1893,19 @@ S3BootScriptCompare (
   UINT8*                    Script;\r
   UINT32                    TableLength; \r
 \r
-  Script = mS3BootScriptTablePtr->TableBase;\r
-  if (Script == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
   if (RelativePosition == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+\r
+  //\r
+  // Check that the script is initialized and synced without adding an entry to the script.\r
+  //\r
+  Script = S3BootScriptGetEntryAddAddress (0);\r
+  if (Script == NULL) {\r
+    return RETURN_OUT_OF_RESOURCES;\r
+  }\r
+  Script = mS3BootScriptTablePtr->TableBase;\r
+\r
   //\r
   // mS3BootScriptTablePtr->TableLength does not include the termination node, so add it up\r
   //\r