]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/SmmTcg2PhysicalPresenceLib.c
SecurityPkg: Tcg2PhysicalPresenceLib: Introduce StandaloneMm instance
[mirror_edk2.git] / SecurityPkg / Library / SmmTcg2PhysicalPresenceLib / SmmTcg2PhysicalPresenceLib.c
index 8afaa0a7857d1816fd5240b8f78308f9a70699bb..36d8b89dcdd93aec7e76da74fcbeaeaeacce68a0 100644 (file)
@@ -17,355 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 #include <PiSmm.h>\r
 \r
-#include <Guid/Tcg2PhysicalPresenceData.h>\r
-\r
-#include <Protocol/SmmVariable.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/Tcg2PpVendorLib.h>\r
-#include <Library/SmmServicesTableLib.h>\r
-\r
-#define     PP_INF_VERSION_1_2    "1.2"\r
-\r
-EFI_SMM_VARIABLE_PROTOCOL  *mTcg2PpSmmVariable;\r
-BOOLEAN                    mIsTcg2PPVerLowerThan_1_3 = FALSE;\r
-UINT32                     mTcg2PhysicalPresenceFlags;\r
-\r
-/**\r
-  The handler for TPM physical presence function:\r
-  Return TPM Operation Response to OS Environment.\r
-\r
-  This API should be invoked in OS runtime phase to interface with ACPI method.\r
-\r
-  @param[out]     MostRecentRequest Most recent operation request.\r
-  @param[out]     Response          Response to the most recent operation request.\r
-\r
-  @return Return Code for Return TPM Operation Response to OS Environment.\r
-**/\r
-UINT32\r
-EFIAPI\r
-Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (\r
-  OUT UINT32                *MostRecentRequest,\r
-  OUT UINT32                *Response\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  UINTN                             DataSize;\r
-  EFI_TCG2_PHYSICAL_PRESENCE        PpData;\r
-\r
-  DEBUG ((EFI_D_INFO, "[TPM2] ReturnOperationResponseToOsFunction\n"));\r
-\r
-  //\r
-  // Get the Physical Presence variable\r
-  //\r
-  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);\r
-  Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                 TCG2_PHYSICAL_PRESENCE_VARIABLE,\r
-                                 &gEfiTcg2PhysicalPresenceGuid,\r
-                                 NULL,\r
-                                 &DataSize,\r
-                                 &PpData\r
-                                 );\r
-  if (EFI_ERROR (Status)) {\r
-    *MostRecentRequest = 0;\r
-    *Response          = 0;\r
-    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
-    return TCG_PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE;\r
-  }\r
-\r
-  *MostRecentRequest = PpData.LastPPRequest;\r
-  *Response          = PpData.PPResponse;\r
-\r
-  return TCG_PP_RETURN_TPM_OPERATION_RESPONSE_SUCCESS;\r
-}\r
-\r
-/**\r
-  The handler for TPM physical presence function:\r
-  Submit TPM Operation Request to Pre-OS Environment and\r
-  Submit TPM Operation Request to Pre-OS Environment 2.\r
-\r
-  This API should be invoked in OS runtime phase to interface with ACPI method.\r
-\r
-  Caution: This function may receive untrusted input.\r
-\r
-  @param[in, out]  Pointer to OperationRequest TPM physical presence operation request.\r
-  @param[in, out]  Pointer to RequestParameter TPM physical presence operation request parameter.\r
-\r
-  @return Return Code for Submit TPM Operation Request to Pre-OS Environment and\r
-        Submit TPM Operation Request to Pre-OS Environment 2.\r
-  **/\r
-UINT32\r
-Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunctionEx (\r
-  IN OUT UINT32               *OperationRequest,\r
-  IN OUT UINT32               *RequestParameter\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  UINT32                            ReturnCode;\r
-  UINTN                             DataSize;\r
-  EFI_TCG2_PHYSICAL_PRESENCE        PpData;\r
-  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  Flags;\r
-\r
-  DEBUG ((EFI_D_INFO, "[TPM2] SubmitRequestToPreOSFunction, Request = %x, %x\n", *OperationRequest, *RequestParameter));\r
-  ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS;\r
-\r
-  //\r
-  // Get the Physical Presence variable\r
-  //\r
-  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);\r
-  Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                 TCG2_PHYSICAL_PRESENCE_VARIABLE,\r
-                                 &gEfiTcg2PhysicalPresenceGuid,\r
-                                 NULL,\r
-                                 &DataSize,\r
-                                 &PpData\r
-                                 );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
-    ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
-    goto EXIT;\r
-  }\r
-\r
-  if ((*OperationRequest > TCG2_PHYSICAL_PRESENCE_NO_ACTION_MAX) &&\r
-      (*OperationRequest < TCG2_PHYSICAL_PRESENCE_STORAGE_MANAGEMENT_BEGIN) ) {\r
-    ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED;\r
-    goto EXIT;\r
-  }\r
-\r
-  if ((PpData.PPRequest != *OperationRequest) ||\r
-      (PpData.PPRequestParameter != *RequestParameter)) {\r
-    PpData.PPRequest = (UINT8)*OperationRequest;\r
-    PpData.PPRequestParameter = *RequestParameter;\r
-    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);\r
-    Status = mTcg2PpSmmVariable->SmmSetVariable (\r
-                                   TCG2_PHYSICAL_PRESENCE_VARIABLE,\r
-                                   &gEfiTcg2PhysicalPresenceGuid,\r
-                                   EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                                   DataSize,\r
-                                   &PpData\r
-                                   );\r
-    if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "[TPM2] Set PP variable failure! Status = %r\n", Status));\r
-      ReturnCode = TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
-      goto EXIT;\r
-    }\r
-  }\r
-\r
-  if (*OperationRequest >= TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
-    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);\r
-    Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                   TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
-                                   &gEfiTcg2PhysicalPresenceGuid,\r
-                                   NULL,\r
-                                   &DataSize,\r
-                                   &Flags\r
-                                   );\r
-    if (EFI_ERROR (Status)) {\r
-      Flags.PPFlags = mTcg2PhysicalPresenceFlags;\r
-    }\r
-    ReturnCode = Tcg2PpVendorLibSubmitRequestToPreOSFunction (*OperationRequest, Flags.PPFlags, *RequestParameter);\r
-  }\r
-\r
-EXIT:\r
-  //\r
-  // Sync PPRQ/PPRM from PP Variable if PP submission fails\r
-  //\r
-  if (ReturnCode != TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
-    DEBUG ((EFI_D_ERROR, "[TPM2] Submit PP Request failure! Sync PPRQ/PPRM with PP variable.\n", Status));\r
-    DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);\r
-    ZeroMem(&PpData, DataSize);\r
-    Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                   TCG2_PHYSICAL_PRESENCE_VARIABLE,\r
-                                   &gEfiTcg2PhysicalPresenceGuid,\r
-                                   NULL,\r
-                                   &DataSize,\r
-                                   &PpData\r
-                                   );\r
-    *OperationRequest = (UINT32)PpData.PPRequest;\r
-    *RequestParameter = PpData.PPRequestParameter;\r
-  }\r
-\r
-  return ReturnCode;\r
-}\r
-\r
-/**\r
-  The handler for TPM physical presence function:\r
-  Submit TPM Operation Request to Pre-OS Environment and\r
-  Submit TPM Operation Request to Pre-OS Environment 2.\r
-\r
-  This API should be invoked in OS runtime phase to interface with ACPI method.\r
-\r
-  Caution: This function may receive untrusted input.\r
-\r
-  @param[in]      OperationRequest TPM physical presence operation request.\r
-  @param[in]      RequestParameter TPM physical presence operation request parameter.\r
-\r
-  @return Return Code for Submit TPM Operation Request to Pre-OS Environment and\r
-          Submit TPM Operation Request to Pre-OS Environment 2.\r
-**/\r
-UINT32\r
-EFIAPI\r
-Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (\r
-  IN UINT32                 OperationRequest,\r
-  IN UINT32                 RequestParameter\r
-  )\r
-{\r
-  UINT32                 TempOperationRequest;\r
-  UINT32                 TempRequestParameter;\r
-\r
-  TempOperationRequest = OperationRequest;\r
-  TempRequestParameter = RequestParameter;\r
-\r
-  return Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunctionEx(&TempOperationRequest, &TempRequestParameter);\r
-}\r
-\r
-/**\r
-  The handler for TPM physical presence function:\r
-  Get User Confirmation Status for Operation.\r
-\r
-  This API should be invoked in OS runtime phase to interface with ACPI method.\r
-\r
-  Caution: This function may receive untrusted input.\r
-\r
-  @param[in]      OperationRequest TPM physical presence operation request.\r
-\r
-  @return Return Code for Get User Confirmation Status for Operation.\r
-**/\r
-UINT32\r
-EFIAPI\r
-Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (\r
-  IN UINT32                 OperationRequest\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  UINTN                             DataSize;\r
-  EFI_TCG2_PHYSICAL_PRESENCE        PpData;\r
-  EFI_TCG2_PHYSICAL_PRESENCE_FLAGS  Flags;\r
-  BOOLEAN                           RequestConfirmed;\r
-\r
-  DEBUG ((EFI_D_INFO, "[TPM2] GetUserConfirmationStatusFunction, Request = %x\n", OperationRequest));\r
-\r
-  //\r
-  // Get the Physical Presence variable\r
-  //\r
-  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE);\r
-  Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                 TCG2_PHYSICAL_PRESENCE_VARIABLE,\r
-                                 &gEfiTcg2PhysicalPresenceGuid,\r
-                                 NULL,\r
-                                 &DataSize,\r
-                                 &PpData\r
-                                 );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
-    return TCG_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
-  }\r
-  //\r
-  // Get the Physical Presence flags\r
-  //\r
-  DataSize = sizeof (EFI_TCG2_PHYSICAL_PRESENCE_FLAGS);\r
-  Status = mTcg2PpSmmVariable->SmmGetVariable (\r
-                                 TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
-                                 &gEfiTcg2PhysicalPresenceGuid,\r
-                                 NULL,\r
-                                 &DataSize,\r
-                                 &Flags\r
-                                 );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "[TPM2] Get PP flags failure! Status = %r\n", Status));\r
-    return TCG_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
-  }\r
-\r
-  RequestConfirmed = FALSE;\r
-\r
-  switch (OperationRequest) {\r
-    case TCG2_PHYSICAL_PRESENCE_CLEAR:\r
-    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:\r
-    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:\r
-    case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:\r
-      if ((Flags.PPFlags & TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CLEAR) == 0) {\r
-        RequestConfirmed = TRUE;\r
-      }\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_NO_ACTION:\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_TRUE:\r
-      RequestConfirmed = TRUE;\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_CLEAR_FALSE:\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:\r
-      if ((Flags.PPFlags & TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_PCRS) == 0) {\r
-        RequestConfirmed = TRUE;\r
-      }\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:\r
-      if ((Flags.PPFlags & TCG2_BIOS_TPM_MANAGEMENT_FLAG_PP_REQUIRED_FOR_CHANGE_EPS) == 0) {\r
-        RequestConfirmed = TRUE;\r
-      }\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:\r
-      RequestConfirmed = TRUE;\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID:\r
-      if ((Flags.PPFlags & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) == 0) {\r
-        RequestConfirmed = TRUE;\r
-      }\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID:\r
-      if ((Flags.PPFlags & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) == 0) {\r
-        RequestConfirmed = TRUE;\r
-      }\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE:\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE:\r
-      RequestConfirmed = TRUE;\r
-      break;\r
-\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE:\r
-    case TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE:\r
-      break;\r
-\r
-    default:\r
-      if (!mIsTcg2PPVerLowerThan_1_3) {\r
-        if (OperationRequest < TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
-          //\r
-          // TCG2 PP1.3 spec defined operations that are reserved or un-implemented\r
-          //\r
-          return TCG_PP_GET_USER_CONFIRMATION_NOT_IMPLEMENTED;\r
-        }\r
-      } else {\r
-       //\r
-       // TCG PP lower than 1.3. (1.0, 1.1, 1.2)\r
-       //\r
-       if (OperationRequest <= TCG2_PHYSICAL_PRESENCE_NO_ACTION_MAX) {\r
-         RequestConfirmed = TRUE;\r
-       } else if (OperationRequest < TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
-         return TCG_PP_GET_USER_CONFIRMATION_NOT_IMPLEMENTED;\r
-       }\r
-      }\r
-      break;\r
-  }\r
-\r
-  if (OperationRequest >= TCG2_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
-    return Tcg2PpVendorLibGetUserConfirmationStatusFunction (OperationRequest, Flags.PPFlags);\r
-  }\r
-\r
-  if (RequestConfirmed) {\r
-    return TCG_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_NOT_REQUIRED;\r
-  } else {\r
-    return TCG_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_REQUIRED;\r
-  }\r
-}\r
+#include "MmTcg2PhysicalPresenceLibCommon.h"\r
 \r
 /**\r
   The constructor function locates SmmVariable protocol.\r
@@ -380,24 +32,10 @@ Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-Tcg2PhysicalPresenceLibConstructor (\r
+Tcg2PhysicalPresenceLibTraditionalConstructor (\r
   IN EFI_HANDLE        ImageHandle,\r
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-\r
-  if (AsciiStrnCmp(PP_INF_VERSION_1_2, (CHAR8 *)PcdGetPtr(PcdTcgPhysicalPresenceInterfaceVer), sizeof(PP_INF_VERSION_1_2) - 1) >= 0) {\r
-    mIsTcg2PPVerLowerThan_1_3 = TRUE;\r
-  }\r
-\r
-  //\r
-  // Locate SmmVariableProtocol.\r
-  //\r
-  Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID**)&mTcg2PpSmmVariable);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  mTcg2PhysicalPresenceFlags = PcdGet32(PcdTcg2PhysicalPresenceFlags);\r
-\r
-  return EFI_SUCCESS;\r
+  return Tcg2PhysicalPresenceLibCommonConstructor ();\r
 }\r