1 /** @file
2   Provides library functions for each of the UEFI Runtime Services.
3   Only available to DXE and UEFI module types.
4 
5 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials are licensed and made available under
7 the terms and conditions of the BSD License that accompanies this distribution.
8 The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 **/
14 
15 #ifndef __UEFI_RUNTIME_LIB__
16 #define __UEFI_RUNTIME_LIB__
17 
18 /**
19   This function allows the caller to determine if UEFI ExitBootServices() has been called.
20 
21   This function returns TRUE after all the EVT_SIGNAL_EXIT_BOOT_SERVICES functions have
22   executed as a result of the OS calling ExitBootServices().  Prior to this time FALSE
23   is returned. This function is used by runtime code to decide it is legal to access
24   services that go away after ExitBootServices().
25 
26   @retval  TRUE  The system has finished executing the EVT_SIGNAL_EXIT_BOOT_SERVICES event.
27   @retval  FALSE The system has not finished executing the EVT_SIGNAL_EXIT_BOOT_SERVICES event.
28 
29 **/
30 BOOLEAN
31 EFIAPI
32 EfiAtRuntime (
33   VOID
34   );
35 
36 /**
37   This function allows the caller to determine if UEFI SetVirtualAddressMap() has been called.
38 
39   This function returns TRUE after all the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE functions have
40   executed as a result of the OS calling SetVirtualAddressMap(). Prior to this time FALSE
41   is returned. This function is used by runtime code to decide it is legal to access services
42   that go away after SetVirtualAddressMap().
43 
44   @retval  TRUE  The system has finished executing the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.
45   @retval  FALSE The system has not finished executing the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event.
46 
47 **/
48 BOOLEAN
49 EFIAPI
50 EfiGoneVirtual (
51   VOID
52   );
53 
54 /**
55   This service is a wrapper for the UEFI Runtime Service GetTime().
56 
57   The GetTime() function returns a time that was valid sometime during the call to the function.
58   While the returned EFI_TIME structure contains TimeZone and Daylight savings time information,
59   the actual clock does not maintain these values. The current time zone and daylight saving time
60   information returned by GetTime() are the values that were last set via SetTime().
61   The GetTime() function should take approximately the same amount of time to read the time each
62   time it is called. All reported device capabilities are to be rounded up.
63   During runtime, if a PC-AT CMOS device is present in the platform, the caller must synchronize
64   access to the device before calling GetTime().
65 
66   @param  Time         A pointer to storage to receive a snapshot of the current time.
67   @param  Capabilities An optional pointer to a buffer to receive the real time clock device's
68                        capabilities.
69 
70   @retval  EFI_SUCCESS            The operation completed successfully.
71   @retval  EFI_INVALID_PARAMETER  Time is NULL.
72   @retval  EFI_DEVICE_ERROR       The time could not be retrieved due to a hardware error.
73 
74 **/
75 EFI_STATUS
76 EFIAPI
77 EfiGetTime (
78   OUT EFI_TIME                    *Time,
79   OUT EFI_TIME_CAPABILITIES       *Capabilities  OPTIONAL
80   );
81 
82 /**
83   This service is a wrapper for the UEFI Runtime Service SetTime().
84 
85   The SetTime() function sets the real time clock device to the supplied time, and records the
86   current time zone and daylight savings time information. The SetTime() function is not allowed
87   to loop based on the current time. For example, if the device does not support a hardware reset
88   for the sub-resolution time, the code is not to implement the feature by waiting for the time to
89   wrap.
90   During runtime, if a PC-AT CMOS device is present in the platform, the caller must synchronize
91   access to the device before calling SetTime().
92 
93   @param  Time  A pointer to the current time. Type EFI_TIME is defined in the GetTime()
94                 function description. Full error checking is performed on the different
95                 fields of the EFI_TIME structure (refer to the EFI_TIME definition in the
96                 GetTime() function description for full details), and EFI_INVALID_PARAMETER
97                 is returned if any field is out of range.
98 
99   @retval  EFI_SUCCESS            The operation completed successfully.
100   @retval  EFI_INVALID_PARAMETER  A time field is out of range.
101   @retval  EFI_DEVICE_ERROR       The time could not be set due to a hardware error.
102 
103 **/
104 EFI_STATUS
105 EFIAPI
106 EfiSetTime (
107   IN EFI_TIME                   *Time
108   );
109 
110 /**
111   This service is a wrapper for the UEFI Runtime Service GetWakeupTime().
112 
113   The alarm clock time may be rounded from the set alarm clock time to be within the resolution
114   of the alarm clock device. The resolution of the alarm clock device is defined to be one second.
115   During runtime, if a PC-AT CMOS device is present in the platform the caller must synchronize
116   access to the device before calling GetWakeupTime().
117 
118   @param  Enabled  Indicates if the alarm is currently enabled or disabled.
119   @param  Pending  Indicates if the alarm signal is pending and requires acknowledgement.
120   @param  Time     The current alarm setting. Type EFI_TIME is defined in the GetTime()
121                    function description.
122 
123   @retval  EFI_SUCCESS            The alarm settings were returned.
124   @retval  EFI_INVALID_PARAMETER  Enabled is NULL.
125   @retval  EFI_INVALID_PARAMETER  Pending is NULL.
126   @retval  EFI_INVALID_PARAMETER  Time is NULL.
127   @retval  EFI_DEVICE_ERROR       The wakeup time could not be retrieved due to a hardware error.
128   @retval  EFI_UNSUPPORTED        A wakeup timer is not supported on this platform.
129 
130 **/
131 EFI_STATUS
132 EFIAPI
133 EfiGetWakeupTime (
134   OUT BOOLEAN                     *Enabled,
135   OUT BOOLEAN                     *Pending,
136   OUT EFI_TIME                    *Time
137   );
138 
139 /**
140   This service is a wrapper for the UEFI Runtime Service SetWakeupTime()
141 
142   Setting a system wakeup alarm causes the system to wake up or power on at the set time.
143   When the alarm fires, the alarm signal is latched until it is acknowledged by calling SetWakeupTime()
144   to disable the alarm. If the alarm fires before the system is put into a sleeping or off state,
145   since the alarm signal is latched the system will immediately wake up. If the alarm fires while
146   the system is off and there is insufficient power to power on the system, the system is powered
147   on when power is restored.
148 
149   @param  Enable  Enable or disable the wakeup alarm.
150   @param  Time    If Enable is TRUE, the time to set the wakeup alarm for. Type EFI_TIME
151                   is defined in the GetTime() function description. If Enable is FALSE,
152                   then this parameter is optional, and may be NULL.
153 
154   @retval  EFI_SUCCESS            If Enable is TRUE, then the wakeup alarm was enabled.
155                                   If Enable is FALSE, then the wakeup alarm was disabled.
156   @retval  EFI_INVALID_PARAMETER  A time field is out of range.
157   @retval  EFI_DEVICE_ERROR       The wakeup time could not be set due to a hardware error.
158   @retval  EFI_UNSUPPORTED        A wakeup timer is not supported on this platform.
159 
160 **/
161 EFI_STATUS
162 EFIAPI
163 EfiSetWakeupTime (
164   IN BOOLEAN                      Enable,
165   IN EFI_TIME                     *Time   OPTIONAL
166   );
167 
168 /**
169   This service is a wrapper for the UEFI Runtime Service GetVariable().
170 
171   Each vendor may create and manage its own variables without the risk of name conflicts by
172   using a unique VendorGuid. When a variable is set, its Attributes are supplied to indicate
173   how the data variable should be stored and maintained by the system. The attributes affect
174   when the variable may be accessed and volatility of the data. Any attempts to access a variable
175   that does not have the attribute set for runtime access will yield the EFI_NOT_FOUND error.
176   If the Data buffer is too small to hold the contents of the variable, the error EFI_BUFFER_TOO_SMALL
177   is returned and DataSize is set to the required buffer size to obtain the data.
178 
179   @param  VariableName the name of the vendor's variable, it's a Null-Terminated Unicode String
180   @param  VendorGuid   Unify identifier for vendor.
181   @param  Attributes   Point to memory location to return the attributes of variable. If the point
182                        is NULL, the parameter would be ignored.
183   @param  DataSize     As input, point to the maximum size of return Data-Buffer.
184                        As output, point to the actual size of the returned Data-Buffer.
185   @param  Data         Point to return Data-Buffer.
186 
187   @retval  EFI_SUCCESS            The function completed successfully.
188   @retval  EFI_NOT_FOUND          The variable was not found.
189   @retval  EFI_BUFFER_TOO_SMALL   The DataSize is too small for the result. DataSize has
190                                   been updated with the size needed to complete the request.
191   @retval  EFI_INVALID_PARAMETER  VariableName is NULL.
192   @retval  EFI_INVALID_PARAMETER  VendorGuid is NULL.
193   @retval  EFI_INVALID_PARAMETER  DataSize is NULL.
194   @retval  EFI_INVALID_PARAMETER  The DataSize is not too small and Data is NULL.
195   @retval  EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.
196   @retval  EFI_SECURITY_VIOLATION The variable could not be retrieved due to an authentication failure.
197 **/
198 EFI_STATUS
199 EFIAPI
200 EfiGetVariable (
201   IN      CHAR16                   *VariableName,
202   IN      EFI_GUID                 *VendorGuid,
203   OUT     UINT32                   *Attributes OPTIONAL,
204   IN OUT  UINTN                    *DataSize,
205   OUT     VOID                     *Data
206   );
207 
208 /**
209   This service is a wrapper for the UEFI Runtime Service GetNextVariableName().
210 
211   GetNextVariableName() is called multiple times to retrieve the VariableName and VendorGuid of
212   all variables currently available in the system. On each call to GetNextVariableName() the
213   previous results are passed into the interface, and on output the interface returns the next
214   variable name data. When the entire variable list has been returned, the error EFI_NOT_FOUND
215   is returned.
216 
217   @param  VariableNameSize As input, point to maximum size of variable name.
218                            As output, point to actual size of variable name.
219   @param  VariableName     As input, supplies the last VariableName that was returned by
220                            GetNextVariableName().
221                            As output, returns the name of variable. The name
222                            string is Null-Terminated Unicode string.
223   @param  VendorGuid       As input, supplies the last VendorGuid that was returned by
224                            GetNextVriableName().
225                            As output, returns the VendorGuid of the current variable.
226 
227   @retval  EFI_SUCCESS           The function completed successfully.
228   @retval  EFI_NOT_FOUND         The next variable was not found.
229   @retval  EFI_BUFFER_TOO_SMALL  The VariableNameSize is too small for the result.
230                                  VariableNameSize has been updated with the size needed
231                                  to complete the request.
232   @retval  EFI_INVALID_PARAMETER VariableNameSize is NULL.
233   @retval  EFI_INVALID_PARAMETER VariableName is NULL.
234   @retval  EFI_INVALID_PARAMETER VendorGuid is NULL.
235   @retval  EFI_DEVICE_ERROR      The variable name could not be retrieved due to a hardware error.
236 
237 **/
238 EFI_STATUS
239 EFIAPI
240 EfiGetNextVariableName (
241   IN OUT UINTN                    *VariableNameSize,
242   IN OUT CHAR16                   *VariableName,
243   IN OUT EFI_GUID                 *VendorGuid
244   );
245 
246 /**
247   This service is a wrapper for the UEFI Runtime Service GetNextVariableName()
248 
249   Variables are stored by the firmware and may maintain their values across power cycles. Each vendor
250   may create and manage its own variables without the risk of name conflicts by using a unique VendorGuid.
251 
252   @param  VariableName the name of the vendor's variable, as a
253                        Null-Terminated Unicode String
254   @param  VendorGuid   Unify identifier for vendor.
255   @param  Attributes   Point to memory location to return the attributes of variable. If the point
256                        is NULL, the parameter would be ignored.
257   @param  DataSize     The size in bytes of Data-Buffer.
258   @param  Data         Point to the content of the variable.
259 
260   @retval  EFI_SUCCESS            The firmware has successfully stored the variable and its data as
261                                   defined by the Attributes.
262   @retval  EFI_INVALID_PARAMETER  An invalid combination of attribute bits was supplied, or the
263                                   DataSize exceeds the maximum allowed.
264   @retval  EFI_INVALID_PARAMETER  VariableName is an empty Unicode string.
265   @retval  EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the variable and its data.
266   @retval  EFI_DEVICE_ERROR       The variable could not be saved due to a hardware failure.
267   @retval  EFI_WRITE_PROTECTED    The variable in question is read-only.
268   @retval  EFI_WRITE_PROTECTED    The variable in question cannot be deleted.
269   @retval  EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS
270                                   set but the AuthInfo does NOT pass the validation check carried
271                                   out by the firmware.
272   @retval  EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.
273 
274 **/
275 EFI_STATUS
276 EFIAPI
277 EfiSetVariable (
278   IN CHAR16                       *VariableName,
279   IN EFI_GUID                     *VendorGuid,
280   IN UINT32                       Attributes,
281   IN UINTN                        DataSize,
282   IN VOID                         *Data
283   );
284 
285 /**
286   This service is a wrapper for the UEFI Runtime Service GetNextHighMonotonicCount().
287 
288   The platform's monotonic counter is comprised of two 32-bit quantities: the high 32 bits and
289   the low 32 bits. During boot service time the low 32-bit value is volatile: it is reset to zero
290   on every system reset and is increased by 1 on every call to GetNextMonotonicCount(). The high
291   32-bit value is nonvolatile and is increased by 1 whenever the system resets or whenever the low
292   32-bit count (returned by GetNextMonoticCount()) overflows.
293 
294   @param  HighCount Pointer to returned value.
295 
296   @retval  EFI_SUCCESS           The next high monotonic count was returned.
297   @retval  EFI_DEVICE_ERROR      The device is not functioning properly.
298   @retval  EFI_INVALID_PARAMETER HighCount is NULL.
299 
300 **/
301 EFI_STATUS
302 EFIAPI
303 EfiGetNextHighMonotonicCount (
304   OUT UINT32                      *HighCount
305   );
306 
307 /**
308   This service is a wrapper for the UEFI Runtime Service ResetSystem().
309 
310   The ResetSystem()function resets the entire platform, including all processors and devices,and reboots the system.
311   Calling this interface with ResetType of EfiResetCold causes a system-wide reset. This sets all circuitry within
312   the system to its initial state. This type of reset is asynchronous to system operation and operates without regard
313   to cycle boundaries. EfiResetCold is tantamount to a system power cycle.
314   Calling this interface with ResetType of EfiResetWarm causes a system-wide initialization. The processors are set to
315   their initial state, and pending cycles are not corrupted. If the system does not support this reset type, then an
316   EfiResetCold must be performed.
317   Calling this interface with ResetType of EfiResetShutdown causes the system to enter a power state equivalent to the
318   ACPI G2/S5 or G3 states. If the system does not support this reset type, then when the system is rebooted, it should
319   exhibit the EfiResetCold attributes.
320   The platform may optionally log the parameters from any non-normal reset that occurs.
321   The ResetSystem() function does not return.
322 
323   @param  ResetType   The type of reset to perform.
324   @param  ResetStatus The status code for the reset. If the system reset is part of a normal operation, the status code
325                       would be EFI_SUCCESS. If the system reset is due to some type of failure the most appropriate EFI
326                       Status code would be used.
327   @param  DataSizeThe size, in bytes, of ResetData.
328   @param  ResetData   For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown the data buffer starts with a
329                       Null-terminated Unicode string, optionally followed by additional binary data. The string is a
330                       description that the caller may use to further indicate the reason for the system reset. ResetData
331                       is only valid if ResetStatus is something other then EFI_SUCCESS. This pointer must be a physical
332                       address. For a ResetType of EfiRestUpdate the data buffer also starts with a Null-terminated string
333                       that is followed by a physical VOID * to an EFI_CAPSULE_HEADER.
334 
335 **/
336 VOID
337 EFIAPI
338 EfiResetSystem (
339   IN EFI_RESET_TYPE               ResetType,
340   IN EFI_STATUS                   ResetStatus,
341   IN UINTN                        DataSize,
342   IN VOID                         *ResetData OPTIONAL
343   );
344 
345 /**
346   This service is a wrapper for the UEFI Runtime Service ConvertPointer().
347 
348   The ConvertPointer() function is used by an EFI component during the SetVirtualAddressMap() operation.
349   ConvertPointer()must be called using physical address pointers during the execution of SetVirtualAddressMap().
350 
351   @param  DebugDisposition   Supplies type information for the pointer being converted.
352   @param  Address            The pointer to a pointer that is to be fixed to be the
353                              value needed for the new virtual address mapping being
354                              applied.
355 
356   @retval  EFI_SUCCESS            The pointer pointed to by Address was modified.
357   @retval  EFI_NOT_FOUND          The pointer pointed to by Address was not found to be part of
358                                   the current memory map. This is normally fatal.
359   @retval  EFI_INVALID_PARAMETER  Address is NULL.
360   @retval  EFI_INVALID_PARAMETER  *Address is NULL and DebugDispositio
361 
362 **/
363 EFI_STATUS
364 EFIAPI
365 EfiConvertPointer (
366   IN UINTN                  DebugDisposition,
367   IN OUT VOID               **Address
368   );
369 
370 /**
371   Determines the new virtual address that is to be used on subsequent memory accesses.
372 
373   For IA32, x64, and EBC, this service is a wrapper for the UEFI Runtime Service
374   ConvertPointer().  See the UEFI Specification for details.
375   For IPF, this function interprets Address as a pointer to an EFI_PLABEL structure
376   and both the EntryPoint and GP fields of an EFI_PLABEL are converted from physical
377   to virtiual addressing.  Since IPF allows the GP to point to an address outside
378   a PE/COFF image, the physical to virtual offset for the EntryPoint field is used
379   to adjust the GP field.  The UEFI Runtime Service ConvertPointer() is used to convert
380   EntryPoint and the status code for this conversion is always returned.   If the convertion
381   of EntryPoint fails, then neither EntryPoint nor GP are modified.  See the UEFI
382   Specification for details on the UEFI Runtime Service ConvertPointer().
383 
384   @param  DebugDisposition   Supplies type information for the pointer being converted.
385   @param  Address            The pointer to a pointer that is to be fixed to be the
386                              value needed for the new virtual address mapping being
387                              applied.
388 
389   @return  EFI_STATUS value from EfiConvertPointer().
390 
391 **/
392 EFI_STATUS
393 EFIAPI
394 EfiConvertFunctionPointer (
395   IN UINTN                DebugDisposition,
396   IN OUT VOID             **Address
397   );
398 
399 /**
400   This service is a wrapper for the UEFI Runtime Service SetVirtualAddressMap().
401 
402   The SetVirtualAddressMap() function is used by the OS loader. The function can only be called
403   at runtime, and is called by the owner of the system's memory map. I.e., the component which
404   called ExitBootServices(). All events of type EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE must be signaled
405   before SetVirtualAddressMap() returns.
406 
407   @param  MemoryMapSize         The size in bytes of VirtualMap.
408   @param  DescriptorSize        The size in bytes of an entry in the VirtualMap.
409   @param  DescriptorVersion     The version of the structure entries in VirtualMap.
410   @param  VirtualMap            An array of memory descriptors which contain new virtual
411                                 address mapping information for all runtime ranges. Type
412                                 EFI_MEMORY_DESCRIPTOR is defined in the
413                                 GetMemoryMap() function description.
414 
415   @retval EFI_SUCCESS           The virtual address map has been applied.
416   @retval EFI_UNSUPPORTED       EFI firmware is not at runtime, or the EFI firmware is already in
417                                 virtual address mapped mode.
418   @retval EFI_INVALID_PARAMETER DescriptorSize or DescriptorVersion is
419                                 invalid.
420   @retval EFI_NO_MAPPING        A virtual address was not supplied for a range in the memory
421                                 map that requires a mapping.
422   @retval EFI_NOT_FOUND         A virtual address was supplied for an address that is not found
423                                 in the memory map.
424 **/
425 EFI_STATUS
426 EFIAPI
427 EfiSetVirtualAddressMap (
428   IN UINTN                          MemoryMapSize,
429   IN UINTN                          DescriptorSize,
430   IN UINT32                         DescriptorVersion,
431   IN CONST EFI_MEMORY_DESCRIPTOR    *VirtualMap
432   );
433 
434 
435 /**
436   Convert the standard Lib double linked list to a virtual mapping.
437 
438   This service uses EfiConvertPointer() to walk a double linked list and convert all the link
439   pointers to their virtual mappings. This function is only guaranteed to work during the
440   EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event and calling it at other times has undefined results.
441 
442   @param  DebugDisposition   Supplies type information for the pointer being converted.
443   @param  ListHead           Head of linked list to convert.
444 
445   @retval  EFI_SUCCESS  Successfully executed the function.
446   @retval  !EFI_SUCCESS Failed to execute the function.
447 
448 **/
449 EFI_STATUS
450 EFIAPI
451 EfiConvertList (
452   IN UINTN                DebugDisposition,
453   IN OUT LIST_ENTRY       *ListHead
454   );
455 
456 /**
457   This service is a wrapper for the UEFI Runtime Service UpdateCapsule().
458 
459   Passes capsules to the firmware with both virtual and physical mapping. Depending on the intended
460   consumption, the firmware may process the capsule immediately. If the payload should persist across a
461   system reset, the reset value returned from EFI_QueryCapsuleCapabilities must be passed into ResetSystem()
462   and will cause the capsule to be processed by the firmware as part of the reset process.
463 
464   @param  CapsuleHeaderArray    Virtual pointer to an array of virtual pointers to the capsules
465                                 being passed into update capsule. Each capsules is assumed to
466                                 stored in contiguous virtual memory. The capsules in the
467                                 CapsuleHeaderArray must be the same capsules as the
468                                 ScatterGatherList. The CapsuleHeaderArray must
469                                 have the capsules in the same order as the ScatterGatherList.
470   @param  CapsuleCount          Number of pointers to EFI_CAPSULE_HEADER in
471                                 CaspuleHeaderArray.
472   @param  ScatterGatherList     Physical pointer to a set of
473                                 EFI_CAPSULE_BLOCK_DESCRIPTOR that describes the
474                                 location in physical memory of a set of capsules. See Related
475                                 Definitions for an explanation of how more than one capsule is
476                                 passed via this interface. The capsules in the
477                                 ScatterGatherList must be in the same order as the
478                                 CapsuleHeaderArray. This parameter is only referenced if
479                                 the capsules are defined to persist across system reset.
480 
481   @retval EFI_SUCCESS           A valid capsule was passed. If CAPSULE_FLAGS_PERSIT_ACROSS_RESET is not set,
482                                 the capsule has been successfully processed by the firmware.
483   @retval EFI_INVALID_PARAMETER CapsuleSize is NULL, or an incompatible set of flags were
484                                 set in the capsule header.
485   @retval EFI_INVALID_PARAMETER CapsuleCount is 0
486   @retval EFI_DEVICE_ERROR      The capsule update was started, but failed due to a device error.
487   @retval EFI_UNSUPPORTED       The capsule type is not supported on this platform.
488   @retval EFI_OUT_OF_RESOURCES  There were insufficient resources to process the capsule.
489 
490 **/
491 EFI_STATUS
492 EFIAPI
493 EfiUpdateCapsule (
494   IN EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
495   IN UINTN                    CapsuleCount,
496   IN EFI_PHYSICAL_ADDRESS     ScatterGatherList OPTIONAL
497   );
498 
499 
500 /**
501   This service is a wrapper for the UEFI Runtime Service QueryCapsuleCapabilities().
502 
503   The QueryCapsuleCapabilities() function allows a caller to test to see if a capsule or
504   capsules can be updated via UpdateCapsule(). The Flags values in the capsule header and
505   size of the entire capsule is checked.
506   If the caller needs to query for generic capsule capability a fake EFI_CAPSULE_HEADER can be
507   constructed where CapsuleImageSize is equal to HeaderSize that is equal to sizeof
508   (EFI_CAPSULE_HEADER). To determine reset requirements,
509   CAPSULE_FLAGS_PERSIST_ACROSS_RESET should be set in the Flags field of the
510   EFI_CAPSULE_HEADER.
511   The firmware must support any capsule that has the
512   CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag set in EFI_CAPSULE_HEADER. The
513   firmware sets the policy for what capsules are supported that do not have the
514   CAPSULE_FLAGS_PERSIST_ACROSS_RESET flag set.
515 
516   @param  CapsuleHeaderArray    Virtual pointer to an array of virtual pointers to the capsules
517                                 being passed into update capsule. The capsules are assumed to
518                                 stored in contiguous virtual memory.
519   @param  CapsuleCount          Number of pointers to EFI_CAPSULE_HEADER in
520                                 CaspuleHeaderArray.
521   @param  MaximumCapsuleSize     On output the maximum size that UpdateCapsule() can
522                                 support as an argument to UpdateCapsule() via
523                                 CapsuleHeaderArray and ScatterGatherList.
524                                 Undefined on input.
525   @param  ResetType             Returns the type of reset required for the capsule update.
526 
527   @retval EFI_SUCCESS           A valid answer was returned.
528   @retval EFI_INVALID_PARAMETER MaximumCapsuleSize is NULL.
529   @retval EFI_UNSUPPORTED       The capsule type is not supported on this platform, and
530                                 MaximumCapsuleSize and ResetType are undefined.
531   @retval EFI_OUT_OF_RESOURCES  There were insufficient resources to process the query request.
532 
533 **/
534 EFI_STATUS
535 EFIAPI
536 EfiQueryCapsuleCapabilities (
537   IN  EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
538   IN  UINTN                    CapsuleCount,
539   OUT UINT64                   *MaximumCapsuleSize,
540   OUT EFI_RESET_TYPE           *ResetType
541   );
542 
543 
544 /**
545   This service is a wrapper for the UEFI Runtime Service QueryVariableInfo().
546 
547   The QueryVariableInfo() function allows a caller to obtain the information about the
548   maximum size of the storage space available for the EFI variables, the remaining size of the storage
549   space available for the EFI variables and the maximum size of each individual EFI variable,
550   associated with the attributes specified.
551   The returned MaximumVariableStorageSize, RemainingVariableStorageSize,
552   MaximumVariableSize information may change immediately after the call based on other
553   runtime activities including asynchronous error events. Also, these values associated with different
554   attributes are not additive in nature.
555 
556   @param  Attributes            Attributes bitmask to specify the type of variables on
557                                 which to return information. Refer to the
558                                 GetVariable() function description.
559   @param  MaximumVariableStorageSize
560                                 On output the maximum size of the storage space
561                                 available for the EFI variables associated with the
562                                 attributes specified.
563   @param  RemainingVariableStorageSize
564                                 Returns the remaining size of the storage space
565                                 available for the EFI variables associated with the
566                                 attributes specified.
567   @param  MaximumVariableSize   Returns the maximum size of the individual EFI
568                                 variables associated with the attributes specified.
569 
570   @retval EFI_SUCCESS           A valid answer was returned.
571   @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
572   @retval EFI_UNSUPPORTED       EFI_UNSUPPORTED The attribute is not supported on this platform, and the
573                                 MaximumVariableStorageSize,
574                                 RemainingVariableStorageSize, MaximumVariableSize
575                                 are undefined.
576 
577 **/
578 EFI_STATUS
579 EFIAPI
580 EfiQueryVariableInfo (
581   IN UINT32   Attributes,
582   OUT UINT64  *MaximumVariableStorageSize,
583   OUT UINT64  *RemainingVariableStorageSize,
584   OUT UINT64  *MaximumVariableSize
585   );
586 
587 #endif
588 
589