]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDriver.c
a9a10c9e107f527d7a45f5c2436d1847e749bd44
[mirror_edk2.git] / SecurityPkg / Tcg / TcgConfigDxe / TcgConfigDriver.c
1 /** @file
2 The module entry point for Tcg configuration module.
3
4 Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "TcgConfigImpl.h"
16 #include <Guid/TpmInstance.h>
17
18 /**
19 The entry point for Tcg configuration driver.
20
21 @param[in] ImageHandle The image handle of the driver.
22 @param[in] SystemTable The system table.
23
24 @retval EFI_ALREADY_STARTED The driver already exists in system.
25 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.
26 @retval EFI_SUCCES All the related protocols are installed on the driver.
27 @retval Others Fail to install protocols as indicated.
28
29 **/
30 EFI_STATUS
31 EFIAPI
32 TcgConfigDriverEntryPoint (
33 IN EFI_HANDLE ImageHandle,
34 IN EFI_SYSTEM_TABLE *SystemTable
35 )
36 {
37 EFI_STATUS Status;
38 TCG_CONFIG_PRIVATE_DATA *PrivateData;
39 EFI_TCG_PROTOCOL *TcgProtocol;
40
41 if (!CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)){
42 DEBUG ((EFI_D_ERROR, "No TPM12 instance required!\n"));
43 return EFI_UNSUPPORTED;
44 }
45
46 Status = TisPcRequestUseTpm ((TIS_TPM_HANDLE) (UINTN) TPM_BASE_ADDRESS);
47 if (EFI_ERROR (Status)) {
48 DEBUG ((EFI_D_ERROR, "TPM not detected!\n"));
49 return Status;
50 }
51
52 Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **) &TcgProtocol);
53 if (EFI_ERROR (Status)) {
54 TcgProtocol = NULL;
55 }
56
57 Status = gBS->OpenProtocol (
58 ImageHandle,
59 &gEfiCallerIdGuid,
60 NULL,
61 ImageHandle,
62 ImageHandle,
63 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
64 );
65 if (!EFI_ERROR (Status)) {
66 return EFI_ALREADY_STARTED;
67 }
68
69 //
70 // Create a private data structure.
71 //
72 PrivateData = AllocateCopyPool (sizeof (TCG_CONFIG_PRIVATE_DATA), &mTcgConfigPrivateDateTemplate);
73 if (PrivateData == NULL) {
74 return EFI_OUT_OF_RESOURCES;
75 }
76
77 PrivateData->TcgProtocol = TcgProtocol;
78 PrivateData->HideTpm = (BOOLEAN) (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm));
79
80 //
81 // Install TCG configuration form
82 //
83 Status = InstallTcgConfigForm (PrivateData);
84 if (EFI_ERROR (Status)) {
85 goto ErrorExit;
86 }
87
88 //
89 // Install private GUID.
90 //
91 Status = gBS->InstallMultipleProtocolInterfaces (
92 &ImageHandle,
93 &gEfiCallerIdGuid,
94 PrivateData,
95 NULL
96 );
97
98 if (EFI_ERROR (Status)) {
99 goto ErrorExit;
100 }
101
102 return EFI_SUCCESS;
103
104 ErrorExit:
105 if (PrivateData != NULL) {
106 UninstallTcgConfigForm (PrivateData);
107 }
108
109 return Status;
110 }
111
112 /**
113 Unload the Tcg configuration form.
114
115 @param[in] ImageHandle The driver's image handle.
116
117 @retval EFI_SUCCESS The Tcg configuration form is unloaded.
118 @retval Others Failed to unload the form.
119
120 **/
121 EFI_STATUS
122 EFIAPI
123 TcgConfigDriverUnload (
124 IN EFI_HANDLE ImageHandle
125 )
126 {
127 EFI_STATUS Status;
128 TCG_CONFIG_PRIVATE_DATA *PrivateData;
129
130 Status = gBS->HandleProtocol (
131 ImageHandle,
132 &gEfiCallerIdGuid,
133 (VOID **) &PrivateData
134 );
135 if (EFI_ERROR (Status)) {
136 return Status;
137 }
138
139 ASSERT (PrivateData->Signature == TCG_CONFIG_PRIVATE_DATA_SIGNATURE);
140
141 gBS->UninstallMultipleProtocolInterfaces (
142 &ImageHandle,
143 &gEfiCallerIdGuid,
144 PrivateData,
145 NULL
146 );
147
148 UninstallTcgConfigForm (PrivateData);
149
150 return EFI_SUCCESS;
151 }