Probably a known bug that cannot be fixed for compatibility reasons:

EFI_BOOT_SCRIPT_INFORMATION_OPCODE takes two arguments, "InformationLength" and
"Information". According to the PI spec, Information is a pointer pointing to
runtime memory or ACPI NVS, and the BootScript record will store the pointer
(ie. not the data pointed-to).

However the implementation in

  BootScriptWriteInformation()
  MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c

and in the underlying library function

  S3BootScriptSaveInformation()
  MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c

dereference the pointer when the opcode is added, and the pointed-to data is
copied into the script.

This is no problem per se, it's just not what the spec says. The spec would
need something like:

  diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c 
b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c
  index c087dd9..655496f 100644
  --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c
  +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c
  @@ -1449,14 +1449,14 @@ RETURN_STATUS
   EFIAPI
   S3BootScriptSaveInformation (
     IN  UINT32                                InformationLength,
  -  IN  VOID                                 *Information
  +  IN  EFI_PHYSICAL_ADDRESS                  Information
     )
   {
     UINT8                 Length;
     UINT8                 *Script;
     EFI_BOOT_SCRIPT_INFORMATION  ScriptInformation;

  -  Length = (UINT8)(sizeof (EFI_BOOT_SCRIPT_INFORMATION) + InformationLength);
  +  Length = (UINT8)(sizeof (EFI_BOOT_SCRIPT_INFORMATION) + sizeof 
Information);

     Script = S3BootScriptGetEntryAddAddress (Length);
     if (Script == NULL) {
  @@ -1472,7 +1472,7 @@ S3BootScriptSaveInformation (
     ScriptInformation.InformationLength = InformationLength;

     CopyMem ((VOID*)Script, (VOID*)&ScriptInformation, sizeof 
(EFI_BOOT_SCRIPT_INFORMATION));
  -  CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_INFORMATION)), (VOID *) 
Information, (UINTN) InformationLength);
  +  CopyMem ((VOID*)(Script + sizeof (EFI_BOOT_SCRIPT_INFORMATION)), 
&Information, sizeof Information);

     SyncBootScript (Script);

  diff --git a/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c 
b/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c
  index 60cd9b1..70e206f 100644
  --- a/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c
  +++ b/MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c
  @@ -418,7 +418,7 @@ BootScriptWriteInformation (

     InformationLength = VA_ARG (Marker, UINT32);
     Information = VA_ARG (Marker, EFI_PHYSICAL_ADDRESS);
  -  return S3BootScriptSaveInformation (InformationLength, 
(VOID*)(UINTN)Information);
  +  return S3BootScriptSaveInformation (InformationLength, Information);
   }
   /**
     Internal function to add IO poll opcode node  to the table

The replay code would need the corresponding change.

The current code also limits the size of the information to less than 255
bytes, and makes the InformationLength argument redundant.

Thanks
Laszlo

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to