15679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// This file was extracted from the TCG Published
25679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Trusted Platform Module Library
35679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Part 4: Supporting Routines
45679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Family "2.0"
55679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Level 00 Revision 01.16
65679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// October 30, 2014
75679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
85679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define _SWAP_H         // Preclude inclusion of unnecessary simulator header
95679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include <stdlib.h>
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include <stdio.h>
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include <stdint.h>
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "bool.h"
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "Platform.h"
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "ExecCommand_fp.h"
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "Manufacture_fp.h"
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "DRTM_fp.h"
175679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "_TPM_Init_fp.h"
185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "TpmFail_fp.h"
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include <windows.h>
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "TpmTcpProtocol.h"
215679752bf24c21135884e987c4077e2f7184897Vadim Bendeburystatic BOOL     s_isPowerOn = FALSE;
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//          Functions
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//          Signal_PowerOn()
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function processes a power-on indicataion. Amoung other things, it calls the _TPM_Init() hangler.
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
305679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_PowerOn(
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     BOOL          isReset
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     )
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     // if power is on and this is not a call to do TPM reset then return
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     if(s_isPowerOn && !isReset)
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury         return;
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     // If this is a reset but power is not on, then return
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     if(isReset && !s_isPowerOn)
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury         return;
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     // Pass power on signal to platform
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     if(isReset)
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury         _plat__Signal_Reset();
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     else
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury         _plat__Signal_PowerOn();
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     // Pass power on signal to TPM
475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     _TPM_Init();
485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     // Set state as power on
495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury     s_isPowerOn = TRUE;
505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//         Signal_PowerOff()
545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function processes the power off indication. Its primary funtion is to set a flag indicating that the next
565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     power on indication should cause _TPM_Init() to be called.
575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
585679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
595679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_PowerOff(
605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
625679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass power off signal to platform
655679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    _plat__Signal_PowerOff();
665679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    s_isPowerOn = FALSE;
675679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
685679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
695679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
705679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
715679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//         _rpc__ForceFailureMode()
725679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
735679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function is used to debug the Failure Mode logic of the TPM. It will set a flag in the TPM code such
745679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     that the next call to TPM2_SelfTest() will result in a failure, putting the TPM into Failure Mode.
755679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
765679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
775679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__ForceFailureMode(
785679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
795679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
805679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
815679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    SetForceFailureMode();
825679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
835679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
845679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
855679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//         _rpc__Signal_PhysicalPresenceOn()
865679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
875679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function is called to simulate activation of the physical presence pin.
885679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
895679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
905679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_PhysicalPresenceOn(
915679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
925679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
935679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
945679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // If TPM is power off, reject this signal
955679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
965679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass physical presence on to platform
975679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    _plat__Signal_PhysicalPresenceOn();
985679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
995679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1005679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1015679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1025679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//         _rpc__Signal_PhysicalPresenceOff()
1035679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1045679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function is called to simulate deactivation of the physical presence pin.
1055679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1065679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1075679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_PhysicalPresenceOff(
1085679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
1095679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
1105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
1115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // If TPM is power off, reject this signal
1125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
1135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass physical presence off to platform
1145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    _plat__Signal_PhysicalPresenceOff();
1155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
1165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1175679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//          _rpc__Signal_Hash_Start()
1205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is called to simulate a _TPM_Hash_Start() event. It will call
1225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1235679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_Hash_Start(
1255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
1265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
1275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
1285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // If TPM is power off, reject this signal
1295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
1305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass _TPM_Hash_Start signal to TPM
1315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    Signal_Hash_Start();
1325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
1335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//          _rpc__Signal_Hash_Data()
1375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is called to simulate a _TPM_Hash_Data() event.
1395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1405679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_Hash_Data(
1425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    _IN_BUFFER           input
1435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
1445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
1455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // If TPM is power off, reject this signal
1465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
1475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass _TPM_Hash_Data signal to TPM
1485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    Signal_Hash_Data(input.BufferSize, input.Buffer);
1495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
1505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//          _rpc__Signal_HashEnd()
1545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is called to simulate a _TPM_Hash_End() event.
1565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1575679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1585679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_HashEnd(
1595679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    void
1605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    )
1615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
1625679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // If TPM is power off, reject this signal
1635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    if(!s_isPowerOn) return;
1645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    // Pass _TPM_HashEnd signal to TPM
1655679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    Signal_Hash_End();
1665679752bf24c21135884e987c4077e2f7184897Vadim Bendebury    return;
1675679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1685679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1695679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      Command interface Entry of a RPC call
1705679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1715679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Send_Command(
1725679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   unsigned char        locality,
1735679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _IN_BUFFER           request,
1745679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _OUT_BUFFER         *response
1755679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
1765679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
1775679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If TPM is power off, reject any commands.
1785679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(!s_isPowerOn) {
1795679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       response->BufferSize = 0;
1805679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return;
1815679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
1825679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Set the locality of the command so that it doesn't change during the command
1835679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _plat__LocalitySet(locality);
1845679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Do implementation-specific command dispatch
1855679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   ExecuteCommand(request.BufferSize, request.Buffer,
1865679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                          &response->BufferSize, &response->Buffer);
1875679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
1885679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
1895679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1905679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1915679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//         _rpc__Signal_CancelOn()
1925679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1935679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is used to turn on the indication to cancel a command in process. An executing command is
1945679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      not interrupted. The command code may perodically check this indication to see if it should abort the
1955679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      current command processing and returned TPM_RC_CANCELLED.
1965679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
1975679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
1985679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_CancelOn(
1995679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   void
2005679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
2015679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
2025679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If TPM is power off, reject this signal
2035679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(!s_isPowerOn) return;
2045679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Set the platform canceling flag.
2055679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _plat__SetCancel();
2065679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
2075679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
2085679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2095679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//       _rpc__Signal_CancelOff()
2115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is used to turn off the indication to cancel a command in process.
2135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2145679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
2155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_CancelOff(
2165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   void
2175679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
2185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
2195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If TPM is power off, reject this signal
2205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(!s_isPowerOn) return;
2215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Set the platform canceling flag.
2225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _plat__ClearCancel();
2235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
2245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
2255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//       _rpc__Signal_NvOn()
2295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      In a system where the NV memory used by the TPM is not within the TPM, the NV may not always be
2315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      available. This function turns on the indicator that indicates that NV is available.
2325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2335679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
2345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_NvOn(
2355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   void
2365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
2375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
2385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If TPM is power off, reject this signal
2395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(!s_isPowerOn) return;
2405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _plat__SetNvAvail();
2415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
2425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
2435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//       _rpc__Signal_NvOff()
2465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is used to set the indication that NV memory is no longer available.
2485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2495679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
2505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Signal_NvOff(
2515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   void
2525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
2535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
2545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If TPM is power off, reject this signal
2555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(!s_isPowerOn) return;
2565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   _plat__ClearNvAvail();
2575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
2585679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
2595679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//       _rpc__Shutdown()
2625679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//      This function is used to stop the TPM simulator.
2645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
2655679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
2665679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_rpc__Shutdown(
2675679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   void
2685679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
2695679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
2705679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   RPC_STATUS status;
2715679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Stop TPM
2725679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   TPM_TearDown();
2735679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   status = RpcMgmtStopServerListening(NULL);
2745679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if (status != RPC_S_OK)
2755679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
2765679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       printf_s("RpcMgmtStopServerListening returned: 0x%x\n", status);
2775679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       exit(status);
2785679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
2795679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   status = RpcServerUnregisterIf(NULL, NULL, FALSE);
2805679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if (status != RPC_S_OK)
2815679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
2825679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       printf_s("RpcServerUnregisterIf returned 0x%x\n", status);
2835679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       exit(status);
2845679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
2855679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
286