]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleRuntime.c
CommitLineData
d2a16030
JY
1/** @file\r
2 Capsule library runtime support.\r
3\r
96b17e00 4 Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
d2a16030
JY
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
1436aea4
MK
23extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;\r
24extern BOOLEAN mIsVirtualAddrConverted;\r
25EFI_EVENT mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL;\r
26EFI_EVENT mDxeRuntimeCapsuleLibReadyToBootEvent = NULL;\r
d2a16030
JY
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
1436aea4
MK
38 IN EFI_EVENT Event,\r
39 IN VOID *Context\r
d2a16030
JY
40 )\r
41{\r
2c0d39ac
AB
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
1436aea4
MK
57 IN EFI_EVENT Event,\r
58 IN VOID *Context\r
2c0d39ac
AB
59 )\r
60{\r
1436aea4
MK
61 UINTN Index;\r
62 EFI_CONFIGURATION_TABLE *ConfigEntry;\r
63 EFI_SYSTEM_RESOURCE_TABLE *EsrtTable;\r
d2a16030
JY
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
1436aea4 70 if (CompareGuid (&gEfiSystemResourceTableGuid, &ConfigEntry->VendorGuid)) {\r
d2a16030
JY
71 break;\r
72 }\r
1436aea4 73\r
d2a16030
JY
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
1436aea4 84 EsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *)ConfigEntry->VendorTable;\r
2c0d39ac
AB
85\r
86 mEsrtTable = AllocateRuntimeCopyPool (\r
87 sizeof (EFI_SYSTEM_RESOURCE_TABLE) +\r
88 EsrtTable->FwResourceCount * sizeof (EFI_SYSTEM_RESOURCE_ENTRY),\r
1436aea4
MK
89 EsrtTable\r
90 );\r
2c0d39ac 91 ASSERT (mEsrtTable != NULL);\r
d2a16030
JY
92\r
93 //\r
2c0d39ac 94 // Set FwResourceCountMax to a sane value.\r
d2a16030 95 //\r
2c0d39ac 96 mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount;\r
d2a16030 97 }\r
d2a16030
JY
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
1436aea4
MK
111 IN EFI_HANDLE ImageHandle,\r
112 IN EFI_SYSTEM_TABLE *SystemTable\r
d2a16030
JY
113 )\r
114{\r
1436aea4 115 EFI_STATUS Status;\r
d2a16030
JY
116\r
117 //\r
118 // Make sure we can handle virtual address changes.\r
119 //\r
d2a16030
JY
120 Status = gBS->CreateEventEx (\r
121 EVT_NOTIFY_SIGNAL,\r
122 TPL_NOTIFY,\r
123 DxeCapsuleLibVirtualAddressChangeEvent,\r
124 NULL,\r
125 &gEfiEventVirtualAddressChangeGuid,\r
96b17e00 126 &mDxeRuntimeCapsuleLibVirtualAddressChangeEvent\r
d2a16030
JY
127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
2c0d39ac
AB
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
d2a16030
JY
143 return EFI_SUCCESS;\r
144}\r
96b17e00
HW
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
1436aea4
MK
157 IN EFI_HANDLE ImageHandle,\r
158 IN EFI_SYSTEM_TABLE *SystemTable\r
96b17e00
HW
159 )\r
160{\r
1436aea4 161 EFI_STATUS Status;\r
96b17e00
HW
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
2c0d39ac
AB
169 //\r
170 // Close the ReadyToBoot event.\r
171 //\r
172 Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibReadyToBootEvent);\r
173 ASSERT_EFI_ERROR (Status);\r
174\r
96b17e00
HW
175 return EFI_SUCCESS;\r
176}\r