diff mbox series

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

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

Commit Message

Sumit Garg Aug. 1, 2018, 6:07 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                           |  2 ++
 ArmPkg/Include/IndustryStandard/ArmStdSmc.h |  8 +++++
 ArmPkg/Include/Library/OpteeLib.h           | 34 +++++++++++++++++++++
 ArmPkg/Library/OpteeLib/Optee.c             | 47 +++++++++++++++++++++++++++++
 ArmPkg/Library/OpteeLib/OpteeLib.inf        | 34 +++++++++++++++++++++
 6 files changed, 126 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

Comments

Ard Biesheuvel Aug. 1, 2018, 9:07 a.m. UTC | #1
On 1 August 2018 at 08:07, Sumit Garg <sumit.garg@linaro.org> wrote:
> 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                           |  2 ++

>  ArmPkg/Include/IndustryStandard/ArmStdSmc.h |  8 +++++

>  ArmPkg/Include/Library/OpteeLib.h           | 34 +++++++++++++++++++++

>  ArmPkg/Library/OpteeLib/Optee.c             | 47 +++++++++++++++++++++++++++++

>  ArmPkg/Library/OpteeLib/OpteeLib.inf        | 34 +++++++++++++++++++++

>  6 files changed, 126 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 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..2550c4ee8a57 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

> @@ -131,6 +132,7 @@ [Components.common]

>    ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf

>    ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf

>    ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf

> +  OpteeLib|ArmPkg/Library/OpteeLib/OpteeLib.inf

>


This needs the leading OpteeLib| removed

>    ArmPkg/Filesystem/SemihostFs/SemihostFs.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..f65d8674d9b8

> --- /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

> +

> +BOOLEAN

> +EFIAPI

> +IsOpteePresent (

> +  VOID

> +  );

> +

> +#endif

> diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c

> new file mode 100644

> index 000000000000..905e0aaa5026

> --- /dev/null

> +++ b/ArmPkg/Library/OpteeLib/Optee.c

> @@ -0,0 +1,47 @@

> +/** @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.

> +**/

> +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;


These should have 2 spaces of indentation only.

With that updated:

Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>


I have made the modifications myself, and pushed the patch as d65b78f101b3

Thanks!

> +  }

> +}

> diff --git a/ArmPkg/Library/OpteeLib/OpteeLib.inf b/ArmPkg/Library/OpteeLib/OpteeLib.inf

> new file mode 100644

> index 000000000000..449e28287f3f

> --- /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                    = 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

> +  DebugLib

> --

> 2.7.4

>
Sumit Garg Aug. 1, 2018, 10:58 a.m. UTC | #2
On Wed, 1 Aug 2018 at 14:37, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>

> On 1 August 2018 at 08:07, Sumit Garg <sumit.garg@linaro.org> wrote:

> > 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                           |  2 ++

> >  ArmPkg/Include/IndustryStandard/ArmStdSmc.h |  8 +++++

> >  ArmPkg/Include/Library/OpteeLib.h           | 34 +++++++++++++++++++++

> >  ArmPkg/Library/OpteeLib/Optee.c             | 47 +++++++++++++++++++++++++++++

> >  ArmPkg/Library/OpteeLib/OpteeLib.inf        | 34 +++++++++++++++++++++

> >  6 files changed, 126 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 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..2550c4ee8a57 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

> > @@ -131,6 +132,7 @@ [Components.common]

> >    ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf

> >    ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf

> >    ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf

> > +  OpteeLib|ArmPkg/Library/OpteeLib/OpteeLib.inf

> >

>

> This needs the leading OpteeLib| removed

>

> >    ArmPkg/Filesystem/SemihostFs/SemihostFs.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..f65d8674d9b8

> > --- /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

> > +

> > +BOOLEAN

> > +EFIAPI

> > +IsOpteePresent (

> > +  VOID

> > +  );

> > +

> > +#endif

> > diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c

> > new file mode 100644

> > index 000000000000..905e0aaa5026

> > --- /dev/null

> > +++ b/ArmPkg/Library/OpteeLib/Optee.c

> > @@ -0,0 +1,47 @@

> > +/** @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.

> > +**/

> > +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;

>

> These should have 2 spaces of indentation only.

>

> With that updated:

>

> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

>

> I have made the modifications myself, and pushed the patch as d65b78f101b3

>


Thanks Ard for your review and merge.

-Sumit

> Thanks!

>

> > +  }

> > +}

> > diff --git a/ArmPkg/Library/OpteeLib/OpteeLib.inf b/ArmPkg/Library/OpteeLib/OpteeLib.inf

> > new file mode 100644

> > index 000000000000..449e28287f3f

> > --- /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                    = 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

> > +  DebugLib

> > --

> > 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..2550c4ee8a57 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
@@ -131,6 +132,7 @@  [Components.common]
   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
   ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
   ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
+  OpteeLib|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 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..f65d8674d9b8
--- /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
+
+BOOLEAN
+EFIAPI
+IsOpteePresent (
+  VOID
+  );
+
+#endif
diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c
new file mode 100644
index 000000000000..905e0aaa5026
--- /dev/null
+++ b/ArmPkg/Library/OpteeLib/Optee.c
@@ -0,0 +1,47 @@ 
+/** @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.
+**/
+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 000000000000..449e28287f3f
--- /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                    = 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
+  DebugLib