/** Save Tcg2 PCR Banks request request to variable space. @param[in] PCRBankIndex PCR Bank Index. @param[in] Enable Enable or disable this PCR Bank. @retval EFI_SUCCESS The operation is finished successfully. @retval Others Other errors as indicated. **/ EFI_STATUS SaveTcg2PCRBanksRequest ( IN UINTN PCRBankIndex, IN BOOLEAN Enable ) { UINT32 ReturnCode; EFI_STATUS Status; if (Enable) { mTcg2ConfigPrivateDate->PCRBanksDesired |= (0x1 << PCRBankIndex); } else { mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex); } ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired); if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) { Status = EFI_SUCCESS; } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) { Status = EFI_OUT_OF_RESOURCES; } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) { Status = EFI_UNSUPPORTED; } else { Status = EFI_DEVICE_ERROR; } return Status; }
/** Software SMI callback for TPM physical presence which is called from ACPI method. Caution: This function may receive untrusted input. Variable and ACPINvs are external input, so this function will validate its data structure to be valid value. @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). @param[in] Context Points to an optional handler context which was specified when the handler was registered. @param[in, out] CommBuffer A pointer to a collection of data in memory that will be conveyed from a non-SMM environment into an SMM environment. @param[in, out] CommBufferSize The size of the CommBuffer. @retval EFI_SUCCESS The interrupt was handled successfully. **/ EFI_STATUS EFIAPI PhysicalPresenceCallback ( IN EFI_HANDLE DispatchHandle, IN CONST VOID *Context, IN OUT VOID *CommBuffer, IN OUT UINTN *CommBufferSize ) { UINT32 MostRecentRequest; UINT32 Response; if (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_RETURN_REQUEST_RESPONSE_TO_OS) { mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction ( &MostRecentRequest, &Response ); mTcgNvs->PhysicalPresence.LastRequest = MostRecentRequest; mTcgNvs->PhysicalPresence.Response = Response; return EFI_SUCCESS; } else if ((mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS) || (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS_2)) { mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction ( mTcgNvs->PhysicalPresence.Request, mTcgNvs->PhysicalPresence.RequestParameter ); } else if (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_GET_USER_CONFIRMATION_STATUS_FOR_REQUEST) { mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (mTcgNvs->PhysicalPresence.Request); } return EFI_SUCCESS; }
/** Save TPM request to variable space. @param[in] PpRequestParameter Physical Presence request parameter. @retval EFI_SUCCESS The operation is finished successfully. @retval Others Other errors as indicated. **/ EFI_STATUS SaveTcg2PpRequestParameter ( IN UINT32 PpRequestParameter ) { UINT32 ReturnCode; EFI_STATUS Status; ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (mCurrentPpRequest, PpRequestParameter); if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) { Status = EFI_SUCCESS; } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) { Status = EFI_OUT_OF_RESOURCES; } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) { Status = EFI_UNSUPPORTED; } else { Status = EFI_DEVICE_ERROR; } return Status; }