]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/SmmS3SaveState/SmmS3SaveState.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / SmmS3SaveState / SmmS3SaveState.c
index d0652d3fd8fc068c27678f9138489e183413d8d6..bf5a2ae73e9f93a1f3a60b29c356d2e89c039216 100644 (file)
@@ -1,26 +1,20 @@
 /** @file\r
   Implementation for S3 SMM Boot Script Saver state driver.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions\r
-  of the BSD License which accompanies this distribution.  The\r
-  full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include "InternalSmmSaveState.h"\r
 \r
-EFI_S3_SMM_SAVE_STATE_PROTOCOL    mS3SmmSaveState = {\r
-   BootScriptWrite,\r
-   BootScriptInsert,\r
-   BootScriptLabel,\r
-   BootScriptCompare\r
-  };\r
+EFI_S3_SMM_SAVE_STATE_PROTOCOL  mS3SmmSaveState = {\r
+  BootScriptWrite,\r
+  BootScriptInsert,\r
+  BootScriptLabel,\r
+  BootScriptCompare\r
+};\r
+\r
 /**\r
   Internal function to add IO write opcode to the table.\r
 \r
@@ -33,21 +27,22 @@ EFI_S3_SMM_SAVE_STATE_PROTOCOL    mS3SmmSaveState = {
 **/\r
 EFI_STATUS\r
 BootScriptWriteIoWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINTN                 Count;\r
-  UINT8                 *Buffer;\r
-\r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Count       = VA_ARG (Marker, UINTN);\r
-  Buffer      = VA_ARG (Marker, UINT8 *);\r
-  \r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINTN                     Count;\r
+  UINT8                     *Buffer;\r
+\r
+  Width   = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address = VA_ARG (Marker, UINT64);\r
+  Count   = VA_ARG (Marker, UINTN);\r
+  Buffer  = VA_ARG (Marker, UINT8 *);\r
+\r
   return S3BootScriptSaveIoWrite (Width, Address, Count, Buffer);\r
 }\r
+\r
 /**\r
   Internal function to add IO read/write opcode to the table.\r
 \r
@@ -60,19 +55,19 @@ BootScriptWriteIoWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWriteIoReadWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINT8                 *Data;\r
-  UINT8                 *DataMask;\r
\r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Data        = VA_ARG (Marker, UINT8 *);\r
-  DataMask    = VA_ARG (Marker, UINT8 *);\r
-  \r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINT8                     *Data;\r
+  UINT8                     *DataMask;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, UINT8 *);\r
+  DataMask = VA_ARG (Marker, UINT8 *);\r
+\r
   return S3BootScriptSaveIoReadWrite (Width, Address, Data, DataMask);\r
 }\r
 \r
@@ -88,18 +83,18 @@ BootScriptWriteIoReadWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWriteMemWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINTN                 Count;\r
-  UINT8                 *Buffer;\r
\r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Count       = VA_ARG (Marker, UINTN);\r
-  Buffer      = VA_ARG (Marker, UINT8 *);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINTN                     Count;\r
+  UINT8                     *Buffer;\r
+\r
+  Width   = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address = VA_ARG (Marker, UINT64);\r
+  Count   = VA_ARG (Marker, UINTN);\r
+  Buffer  = VA_ARG (Marker, UINT8 *);\r
 \r
   return S3BootScriptSaveMemWrite (Width, Address, Count, Buffer);\r
 }\r
@@ -116,18 +111,18 @@ BootScriptWriteMemWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWriteMemReadWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINT8                 *Data;\r
-  UINT8                 *DataMask;\r
-  \r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Data        = VA_ARG (Marker, UINT8 *);\r
-  DataMask    = VA_ARG (Marker, UINT8 *);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINT8                     *Data;\r
+  UINT8                     *DataMask;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, UINT8 *);\r
+  DataMask = VA_ARG (Marker, UINT8 *);\r
 \r
   return S3BootScriptSaveMemReadWrite (Width, Address, Data, DataMask);\r
 }\r
@@ -144,18 +139,18 @@ BootScriptWriteMemReadWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciCfgWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINTN                 Count;\r
-  UINT8                 *Buffer;\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINTN                     Count;\r
+  UINT8                     *Buffer;\r
 \r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Count       = VA_ARG (Marker, UINTN);\r
-  Buffer      = VA_ARG (Marker, UINT8 *);\r
+  Width   = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address = VA_ARG (Marker, UINT64);\r
+  Count   = VA_ARG (Marker, UINTN);\r
+  Buffer  = VA_ARG (Marker, UINT8 *);\r
 \r
   return S3BootScriptSavePciCfgWrite (Width, Address, Count, Buffer);\r
 }\r
@@ -172,21 +167,22 @@ BootScriptWritePciCfgWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciCfgReadWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINT8                 *Data;\r
-  UINT8                 *DataMask;\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINT8                     *Data;\r
+  UINT8                     *DataMask;\r
 \r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Data        = VA_ARG (Marker, UINT8 *);\r
-  DataMask    = VA_ARG (Marker, UINT8 *);\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, UINT8 *);\r
+  DataMask = VA_ARG (Marker, UINT8 *);\r
 \r
   return S3BootScriptSavePciCfgReadWrite (Width, Address, Data, DataMask);\r
 }\r
+\r
 /**\r
   Internal function to add PciCfg2 write opcode to the table.\r
 \r
@@ -199,20 +195,20 @@ BootScriptWritePciCfgReadWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciCfg2Write (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT64                Address;\r
-  UINTN                 Count;\r
-  UINT8                 *Buffer;\r
-  UINT16                Segment;\r
-\r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Count       = VA_ARG (Marker, UINTN);\r
-  Buffer      = VA_ARG (Marker, UINT8 *);\r
-  Segment     = VA_ARG (Marker, UINT16);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  UINTN                     Count;\r
+  UINT8                     *Buffer;\r
+  UINT16                    Segment;\r
+\r
+  Width   = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Segment = VA_ARG (Marker, UINT16);\r
+  Address = VA_ARG (Marker, UINT64);\r
+  Count   = VA_ARG (Marker, UINTN);\r
+  Buffer  = VA_ARG (Marker, UINT8 *);\r
 \r
   return S3BootScriptSavePciCfg2Write (Width, Segment, Address, Count, Buffer);\r
 }\r
@@ -229,25 +225,26 @@ BootScriptWritePciCfg2Write (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciCfg2ReadWrite (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH Width;\r
-  UINT16                Segment;\r
-  UINT64                Address;\r
-  UINT8                 *Data;\r
-  UINT8                 *DataMask;\r
\r
-  Width       = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
-  Address     = VA_ARG (Marker, UINT64);\r
-  Segment     = VA_ARG (Marker, UINT16);\r
-  Data        = VA_ARG (Marker, UINT8 *);\r
-  DataMask    = VA_ARG (Marker, UINT8 *);\r
\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT16                    Segment;\r
+  UINT64                    Address;\r
+  UINT8                     *Data;\r
+  UINT8                     *DataMask;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Segment  = VA_ARG (Marker, UINT16);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, UINT8 *);\r
+  DataMask = VA_ARG (Marker, UINT8 *);\r
+\r
   return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);\r
 }\r
+\r
 /**\r
-  Internal function to add smbus excute opcode to the table.\r
+  Internal function to add smbus execute opcode to the table.\r
 \r
   @param  Marker                The variable argument list to get the opcode\r
                                 and associated attributes.\r
@@ -258,27 +255,28 @@ BootScriptWritePciCfg2ReadWrite (
 **/\r
 EFI_STATUS\r
 BootScriptWriteSmbusExecute (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
   EFI_SMBUS_DEVICE_ADDRESS  SlaveAddress;\r
   EFI_SMBUS_DEVICE_COMMAND  Command;\r
   EFI_SMBUS_OPERATION       Operation;\r
   BOOLEAN                   PecCheck;\r
-  VOID                     *Buffer;\r
-  UINTN                    *DataSize;\r
+  VOID                      *Buffer;\r
+  UINTN                     *DataSize;\r
   UINTN                     SmBusAddress;\r
-  \r
+\r
   SlaveAddress.SmbusDeviceAddress = VA_ARG (Marker, UINTN);\r
   Command                         = VA_ARG (Marker, EFI_SMBUS_DEVICE_COMMAND);\r
   Operation                       = VA_ARG (Marker, EFI_SMBUS_OPERATION);\r
   PecCheck                        = VA_ARG (Marker, BOOLEAN);\r
-  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress,Command,0,PecCheck);\r
-  DataSize                        = VA_ARG (Marker, UINTN *);    \r
+  SmBusAddress                    = SMBUS_LIB_ADDRESS (SlaveAddress.SmbusDeviceAddress, Command, 0, PecCheck);\r
+  DataSize                        = VA_ARG (Marker, UINTN *);\r
   Buffer                          = VA_ARG (Marker, VOID *);\r
\r
+\r
   return S3BootScriptSaveSmbusExecute (SmBusAddress, Operation, DataSize, Buffer);\r
 }\r
+\r
 /**\r
   Internal function to add stall opcode to the table.\r
 \r
@@ -291,18 +289,18 @@ BootScriptWriteSmbusExecute (
 **/\r
 EFI_STATUS\r
 BootScriptWriteStall (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  UINT32                Duration;\r
+  UINT32  Duration;\r
 \r
-  Duration    = VA_ARG (Marker, UINT32);\r
+  Duration = VA_ARG (Marker, UINT32);\r
 \r
   return S3BootScriptSaveStall (Duration);\r
 }\r
 \r
 /**\r
-  Internal function to add Save jmp address according to DISPATCH_OPCODE. \r
+  Internal function to add Save jmp address according to DISPATCH_OPCODE.\r
   We ignore "Context" parameter\r
 \r
   @param  Marker                The variable argument list to get the opcode\r
@@ -314,18 +312,18 @@ BootScriptWriteStall (
 **/\r
 EFI_STATUS\r
 BootScriptWriteDispatch (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  VOID        *EntryPoint;\r
+  VOID  *EntryPoint;\r
 \r
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
+  EntryPoint = (VOID *)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
   return S3BootScriptSaveDispatch (EntryPoint);\r
 }\r
 \r
 /**\r
-  Internal function to add memory pool operation to the table. \r
\r
+  Internal function to add memory pool operation to the table.\r
+\r
   @param  Marker                The variable argument list to get the opcode\r
                                 and associated attributes.\r
 \r
@@ -335,29 +333,46 @@ BootScriptWriteDispatch (
 **/\r
 EFI_STATUS\r
 BootScriptWriteMemPoll (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  S3_BOOT_SCRIPT_LIB_WIDTH   Width;                                   \r
-  UINT64                     Address;                                    \r
-  VOID                      *Data;                                       \r
-  VOID                      *DataMask;                                   \r
-  UINTN                      Delay;                                       \r
-                                                                         \r
-  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);                  \r
-  Address  = VA_ARG (Marker, UINT64);                                    \r
-  Data     = VA_ARG (Marker, VOID *);                                    \r
-  DataMask = VA_ARG (Marker, VOID *);                                    \r
-  Delay    = (UINTN)VA_ARG (Marker, UINT64);                            \r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  VOID                      *Data;\r
+  VOID                      *DataMask;\r
+  UINT64                    Delay;\r
+  UINT64                    LoopTimes;\r
+  UINT32                    Remainder;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, VOID *);\r
+  DataMask = VA_ARG (Marker, VOID *);\r
+  Delay    = VA_ARG (Marker, UINT64);\r
+  //\r
+  // According to the spec, the interval between 2 polls is 100ns,\r
+  // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns).\r
+  // Duration * 1000ns * LoopTimes = Delay * 100ns\r
+  // Duration will be minimum 1(microsecond) to be minimum deviation,\r
+  // so LoopTimes = Delay / 10.\r
   //\r
-  // According to the spec, the interval between 2 pools is 100ns\r
-  //                                                                       \r
-  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 100, Delay); \r
+  LoopTimes = DivU64x32Remainder (\r
+                Delay,\r
+                10,\r
+                &Remainder\r
+                );\r
+  if (Remainder != 0) {\r
+    //\r
+    // If Remainder is not zero, LoopTimes will be rounded up by 1.\r
+    //\r
+    LoopTimes += 1;\r
+  }\r
 \r
+  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes);\r
 }\r
 \r
 /**\r
-  Internal function to add Save jmp address according to DISPATCH_OPCODE2. \r
+  Internal function to add Save jmp address according to DISPATCH_OPCODE2.\r
   The "Context" parameter is not ignored.\r
 \r
   @param  Marker                The variable argument list to get the opcode\r
@@ -369,17 +384,18 @@ BootScriptWriteMemPoll (
 **/\r
 EFI_STATUS\r
 BootScriptWriteDispatch2 (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-  VOID                  *EntryPoint;\r
-  VOID                  *Context;  \r
+  VOID  *EntryPoint;\r
+  VOID  *Context;\r
 \r
-  EntryPoint = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
-  Context    = (VOID*)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
+  EntryPoint = (VOID *)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
+  Context    = (VOID *)(UINTN)VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
 \r
   return S3BootScriptSaveDispatch2 (EntryPoint, Context);\r
 }\r
+\r
 /**\r
   Internal function to add INFORAMTION opcode node to the table\r
   list.\r
@@ -392,16 +408,17 @@ BootScriptWriteDispatch2 (
 **/\r
 EFI_STATUS\r
 BootScriptWriteInformation (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
   UINT32                InformationLength;\r
-  EFI_PHYSICAL_ADDRESS  Information;  \r
+  EFI_PHYSICAL_ADDRESS  Information;\r
 \r
   InformationLength = VA_ARG (Marker, UINT32);\r
-  Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
-  return S3BootScriptSaveInformation (InformationLength, (VOID*)(UINTN)Information);\r
+  Information       = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);\r
+  return S3BootScriptSaveInformation (InformationLength, (VOID *)(UINTN)Information);\r
 }\r
+\r
 /**\r
   Internal function to add IO poll opcode node  to the table\r
   @param  Marker                The variable argument list to get the opcode\r
@@ -413,23 +430,24 @@ BootScriptWriteInformation (
 **/\r
 EFI_STATUS\r
 BootScriptWriteIoPoll (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-   S3_BOOT_SCRIPT_LIB_WIDTH     Width;  \r
-   UINT64                     Address;    \r
-   VOID                      *Data;       \r
-   VOID                      *DataMask;   \r
-   UINT64                     Delay;       \r
-   \r
-   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);  \r
-   Address  = VA_ARG (Marker, UINT64);                    \r
-   Data     = VA_ARG (Marker, VOID *);                   \r
-   DataMask = VA_ARG (Marker, VOID *);                   \r
-   Delay    = (UINT64)VA_ARG (Marker, UINT64);             \r
-   \r
-   return S3BootScriptSaveIoPoll (Width, Address, Data, DataMask, Delay);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  VOID                      *Data;\r
+  VOID                      *DataMask;\r
+  UINT64                    Delay;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, VOID *);\r
+  DataMask = VA_ARG (Marker, VOID *);\r
+  Delay    = (UINT64)VA_ARG (Marker, UINT64);\r
+\r
+  return S3BootScriptSaveIoPoll (Width, Address, Data, DataMask, Delay);\r
 }\r
+\r
 /**\r
   Internal function to add PCI config poll opcode node to the table\r
 \r
@@ -442,24 +460,24 @@ BootScriptWriteIoPoll (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciConfigPoll (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-   S3_BOOT_SCRIPT_LIB_WIDTH   Width;\r
-   UINT64                     Address;\r
-   VOID                      *Data;\r
-   VOID                      *DataMask;\r
-   UINT64                     Delay;\r
-\r
-   \r
-   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);  \r
-   Address  = VA_ARG (Marker, UINT64);                    \r
-   Data     = VA_ARG (Marker, VOID *);                   \r
-   DataMask = VA_ARG (Marker, VOID *);                   \r
-   Delay    = (UINT64)VA_ARG (Marker, UINT64);             \r
-   \r
-   return S3BootScriptSavePciPoll (Width, Address, Data, DataMask, Delay);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT64                    Address;\r
+  VOID                      *Data;\r
+  VOID                      *DataMask;\r
+  UINT64                    Delay;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, VOID *);\r
+  DataMask = VA_ARG (Marker, VOID *);\r
+  Delay    = (UINT64)VA_ARG (Marker, UINT64);\r
+\r
+  return S3BootScriptSavePciPoll (Width, Address, Data, DataMask, Delay);\r
 }\r
+\r
 /**\r
   Internal function to add PCI config 2 poll opcode node to the table\r
 \r
@@ -472,49 +490,49 @@ BootScriptWritePciConfigPoll (
 **/\r
 EFI_STATUS\r
 BootScriptWritePciConfig2Poll (\r
-  IN VA_LIST                       Marker\r
+  IN VA_LIST  Marker\r
   )\r
 {\r
-   S3_BOOT_SCRIPT_LIB_WIDTH      Width;\r
-   UINT16                        Segment;\r
-   UINT64                        Address;\r
-   VOID                         *Data;\r
-   VOID                         *DataMask;\r
-   UINT64                        Delay;\r
-  \r
-   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);  \r
-   Segment  = VA_ARG (Marker, UINT16);      \r
-   Address  = VA_ARG (Marker, UINT64);                    \r
-   Data     = VA_ARG (Marker, VOID *);                   \r
-   DataMask = VA_ARG (Marker, VOID *);                   \r
-   Delay    = (UINT64)VA_ARG (Marker, UINT64);             \r
-   \r
-   return S3BootScriptSavePci2Poll (Width, Segment, Address, Data, DataMask, Delay);\r
+  S3_BOOT_SCRIPT_LIB_WIDTH  Width;\r
+  UINT16                    Segment;\r
+  UINT64                    Address;\r
+  VOID                      *Data;\r
+  VOID                      *DataMask;\r
+  UINT64                    Delay;\r
+\r
+  Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);\r
+  Segment  = VA_ARG (Marker, UINT16);\r
+  Address  = VA_ARG (Marker, UINT64);\r
+  Data     = VA_ARG (Marker, VOID *);\r
+  DataMask = VA_ARG (Marker, VOID *);\r
+  Delay    = (UINT64)VA_ARG (Marker, UINT64);\r
+\r
+  return S3BootScriptSavePci2Poll (Width, Segment, Address, Data, DataMask, Delay);\r
 }\r
 \r
 /**\r
   Adds a record into S3 boot script table.\r
 \r
   This function is used to store a boot script record into a given boot\r
-  script table. If the table specified by TableName is nonexistent in the \r
-  system, a new table will automatically be created and then the script record \r
-  will be added into the new table. This function is responsible for allocating \r
+  script table. If the table specified by TableName is nonexistent in the\r
+  system, a new table will automatically be created and then the script record\r
+  will be added into the new table. This function is responsible for allocating\r
   necessary memory for the script.\r
 \r
-  This function has a variable parameter list. The exact parameter list depends on \r
-  the OpCode that is passed into the function. If an unsupported OpCode or illegal \r
+  This function has a variable parameter list. The exact parameter list depends on\r
+  the OpCode that is passed into the function. If an unsupported OpCode or illegal\r
   parameter list is passed in, this function returns EFI_INVALID_PARAMETER.\r
   If there are not enough resources available for storing more scripts, this function returns\r
   EFI_OUT_OF_RESOURCES.\r
 \r
   @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.\r
   @param  OpCode                The operation code (opcode) number.\r
-  @param  ...                   Argument list that is specific to each opcode. \r
-  \r
+  @param  ...                   Argument list that is specific to each opcode.\r
+\r
   @retval EFI_SUCCESS           The operation succeeded. A record was added into the\r
                                 specified script table.\r
   @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.\r
-                                If the opcode is unknow or not supported because of the PCD \r
+                                If the opcode is unknow or not supported because of the PCD\r
                                 Feature Flags.\r
   @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.\r
 \r
@@ -522,128 +540,129 @@ BootScriptWritePciConfig2Poll (
 EFI_STATUS\r
 EFIAPI\r
 BootScriptWrite (\r
-  IN CONST EFI_S3_SAVE_STATE_PROTOCOL         *This,\r
-  IN UINT16                                    OpCode,\r
+  IN CONST EFI_S3_SAVE_STATE_PROTOCOL  *This,\r
+  IN UINTN                             OpCode,\r
   ...\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  VA_LIST                   Marker;  \r
+  EFI_STATUS  Status;\r
+  VA_LIST     Marker;\r
+\r
   //\r
   // Build script according to opcode\r
   //\r
   switch (OpCode) {\r
-\r
-  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemWrite (Marker);\r
-    VA_END (Marker); \r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfgWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfgReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteSmbusExecute (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_STALL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteStall (Marker);\r
-    VA_END (Marker);\r
-  \r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteDispatch (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteDispatch2 (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteInformation (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemPoll (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfg2Write (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfg2ReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:  \r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoPoll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-  \r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE: \r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciConfigPoll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-  \r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciConfig2Poll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-\r
-  default:\r
-    Status = EFI_INVALID_PARAMETER;\r
-    break;\r
+    case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfgWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfgReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteSmbusExecute (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_STALL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteStall (Marker);\r
+      VA_END (Marker);\r
+\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteDispatch (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteDispatch2 (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteInformation (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfg2Write (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfg2ReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciConfigPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciConfig2Poll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    default:\r
+      Status = EFI_INVALID_PARAMETER;\r
+      break;\r
   }\r
 \r
   return Status;\r
 }\r
+\r
 /**\r
   Insert a record into a specified Framework boot script table.\r
 \r
@@ -664,7 +683,7 @@ BootScriptWrite (
                                 inserted, either before or after, depending on BeforeOrAfter. On exit, specifies\r
                                 the position of the inserted opcode in the boot script table.\r
   @param  OpCode                The operation code (opcode) number.\r
-  @param  ...                   Argument list that is specific to each opcode. \r
+  @param  ...                   Argument list that is specific to each opcode.\r
 \r
   @retval EFI_SUCCESS           The operation succeeded. A record was added into the\r
                                 specified script table.\r
@@ -675,133 +694,135 @@ BootScriptWrite (
 EFI_STATUS\r
 EFIAPI\r
 BootScriptInsert (\r
-  IN CONST EFI_S3_SAVE_STATE_PROTOCOL    *This,\r
-  IN       BOOLEAN                          BeforeOrAfter,\r
-  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION     *Position OPTIONAL,\r
-  IN       UINT16                           OpCode,\r
+  IN CONST EFI_S3_SAVE_STATE_PROTOCOL   *This,\r
+  IN       BOOLEAN                      BeforeOrAfter,\r
+  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION  *Position OPTIONAL,\r
+  IN       UINTN                        OpCode,\r
   ...\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  VA_LIST                   Marker;  \r
+  EFI_STATUS  Status;\r
+  VA_LIST     Marker;\r
+\r
   //\r
   // Build script according to opcode\r
   //\r
   switch (OpCode) {\r
-\r
-  case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemWrite (Marker);\r
-    VA_END (Marker); \r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfgWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfgReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteSmbusExecute (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_STALL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteStall (Marker);\r
-    VA_END (Marker);\r
-  \r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteDispatch (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteDispatch2 (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteInformation (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteMemPoll (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfg2Write (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-\r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciCfg2ReadWrite (Marker);\r
-    VA_END (Marker);\r
-    break;\r
-    \r
-  case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:  \r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWriteIoPoll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-  \r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE: \r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciConfigPoll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-  \r
-  case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:\r
-    VA_START (Marker, OpCode);\r
-    Status = BootScriptWritePciConfig2Poll (Marker);\r
-    VA_END (Marker);\r
-    break;    \r
-\r
-  default:\r
-    Status = EFI_INVALID_PARAMETER;\r
-    break;\r
+    case EFI_BOOT_SCRIPT_IO_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_IO_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfgWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfgReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_SMBUS_EXECUTE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteSmbusExecute (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_STALL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteStall (Marker);\r
+      VA_END (Marker);\r
+\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_DISPATCH_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteDispatch (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_DISPATCH_2_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteDispatch2 (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_INFORMATION_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteInformation (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_MEM_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteMemPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfg2Write (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_READ_WRITE_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciCfg2ReadWrite (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_IO_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWriteIoPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciConfigPoll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    case EFI_BOOT_SCRIPT_PCI_CONFIG2_POLL_OPCODE:\r
+      VA_START (Marker, OpCode);\r
+      Status = BootScriptWritePciConfig2Poll (Marker);\r
+      VA_END (Marker);\r
+      break;\r
+\r
+    default:\r
+      Status = EFI_INVALID_PARAMETER;\r
+      break;\r
   }\r
-  \r
+\r
   if (!EFI_ERROR (Status)) {\r
-   Status = S3BootScriptMoveLastOpcode (BeforeOrAfter, Position);\r
+    Status = S3BootScriptMoveLastOpcode (BeforeOrAfter, (VOID **)Position);\r
   }\r
+\r
   return Status;\r
 }\r
+\r
 /**\r
   Find a label within the boot script table and, if not present, optionally create it.\r
 \r
@@ -827,48 +848,50 @@ BootScriptInsert (
   @retval EFI_SUCCESS           The label already exists or was inserted.\r
   @retval EFI_INVALID_PARAMETER The Label is NULL or points to an empty string.\r
   @retval EFI_INVALID_PARAMETER The Position is not a valid position in the boot script table.\r
-  \r
+\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 BootScriptLabel (\r
-  IN CONST EFI_S3_SAVE_STATE_PROTOCOL           *This,\r
-  IN       BOOLEAN                               BeforeOrAfter,\r
-  IN       BOOLEAN                               CreateIfNotFound,\r
-  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION          *Position OPTIONAL,\r
-  IN CONST CHAR8                                *Label\r
+  IN CONST EFI_S3_SAVE_STATE_PROTOCOL   *This,\r
+  IN       BOOLEAN                      BeforeOrAfter,\r
+  IN       BOOLEAN                      CreateIfNotFound,\r
+  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION  *Position OPTIONAL,\r
+  IN CONST CHAR8                        *Label\r
   )\r
 {\r
-       return S3BootScriptLabel (BeforeOrAfter, CreateIfNotFound, Position, Label);\r
+  return S3BootScriptLabel (BeforeOrAfter, CreateIfNotFound, (VOID **)Position, Label);\r
 }\r
+\r
 /**\r
   Compare two positions in the boot script table and return their relative position.\r
-  \r
+\r
   This function compares two positions in the boot script table and returns their relative positions. If\r
   Position1 is before Position2, then -1 is returned. If Position1 is equal to Position2,\r
   then 0 is returned. If Position1 is after Position2, then 1 is returned.\r
-  \r
+\r
   @param  This                  A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.\r
   @param  Position1             The positions in the boot script table to compare\r
   @param  Position2             The positions in the boot script table to compare\r
   @param  RelativePosition      On return, points to the result of the comparison\r
 \r
-  @retval EFI_SUCCESS           The operation succeeded. \r
+  @retval EFI_SUCCESS           The operation succeeded.\r
   @retval EFI_INVALID_PARAMETER The Position1 or Position2 is not a valid position in the boot script table.\r
   @retval EFI_INVALID_PARAMETER The RelativePosition is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI \r
+EFIAPI\r
 BootScriptCompare (\r
-  IN CONST EFI_S3_SAVE_STATE_PROTOCOL      *This,\r
-  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position1,\r
-  IN       EFI_S3_BOOT_SCRIPT_POSITION      Position2,\r
-  OUT      UINTN                           *RelativePosition\r
+  IN CONST EFI_S3_SAVE_STATE_PROTOCOL   *This,\r
+  IN       EFI_S3_BOOT_SCRIPT_POSITION  Position1,\r
+  IN       EFI_S3_BOOT_SCRIPT_POSITION  Position2,\r
+  OUT      UINTN                        *RelativePosition\r
   )\r
 {\r
-       return S3BootScriptCompare (Position1, Position2, RelativePosition);\r
+  return S3BootScriptCompare (Position1, Position2, RelativePosition);\r
 }\r
+\r
 /**\r
   This routine is entry point of ScriptSave driver.\r
 \r
@@ -877,24 +900,27 @@ BootScriptCompare (
 \r
   @retval EFI_OUT_OF_RESOURCES  No enough resource\r
   @retval EFI_SUCCESS           Succesfully installed the ScriptSave driver.\r
-  @retval other                 Errors occured.\r
+  @retval other                 Errors occurred.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 InitializeSmmS3SaveState (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_HANDLE   Handle;\r
-  \r
-\r
-  Handle  = NULL;\r
-  return  gSmst->SmmInstallProtocolInterface (\r
-                   &Handle,\r
-                   &gEfiS3SmmSaveStateProtocolGuid,\r
-                   EFI_NATIVE_INTERFACE,\r
-                   &mS3SmmSaveState\r
-                   );\r
+  EFI_HANDLE  Handle;\r
+\r
+  if (!PcdGetBool (PcdAcpiS3Enable)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Handle = NULL;\r
+  return gSmst->SmmInstallProtocolInterface (\r
+                  &Handle,\r
+                  &gEfiS3SmmSaveStateProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &mS3SmmSaveState\r
+                  );\r
 }\r