From d8e875e62505e15a48f82ccb49db42be9fda519f Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 13 Aug 2025 10:11:20 +0100 Subject: [PATCH] Global: fix ArmFfaLibRun() caller couldn't get ret-args When ArmFfaLibDirectMsgReq(2) is preempted, caller of these functions should resume it works via ArmFfaLibRun() and the secure partition will be return with FFA_DIRECT_MSG_RESP(2) with return arguments. However, since ArmFfaLibRun() gets its return in its stack variable, So caller of ArmFfaLibRun() doesn't get the return arguments from secure partition. To resolve this, add output parameter to ArmFfaLibRun() to receive return arguments. Continuous-integration-options: PatchCheck.ignore-multi-package Fixes: 5d1b38dd07c4 ("ArmPkg: Add ArmFfaLib used in Dxe driver") Reported-by: Mariam Elshakfy Signed-off-by: Yeoreum Yun --- .../MmCommunicationDxe/MmCommunication.c | 2 +- .../MmCommunicationPei/MmCommunicationPei.c | 2 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 41 +++++++++++++++++-- MdePkg/Include/Library/ArmFfaLib.h | 6 ++- .../Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c | 12 +++--- .../Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c | 2 +- 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 188fd3289e..c2a3bd1a84 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -73,7 +73,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index fc29e99788..7032409f05 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -275,7 +275,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 332628a5d5..0d6f0c1e40 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -535,6 +535,7 @@ ErrorHandler: @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -543,10 +544,12 @@ ErrorHandler: EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ) { + EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); @@ -556,7 +559,39 @@ ArmFfaLibRun ( ArmCallFfa (&FfaArgs); - return FfaArgsToEfiStatus (&FfaArgs); + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + if (DirectMsgArg != NULL) { + ZeroMem (DirectMsgArg, sizeof (DIRECT_MSG_ARGS)); + + if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP) { + DirectMsgArg->Arg0 = FfaArgs.Arg3; + DirectMsgArg->Arg1 = FfaArgs.Arg4; + DirectMsgArg->Arg2 = FfaArgs.Arg5; + DirectMsgArg->Arg3 = FfaArgs.Arg6; + DirectMsgArg->Arg4 = FfaArgs.Arg7; + } else if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP2) { + DirectMsgArg->Arg0 = FfaArgs.Arg4; + DirectMsgArg->Arg1 = FfaArgs.Arg5; + DirectMsgArg->Arg2 = FfaArgs.Arg6; + DirectMsgArg->Arg3 = FfaArgs.Arg7; + DirectMsgArg->Arg4 = FfaArgs.Arg8; + DirectMsgArg->Arg5 = FfaArgs.Arg9; + DirectMsgArg->Arg6 = FfaArgs.Arg10; + DirectMsgArg->Arg7 = FfaArgs.Arg11; + DirectMsgArg->Arg8 = FfaArgs.Arg12; + DirectMsgArg->Arg9 = FfaArgs.Arg13; + DirectMsgArg->Arg10 = FfaArgs.Arg14; + DirectMsgArg->Arg11 = FfaArgs.Arg15; + DirectMsgArg->Arg12 = FfaArgs.Arg16; + DirectMsgArg->Arg13 = FfaArgs.Arg17; + } + } + + return Status; } /** diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index dd2ac41202..190a943e5b 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -301,6 +301,7 @@ ArmFfaLibSpmIdGet ( @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -309,8 +310,9 @@ ArmFfaLibSpmIdGet ( EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ); /** diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c index 44159c9961..d6ece59f54 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c @@ -202,7 +202,7 @@ Tpm2GetInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -254,7 +254,7 @@ Tpm2GetFeatureInfo ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -298,7 +298,7 @@ Tpm2ServiceStart ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -343,7 +343,7 @@ Tpm2RegisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -380,7 +380,7 @@ Tpm2UnregisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -417,7 +417,7 @@ Tpm2FinishNotified ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c index ea01c9b815..73a0f9a944 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c @@ -69,7 +69,7 @@ Tpm2FfaCheckInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (TpmPartId, &gTpm2ServiceFfaGuid, &TpmArgs); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (TpmPartId, 0x00); + Status = ArmFfaLibRun (TpmPartId, 0x00, &TpmArgs); } if (EFI_ERROR (Status) || (TpmArgs.Arg0 != TPM2_FFA_SUCCESS_OK_RESULTS_RETURNED)) {