2013-09-18 07:31:18 +02:00
|
|
|
/** @file
|
|
|
|
The module entry point for TrEE configuration module.
|
|
|
|
|
|
|
|
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
|
|
|
This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#include "TrEEConfigImpl.h"
|
|
|
|
|
|
|
|
extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];
|
|
|
|
|
|
|
|
/**
|
|
|
|
The entry point for TrEE configuration driver.
|
|
|
|
|
|
|
|
@param[in] ImageHandle The image handle of the driver.
|
|
|
|
@param[in] SystemTable The system table.
|
|
|
|
|
|
|
|
@retval EFI_ALREADY_STARTED The driver already exists in system.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.
|
|
|
|
@retval EFI_SUCCES All the related protocols are installed on the driver.
|
|
|
|
@retval Others Fail to install protocols as indicated.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
TrEEConfigDriverEntryPoint (
|
|
|
|
IN EFI_HANDLE ImageHandle,
|
|
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
|
|
)
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
TREE_CONFIG_PRIVATE_DATA *PrivateData;
|
|
|
|
TREE_CONFIGURATION TrEEConfiguration;
|
2014-03-21 03:51:42 +01:00
|
|
|
TREE_DEVICE_DETECTION TrEEDeviceDetection;
|
2013-09-18 07:31:18 +02:00
|
|
|
UINTN Index;
|
|
|
|
UINTN DataSize;
|
2014-03-21 03:51:42 +01:00
|
|
|
EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;
|
2013-09-18 07:31:18 +02:00
|
|
|
|
|
|
|
Status = gBS->OpenProtocol (
|
|
|
|
ImageHandle,
|
|
|
|
&gEfiCallerIdGuid,
|
|
|
|
NULL,
|
|
|
|
ImageHandle,
|
|
|
|
ImageHandle,
|
|
|
|
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
|
|
|
|
);
|
|
|
|
if (!EFI_ERROR (Status)) {
|
|
|
|
return EFI_ALREADY_STARTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Create a private data structure.
|
|
|
|
//
|
|
|
|
PrivateData = AllocateCopyPool (sizeof (TREE_CONFIG_PRIVATE_DATA), &mTrEEConfigPrivateDateTemplate);
|
|
|
|
ASSERT (PrivateData != NULL);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Install private GUID.
|
|
|
|
//
|
|
|
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
|
|
|
&ImageHandle,
|
|
|
|
&gEfiCallerIdGuid,
|
|
|
|
PrivateData,
|
|
|
|
NULL
|
|
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
|
|
|
|
DataSize = sizeof(TrEEConfiguration);
|
|
|
|
Status = gRT->GetVariable (
|
|
|
|
TREE_STORAGE_NAME,
|
|
|
|
&gTrEEConfigFormSetGuid,
|
|
|
|
NULL,
|
|
|
|
&DataSize,
|
|
|
|
&TrEEConfiguration
|
|
|
|
);
|
|
|
|
if (EFI_ERROR (Status)) {
|
2014-03-21 03:51:42 +01:00
|
|
|
//
|
|
|
|
// Variable not ready, set default value
|
|
|
|
//
|
|
|
|
TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;
|
2013-09-18 07:31:18 +02:00
|
|
|
}
|
2014-03-21 03:51:42 +01:00
|
|
|
|
2013-09-18 07:31:18 +02:00
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
// Validation
|
2013-09-18 07:31:18 +02:00
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) {
|
|
|
|
TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;
|
|
|
|
}
|
2013-09-18 07:31:18 +02:00
|
|
|
|
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
// Save to variable so platform driver can get it.
|
2013-09-18 07:31:18 +02:00
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
Status = gRT->SetVariable (
|
|
|
|
TREE_STORAGE_NAME,
|
|
|
|
&gTrEEConfigFormSetGuid,
|
|
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
|
|
|
sizeof(TrEEConfiguration),
|
|
|
|
&TrEEConfiguration
|
|
|
|
);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_STORAGE_NAME\n"));
|
|
|
|
}
|
2013-09-18 07:31:18 +02:00
|
|
|
|
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
// Sync data from PCD to variable, so that we do not need detect again in S3 phase.
|
2013-09-18 07:31:18 +02:00
|
|
|
//
|
2014-03-21 03:51:42 +01:00
|
|
|
TrEEDeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;
|
2013-09-18 07:31:18 +02:00
|
|
|
for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {
|
|
|
|
if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {
|
2014-03-21 03:51:42 +01:00
|
|
|
TrEEDeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;
|
2013-09-18 07:31:18 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-21 03:51:42 +01:00
|
|
|
PrivateData->TpmDeviceDetected = TrEEDeviceDetection.TpmDeviceDetected;
|
|
|
|
|
2013-09-18 07:31:18 +02:00
|
|
|
//
|
|
|
|
// Save to variable so platform driver can get it.
|
|
|
|
//
|
|
|
|
Status = gRT->SetVariable (
|
2014-03-21 03:51:42 +01:00
|
|
|
TREE_DEVICE_DETECTION_NAME,
|
2013-09-18 07:31:18 +02:00
|
|
|
&gTrEEConfigFormSetGuid,
|
2014-03-07 04:07:09 +01:00
|
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
2014-03-21 03:51:42 +01:00
|
|
|
sizeof(TrEEDeviceDetection),
|
|
|
|
&TrEEDeviceDetection
|
2013-09-18 07:31:18 +02:00
|
|
|
);
|
2014-03-21 03:51:42 +01:00
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_DEVICE_DETECTION_NAME\n"));
|
|
|
|
Status = gRT->SetVariable (
|
|
|
|
TREE_DEVICE_DETECTION_NAME,
|
|
|
|
&gTrEEConfigFormSetGuid,
|
|
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
|
|
|
0,
|
|
|
|
NULL
|
|
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// We should lock TrEEDeviceDetection, because it contains information needed at S3.
|
|
|
|
//
|
|
|
|
Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);
|
|
|
|
if (!EFI_ERROR (Status)) {
|
|
|
|
Status = VariableLockProtocol->RequestToLock (
|
|
|
|
VariableLockProtocol,
|
|
|
|
TREE_DEVICE_DETECTION_NAME,
|
|
|
|
&gTrEEConfigFormSetGuid
|
|
|
|
);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
}
|
2013-09-18 07:31:18 +02:00
|
|
|
|
|
|
|
//
|
|
|
|
// Install TrEE configuration form
|
|
|
|
//
|
|
|
|
Status = InstallTrEEConfigForm (PrivateData);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto ErrorExit;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
ErrorExit:
|
|
|
|
if (PrivateData != NULL) {
|
|
|
|
UninstallTrEEConfigForm (PrivateData);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Unload the TrEE configuration form.
|
|
|
|
|
|
|
|
@param[in] ImageHandle The driver's image handle.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The TrEE configuration form is unloaded.
|
|
|
|
@retval Others Failed to unload the form.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
TrEEConfigDriverUnload (
|
|
|
|
IN EFI_HANDLE ImageHandle
|
|
|
|
)
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
TREE_CONFIG_PRIVATE_DATA *PrivateData;
|
|
|
|
|
|
|
|
Status = gBS->HandleProtocol (
|
|
|
|
ImageHandle,
|
|
|
|
&gEfiCallerIdGuid,
|
|
|
|
(VOID **) &PrivateData
|
|
|
|
);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
ASSERT (PrivateData->Signature == TREE_CONFIG_PRIVATE_DATA_SIGNATURE);
|
|
|
|
|
|
|
|
gBS->UninstallMultipleProtocolInterfaces (
|
|
|
|
&ImageHandle,
|
|
|
|
&gEfiCallerIdGuid,
|
|
|
|
PrivateData,
|
|
|
|
NULL
|
|
|
|
);
|
|
|
|
|
|
|
|
UninstallTrEEConfigForm (PrivateData);
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|