From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) by mx.groups.io with SMTP id smtpd.web12.1454.1641521747461101721 for ; Thu, 06 Jan 2022 18:15:47 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=oopYpYIL; spf=pass (domain: gmail.com, ip: 209.85.214.174, mailfrom: kuqin12@gmail.com) Received: by mail-pl1-f174.google.com with SMTP id l15so3779936pls.7 for ; Thu, 06 Jan 2022 18:15:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1LQBF2LI7JMu7dEYcke17cPOeyCQfSPCMyiJaJbbDrQ=; b=oopYpYILLxFeNgrkHSweoCOgc3PH6L1FBPAFXPLPgmqG4PNcmHZJHuvQKfNH9IEqxg eXtuA1Z4M+lIJlLMPJs6v2o0AQmoGeUlVuxg2ToMtxGWrkI3bmqqvWASQMVDWSmpDEiU gtBVleTMW/YYSqlXlMLtEmk7CbrzFom0UFVA6yqgmGwqhbsIa5TsA5JqyVXZGUrsbSLo TxXJ3rZwxBWlylsIppgWiTUQYYSs9uN4j3sAAVy77nDqu5YzOBKvMeZwJpuTk43E6m7M qxJcjflFsIGYb2TIFHgEtZNeKXiEaCkWjMzm4PqkPIVOlt2hBm+w5pcJYdkrF1O84VoS jouQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1LQBF2LI7JMu7dEYcke17cPOeyCQfSPCMyiJaJbbDrQ=; b=wCJSugIuWP42NMMQ5D5NxKCHrIu8OkQd3isaUBsdFPvwXmPp1PxXEkJ7NkAK07Nf2D tkZZe5PCQIZQehe+KJnj7f8lpi+xOUQf4QD+3/VuKSmXN4HgI2QepimkM7JGCIdBq4an OdyG8vTbyZ0y4BlvM5cCJ63CXkWq6KBK6mU9u1GpNQcRZlkSpTp2xoLjGbohY77e/TvN 3yUmCh+otUBjnmrAtFrxu2jgwfUrfnJ8aclSHqXuPuhxGSDD5/rtBYTpDRKmPOETMUBn rsBpqBZ6J/jSREICbCmOghjc6yI++fVXeyumh/uSNDwG9HdHF6LAoHnn8PcJBHOunH9S Km3w== X-Gm-Message-State: AOAM530Tmf4EFHJoRHMPFgWeFsTR7C5/8isUEHnZXFbH06CgovxQ8R4z hm3iWEdk1IKf9rVMNpr2P0a2ZpU1ZHA= X-Google-Smtp-Source: ABdhPJz8EcphtYUU79Z0Vu1A+vtuukFY3IiuxqfubatO//g2aSCk5yklyfN3KWUbQvpGi10GxHqOzw== X-Received: by 2002:a17:902:c40c:b0:149:7d72:15c5 with SMTP id k12-20020a170902c40c00b001497d7215c5mr49317789plk.133.1641521746963; Thu, 06 Jan 2022 18:15:46 -0800 (PST) Return-Path: Received: from localhost.localdomain ([50.35.74.198]) by smtp.gmail.com with ESMTPSA id j3sm3894875pfc.196.2022.01.06.18.15.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Jan 2022 18:15:46 -0800 (PST) From: "Kun Qin" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Eric Dong , Ray Ni Subject: [PATCH v4 5/7] MdeModulePkg: PiSmmCore: Added parser of new MM communicate header Date: Thu, 6 Jan 2022 18:15:30 -0800 Message-Id: <20220107021532.1322-6-kuqin12@gmail.com> X-Mailer: git-send-email 2.34.1.windows.1 In-Reply-To: <20220107021532.1322-1-kuqin12@gmail.com> References: <20220107021532.1322-1-kuqin12@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3398 REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3430 MM communicate protocols are expanded with EFI_MM_COMMUNICATE_HEADER_V3 structure that cooperates with updated field types and flexible array. The PiSmmCore implementation is updated to detect and process incoming data accordingly. Two checks are also performed to prevent legacy communicate data or unsupported data is fed into MM core under agreed header guid. Cc: Jian J Wang Cc: Hao A Wu Cc: Eric Dong Cc: Ray Ni Signed-off-by: Kun Qin --- Notes: v3: - Newly added v4: - Rebased with uncrusitify changes. MdeModulePkg/Core/PiSmmCore/PiSmmCore.c | 51 ++++++++++++++------ MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf | 1 + 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c index 9e5c6cbe33dd..8d57f71dc969 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c @@ -647,12 +647,16 @@ SmmEntryPoint ( IN CONST EFI_SMM_ENTRY_CONTEXT *SmmEntryContext ) { - EFI_STATUS Status; - EFI_SMM_COMMUNICATE_HEADER *CommunicateHeader; - BOOLEAN InLegacyBoot; - BOOLEAN IsOverlapped; - VOID *CommunicationBuffer; - UINTN BufferSize; + EFI_STATUS Status; + EFI_MM_COMMUNICATE_HEADER_V3 *CommunicateHeader; + EFI_SMM_COMMUNICATE_HEADER *LegacyCommunicateHeader; + BOOLEAN InLegacyBoot; + BOOLEAN IsOverlapped; + VOID *CommunicationBuffer; + UINTN BufferSize; + EFI_GUID *CommGuid; + VOID *CommData; + UINTN CommHeaderSize; // // Update SMST with contents of the SmmEntryContext structure @@ -708,19 +712,36 @@ SmmEntryPoint ( gSmmCorePrivate->CommunicationBuffer = NULL; gSmmCorePrivate->ReturnStatus = EFI_ACCESS_DENIED; } else { - CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)CommunicationBuffer; - BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data); - Status = SmiManage ( - &CommunicateHeader->HeaderGuid, - NULL, - CommunicateHeader->Data, - &BufferSize - ); + CommGuid = &((EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicationBuffer)->HeaderGuid; + // + // Check if the signature matches EFI_MM_COMMUNICATE_HEADER_V3 definition + // + if (CompareGuid (CommGuid, &gCommunicateHeaderV3Guid)) { + CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicationBuffer; + ASSERT (CommunicateHeader->Signature == EFI_MM_COMMUNICATE_HEADER_V3_SIGNATURE); + ASSERT (CommunicateHeader->Version <= EFI_MM_COMMUNICATE_HEADER_V3_VERSION); + CommGuid = &CommunicateHeader->MessageGuid; + CommData = CommunicateHeader->MessageData; + CommHeaderSize = sizeof (EFI_MM_COMMUNICATE_HEADER_V3); + } else { + LegacyCommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)CommunicationBuffer; + CommGuid = &LegacyCommunicateHeader->HeaderGuid; + CommData = LegacyCommunicateHeader->Data; + CommHeaderSize = OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data); + } + + BufferSize -= CommHeaderSize; + Status = SmiManage ( + CommGuid, + NULL, + CommData, + &BufferSize + ); // // Update CommunicationBuffer, BufferSize and ReturnStatus // Communicate service finished, reset the pointer to CommBuffer to NULL // - gSmmCorePrivate->BufferSize = BufferSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data); + gSmmCorePrivate->BufferSize = BufferSize + CommHeaderSize; gSmmCorePrivate->CommunicationBuffer = NULL; gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND; } diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf index c8bfae3860fc..5a0929a45e19 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf @@ -118,6 +118,7 @@ [Guids] gSmiHandlerProfileGuid gEdkiiEndOfS3ResumeGuid ## SOMETIMES_PRODUCES ## GUID # Install protocol gEdkiiS3SmmInitDoneGuid ## SOMETIMES_PRODUCES ## GUID # Install protocol + gCommunicateHeaderV3Guid ## CONSUMES ## GUID # Communicate header [UserExtensions.TianoCore."ExtraFiles"] PiSmmCoreExtra.uni -- 2.34.1.windows.1