/** @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;
}
