]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/TrEESmm/TrEESmm.c
Maintainers.txt: ARM packages maintainer update
[mirror_edk2.git] / SecurityPkg / Tcg / TrEESmm / TrEESmm.c
index 14303d5458da44035bfb3e245fd6b668751f7015..a522cd97c654e82121caf003ac760f6c20ecd97a 100644 (file)
@@ -9,7 +9,7 @@
 \r
   PhysicalPresenceCallback() and MemoryClearCallback() will receive untrusted input and do some check.\r
 \r
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\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
@@ -66,11 +66,11 @@ PhysicalPresenceCallback (
   IN OUT UINTN                   *CommBufferSize\r
   )\r
 {\r
-  EFI_STATUS                     Status;\r
-  UINTN                          DataSize;\r
-  EFI_TREE_PHYSICAL_PRESENCE     PpData;\r
-  UINT8                          Flags;\r
-  BOOLEAN                        RequestConfirmed;\r
+  EFI_STATUS                        Status;\r
+  UINTN                             DataSize;\r
+  EFI_TREE_PHYSICAL_PRESENCE        PpData;\r
+  EFI_TREE_PHYSICAL_PRESENCE_FLAGS  Flags;\r
+  BOOLEAN                           RequestConfirmed;\r
 \r
   //\r
   // Get the Physical Presence variable\r
@@ -83,24 +83,33 @@ PhysicalPresenceCallback (
                            &DataSize,\r
                            &PpData\r
                            );\r
-  if (EFI_ERROR (Status)) {\r
-    mTcgNvs->PhysicalPresence.ReturnCode = PP_SUBMIT_REQUEST_GENERAL_FAILURE;\r
-    DEBUG ((EFI_D_ERROR, "[TPM] Get PP variable failure! Status = %r\n", Status));\r
-    return EFI_SUCCESS;\r
-  }\r
 \r
   DEBUG ((EFI_D_INFO, "[TPM2] PP callback, Parameter = %x, Request = %x\n", mTcgNvs->PhysicalPresence.Parameter, mTcgNvs->PhysicalPresence.Request));\r
 \r
   if (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_RETURN_REQUEST_RESPONSE_TO_OS) {\r
+    if (EFI_ERROR (Status)) {\r
+      mTcgNvs->PhysicalPresence.ReturnCode  = PP_RETURN_TPM_OPERATION_RESPONSE_FAILURE;\r
+      mTcgNvs->PhysicalPresence.LastRequest = 0;\r
+      mTcgNvs->PhysicalPresence.Response    = 0;\r
+      DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
+      return EFI_SUCCESS;\r
+    }\r
+    mTcgNvs->PhysicalPresence.ReturnCode  = PP_RETURN_TPM_OPERATION_RESPONSE_SUCCESS;\r
     mTcgNvs->PhysicalPresence.LastRequest = PpData.LastPPRequest;\r
     mTcgNvs->PhysicalPresence.Response    = PpData.PPResponse;\r
   } else if ((mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS) \r
           || (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS_2)) {\r
-    if (mTcgNvs->PhysicalPresence.Request > TREE_PHYSICAL_PRESENCE_NO_ACTION_MAX) {\r
+    if (EFI_ERROR (Status)) {\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
+      DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
+      return EFI_SUCCESS;\r
+    }\r
+    if ((mTcgNvs->PhysicalPresence.Request > TREE_PHYSICAL_PRESENCE_NO_ACTION_MAX) &&\r
+        (mTcgNvs->PhysicalPresence.Request < TREE_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) ) {\r
       //\r
       // This command requires UI to prompt user for Auth data.\r
       //\r
-      mTcgNvs->PhysicalPresence.ReturnCode = PP_SUBMIT_REQUEST_NOT_IMPLEMENTED;\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED;\r
       return EFI_SUCCESS;\r
     }\r
 \r
@@ -117,16 +126,36 @@ PhysicalPresenceCallback (
     }\r
 \r
     if (EFI_ERROR (Status)) { \r
-      mTcgNvs->PhysicalPresence.ReturnCode = PP_SUBMIT_REQUEST_GENERAL_FAILURE;\r
-      DEBUG ((EFI_D_ERROR, "[TPM] Set PP variable failure! Status = %r\n", Status));\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;\r
+      DEBUG ((EFI_D_ERROR, "[TPM2] Set PP variable failure! Status = %r\n", Status));\r
       return EFI_SUCCESS;\r
     }\r
-    mTcgNvs->PhysicalPresence.ReturnCode = PP_SUBMIT_REQUEST_SUCCESS;\r
+    mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS;\r
+\r
+    if (mTcgNvs->PhysicalPresence.Request >= TREE_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
+      DataSize = sizeof (EFI_TREE_PHYSICAL_PRESENCE_FLAGS);\r
+      Status = mSmmVariable->SmmGetVariable (\r
+                               TREE_PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
+                               &gEfiTrEEPhysicalPresenceGuid,\r
+                               NULL,\r
+                               &DataSize,\r
+                               &Flags\r
+                               );\r
+      if (EFI_ERROR (Status)) {\r
+        Flags.PPFlags = 0;\r
+      }\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TrEEPpVendorLibSubmitRequestToPreOSFunction (mTcgNvs->PhysicalPresence.Request, Flags.PPFlags);\r
+    }\r
   } else if (mTcgNvs->PhysicalPresence.Parameter == ACPI_FUNCTION_GET_USER_CONFIRMATION_STATUS_FOR_REQUEST) {\r
+    if (EFI_ERROR (Status)) {\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
+      DEBUG ((EFI_D_ERROR, "[TPM2] Get PP variable failure! Status = %r\n", Status));\r
+      return EFI_SUCCESS;\r
+    }\r
     //\r
     // Get the Physical Presence flags\r
     //\r
-    DataSize = sizeof (UINT8);\r
+    DataSize = sizeof (EFI_TREE_PHYSICAL_PRESENCE_FLAGS);\r
     Status = mSmmVariable->SmmGetVariable (\r
                              TREE_PHYSICAL_PRESENCE_FLAGS_VARIABLE,\r
                              &gEfiTrEEPhysicalPresenceGuid,\r
@@ -135,8 +164,8 @@ PhysicalPresenceCallback (
                              &Flags\r
                              );\r
     if (EFI_ERROR (Status)) {\r
-      mTcgNvs->PhysicalPresence.ReturnCode = PP_SUBMIT_REQUEST_GENERAL_FAILURE;\r
-      DEBUG ((EFI_D_ERROR, "[TPM] Get PP flags failure! Status = %r\n", Status));\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_GET_USER_CONFIRMATION_BLOCKED_BY_BIOS_CONFIGURATION;\r
+      DEBUG ((EFI_D_ERROR, "[TPM2] Get PP flags failure! Status = %r\n", Status));\r
       return EFI_SUCCESS;\r
     }\r
 \r
@@ -148,7 +177,7 @@ PhysicalPresenceCallback (
       case TREE_PHYSICAL_PRESENCE_CLEAR_CONTROL_CLEAR_2:\r
       case TREE_PHYSICAL_PRESENCE_CLEAR_CONTROL_CLEAR_3:\r
       case TREE_PHYSICAL_PRESENCE_CLEAR_CONTROL_CLEAR_4:\r
-        if ((Flags & TREE_FLAG_NO_PPI_CLEAR) != 0) {\r
+        if ((Flags.PPFlags & TREE_BIOS_TPM_MANAGEMENT_FLAG_NO_PPI_CLEAR) != 0) {\r
           RequestConfirmed = TRUE;\r
         }\r
         break;\r
@@ -164,17 +193,22 @@ PhysicalPresenceCallback (
         if (mTcgNvs->PhysicalPresence.Request <= TREE_PHYSICAL_PRESENCE_NO_ACTION_MAX) {\r
           RequestConfirmed = TRUE;\r
         } else {\r
-          mTcgNvs->PhysicalPresence.ReturnCode = PP_REQUEST_NOT_IMPLEMENTED; \r
-          return EFI_SUCCESS;\r
+          if (mTcgNvs->PhysicalPresence.Request < TREE_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
+            mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_GET_USER_CONFIRMATION_NOT_IMPLEMENTED; \r
+            return EFI_SUCCESS;\r
+          }\r
         }\r
         break;\r
     }\r
 \r
     if (RequestConfirmed) {\r
-      mTcgNvs->PhysicalPresence.ReturnCode = PP_REQUEST_ALLOWED_AND_PPUSER_NOT_REQUIRED;\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_NOT_REQUIRED;\r
     } else {\r
-      mTcgNvs->PhysicalPresence.ReturnCode = PP_REQUEST_ALLOWED_AND_PPUSER_REQUIRED;\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TREE_PP_GET_USER_CONFIRMATION_ALLOWED_AND_PPUSER_REQUIRED;\r
     }    \r
+    if (mTcgNvs->PhysicalPresence.Request >= TREE_PHYSICAL_PRESENCE_VENDOR_SPECIFIC_OPERATION) {\r
+      mTcgNvs->PhysicalPresence.ReturnCode = TrEEPpVendorLibGetUserConfirmationStatusFunction (mTcgNvs->PhysicalPresence.Request, Flags.PPFlags);\r
+    }\r
   } \r
 \r
   return EFI_SUCCESS;\r