Home | History | Annotate | Download | only in DxeCapsuleLibFmp
      1 /** @file
      2   Capsule library runtime support.
      3 
      4   Copyright (c) 2016, 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 <PiDxe.h>
     16 
     17 #include <Guid/FmpCapsule.h>
     18 #include <Guid/SystemResourceTable.h>
     19 #include <Guid/EventGroup.h>
     20 
     21 #include <Library/BaseLib.h>
     22 #include <Library/DebugLib.h>
     23 #include <Library/BaseMemoryLib.h>
     24 #include <Library/DxeServicesTableLib.h>
     25 #include <Library/UefiBootServicesTableLib.h>
     26 #include <Library/UefiRuntimeServicesTableLib.h>
     27 #include <Library/MemoryAllocationLib.h>
     28 
     29 extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;
     30 extern BOOLEAN                   mIsVirtualAddrConverted;
     31 
     32 /**
     33   Convert EsrtTable physical address to virtual address.
     34 
     35   @param[in] Event      Event whose notification function is being invoked.
     36   @param[in] Context    The pointer to the notification function's context, which
     37                         is implementation-dependent.
     38 **/
     39 VOID
     40 EFIAPI
     41 DxeCapsuleLibVirtualAddressChangeEvent (
     42   IN  EFI_EVENT   Event,
     43   IN  VOID        *Context
     44   )
     45 {
     46   UINTN                    Index;
     47   EFI_CONFIGURATION_TABLE  *ConfigEntry;
     48 
     49   //
     50   // Get Esrt table first
     51   //
     52   ConfigEntry = gST->ConfigurationTable;
     53   for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {
     54     if (CompareGuid(&gEfiSystemResourceTableGuid, &ConfigEntry->VendorGuid)) {
     55       break;
     56     }
     57     ConfigEntry++;
     58   }
     59 
     60   //
     61   // If no Esrt table installed in Configure Table
     62   //
     63   if (Index < gST->NumberOfTableEntries) {
     64     //
     65     // Search Esrt to check given capsule is qualified
     66     //
     67     mEsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable;
     68 
     69     //
     70     // Update protocol pointer to Esrt Table.
     71     //
     72     gRT->ConvertPointer (0x00, (VOID**) &(mEsrtTable));
     73   }
     74 
     75   mIsVirtualAddrConverted = TRUE;
     76 
     77 }
     78 
     79 /**
     80   The constructor function hook VirtualAddressChange event to use ESRT table as capsule routing table.
     81 
     82   @param  ImageHandle   The firmware allocated handle for the EFI image.
     83   @param  SystemTable   A pointer to the EFI System Table.
     84 
     85   @retval EFI_SUCCESS   The constructor successfully .
     86 **/
     87 EFI_STATUS
     88 EFIAPI
     89 DxeRuntimeCapsuleLibConstructor (
     90   IN EFI_HANDLE         ImageHandle,
     91   IN EFI_SYSTEM_TABLE   *SystemTable
     92   )
     93 {
     94   EFI_STATUS     Status;
     95   EFI_EVENT      Event;
     96 
     97   //
     98   // Make sure we can handle virtual address changes.
     99   //
    100   Event = NULL;
    101   Status = gBS->CreateEventEx (
    102                   EVT_NOTIFY_SIGNAL,
    103                   TPL_NOTIFY,
    104                   DxeCapsuleLibVirtualAddressChangeEvent,
    105                   NULL,
    106                   &gEfiEventVirtualAddressChangeGuid,
    107                   &Event
    108                   );
    109   ASSERT_EFI_ERROR (Status);
    110 
    111   return EFI_SUCCESS;
    112 }
    113