/** @file
  MM Services Table Library.
  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
  Copyright (c) 2018, Linaro, Ltd. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include 
#include 
#include 
#include 
EFI_MM_SYSTEM_TABLE  *gMmst = NULL;
/**
  The constructor function caches the pointer of the MM Services Table.
  @param  ImageHandle   The firmware allocated handle for the EFI image.
  @param  SystemTable   A pointer to the EFI System Table.
  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
**/
EFI_STATUS
EFIAPI
MmServicesTableLibConstructor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS            Status;
  EFI_MM_BASE_PROTOCOL  *InternalMmBase;
  InternalMmBase = NULL;
  //
  // Retrieve MM Base Protocol,  Do not use gBS from UefiBootServicesTableLib on purpose
  // to prevent inclusion of gBS, gST, and gImageHandle from SMM Drivers unless the
  // MM driver explicity declares that dependency.
  //
  Status = SystemTable->BootServices->LocateProtocol (
                                        &gEfiMmBaseProtocolGuid,
                                        NULL,
                                        (VOID **)&InternalMmBase
                                        );
  ASSERT_EFI_ERROR (Status);
  ASSERT (InternalMmBase != NULL);
  //
  // We are in MM, retrieve the pointer to MM System Table
  //
  InternalMmBase->GetMmstLocation (InternalMmBase, &gMmst);
  ASSERT (gMmst != NULL);
  return EFI_SUCCESS;
}