On 2016/8/9 10:07, Andrew Fish wrote:

On Aug 8, 2016, at 6:21 PM, Zeng, Star <[email protected]> wrote:

Andrew,

Should MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib be used for your case 
if there are really runtime status code reporting needed?


Star,

If the Library instance does not fully support DXE_RUNTIME_DRIVER, why is it 
listed in the LIBRARY_CLASS as supported?

This kind of library can support DXE_RUNTIME_DRIVER at boot time, for example UefiHiiLib, UefiHiiServicesLib, UefiBootServicesTableLib, DxePcdLib and etc.


https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf#L25

 LIBRARY_CLASS                  = ReportStatusCodeLib|DXE_CORE DXE_DRIVER 
DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER 
SMM_CORE

Actually I tried to add the UefiRuntimeDriverLib and the build failed as 
UefiRuntimeDriverLib was not supported for the DXE_CORE type. Maybe the bug is 
this library instance lists DXE_RUNTIME_DRIVER,  DXE_SAL_DRIVER and 
DXE_SMM_DRIVER when it has special case code to support DXE_CORE? Maybe this 
library is trying to do too many things?

What ReportStatusCodeLib would you recommend to link with RuntimeDxe driver: 
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf

[LibraryClasses.common.DXE_CORE]

ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf

[LibraryClasses.common.DXE_RUNTIME_DRIVER]

ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf

[LibraryClasses.common.UEFI_DRIVER]

ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf

[LibraryClasses.common.DXE_DRIVER]

ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf

[LibraryClasses.common.UEFI_APPLICATION]

ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf

Thanks,
Star


Thanks,

Andrew Fish

Thanks,
Star
-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Andrew 
Fish
Sent: Tuesday, August 9, 2016 7:08 AM
To: edk2-devel <[email protected]>
Subject: [edk2] [MdeModulePkg] SetVirtualAddressMap() crashed due to 
DxeReportStatusCodeLib assuming the state of the BootService Memory at runtime.

I was messing about with an ExitBootServices test that fills boot services 
memory with 0xAFAFAFAFAFAFAFAF (It was Vincent's idea to use my Initials but it 
has the handy property of being a non-cononical address and causes on GP fault 
on X64) and SetVirtualAddressMap() started crashing.

It looks like this code is assuming the 1st call to ReportStatus code will not 
happen at runtime. This is not the case for the RuntimeDxe driver.
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c#L43
VOID
InternalGetReportStatusCode (
VOID
)
{
EFI_STATUS  Status;

if (mReportStatusCodeLibStatusCodeProtocol != NULL) {
  return;
}

//
// Check gBS just in case ReportStatusCode is called before gBS is initialized.
//
if (gBS != NULL && gBS->LocateProtocol != NULL) {
  Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**) 
&mReportStatusCodeLibStatusCodeProtocol);
  if (EFI_ERROR (Status)) {
    mReportStatusCodeLibStatusCodeProtocol = NULL;
  }
}
}

I'm guessing this seems to work due 
to:https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c#L803

//
// Zero out the Boot Service Table
//
ZeroMem (gBS, sizeof (EFI_BOOT_SERVICES));


Thus if I'm looking at this code correctly it only looks like it works at 
Runtime since it is depending on the value of a boot services memory buffer not 
changing. This is not a valid assumption as that code is owned by the caller of 
ExitBootServices, so it should be legal for my test to change the value.

I wanted to get a few more eyes on this prior to filling a bug?

Thanks,

Andrew Fish


_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to