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