/** @file
  Variable Architectural Protocol as defined in PI Specification VOLUME 2 DXE

  This provides the services required to get and set environment variables. This
  protocol must be produced by a runtime DXE driver and may be consumed only by
  the DXE Foundation. The DXE driver that produces this protocol must be a runtime
  driver. This driver is responsible for initializing the GetVariable(),
  GetNextVariableName(), and SetVariable() fields of the UEFI Runtime Services Table.

  After the three fields of the UEFI Runtime Services Table have been initialized,
  the driver must install the EFI_VARIABLE_ARCH_PROTOCOL_GUID on a new handle with
  a NULL interface pointer. The installation of this protocol informs the DXE Foundation
  that the read-only and the volatile environment variable related services are
  now available and that the DXE Foundation must update the 32-bit CRC of the UEFI
  Runtime Services Table. The full complement of environment variable services are
  not available until both this protocol and EFI_VARIABLE_WRITE_ARCH_PROTOCOL are
  installed. DXE drivers that require read-only access or read/write access to volatile
  environment variables must have this architectural protocol in their dependency
  expressions. DXE drivers that require write access to nonvolatile environment
  variables must have the EFI_VARIABLE_WRITE_ARCH_PROTOCOL in their dependency
  expressions.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __ARCH_PROTOCOL_VARIABLE_ARCH_H__
#define __ARCH_PROTOCOL_VARIABLE_ARCH_H__

///
/// Global ID for the Variable Architectural Protocol
///
#define EFI_VARIABLE_ARCH_PROTOCOL_GUID \
  { 0x1e5668e2, 0x8481, 0x11d4, {0xbc, 0xf1, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }

extern EFI_GUID gEfiVariableArchProtocolGuid;

#endif
