/** @file
  Main PAL API's defined in Intel Itanium Architecture Software Developer's Manual.

  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 __PAL_API_H__
#define __PAL_API_H__

#define PAL_SUCCESS             0x0

///
/// CacheType of PAL_CACHE_FLUSH.
///
#define PAL_CACHE_FLUSH_INSTRUCTION_ALL   1
#define PAL_CACHE_FLUSH_DATA_ALL          2
#define PAL_CACHE_FLUSH_ALL               3
#define PAL_CACHE_FLUSH_SYNC_TO_DATA      4


///
/// Bitmask of Opearation of PAL_CACHE_FLUSH.
///
#define PAL_CACHE_FLUSH_INVALIDATE_LINES     BIT0
#define PAL_CACHE_FLUSH_NO_INVALIDATE_LINES  0
#define PAL_CACHE_FLUSH_POLL_INTERRUPT       BIT1
#define PAL_CACHE_FLUSH_NO_INTERRUPT         0

/**
  PAL Procedure - PAL_CACHE_FLUSH.

  Flush the instruction or data caches. It is required by Itanium processors.
  The PAL procedure supports the Static Registers calling
  convention. It could be called at virtual mode and physical
  mode.

  @param Index              Index of PAL_CACHE_FLUSH within the
                            list of PAL procedures.
  @param CacheType          Unsigned 64-bit integer indicating
                            which cache to flush.
  @param Operation          Formatted bit vector indicating the
                            operation of this call.
  @param ProgressIndicator  Unsigned 64-bit integer specifying
                            the starting position of the flush
                            operation.

  @retval 2                 Call completed without error, but a PMI
                            was taken during the execution of this
                            procedure.
  @retval 1                 Call has not completed flushing due to
                            a pending interrupt.
  @retval 0                 Call completed without error
  @retval -2                Invalid argument
  @retval -3                Call completed with error

  @return R9                Unsigned 64-bit integer specifying the vector
                            number of the pending interrupt.
  @return R10               Unsigned 64-bit integer specifying the
                            starting position of the flush operation.
  @return R11               Unsigned 64-bit integer specifying the vector
                            number of the pending interrupt.

**/
#define PAL_CACHE_FLUSH   1


///
/// Attributes of PAL_CACHE_CONFIG_INFO1
///
#define PAL_CACHE_ATTR_WT   0
#define PAL_CACHE_ATTR_WB   1

///
/// PAL_CACHE_CONFIG_INFO1.StoreHint
///
#define PAL_CACHE_STORE_TEMPORAL      0
#define PAL_CACHE_STORE_NONE_TEMPORAL 3

///
/// PAL_CACHE_CONFIG_INFO1.StoreHint
///
#define PAL_CACHE_STORE_TEMPORAL_LVL_1        0
#define PAL_CACHE_STORE_NONE_TEMPORAL_LVL_ALL 3

///
/// PAL_CACHE_CONFIG_INFO1.StoreHint
///
#define PAL_CACHE_LOAD_TEMPORAL_LVL_1         0
#define PAL_CACHE_LOAD_NONE_TEMPORAL_LVL_1    1
#define PAL_CACHE_LOAD_NONE_TEMPORAL_LVL_ALL  3

///
/// Detail the characteristics of a given processor controlled
/// cache in the cache hierarchy.
///
typedef struct {
  UINT64  IsUnified   : 1;
  UINT64  Attributes  : 2;
  UINT64  Associativity:8;
  UINT64  LineSize:8;
  UINT64  Stride:8;
  UINT64  StoreLatency:8;
  UINT64  StoreHint:8;
  UINT64  LoadHint:8;
} PAL_CACHE_INFO_RETURN1;

///
/// Detail the characteristics of a given processor controlled
/// cache in the cache hierarchy.
///
typedef struct {
  UINT64  CacheSize:32;
  UINT64  AliasBoundary:8;
  UINT64  TagLsBits:8;
  UINT64  TagMsBits:8;
} PAL_CACHE_INFO_RETURN2;

/**
  PAL Procedure - PAL_CACHE_INFO.

  Return detailed instruction or data cache information. It is
  required by Itanium processors. The PAL procedure supports the Static
  Registers calling convention. It could be called at virtual
  mode and physical mode.

  @param Index        Index of PAL_CACHE_INFO within the list of
                      PAL procedures.
  @param CacheLevel   Unsigned 64-bit integer specifying the
                      level in the cache hierarchy for which
                      information is requested. This value must
                      be between 0 and one less than the value
                      returned in the cache_levels return value
                      from PAL_CACHE_SUMMARY.
  @param CacheType    Unsigned 64-bit integer with a value of 1
                      for instruction cache and 2 for data or
                      unified cache. All other values are
                      reserved.
  @param Reserved     Should be 0.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error

  @return R9          Detail the characteristics of a given
                      processor controlled cache in the cache
                      hierarchy. See PAL_CACHE_INFO_RETURN1.
  @return R10         Detail the characteristics of a given
                      processor controlled cache in the cache
                      hierarchy. See PAL_CACHE_INFO_RETURN2.
  @return R11         Reserved with 0.

**/
#define PAL_CACHE_INFO    2



///
/// Level of PAL_CACHE_INIT.
///
#define PAL_CACHE_INIT_ALL  0xffffffffffffffffULL

///
/// CacheType
///
#define PAL_CACHE_INIT_TYPE_INSTRUCTION                 0x1
#define PAL_CACHE_INIT_TYPE_DATA                        0x2
#define PAL_CACHE_INIT_TYPE_INSTRUCTION_AND_DATA        0x3

///
/// Restrict of PAL_CACHE_INIT.
///
#define PAL_CACHE_INIT_NO_RESTRICT  0
#define PAL_CACHE_INIT_RESTRICTED   1

/**
  PAL Procedure - PAL_CACHE_INIT.

  Initialize the instruction or data caches. It is required by
  Itanium processors. The PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode.

  @param Index      Index of PAL_CACHE_INIT within the list of PAL
                    procedures.
  @param Level      Unsigned 64-bit integer containing the level of
                    cache to initialize. If the cache level can be
                    initialized independently, only that level will
                    be initialized. Otherwise
                    implementation-dependent side-effects will
                    occur.
  @param CacheType  Unsigned 64-bit integer with a value of 1 to
                    initialize the instruction cache, 2 to
                    initialize the data cache, or 3 to
                    initialize both. All other values are
                    reserved.
  @param Restrict   Unsigned 64-bit integer with a value of 0 or
                    1. All other values are reserved. If
                    restrict is 1 and initializing the specified
                    level and cache_type of the cache would
                    cause side-effects, PAL_CACHE_INIT will
                    return -4 instead of initializing the cache.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.
  @retval -4        Call could not initialize the specified
                    level and cache_type of the cache without
                    side-effects and restrict was 1.

**/
#define PAL_CACHE_INIT    3


///
/// PAL_CACHE_PROTECTION.Method.
///
#define PAL_CACHE_PROTECTION_NONE_PROTECT   0
#define PAL_CACHE_PROTECTION_ODD_PROTECT    1
#define PAL_CACHE_PROTECTION_EVEN_PROTECT   2
#define PAL_CACHE_PROTECTION_ECC_PROTECT    3



///
/// PAL_CACHE_PROTECTION.TagOrData.
///
#define PAL_CACHE_PROTECTION_PROTECT_DATA   0
#define PAL_CACHE_PROTECTION_PROTECT_TAG    1
#define PAL_CACHE_PROTECTION_PROTECT_TAG_ANDTHEN_DATA   2
#define PAL_CACHE_PROTECTION_PROTECT_DATA_ANDTHEN_TAG   3

///
/// 32-bit protection information structures.
///
typedef struct {
  UINT32  DataBits:8;
  UINT32  TagProtLsb:6;
  UINT32  TagProtMsb:6;
  UINT32  ProtBits:6;
  UINT32  Method:4;
  UINT32  TagOrData:2;
} PAL_CACHE_PROTECTION;

/**
  PAL Procedure - PAL_CACHE_PROT_INFO.

  Return instruction or data cache protection information. It is
  required by Itanium processors. The PAL procedure supports the Static
  Registers calling convention. It could be called at physical
  mode and Virtual mode.

  @param Index      Index of PAL_CACHE_PROT_INFO within the list of
                    PAL procedures.
  @param CacheLevel Unsigned 64-bit integer specifying the level
                    in the cache hierarchy for which information
                    is requested. This value must be between 0
                    and one less than the value returned in the
                    cache_levels return value from
                    PAL_CACHE_SUMMARY.
  @param CacheType  Unsigned 64-bit integer with a value of 1
                    for instruction cache and 2 for data or
                    unified cache. All other values are
                    reserved.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.

  @return R9        Detail the characteristics of a given
                    processor controlled cache in the cache
                    hierarchy. See PAL_CACHE_PROTECTION[0..1].
  @return R10       Detail the characteristics of a given
                    processor controlled cache in the cache
                    hierarchy. See PAL_CACHE_PROTECTION[2..3].
  @return R11       Detail the characteristics of a given
                    processor controlled cache in the cache
                    hierarchy. See PAL_CACHE_PROTECTION[4..5].

**/
#define PAL_CACHE_PROT_INFO     38

typedef struct {
  UINT64  ThreadId : 16;    ///< The thread identifier of the logical
                            ///< processor for which information is being
                            ///< returned. This value will be unique on a per core basis.
  UINT64  Reserved1: 16;
  UINT64  CoreId: 16;       ///< The core identifier of the logical processor
                            ///< for which information is being returned.
                            ///< This value will be unique on a per physical
                            ///< processor package basis.
  UINT64  Reserved2: 16;
} PAL_PCOC_N_CACHE_INFO1;


typedef struct {
  UINT64  LogicalAddress : 16;  ///< Logical address: geographical address
                                ///< of the logical processor for which
                                ///< information is being returned. This is
                                ///< the same value that is returned by the
                                ///< PAL_FIXED_ADDR procedure when it is
                                ///< called on the logical processor.
  UINT64  Reserved1: 16;
  UINT64  Reserved2: 32;
} PAL_PCOC_N_CACHE_INFO2;

/**
  PAL Procedure - PAL_CACHE_SHARED_INFO.

  Returns information on which logical processors share caches.
  It is optional. The PAL procedure supports the Static
  Registers calling convention. It could be called at physical
  mode and Virtual mode.

  @param Index       Index of PAL_CACHE_SHARED_INFO within the list
                     of PAL procedures.
  @param CacheLevel  Unsigned 64-bit integer specifying the
                     level in the cache hierarchy for which
                     information is requested. This value must
                     be between 0 and one less than the value
                     returned in the cache_levels return value
                     from PAL_CACHE_SUMMARY.
  @param CacheType   Unsigned 64-bit integer with a value of 1
                     for instruction cache and 2 for data or
                     unified cache. All other values are
                     reserved.
  @param ProcNumber  Unsigned 64-bit integer that specifies for
                     which logical processor information is
                     being requested. This input argument must
                     be zero for the first call to this
                     procedure and can be a maximum value of
                     one less than the number of logical
                     processors sharing this cache, which is
                     returned by the num_shared return value.

  @retval 0          Call completed without error
  @retval -1         Unimplemented procedure
  @retval -2         Invalid argument
  @retval -3         Call completed with error.

  @return R9         Unsigned integer that returns the number of
                     logical processors that share the processor
                     cache level and type, for which information was
                     requested.
  @return R10        The format of PAL_PCOC_N_CACHE_INFO1.
  @return R11        The format of PAL_PCOC_N_CACHE_INFO2.

**/
#define PAL_CACHE_SHARED_INFO   43


/**
  PAL Procedure - PAL_CACHE_SUMMARY.

  Return a summary of the cache hierarchy. It is required by
  Itanium processors. The PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode and Virtual
  mode.

  @param Index  Index of PAL_CACHE_SUMMARY within the list of
                PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    CacheLevels   Unsigned 64-bit integer denoting the
                              number of levels of cache
                              implemented by the processor.
                              Strictly, this is the number of
                              levels for which the cache
                              controller is integrated into the
                              processor (the cache SRAMs may be
                              external to the processor).
  @return R10   UniqueCaches  Unsigned 64-bit integer denoting the
                              number of unique caches implemented
                              by the processor. This has a maximum
                              of 2*cache_levels, but may be less
                              if any of the levels in the cache
                              hierarchy are unified caches or do
                              not have both instruction and data
                              caches.

**/
#define PAL_CACHE_SUMMARY   4


//
// Virtual Memory Attributes implemented by processor.
//
#define PAL_MEMORY_ATTR_WB      0
#define PAL_MEMORY_ATTR_WC      6
#define PAL_MEMORY_ATTR_UC      4
#define PAL_MEMORY_ATTR_UCE     5
#define PAL_MEMORY_ATTR_NATPAGE 7

/**
  PAL Procedure - PAL_MEM_ATTRIB.

  Return a list of supported memory attributes.. It is required
  by Itanium processors. The PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode and Virtual
  mode.

  @param Index  Index of PAL_MEM_ATTRIB within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Attributes  8-bit vector of memory attributes
                            implemented by processor. See Virtual
                            Memory Attributes above.

**/

#define PAL_MEM_ATTRIB      5

/**
  PAL Procedure - PAL_PREFETCH_VISIBILITY.

  Used in architected sequence to transition pages from a
  cacheable, speculative attribute to an uncacheable attribute.
  It is required by Itanium processors. The PAL procedure supports the Static
  Registers calling convention. It could be called at physical
  mode and Virtual mode.

  @param Index          Index of PAL_PREFETCH_VISIBILITY within the list
                        of PAL procedures.
  @param TransitionType Unsigned integer specifying the type
                        of memory attribute transition that is
                        being performed.

  @retval 1             Call completed without error; this
                        call is not necessary on remote
                        processors.
  @retval 0             Call completed without error
  @retval -2            Invalid argument
  @retval -3            Call completed with error.

**/
#define PAL_PREFETCH_VISIBILITY   41

/**
  PAL Procedure - PAL_PTCE_INFO.

  Return information needed for ptc.e instruction to purge
  entire TC. It is required by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called at
  physical mode and Virtual mode.

  @param Index  Index of PAL_PTCE_INFO within the list
                of PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Unsigned 64-bit integer denoting the beginning
                address to be used by the first PTCE instruction
                in the purge loop.
  @return R10   Two unsigned 32-bit integers denoting the loop
                counts of the outer (loop 1) and inner (loop 2)
                purge loops. count1 (loop 1) is contained in bits
                63:32 of the parameter, and count2 (loop 2) is
                contained in bits 31:0 of the parameter.
  @return R11   Two unsigned 32-bit integers denoting the loop
                strides of the outer (loop 1) and inner (loop 2)
                purge loops. stride1 (loop 1) is contained in bits
                63:32 of the parameter, and stride2 (loop 2) is
                contained in bits 31:0 of the parameter.

**/
#define PAL_PTCE_INFO     6

typedef struct {
  UINT64  NumberSets:8;             ///< Unsigned 8-bit integer denoting the number
                                    ///< of hash sets for the specified level
                                    ///< (1=fully associative)
  UINT64  NumberWays:8;             ///< Unsigned 8-bit integer denoting the
                                    ///< associativity of the specified level
                                    ///< (1=direct).
  UINT64  NumberEntries:16;         ///< Unsigned 16-bit integer denoting the
                                    ///< number of entries in the specified TC.
  UINT64  PageSizeIsOptimized:1;    ///< Flag denoting whether the
                                    ///< specified level is optimized for
                                    ///< the region's preferred page size
                                    ///< (1=optimized) tc_pages indicates
                                    ///< which page sizes are usable by
                                    ///< this translation cache.
  UINT64  TcIsUnified:1;            ///< Flag denoting whether the specified TC is
                                    ///< unified (1=unified).
  UINT64  EntriesReduction:1;       ///< Flag denoting whether installed
                                    ///< translation registers will reduce
                                    ///< the number of entries within the
                                    ///< specified TC.
} PAL_TC_INFO;

/**
  PAL Procedure - PAL_VM_INFO.

  Return detailed information about virtual memory features
  supported in the processor. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and Virtual mode.

  @param Index    Index of PAL_VM_INFO within the list
                  of PAL procedures.
  @param TcLevel  Unsigned 64-bit integer specifying the level
                  in the TLB hierarchy for which information is
                  required. This value must be between 0 and one
                  less than the value returned in the
                  vm_info_1.num_tc_levels return value from
                  PAL_VM_SUMMARY.
  @param TcType   Unsigned 64-bit integer with a value of 1 for
                  instruction translation cache and 2 for data
                  or unified translation cache. All other values
                  are reserved.

  @retval 0       Call completed without error
  @retval -2      Invalid argument
  @retval -3      Call completed with error.

  @return R9      8-byte formatted value returning information
                  about the specified TC. See PAL_TC_INFO above.
  @return R10     64-bit vector containing a bit for each page
                  size supported in the specified TC, where bit
                  position n indicates a page size of 2**n.

**/
#define PAL_VM_INFO       7


/**
  PAL Procedure - PAL_VM_PAGE_SIZE.

  Return virtual memory TC and hardware walker page sizes
  supported in the processor. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and Virtual mode.

  @param Index  Index of PAL_VM_PAGE_SIZE within the list
                of PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    64-bit vector containing a bit for each
                architected page size that is supported for
                TLB insertions and region registers.
  @return R10   64-bit vector containing a bit for each
                architected page size supported for TLB purge
                operations.

**/
#define PAL_VM_PAGE_SIZE 34

typedef struct {
  UINT64  WalkerPresent:1;              ///< 1-bit flag indicating whether a hardware
                                        ///< TLB walker is implemented (1 = walker
                                        ///< present).
  UINT64  WidthOfPhysicalAddress: 7;    ///< Unsigned 7-bit integer
                                        ///< denoting the number of bits of
                                        ///< physical address implemented.
  UINT64  WidthOfKey:8;                 ///< Unsigned 8-bit integer denoting the number
                                        ///< of bits mplemented in the PKR.key field.
  UINT64  MaxPkrIndex:8;                ///< Unsigned 8-bit integer denoting the
                                        ///< maximum PKR index (number of PKRs-1).
  UINT64  HashTagId:8;                  ///< Unsigned 8-bit integer which uniquely
                                        ///< identifies the processor hash and tag
                                        ///< algorithm.
  UINT64  MaxDtrIndex:8;                ///< Unsigned 8 bit integer denoting the
                                        ///< maximum data translation register index
                                        ///< (number of dtr entries - 1).
  UINT64  MaxItrIndex:8;                ///< Unsigned 8 bit integer denoting the
                                        ///< maximum instruction translation register
                                        ///< index (number of itr entries - 1).
  UINT64  NumberOfUniqueTc:8;           ///< Unsigned 8-bit integer denoting the
                                        ///< number of unique TCs implemented.
                                        ///< This is a maximum of
                                        ///< 2*num_tc_levels.
  UINT64  NumberOfTcLevels:8;           ///< Unsigned 8-bit integer denoting the
                                        ///< number of TC levels.
} PAL_VM_INFO1;

typedef struct {
  UINT64  WidthOfVirtualAddress:8;  ///< Unsigned 8-bit integer denoting
                                    ///< is the total number of virtual
                                    ///< address bits - 1.
  UINT64  WidthOfRid:8;             ///< Unsigned 8-bit integer denoting the number
                                    ///< of bits implemented in the RR.rid field.
  UINT64  MaxPurgedTlbs:16;         ///< Unsigned 16 bit integer denoting the
                                    ///< maximum number of concurrent outstanding
                                    ///< TLB purges allowed by the processor. A
                                    ///< value of 0 indicates one outstanding
                                    ///< purge allowed. A value of 216-1
                                    ///< indicates no limit on outstanding
                                    ///< purges. All other values indicate the
                                    ///< actual number of concurrent outstanding
                                    ///< purges allowed.
  UINT64  Reserved:32;
} PAL_VM_INFO2;

/**
  PAL Procedure - PAL_VM_SUMMARY.

  Return summary information about virtual memory features
  supported in the processor. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and Virtual mode.

  @param Index  Index of PAL_VM_SUMMARY within the list
                of PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    8-byte formatted value returning global virtual
                memory information. See PAL_VM_INFO1 above.
  @return R10   8-byte formatted value returning global virtual
                memory information. See PAL_VM_INFO2 above.

**/
#define PAL_VM_SUMMARY  8


//
// Bit mask of TR_valid flag.
//
#define PAL_TR_ACCESS_RIGHT_IS_VALID      BIT0
#define PAL_TR_PRIVILEGE_LEVEL_IS_VALID   BIT1
#define PAL_TR_DIRTY_IS_VALID             BIT2
#define PAL_TR_MEMORY_ATTR_IS_VALID       BIT3


/**
  PAL Procedure - PAL_VM_TR_READ.

  Read contents of a translation register. It is required by
  Itanium processors. The PAL procedure supports the Stacked Register calling
  convention. It could be called at physical mode.

  @param Index      Index of PAL_VM_TR_READ within the list
                    of PAL procedures.
  @param RegNumber  Unsigned 64-bit number denoting which TR to
                    read.
  @param TrType     Unsigned 64-bit number denoting whether to
                    read an ITR (0) or DTR (1). All other values
                    are reserved.
  @param TrBuffer   64-bit pointer to the 32-byte memory buffer in
                    which translation data is returned.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.

  @return R9        Formatted bit vector denoting which fields are
                    valid. See TR_valid above.

**/
#define PAL_VM_TR_READ  261




//
// Bit Mask of Processor Bus Fesatures .
//

/**

  When 0, bus data errors are detected and single bit errors are
  corrected. When 1, no error detection or correction is done.

**/
#define PAL_BUS_DISABLE_DATA_ERROR_SIGNALLING   BIT63


/**

  When 0, bus address errors are signalled on the bus. When 1,
  no bus errors are signalled on the bus. If Disable Bus Address
  Error Checking is 1, this bit is ignored.

**/
#define PAL_BUS_DISABLE_ADDRESS_ERROR_SIGNALLING   BIT62




/**

  When 0, bus errors are detected, single bit errors are
  corrected., and a CMCI or MCA is generated internally to the
  processor. When 1, no bus address errors are detected or
  corrected.

**/
#define PAL_BUS_DISABLE_ADDRESS_ERROR_CHECK   BIT61


/**

  When 0, bus protocol errors (BINIT#) are signaled by the
  processor on the bus. When 1, bus protocol errors (BINIT#) are
  not signaled on the bus. If Disable Bus Initialization Event
  Checking is 1, this bit is ignored.

**/
#define PAL_BUS_DISABLE_INITIALIZATION_EVENT_SIGNALLING   BIT60


/**

  When 0, bus protocol errors (BINIT#) are detected and sampled
  and an MCA is generated internally to the processor. When 1,
  the processor will ignore bus protocol error conditions
  (BINIT#).

**/
#define PAL_BUS_DISABLE_INITIALIZATION_EVENT_CHECK   BIT59



/**

  When 0, BERR# is signalled if a bus error is detected. When 1,
  bus errors are not signalled on the bus.

**/
#define PAL_BUS_DISABLE_ERROR_SIGNALLING   BIT58




/**

  When 0, BERR# is signalled when internal processor requestor
  initiated bus errors are detected. When 1, internal requester
  bus errors are not signalled on the bus.

**/
#define PAL_BUS_DISABLE__INTERNAL_ERROR_SIGNALLING   BIT57


/**

  When 0, the processor takes an MCA if BERR# is asserted. When
  1, the processor ignores the BERR# signal.

**/
#define PAL_BUS_DISABLE_ERROR_CHECK   BIT56


/**

  When 0, the processor asserts BINIT# if it detects a parity
  error on the signals which identify the transactions to which
  this is a response. When 1, the processor ignores parity on
  these signals.

**/
#define PAL_BUS_DISABLE_RSP_ERROR_CHECK   BIT55


/**

  When 0, the in-order transaction queue is limited only by the
  number of hardware entries. When 1, the processor's in-order
  transactions queue is limited to one entry.

**/
#define PAL_BUS_DISABLE_TRANSACTION_QUEUE   BIT54

/**

  Enable a bus cache line replacement transaction when a cache
  line in the exclusive state is replaced from the highest level
  processor cache and is not present in the lower level processor
  caches. When 0, no bus cache line replacement transaction will
  be seen on the bus. When 1, bus cache line replacement
  transactions will be seen on the bus when the above condition is
  detected.

**/
#define PAL_BUS_ENABLE_EXCLUSIVE_CACHE_LINE_REPLACEMENT   BIT53


/**

  Enable a bus cache line replacement transaction when a cache
  line in the shared or exclusive state is replaced from the
  highest level processor cache and is not present in the lower
  level processor caches.
  When 0, no bus cache line replacement transaction will be seen
  on the bus. When 1, bus cache line replacement transactions
  will be seen on the bus when the above condition is detected.

**/
#define PAL_BUS_ENABLE_SHARED_CACHE_LINE_REPLACEMENT   BIT52



/**

  When 0, the data bus is configured at the 2x data transfer
  rate.When 1, the data bus is configured at the 1x data
  transfer rate, 30 Opt. Req. Disable Bus Lock Mask. When 0, the
  processor executes locked transactions atomically. When 1, the
  processor masks the bus lock signal and executes locked
  transactions as a non-atomic series of transactions.

**/
#define PAL_BUS_ENABLE_HALF_TRANSFER   BIT30

/**

  When 0, the processor will deassert bus request when finished
  with each transaction. When 1, the processor will continue to
  assert bus request after it has finished, if it was the last
  agent to own the bus and if there are no other pending
  requests.

**/
#define PAL_BUS_REQUEST_BUS_PARKING   BIT29


/**
  PAL Procedure - PAL_BUS_GET_FEATURES.

  Return configurable processor bus interface features and their
  current settings. It is required by Itanium processors. The PAL procedure
  supports the Stacked Register calling convention. It could be
  called at physical mode.

  @param Index  Index of PAL_BUS_GET_FEATURES within the list
                of PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    64-bit vector of features implemented.
                (1=implemented, 0=not implemented)
  @return R10   64-bit vector of current feature settings.
  @return R11   64-bit vector of features controllable by
                software. (1=controllable, 0= not controllable)

**/
#define PAL_BUS_GET_FEATURES 9

/**
  PAL Procedure - PAL_BUS_SET_FEATURES.

  Enable or disable configurable features in processor bus
  interface. It is required by Itanium processors. The PAL procedure
  supports the Static Registers calling convention. It could be
  called at physical mode.

  @param Index          Index of PAL_BUS_SET_FEATURES within the list
                        of PAL procedures.
  @param FeatureSelect  64-bit vector denoting desired state of
                        each feature (1=select, 0=non-select).

  @retval 0             Call completed without error
  @retval -2            Invalid argument
  @retval -3            Call completed with error.

**/
#define PAL_BUS_SET_FEATURES 10


/**
  PAL Procedure - PAL_DEBUG_INFO.

  Return the number of instruction and data breakpoint
  registers. It is required by Itanium processors. The
  PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode and virtual
  mode.

  @param Index  Index of PAL_DEBUG_INFO within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Unsigned 64-bit integer denoting the number of
                pairs of instruction debug registers implemented
                by the processor.
  @return R10   Unsigned 64-bit integer denoting the number of
                pairs of data debug registers implemented by the
                processor.

**/
#define PAL_DEBUG_INFO  11

/**
  PAL Procedure - PAL_FIXED_ADDR.

  Return the fixed component of a processor's directed address.
  It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and virtual mode.

  @param Index  Index of PAL_FIXED_ADDR within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Fixed geographical address of this processor.

**/
#define PAL_FIXED_ADDR 12

/**
  PAL Procedure - PAL_FREQ_BASE.

  Return the frequency of the output clock for use by the
  platform, if generated by the processor. It is optinal. The
  PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode and virtual
  mode.

  @param Index  Index of PAL_FREQ_BASE within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -1    Unimplemented procedure
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Base frequency of the platform if generated by the
                processor chip.

**/
#define PAL_FREQ_BASE 13


/**
  PAL Procedure - PAL_FREQ_RATIOS.

  Return ratio of processor, bus, and interval time counter to
  processor input clock or output clock for platform use, if
  generated by the processor. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and virtual mode.

  @param Index  Index of PAL_FREQ_RATIOS within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Ratio of the processor frequency to the input
                clock of the processor, if the platform clock is
                generated externally or to the output clock to the
                platform, if the platform clock is generated by
                the processor.
  @return R10   Ratio of the bus frequency to the input clock of
                the processor, if the platform clock is generated
                externally or to the output clock to the platform,
                if the platform clock is generated by the
                processor.
  @return R11   Ratio of the interval timer counter rate to input
                clock of the processor, if the platform clock is
                generated externally or to the output clock to the
                platform, if the platform clock is generated by
                the processor.

**/
#define PAL_FREQ_RATIOS 14

typedef struct {
  UINT64  NumberOfLogicalProcessors:16;     ///< Total number of logical
                                            ///< processors on this physical
                                            ///< processor package that are
                                            ///< enabled.
  UINT64  ThreadsPerCore:8;                 ///< Number of threads per core.
  UINT64  Reserved1:8;
  UINT64  CoresPerProcessor:8;              ///< Total number of cores on this
                                            ///< physical processor package.
  UINT64  Reserved2:8;
  UINT64  PhysicalProcessorPackageId:8;     ///< Physical processor package
                                            ///< identifier which was
                                            ///< assigned at reset by the
                                            ///< platform or bus
                                            ///< controller. This value may
                                            ///< or may not be unique
                                            ///< across the entire platform
                                            ///< since it depends on the
                                            ///< platform vendor's policy.
  UINT64  Reserved3:8;
} PAL_LOGICAL_PROCESSPR_OVERVIEW;

typedef struct {
   UINT64 ThreadId:16;      ///< The thread identifier of the logical
                            ///< processor for which information is being
                            ///< returned. This value will be unique on a per
                            ///< core basis.
   UINT64 Reserved1:16;
   UINT64 CoreId:16;        ///< The core identifier of the logical processor
                            ///< for which information is being returned.
                            ///< This value will be unique on a per physical
                            ///< processor package basis.
   UINT64 Reserved2:16;
} PAL_LOGICAL_PROCESSORN_INFO1;

typedef struct {
   UINT64 LogicalAddress:16;    ///< Geographical address of the logical
                                ///< processor for which information is being
                                ///< returned. This is the same value that is
                                ///< returned by the PAL_FIXED_ADDR procedure
                                ///< when it is called on the logical processor.
   UINT64 Reserved:48;
} PAL_LOGICAL_PROCESSORN_INFO2;

/**
  PAL Procedure - PAL_LOGICAL_TO_PHYSICAL.

  Return information on which logical processors map to a
  physical processor die. It is optinal. The PAL procedure
  supports the Static Registers calling convention. It could be
  called at physical mode and virtual mode.

  @param Index            Index of PAL_LOGICAL_TO_PHYSICAL within the list of PAL
                          procedures.
  @param ProcessorNumber  Signed 64-bit integer that specifies
                          for which logical processor
                          information is being requested. When
                          this input argument is -1, information
                          is returned about the logical
                          processor on which the procedure call
                          is made. This input argument must be
                          in the range of 1 up to one less than
                          the number of logical processors
                          returned by num_log in the
                          log_overview return value.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.

  @return R9              The format of PAL_LOGICAL_PROCESSPR_OVERVIEW.
  @return R10             The format of PAL_LOGICAL_PROCESSORN_INFO1.
  @return R11             The format of PAL_LOGICAL_PROCESSORN_INFO2.

**/
#define PAL_LOGICAL_TO_PHYSICAL 42

typedef struct {
  UINT64  NumberOfPmcPairs:8;               ///< Unsigned 8-bit number defining the
                                            ///< number of generic PMC/PMD pairs.
  UINT64  WidthOfCounter:8;                 ///< Unsigned 8-bit number in the range
                                            ///< 0:60 defining the number of
                                            ///< implemented counter bits.
  UINT64  TypeOfCycleCounting:8;            ///< Unsigned 8-bit number defining the
                                            ///< event type for counting processor cycles.
  UINT64  TypeOfRetiredInstructionBundle:8; ///< Retired Unsigned 8-bit
                                            ///< number defining the
                                            ///< event type for retired
                                            ///< instruction bundles.
  UINT64  Reserved:32;
} PAL_PERFORMANCE_INFO;

/**
  PAL Procedure - PAL_PERF_MON_INFO.

  Return the number and type of performance monitors. It is
  required by Itanium processors. The PAL procedure supports the Static
  Registers calling convention. It could be called at physical
  mode and virtual mode.

  @param Index              Index of PAL_PERF_MON_INFO within the list of
                            PAL procedures.
  @param PerformanceBuffer  An address to an 8-byte aligned
                            128-byte memory buffer.

  @retval 0                 Call completed without error
  @retval -2                Invalid argument
  @retval -3                Call completed with error.

  @return R9                Information about the performance monitors
                            implemented. See PAL_PERFORMANCE_INFO;

**/
#define PAL_PERF_MON_INFO 15

#define PAL_PLATFORM_ADDR_INTERRUPT_BLOCK_TOKEN                       0x0
#define PAL_PLATFORM_ADDR_IO_BLOCK_TOKEN                              0x1

/**
  PAL Procedure - PAL_PLATFORM_ADDR.

  Specify processor interrupt block address and I/O port space
  address. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode and virtual mode.

  @param Index    Index of PAL_PLATFORM_ADDR within the list of
                  PAL procedures.
  @param Type     Unsigned 64-bit integer specifying the type of
                  block. 0 indicates that the processor interrupt
                  block pointer should be initialized. 1 indicates
                  that the processor I/O block pointer should be
                  initialized.
  @param Address  Unsigned 64-bit integer specifying the address
                  to which the processor I/O block or interrupt
                  block shall be set. The address must specify
                  an implemented physical address on the
                  processor model, bit 63 is ignored.

  @retval 0       Call completed without error
  @retval -1      Unimplemented procedure.
  @retval -2      Invalid argument
  @retval -3      Call completed with error.

**/
#define PAL_PLATFORM_ADDR 16

typedef struct {
  UINT64  Reserved1:36;
  UINT64  FaultInUndefinedIns:1;                ///< Bit36, No Unimplemented
                                                ///< instruction address reported as
                                                ///< fault. Denotes how the processor
                                                ///< reports the detection of
                                                ///< unimplemented instruction
                                                ///< addresses. When 1, the processor
                                                ///< reports an Unimplemented
                                                ///< Instruction Address fault on the
                                                ///< unimplemented address; when 0, it
                                                ///< reports an Unimplemented
                                                ///< Instruction Address trap on the
                                                ///< previous instruction in program
                                                ///< order. This feature may only be
                                                ///< interrogated by
                                                ///< PAL_PROC_GET_FEATURES. It may not
                                                ///< be enabled or disabled by
                                                ///< PAL_PROC_SET_FEATURES. The
                                                ///< corresponding argument is ignored.

  UINT64  NoPresentPmi:1;                       ///< Bit37, No INIT, PMI, and LINT pins
                                                ///< present. Denotes the absence of INIT,
                                                ///< PMI, LINT0 and LINT1 pins on the
                                                ///< processor. When 1, the pins are absent.
                                                ///< When 0, the pins are present. This
                                                ///< feature may only be interrogated by
                                                ///< PAL_PROC_GET_FEATURES. It may not be
                                                ///< enabled or disabled by
                                                ///< PAL_PROC_SET_FEATURES. The corresponding
                                                ///< argument is ignored.

  UINT64  NoSimpleImpInUndefinedIns:1;          ///< Bit38, No Simple
                                                ///< implementation of
                                                ///< unimplemented instruction
                                                ///< addresses. Denotes how an
                                                ///< unimplemented instruction
                                                ///< address is recorded in IIP
                                                ///< on an Unimplemented
                                                ///< Instruction Address trap or
                                                ///< fault. When 1, the full
                                                ///< unimplemented address is
                                                ///< recorded in IIP; when 0, the
                                                ///< address is sign extended
                                                ///< (virtual addresses) or zero
                                                ///< extended (physical
                                                ///< addresses). This feature may
                                                ///< only be interrogated by
                                                ///< PAL_PROC_GET_FEATURES. It
                                                ///< may not be enabled or
                                                ///< disabled by
                                                ///< PAL_PROC_SET_FEATURES. The
                                                ///< corresponding argument is
                                                ///< ignored.

  UINT64  NoVariablePState:1;                   ///< Bit39, No Variable P-state
                                                ///< performance: A value of 1, indicates
                                                ///< that a processor implements
                                                ///< techniques to optimize performance
                                                ///< for the given P-state power budget
                                                ///< by dynamically varying the
                                                ///< frequency, such that maximum
                                                ///< performance is achieved for the
                                                ///< power budget. A value of 0,
                                                ///< indicates that P-states have no
                                                ///< frequency variation or very small
                                                ///< frequency variations for their given
                                                ///< power budget. This feature may only
                                                ///< be interrogated by
                                                ///< PAL_PROC_GET_FEATURES. it may not be
                                                ///< enabled or disabled by
                                                ///< PAL_PROC_SET_FEATURES. The
                                                ///< corresponding argument is ignored.

  UINT64  NoVM:1;                               ///< Bit40, No Virtual Machine features implemented.
                                                ///< Denotes whether PSR.vm is implemented. This
                                                ///< feature may only be interrogated by
                                                ///< PAL_PROC_GET_FEATURES. It may not be enabled or
                                                ///< disabled by PAL_PROC_SET_FEATURES. The
                                                ///< corresponding argument is ignored.

  UINT64  NoXipXpsrXfs:1;                       ///< Bit41, No XIP, XPSR, and XFS
                                                ///< implemented. Denotes whether XIP, XPSR,
                                                ///< and XFS are implemented for machine
                                                ///< check recovery. This feature may only be
                                                ///< interrogated by PAL_PROC_GET_FEATURES.
                                                ///< It may not be enabled or disabled by
                                                ///< PAL_PROC_SET_FEATURES. The corresponding
                                                ///< argument is ignored.

  UINT64  NoXr1ThroughXr3:1;                    ///< Bit42, No XR1 through XR3 implemented.
                                                ///<   Denotes whether XR1 XR3 are
                                                ///<   implemented for machine check
                                                ///<   recovery. This feature may only be
                                                ///<   interrogated by PAL_PROC_GET_FEATURES.
                                                ///<   It may not be enabled or disabled by
                                                ///<   PAL_PROC_SET_FEATURES. The
                                                ///<   corresponding argument is ignored.

  UINT64  DisableDynamicPrediction:1;           ///< Bit43, Disable Dynamic
                                                ///< Predicate Prediction. When
                                                ///< 0, the processor may predict
                                                ///< predicate results and
                                                ///< execute speculatively, but
                                                ///< may not commit results until
                                                ///< the actual predicates are
                                                ///< known. When 1, the processor
                                                ///< shall not execute predicated
                                                ///< instructions until the
                                                ///< actual predicates are known.

  UINT64  DisableSpontaneousDeferral:1;         ///< Bit44, Disable Spontaneous
                                                ///<   Deferral. When 1, the
                                                ///<   processor may optionally
                                                ///<   defer speculative loads
                                                ///<   that do not encounter any
                                                ///<   exception conditions, but
                                                ///<   that trigger other
                                                ///<   implementation-dependent
                                                ///<   conditions (e.g., cache
                                                ///<   miss). When 0, spontaneous
                                                ///<   deferral is disabled.

  UINT64  DisableDynamicDataCachePrefetch:1;    ///< Bit45, Disable Dynamic
                                                ///<   Data Cache Prefetch.
                                                ///<   When 0, the processor
                                                ///<   may prefetch into the
                                                ///<   caches any data which
                                                ///<   has not been accessed
                                                ///<   by instruction
                                                ///<   execution, but which
                                                ///<   is likely to be
                                                ///<   accessed. When 1, no
                                                ///<   data may be fetched
                                                ///<   until it is needed for
                                                ///<   instruction execution
                                                ///<   or is fetched by an
                                                ///<   lfetch instruction.

  UINT64  DisableDynamicInsCachePrefetch:1;     ///< Bit46, Disable
                                                ///< DynamicInstruction Cache
                                                ///< Prefetch. When 0, the
                                                ///< processor may prefetch
                                                ///< into the caches any
                                                ///< instruction which has
                                                ///< not been executed, but
                                                ///< whose execution is
                                                ///< likely. When 1,
                                                ///< instructions may not be
                                                ///< fetched until needed or
                                                ///< hinted for execution.
                                                ///< (Prefetch for a hinted
                                                ///< branch is allowed even
                                                ///< when dynamic instruction
                                                ///< cache prefetch is
                                                ///< disabled.)

  UINT64  DisableBranchPrediction:1;            ///< Bit47, Disable Dynamic branch
                                                ///<   prediction. When 0, the
                                                ///<   processor may predict branch
                                                ///<   targets and speculatively
                                                ///<   execute, but may not commit
                                                ///<   results. When 1, the processor
                                                ///<   must wait until branch targets
                                                ///<   are known to execute.
  UINT64  Reserved2:4;
  UINT64  DisablePState:1;                      ///< Bit52, Disable P-states. When 1, the PAL
                                                ///< P-state procedures (PAL_PSTATE_INFO,
                                                ///< PAL_SET_PSTATE, PAL_GET_PSTATE) will
                                                ///< return with a status of -1
                                                ///< (Unimplemented procedure).

  UINT64  EnableMcaOnDataPoisoning:1;           ///< Bit53, Enable MCA signaling
                                                ///< on data-poisoning event
                                                ///< detection. When 0, a CMCI
                                                ///< will be signaled on error
                                                ///< detection. When 1, an MCA
                                                ///< will be signaled on error
                                                ///< detection. If this feature
                                                ///< is not supported, then the
                                                ///< corresponding argument is
                                                ///< ignored when calling
                                                ///< PAL_PROC_SET_FEATURES. Note
                                                ///< that the functionality of
                                                ///< this bit is independent of
                                                ///< the setting in bit 60
                                                ///< (Enable CMCI promotion), and
                                                ///< that the bit 60 setting does
                                                ///< not affect CMCI signaling
                                                ///< for data-poisoning related
                                                ///< events. Volume 2: Processor
                                                ///< Abstraction Layer 2:431
                                                ///< PAL_PROC_GET_FEATURES

  UINT64  EnableVmsw:1;                         ///< Bit54, Enable the use of the vmsw
                                                ///<   instruction. When 0, the vmsw instruction
                                                ///<   causes a Virtualization fault when
                                                ///<   executed at the most privileged level.
                                                ///<   When 1, this bit will enable normal
                                                ///<   operation of the vmsw instruction.

  UINT64  EnableEnvNotification:1;              ///< Bit55, Enable external
                                                ///< notification when the processor
                                                ///< detects hardware errors caused
                                                ///< by environmental factors that
                                                ///< could cause loss of
                                                ///< deterministic behavior of the
                                                ///< processor. When 1, this bit will
                                                ///< enable external notification,
                                                ///< when 0 external notification is
                                                ///< not provided. The type of
                                                ///< external notification of these
                                                ///< errors is processor-dependent. A
                                                ///< loss of processor deterministic
                                                ///< behavior is considered to have
                                                ///< occurred if these
                                                ///< environmentally induced errors
                                                ///< cause the processor to deviate
                                                ///< from its normal execution and
                                                ///< eventually causes different
                                                ///< behavior which can be observed
                                                ///<  at the processor bus pins.
                                                ///< Processor errors that do not
                                                ///< have this effects (i.e.,
                                                ///< software induced machine checks)
                                                ///< may or may not be promoted
                                                ///< depending on the processor
                                                ///< implementation.

  UINT64  DisableBinitWithTimeout:1;            ///< Bit56, Disable a BINIT on
                                                ///<   internal processor time-out.
                                                ///<   When 0, the processor may
                                                ///<   generate a BINIT on an
                                                ///<   internal processor time-out.
                                                ///<   When 1, the processor will not
                                                ///<   generate a BINIT on an
                                                ///<   internal processor time-out.
                                                ///<   The event is silently ignored.

  UINT64  DisableDPM:1;                         ///< Bit57, Disable Dynamic Power Management
                                                ///<   (DPM). When 0, the hardware may reduce
                                                ///<   power consumption by removing the clock
                                                ///<   input from idle functional units. When 1,
                                                ///<   all functional units will receive clock
                                                ///<   input, even when idle.

  UINT64  DisableCoherency:1;                   ///< Bit58, Disable Coherency. When 0,
                                                ///< the processor uses normal coherency
                                                ///< requests and responses. When 1, the
                                                ///< processor answers all requests as if
                                                ///< the line were not present.

  UINT64  DisableCache:1;                       ///< Bit59, Disable Cache. When 0, the
                                                ///< processor performs cast outs on
                                                ///< cacheable pages and issues and responds
                                                ///< to coherency requests normally. When 1,
                                                ///< the processor performs a memory access
                                                ///< for each reference regardless of cache
                                                ///< contents and issues no coherence
                                                ///< requests and responds as if the line
                                                ///< were not present. Cache contents cannot
                                                ///< be relied upon when the cache is
                                                ///< disabled. WARNING: Semaphore
                                                ///< instructions may not be atomic or may
                                                ///< cause Unsupported Data Reference faults
                                                ///< if caches are disabled.

  UINT64  EnableCmciPromotion:1;                ///< Bit60, Enable CMCI promotion When
                                                ///<   1, Corrected Machine Check
                                                ///<   Interrupts (CMCI) are promoted to
                                                ///<   MCAs. They are also further
                                                ///<   promoted to BERR if bit 39, Enable
                                                ///<   MCA promotion, is also set and
                                                ///<   they are promoted to BINIT if bit
                                                ///<   38, Enable MCA to BINIT promotion,
                                                ///<   is also set. This bit has no
                                                ///<   effect if MCA signalling is
                                                ///<   disabled (see
                                                ///<   PAL_BUS_GET/SET_FEATURES)

  UINT64  EnableMcaToBinitPromotion:1;          ///< Bit61, Enable MCA to BINIT
                                                ///< promotion. When 1, machine
                                                ///< check aborts (MCAs) are
                                                ///< promoted to the Bus
                                                ///< Initialization signal, and
                                                ///< the BINIT pin is assert on
                                                ///< each occurrence of an MCA.
                                                ///< Setting this bit has no
                                                ///< effect if BINIT signalling
                                                ///< is disabled. (See
                                                ///< PAL_BUS_GET/SET_FEATURES)

  UINT64  EnableMcaPromotion:1;                 ///< Bit62, Enable MCA promotion. When
                                                ///<   1, machine check aborts (MCAs) are
                                                ///<   promoted to the Bus Error signal,
                                                ///<   and the BERR pin is assert on each
                                                ///<   occurrence of an MCA. Setting this
                                                ///<   bit has no effect if BERR
                                                ///<   signalling is disabled. (See
                                                ///<   PAL_BUS_GET/SET_FEATURES)

  UINT64  EnableBerrPromotion:1;                ///< Bit63. Enable BERR promotion. When
                                                ///<   1, the Bus Error (BERR) signal is
                                                ///<   promoted to the Bus Initialization
                                                ///<   (BINIT) signal, and the BINIT pin
                                                ///<   is asserted on the occurrence of
                                                ///<   each Bus Error. Setting this bit
                                                ///<   has no effect if BINIT signalling
                                                ///<   is disabled. (See
                                                ///<   PAL_BUS_GET/SET_FEATURES)
} PAL_PROCESSOR_FEATURES;

/**
  PAL Procedure - PAL_PROC_GET_FEATURES.

  Return configurable processor features and their current
  setting. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode and virtual mode.

  @param Index      Index of PAL_PROC_GET_FEATURES within the list of
                    PAL procedures.
  @param Reserved   Reserved parameter.
  @param FeatureSet Feature set information is being requested
                    for.

  @retval 1         Call completed without error; The
                    feature_set passed is not supported but a
                    feature_set of a larger value is supported.
  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.
  @retval -8        feature_set passed is beyond the maximum
                    feature_set supported

  @return R9        64-bit vector of features implemented. See
                    PAL_PROCESSOR_FEATURES.
  @return R10       64-bit vector of current feature settings. See
                    PAL_PROCESSOR_FEATURES.
  @return R11       64-bit vector of features controllable by
                    software.

**/
#define PAL_PROC_GET_FEATURES 17


/**
  PAL Procedure - PAL_PROC_SET_FEATURES.

  Enable or disable configurable processor features. It is
  required by Itanium processors. The PAL procedure supports the Static
  Registers calling convention. It could be called at physical
  mode.

  @param Index          Index of PAL_PROC_SET_FEATURES within the list of
                        PAL procedures.
  @param FeatureSelect  64-bit vector denoting desired state of
                        each feature (1=select, 0=non-select).
  @param FeatureSet     Feature set to apply changes to. See
                        PAL_PROC_GET_FEATURES for more information
                        on feature sets.

  @retval 1             Call completed without error; The
                        feature_set passed is not supported but a
                        feature_set of a larger value is supported
  @retval 0             Call completed without error
  @retval -2            Invalid argument
  @retval -3            Call completed with error.
  @retval -8            feature_set passed is beyond the maximum
                        feature_set supported

**/
#define PAL_PROC_SET_FEATURES 18


//
// Value of PAL_REGISTER_INFO.InfoRequest.
//
#define PAL_APPLICATION_REGISTER_IMPLEMENTED  0
#define PAL_APPLICATION_REGISTER_READABLE     1
#define PAL_CONTROL_REGISTER_IMPLEMENTED      2
#define PAL_CONTROL_REGISTER_READABLE         3


/**
  PAL Procedure - PAL_REGISTER_INFO.

  Return AR and CR register information. It is required by Itanium processors.
  The PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode and virtual
  mode.

  @param Index        Index of PAL_REGISTER_INFO within the list of
                      PAL procedures.
  @param InfoRequest  Unsigned 64-bit integer denoting what
                      register information is requested. See
                      PAL_REGISTER_INFO.InfoRequest above.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

  @return R9          64-bit vector denoting information for registers
                      0-63. Bit 0 is register 0, bit 63 is register 63.
  @return R10         64-bit vector denoting information for registers
                      64-127. Bit 0 is register 64, bit 63 is register
                      127.

**/
#define PAL_REGISTER_INFO 39

/**
  PAL Procedure - PAL_RSE_INFO.

  Return RSE information. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and virtual mode.

  @param Index        Index of PAL_RSE_INFO within the list of
                      PAL procedures.
  @param InfoRequest  Unsigned 64-bit integer denoting what
                      register information is requested. See
                      PAL_REGISTER_INFO.InfoRequest above.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

  @return R9          Number of physical stacked general registers.
  @return R10         RSE hints supported by processor.

**/
#define PAL_RSE_INFO 19

typedef struct {
  UINT64  VersionOfPalB:16;     ///< Is a 16-bit binary coded decimal (BCD)
                                ///< number that provides identification
                                ///< information about the PAL_B firmware.
  UINT64  Reserved1:8;
  UINT64  PalVendor:8;          ///< Is an unsigned 8-bit integer indicating the
                                ///< vendor of the PAL code.
  UINT64  VersionOfPalA:16;     ///< Is a 16-bit binary coded decimal (BCD)
                                ///< number that provides identification
                                ///< information about the PAL_A firmware. In
                                ///< the split PAL_A model, this return value
                                ///< is the version number of the
                                ///< processor-specific PAL_A. The generic
                                ///< PAL_A version is not returned by this
                                ///< procedure in the split PAL_A model.
  UINT64  Reserved2:16;
} PAL_VERSION_INFO;

/**
  PAL Procedure - PAL_VERSION.

  Return version of PAL code. It is required by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode and virtual mode.

  @param Index        Index of PAL_VERSION within the list of
                      PAL procedures.
  @param InfoRequest  Unsigned 64-bit integer denoting what
                      register information is requested. See
                      PAL_REGISTER_INFO.InfoRequest above.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

  @return R9          8-byte formatted value returning the minimum PAL
                      version needed for proper operation of the
                      processor. See PAL_VERSION_INFO above.
  @return R10         8-byte formatted value returning the current PAL
                      version running on the processor. See
                      PAL_VERSION_INFO above.

**/
#define PAL_VERSION 20



//
// Vectors of PAL_MC_CLEAR_LOG.pending
//
#define PAL_MC_PENDING    BIT0
#define PAL_INIT_PENDING  BIT1

/**
  PAL Procedure - PAL_MC_CLEAR_LOG.

  Clear all error information from processor error logging
  registers. It is required by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called at
  physical mode and virtual mode.

  @param Index  Index of PAL_MC_CLEAR_LOG within the list of
                PAL procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    64-bit vector denoting whether an event is
                pending. See PAL_MC_CLEAR_LOG.pending above.

**/
#define PAL_MC_CLEAR_LOG 21

/**
  PAL Procedure - PAL_MC_DRAIN.

  Ensure that all operations that could cause an MCA have
  completed. It is required by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called at
  physical mode and virtual mode.

  @param Index  Index of PAL_MC_DRAIN within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

**/
#define PAL_MC_DRAIN 22


/**
  PAL Procedure - PAL_MC_DYNAMIC_STATE.

  Return Processor Dynamic State for logging by SAL. It is
  optional. The PAL procedure supports the Static Registers
  calling convention. It could be called at physical mode.

  @param Index  Index of PAL_MC_DYNAMIC_STATE within the list of PAL
                procedures.
  @param Offset Offset of the next 8 bytes of Dynamic Processor
                State to return. (multiple of 8).

  @retval 0     Call completed without error
  @retval -1    Unimplemented procedure.
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

  @return R9    Unsigned 64-bit integer denoting bytes of Dynamic
                Processor State returned.
  @return R10   Next 8 bytes of Dynamic Processor State.

**/
#define PAL_MC_DYNAMIC_STATE 24



//
// Values of PAL_MC_ERROR_INFO.InfoIndex.
//
#define PAL_PROCESSOR_ERROR_MAP       0
#define PAL_PROCESSOR_STATE_PARAM     1
#define PAL_STRUCTURE_SPECIFIC_ERROR  2

typedef struct {
 UINT64 CoreId:4;                   ///< Bit3:0,  Processor core ID (default is 0 for
                                    ///< processors with a single core)

 UINT64 ThreadId:4;                 ///< Bit7:4, Logical thread ID (default is 0 for
                                    ///< processors that execute a single thread)

 UINT64 InfoOfInsCache:4;           ///< Bit11:8, Error information is
                                    ///< available for 1st, 2nd, 3rd, and 4th
                                    ///< level instruction caches.

 UINT64 InfoOfDataCache:4;          ///< Bit15:12, Error information is
                                    ///<   available for 1st, 2nd, 3rd, and 4th
                                    ///<   level data/unified caches.

 UINT64 InfoOfInsTlb:4;             ///< Bit19:16 Error information is available
                                    ///< for 1st, 2nd, 3rd, and 4th level
                                    ///< instruction TLB.

 UINT64 InfoOfDataTlb:4;            ///< Bit23:20, Error information is available
                                    ///< for 1st, 2nd, 3rd, and 4th level
                                    ///< data/unified TLB

 UINT64 InfoOfProcessorBus:4;       ///< Bit27:24 Error information is
                                    ///<   available for the 1st, 2nd, 3rd,
                                    ///<   and 4th level processor bus
                                    ///<   hierarchy.
 UINT64 InfoOfRegisterFile:4;       ///< Bit31:28 Error information is
                                    ///<   available on register file
                                    ///<   structures.
 UINT64 InfoOfMicroArch:4;          ///< Bit47:32, Error information is
                                    ///<   available on micro-architectural
                                    ///<   structures.
 UINT64 Reserved:16;
} PAL_MC_ERROR_INFO_LEVEL_INDEX;

//
// Value of PAL_MC_ERROR_INFO.ErrorTypeIndex
//
#define PAL_ERR_INFO_BY_LEVEL_INDEX               0
#define PAL_ERR_INFO_TARGET_ADDRESS               1
#define PAL_ERR_INFO_REQUESTER_IDENTIFIER         2
#define PAL_ERR_INFO_REPONSER_INDENTIFIER         3
#define PAL_ERR_INFO_PRECISE_INSTRUCTION_POINTER  4

typedef struct {
  UINT64  Operation:4;                  ///< Bit3:0, Type of cache operation that caused
                                        ///< the machine check: 0 - unknown or internal
                                        ///< error 1 - load 2 - store 3 - instruction
                                        ///< fetch or instruction prefetch 4 - data
                                        ///< prefetch (both hardware and software) 5 -
                                        ///< snoop (coherency check) 6 - cast out
                                        ///< (explicit or implicit write-back of a cache
                                        ///< line) 7 - move in (cache line fill)

  UINT64  FailedCacheLevel:2;           ///< Bit5:4 Level of cache where the
                                        ///< error occurred. A value of 0
                                        ///< indicates the first level of cache.
  UINT64  Reserved1:2;
  UINT64  FailedInDataPart:1;           ///< Bit8, Failure located in the data part of the cache line.
  UINT64  FailedInTagPart:1;            ///< Bit9, Failure located in the tag part of the cache line.
  UINT64  FailedInDataCache:1;          ///< Bit10, Failure located in the data cache

  UINT64  FailedInInsCache:1;           ///< Bit11, Failure located in the
                                        ///< instruction cache.

  UINT64  Mesi:3;                       ///< Bit14:12,  0 - cache line is invalid. 1 - cache
                                        ///< line is held shared. 2 - cache line is held
                                        ///< exclusive. 3 - cache line is modified. All other
                                        ///< values are reserved.

  UINT64  MesiIsValid:1;                ///< Bit15, The mesi field in the cache_check
                                        ///< parameter is valid.

  UINT64  FailedWay:5;                  ///< Bit20:16, Failure located in the way of
                                        ///< the cache indicated by this value.

  UINT64  WayIndexIsValid:1;            ///< Bit21, The way and index field in the
                                        ///< cache_check parameter is valid.

  UINT64  Reserved2:1;
  UINT64  MultipleBitsError:1;          ///< Bit23, A multiple-bit error was
                                        ///< detected, and data was poisoned for
                                        ///< the corresponding cache line during
                                        ///< castout.
  UINT64  Reserved3:8;
  UINT64  IndexOfCacheLineError:20;     ///< Bit51:32, Index of the cache
                                        ///< line where the error occurred.
  UINT64  Reserved4:2;

  UINT64  InstructionSet:1;             ///< Bit54, Instruction set. If this value
                                        ///<   is set to zero, the instruction that
                                        ///<   generated the machine check was an
                                        ///<   Intel Itanium instruction. If this bit
                                        ///<   is set to one, the instruction that
                                        ///<   generated the machine check was IA-32
                                        ///<   instruction.

  UINT64  InstructionSetIsValid:1;      ///< Bit55, The is field in the
                                        ///< cache_check parameter is valid.

  UINT64  PrivilegeLevel:2;             ///< Bit57:56, Privilege level. The
                                        ///<   privilege level of the instruction
                                        ///<   bundle responsible for generating the
                                        ///<   machine check.

  UINT64  PrivilegeLevelIsValide:1;     ///< Bit58, The pl field of the
                                        ///<   cache_check parameter is
                                        ///<   valid.

  UINT64  McCorrected:1;                ///< Bit59, Machine check corrected: This bit
                                        ///<   is set to one to indicate that the machine
                                        ///<   check has been corrected.

  UINT64  TargetAddressIsValid:1;       ///< Bit60, Target address is valid:
                                        ///< This bit is set to one to
                                        ///< indicate that a valid target
                                        ///< address has been logged.

  UINT64  RequesterIdentifier:1;        ///< Bit61, Requester identifier: This
                                        ///<   bit is set to one to indicate that
                                        ///<   a valid requester identifier has
                                        ///<   been logged.

  UINT64  ResponserIdentifier:1;        ///< Bit62, Responder identifier: This
                                        ///<   bit is set to one to indicate that
                                        ///<   a valid responder identifier has
                                        ///<   been logged.

  UINT64  PreciseInsPointer:1;          ///< Bit63,  Precise instruction pointer.
                                        ///< This bit is set to one to indicate
                                        ///< that a valid precise instruction
                                        ///< pointer has been logged.

} PAL_CACHE_CHECK_INFO;


typedef struct {
  UINT64  FailedSlot:8;                 ///< Bit7:0, Slot number of the translation
                                        ///< register where the failure occurred.
  UINT64  FailedSlotIsValid:1;          ///< Bit8, The tr_slot field in the
                                        ///< TLB_check parameter is valid.
  UINT64  Reserved1 :1;
  UINT64  TlbLevel:2;                   ///< Bit11:10,  The level of the TLB where the
                                        ///< error occurred. A value of 0 indicates the
                                        ///< first level of TLB
  UINT64  Reserved2 :4;

  UINT64  FailedInDataTr:1;             ///< Bit16, Error occurred in the data
                                        ///< translation registers.

  UINT64  FailedInInsTr:1;              ///< Bit17, Error occurred in the instruction
                                        ///< translation registers

  UINT64  FailedInDataTc:1;             ///< Bit18, Error occurred in data
                                        ///< translation cache.

  UINT64  FailedInInsTc:1;              ///< Bit19, Error occurred in the instruction
                                        ///< translation cache.

  UINT64  FailedOperation:4;            ///< Bit23:20, Type of cache operation that
                                        ///<   caused the machine check: 0 - unknown
                                        ///<   1 - TLB access due to load instruction
                                        ///<   2 - TLB access due to store
                                        ///<   instruction 3 - TLB access due to
                                        ///<   instruction fetch or instruction
                                        ///<   prefetch 4 - TLB access due to data
                                        ///<   prefetch (both hardware and software)
                                        ///<   5 - TLB shoot down access 6 - TLB
                                        ///<   probe instruction (probe, tpa) 7 -
                                        ///<   move in (VHPT fill) 8 - purge (insert
                                        ///<   operation that purges entries or a TLB
                                        ///<   purge instruction) All other values
                                        ///<   are reserved.

  UINT64  Reserved3:30;
  UINT64  InstructionSet:1;             ///< Bit54, Instruction set. If this value
                                        ///<   is set to zero, the instruction that
                                        ///<   generated the machine check was an
                                        ///<   Intel Itanium instruction. If this bit
                                        ///<   is set to one, the instruction that
                                        ///<   generated the machine check was IA-32
                                        ///<   instruction.

  UINT64  InstructionSetIsValid:1;      ///< Bit55, The is field in the
                                        ///< TLB_check parameter is valid.

  UINT64  PrivelegeLevel:2;             ///< Bit57:56, Privilege level. The
                                        ///<   privilege level of the instruction
                                        ///<   bundle responsible for generating the
                                        ///<   machine check.

  UINT64  PrivelegeLevelIsValid:1;      ///< Bit58,  The pl field of the
                                        ///< TLB_check parameter is valid.

  UINT64  McCorrected:1;                ///< Bit59, Machine check corrected: This bit
                                        ///<   is set to one to indicate that the machine
                                        ///<   check has been corrected.

  UINT64  TargetAddressIsValid:1;       ///< Bit60, Target address is valid:
                                        ///< This bit is set to one to
                                        ///< indicate that a valid target
                                        ///< address has been logged.

  UINT64  RequesterIdentifier:1;        ///< Bit61 Requester identifier: This
                                        ///<   bit is set to one to indicate that
                                        ///<   a valid requester identifier has
                                        ///<   been logged.

  UINT64  ResponserIdentifier:1;        ///< Bit62, Responder identifier:  This
                                        ///<   bit is set to one to indicate that
                                        ///<   a valid responder identifier has
                                        ///<   been logged.

  UINT64  PreciseInsPointer:1;          ///< Bit63 Precise instruction pointer.
                                        ///<   This bit is set to one to indicate
                                        ///<   that a valid precise instruction
                                        ///<   pointer has been logged.
} PAL_TLB_CHECK_INFO;

/**
  PAL Procedure - PAL_MC_ERROR_INFO.

  Return Processor Machine Check Information and Processor
  Static State for logging by SAL. It is required by Itanium processors. The
  PAL procedure supports the Static Registers calling
  convention. It could be called at physical and virtual mode.

  @param Index            Index of PAL_MC_ERROR_INFO within the list of PAL
                          procedures.
  @param InfoIndex        Unsigned 64-bit integer identifying the
                          error information that is being requested.
                          See PAL_MC_ERROR_INFO.InfoIndex.
  @param LevelIndex       8-byte formatted value identifying the
                          structure to return error information
                          on. See PAL_MC_ERROR_INFO_LEVEL_INDEX.
  @param ErrorTypeIndex   Unsigned 64-bit integer denoting the
                          type of error information that is
                          being requested for the structure
                          identified in LevelIndex.

  @retval 0               Call completed without error
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -6              Argument was valid, but no error
                          information was available

  @return R9              Error information returned. The format of this
                          value is dependant on the input values passed.
  @return R10             If this value is zero, all the error information
                          specified by err_type_index has been returned. If
                          this value is one, more structure-specific error
                          information is available and the caller needs to
                          make this procedure call again with level_index
                          unchanged and err_type_index, incremented.

**/
#define PAL_MC_ERROR_INFO 25

/**
  PAL Procedure - PAL_MC_EXPECTED.

  Set/Reset Expected Machine Check Indicator. It is required by
  Itanium processors. The PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode.

  @param Index      Index of PAL_MC_EXPECTED within the list of PAL
                    procedures.
  @param Expected   Unsigned integer with a value of 0 or 1 to
                    set or reset the hardware resource
                    PALE_CHECK examines for expected machine
                    checks.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.

  @return R9        Unsigned integer denoting whether a machine check
                    was previously expected.

**/
#define PAL_MC_EXPECTED 23

/**
  PAL Procedure - PAL_MC_REGISTER_MEM.

  Register min-state save area with PAL for machine checks and
  inits. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode.

  @param Index    Index of PAL_MC_REGISTER_MEM within the list of PAL
                  procedures.
  @param Address  Physical address of the buffer to be
                  registered with PAL.

  @retval 0       Call completed without error
  @retval -2      Invalid argument
  @retval -3      Call completed with error.

**/
#define PAL_MC_REGISTER_MEM 27

/**
  PAL Procedure - PAL_MC_RESUME.

  Restore minimal architected state and return to interrupted
  process. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode.

  @param Index        Index of PAL_MC_RESUME within the list of PAL
                      procedures.
  @param SetCmci      Unsigned 64 bit integer denoting whether to
                      set the CMC interrupt. A value of 0 indicates
                      not to set the interrupt, a value of 1
                      indicated to set the interrupt, and all other
                      values are reserved.
  @param SavePtr      Physical address of min-state save area used
                      to used to restore processor state.
  @param NewContext   Unsigned 64-bit integer denoting whether
                      the caller is returning to a new context.
                      A value of 0 indicates the caller is
                      returning to the interrupted context, a
                      value of 1 indicates that the caller is
                      returning to a new context.

  @retval -2          Invalid argument
  @retval -3          Call completed with error.

**/
#define PAL_MC_RESUME 26

/**
  PAL Procedure - PAL_HALT.

  Enter the low-power HALT state or an implementation-dependent
  low-power state. It is optinal. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode.

  @param Index        Index of PAL_HALT within the list of PAL
                      procedures.
  @param HaltState    Unsigned 64-bit integer denoting low power
                      state requested.
  @param IoDetailPtr  8-byte aligned physical address pointer to
                      information on the type of I/O
                      (load/store) requested.

  @retval 0           Call completed without error
  @retval -1          Unimplemented procedure
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

  @return R9          Value returned if a load instruction is requested
                      in the io_detail_ptr

**/
#define PAL_HALT 28


/**
  PAL Procedure - PAL_HALT_INFO.

  Return the low power capabilities of the processor. It is
  required by Itanium processors. The PAL procedure supports the
  Stacked Registers calling convention. It could be called at
  physical and virtual mode.

  @param Index        Index of PAL_HALT_INFO within the list of PAL
                      procedures.
  @param PowerBuffer  64-bit pointer to a 64-byte buffer aligned
                      on an 8-byte boundary.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

**/
#define PAL_HALT_INFO 257


/**
  PAL Procedure - PAL_HALT_LIGHT.

  Enter the low power LIGHT HALT state. It is required by
  Itanium processors. The PAL procedure supports the Static Registers calling
  convention. It could be called at physical and virtual mode.

  @param Index  Index of PAL_HALT_LIGHT within the list of PAL
                procedures.

  @retval 0     Call completed without error
  @retval -2    Invalid argument
  @retval -3    Call completed with error.

**/
#define PAL_HALT_LIGHT 29

/**
  PAL Procedure - PAL_CACHE_LINE_INIT.

  Initialize tags and data of a cache line for processor
  testing. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical and virtual mode.

  @param Index      Index of PAL_CACHE_LINE_INIT within the list of PAL
                    procedures.
  @param Address    Unsigned 64-bit integer value denoting the
                    physical address from which the physical page
                    number is to be generated. The address must be
                    an implemented physical address, bit 63 must
                    be zero.
  @param DataValue  64-bit data value which is used to
                    initialize the cache line.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.

**/
#define PAL_CACHE_LINE_INIT 31

/**
  PAL Procedure - PAL_CACHE_READ.

  Read tag and data of a cache line for diagnostic testing. It
  is optional. The PAL procedure supports the
  Satcked Registers calling convention. It could be called at
  physical mode.

  @param Index    Index of PAL_CACHE_READ within the list of PAL
                  procedures.
  @param LineId   8-byte formatted value describing where in the
                  cache to read the data.
  @param Address  64-bit 8-byte aligned physical address from
                  which to read the data. The address must be an
                  implemented physical address on the processor
                  model with bit 63 set to zero.

  @retval 1       The word at address was found in the
                  cache, but the line was invalid.
  @retval 0       Call completed without error
  @retval -2      Invalid argument
  @retval -3      Call completed with error.
  @retval -5      The word at address was not found in the
                  cache.
  @retval -7      The operation requested is not supported
                  for this cache_type and level.

  @return R9      Right-justified value returned from the cache
                  line.
  @return R10     The number of bits returned in data.
  @return R11     The status of the cache line.

**/
#define PAL_CACHE_READ 259


/**
  PAL Procedure - PAL_CACHE_WRITE.

  Write tag and data of a cache for diagnostic testing. It is
  optional. The PAL procedure supports the Satcked Registers
  calling convention. It could be called at physical mode.

  @param Index    Index of PAL_CACHE_WRITE within the list of PAL
                  procedures.
  @param LineId   8-byte formatted value describing where in the
                  cache to write the data.
  @param Address  64-bit 8-byte aligned physical address at
                  which the data should be written. The address
                  must be an implemented physical address on the
                  processor model with bit 63 set to 0.
  @param Data     Unsigned 64-bit integer value to write into
                  the specified part of the cache.

  @retval 0       Call completed without error
  @retval -2      Invalid argument
  @retval -3      Call completed with error.
  @retval -7      The operation requested is not supported
                  for this cache_type and level.

**/
#define PAL_CACHE_WRITE 260

/**
  PAL Procedure - PAL_TEST_INFO.

  Returns alignment and size requirements needed for the memory
  buffer passed to the PAL_TEST_PROC procedure as well as
  information on self-test control words for the processor self
  tests. It is required by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode.

  @param Index      Index of PAL_TEST_INFO within the list of PAL
                    procedures.
  @param TestPhase  Unsigned integer that specifies which phase
                    of the processor self-test information is
                    being requested on. A value of 0 indicates
                    the phase two of the processor self-test and
                    a value of 1 indicates phase one of the
                    processor self-test. All other values are
                    reserved.

  @retval 0         Call completed without error
  @retval -2        Invalid argument
  @retval -3        Call completed with error.

  @return R9        Unsigned 64-bit integer denoting the number of
                    bytes of main memory needed to perform the second
                    phase of processor self-test.
  @return R10       Unsigned 64-bit integer denoting the alignment
                    required for the memory buffer.
  @return R11       48-bit wide bit-field indicating if control of
                    the processor self-tests is supported and which
                    bits of the test_control field are defined for
                    use.

**/
#define PAL_TEST_INFO 37

typedef struct {
  UINT64  BufferSize:56;    ///< Indicates the size in bytes of the memory
                            ///< buffer that is passed to this procedure.
                            ///< BufferSize must be greater than or equal in
                            ///< size to the bytes_needed return value from
                            ///< PAL_TEST_INFO, otherwise this procedure will
                            ///< return with an invalid argument return
                            ///< value.

  UINT64  TestPhase:8;      ///< Defines which phase of the processor
                            ///< self-tests are requested to be run. A value
                            ///< of zero indicates to run phase two of the
                            ///< processor self-tests. Phase two of the
                            ///< processor self-tests are ones that require
                            ///< external memory to execute correctly. A
                            ///< value of one indicates to run phase one of
                            ///< the processor self-tests. Phase one of the
                            ///< processor self-tests are tests run during
                            ///< PALE_RESET and do not depend on external
                            ///< memory to run correctly. When the caller
                            ///< requests to have phase one of the processor
                            ///< self-test run via this procedure call, a
                            ///< memory buffer may be needed to save and
                            ///< restore state as required by the PAL calling
                            ///< conventions. The procedure PAL_TEST_INFO
                            ///< informs the caller about the requirements of
                            ///< the memory buffer.
} PAL_TEST_INFO_INFO;

typedef struct {
  UINT64  TestControl:47;       ///< This is an ordered implementation-specific
                                ///<   control word that allows the user control
                                ///<   over the length and runtime of the
                                ///<   processor self-tests. This control word is
                                ///<   ordered from the longest running tests up
                                ///<   to the shortest running tests with bit 0
                                ///<   controlling the longest running test. PAL
                                ///<   may not implement all 47-bits of the
                                ///<   test_control word. PAL communicates if a
                                ///<   bit provides control by placing a zero in
                                ///<   that bit. If a bit provides no control,
                                ///<   PAL will place a one in it. PAL will have
                                ///<   two sets of test_control bits for the two
                                ///<   phases of the processor self-test. PAL
                                ///<   provides information about implemented
                                ///<   test_control bits at the hand-off from PAL
                                ///<   to SAL for the firmware recovery check.
                                ///<   These test_control bits provide control
                                ///<   for phase one of processor self-test. It
                                ///<   also provides this information via the PAL
                                ///<   procedure call PAL_TEST_INFO for both the
                                ///<   phase one and phase two processor tests
                                ///<   depending on which information the caller
                                ///<   is requesting. PAL interprets these bits
                                ///<   as input parameters on two occasions. The
                                ///<   first time is when SAL passes control back
                                ///<   to PAL after the firmware recovery check.
                                ///<   The second time is when a call to
                                ///<   PAL_TEST_PROC is made. When PAL interprets
                                ///<   these bits it will only interpret
                                ///<   implemented test_control bits and will
                                ///<   ignore the values located in the
                                ///<   unimplemented test_control bits. PAL
                                ///<   interprets the implemented bits such that
                                ///<   if a bit contains a zero, this indicates
                                ///<   to run the test. If a bit contains a one,
                                ///<   this indicates to PAL to skip the test. If
                                ///<   the cs bit indicates that control is not
                                ///<    available, the test_control bits will be
                                ///<   ignored or generate an illegal argument in
                                ///<   procedure calls if the caller sets these
                                ///<   bits.

  UINT64  ControlSupport:1;     ///< This bit defines if an implementation
                                ///<  supports control of the PAL self-tests
                                ///<  via the self-test control word. If
                                ///<  this bit is 0, the implementation does
                                ///<  not support control of the processor
                                ///<  self-tests via the self-test control
                                ///<  word. If this bit is 1, the
                                ///<  implementation does support control of
                                ///<  the processor self-tests via the
                                ///<  self-test control word. If control is
                                ///<  not supported, GR37 will be ignored at
                                ///<  the hand-off between SAL and PAL after
                                ///<  the firmware recovery check and the
                                ///<  PAL procedures related to the
                                ///<  processor self-tests may return
                                ///<  illegal arguments if a user tries to
                                ///<  use the self-test control features.
  UINT64  Reserved:16;
} PAL_SELF_TEST_CONTROL;

typedef struct {
  UINT64  Attributes:8;         ///< Specifies the memory attributes that are
                                ///<  allowed to be used with the memory buffer
                                ///<  passed to this procedure. The attributes
                                ///<  parameter is a vector where each bit
                                ///<  represents one of the virtual memory
                                ///<  attributes defined by the architecture.See
                                ///<  MEMORY_AATRIBUTES. The caller is required
                                ///<  to support the cacheable attribute for the
                                ///<  memory buffer, otherwise an invalid
                                ///<  argument will be returned.
  UINT64  Reserved:8;
  UINT64  TestControl:48;       ///< Is the self-test control word
                                ///<  corresponding to the test_phase passed.
                                ///<  This test_control directs the coverage and
                                ///<  runtime of the processor self-tests
                                ///<  specified by the test_phase input
                                ///<  argument. Information on if this
                                ///<  feature is implemented and the number of
                                ///<  bits supported can be obtained by the
                                ///<  PAL_TEST_INFO procedure call. If this
                                ///<  feature is implemented by the processor,
                                ///<  the caller can selectively skip parts of
                                ///<  the processor self-test by setting
                                ///<  test_control bits to a one. If a bit has a
                                ///<  zero, this test will be run. The values in
                                ///<  the unimplemented bits are ignored. If
                                ///<  PAL_TEST_INFO indicated that the self-test
                                ///<  control word is not implemented, this
                                ///<  procedure will return with an invalid
                                ///<  argument status if the caller sets any of
                                ///<  the test_control bits. See
                                ///<  PAL_SELF_TEST_CONTROL.
} PAL_TEST_CONTROL;

/**
  PAL Procedure - PAL_TEST_PROC.

  Perform late processor self test. It is required by Itanium processors. The
  PAL procedure supports the Static Registers calling
  convention. It could be called at physical mode.

  @param Index        Index of PAL_TEST_PROC within the list of PAL
                      procedures.
  @param TestAddress  64-bit physical address of main memory
                      area to be used by processor self-test.
                      The memory region passed must be
                      cacheable, bit 63 must be zero.
  @param TestInfo     Input argument specifying the size of the
                      memory buffer passed and the phase of the
                      processor self-test that should be run. See
                      PAL_TEST_INFO.
  @param TestParam    Input argument specifying the self-test
                      control word and the allowable memory
                      attributes that can be used with the memory
                      buffer. See PAL_TEST_CONTROL.

  @retval 1           Call completed without error, but hardware
                      failures occurred during self-test.
  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

  @return R9          Formatted 8-byte value denoting the state of the
                      processor after self-test

**/
#define PAL_TEST_PROC 258

typedef struct {
  UINT32  NumberOfInterruptControllers;     ///< Number of interrupt
                                            ///< controllers currently
                                            ///< enabled on the system.

  UINT32  NumberOfProcessors;               ///< Number of processors currently
                                            ///< enabled on the system.
} PAL_PLATFORM_INFO;

/**
  PAL Procedure - PAL_COPY_INFO.

  Return information needed to relocate PAL procedures and PAL
  PMI code to memory. It is required by Itanium processors. The PAL procedure
  supports the Static Registers calling convention. It could be
  called at physical mode.

  @param Index              Index of PAL_COPY_INFO within the list of PAL
                            procedures.
  @param CopyType           Unsigned integer denoting type of procedures
                            for which copy information is requested.
  @param PlatformInfo       8-byte formatted value describing the
                            number of processors and the number of
                            interrupt controllers currently enabled
                            on the system. See PAL_PLATFORM_INFO.
  @param McaProcStateInfo   Unsigned integer denoting the number
                            of bytes that SAL needs for the
                            min-state save area for each
                            processor.

  @retval 0                 Call completed without error
  @retval -2                Invalid argument
  @retval -3                Call completed with error.

  @return R9                Unsigned integer denoting the number of bytes of
                            PAL information that must be copied to main
                            memory.
  @return R10               Unsigned integer denoting the starting alignment
                            of the data to be copied.

**/
#define PAL_COPY_INFO 30

/**
  PAL Procedure - PAL_COPY_PAL.

  Relocate PAL procedures and PAL PMI code to memory. It is
  required by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at physical
  mode.

  @param Index          Index of PAL_COPY_PAL within the list of PAL
                        procedures.
  @param TargetAddress  Physical address of a memory buffer to
                        copy relocatable PAL procedures and PAL
                        PMI code.
  @param AllocSize      Unsigned integer denoting the size of the
                        buffer passed by SAL for the copy operation.
  @param CopyOption     Unsigned integer indicating whether
                        relocatable PAL code and PAL PMI code
                        should be copied from firmware address
                        space to main memory.

  @retval 0             Call completed without error
  @retval -2            Invalid argument
  @retval -3            Call completed with error.

  @return R9            Unsigned integer denoting the offset of PAL_PROC
                        in the relocatable segment copied.

**/
#define PAL_COPY_PAL 256

/**
  PAL Procedure - PAL_ENTER_IA_32_ENV.

  Enter IA-32 System environment. It is optional. The PAL
  procedure supports the Static Registers calling convention.
  It could be called at physical mode.

  Note: Since this is a special call, it does not follow the PAL
  static register calling convention. GR28 contains the index of
  PAL_ENTER_IA_32_ENV within the list of PAL procedures. All other
  input arguments including GR29-GR31 are setup by SAL to values
  as required by the IA-32 operating system defined in Table
  11-67. The registers that are designated as preserved, scratch,
  input arguments and procedure return values by the static
  procedure calling convention are not followed by this call. For
  instance, GR5 and GR6 need not be preserved since these are
  regarded as scratch by the IA-32 operating system. Note: In an
  MP system, this call must be COMPLETED on the first CPU to enter
  the IA-32 System Environment (may or may not be the BSP) prior
  to being called on the remaining processors in the MP system.

  @param Index  GR28 contains the index of the
                PAL_ENTER_IA_32_ENV call within the list of PAL
                procedures.


  @retval  The status is returned in GR4.
                  -1 - Un-implemented procedure 0 JMPE detected
                  at privilege level

                  0 - 1 SAL allocated buffer for IA-32 System
                  Environment operation is too small

                  2 - IA-32 Firmware Checksum Error

                  3 -  SAL allocated buffer for IA-32 System
                  Environment operation is not properly aligned

                  4 - Error in SAL MP Info Table

                  5 - Error in SAL Memory Descriptor Table

                  6 - Error in SAL System Table

                  7 - Inconsistent IA-32 state

                  8 - IA-32 Firmware Internal Error

                  9 - IA-32 Soft Reset (Note: remaining register
                  state is undefined for this termination
                  reason)

                  10 - Machine Check Error

                  11 - Error in SAL I/O Intercept Table

                  12 - Processor exit due to other processor in
                  MP system terminating the IA32 system
                  environment. (Note: remaining register state
                  is undefined for this termination reason.)

                  13 - Itanium architecture-based state
                  corruption by either SAL PMI handler or I/O
                  Intercept callback function.


**/
#define PAL_ENTER_IA_32_ENV 33

/**
  PAL Procedure - PAL_PMI_ENTRYPOINT.

  Register PMI memory entrypoints with processor. It is required
  by Itanium processors. The PAL procedure supports the Stacked Registers
  calling convention. It could be called at physical mode.

  @param Index        Index of PAL_PMI_ENTRYPOINT within the list of
                      PAL procedures.
  @param SalPmiEntry  256-byte aligned physical address of SAL
                      PMI entrypoint in memory.

  @retval 0           Call completed without error
  @retval -2          Invalid argument
  @retval -3          Call completed with error.

**/
#define PAL_PMI_ENTRYPOINT 32


/**

  The ASCII brand identification string will be copied to the
  address specified in the address input argument. The processor
  brand identification string is defined to be a maximum of 128
  characters long; 127 bytes will contain characters and the 128th
  byte is defined to be NULL (0). A processor may return less than
  the 127 ASCII characters as long as the string is null
  terminated. The string length will be placed in the brand_info
  return argument.

**/
#define PAL_BRAND_INFO_ID_REQUEST  0

/**
  PAL Procedure - PAL_BRAND_INFO.

  Provides processor branding information. It is optional by
  Itanium processors. The PAL procedure supports the Stacked Registers calling
  convention. It could be called at physical and Virtual mode.

  @param Index        Index of PAL_BRAND_INFO within the list of PAL
                      procedures.
  @param InfoRequest  Unsigned 64-bit integer specifying the
                      information that is being requested. (See
                      PAL_BRAND_INFO_ID_REQUEST)
  @param Address      Unsigned 64-bit integer specifying the
                      address of the 128-byte block to which the
                      processor brand string shall be written.

  @retval 0           Call completed without error
  @retval -1          Unimplemented procedure
  @retval -2          Invalid argument
  @retval -3          Call completed with error.
  @retval -6          Input argument is not implemented.

  @return R9          Brand information returned. The format of this
                      value is dependent on the input values passed.

**/
#define PAL_BRAND_INFO  274

/**
  PAL Procedure - PAL_GET_HW_POLICY.

  Returns the current hardware resource sharing policy of the
  processor. It is optional by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called at
  physical and Virtual mode.


  @param Index            Index of PAL_GET_HW_POLICY within the list of PAL
                          procedures.
  @param ProcessorNumber  Unsigned 64-bit integer that specifies
                          for which logical processor
                          information is being requested. This
                          input argument must be zero for the
                          first call to this procedure and can
                          be a maximum value of one less than
                          the number of logical processors
                          impacted by the hardware resource
                          sharing policy, which is returned by
                          the R10 return value.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -9              Call requires PAL memory buffer.

  @return R9              Unsigned 64-bit integer representing the current
                          hardware resource sharing policy.
  @return R10             Unsigned 64-bit integer that returns the number
                          of logical processors impacted by the policy
                          input argument.
  @return R11             Unsigned 64-bit integer containing the logical
                          address of one of the logical processors
                          impacted by policy modification.

**/
#define PAL_GET_HW_POLICY   48


//
// Value of PAL_SET_HW_POLICY.Policy
//
#define PAL_SET_HW_POLICY_PERFORMANCE               0
#define PAL_SET_HW_POLICY_FAIRNESS                  1
#define PAL_SET_HW_POLICY_HIGH_PRIORITY             2
#define PAL_SET_HW_POLICY_EXCLUSIVE_HIGH_PRIORITY   3

/**
  PAL Procedure - PAL_SET_HW_POLICY.

  Sets the current hardware resource sharing policy of the
  processor. It is optional by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called at
  physical and Virtual mode.

  @param Index    Index of PAL_SET_HW_POLICY within the list of PAL
                  procedures.
  @param Policy   Unsigned 64-bit integer specifying the hardware
                  resource sharing policy the caller is setting.
                  See Value of PAL_SET_HW_POLICY.Policy above.

  @retval 1       Call completed successfully but could not
                  change the hardware policy since a
                  competing logical processor is set in
                  exclusive high priority.
  @retval 0       Call completed without error
  @retval -1      Unimplemented procedure
  @retval -2      Invalid argument
  @retval -3      Call completed with error.
  @retval -9      Call requires PAL memory buffer.

**/
#define PAL_SET_HW_POLICY   49

typedef struct {
  UINT64  Mode:3;                   ///< Bit2:0, Indicates the mode of operation for this
                                    ///<    procedure: 0 - Query mode 1 - Error inject mode
                                    ///<    (err_inj should also be specified) 2 - Cancel
                                    ///<    outstanding trigger. All other fields in
                                    ///<    PAL_MC_ERROR_TYPE_INFO,
                                    ///<    PAL_MC_ERROR_STRUCTURE_INFO and
                                    ///<    PAL_MC_ERROR_DATA_BUFFER are ignored. All other
                                    ///<    values are reserved.

  UINT64  ErrorInjection:3;         ///< Bit5:3, indicates the mode of error
                                    ///<  injection: 0 - Error inject only (no
                                    ///<  error consumption) 1 - Error inject
                                    ///<  and consume All other values are
                                    ///<  reserved.

  UINT64  ErrorSeverity:2;          ///< Bit7:6, indicates the severity desired
                                    ///<  for error injection/query. Definitions
                                    ///<  of the different error severity types
                                    ///<  0 - Corrected error 1 - Recoverable
                                    ///<  error 2 - Fatal error 3 - Reserved

  UINT64  ErrorStructure:5;         ///< Bit12:8, Indicates the structure
                                    ///<  identification for error
                                    ///<  injection/query: 0 - Any structure
                                    ///<  (cannot be used during query mode).
                                    ///<  When selected, the structure type used
                                    ///<  for error injection is determined by
                                    ///<  PAL. 1 - Cache 2 - TLB 3 - Register
                                    ///<  file 4 - Bus/System interconnect 5-15
                                    ///<  - Reserved 16-31 - Processor
                                    ///<  specific error injection
                                    ///<  capabilities.ErrorDataBuffer is used
                                    ///<  to specify error types. Please refer
                                    ///<  to the processor specific
                                    ///<  documentation for additional details.

  UINT64  StructureHierarchy:3;     ///< Bit15:13, Indicates the structure
                                    ///<  hierarchy for error
                                    ///<  injection/query: 0 - Any level of
                                    ///<  hierarchy (cannot be used during
                                    ///<  query mode). When selected, the
                                    ///<  structure hierarchy used for error
                                    ///<  injection is determined by PAL. 1
                                    ///<  - Error structure hierarchy
                                    ///<  level-1 2 - Error structure
                                    ///<  hierarchy level-2 3 - Error
                                    ///<  structure hierarchy level-3 4 -
                                    ///<  Error structure hierarchy level-4
                                    ///<  All other values are reserved.

  UINT64  Reserved:32;              ///< Reserved 47:16 Reserved

  UINT64  ImplSpec:16;              ///< Bit63:48, Processor specific error injection capabilities.
} PAL_MC_ERROR_TYPE_INFO;

typedef struct {
  UINT64  StructInfoIsValid:1;              ///< Bit0 When 1, indicates that the
                                            ///< structure information fields
                                            ///< (c_t,cl_p,cl_id) are valid and
                                            ///< should be used for error injection.
                                            ///< When 0, the structure information
                                            ///< fields are ignored, and the values
                                            ///< of these fields used for error
                                            ///< injection are
                                            ///< implementation-specific.

  UINT64  CacheType:2;                      ///< Bit2:1  Indicates which cache should be used
                                            ///< for error injection: 0 - Reserved 1 -
                                            ///< Instruction cache 2 - Data or unified cache
                                            ///< 3 - Reserved

  UINT64  PortionOfCacheLine:3;             ///< Bit5:3 Indicates the portion of the
                                            ///<   cache line where the error should
                                            ///<   be injected: 0 - Reserved 1 - Tag
                                            ///<   2 - Data 3 - mesi All other
                                            ///<   values are reserved.

  UINT64  Mechanism:3;                      ///< Bit8:6 Indicates which mechanism is used to
                                            ///< identify the cache line to be used for error
                                            ///< injection: 0 - Reserved 1 - Virtual address
                                            ///< provided in the inj_addr field of the buffer
                                            ///< pointed to by err_data_buffer should be used
                                            ///< to identify the cache line for error
                                            ///< injection. 2 - Physical address provided in
                                            ///< the inj_addr field of the buffer pointed to
                                            ///< by err_data_buffershould be used to identify
                                            ///< the cache line for error injection. 3 - way
                                            ///< and index fields provided in err_data_buffer
                                            ///< should be used to identify the cache line
                                            ///< for error injection. All other values are
                                            ///< reserved.

  UINT64  DataPoisonOfCacheLine:1;          ///< Bit9 When 1, indicates that a
                                            ///< multiple bit, non-correctable
                                            ///< error should be injected in the
                                            ///< cache line specified by cl_id.
                                            ///< If this injected error is not
                                            ///< consumed, it may eventually
                                            ///< cause a data-poisoning event
                                            ///< resulting in a corrected error
                                            ///< signal, when the associated
                                            ///< cache line is cast out (implicit
                                            ///< or explicit write-back of the
                                            ///< cache line). The error severity
                                            ///< specified by err_sev in
                                            ///< err_type_info must be set to 0
                                            ///< (corrected error) when this bit
                                            ///< is set.

  UINT64  Reserved1:22;

  UINT64  TrigerInfoIsValid:1;              ///< Bit32 When 1, indicates that the
                                            ///< trigger information fields (trigger,
                                            ///< trigger_pl) are valid and should be
                                            ///< used for error injection. When 0,
                                            ///< the trigger information fields are
                                            ///< ignored and error injection is
                                            ///< performed immediately.

  UINT64  Triger:4;                         ///< Bit36:33 Indicates the operation type to be
                                            ///<   used as the error trigger condition. The
                                            ///<   address corresponding to the trigger is
                                            ///<   specified in the trigger_addr field of the
                                            ///<   buffer pointed to by err_data_buffer: 0 -
                                            ///<   Instruction memory access. The trigger match
                                            ///<   conditions for this operation type are similar
                                            ///<   to the IBR address breakpoint match conditions
                                            ///<   1 - Data memory access. The trigger match
                                            ///<   conditions for this operation type are similar
                                            ///<   to the DBR address breakpoint match conditions
                                            ///<   All other values are reserved.

  UINT64  PrivilegeOfTriger:3;              ///< Bit39:37  Indicates the privilege
                                            ///< level of the context during which
                                            ///< the error should be injected: 0 -
                                            ///< privilege level 0 1 - privilege
                                            ///< level 1 2 - privilege level 2 3 -
                                            ///< privilege level 3 All other values
                                            ///< are reserved. If the implementation
                                            ///< does not support privilege level
                                            ///< qualifier for triggers (i.e. if
                                            ///< trigger_pl is 0 in the capabilities
                                            ///< vector), this field is ignored and
                                            ///< triggers can be taken at any
                                            ///< privilege level.

  UINT64  Reserved2:24;
} PAL_MC_ERROR_STRUCT_INFO;

/**

   Buffer Pointed to by err_data_buffer - TLB

**/
typedef struct {
  UINT64  TrigerAddress;
  UINT64  VirtualPageNumber:52;
  UINT64  Reserved1:8;
  UINT64  RegionId:24;
  UINT64  Reserved2:40;
} PAL_MC_ERROR_DATA_BUFFER_TLB;

/**
  PAL Procedure - PAL_MC_ERROR_INJECT.

  Injects the requested processor error or returns information
  on the supported injection capabilities for this particular
  processor implementation. It is optional by Itanium processors. The PAL
  procedure supports the Stacked Registers calling convention.
  It could be called at physical and Virtual mode.

  @param Index            Index of PAL_MC_ERROR_INJECT within the list of PAL
                          procedures.
  @param ErrorTypeInfo    Unsigned 64-bit integer specifying the
                          first level error information which
                          identifies the error structure and
                          corresponding structure hierarchy, and
                          the error severity.
  @param ErrorStructInfo  Unsigned 64-bit integer identifying
                          the optional structure specific
                          information that provides the  second
                          level details for the requested error.
  @param ErrorDataBuffer  64-bit physical address of a buffer
                          providing additional parameters for
                          the requested error. The address of
                          this buffer must be 8-byte aligned.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -4              Call completed with error; the requested
                          error could not be injected due to failure in
                          locating the target location in the specified
                          structure.
  @retval -5              Argument was valid, but requested error
                          injection capability is not supported.
  @retval -9              Call requires PAL memory buffer.

  @return R9              64-bit vector specifying the supported error
                          injection capabilities for the input argument
                          combination of struct_hier, err_struct and
                          err_sev fields in ErrorTypeInfo.
  @return R10             64-bit vector specifying the architectural
                          resources that are used by the procedure.

**/
#define PAL_MC_ERROR_INJECT 276


//
// Types of PAL_GET_PSTATE.Type
//
#define PAL_GET_PSTATE_RECENT                 0
#define PAL_GET_PSTATE_AVERAGE_NEW_START      1
#define PAL_GET_PSTATE_AVERAGE                2
#define PAL_GET_PSTATE_NOW                    3

/**
  PAL Procedure - PAL_GET_PSTATE.

  Returns the performance index of the processor. It is optional
  by Itanium processors. The PAL procedure supports the Stacked Registers
  calling convention. It could be called at physical and Virtual
  mode.

  @param Index  Index of PAL_GET_PSTATE within the list of PAL
                procedures.
  @param Type   Type of performance_index value to be returned
                by this procedure.See PAL_GET_PSTATE.Type above.

  @retval 1     Call completed without error, but accuracy
                of performance index has been impacted by a
                thermal throttling event, or a
                hardware-initiated event.
  @retval 0     Call completed without error
  @retval -1    Unimplemented procedure
  @retval -2    Invalid argument
  @retval -3    Call completed with error.
  @retval -9    Call requires PAL memory buffer.

  @return R9    Unsigned integer denoting the processor
                performance for the time duration since the last
                PAL_GET_PSTATE procedure call was made. The
                value returned is between 0 and 100, and is
                relative to the performance index of the highest
                available P-state.

**/
#define PAL_GET_PSTATE      262

/**

  Layout of PAL_PSTATE_INFO.PStateBuffer

**/
typedef struct {
  UINT32  PerformanceIndex:7;
  UINT32  Reserved1:5;
  UINT32  TypicalPowerDissipation:20;
  UINT32  TransitionLatency1;
  UINT32  TransitionLatency2;
  UINT32  Reserved2;
} PAL_PSTATE_INFO_BUFFER;


/**
  PAL Procedure - PAL_PSTATE_INFO.

  Returns information about the P-states supported by the
  processor. It is optional by Itanium processors. The PAL procedure supports
  the Static Registers calling convention. It could be called
  at physical and Virtual mode.

  @param Index          Index of PAL_PSTATE_INFO within the list of PAL
                        procedures.
  @param PStateBuffer   64-bit pointer to a 256-byte buffer
                        aligned on an 8-byte boundary. See
                        PAL_PSTATE_INFO_BUFFER above.

  @retval 0             Call completed without error
  @retval -1            Unimplemented procedure
  @retval -2            Invalid argument
  @retval -3            Call completed with error.

  @return R9            Unsigned integer denoting the number of P-states
                        supported. The maximum value of this field is 16.
  @return R10           Dependency domain information

**/
#define PAL_PSTATE_INFO     44


/**
  PAL Procedure - PAL_SET_PSTATE.

  To request a processor transition to a given P-state. It is
  optional by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at physical
  and Virtual mode.

  @param Index        Index of PAL_SET_PSTATE within the list of PAL
                      procedures.
  @param PState       Unsigned integer denoting the processor
                      P-state being requested.
  @param ForcePState  Unsigned integer denoting whether the
                      P-state change should be forced for the
                      logical processor.

  @retval 1           Call completed without error, but
                      transition request was not accepted
  @retval 0           Call completed without error
  @retval -1          Unimplemented procedure
  @retval -2          Invalid argument
  @retval -3          Call completed with error.
  @retval -9          Call requires PAL memory buffer.

**/
#define PAL_SET_PSTATE      263

/**
  PAL Procedure - PAL_SHUTDOWN.

  Put the logical processor into a low power state which can be
  exited only by a reset event. It is optional by Itanium processors. The PAL
  procedure supports the Static Registers calling convention. It
  could be called at physical mode.

  @param Index            Index of PAL_SHUTDOWN within the list of PAL
                          procedures.
  @param NotifyPlatform   8-byte aligned physical address
                          pointer providing details on how to
                          optionally notify the platform that
                          the processor is entering a shutdown
                          state.

  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -9              Call requires PAL memory buffer.

**/
#define PAL_SHUTDOWN        45

/**

  Layout of PAL_MEMORY_BUFFER.ControlWord

**/
typedef struct {
  UINT64  Registration:1;
  UINT64  ProbeInterrupt:1;
  UINT64  Reserved:62;
} PAL_MEMORY_CONTROL_WORD;

/**
  PAL Procedure - PAL_MEMORY_BUFFER.

  Provides cacheable memory to PAL for exclusive use during
  runtime. It is optional by Itanium processors. The PAL procedure supports the
  Static Registers calling convention. It could be called at
  physical mode.

  @param Index        Index of PAL_MEMORY_BUFFER within the list of PAL
                      procedures.
  @param BaseAddress  Physical address of the memory buffer
                      allocated for PAL use.
  @param AllocSize    Unsigned integer denoting the size of the
                      memory buffer.
  @param ControlWord  Formatted bit vector that provides control
                      options for this procedure. See
                      PAL_MEMORY_CONTROL_WORD above.

  @retval 1           Call has not completed a buffer relocation
                      due to a pending interrupt
  @retval 0           Call completed without error
  @retval -1          Unimplemented procedure
  @retval -2          Invalid argument
  @retval -3          Call completed with error.
  @retval -9          Call requires PAL memory buffer.

  @return R9          Returns the minimum size of the memory buffer
                      required if the alloc_size input argument was
                      not large enough.

**/
#define PAL_MEMORY_BUFFER   277


/**
  PAL Procedure - PAL_VP_CREATE.

  Initializes a new vpd for the operation of a new virtual
  processor in the virtual environment. It is optional by Itanium processors.
  The PAL procedure supports the Stacked Registers calling
  convention. It could be called at Virtual mode.

  @param Index            Index of PAL_VP_CREATE within the list of PAL
                          procedures.
  @param Vpd              64-bit host virtual pointer to the Virtual
                          Processor Descriptor (VPD).
  @param HostIva          64-bit host virtual pointer to the host IVT
                          for the virtual processor
  @param OptionalHandler  64-bit non-zero host-virtual pointer
                          to an optional handler for
                          virtualization intercepts.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -9              Call requires PAL memory buffer.

**/
#define PAL_VP_CREATE       265

/**

  Virtual Environment Information Parameter

**/
typedef struct {
  UINT64    Reserved1:8;
  UINT64    Opcode:1;
  UINT64    Reserved:53;
} PAL_VP_ENV_INFO_RETURN;

/**
  PAL Procedure - PAL_VP_ENV_INFO.

  Returns the parameters needed to enter a virtual environment.
  It is optional by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at Virtual
  mode.

  @param Index            Index of PAL_VP_ENV_INFO within the list of PAL
                          procedures.
  @param Vpd              64-bit host virtual pointer to the Virtual
                          Processor Descriptor (VPD).
  @param HostIva          64-bit host virtual pointer to the host IVT
                          for the virtual processor
  @param OptionalHandler  64-bit non-zero host-virtual pointer
                          to an optional handler for
                          virtualization intercepts.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -9              Call requires PAL memory buffer.

  @return R9              Unsigned integer denoting the number of bytes
                          required by the PAL virtual environment buffer
                          during PAL_VP_INIT_ENV
  @return R10             64-bit vector of virtual environment
                          information. See PAL_VP_ENV_INFO_RETURN.


**/
#define PAL_VP_ENV_INFO       266

/**
  PAL Procedure - PAL_VP_EXIT_ENV.

  Allows a logical processor to exit a virtual environment.
  It is optional by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at Virtual
  mode.

  @param Index  Index of PAL_VP_EXIT_ENV within the list of PAL
                procedures.
  @param Iva    Optional 64-bit host virtual pointer to the IVT
                when this procedure is done

  @retval 0     Call completed without error
  @retval -1    Unimplemented procedure
  @retval -2    Invalid argument
  @retval -3    Call completed with error.
  @retval -9    Call requires PAL memory buffer.

**/
#define PAL_VP_EXIT_ENV       267



/**
  PAL Procedure - PAL_VP_INIT_ENV.

  Allows a logical processor to enter a virtual environment. It
  is optional by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at Virtual
  mode.

  @param Index          Index of PAL_VP_INIT_ENV within the list of PAL
                        procedures.
  @param ConfigOptions  64-bit vector of global configuration
                        settings.
  @param PhysicalBase   Host physical base address of a block of
                        contiguous physical memory for the PAL
                        virtual environment buffer 1) This
                        memory area must be allocated by the VMM
                        and be 4K aligned. The first logical
                        processor to enter the environment will
                        initialize the physical block for
                        virtualization operations.
  @param VirtualBase    Host virtual base address of the
                        corresponding physical memory block for
                        the PAL virtual environment buffer : The
                        VMM must maintain the host virtual to host
                        physical data and instruction translations
                        in TRs for addresses within the allocated
                        address space. Logical processors in this
                        virtual environment will use this address
                        when transitioning to virtual mode
                        operations.

  @retval 0             Call completed without error
  @retval -1            Unimplemented procedure
  @retval -2            Invalid argument
  @retval -3            Call completed with error.
  @retval -9            Call requires PAL memory buffer.

  @return R9            Virtualization Service Address - VSA specifies
                        the virtual base address of the PAL
                        virtualization services in this virtual
                        environment.


**/
#define PAL_VP_INIT_ENV       268


/**
  PAL Procedure - PAL_VP_REGISTER.

  Register a different host IVT and/or a different optional
  virtualization intercept handler for the virtual processor
  specified by vpd. It is optional by Itanium processors. The PAL procedure
  supports the Stacked Registers calling convention. It could be
  called at Virtual mode.

  @param Index            Index of PAL_VP_REGISTER within the list of PAL
                          procedures.
  @param Vpd              64-bit host virtual pointer to the Virtual
                          Processor Descriptor (VPD) host_iva 64-bit host
                          virtual pointer to the host IVT for the virtual
                          processor
  @param OptionalHandler  64-bit non-zero host-virtual pointer
                          to an optional handler for
                          virtualization intercepts.

  @retval 0               Call completed without error
  @retval -1              Unimplemented procedure
  @retval -2              Invalid argument
  @retval -3              Call completed with error.
  @retval -9              Call requires PAL memory buffer.

**/
#define PAL_VP_REGISTER       269


/**
  PAL Procedure - PAL_VP_RESTORE.

  Restores virtual processor state for the specified vpd on the
  logical processor. It is optional by Itanium processors. The PAL procedure
  supports the Stacked Registers calling convention. It could be
  called at Virtual mode.

  @param Index      Index of PAL_VP_RESTORE within the list of PAL
                    procedures.
  @param Vpd        64-bit host virtual pointer to the Virtual
                    Processor Descriptor (VPD) host_iva 64-bit host
                    virtual pointer to the host IVT for the virtual
                    processor
  @param PalVector  Vector specifies PAL procedure
                    implementation-specific state to be
                    restored.

  @retval 0         Call completed without error
  @retval -1        Unimplemented procedure
  @retval -2        Invalid argument
  @retval -3        Call completed with error.
  @retval -9        Call requires PAL memory buffer.

**/
#define PAL_VP_RESTORE       270

/**
  PAL Procedure - PAL_VP_SAVE.

  Saves virtual processor state for the specified vpd on the
  logical processor. It is optional by Itanium processors. The PAL procedure
  supports the Stacked Registers calling convention. It could be
  called at Virtual mode.

  @param Index      Index of PAL_VP_SAVE within the list of PAL
                    procedures.
  @param Vpd        64-bit host virtual pointer to the Virtual
                    Processor Descriptor (VPD) host_iva 64-bit host
                    virtual pointer to the host IVT for the virtual
                    processor
  @param PalVector  Vector specifies PAL procedure
                    implementation-specific state to be
                    restored.

  @retval 0         Call completed without error
  @retval -1        Unimplemented procedure
  @retval -2        Invalid argument
  @retval -3        Call completed with error.
  @retval -9        Call requires PAL memory buffer.

**/
#define PAL_VP_SAVE       271


/**
  PAL Procedure - PAL_VP_TERMINATE.

  Terminates operation for the specified virtual processor. It
  is optional by Itanium processors. The PAL procedure supports the Stacked
  Registers calling convention. It could be called at Virtual
  mode.

  @param Index  Index of PAL_VP_TERMINATE within the list of PAL
                procedures.
  @param Vpd    64-bit host virtual pointer to the Virtual
                Processor Descriptor (VPD)
  @param Iva    Optional 64-bit host virtual pointer to the IVT
                when this procedure is done.

  @retval 0     Call completed without error
  @retval -1    Unimplemented procedure
  @retval -2    Invalid argument
  @retval -3    Call completed with error.
  @retval -9    Call requires PAL memory buffer.

**/
#define PAL_VP_TERMINATE       272

#endif
