summaryrefslogtreecommitdiff
path: root/ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c
diff options
context:
space:
mode:
Diffstat (limited to 'ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c')
-rw-r--r--ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c631
1 files changed, 631 insertions, 0 deletions
diff --git a/ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c b/ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c
new file mode 100644
index 0000000..9c7efae
--- /dev/null
+++ b/ReferenceCode/Haswell/SampleCode/TxtOneTouch/Dxe/TxtOneTouchDxe.c
@@ -0,0 +1,631 @@
+/** @file
+
+@copyright
+ Copyright (c) 1999 - 2012 Intel Corporation. All rights reserved
+ This software and associated documentation (if any) is furnished
+ under a license and may only be used or copied in accordance
+ with the terms of the license. Except as permitted by such
+ license, no part of this software or documentation may be
+ reproduced, stored in a retrieval system, or transmitted in any
+ form or by any means without the express written consent of
+ Intel Corporation.
+
+ This file contains a 'Sample Driver' and is licensed as such
+ under the terms of your license agreement with Intel or your
+ vendor. This file may be modified by the user, subject to
+ the additional terms of the license agreement
+
+**/
+#include "TxtOneTouchDxe.h"
+
+TXT_ONE_TOUCH_OP_PROTOCOL mTxtOneTouchOpProtocol = {
+ TxtExecOperation,
+ TxtConfirmationDialog,
+ TxtResetState
+};
+
+EFI_TCG_PROTOCOL *mTcgProtocol;
+TXT_ONE_TOUCH_SETUP mTxtVariable;
+
+/**
+ @param[in] ImageHandle - A handle for this module
+ @param[in] SystemTable - A pointer to the EFI System Table
+
+ @retval EFI_SUCCESS - If TXT initialization succeed
+ @retval EFI_UNLOAD_IMAGE - If TXT criterias are not met
+**/
+EFI_STATUS
+EFIAPI
+DriverEntry (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_HANDLE Handle;
+
+ Handle = NULL;
+ ZeroMem (&mTxtVariable, sizeof (TXT_ONE_TOUCH_SETUP));
+
+ ///
+ /// Install the protocol
+ ///
+ Status = gBS->InstallProtocolInterface (
+ &Handle,
+ &gTxtOneTouchOpProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mTxtOneTouchOpProtocol
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ ///
+ /// Locate TcgProtocol
+ ///
+ mTcgProtocol = NULL;
+ Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **) &mTcgProtocol);
+ ASSERT_EFI_ERROR (Status);
+
+ ///
+ /// Initiate the variable if it doesn't exist.
+ ///
+ if (ReadWriteVariable (&mTxtVariable, FALSE) != EFI_SUCCESS) {
+ ReadWriteVariable (&mTxtVariable, TRUE);
+ }
+
+ return Status;
+}
+
+/**
+ Read/Write variable for enable/disable TxT one
+ touch functions
+
+ @param[in] VariableData - Point to Setup variable buffer
+ @param[in] WriteData - TRUE, write changes to Setup Variable. FALSE, not to write variable.
+
+ @retval EFI_SUCCESS - Operation complete successful
+ @retval EFI_INVALID_PARAMETER - VariableData is NULL
+**/
+EFI_STATUS
+ReadWriteVariable (
+ IN OUT TXT_ONE_TOUCH_SETUP *VariableData,
+ IN BOOLEAN WriteData
+ )
+{
+ EFI_STATUS Status;
+ UINTN Size;
+ UINT32 VarAttrib;
+
+ Status = EFI_SUCCESS;
+ Size = 0;
+ VarAttrib = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
+
+ if (VariableData == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (WriteData == TRUE) {
+ ///
+ /// Write TxT variable
+ ///
+ Size = sizeof (TXT_ONE_TOUCH_SETUP);
+
+ Status = gRT->SetVariable (
+ TXT_ONE_TOUCH_VAR,
+ &gTxtOneTouchGuid,
+ VarAttrib,
+ Size,
+ VariableData
+ );
+ } else {
+ ///
+ /// Read TxT variable
+ ///
+ Size = sizeof (TXT_ONE_TOUCH_SETUP);
+
+ Status = gRT->GetVariable (
+ TXT_ONE_TOUCH_VAR,
+ &gTxtOneTouchGuid,
+ NULL,
+ &Size,
+ VariableData
+ );
+ }
+
+ return Status;
+}
+
+/**
+ Read TxT Maintenance flag
+
+ @retval TRUE - TxT Maintenance Flag is TRUE
+ @retval FALSE - TxT Maintenance Flag is FALSE
+**/
+BOOLEAN
+CheckTxtMaintenanceFlag (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+
+ Status = EFI_SUCCESS;
+
+ ///
+ /// TBD. Need to read TPM NV index 0x50010000
+ ///
+ ///
+ /// Read TxT variable first
+ ///
+ Status = ReadWriteVariable (&mTxtVariable, FALSE);
+ if (EFI_ERROR (Status)) {
+ return FALSE;
+ }
+
+ return mTxtVariable.NoTxtMaintenance;
+}
+
+/**
+ Extend PPI operation for TxT.
+
+ @param[in] This - Point of TXT_ONE_TOUCH_OP_PROTOCOL
+ @param[in] Command - Operation value for TxT
+
+ @retval EFI_SUCCESS - Execute the Command successful
+ @retval EFI_UNSUPPORTED - Command is not supported
+**/
+EFI_STATUS
+EFIAPI
+TxtExecOperation (
+ IN TXT_ONE_TOUCH_OP_PROTOCOL *This,
+ IN UINT8 Command
+ )
+{
+ EFI_STATUS Status;
+
+ Status = EFI_SUCCESS;
+
+ ///
+ /// Read TxT variable first
+ ///
+ Status = ReadWriteVariable (&mTxtVariable, FALSE);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ ///
+ /// Read variable for TxT One Touch function
+ /// The variable can be Setup variable
+ ///
+ switch (Command) {
+ case DISABLE_DEACTIVATE:
+ ///
+ /// Disable & Deactive TPM
+ /// Disable TxT
+ ///
+ mTxtVariable.TxtEnable = FALSE;
+ break;
+
+ case ENABLE_VT:
+ ///
+ /// Enable VT
+ ///
+ mTxtVariable.VtEnable = TRUE;
+ break;
+
+ case DISABLE_VT_TXT:
+ ///
+ /// Disable VT and TxT
+ ///
+ mTxtVariable.VtEnable = FALSE;
+ mTxtVariable.TxtEnable = FALSE;
+ break;
+
+ case ENABLE_VTD:
+ ///
+ /// Enable VT-d
+ ///
+ mTxtVariable.VtdEnable = TRUE;
+ break;
+
+ case DISABLE_VTD_TXT:
+ ///
+ /// Disable VT-d and TxT
+ ///
+ mTxtVariable.VtdEnable = FALSE;
+ break;
+
+ case ENABLE_ACTTPM_VT_VTD_TXT_DISABLE_STM:
+ ///
+ /// Enable-Active TPM
+ /// Enable VT, VT-d and TxT
+ /// Disable STM
+ ///
+ TpmEnableActive (ENABLE_ACTIVATE);
+ ///
+ /// mTxtVariable.TpmEnable = TRUE;
+ /// mTxtVariable.TpmActive = TRUE;
+ ///
+ mTxtVariable.VtEnable = TRUE;
+ mTxtVariable.VtdEnable = TRUE;
+ mTxtVariable.TxtEnable = TRUE;
+ mTxtVariable.StmEnable = FALSE;
+ break;
+
+ case ENABLE_ACTTPM_VT_VTD_TXT_STM:
+ ///
+ /// Enable-Active TPM
+ /// Enable VT, VT-d, TxT and STM
+ ///
+ TpmEnableActive (ENABLE_ACTIVATE);
+ ///
+ /// mTxtVariable.TpmEnable = TRUE;
+ /// mTxtVariable.TpmActive = TRUE;
+ ///
+ mTxtVariable.VtEnable = TRUE;
+ mTxtVariable.VtdEnable = TRUE;
+ mTxtVariable.TxtEnable = TRUE;
+ mTxtVariable.StmEnable = TRUE;
+ break;
+
+ case DISABLE_STM:
+ ///
+ /// Disable STM
+ ///
+ mTxtVariable.StmEnable = FALSE;
+ break;
+
+ case DISABLE_TXT_STM:
+ ///
+ /// Disable TxT and STM
+ ///
+ mTxtVariable.TxtEnable = FALSE;
+ mTxtVariable.StmEnable = FALSE;
+ break;
+
+ case DISABLE_SENTER_VMX:
+ ///
+ /// Disable SENTER and VMX
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_VMX_SMX_ONLY:
+ ///
+ /// Enable VMX in SMX only
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_VMX_OUTSIDE_SMX:
+ ///
+ /// Enable VMX outside SMX Only
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_VMX:
+ ///
+ /// Enable VMX
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_SENTER_ONLY:
+ ///
+ /// Enable SENTER Only
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_SENTER_VMX_IN_SMX:
+ ///
+ /// Enable SENTER and VMX in SMX
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_SENTER_VMX_OUTSIDE_SMX:
+ ///
+ /// Enable SENTER and VMX outside SMX
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case ENABLE_SENTER_VMX:
+ ///
+ /// Enable SENTER and VMX
+ ///
+ Status = EFI_UNSUPPORTED;
+ break;
+
+ case SET_NO_TXT_MAINTENANCE_FALSE:
+ ///
+ /// Set NoTxtMaintenance Flag FALSE
+ ///
+ mTxtVariable.NoTxtMaintenance = FALSE;
+ break;
+
+ case SET_NO_TXT_MAINTENANCE_TRUE:
+ ///
+ /// Set NoTxtMaintenance Flag TRUE
+ ///
+ mTxtVariable.NoTxtMaintenance = TRUE;
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+ ///
+ /// Validate states
+ ///
+ Status = ValidateTxtStates (&mTxtVariable);
+ if (EFI_ERROR (Status)) {
+ Status = EFI_UNSUPPORTED;
+ } else {
+ ///
+ /// if settings are correct, write it to variable
+ ///
+ Status = ReadWriteVariable (&mTxtVariable, TRUE);
+ }
+
+ return Status;
+}
+
+/**
+ Confirmation dialog for TxT PPI
+
+ @param[in] This - Point of TXT_ONE_TOUCH_OP_PROTOCOL
+ @param[in] Command - Operation value for TxT
+ @param[in] Confirm - User confirm
+
+ @retval EFI_SUCCESS - Execute the Command successful
+ @retval EFI_UNSUPPORTED - Command is not supported
+**/
+EFI_STATUS
+EFIAPI
+TxtConfirmationDialog (
+ IN TXT_ONE_TOUCH_OP_PROTOCOL *This,
+ IN UINT8 Command,
+ IN OUT BOOLEAN *Confirm
+ )
+{
+ EFI_STATUS Status;
+
+ Status = EFI_SUCCESS;
+
+ if (CheckTxtMaintenanceFlag ()) {
+ *Confirm = FALSE;
+ }
+
+ switch (Command) {
+ case DISABLE_DEACTIVATE:
+ ///
+ /// Disable & Deactive TPM
+ /// Disable TxT
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable TxT\n\n\r"
+ );
+
+ break;
+
+ case ENABLE_VT:
+ ///
+ /// Enable VT
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable VT\n\n\r"
+ );
+ break;
+
+ case DISABLE_VT_TXT:
+ ///
+ /// Disable VT and TxT
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable VT and TxT\n\n\r"
+ );
+ break;
+
+ case ENABLE_VTD:
+ ///
+ /// Enable VT-d
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable VT-d\n\n\r"
+ );
+ break;
+
+ case DISABLE_VTD_TXT:
+ ///
+ /// Disable VT-d and TxT
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable VT-d and TxT\n\n\r"
+ );
+ break;
+
+ case ENABLE_ACTTPM_VT_VTD_TXT_DISABLE_STM:
+ ///
+ /// Enable-Active TPM
+ /// Enable VT, VT-d and TxT
+ /// Disable STM
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable/Active TPM and Enable VT/VT-d/TxT, and Disable STM\n\n\r"
+ );
+ break;
+
+ case ENABLE_ACTTPM_VT_VTD_TXT_STM:
+ ///
+ /// Enable-Active TPM
+ /// Enable VT, VT-d, TxT and STM
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable/Active TPM and Enable VT/VT-d/TxT/STM\n\n\r"
+ );
+ break;
+
+ case DISABLE_STM:
+ ///
+ /// Disable STM
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable STM\n\n\r"
+ );
+ break;
+
+ case DISABLE_TXT_STM:
+ ///
+ /// Disable TxT and STM
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable TxT and STM\n\n\r"
+ );
+ break;
+
+ case DISABLE_SENTER_VMX:
+ ///
+ /// Disable SENTER and VMX
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Disable SENTER and VMX\n\n\r"
+ );
+ break;
+
+ case ENABLE_VMX_SMX_ONLY:
+ ///
+ /// Enable VMX in SMX only
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable VMX in SMX only\n\n\r"
+ );
+ break;
+
+ case ENABLE_VMX_OUTSIDE_SMX:
+ ///
+ /// Enable VMX outside SMX Only
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable VMX outside SMX Only\n\n\r"
+ );
+ break;
+
+ case ENABLE_VMX:
+ ///
+ /// Enable VMX
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable VMX\n\n\r"
+ );
+ break;
+
+ case ENABLE_SENTER_ONLY:
+ ///
+ /// Enable SENTER Only
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable SENTER only\n\n\r"
+ );
+ break;
+
+ case ENABLE_SENTER_VMX_IN_SMX:
+ ///
+ /// Enable SENTER and VMX in SMX
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable SENTER and VMX in SMX\n\n\r"
+ );
+ break;
+
+ case ENABLE_SENTER_VMX_OUTSIDE_SMX:
+ ///
+ /// Enable SENTER and VMX outside SMX
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable SENTER and VMX outside SMX\n\n\r"
+ );
+ break;
+
+ case ENABLE_SENTER_VMX:
+ ///
+ /// Enable SENTER and VMX
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Enable SENTER and VMX\n\n\r"
+ );
+ break;
+
+ case SET_NO_TXT_MAINTENANCE_FALSE:
+ ///
+ /// Set NoTxtMaintenance Flag FALSE
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Set TxT Maintenance Flag to FALSE\n\n\r"
+ );
+ break;
+
+ case SET_NO_TXT_MAINTENANCE_TRUE:
+ ///
+ /// Set NoTxtMaintenance Flag TRUE
+ ///
+ gST->ConOut->OutputString (
+ gST->ConOut,
+ L"\nA configuration change was requested to Set TxT Maintenance Flag to TRUE\n\n\r"
+ );
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+
+ return Status;
+}
+
+/**
+ Reset system.
+
+ @param[in] This - Point of TXT_ONE_TOUCH_OP_PROTOCOL
+ @param[in] Command - Operation value for TxT
+
+ @retval EFI_SUCCESS - Always return EFI_SUCCESS
+**/
+EFI_STATUS
+EFIAPI
+TxtResetState (
+ IN TXT_ONE_TOUCH_OP_PROTOCOL *This,
+ IN UINT8 Command
+ )
+{
+ EFI_STATUS Status;
+ PCH_RESET_PROTOCOL *PchReset;
+
+ Status = gBS->LocateProtocol (&gPchResetProtocolGuid, NULL, (VOID **) &PchReset);
+ if (!EFI_ERROR (Status)) {
+ PchReset->Reset (PchReset, GlobalReset);
+ } else {
+ gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL);
+ }
+
+ ASSERT (FALSE);
+ ///
+ /// Should not be here
+ ///
+ return EFI_SUCCESS;
+}