From c98f7f75508912c086158892fc56b0c3b85abcf1 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Mon, 13 May 2024 18:43:11 +0200 Subject: ArmVirtPkg: Use dynamic PCD to set the SMCCC conduit On ARM systems, whether SMC or HVC instructions need to be used to issue monitor calls is typically dependent on the exception level, but there are also cases where EL1 might use SMC instructions, so there is no hard and fast rule. For ArmVirtQemu, this does depend strictly on the exception level, so set the default to HVC (for EL1 execution) and override it to SMC when booted at EL2. Cc: Ard Biesheuvel Cc: Leif Lindholm Cc: Sami Mujawar Cc: Gerd Hoffmann Committed-by: Ard Biesheuvel Signed-off-by: Doug Flick [MSFT] Reviewed-by: Ard Biesheuvel --- ArmVirtPkg/ArmVirtCloudHv.dsc | 3 +++ ArmVirtPkg/ArmVirtQemu.dsc | 4 ++++ ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 ++ ArmVirtPkg/ArmVirtXen.dsc | 2 ++ ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c | 14 ++++++++++++++ ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf | 1 + 6 files changed, 26 insertions(+) diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index 5cb2a60..d5055a0 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -201,6 +201,9 @@ [PcdsDynamicHii] gUefiOvmfPkgTokenSpaceGuid.PcdForceNoAcpi|L"ForceNoAcpi"|gOvmfVariableGuid|0x0|FALSE|NV,BS +[PcdsPatchableInModule.common] + gArmTokenSpaceGuid.PcdMonitorConduitHvc|TRUE + ################################################################################ # # Components Section - list of all EDK II Modules needed by this Platform diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 4498ca5..80dd4fb 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -293,6 +293,10 @@ gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01 gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01 + # whether to use HVC or SMC to issue monitor calls - this typically depends + # on the exception level at which the UEFI system firmware executes + gArmTokenSpaceGuid.PcdMonitorConduitHvc|TRUE + # # TPM2 support # diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 94f4859..2700b97 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -203,6 +203,8 @@ gArmTokenSpaceGuid.PcdFdBaseAddress|0x0 gArmTokenSpaceGuid.PcdFvBaseAddress|0x0 + gArmTokenSpaceGuid.PcdMonitorConduitHvc|TRUE + [PcdsDynamicDefault.common] gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|3 diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index 5809832..ceb37f8 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -120,6 +120,8 @@ gArmTokenSpaceGuid.PcdFdBaseAddress|0x0 gArmTokenSpaceGuid.PcdFvBaseAddress|0x0 + gArmTokenSpaceGuid.PcdMonitorConduitHvc|TRUE + [PcdsDynamicDefault.common] gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum|0x0 diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c index 7ab4aa2..b8e9208 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c @@ -18,6 +18,8 @@ #include #include +#include + #include #include @@ -224,5 +226,17 @@ PlatformPeim ( BuildFvHob (PcdGet64 (PcdFvBaseAddress), PcdGet32 (PcdFvSize)); + #ifdef MDE_CPU_AARCH64 + // + // Set the SMCCC conduit to SMC if executing at EL2, which is typically the + // exception level that services HVCs rather than the one that invokes them. + // + if (ArmReadCurrentEL () == AARCH64_EL2) { + Status = PcdSetBoolS (PcdMonitorConduitHvc, FALSE); + ASSERT_EFI_ERROR (Status); + } + + #endif + return EFI_SUCCESS; } diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf index e9a34b6..a38b89c1 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf @@ -45,6 +45,7 @@ [Pcd] gArmTokenSpaceGuid.PcdFvBaseAddress + gArmTokenSpaceGuid.PcdMonitorConduitHvc gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## SOMETIMES_PRODUCES gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress -- cgit v1.1