1 // This file was extracted from the TCG Published
2 // Trusted Platform Module Library
3 // Part 3: Commands
4 // Family "2.0"
5 // Level 00 Revision 01.16
6 // October 30, 2014
7 
8 #include "InternalRoutines.h"
9 #include "PCR_Reset_fp.h"
10 //
11 //
12 //     Error Returns                     Meaning
13 //
14 //     TPM_RC_LOCALITY                   current command locality is not allowed to reset the PCR referenced
15 //                                       by pcrHandle
16 //
17 TPM_RC
TPM2_PCR_Reset(PCR_Reset_In * in)18 TPM2_PCR_Reset(
19    PCR_Reset_In      *in                 // IN: input parameter list
20    )
21 {
22    TPM_RC        result;
23 
24 // Input Validation
25 
26    // Check if the reset operation is allowed by the current command locality
27    if(!PCRIsResetAllowed(in->pcrHandle))
28        return TPM_RC_LOCALITY;
29 
30    // If PCR is state saved and we need to update orderlyState, check NV
31    // availability
32    if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
33    {
34        result = NvIsAvailable();
35        if(result != TPM_RC_SUCCESS)
36            return result;
37        g_clearOrderly = TRUE;
38    }
39 
40 // Internal Data Update
41 
42    // Reset selected PCR in all banks to 0
43    PCRSetValue(in->pcrHandle, 0);
44 
45    // Indicate that the PCR changed so that pcrCounter will be incremented if
46    // necessary.
47    PCRChanged(in->pcrHandle);
48 
49    return TPM_RC_SUCCESS;
50 }
51