mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 02:40:26 +00:00 
			
		
		
		
	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;
 | 
						|
}
 |