Hi Andrew,

After SmmReadyToLock, only SMM driver is allowed to write boot script. In DXE 
SCRIPT_TABLE_PRIVATE_DATA instance, only the TableBase field will be used for 
BootScriptExecute at S3 resume, other fields will be not used.
So the TableLength field in DXE SCRIPT_TABLE_PRIVATE_DATA instance could be set 
to 0  after SmmReadyToLock to say it will be not synced, or even the whole  DXE 
SCRIPT_TABLE_PRIVATE_DATA instance could be emptied as the TableBase field has 
been saved into lockbox and will be restored at S3 resume.

Thanks,
Star
From: Andrew Fish [mailto:af...@apple.com]
Sent: Wednesday, April 1, 2015 10:41 AM
To: edk2-devel@lists.sourceforge.net
Subject: Re: [edk2] MdeModulePkg Maintainer: The PiDxeS3BootScriptLib does not 
seem to set EFI_BOOT_SCRIPT_TABLE_HEADER.Version


On Mar 31, 2015, at 6:54 PM, Andrew Fish 
<af...@apple.com<mailto:af...@apple.com>> wrote:


On Mar 31, 2015, at 6:25 PM, Yao, Jiewen 
<jiewen....@intel.com<mailto:jiewen....@intel.com>> wrote:

Yes. It seems a bug.
We should initialize it.

Thanks!

The other thing that looked strange to me was: mS3BootScriptTablePtr and 
mS3BootScriptTableSmmPtr of type SCRIPT_TABLE_PRIVATE_DATA.
//
// The boot script private data.
//
typedef struct {
  UINT8           *TableBase;
  UINT32          TableLength;               // Record the actual memory length
  UINT16          TableMemoryPageNumber;     // Record the page number 
Allocated for the table
  BOOLEAN         AtRuntime;                 // Record if current state is 
after SmmReadyToLock
  BOOLEAN         InSmm;                     // Record if this library is in 
SMM.
} SCRIPT_TABLE_PRIVATE_DATA;

Given mS3BootScriptTablePtr is a library global there are N copies of them in 
the system. So TableLength and TableMemoryPageNumber can get out of sync with 
reality. I don’t see the point in tracking the data in N places. Seems like all 
the instances of SCRIPT_TABLE_PRIVATE_DATA.TableBase point to 
EFI_BOOT_SCRIPT_TABLE_HEADER, so that is the only length that means anything.


I just noticed that mS3BootScriptTablePtr points to 
PcdS3BootScriptTablePrivateDataPtr. So the delta is really only between the DXE 
drivers and the SMM drivers. All the DXE Drivers share the same 
mS3BootScriptTablePtr, and all the SMM drivers share the same 
mS3BootScriptTablePtr. But both point to the same EFI_BOOT_SCRIPT_TABLE_HEADER.

DXE:
(lldb) p *mS3BootScriptTablePtr
(SCRIPT_TABLE_PRIVATE_DATA) $126 = {
  TableBase = 0x000000007afbe000 "?"
  TableLength = 0x000003d1
  TableMemoryPageNumber = 0x0004
  AtRuntime = true
  InSmm = false
}
(lldb) p *(EFI_BOOT_SCRIPT_TABLE_HEADER *)0x000000007afbe000
(EFI_BOOT_SCRIPT_TABLE_HEADER) $127 = {
  OpCode = 0x00aa
  Length = 0x0d
  Version = 0xafaf
  TableLength = 0x000005c4
  Reserved = ([0] = 0xafaf, [1] = 0xafaf)
}

SMM:
(lldb) p *(SCRIPT_TABLE_PRIVATE_DATA *)0x7b3efa90
(SCRIPT_TABLE_PRIVATE_DATA) $128 = {
  TableBase = 0x000000007afbe000 "?"
  TableLength = 0x000005c1
  TableMemoryPageNumber = 0x0004
  AtRuntime = true
  InSmm = true
}
(lldb)  p *(EFI_BOOT_SCRIPT_TABLE_HEADER *)0x000000007afbe000
(EFI_BOOT_SCRIPT_TABLE_HEADER) $129 = {
  OpCode = 0x00aa
  Length = 0x0d
  Version = 0xafaf
  TableLength = 0x000005c4
  Reserved = ([0] = 0xafaf, [1] = 0xafaf)
}

I wonder if the reason it seem to work is some of the writes are the full set 
and some writes are too short. So at the end of the day the lock box has the 
correct data in it?

It still seems like it would be simpler, and safer to just use 
EFI_BOOT_SCRIPT_TABLE_HEADER.TableLength?

Thanks,

Andrew Fish


It probably generally seems to work as a driver does writes in batches. But if 
a driver did a batch of writes, and then did work in an event. Its cached 
SCRIPT_TABLE_PRIVATE_DATA would be out of data with regards to TableLength and 
TableMemoryPageNumber.

It looks like a bad value in mS3BootScriptTablePtr could end up truncating the 
table. It could be that the later code has a larger value and it runs last? So 
maybe it is a race, or we are just getting lucky? Or maybe there is some 
syncing back from EFI_BOOT_SCRIPT_TABLE_HEADER that I missed in the code.

Thanks,

Andrew Fish

PS I’ve not seen any bad S3 data. I’m writing a debugger script to dump out the 
tables, so I was poking around in memory to debug the script and noticed this 
issue.

(lldb) p *mS3BootScriptTablePtr
(SCRIPT_TABLE_PRIVATE_DATA) $120 = {
  TableBase = 0x000000007afbe000 "?"
  TableLength = 0x000003d1
  TableMemoryPageNumber = 0x0004
  AtRuntime = true
  InSmm = false
}
(lldb) p *(EFI_BOOT_SCRIPT_TABLE_HEADER *)0x000000007afbe000
(EFI_BOOT_SCRIPT_TABLE_HEADER) $121 = {
  OpCode = 0x00aa
  Length = 0x0d
  Version = 0xafaf
  TableLength = 0x000005c4
  Reserved = ([0] = 0xafaf, [1] = 0xafaf)
}

The last instance of mS3BootScriptTablePtr is this one:
(lldb) p *(SCRIPT_TABLE_PRIVATE_DATA *)0x7b3efa90
(SCRIPT_TABLE_PRIVATE_DATA) $122 = {
  TableBase = 0x000000007afbe000 "?"
  TableLength = 0x000005c1
  TableMemoryPageNumber = 0x0004
  AtRuntime = true
  InSmm = true
}




Thank you
Yao Jiewen

-----Original Message-----
From: Andrew Fish [mailto:af...@apple.com]
Sent: Wednesday, April 01, 2015 6:32 AM
To: edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
Subject: [edk2] MdeModulePkg Maintainer: The PiDxeS3BootScriptLib does not seem 
to set EFI_BOOT_SCRIPT_TABLE_HEADER.Version

I don’t see any code in the PiDxeS3BootScriptLib that sets a value to 
EFI_BOOT_SCRIPT_TABLE_HEADER.Version. The data is allocated via 
gBS->AllocatePages, and on the system I looked at the Version was set to 0xafaf.

It seems like the driver should initialize this member to a known value?

Thanks,

Andrew Fish
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored 
by Intel and developed in partnership with Slashdot Media, is your hub for all 
things parallel software development, from weekly thought leadership blogs to 
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/edk2-devel


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to