diff mbox series

[edk2,1/1] ArmPkg: Add initial OpteeLib implementation

Message ID 1533034599-21418-1-git-send-email-sumit.garg@linaro.org
State Superseded
Headers show
Series [edk2,1/1] ArmPkg: Add initial OpteeLib implementation | expand

Commit Message

Sumit Garg July 31, 2018, 10:56 a.m. UTC
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 <sumit.garg@linaro.org>

---
 ArmPkg/ArmPkg.dec                           |  1 +
 ArmPkg/ArmPkg.dsc                           |  1 +
 ArmPkg/Include/IndustryStandard/ArmStdSmc.h |  8 +++++
 ArmPkg/Include/Library/OpteeLib.h           | 34 +++++++++++++++++++++
 ArmPkg/Library/OpteeLib/Optee.c             | 46 +++++++++++++++++++++++++++++
 ArmPkg/Library/OpteeLib/OpteeLib.inf        | 34 +++++++++++++++++++++
 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

-- 
2.7.4
diff mbox series

Patch

diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
index 3aa229fe2ec9..84e57a0bf01c 100644
--- a/ArmPkg/ArmPkg.dec
+++ b/ArmPkg/ArmPkg.dec
@@ -41,6 +41,7 @@  [LibraryClasses.common]
   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 76d768126b17..4149cef335df 100644
--- a/ArmPkg/ArmPkg.dsc
+++ b/ArmPkg/ArmPkg.dsc
@@ -71,6 +71,7 @@  [LibraryClasses.common]
   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
diff --git a/ArmPkg/Include/IndustryStandard/ArmStdSmc.h b/ArmPkg/Include/IndustryStandard/ArmStdSmc.h
index 37d079664986..a3df8e5e51de 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 000000000000..0806d9837968
--- /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.<BR>
+
+  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
+
+UINT32
+EFIAPI
+IsOpteePresent (
+  VOID
+  );
+
+#endif
diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c
new file mode 100644
index 000000000000..92d17df2409c
--- /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.<BR>
+
+  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 <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ArmSmcLib.h>
+#include <Library/OpteeLib.h>
+
+#include <IndustryStandard/ArmStdSmc.h>
+
+/**
+  Check for OP-TEE presence.
+**/
+UINT32
+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 1;
+  else
+      return 0;
+}
diff --git a/ArmPkg/Library/OpteeLib/OpteeLib.inf b/ArmPkg/Library/OpteeLib/OpteeLib.inf
new file mode 100644
index 000000000000..602716030738
--- /dev/null
+++ b/ArmPkg/Library/OpteeLib/OpteeLib.inf
@@ -0,0 +1,34 @@ 
+#/** @file
+# OP-TEE lib using secure monitor calls
+#
+# Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
+#
+#  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                    = 0x00010005
+  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]
+  DebugLib
+  BaseLib
+  ArmSmcLib