REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			159 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Functions related to managing the UEFI variable runtime cache. This file should only include functions
 | |
|   used by the SMM UEFI variable driver.
 | |
| 
 | |
|   Caution: This module requires additional review when modified.
 | |
|   This driver will have external input - variable data. They may be input in SMM mode.
 | |
|   This external input must be validated carefully to avoid security issue like
 | |
|   buffer overflow, integer overflow.
 | |
| 
 | |
| Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "VariableParsing.h"
 | |
| #include "VariableRuntimeCache.h"
 | |
| 
 | |
| extern VARIABLE_MODULE_GLOBAL  *mVariableModuleGlobal;
 | |
| extern VARIABLE_STORE_HEADER   *mNvVariableCache;
 | |
| 
 | |
| /**
 | |
|   Copies any pending updates to runtime variable caches.
 | |
| 
 | |
|   @retval EFI_UNSUPPORTED         The volatile store to be updated is not initialized properly.
 | |
|   @retval EFI_SUCCESS             The volatile store was updated successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| FlushPendingRuntimeVariableCacheUpdates (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   VARIABLE_RUNTIME_CACHE_CONTEXT  *VariableRuntimeCacheContext;
 | |
| 
 | |
|   VariableRuntimeCacheContext = &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext;
 | |
| 
 | |
|   if ((VariableRuntimeCacheContext->VariableRuntimeNvCache.Store == NULL) ||
 | |
|       (VariableRuntimeCacheContext->VariableRuntimeVolatileCache.Store == NULL) ||
 | |
|       (VariableRuntimeCacheContext->PendingUpdate == NULL))
 | |
|   {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   if (*(VariableRuntimeCacheContext->PendingUpdate)) {
 | |
|     if ((VariableRuntimeCacheContext->VariableRuntimeHobCache.Store != NULL) &&
 | |
|         (mVariableModuleGlobal->VariableGlobal.HobVariableBase > 0))
 | |
|     {
 | |
|       CopyMem (
 | |
|         (VOID *)(
 | |
|                  ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeHobCache.Store) +
 | |
|                  VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset
 | |
|                  ),
 | |
|         (VOID *)(
 | |
|                  ((UINT8 *)(UINTN)mVariableModuleGlobal->VariableGlobal.HobVariableBase) +
 | |
|                  VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset
 | |
|                  ),
 | |
|         VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateLength
 | |
|         );
 | |
|       VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateLength = 0;
 | |
|       VariableRuntimeCacheContext->VariableRuntimeHobCache.PendingUpdateOffset = 0;
 | |
|     }
 | |
| 
 | |
|     CopyMem (
 | |
|       (VOID *)(
 | |
|                ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeNvCache.Store) +
 | |
|                VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset
 | |
|                ),
 | |
|       (VOID *)(
 | |
|                ((UINT8 *)(UINTN)mNvVariableCache) +
 | |
|                VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset
 | |
|                ),
 | |
|       VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateLength
 | |
|       );
 | |
|     VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateLength = 0;
 | |
|     VariableRuntimeCacheContext->VariableRuntimeNvCache.PendingUpdateOffset = 0;
 | |
| 
 | |
|     CopyMem (
 | |
|       (VOID *)(
 | |
|                ((UINT8 *)(UINTN)VariableRuntimeCacheContext->VariableRuntimeVolatileCache.Store) +
 | |
|                VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset
 | |
|                ),
 | |
|       (VOID *)(
 | |
|                ((UINT8 *)(UINTN)mVariableModuleGlobal->VariableGlobal.VolatileVariableBase) +
 | |
|                VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset
 | |
|                ),
 | |
|       VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateLength
 | |
|       );
 | |
|     VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateLength = 0;
 | |
|     VariableRuntimeCacheContext->VariableRuntimeVolatileCache.PendingUpdateOffset = 0;
 | |
|     *(VariableRuntimeCacheContext->PendingUpdate)                                 = FALSE;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Synchronizes the runtime variable caches with all pending updates outside runtime.
 | |
| 
 | |
|   Ensures all conditions are met to maintain coherency for runtime cache updates. This function will attempt
 | |
|   to write the given update (and any other pending updates) if the ReadLock is available. Otherwise, the
 | |
|   update is added as a pending update for the given variable store and it will be flushed to the runtime cache
 | |
|   at the next opportunity the ReadLock is available.
 | |
| 
 | |
|   @param[in] VariableRuntimeCache Variable runtime cache structure for the runtime cache being synchronized.
 | |
|   @param[in] Offset               Offset in bytes to apply the update.
 | |
|   @param[in] Length               Length of data in bytes of the update.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The update was added as a pending update successfully. If the variable runtime
 | |
|                                   cache ReadLock was available, the runtime cache was updated successfully.
 | |
|   @retval EFI_UNSUPPORTED         The volatile store to be updated is not initialized properly.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SynchronizeRuntimeVariableCache (
 | |
|   IN  VARIABLE_RUNTIME_CACHE  *VariableRuntimeCache,
 | |
|   IN  UINTN                   Offset,
 | |
|   IN  UINTN                   Length
 | |
|   )
 | |
| {
 | |
|   if (VariableRuntimeCache == NULL) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   } else if (VariableRuntimeCache->Store == NULL) {
 | |
|     // The runtime cache may not be active or allocated yet.
 | |
|     // In either case, return EFI_SUCCESS instead of EFI_NOT_AVAILABLE_YET.
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   if ((mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.PendingUpdate == NULL) ||
 | |
|       (mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.ReadLock == NULL))
 | |
|   {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   if (*(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.PendingUpdate) &&
 | |
|       (VariableRuntimeCache->PendingUpdateLength > 0))
 | |
|   {
 | |
|     VariableRuntimeCache->PendingUpdateLength =
 | |
|       (UINT32)(
 | |
|                MAX (
 | |
|                  (UINTN)(VariableRuntimeCache->PendingUpdateOffset + VariableRuntimeCache->PendingUpdateLength),
 | |
|                  Offset + Length
 | |
|                  ) - MIN ((UINTN)VariableRuntimeCache->PendingUpdateOffset, Offset)
 | |
|                );
 | |
|     VariableRuntimeCache->PendingUpdateOffset =
 | |
|       (UINT32)MIN ((UINTN)VariableRuntimeCache->PendingUpdateOffset, Offset);
 | |
|   } else {
 | |
|     VariableRuntimeCache->PendingUpdateLength = (UINT32)Length;
 | |
|     VariableRuntimeCache->PendingUpdateOffset = (UINT32)Offset;
 | |
|   }
 | |
| 
 | |
|   *(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.PendingUpdate) = TRUE;
 | |
| 
 | |
|   if (*(mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.ReadLock) == FALSE) {
 | |
|     return FlushPendingRuntimeVariableCacheUpdates ();
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |