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