StandaloneMmPkg: Add option to use FF-A calls for getting SPM version

With the introduction of Firmware Framework(FF-A), a Secure Partition
can get the SPM version either using FF-A calls or through the
existing svc calls. Use a runtime check to use either of the two
methods based on the Pcd feature flag value.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Co-developed-by: Achin Gupta <achin.gupta@arm.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Sughosh Ganu 2021-02-19 12:06:01 +05:30 committed by mergify[bot]
parent 799c07ca28
commit cb4267d4c2
2 changed files with 33 additions and 10 deletions

View File

@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
#include <Library/SerialPortLib.h> #include <Library/SerialPortLib.h>
#include <Library/PcdLib.h>
#include <IndustryStandard/ArmStdSmc.h> #include <IndustryStandard/ArmStdSmc.h>
#include <IndustryStandard/ArmMmSvc.h> #include <IndustryStandard/ArmMmSvc.h>
@ -31,10 +32,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define SPM_MAJOR_VER_MASK 0xFFFF0000 #define SPM_MAJOR_VER_MASK 0xFFFF0000
#define SPM_MINOR_VER_MASK 0x0000FFFF #define SPM_MINOR_VER_MASK 0x0000FFFF
#define SPM_MAJOR_VER_SHIFT 16 #define SPM_MAJOR_VER_SHIFT 16
#define FFA_NOT_SUPPORTED -1
STATIC CONST UINT32 mSpmMajorVer = SPM_MAJOR_VERSION; STATIC CONST UINT32 mSpmMajorVer = SPM_MAJOR_VERSION;
STATIC CONST UINT32 mSpmMinorVer = SPM_MINOR_VERSION; STATIC CONST UINT32 mSpmMinorVer = SPM_MINOR_VERSION;
STATIC CONST UINT32 mSpmMajorVerFfa = SPM_MAJOR_VERSION_FFA;
STATIC CONST UINT32 mSpmMinorVerFfa = SPM_MINOR_VERSION_FFA;
#define BOOT_PAYLOAD_VERSION 1 #define BOOT_PAYLOAD_VERSION 1
PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL; PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL;
@ -175,19 +180,34 @@ EFI_STATUS
GetSpmVersion (VOID) GetSpmVersion (VOID)
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT16 SpmMajorVersion; UINT16 CalleeSpmMajorVer;
UINT16 SpmMinorVersion; UINT16 CallerSpmMajorVer;
UINT16 CalleeSpmMinorVer;
UINT16 CallerSpmMinorVer;
UINT32 SpmVersion; UINT32 SpmVersion;
ARM_SVC_ARGS SpmVersionArgs; ARM_SVC_ARGS SpmVersionArgs;
if (FeaturePcdGet (PcdFfaEnable)) {
SpmVersionArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32;
SpmVersionArgs.Arg1 = mSpmMajorVerFfa << SPM_MAJOR_VER_SHIFT;
SpmVersionArgs.Arg1 |= mSpmMinorVerFfa;
CallerSpmMajorVer = mSpmMajorVerFfa;
CallerSpmMinorVer = mSpmMinorVerFfa;
} else {
SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32; SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32;
CallerSpmMajorVer = mSpmMajorVer;
CallerSpmMinorVer = mSpmMinorVer;
}
ArmCallSvc (&SpmVersionArgs); ArmCallSvc (&SpmVersionArgs);
SpmVersion = SpmVersionArgs.Arg0; SpmVersion = SpmVersionArgs.Arg0;
if (SpmVersion == FFA_NOT_SUPPORTED) {
return EFI_UNSUPPORTED;
}
SpmMajorVersion = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT); CalleeSpmMajorVer = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT);
SpmMinorVersion = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0); CalleeSpmMinorVer = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0);
// Different major revision values indicate possibly incompatible functions. // Different major revision values indicate possibly incompatible functions.
// For two revisions, A and B, for which the major revision values are // For two revisions, A and B, for which the major revision values are
@ -196,17 +216,17 @@ GetSpmVersion (VOID)
// revision A must work in a compatible way with revision B. // revision A must work in a compatible way with revision B.
// However, it is possible for revision B to have a higher // However, it is possible for revision B to have a higher
// function count than revision A. // function count than revision A.
if ((SpmMajorVersion == mSpmMajorVer) && if ((CalleeSpmMajorVer == CallerSpmMajorVer) &&
(SpmMinorVersion >= mSpmMinorVer)) (CalleeSpmMinorVer >= CallerSpmMinorVer))
{ {
DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n", DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n",
SpmMajorVersion, SpmMinorVersion)); CalleeSpmMajorVer, CalleeSpmMinorVer));
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
else else
{ {
DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n", DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Callee Version: Major=0x%x, Minor=0x%x.\n Caller: Major=0x%x, Minor>=0x%x.\n",
SpmMajorVersion, SpmMinorVersion, mSpmMajorVer, mSpmMinorVer)); CalleeSpmMajorVer, CalleeSpmMinorVer, CallerSpmMajorVer, CallerSpmMinorVer));
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
} }

View File

@ -51,5 +51,8 @@
gEfiStandaloneMmNonSecureBufferGuid gEfiStandaloneMmNonSecureBufferGuid
gEfiArmTfCpuDriverEpDescriptorGuid gEfiArmTfCpuDriverEpDescriptorGuid
[FeaturePcd.AARCH64]
gArmTokenSpaceGuid.PcdFfaEnable
[BuildOptions] [BuildOptions]
GCC:*_*_*_CC_FLAGS = -fpie GCC:*_*_*_CC_FLAGS = -fpie