From d65b78f101b3f2845dc20b9556faf3f14904f3c5 Mon Sep 17 00:00:00 2001 From: Sumit Garg Date: Wed, 1 Aug 2018 11:37:41 +0530 Subject: [PATCH] ArmPkg: Add initial OpteeLib implementation This is initial version of OP-TEE library that provides api's to communicate with OP-TEE OS (Trusted OS based on ARM TrustZone) via secure monitor calls. Currently it provides basic api to detect OP-TEE presence via UID matching. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Sumit Garg Reviewed-by: Ard Biesheuvel --- ArmPkg/ArmPkg.dec | 1 + ArmPkg/ArmPkg.dsc | 2 + ArmPkg/Include/IndustryStandard/ArmStdSmc.h | 8 ++++ ArmPkg/Include/Library/OpteeLib.h | 34 +++++++++++++++ ArmPkg/Library/OpteeLib/Optee.c | 46 +++++++++++++++++++++ ArmPkg/Library/OpteeLib/OpteeLib.inf | 33 +++++++++++++++ 6 files changed, 124 insertions(+) create mode 100644 ArmPkg/Include/Library/OpteeLib.h create mode 100644 ArmPkg/Library/OpteeLib/Optee.c create mode 100644 ArmPkg/Library/OpteeLib/OpteeLib.inf diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 3aa229fe2e..84e57a0bf0 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -41,6 +41,7 @@ ArmGicArchLib|Include/Library/ArmGicArchLib.h ArmMtlLib|ArmPlatformPkg/Include/Library/ArmMtlLib.h ArmSvcLib|Include/Library/ArmSvcLib.h + OpteeLib|Include/Library/OpteeLib.h [Guids.common] gArmTokenSpaceGuid = { 0xBB11ECFE, 0x820F, 0x4968, { 0xBB, 0xA6, 0xF7, 0x6A, 0xFE, 0x30, 0x25, 0x96 } } diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 76d768126b..810caaff62 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -71,6 +71,7 @@ ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf + OpteeLib|ArmPkg/Library/OpteeLib/OpteeLib.inf UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf @@ -131,6 +132,7 @@ ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf + ArmPkg/Library/OpteeLib/OpteeLib.inf ArmPkg/Filesystem/SemihostFs/SemihostFs.inf diff --git a/ArmPkg/Include/IndustryStandard/ArmStdSmc.h b/ArmPkg/Include/IndustryStandard/ArmStdSmc.h index 37d0796649..a3df8e5e51 100644 --- a/ArmPkg/Include/IndustryStandard/ArmStdSmc.h +++ b/ArmPkg/Include/IndustryStandard/ArmStdSmc.h @@ -111,4 +111,12 @@ #define ARM_SMC_ID_PSCI_AFFINITY_INFO_OFF 1 #define ARM_SMC_ID_PSCI_AFFINITY_INFO_ON_PENDING 2 +/* + * SMC function IDs for Trusted OS Service queries + */ +#define ARM_SMC_ID_TOS_CALL_COUNT 0xbf00ff00 +#define ARM_SMC_ID_TOS_UID 0xbf00ff01 +/* 0xbf00ff02 is reserved */ +#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03 + #endif diff --git a/ArmPkg/Include/Library/OpteeLib.h b/ArmPkg/Include/Library/OpteeLib.h new file mode 100644 index 0000000000..f65d8674d9 --- /dev/null +++ b/ArmPkg/Include/Library/OpteeLib.h @@ -0,0 +1,34 @@ +/** @file + OP-TEE specific header file. + + Copyright (c) 2018, Linaro Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _OPTEE_H_ +#define _OPTEE_H_ + +/* + * The 'Trusted OS Call UID' is supposed to return the following UUID for + * OP-TEE OS. This is a 128-bit value. + */ +#define OPTEE_OS_UID0 0x384fb3e0 +#define OPTEE_OS_UID1 0xe7f811e3 +#define OPTEE_OS_UID2 0xaf630002 +#define OPTEE_OS_UID3 0xa5d5c51b + +BOOLEAN +EFIAPI +IsOpteePresent ( + VOID + ); + +#endif diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c new file mode 100644 index 0000000000..574527f8b5 --- /dev/null +++ b/ArmPkg/Library/OpteeLib/Optee.c @@ -0,0 +1,46 @@ +/** @file + Api's to communicate with OP-TEE OS (Trusted OS based on ARM TrustZone) via + secure monitor calls. + + Copyright (c) 2018, Linaro Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include + +#include + +/** + Check for OP-TEE presence. +**/ +BOOLEAN +EFIAPI +IsOpteePresent ( + VOID + ) +{ + ARM_SMC_ARGS ArmSmcArgs; + + // Send a Trusted OS Calls UID command + ArmSmcArgs.Arg0 = ARM_SMC_ID_TOS_UID; + ArmCallSmc (&ArmSmcArgs); + + if ((ArmSmcArgs.Arg0 == OPTEE_OS_UID0) && + (ArmSmcArgs.Arg1 == OPTEE_OS_UID1) && + (ArmSmcArgs.Arg2 == OPTEE_OS_UID2) && + (ArmSmcArgs.Arg3 == OPTEE_OS_UID3)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/ArmPkg/Library/OpteeLib/OpteeLib.inf b/ArmPkg/Library/OpteeLib/OpteeLib.inf new file mode 100644 index 0000000000..5abd427379 --- /dev/null +++ b/ArmPkg/Library/OpteeLib/OpteeLib.inf @@ -0,0 +1,33 @@ +#/** @file +# OP-TEE lib using secure monitor calls +# +# Copyright (c) 2018, Linaro Ltd. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = OpteeLib + FILE_GUID = BCD50D08-9568-45B2-84DF-30AE0279AD46 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = OpteeLib + +[Sources] + Optee.c + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + ArmSmcLib + BaseLib -- 2.39.2