OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
VariableRuntimeCache.c
Go to the documentation of this file.
1
15#include "VariableParsing.h"
17
19extern VARIABLE_STORE_HEADER *mNvVariableCache;
20
28EFI_STATUS
30 VOID
31 )
32{
33 VARIABLE_RUNTIME_CACHE_CONTEXT *VariableRuntimeCacheContext;
34
36
37 if ((VariableRuntimeCacheContext->VariableRuntimeNvCache.Store == NULL) ||
38 (VariableRuntimeCacheContext->VariableRuntimeVolatileCache.Store == NULL) ||
39 (VariableRuntimeCacheContext->PendingUpdate == NULL))
40 {
41 return EFI_UNSUPPORTED;
42 }
43
44 if (*(VariableRuntimeCacheContext->PendingUpdate)) {
45 if ((VariableRuntimeCacheContext->VariableRuntimeHobCache.Store != NULL) &&
47 {
48 CopyMem (
49 (VOID *)(
50 ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeHobCache.Store) +
51 VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset
52 ),
53 (VOID *)(
55 VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset
56 ),
57 VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateLength
58 );
59 VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateLength = 0;
60 VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset = 0;
61 }
62
63 CopyMem (
64 (VOID *)(
65 ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeNvCache.Store) +
66 VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset
67 ),
68 (VOID *)(
69 ((UINT8 *)(UINTN)mNvVariableCache) +
70 VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset
71 ),
72 VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateLength
73 );
74 VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateLength = 0;
75 VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset = 0;
76
77 CopyMem (
78 (VOID *)(
79 ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeVolatileCache.Store) +
80 VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset
81 ),
82 (VOID *)(
84 VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset
85 ),
86 VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateLength
87 );
88 VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateLength = 0;
89 VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset = 0;
90 *(VariableRuntimeCacheContext->PendingUpdate) = FALSE;
91 }
92
93 return EFI_SUCCESS;
94}
95
113EFI_STATUS
115 IN VARIABLE_RUNTIME_CACHE *VariableRuntimeCache,
116 IN UINTN Offset,
117 IN UINTN Length
118 )
119{
120 if (VariableRuntimeCache == NULL) {
121 return EFI_INVALID_PARAMETER;
122 } else if (VariableRuntimeCache->Store == NULL) {
123 // The runtime cache may not be active or allocated yet.
124 // In either case, return EFI_SUCCESS instead of EFI_NOT_AVAILABLE_YET.
125 return EFI_SUCCESS;
126 }
127
130 {
131 return EFI_UNSUPPORTED;
132 }
133
135 (VariableRuntimeCache->PendingUpdateLength > 0))
136 {
137 VariableRuntimeCache->PendingUpdateLength =
138 (UINT32)(
139 MAX (
140 (UINTN)(VariableRuntimeCache->PendingUpdateOffset + VariableRuntimeCache->PendingUpdateLength),
141 Offset + Length
142 ) - MIN ((UINTN)VariableRuntimeCache->PendingUpdateOffset, Offset)
143 );
144 VariableRuntimeCache->PendingUpdateOffset =
145 (UINT32)MIN ((UINTN)VariableRuntimeCache->PendingUpdateOffset, Offset);
146 } else {
147 VariableRuntimeCache->PendingUpdateLength = (UINT32)Length;
148 VariableRuntimeCache->PendingUpdateOffset = (UINT32)Offset;
149 }
150
152
155 }
156
157 return EFI_SUCCESS;
158}
UINT64 Length
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_STATUS FlushPendingRuntimeVariableCacheUpdates(VOID)
VARIABLE_STORE_HEADER * mNvVariableCache
Definition Variable.c:41
EFI_STATUS SynchronizeRuntimeVariableCache(IN VARIABLE_RUNTIME_CACHE *VariableRuntimeCache, IN UINTN Offset, IN UINTN Length)
VARIABLE_MODULE_GLOBAL * mVariableModuleGlobal
Definition Variable.c:35
#define MAX(a, b)
Definition coder.h:59
#define MIN(a, b)
Definition deflate.c:1673
EFI_PHYSICAL_ADDRESS VolatileVariableBase
Definition Variable.h:98
VARIABLE_RUNTIME_CACHE_CONTEXT VariableRuntimeCacheContext
Definition Variable.h:100
EFI_PHYSICAL_ADDRESS HobVariableBase
Definition Variable.h:97
VARIABLE_GLOBAL VariableGlobal
Definition Variable.h:109
VARIABLE_RUNTIME_CACHE VariableRuntimeVolatileCache
Definition Variable.h:79
VARIABLE_RUNTIME_CACHE VariableRuntimeNvCache
Definition Variable.h:78
VARIABLE_RUNTIME_CACHE VariableRuntimeHobCache
Definition Variable.h:77
VARIABLE_STORE_HEADER * Store
Definition Variable.h:70