]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/OpteeLib: Add APIs to communicate with OP-TEE
authorSumit Garg <sumit.garg@linaro.org>
Mon, 22 Oct 2018 06:29:36 +0000 (11:59 +0530)
committerLeif Lindholm <leif.lindholm@linaro.org>
Tue, 30 Oct 2018 14:21:45 +0000 (14:21 +0000)
Add following APIs to communicate with OP-TEE pseudo/early TAs:
1. OpteeInit
2. OpteeOpenSession
3. OpteeCloseSession
4. OpteeInvokeFunc

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
ArmPkg/Include/Library/OpteeLib.h
ArmPkg/Library/OpteeLib/Optee.c
ArmPkg/Library/OpteeLib/OpteeLib.inf
ArmPkg/Library/OpteeLib/OpteeSmc.h [new file with mode: 0644]

index f65d8674d9b8bddf70877f0f4a8d5622bea0af66..6884d5681831c90ce1c402929aba82403d131785 100644 (file)
 #define OPTEE_OS_UID2          0xaf630002\r
 #define OPTEE_OS_UID3          0xa5d5c51b\r
 \r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE                0x0\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT         0x1\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT        0x2\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT         0x3\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT        0x9\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT       0xa\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT        0xb\r
+\r
+#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK                0xff\r
+\r
+#define OPTEE_ORIGIN_COMMUNICATION              0x00000002\r
+#define OPTEE_ERROR_COMMUNICATION               0xFFFF000E\r
+\r
+typedef struct {\r
+  UINT64    BufferAddress;\r
+  UINT64    Size;\r
+  UINT64    SharedMemoryReference;\r
+} OPTEE_MESSAGE_PARAM_MEMORY;\r
+\r
+typedef struct {\r
+  UINT64    A;\r
+  UINT64    B;\r
+  UINT64    C;\r
+} OPTEE_MESSAGE_PARAM_VALUE;\r
+\r
+typedef struct {\r
+  UINT64 Attribute;\r
+  union {\r
+    OPTEE_MESSAGE_PARAM_MEMORY   Memory;\r
+    OPTEE_MESSAGE_PARAM_VALUE    Value;\r
+  } Union;\r
+} OPTEE_MESSAGE_PARAM;\r
+\r
+#define OPTEE_MAX_CALL_PARAMS       4\r
+\r
+typedef struct {\r
+  UINT32    Command;\r
+  UINT32    Function;\r
+  UINT32    Session;\r
+  UINT32    CancelId;\r
+  UINT32    Pad;\r
+  UINT32    Return;\r
+  UINT32    ReturnOrigin;\r
+  UINT32    NumParams;\r
+\r
+  // NumParams tells the actual number of element in Params\r
+  OPTEE_MESSAGE_PARAM  Params[OPTEE_MAX_CALL_PARAMS];\r
+} OPTEE_MESSAGE_ARG;\r
+\r
+typedef struct {\r
+  EFI_GUID  Uuid;           // [in] GUID/UUID of the Trusted Application\r
+  UINT32    Session;        // [out] Session id\r
+  UINT32    Return;         // [out] Return value\r
+  UINT32    ReturnOrigin;   // [out] Origin of the return value\r
+} OPTEE_OPEN_SESSION_ARG;\r
+\r
+typedef struct {\r
+  UINT32    Function;       // [in] Trusted Application function, specific to the TA\r
+  UINT32    Session;        // [in] Session id\r
+  UINT32    Return;         // [out] Return value\r
+  UINT32    ReturnOrigin;   // [out] Origin of the return value\r
+  OPTEE_MESSAGE_PARAM  Params[OPTEE_MAX_CALL_PARAMS]; // Params for function to be invoked\r
+} OPTEE_INVOKE_FUNCTION_ARG;\r
+\r
 BOOLEAN\r
 EFIAPI\r
 IsOpteePresent (\r
   VOID\r
   );\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+OpteeInit (\r
+  VOID\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeOpenSession (\r
+  IN OUT OPTEE_OPEN_SESSION_ARG      *OpenSessionArg\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeCloseSession (\r
+  IN UINT32                      Session\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeInvokeFunction (\r
+  IN OUT OPTEE_INVOKE_FUNCTION_ARG       *InvokeFunctionArg\r
+  );\r
+\r
 #endif\r
index 574527f8b5ea7f97a65ceafb2fb425f8a0910caf..8ac31cb282663f2a1dd3c99acbf9ffe434573e2c 100644 (file)
 \r
 **/\r
 \r
+#include <Library/ArmMmuLib.h>\r
 #include <Library/ArmSmcLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
 #include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
 #include <Library/OpteeLib.h>\r
 \r
 #include <IndustryStandard/ArmStdSmc.h>\r
+#include <OpteeSmc.h>\r
+#include <Uefi.h>\r
+\r
+STATIC OPTEE_SHARED_MEMORY_INFORMATION OpteeSharedMemoryInformation = { 0 };\r
 \r
 /**\r
   Check for OP-TEE presence.\r
@@ -31,6 +38,7 @@ IsOpteePresent (
 {\r
   ARM_SMC_ARGS ArmSmcArgs;\r
 \r
+  ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));\r
   // Send a Trusted OS Calls UID command\r
   ArmSmcArgs.Arg0 = ARM_SMC_ID_TOS_UID;\r
   ArmCallSmc (&ArmSmcArgs);\r
@@ -44,3 +52,387 @@ IsOpteePresent (
     return FALSE;\r
   }\r
 }\r
+\r
+STATIC\r
+EFI_STATUS\r
+OpteeSharedMemoryRemap (\r
+  VOID\r
+  )\r
+{\r
+  ARM_SMC_ARGS                 ArmSmcArgs;\r
+  EFI_PHYSICAL_ADDRESS         PhysicalAddress;\r
+  EFI_PHYSICAL_ADDRESS         Start;\r
+  EFI_PHYSICAL_ADDRESS         End;\r
+  EFI_STATUS                   Status;\r
+  UINTN                        Size;\r
+\r
+  ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));\r
+  ArmSmcArgs.Arg0 = OPTEE_SMC_GET_SHARED_MEMORY_CONFIG;\r
+\r
+  ArmCallSmc (&ArmSmcArgs);\r
+  if (ArmSmcArgs.Arg0 != OPTEE_SMC_RETURN_OK) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE shared memory not supported\n"));\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (ArmSmcArgs.Arg3 != OPTEE_SMC_SHARED_MEMORY_CACHED) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE: Only normal cached shared memory supported\n"));\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Start = (ArmSmcArgs.Arg1 + SIZE_4KB - 1) & ~(SIZE_4KB - 1);\r
+  End = (ArmSmcArgs.Arg1 + ArmSmcArgs.Arg2) & ~(SIZE_4KB - 1);\r
+  PhysicalAddress = Start;\r
+  Size = End - Start;\r
+\r
+  if (Size < SIZE_4KB) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE shared memory too small\n"));\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  Status = ArmSetMemoryAttributes (PhysicalAddress, Size, EFI_MEMORY_WB);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  OpteeSharedMemoryInformation.Base = (UINTN)PhysicalAddress;\r
+  OpteeSharedMemoryInformation.Size = Size;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeInit (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS      Status;\r
+\r
+  if (!IsOpteePresent ()) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE not present\n"));\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Status = OpteeSharedMemoryRemap ();\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE shared memory remap failed\n"));\r
+    return Status;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Does Standard SMC to OP-TEE in secure world.\r
+\r
+  @param[in]  PhysicalArg   Physical address of message to pass to secure world\r
+\r
+  @return                   0 on success, secure world return code otherwise\r
+\r
+**/\r
+STATIC\r
+UINT32\r
+OpteeCallWithArg (\r
+  IN EFI_PHYSICAL_ADDRESS PhysicalArg\r
+  )\r
+{\r
+  ARM_SMC_ARGS ArmSmcArgs;\r
+\r
+  ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));\r
+  ArmSmcArgs.Arg0 = OPTEE_SMC_CALL_WITH_ARG;\r
+  ArmSmcArgs.Arg1 = (UINT32)(PhysicalArg >> 32);\r
+  ArmSmcArgs.Arg2 = (UINT32)PhysicalArg;\r
+\r
+  while (TRUE) {\r
+    ArmCallSmc (&ArmSmcArgs);\r
+\r
+    if (ArmSmcArgs.Arg0 == OPTEE_SMC_RETURN_RPC_FOREIGN_INTERRUPT) {\r
+      //\r
+      // A foreign interrupt was raised while secure world was\r
+      // executing, since they are handled in UEFI a dummy RPC is\r
+      // performed to let UEFI take the interrupt through the normal\r
+      // vector.\r
+      //\r
+      ArmSmcArgs.Arg0 = OPTEE_SMC_RETURN_FROM_RPC;\r
+    } else {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return ArmSmcArgs.Arg0;\r
+}\r
+\r
+STATIC\r
+VOID\r
+EfiGuidToRfc4122Uuid (\r
+  OUT RFC4122_UUID       *Rfc4122Uuid,\r
+  IN EFI_GUID            *Guid\r
+  )\r
+{\r
+  Rfc4122Uuid->Data1 = SwapBytes32 (Guid->Data1);\r
+  Rfc4122Uuid->Data2 = SwapBytes16 (Guid->Data2);\r
+  Rfc4122Uuid->Data3 = SwapBytes16 (Guid->Data3);\r
+  CopyMem (Rfc4122Uuid->Data4, Guid->Data4, sizeof (Rfc4122Uuid->Data4));\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeOpenSession (\r
+  IN OUT OPTEE_OPEN_SESSION_ARG      *OpenSessionArg\r
+  )\r
+{\r
+  OPTEE_MESSAGE_ARG    *MessageArg;\r
+\r
+  MessageArg = NULL;\r
+\r
+  if (OpteeSharedMemoryInformation.Base == 0) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE not initialized\n"));\r
+    return EFI_NOT_STARTED;\r
+  }\r
+\r
+  MessageArg = (OPTEE_MESSAGE_ARG *)OpteeSharedMemoryInformation.Base;\r
+  ZeroMem (MessageArg, sizeof (OPTEE_MESSAGE_ARG));\r
+\r
+  MessageArg->Command = OPTEE_MESSAGE_COMMAND_OPEN_SESSION;\r
+\r
+  //\r
+  // Initialize and add the meta parameters needed when opening a\r
+  // session.\r
+  //\r
+  MessageArg->Params[0].Attribute = OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT |\r
+                                    OPTEE_MESSAGE_ATTRIBUTE_META;\r
+  MessageArg->Params[1].Attribute = OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT |\r
+                                    OPTEE_MESSAGE_ATTRIBUTE_META;\r
+  EfiGuidToRfc4122Uuid (\r
+    (RFC4122_UUID *)&MessageArg->Params[0].Union.Value,\r
+    &OpenSessionArg->Uuid\r
+    );\r
+  ZeroMem (&MessageArg->Params[1].Union.Value, sizeof (EFI_GUID));\r
+  MessageArg->Params[1].Union.Value.C = OPTEE_LOGIN_PUBLIC;\r
+\r
+  MessageArg->NumParams = 2;\r
+\r
+  if (OpteeCallWithArg ((EFI_PHYSICAL_ADDRESS)MessageArg)) {\r
+    MessageArg->Return = OPTEE_ERROR_COMMUNICATION;\r
+    MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION;\r
+  }\r
+\r
+  OpenSessionArg->Session = MessageArg->Session;\r
+  OpenSessionArg->Return = MessageArg->Return;\r
+  OpenSessionArg->ReturnOrigin = MessageArg->ReturnOrigin;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeCloseSession (\r
+  IN UINT32                  Session\r
+  )\r
+{\r
+  OPTEE_MESSAGE_ARG    *MessageArg;\r
+\r
+  MessageArg = NULL;\r
+\r
+  if (OpteeSharedMemoryInformation.Base == 0) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE not initialized\n"));\r
+    return EFI_NOT_STARTED;\r
+  }\r
+\r
+  MessageArg = (OPTEE_MESSAGE_ARG *)OpteeSharedMemoryInformation.Base;\r
+  ZeroMem (MessageArg, sizeof (OPTEE_MESSAGE_ARG));\r
+\r
+  MessageArg->Command = OPTEE_MESSAGE_COMMAND_CLOSE_SESSION;\r
+  MessageArg->Session = Session;\r
+\r
+  OpteeCallWithArg ((EFI_PHYSICAL_ADDRESS)MessageArg);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+OpteeToMessageParam (\r
+  OUT OPTEE_MESSAGE_PARAM    *MessageParams,\r
+  IN UINT32                  NumParams,\r
+  IN OPTEE_MESSAGE_PARAM     *InParams\r
+  )\r
+{\r
+  UINT32                  Idx;\r
+  UINTN                   ParamSharedMemoryAddress;\r
+  UINTN                   SharedMemorySize;\r
+  UINTN                   Size;\r
+\r
+  Size = (sizeof (OPTEE_MESSAGE_ARG) + sizeof (UINT64) - 1) &\r
+          ~(sizeof (UINT64) - 1);\r
+  ParamSharedMemoryAddress = OpteeSharedMemoryInformation.Base + Size;\r
+  SharedMemorySize = OpteeSharedMemoryInformation.Size - Size;\r
+\r
+  for (Idx = 0; Idx < NumParams; Idx++) {\r
+    CONST OPTEE_MESSAGE_PARAM    *InParam;\r
+    OPTEE_MESSAGE_PARAM          *MessageParam;\r
+    UINT32                       Attribute;\r
+\r
+    InParam = InParams + Idx;\r
+    MessageParam = MessageParams + Idx;\r
+    Attribute = InParam->Attribute & OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK;\r
+\r
+    switch (Attribute) {\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE:\r
+      MessageParam->Attribute = OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE;\r
+      ZeroMem (&MessageParam->Union, sizeof (MessageParam->Union));\r
+      break;\r
+\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT:\r
+      MessageParam->Attribute = Attribute;\r
+      MessageParam->Union.Value.A = InParam->Union.Value.A;\r
+      MessageParam->Union.Value.B = InParam->Union.Value.B;\r
+      MessageParam->Union.Value.C = InParam->Union.Value.C;\r
+      break;\r
+\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT:\r
+      MessageParam->Attribute = Attribute;\r
+\r
+      if (InParam->Union.Memory.Size > SharedMemorySize) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
+      CopyMem (\r
+        (VOID *)ParamSharedMemoryAddress,\r
+        (VOID *)InParam->Union.Memory.BufferAddress,\r
+        InParam->Union.Memory.Size\r
+        );\r
+      MessageParam->Union.Memory.BufferAddress = (UINT64)ParamSharedMemoryAddress;\r
+      MessageParam->Union.Memory.Size = InParam->Union.Memory.Size;\r
+\r
+      Size = (InParam->Union.Memory.Size + sizeof (UINT64) - 1) &\r
+              ~(sizeof (UINT64) - 1);\r
+      ParamSharedMemoryAddress += Size;\r
+      SharedMemorySize -= Size;\r
+      break;\r
+\r
+    default:\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+OpteeFromMessageParam (\r
+  OUT OPTEE_MESSAGE_PARAM    *OutParams,\r
+  IN UINT32                  NumParams,\r
+  IN OPTEE_MESSAGE_PARAM     *MessageParams\r
+  )\r
+{\r
+  UINT32                 Idx;\r
+\r
+  for (Idx = 0; Idx < NumParams; Idx++) {\r
+    OPTEE_MESSAGE_PARAM          *OutParam;\r
+    CONST OPTEE_MESSAGE_PARAM    *MessageParam;\r
+    UINT32                   Attribute;\r
+\r
+    OutParam = OutParams + Idx;\r
+    MessageParam = MessageParams + Idx;\r
+    Attribute = MessageParam->Attribute & OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK;\r
+\r
+    switch (Attribute) {\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE:\r
+      OutParam->Attribute = OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE;\r
+      ZeroMem (&OutParam->Union, sizeof (OutParam->Union));\r
+      break;\r
+\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT:\r
+      OutParam->Attribute = Attribute;\r
+      OutParam->Union.Value.A = MessageParam->Union.Value.A;\r
+      OutParam->Union.Value.B = MessageParam->Union.Value.B;\r
+      OutParam->Union.Value.C = MessageParam->Union.Value.C;\r
+      break;\r
+\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT:\r
+    case OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT:\r
+      OutParam->Attribute = Attribute;\r
+\r
+      if (MessageParam->Union.Memory.Size > OutParam->Union.Memory.Size) {\r
+        return EFI_BAD_BUFFER_SIZE;\r
+      }\r
+\r
+      CopyMem (\r
+        (VOID *)OutParam->Union.Memory.BufferAddress,\r
+        (VOID *)MessageParam->Union.Memory.BufferAddress,\r
+        MessageParam->Union.Memory.Size\r
+        );\r
+      OutParam->Union.Memory.Size = MessageParam->Union.Memory.Size;\r
+      break;\r
+\r
+    default:\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+OpteeInvokeFunction (\r
+  IN OUT OPTEE_INVOKE_FUNCTION_ARG       *InvokeFunctionArg\r
+  )\r
+{\r
+  EFI_STATUS       Status;\r
+  OPTEE_MESSAGE_ARG    *MessageArg;\r
+\r
+  MessageArg = NULL;\r
+\r
+  if (OpteeSharedMemoryInformation.Base == 0) {\r
+    DEBUG ((DEBUG_WARN, "OP-TEE not initialized\n"));\r
+    return EFI_NOT_STARTED;\r
+  }\r
+\r
+  MessageArg = (OPTEE_MESSAGE_ARG *)OpteeSharedMemoryInformation.Base;\r
+  ZeroMem (MessageArg, sizeof (OPTEE_MESSAGE_ARG));\r
+\r
+  MessageArg->Command = OPTEE_MESSAGE_COMMAND_INVOKE_FUNCTION;\r
+  MessageArg->Function = InvokeFunctionArg->Function;\r
+  MessageArg->Session = InvokeFunctionArg->Session;\r
+\r
+  Status = OpteeToMessageParam (\r
+             MessageArg->Params,\r
+             OPTEE_MAX_CALL_PARAMS,\r
+             InvokeFunctionArg->Params\r
+             );\r
+  if (Status) {\r
+    return Status;\r
+  }\r
+\r
+  MessageArg->NumParams = OPTEE_MAX_CALL_PARAMS;\r
+\r
+  if (OpteeCallWithArg ((EFI_PHYSICAL_ADDRESS)MessageArg)) {\r
+    MessageArg->Return = OPTEE_ERROR_COMMUNICATION;\r
+    MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION;\r
+  }\r
+\r
+  if (OpteeFromMessageParam (\r
+        InvokeFunctionArg->Params,\r
+        OPTEE_MAX_CALL_PARAMS,\r
+        MessageArg->Params\r
+        )) {\r
+    MessageArg->Return = OPTEE_ERROR_COMMUNICATION;\r
+    MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION;\r
+  }\r
+\r
+  InvokeFunctionArg->Return = MessageArg->Return;\r
+  InvokeFunctionArg->ReturnOrigin = MessageArg->ReturnOrigin;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
index 5abd427379cc3c270d89e533cd3b61950cb0dad9..e03054a7167d6000c1e91a686abf9bf750185583 100644 (file)
 \r
 [Sources]\r
   Optee.c\r
+  OpteeSmc.h\r
 \r
 [Packages]\r
   ArmPkg/ArmPkg.dec\r
   MdePkg/MdePkg.dec\r
 \r
 [LibraryClasses]\r
+  ArmMmuLib\r
   ArmSmcLib\r
   BaseLib\r
diff --git a/ArmPkg/Library/OpteeLib/OpteeSmc.h b/ArmPkg/Library/OpteeLib/OpteeSmc.h
new file mode 100644 (file)
index 0000000..9cccd81
--- /dev/null
@@ -0,0 +1,53 @@
+/** @file\r
+  OP-TEE SMC header file.\r
+\r
+  Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>\r
+\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _OPTEE_SMC_H_\r
+#define _OPTEE_SMC_H_\r
+\r
+/* Returned in Arg0 only from Trusted OS functions */\r
+#define OPTEE_SMC_RETURN_OK                     0x0\r
+\r
+#define OPTEE_SMC_RETURN_FROM_RPC               0x32000003\r
+#define OPTEE_SMC_CALL_WITH_ARG                 0x32000004\r
+#define OPTEE_SMC_GET_SHARED_MEMORY_CONFIG      0xb2000007\r
+\r
+#define OPTEE_SMC_SHARED_MEMORY_CACHED          1\r
+\r
+#define OPTEE_SMC_RETURN_RPC_FOREIGN_INTERRUPT  0xffff0004\r
+\r
+#define OPTEE_MESSAGE_COMMAND_OPEN_SESSION      0\r
+#define OPTEE_MESSAGE_COMMAND_INVOKE_FUNCTION   1\r
+#define OPTEE_MESSAGE_COMMAND_CLOSE_SESSION     2\r
+\r
+#define OPTEE_MESSAGE_ATTRIBUTE_META            0x100\r
+\r
+#define OPTEE_LOGIN_PUBLIC                      0x0\r
+\r
+typedef struct {\r
+  UINTN    Base;\r
+  UINTN    Size;\r
+} OPTEE_SHARED_MEMORY_INFORMATION;\r
+\r
+//\r
+// UUID struct compliant with RFC4122 (network byte order).\r
+//\r
+typedef struct {\r
+  UINT32  Data1;\r
+  UINT16  Data2;\r
+  UINT16  Data3;\r
+  UINT8   Data4[8];\r
+} RFC4122_UUID;\r
+\r
+#endif\r