]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add TPM1.2 SaveState API.
authorjyao1 <jyao1>
Mon, 21 Oct 2013 05:56:07 +0000 (05:56 +0000)
committerjyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 21 Oct 2013 05:56:07 +0000 (05:56 +0000)
Signed off by: Yao, Jiewen <Jiewen.yao@intel.com>
Reviewed by: Dong Guo <Gui.dong@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14791 6f19259b-4bc3-4df7-8a09-765794883524

SecurityPkg/Include/Library/Tpm12CommandLib.h
SecurityPkg/Library/Tpm12CommandLib/Tpm12Startup.c

index 8b62823716d67c18b0e7e31cfad5e78285858fb3..1dbc7d50c335d9d5669d72f185a2b0f9faa5a22a 100644 (file)
@@ -31,6 +31,18 @@ Tpm12Startup (
   IN TPM_STARTUP_TYPE          TpmSt\r
   );\r
 \r
+/**\r
+  Send SaveState command to TPM1.2.\r
+\r
+  @retval EFI_SUCCESS      Operation completed successfully.\r
+  @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+Tpm12SaveState (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Send ForceClear command to TPM1.2.\r
 \r
index 684c9b523efa21b104b5b1f896dae8194d7e48ac..afbe02e382972b68b7a7cc4f90c97ca00e9496a6 100644 (file)
@@ -29,6 +29,14 @@ typedef struct {
   TPM_RSP_COMMAND_HDR   Hdr;\r
 } TPM_RSP_START_UP;\r
 \r
+typedef struct {\r
+  TPM_RQU_COMMAND_HDR   Hdr;\r
+} TPM_CMD_SAVE_STATE;\r
+\r
+typedef struct {\r
+  TPM_RSP_COMMAND_HDR   Hdr;\r
+} TPM_RSP_SAVE_STATE;\r
+\r
 #pragma pack()\r
 \r
 /**\r
@@ -75,4 +83,45 @@ Tpm12Startup (
   default:\r
     return EFI_DEVICE_ERROR;\r
   }\r
-}
\ No newline at end of file
+}\r
+\r
+/**\r
+  Send SaveState command to TPM1.2.\r
+\r
+  @retval EFI_SUCCESS      Operation completed successfully.\r
+  @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+Tpm12SaveState (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  UINT32                            TpmRecvSize;\r
+  UINT32                            TpmSendSize;\r
+  TPM_CMD_SAVE_STATE                SendBuffer;\r
+  TPM_RSP_SAVE_STATE                RecvBuffer;\r
+  UINT32                            ReturnCode;\r
+\r
+  //\r
+  // send Tpm command TPM_ORD_SaveState\r
+  //\r
+  TpmRecvSize               = sizeof (TPM_RSP_SAVE_STATE);\r
+  TpmSendSize               = sizeof (TPM_CMD_SAVE_STATE);\r
+  SendBuffer.Hdr.tag        = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
+  SendBuffer.Hdr.paramSize  = SwapBytes32 (TpmSendSize);\r
+  SendBuffer.Hdr.ordinal    = SwapBytes32 (TPM_ORD_SaveState);\r
+\r
+  Status = Tpm12SubmitCommand (TpmSendSize, (UINT8 *)&SendBuffer, &TpmRecvSize, (UINT8 *)&RecvBuffer);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  ReturnCode = SwapBytes32(RecvBuffer.Hdr.returnCode);\r
+  switch (ReturnCode) {\r
+  case TPM_SUCCESS:\r
+    return EFI_SUCCESS;\r
+  default:\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+}\r