Hi,

I want to readout the SMRAM of an existing UEFI-Bios.
Therefore I wrote a UEFI application inherited by the EDK2 sample
MemoryProfileInfo:

EFI_STATUS GetSmramProfileData(VOID)
{
    EFI_STATUS Status;
    UINTN CommSize;
    UINT8* pCommBuffer;
    
    EFI_SMM_COMMUNICATE_HEADER* pCommHeader;
    SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO* pCommGetProfileInfo;
    SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA* pCommGetProfileData;

    EFI_SMM_COMMUNICATION_PROTOCOL* pSmmCommunicationProt;

    UINT64 ProfileSize;
    PHYSICAL_ADDRESS ProfileBuffer;
    
    //Get SMM communication protocol
    Status = gBS->LocateProtocol(
                            &gEfiSmmCommunicationProtocolGuid,
                            NULL,
                            (VOID**)&pSmmCommunicationProt);

    Print(L"LocateProtocol Status: %lx\n", Status);
    if (EFI_SUCCESS == Status)
    {
        //Get buffer
        CommSize = sizeof (EFI_GUID) + sizeof (UINTN) +
                   sizeof (SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA);
        pCommBuffer = AllocateZeroPool(500);
        if (pCommBuffer)
        {
            Print(L"AllocateZeroPool CommSize: %lx\n", CommSize);

            // Get Size
            pCommHeader = (EFI_SMM_COMMUNICATE_HEADER*)&pCommBuffer[0];
            CopyMem (&pCommHeader->HeaderGuid, &gEdkiiMemoryProfileGuid,
sizeof (gEdkiiMemoryProfileGuid));
            pCommHeader->MessageLength =
sizeof(SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO);

            pCommGetProfileInfo = (SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO
*) &pCommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
            pCommGetProfileInfo->Header.Command      =
SMRAM_PROFILE_COMMAND_GET_PROFILE_INFO;
            pCommGetProfileInfo->Header.DataLength   = sizeof
(*pCommGetProfileInfo);
            pCommGetProfileInfo->Header.ReturnStatus = (UINT64)-1;
            pCommGetProfileInfo->ProfileSize         = 0;

            CommSize = sizeof (EFI_GUID) + sizeof (UINTN) +
pCommHeader->MessageLength;
            Status = pSmmCommunicationProt->Communicate(
                                                pSmmCommunicationProt,
                                                pCommBuffer, &CommSize);

            Print(L"pSmmCommunicationProt->Communicate Status:%lx\n", Status);


When I call pSmmCommunicationProt->communicate, I get the error 0x000000e,
which I suppose is due to the fact, that I use gEdkiiMemoryProfileGuid,
which isn't existent in the current UEFI Bios (2.40).
Now what should I do instead ?


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

Reply via email to