Home | History | Annotate | Download | only in SecureBootConfigDxe
      1 /** @file
      2   The module entry point for SecureBoot configuration module.
      3 
      4 Copyright (c) 2011, 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 "SecureBootConfigImpl.h"
     16 
     17 /**
     18   The entry point for SecureBoot configuration driver.
     19 
     20   @param[in]  ImageHandle        The image handle of the driver.
     21   @param[in]  SystemTable        The system table.
     22 
     23   @retval EFI_ALREADY_STARTED    The driver already exists in system.
     24   @retval EFI_OUT_OF_RESOURCES   Fail to execute entry point due to lack of resources.
     25   @retval EFI_SUCCES             All the related protocols are installed on the driver.
     26   @retval Others                 Fail to get the SecureBootEnable variable.
     27 
     28 **/
     29 EFI_STATUS
     30 EFIAPI
     31 SecureBootConfigDriverEntryPoint (
     32   IN EFI_HANDLE          ImageHandle,
     33   IN EFI_SYSTEM_TABLE    *SystemTable
     34   )
     35 {
     36   EFI_STATUS                       Status;
     37   SECUREBOOT_CONFIG_PRIVATE_DATA   *PrivateData;
     38 
     39   //
     40   // If already started, return.
     41   //
     42     Status = gBS->OpenProtocol (
     43                   ImageHandle,
     44                   &gEfiCallerIdGuid,
     45                   NULL,
     46                   ImageHandle,
     47                   ImageHandle,
     48                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL
     49                   );
     50   if (!EFI_ERROR (Status)) {
     51     return EFI_ALREADY_STARTED;
     52   }
     53 
     54   //
     55   // Create a private data structure.
     56   //
     57   PrivateData = AllocateCopyPool (sizeof (SECUREBOOT_CONFIG_PRIVATE_DATA), &mSecureBootConfigPrivateDateTemplate);
     58   if (PrivateData == NULL) {
     59     return EFI_OUT_OF_RESOURCES;
     60   }
     61 
     62   //
     63   // Install SecureBoot configuration form
     64   //
     65   Status = InstallSecureBootConfigForm (PrivateData);
     66   if (EFI_ERROR (Status)) {
     67     goto ErrorExit;
     68   }
     69 
     70   //
     71   // Install private GUID.
     72   //
     73   Status = gBS->InstallMultipleProtocolInterfaces (
     74                   &ImageHandle,
     75                   &gEfiCallerIdGuid,
     76                   PrivateData,
     77                   NULL
     78                   );
     79 
     80   if (EFI_ERROR (Status)) {
     81     goto ErrorExit;
     82   }
     83 
     84   return EFI_SUCCESS;
     85 
     86 ErrorExit:
     87   if (PrivateData != NULL) {
     88     UninstallSecureBootConfigForm (PrivateData);
     89   }
     90 
     91   return Status;
     92 }
     93 
     94 /**
     95   Unload the SecureBoot configuration form.
     96 
     97   @param[in]  ImageHandle         The driver's image handle.
     98 
     99   @retval     EFI_SUCCESS         The SecureBoot configuration form is unloaded.
    100   @retval     Others              Failed to unload the form.
    101 
    102 **/
    103 EFI_STATUS
    104 EFIAPI
    105 SecureBootConfigDriverUnload (
    106   IN EFI_HANDLE  ImageHandle
    107   )
    108 {
    109   EFI_STATUS                  Status;
    110   SECUREBOOT_CONFIG_PRIVATE_DATA   *PrivateData;
    111 
    112   Status = gBS->HandleProtocol (
    113                   ImageHandle,
    114                   &gEfiCallerIdGuid,
    115                   (VOID **) &PrivateData
    116                   );
    117   if (EFI_ERROR (Status)) {
    118     return Status;
    119   }
    120 
    121   ASSERT (PrivateData->Signature == SECUREBOOT_CONFIG_PRIVATE_DATA_SIGNATURE);
    122 
    123   gBS->UninstallMultipleProtocolInterfaces (
    124          &ImageHandle,
    125          &gEfiCallerIdGuid,
    126          PrivateData,
    127          NULL
    128          );
    129 
    130   UninstallSecureBootConfigForm (PrivateData);
    131 
    132   return EFI_SUCCESS;
    133 }
    134