]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleRuntime.c
... / ...
CommitLineData
1/** @file\r
2 Capsule library runtime support.\r
3\r
4 Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <PiDxe.h>\r
10\r
11#include <Guid/FmpCapsule.h>\r
12#include <Guid/SystemResourceTable.h>\r
13#include <Guid/EventGroup.h>\r
14\r
15#include <Library/BaseLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/DxeServicesTableLib.h>\r
19#include <Library/UefiBootServicesTableLib.h>\r
20#include <Library/UefiRuntimeServicesTableLib.h>\r
21#include <Library/MemoryAllocationLib.h>\r
22\r
23extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;\r
24extern BOOLEAN mIsVirtualAddrConverted;\r
25EFI_EVENT mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL;\r
26EFI_EVENT mDxeRuntimeCapsuleLibReadyToBootEvent = NULL;\r
27\r
28/**\r
29 Convert EsrtTable physical address to virtual address.\r
30\r
31 @param[in] Event Event whose notification function is being invoked.\r
32 @param[in] Context The pointer to the notification function's context, which\r
33 is implementation-dependent.\r
34**/\r
35VOID\r
36EFIAPI\r
37DxeCapsuleLibVirtualAddressChangeEvent (\r
38 IN EFI_EVENT Event,\r
39 IN VOID *Context\r
40 )\r
41{\r
42 gRT->ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mEsrtTable);\r
43 mIsVirtualAddrConverted = TRUE;\r
44}\r
45\r
46/**\r
47 Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT.\r
48\r
49 @param[in] Event The Event that is being processed.\r
50 @param[in] Context The Event Context.\r
51\r
52**/\r
53STATIC\r
54VOID\r
55EFIAPI\r
56DxeCapsuleLibReadyToBootEventNotify (\r
57 IN EFI_EVENT Event,\r
58 IN VOID *Context\r
59 )\r
60{\r
61 UINTN Index;\r
62 EFI_CONFIGURATION_TABLE *ConfigEntry;\r
63 EFI_SYSTEM_RESOURCE_TABLE *EsrtTable;\r
64\r
65 //\r
66 // Get Esrt table first\r
67 //\r
68 ConfigEntry = gST->ConfigurationTable;\r
69 for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {\r
70 if (CompareGuid (&gEfiSystemResourceTableGuid, &ConfigEntry->VendorGuid)) {\r
71 break;\r
72 }\r
73\r
74 ConfigEntry++;\r
75 }\r
76\r
77 //\r
78 // If no Esrt table installed in Configure Table\r
79 //\r
80 if (Index < gST->NumberOfTableEntries) {\r
81 //\r
82 // Search Esrt to check given capsule is qualified\r
83 //\r
84 EsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *)ConfigEntry->VendorTable;\r
85\r
86 mEsrtTable = AllocateRuntimeCopyPool (\r
87 sizeof (EFI_SYSTEM_RESOURCE_TABLE) +\r
88 EsrtTable->FwResourceCount * sizeof (EFI_SYSTEM_RESOURCE_ENTRY),\r
89 EsrtTable\r
90 );\r
91 ASSERT (mEsrtTable != NULL);\r
92\r
93 //\r
94 // Set FwResourceCountMax to a sane value.\r
95 //\r
96 mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount;\r
97 }\r
98}\r
99\r
100/**\r
101 The constructor function hook VirtualAddressChange event to use ESRT table as capsule routing table.\r
102\r
103 @param ImageHandle The firmware allocated handle for the EFI image.\r
104 @param SystemTable A pointer to the EFI System Table.\r
105\r
106 @retval EFI_SUCCESS The constructor successfully .\r
107**/\r
108EFI_STATUS\r
109EFIAPI\r
110DxeRuntimeCapsuleLibConstructor (\r
111 IN EFI_HANDLE ImageHandle,\r
112 IN EFI_SYSTEM_TABLE *SystemTable\r
113 )\r
114{\r
115 EFI_STATUS Status;\r
116\r
117 //\r
118 // Make sure we can handle virtual address changes.\r
119 //\r
120 Status = gBS->CreateEventEx (\r
121 EVT_NOTIFY_SIGNAL,\r
122 TPL_NOTIFY,\r
123 DxeCapsuleLibVirtualAddressChangeEvent,\r
124 NULL,\r
125 &gEfiEventVirtualAddressChangeGuid,\r
126 &mDxeRuntimeCapsuleLibVirtualAddressChangeEvent\r
127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
130 //\r
131 // Register notify function to cache the FMP capsule GUIDs at ReadyToBoot.\r
132 //\r
133 Status = gBS->CreateEventEx (\r
134 EVT_NOTIFY_SIGNAL,\r
135 TPL_CALLBACK,\r
136 DxeCapsuleLibReadyToBootEventNotify,\r
137 NULL,\r
138 &gEfiEventReadyToBootGuid,\r
139 &mDxeRuntimeCapsuleLibReadyToBootEvent\r
140 );\r
141 ASSERT_EFI_ERROR (Status);\r
142\r
143 return EFI_SUCCESS;\r
144}\r
145\r
146/**\r
147 The destructor function closes the VirtualAddressChange event.\r
148\r
149 @param ImageHandle The firmware allocated handle for the EFI image.\r
150 @param SystemTable A pointer to the EFI System Table.\r
151\r
152 @retval EFI_SUCCESS The destructor completed successfully.\r
153**/\r
154EFI_STATUS\r
155EFIAPI\r
156DxeRuntimeCapsuleLibDestructor (\r
157 IN EFI_HANDLE ImageHandle,\r
158 IN EFI_SYSTEM_TABLE *SystemTable\r
159 )\r
160{\r
161 EFI_STATUS Status;\r
162\r
163 //\r
164 // Close the VirtualAddressChange event.\r
165 //\r
166 Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibVirtualAddressChangeEvent);\r
167 ASSERT_EFI_ERROR (Status);\r
168\r
169 //\r
170 // Close the ReadyToBoot event.\r
171 //\r
172 Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibReadyToBootEvent);\r
173 ASSERT_EFI_ERROR (Status);\r
174\r
175 return EFI_SUCCESS;\r
176}\r