/** The driver's entry point. It install callbacks for TPM physical presence and MemoryClear, and locate SMM variable to be used in the callback function. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The entry point is executed successfully. @retval Others Some error occurs when executing this entry point. **/ EFI_STATUS EFIAPI InitializeTcgSmm ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch; EFI_SMM_SW_REGISTER_CONTEXT SwContext; EFI_HANDLE SwHandle; if (!CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm20DtpmGuid)){ DEBUG ((EFI_D_ERROR, "No TPM2 DTPM instance required!\n")); return EFI_UNSUPPORTED; } Status = PublishAcpiTable (); ASSERT_EFI_ERROR (Status); // // Get the Sw dispatch protocol and register SMI callback functions. // Status = gSmst->SmmLocateProtocol (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID**)&SwDispatch); ASSERT_EFI_ERROR (Status); SwContext.SwSmiInputValue = (UINTN) -1; Status = SwDispatch->Register (SwDispatch, PhysicalPresenceCallback, &SwContext, &SwHandle); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } mTcgNvs->PhysicalPresence.SoftwareSmi = (UINT8) SwContext.SwSmiInputValue; SwContext.SwSmiInputValue = (UINTN) -1; Status = SwDispatch->Register (SwDispatch, MemoryClearCallback, &SwContext, &SwHandle); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } mTcgNvs->MemoryClear.SoftwareSmi = (UINT8) SwContext.SwSmiInputValue; // // Locate SmmVariableProtocol. // Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID**)&mSmmVariable); ASSERT_EFI_ERROR (Status); // // Set TPM2 ACPI table // Status = PublishTpm2 (); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }
/** The driver's entry point. It install callbacks for TPM physical presence and MemoryClear, and locate SMM variable to be used in the callback function. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The entry point is executed successfully. @retval Others Some error occurs when executing this entry point. **/ EFI_STATUS EFIAPI InitializeTcgSmm ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch; EFI_SMM_SW_REGISTER_CONTEXT SwContext; EFI_HANDLE SwHandle; Status = PublishAcpiTable (); ASSERT_EFI_ERROR (Status); // // Get the Sw dispatch protocol and register SMI callback functions. // Status = gSmst->SmmLocateProtocol (&gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID**)&SwDispatch); ASSERT_EFI_ERROR (Status); SwContext.SwSmiInputValue = (UINTN) -1; Status = SwDispatch->Register (SwDispatch, PhysicalPresenceCallback, &SwContext, &SwHandle); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } mTcgNvs->PhysicalPresence.SoftwareSmi = (UINT8) SwContext.SwSmiInputValue; SwContext.SwSmiInputValue = (UINTN) -1; Status = SwDispatch->Register (SwDispatch, MemoryClearCallback, &SwContext, &SwHandle); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } mTcgNvs->MemoryClear.SoftwareSmi = (UINT8) SwContext.SwSmiInputValue; // // Locate SmmVariableProtocol. // Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID**)&mSmmVariable); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }
EFI_STATUS RegisterToDispatchDriver ( VOID ) /*++ Routine Description: Register to dispatch driver. Arguments: None. Returns: EFI_SUCCESS - Successfully init the device. Other - Error occured whening calling Dxe lib functions. --*/ { UINTN Length; EFI_STATUS Status; EFI_SMM_SX_DISPATCH2_PROTOCOL *SxDispatch; EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch; EFI_SMM_SX_REGISTER_CONTEXT *EntryDispatchContext; EFI_SMM_SX_REGISTER_CONTEXT *EntryS1DispatchContext; EFI_SMM_SX_REGISTER_CONTEXT *EntryS3DispatchContext; EFI_SMM_SX_REGISTER_CONTEXT *EntryS4DispatchContext; EFI_SMM_SX_REGISTER_CONTEXT *EntryS5DispatchContext; EFI_SMM_SW_REGISTER_CONTEXT *SwContext; EFI_SMM_SW_REGISTER_CONTEXT *AcpiDisableSwContext; EFI_SMM_SW_REGISTER_CONTEXT *AcpiEnableSwContext; Status = gSmst->SmmLocateProtocol ( &gEfiSmmSxDispatch2ProtocolGuid, NULL, (VOID **) &SxDispatch ); if (EFI_ERROR (Status)) { return Status; } Status = gSmst->SmmLocateProtocol ( &gEfiSmmSwDispatch2ProtocolGuid, NULL, (VOID **) &SwDispatch ); if (EFI_ERROR (Status)) { return Status; } Length = sizeof (EFI_SMM_SX_REGISTER_CONTEXT) * 4 + sizeof (EFI_SMM_SW_REGISTER_CONTEXT) * 2; Status = gSmst->SmmAllocatePool ( EfiRuntimeServicesData, Length, (VOID **) &EntryDispatchContext ); if (EFI_ERROR (Status)) { return Status; } SetMem (EntryDispatchContext, Length, 0); EntryS1DispatchContext = EntryDispatchContext++; EntryS3DispatchContext = EntryDispatchContext++; EntryS4DispatchContext = EntryDispatchContext++; EntryS5DispatchContext = EntryDispatchContext++; SwContext = (EFI_SMM_SW_REGISTER_CONTEXT *)EntryDispatchContext; AcpiDisableSwContext = SwContext++; AcpiEnableSwContext = SwContext++; // // Register the enable handler // AcpiEnableSwContext->SwSmiInputValue = EFI_ACPI_ACPI_ENABLE; Status = SwDispatch->Register ( SwDispatch, EnableAcpiCallback, AcpiEnableSwContext, &(mAcpiSmm.DisableAcpiHandle) ); // // Register the disable handler // AcpiDisableSwContext->SwSmiInputValue = EFI_ACPI_ACPI_DISABLE; Status = SwDispatch->Register ( SwDispatch, DisableAcpiCallback, AcpiDisableSwContext, &(mAcpiSmm.EnableAcpiHandle) ); // // Register entry phase call back function for S1 // EntryS1DispatchContext->Type = SxS1; EntryS1DispatchContext->Phase = SxEntry; Status = SxDispatch->Register ( SxDispatch, SxSleepEntryCallBack, EntryS1DispatchContext, &(mAcpiSmm.S1SleepEntryHandle) ); // // Register entry phase call back function // EntryS3DispatchContext->Type = SxS3; EntryS3DispatchContext->Phase = SxEntry; Status = SxDispatch->Register ( SxDispatch, SxSleepEntryCallBack, EntryS3DispatchContext, &(mAcpiSmm.S3SleepEntryHandle) ); // // Register entry phase call back function for S4 // EntryS4DispatchContext->Type = SxS4; EntryS4DispatchContext->Phase = SxEntry; Status = SxDispatch->Register ( SxDispatch, SxSleepEntryCallBack, EntryS4DispatchContext, &(mAcpiSmm.S4SleepEntryHandle) ); // // Register callback for S5 in order to workaround the LAN shutdown issue // EntryS5DispatchContext->Type = SxS5; EntryS5DispatchContext->Phase = SxEntry; Status = SxDispatch->Register ( SxDispatch, SxSleepEntryCallBack, EntryS5DispatchContext, &(mAcpiSmm.S5SoftOffEntryHandle) ); return Status; }