Home | History | Annotate | Download | only in IndustryStandard
      1 /** @file
      2   Main PAL API's defined in Intel Itanium Architecture Software Developer's Manual.
      3 
      4   Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __PAL_API_H__
     16 #define __PAL_API_H__
     17 
     18 #define PAL_SUCCESS             0x0
     19 
     20 ///
     21 /// CacheType of PAL_CACHE_FLUSH.
     22 ///
     23 #define PAL_CACHE_FLUSH_INSTRUCTION_ALL   1
     24 #define PAL_CACHE_FLUSH_DATA_ALL          2
     25 #define PAL_CACHE_FLUSH_ALL               3
     26 #define PAL_CACHE_FLUSH_SYNC_TO_DATA      4
     27 
     28 
     29 ///
     30 /// Bitmask of Opearation of PAL_CACHE_FLUSH.
     31 ///
     32 #define PAL_CACHE_FLUSH_INVALIDATE_LINES     BIT0
     33 #define PAL_CACHE_FLUSH_NO_INVALIDATE_LINES  0
     34 #define PAL_CACHE_FLUSH_POLL_INTERRUPT       BIT1
     35 #define PAL_CACHE_FLUSH_NO_INTERRUPT         0
     36 
     37 /**
     38   PAL Procedure - PAL_CACHE_FLUSH.
     39 
     40   Flush the instruction or data caches. It is required by Itanium processors.
     41   The PAL procedure supports the Static Registers calling
     42   convention. It could be called at virtual mode and physical
     43   mode.
     44 
     45   @param Index              Index of PAL_CACHE_FLUSH within the
     46                             list of PAL procedures.
     47   @param CacheType          Unsigned 64-bit integer indicating
     48                             which cache to flush.
     49   @param Operation          Formatted bit vector indicating the
     50                             operation of this call.
     51   @param ProgressIndicator  Unsigned 64-bit integer specifying
     52                             the starting position of the flush
     53                             operation.
     54 
     55   @retval 2                 Call completed without error, but a PMI
     56                             was taken during the execution of this
     57                             procedure.
     58   @retval 1                 Call has not completed flushing due to
     59                             a pending interrupt.
     60   @retval 0                 Call completed without error
     61   @retval -2                Invalid argument
     62   @retval -3                Call completed with error
     63 
     64   @return R9                Unsigned 64-bit integer specifying the vector
     65                             number of the pending interrupt.
     66   @return R10               Unsigned 64-bit integer specifying the
     67                             starting position of the flush operation.
     68   @return R11               Unsigned 64-bit integer specifying the vector
     69                             number of the pending interrupt.
     70 
     71 **/
     72 #define PAL_CACHE_FLUSH   1
     73 
     74 
     75 ///
     76 /// Attributes of PAL_CACHE_CONFIG_INFO1
     77 ///
     78 #define PAL_CACHE_ATTR_WT   0
     79 #define PAL_CACHE_ATTR_WB   1
     80 
     81 ///
     82 /// PAL_CACHE_CONFIG_INFO1.StoreHint
     83 ///
     84 #define PAL_CACHE_STORE_TEMPORAL      0
     85 #define PAL_CACHE_STORE_NONE_TEMPORAL 3
     86 
     87 ///
     88 /// PAL_CACHE_CONFIG_INFO1.StoreHint
     89 ///
     90 #define PAL_CACHE_STORE_TEMPORAL_LVL_1        0
     91 #define PAL_CACHE_STORE_NONE_TEMPORAL_LVL_ALL 3
     92 
     93 ///
     94 /// PAL_CACHE_CONFIG_INFO1.StoreHint
     95 ///
     96 #define PAL_CACHE_LOAD_TEMPORAL_LVL_1         0
     97 #define PAL_CACHE_LOAD_NONE_TEMPORAL_LVL_1    1
     98 #define PAL_CACHE_LOAD_NONE_TEMPORAL_LVL_ALL  3
     99 
    100 ///
    101 /// Detail the characteristics of a given processor controlled
    102 /// cache in the cache hierarchy.
    103 ///
    104 typedef struct {
    105   UINT64  IsUnified   : 1;
    106   UINT64  Attributes  : 2;
    107   UINT64  Associativity:8;
    108   UINT64  LineSize:8;
    109   UINT64  Stride:8;
    110   UINT64  StoreLatency:8;
    111   UINT64  StoreHint:8;
    112   UINT64  LoadHint:8;
    113 } PAL_CACHE_INFO_RETURN1;
    114 
    115 ///
    116 /// Detail the characteristics of a given processor controlled
    117 /// cache in the cache hierarchy.
    118 ///
    119 typedef struct {
    120   UINT64  CacheSize:32;
    121   UINT64  AliasBoundary:8;
    122   UINT64  TagLsBits:8;
    123   UINT64  TagMsBits:8;
    124 } PAL_CACHE_INFO_RETURN2;
    125 
    126 /**
    127   PAL Procedure - PAL_CACHE_INFO.
    128 
    129   Return detailed instruction or data cache information. It is
    130   required by Itanium processors. The PAL procedure supports the Static
    131   Registers calling convention. It could be called at virtual
    132   mode and physical mode.
    133 
    134   @param Index        Index of PAL_CACHE_INFO within the list of
    135                       PAL procedures.
    136   @param CacheLevel   Unsigned 64-bit integer specifying the
    137                       level in the cache hierarchy for which
    138                       information is requested. This value must
    139                       be between 0 and one less than the value
    140                       returned in the cache_levels return value
    141                       from PAL_CACHE_SUMMARY.
    142   @param CacheType    Unsigned 64-bit integer with a value of 1
    143                       for instruction cache and 2 for data or
    144                       unified cache. All other values are
    145                       reserved.
    146   @param Reserved     Should be 0.
    147 
    148   @retval 0           Call completed without error
    149   @retval -2          Invalid argument
    150   @retval -3          Call completed with error
    151 
    152   @return R9          Detail the characteristics of a given
    153                       processor controlled cache in the cache
    154                       hierarchy. See PAL_CACHE_INFO_RETURN1.
    155   @return R10         Detail the characteristics of a given
    156                       processor controlled cache in the cache
    157                       hierarchy. See PAL_CACHE_INFO_RETURN2.
    158   @return R11         Reserved with 0.
    159 
    160 **/
    161 #define PAL_CACHE_INFO    2
    162 
    163 
    164 
    165 ///
    166 /// Level of PAL_CACHE_INIT.
    167 ///
    168 #define PAL_CACHE_INIT_ALL  0xffffffffffffffffULL
    169 
    170 ///
    171 /// CacheType
    172 ///
    173 #define PAL_CACHE_INIT_TYPE_INSTRUCTION                 0x1
    174 #define PAL_CACHE_INIT_TYPE_DATA                        0x2
    175 #define PAL_CACHE_INIT_TYPE_INSTRUCTION_AND_DATA        0x3
    176 
    177 ///
    178 /// Restrict of PAL_CACHE_INIT.
    179 ///
    180 #define PAL_CACHE_INIT_NO_RESTRICT  0
    181 #define PAL_CACHE_INIT_RESTRICTED   1
    182 
    183 /**
    184   PAL Procedure - PAL_CACHE_INIT.
    185 
    186   Initialize the instruction or data caches. It is required by
    187   Itanium processors. The PAL procedure supports the Static Registers calling
    188   convention. It could be called at physical mode.
    189 
    190   @param Index      Index of PAL_CACHE_INIT within the list of PAL
    191                     procedures.
    192   @param Level      Unsigned 64-bit integer containing the level of
    193                     cache to initialize. If the cache level can be
    194                     initialized independently, only that level will
    195                     be initialized. Otherwise
    196                     implementation-dependent side-effects will
    197                     occur.
    198   @param CacheType  Unsigned 64-bit integer with a value of 1 to
    199                     initialize the instruction cache, 2 to
    200                     initialize the data cache, or 3 to
    201                     initialize both. All other values are
    202                     reserved.
    203   @param Restrict   Unsigned 64-bit integer with a value of 0 or
    204                     1. All other values are reserved. If
    205                     restrict is 1 and initializing the specified
    206                     level and cache_type of the cache would
    207                     cause side-effects, PAL_CACHE_INIT will
    208                     return -4 instead of initializing the cache.
    209 
    210   @retval 0         Call completed without error
    211   @retval -2        Invalid argument
    212   @retval -3        Call completed with error.
    213   @retval -4        Call could not initialize the specified
    214                     level and cache_type of the cache without
    215                     side-effects and restrict was 1.
    216 
    217 **/
    218 #define PAL_CACHE_INIT    3
    219 
    220 
    221 ///
    222 /// PAL_CACHE_PROTECTION.Method.
    223 ///
    224 #define PAL_CACHE_PROTECTION_NONE_PROTECT   0
    225 #define PAL_CACHE_PROTECTION_ODD_PROTECT    1
    226 #define PAL_CACHE_PROTECTION_EVEN_PROTECT   2
    227 #define PAL_CACHE_PROTECTION_ECC_PROTECT    3
    228 
    229 
    230 
    231 ///
    232 /// PAL_CACHE_PROTECTION.TagOrData.
    233 ///
    234 #define PAL_CACHE_PROTECTION_PROTECT_DATA   0
    235 #define PAL_CACHE_PROTECTION_PROTECT_TAG    1
    236 #define PAL_CACHE_PROTECTION_PROTECT_TAG_ANDTHEN_DATA   2
    237 #define PAL_CACHE_PROTECTION_PROTECT_DATA_ANDTHEN_TAG   3
    238 
    239 ///
    240 /// 32-bit protection information structures.
    241 ///
    242 typedef struct {
    243   UINT32  DataBits:8;
    244   UINT32  TagProtLsb:6;
    245   UINT32  TagProtMsb:6;
    246   UINT32  ProtBits:6;
    247   UINT32  Method:4;
    248   UINT32  TagOrData:2;
    249 } PAL_CACHE_PROTECTION;
    250 
    251 /**
    252   PAL Procedure - PAL_CACHE_PROT_INFO.
    253 
    254   Return instruction or data cache protection information. It is
    255   required by Itanium processors. The PAL procedure supports the Static
    256   Registers calling convention. It could be called at physical
    257   mode and Virtual mode.
    258 
    259   @param Index      Index of PAL_CACHE_PROT_INFO within the list of
    260                     PAL procedures.
    261   @param CacheLevel Unsigned 64-bit integer specifying the level
    262                     in the cache hierarchy for which information
    263                     is requested. This value must be between 0
    264                     and one less than the value returned in the
    265                     cache_levels return value from
    266                     PAL_CACHE_SUMMARY.
    267   @param CacheType  Unsigned 64-bit integer with a value of 1
    268                     for instruction cache and 2 for data or
    269                     unified cache. All other values are
    270                     reserved.
    271 
    272   @retval 0         Call completed without error
    273   @retval -2        Invalid argument
    274   @retval -3        Call completed with error.
    275 
    276   @return R9        Detail the characteristics of a given
    277                     processor controlled cache in the cache
    278                     hierarchy. See PAL_CACHE_PROTECTION[0..1].
    279   @return R10       Detail the characteristics of a given
    280                     processor controlled cache in the cache
    281                     hierarchy. See PAL_CACHE_PROTECTION[2..3].
    282   @return R11       Detail the characteristics of a given
    283                     processor controlled cache in the cache
    284                     hierarchy. See PAL_CACHE_PROTECTION[4..5].
    285 
    286 **/
    287 #define PAL_CACHE_PROT_INFO     38
    288 
    289 typedef struct {
    290   UINT64  ThreadId : 16;    ///< The thread identifier of the logical
    291                             ///< processor for which information is being
    292                             ///< returned. This value will be unique on a per core basis.
    293   UINT64  Reserved1: 16;
    294   UINT64  CoreId: 16;       ///< The core identifier of the logical processor
    295                             ///< for which information is being returned.
    296                             ///< This value will be unique on a per physical
    297                             ///< processor package basis.
    298   UINT64  Reserved2: 16;
    299 } PAL_PCOC_N_CACHE_INFO1;
    300 
    301 
    302 typedef struct {
    303   UINT64  LogicalAddress : 16;  ///< Logical address: geographical address
    304                                 ///< of the logical processor for which
    305                                 ///< information is being returned. This is
    306                                 ///< the same value that is returned by the
    307                                 ///< PAL_FIXED_ADDR procedure when it is
    308                                 ///< called on the logical processor.
    309   UINT64  Reserved1: 16;
    310   UINT64  Reserved2: 32;
    311 } PAL_PCOC_N_CACHE_INFO2;
    312 
    313 /**
    314   PAL Procedure - PAL_CACHE_SHARED_INFO.
    315 
    316   Returns information on which logical processors share caches.
    317   It is optional. The PAL procedure supports the Static
    318   Registers calling convention. It could be called at physical
    319   mode and Virtual mode.
    320 
    321   @param Index       Index of PAL_CACHE_SHARED_INFO within the list
    322                      of PAL procedures.
    323   @param CacheLevel  Unsigned 64-bit integer specifying the
    324                      level in the cache hierarchy for which
    325                      information is requested. This value must
    326                      be between 0 and one less than the value
    327                      returned in the cache_levels return value
    328                      from PAL_CACHE_SUMMARY.
    329   @param CacheType   Unsigned 64-bit integer with a value of 1
    330                      for instruction cache and 2 for data or
    331                      unified cache. All other values are
    332                      reserved.
    333   @param ProcNumber  Unsigned 64-bit integer that specifies for
    334                      which logical processor information is
    335                      being requested. This input argument must
    336                      be zero for the first call to this
    337                      procedure and can be a maximum value of
    338                      one less than the number of logical
    339                      processors sharing this cache, which is
    340                      returned by the num_shared return value.
    341 
    342   @retval 0          Call completed without error
    343   @retval -1         Unimplemented procedure
    344   @retval -2         Invalid argument
    345   @retval -3         Call completed with error.
    346 
    347   @return R9         Unsigned integer that returns the number of
    348                      logical processors that share the processor
    349                      cache level and type, for which information was
    350                      requested.
    351   @return R10        The format of PAL_PCOC_N_CACHE_INFO1.
    352   @return R11        The format of PAL_PCOC_N_CACHE_INFO2.
    353 
    354 **/
    355 #define PAL_CACHE_SHARED_INFO   43
    356 
    357 
    358 /**
    359   PAL Procedure - PAL_CACHE_SUMMARY.
    360 
    361   Return a summary of the cache hierarchy. It is required by
    362   Itanium processors. The PAL procedure supports the Static Registers calling
    363   convention. It could be called at physical mode and Virtual
    364   mode.
    365 
    366   @param Index  Index of PAL_CACHE_SUMMARY within the list of
    367                 PAL procedures.
    368 
    369   @retval 0     Call completed without error
    370   @retval -2    Invalid argument
    371   @retval -3    Call completed with error.
    372 
    373   @return R9    CacheLevels   Unsigned 64-bit integer denoting the
    374                               number of levels of cache
    375                               implemented by the processor.
    376                               Strictly, this is the number of
    377                               levels for which the cache
    378                               controller is integrated into the
    379                               processor (the cache SRAMs may be
    380                               external to the processor).
    381   @return R10   UniqueCaches  Unsigned 64-bit integer denoting the
    382                               number of unique caches implemented
    383                               by the processor. This has a maximum
    384                               of 2*cache_levels, but may be less
    385                               if any of the levels in the cache
    386                               hierarchy are unified caches or do
    387                               not have both instruction and data
    388                               caches.
    389 
    390 **/
    391 #define PAL_CACHE_SUMMARY   4
    392 
    393 
    394 //
    395 // Virtual Memory Attributes implemented by processor.
    396 //
    397 #define PAL_MEMORY_ATTR_WB      0
    398 #define PAL_MEMORY_ATTR_WC      6
    399 #define PAL_MEMORY_ATTR_UC      4
    400 #define PAL_MEMORY_ATTR_UCE     5
    401 #define PAL_MEMORY_ATTR_NATPAGE 7
    402 
    403 /**
    404   PAL Procedure - PAL_MEM_ATTRIB.
    405 
    406   Return a list of supported memory attributes.. It is required
    407   by Itanium processors. The PAL procedure supports the Static Registers calling
    408   convention. It could be called at physical mode and Virtual
    409   mode.
    410 
    411   @param Index  Index of PAL_MEM_ATTRIB within the list of PAL
    412                 procedures.
    413 
    414   @retval 0     Call completed without error
    415   @retval -2    Invalid argument
    416   @retval -3    Call completed with error.
    417 
    418   @return R9    Attributes  8-bit vector of memory attributes
    419                             implemented by processor. See Virtual
    420                             Memory Attributes above.
    421 
    422 **/
    423 
    424 #define PAL_MEM_ATTRIB      5
    425 
    426 /**
    427   PAL Procedure - PAL_PREFETCH_VISIBILITY.
    428 
    429   Used in architected sequence to transition pages from a
    430   cacheable, speculative attribute to an uncacheable attribute.
    431   It is required by Itanium processors. The PAL procedure supports the Static
    432   Registers calling convention. It could be called at physical
    433   mode and Virtual mode.
    434 
    435   @param Index          Index of PAL_PREFETCH_VISIBILITY within the list
    436                         of PAL procedures.
    437   @param TransitionType Unsigned integer specifying the type
    438                         of memory attribute transition that is
    439                         being performed.
    440 
    441   @retval 1             Call completed without error; this
    442                         call is not necessary on remote
    443                         processors.
    444   @retval 0             Call completed without error
    445   @retval -2            Invalid argument
    446   @retval -3            Call completed with error.
    447 
    448 **/
    449 #define PAL_PREFETCH_VISIBILITY   41
    450 
    451 /**
    452   PAL Procedure - PAL_PTCE_INFO.
    453 
    454   Return information needed for ptc.e instruction to purge
    455   entire TC. It is required by Itanium processors. The PAL procedure supports
    456   the Static Registers calling convention. It could be called at
    457   physical mode and Virtual mode.
    458 
    459   @param Index  Index of PAL_PTCE_INFO within the list
    460                 of PAL procedures.
    461 
    462   @retval 0     Call completed without error
    463   @retval -2    Invalid argument
    464   @retval -3    Call completed with error.
    465 
    466   @return R9    Unsigned 64-bit integer denoting the beginning
    467                 address to be used by the first PTCE instruction
    468                 in the purge loop.
    469   @return R10   Two unsigned 32-bit integers denoting the loop
    470                 counts of the outer (loop 1) and inner (loop 2)
    471                 purge loops. count1 (loop 1) is contained in bits
    472                 63:32 of the parameter, and count2 (loop 2) is
    473                 contained in bits 31:0 of the parameter.
    474   @return R11   Two unsigned 32-bit integers denoting the loop
    475                 strides of the outer (loop 1) and inner (loop 2)
    476                 purge loops. stride1 (loop 1) is contained in bits
    477                 63:32 of the parameter, and stride2 (loop 2) is
    478                 contained in bits 31:0 of the parameter.
    479 
    480 **/
    481 #define PAL_PTCE_INFO     6
    482 
    483 typedef struct {
    484   UINT64  NumberSets:8;             ///< Unsigned 8-bit integer denoting the number
    485                                     ///< of hash sets for the specified level
    486                                     ///< (1=fully associative)
    487   UINT64  NumberWays:8;             ///< Unsigned 8-bit integer denoting the
    488                                     ///< associativity of the specified level
    489                                     ///< (1=direct).
    490   UINT64  NumberEntries:16;         ///< Unsigned 16-bit integer denoting the
    491                                     ///< number of entries in the specified TC.
    492   UINT64  PageSizeIsOptimized:1;    ///< Flag denoting whether the
    493                                     ///< specified level is optimized for
    494                                     ///< the region's preferred page size
    495                                     ///< (1=optimized) tc_pages indicates
    496                                     ///< which page sizes are usable by
    497                                     ///< this translation cache.
    498   UINT64  TcIsUnified:1;            ///< Flag denoting whether the specified TC is
    499                                     ///< unified (1=unified).
    500   UINT64  EntriesReduction:1;       ///< Flag denoting whether installed
    501                                     ///< translation registers will reduce
    502                                     ///< the number of entries within the
    503                                     ///< specified TC.
    504 } PAL_TC_INFO;
    505 
    506 /**
    507   PAL Procedure - PAL_VM_INFO.
    508 
    509   Return detailed information about virtual memory features
    510   supported in the processor. It is required by Itanium processors. The PAL
    511   procedure supports the Static Registers calling convention. It
    512   could be called at physical mode and Virtual mode.
    513 
    514   @param Index    Index of PAL_VM_INFO within the list
    515                   of PAL procedures.
    516   @param TcLevel  Unsigned 64-bit integer specifying the level
    517                   in the TLB hierarchy for which information is
    518                   required. This value must be between 0 and one
    519                   less than the value returned in the
    520                   vm_info_1.num_tc_levels return value from
    521                   PAL_VM_SUMMARY.
    522   @param TcType   Unsigned 64-bit integer with a value of 1 for
    523                   instruction translation cache and 2 for data
    524                   or unified translation cache. All other values
    525                   are reserved.
    526 
    527   @retval 0       Call completed without error
    528   @retval -2      Invalid argument
    529   @retval -3      Call completed with error.
    530 
    531   @return R9      8-byte formatted value returning information
    532                   about the specified TC. See PAL_TC_INFO above.
    533   @return R10     64-bit vector containing a bit for each page
    534                   size supported in the specified TC, where bit
    535                   position n indicates a page size of 2**n.
    536 
    537 **/
    538 #define PAL_VM_INFO       7
    539 
    540 
    541 /**
    542   PAL Procedure - PAL_VM_PAGE_SIZE.
    543 
    544   Return virtual memory TC and hardware walker page sizes
    545   supported in the processor. It is required by Itanium processors. The PAL
    546   procedure supports the Static Registers calling convention. It
    547   could be called at physical mode and Virtual mode.
    548 
    549   @param Index  Index of PAL_VM_PAGE_SIZE within the list
    550                 of PAL procedures.
    551 
    552   @retval 0     Call completed without error
    553   @retval -2    Invalid argument
    554   @retval -3    Call completed with error.
    555 
    556   @return R9    64-bit vector containing a bit for each
    557                 architected page size that is supported for
    558                 TLB insertions and region registers.
    559   @return R10   64-bit vector containing a bit for each
    560                 architected page size supported for TLB purge
    561                 operations.
    562 
    563 **/
    564 #define PAL_VM_PAGE_SIZE 34
    565 
    566 typedef struct {
    567   UINT64  WalkerPresent:1;              ///< 1-bit flag indicating whether a hardware
    568                                         ///< TLB walker is implemented (1 = walker
    569                                         ///< present).
    570   UINT64  WidthOfPhysicalAddress: 7;    ///< Unsigned 7-bit integer
    571                                         ///< denoting the number of bits of
    572                                         ///< physical address implemented.
    573   UINT64  WidthOfKey:8;                 ///< Unsigned 8-bit integer denoting the number
    574                                         ///< of bits mplemented in the PKR.key field.
    575   UINT64  MaxPkrIndex:8;                ///< Unsigned 8-bit integer denoting the
    576                                         ///< maximum PKR index (number of PKRs-1).
    577   UINT64  HashTagId:8;                  ///< Unsigned 8-bit integer which uniquely
    578                                         ///< identifies the processor hash and tag
    579                                         ///< algorithm.
    580   UINT64  MaxDtrIndex:8;                ///< Unsigned 8 bit integer denoting the
    581                                         ///< maximum data translation register index
    582                                         ///< (number of dtr entries - 1).
    583   UINT64  MaxItrIndex:8;                ///< Unsigned 8 bit integer denoting the
    584                                         ///< maximum instruction translation register
    585                                         ///< index (number of itr entries - 1).
    586   UINT64  NumberOfUniqueTc:8;           ///< Unsigned 8-bit integer denoting the
    587                                         ///< number of unique TCs implemented.
    588                                         ///< This is a maximum of
    589                                         ///< 2*num_tc_levels.
    590   UINT64  NumberOfTcLevels:8;           ///< Unsigned 8-bit integer denoting the
    591                                         ///< number of TC levels.
    592 } PAL_VM_INFO1;
    593 
    594 typedef struct {
    595   UINT64  WidthOfVirtualAddress:8;  ///< Unsigned 8-bit integer denoting
    596                                     ///< is the total number of virtual
    597                                     ///< address bits - 1.
    598   UINT64  WidthOfRid:8;             ///< Unsigned 8-bit integer denoting the number
    599                                     ///< of bits implemented in the RR.rid field.
    600   UINT64  MaxPurgedTlbs:16;         ///< Unsigned 16 bit integer denoting the
    601                                     ///< maximum number of concurrent outstanding
    602                                     ///< TLB purges allowed by the processor. A
    603                                     ///< value of 0 indicates one outstanding
    604                                     ///< purge allowed. A value of 216-1
    605                                     ///< indicates no limit on outstanding
    606                                     ///< purges. All other values indicate the
    607                                     ///< actual number of concurrent outstanding
    608                                     ///< purges allowed.
    609   UINT64  Reserved:32;
    610 } PAL_VM_INFO2;
    611 
    612 /**
    613   PAL Procedure - PAL_VM_SUMMARY.
    614 
    615   Return summary information about virtual memory features
    616   supported in the processor. It is required by Itanium processors. The PAL
    617   procedure supports the Static Registers calling convention. It
    618   could be called at physical mode and Virtual mode.
    619 
    620   @param Index  Index of PAL_VM_SUMMARY within the list
    621                 of PAL procedures.
    622 
    623   @retval 0     Call completed without error
    624   @retval -2    Invalid argument
    625   @retval -3    Call completed with error.
    626 
    627   @return R9    8-byte formatted value returning global virtual
    628                 memory information. See PAL_VM_INFO1 above.
    629   @return R10   8-byte formatted value returning global virtual
    630                 memory information. See PAL_VM_INFO2 above.
    631 
    632 **/
    633 #define PAL_VM_SUMMARY  8
    634 
    635 
    636 //
    637 // Bit mask of TR_valid flag.
    638 //
    639 #define PAL_TR_ACCESS_RIGHT_IS_VALID      BIT0
    640 #define PAL_TR_PRIVILEGE_LEVEL_IS_VALID   BIT1
    641 #define PAL_TR_DIRTY_IS_VALID             BIT2
    642 #define PAL_TR_MEMORY_ATTR_IS_VALID       BIT3
    643 
    644 
    645 /**
    646   PAL Procedure - PAL_VM_TR_READ.
    647 
    648   Read contents of a translation register. It is required by
    649   Itanium processors. The PAL procedure supports the Stacked Register calling
    650   convention. It could be called at physical mode.
    651 
    652   @param Index      Index of PAL_VM_TR_READ within the list
    653                     of PAL procedures.
    654   @param RegNumber  Unsigned 64-bit number denoting which TR to
    655                     read.
    656   @param TrType     Unsigned 64-bit number denoting whether to
    657                     read an ITR (0) or DTR (1). All other values
    658                     are reserved.
    659   @param TrBuffer   64-bit pointer to the 32-byte memory buffer in
    660                     which translation data is returned.
    661 
    662   @retval 0         Call completed without error
    663   @retval -2        Invalid argument
    664   @retval -3        Call completed with error.
    665 
    666   @return R9        Formatted bit vector denoting which fields are
    667                     valid. See TR_valid above.
    668 
    669 **/
    670 #define PAL_VM_TR_READ  261
    671 
    672 
    673 
    674 
    675 //
    676 // Bit Mask of Processor Bus Fesatures .
    677 //
    678 
    679 /**
    680 
    681   When 0, bus data errors are detected and single bit errors are
    682   corrected. When 1, no error detection or correction is done.
    683 
    684 **/
    685 #define PAL_BUS_DISABLE_DATA_ERROR_SIGNALLING   BIT63
    686 
    687 
    688 /**
    689 
    690   When 0, bus address errors are signalled on the bus. When 1,
    691   no bus errors are signalled on the bus. If Disable Bus Address
    692   Error Checking is 1, this bit is ignored.
    693 
    694 **/
    695 #define PAL_BUS_DISABLE_ADDRESS_ERROR_SIGNALLING   BIT62
    696 
    697 
    698 
    699 
    700 /**
    701 
    702   When 0, bus errors are detected, single bit errors are
    703   corrected., and a CMCI or MCA is generated internally to the
    704   processor. When 1, no bus address errors are detected or
    705   corrected.
    706 
    707 **/
    708 #define PAL_BUS_DISABLE_ADDRESS_ERROR_CHECK   BIT61
    709 
    710 
    711 /**
    712 
    713   When 0, bus protocol errors (BINIT#) are signaled by the
    714   processor on the bus. When 1, bus protocol errors (BINIT#) are
    715   not signaled on the bus. If Disable Bus Initialization Event
    716   Checking is 1, this bit is ignored.
    717 
    718 **/
    719 #define PAL_BUS_DISABLE_INITIALIZATION_EVENT_SIGNALLING   BIT60
    720 
    721 
    722 /**
    723 
    724   When 0, bus protocol errors (BINIT#) are detected and sampled
    725   and an MCA is generated internally to the processor. When 1,
    726   the processor will ignore bus protocol error conditions
    727   (BINIT#).
    728 
    729 **/
    730 #define PAL_BUS_DISABLE_INITIALIZATION_EVENT_CHECK   BIT59
    731 
    732 
    733 
    734 /**
    735 
    736   When 0, BERR# is signalled if a bus error is detected. When 1,
    737   bus errors are not signalled on the bus.
    738 
    739 **/
    740 #define PAL_BUS_DISABLE_ERROR_SIGNALLING   BIT58
    741 
    742 
    743 
    744 
    745 /**
    746 
    747   When 0, BERR# is signalled when internal processor requestor
    748   initiated bus errors are detected. When 1, internal requester
    749   bus errors are not signalled on the bus.
    750 
    751 **/
    752 #define PAL_BUS_DISABLE__INTERNAL_ERROR_SIGNALLING   BIT57
    753 
    754 
    755 /**
    756 
    757   When 0, the processor takes an MCA if BERR# is asserted. When
    758   1, the processor ignores the BERR# signal.
    759 
    760 **/
    761 #define PAL_BUS_DISABLE_ERROR_CHECK   BIT56
    762 
    763 
    764 /**
    765 
    766   When 0, the processor asserts BINIT# if it detects a parity
    767   error on the signals which identify the transactions to which
    768   this is a response. When 1, the processor ignores parity on
    769   these signals.
    770 
    771 **/
    772 #define PAL_BUS_DISABLE_RSP_ERROR_CHECK   BIT55
    773 
    774 
    775 /**
    776 
    777   When 0, the in-order transaction queue is limited only by the
    778   number of hardware entries. When 1, the processor's in-order
    779   transactions queue is limited to one entry.
    780 
    781 **/
    782 #define PAL_BUS_DISABLE_TRANSACTION_QUEUE   BIT54
    783 
    784 /**
    785 
    786   Enable a bus cache line replacement transaction when a cache
    787   line in the exclusive state is replaced from the highest level
    788   processor cache and is not present in the lower level processor
    789   caches. When 0, no bus cache line replacement transaction will
    790   be seen on the bus. When 1, bus cache line replacement
    791   transactions will be seen on the bus when the above condition is
    792   detected.
    793 
    794 **/
    795 #define PAL_BUS_ENABLE_EXCLUSIVE_CACHE_LINE_REPLACEMENT   BIT53
    796 
    797 
    798 /**
    799 
    800   Enable a bus cache line replacement transaction when a cache
    801   line in the shared or exclusive state is replaced from the
    802   highest level processor cache and is not present in the lower
    803   level processor caches.
    804   When 0, no bus cache line replacement transaction will be seen
    805   on the bus. When 1, bus cache line replacement transactions
    806   will be seen on the bus when the above condition is detected.
    807 
    808 **/
    809 #define PAL_BUS_ENABLE_SHARED_CACHE_LINE_REPLACEMENT   BIT52
    810 
    811 
    812 
    813 /**
    814 
    815   When 0, the data bus is configured at the 2x data transfer
    816   rate.When 1, the data bus is configured at the 1x data
    817   transfer rate, 30 Opt. Req. Disable Bus Lock Mask. When 0, the
    818   processor executes locked transactions atomically. When 1, the
    819   processor masks the bus lock signal and executes locked
    820   transactions as a non-atomic series of transactions.
    821 
    822 **/
    823 #define PAL_BUS_ENABLE_HALF_TRANSFER   BIT30
    824 
    825 /**
    826 
    827   When 0, the processor will deassert bus request when finished
    828   with each transaction. When 1, the processor will continue to
    829   assert bus request after it has finished, if it was the last
    830   agent to own the bus and if there are no other pending
    831   requests.
    832 
    833 **/
    834 #define PAL_BUS_REQUEST_BUS_PARKING   BIT29
    835 
    836 
    837 /**
    838   PAL Procedure - PAL_BUS_GET_FEATURES.
    839 
    840   Return configurable processor bus interface features and their
    841   current settings. It is required by Itanium processors. The PAL procedure
    842   supports the Stacked Register calling convention. It could be
    843   called at physical mode.
    844 
    845   @param Index  Index of PAL_BUS_GET_FEATURES within the list
    846                 of PAL procedures.
    847 
    848   @retval 0     Call completed without error
    849   @retval -2    Invalid argument
    850   @retval -3    Call completed with error.
    851 
    852   @return R9    64-bit vector of features implemented.
    853                 (1=implemented, 0=not implemented)
    854   @return R10   64-bit vector of current feature settings.
    855   @return R11   64-bit vector of features controllable by
    856                 software. (1=controllable, 0= not controllable)
    857 
    858 **/
    859 #define PAL_BUS_GET_FEATURES 9
    860 
    861 /**
    862   PAL Procedure - PAL_BUS_SET_FEATURES.
    863 
    864   Enable or disable configurable features in processor bus
    865   interface. It is required by Itanium processors. The PAL procedure
    866   supports the Static Registers calling convention. It could be
    867   called at physical mode.
    868 
    869   @param Index          Index of PAL_BUS_SET_FEATURES within the list
    870                         of PAL procedures.
    871   @param FeatureSelect  64-bit vector denoting desired state of
    872                         each feature (1=select, 0=non-select).
    873 
    874   @retval 0             Call completed without error
    875   @retval -2            Invalid argument
    876   @retval -3            Call completed with error.
    877 
    878 **/
    879 #define PAL_BUS_SET_FEATURES 10
    880 
    881 
    882 /**
    883   PAL Procedure - PAL_DEBUG_INFO.
    884 
    885   Return the number of instruction and data breakpoint
    886   registers. It is required by Itanium processors. The
    887   PAL procedure supports the Static Registers calling
    888   convention. It could be called at physical mode and virtual
    889   mode.
    890 
    891   @param Index  Index of PAL_DEBUG_INFO within the list of PAL
    892                 procedures.
    893 
    894   @retval 0     Call completed without error
    895   @retval -2    Invalid argument
    896   @retval -3    Call completed with error.
    897 
    898   @return R9    Unsigned 64-bit integer denoting the number of
    899                 pairs of instruction debug registers implemented
    900                 by the processor.
    901   @return R10   Unsigned 64-bit integer denoting the number of
    902                 pairs of data debug registers implemented by the
    903                 processor.
    904 
    905 **/
    906 #define PAL_DEBUG_INFO  11
    907 
    908 /**
    909   PAL Procedure - PAL_FIXED_ADDR.
    910 
    911   Return the fixed component of a processor's directed address.
    912   It is required by Itanium processors. The PAL
    913   procedure supports the Static Registers calling convention. It
    914   could be called at physical mode and virtual mode.
    915 
    916   @param Index  Index of PAL_FIXED_ADDR within the list of PAL
    917                 procedures.
    918 
    919   @retval 0     Call completed without error
    920   @retval -2    Invalid argument
    921   @retval -3    Call completed with error.
    922 
    923   @return R9    Fixed geographical address of this processor.
    924 
    925 **/
    926 #define PAL_FIXED_ADDR 12
    927 
    928 /**
    929   PAL Procedure - PAL_FREQ_BASE.
    930 
    931   Return the frequency of the output clock for use by the
    932   platform, if generated by the processor. It is optinal. The
    933   PAL procedure supports the Static Registers calling
    934   convention. It could be called at physical mode and virtual
    935   mode.
    936 
    937   @param Index  Index of PAL_FREQ_BASE within the list of PAL
    938                 procedures.
    939 
    940   @retval 0     Call completed without error
    941   @retval -1    Unimplemented procedure
    942   @retval -2    Invalid argument
    943   @retval -3    Call completed with error.
    944 
    945   @return R9    Base frequency of the platform if generated by the
    946                 processor chip.
    947 
    948 **/
    949 #define PAL_FREQ_BASE 13
    950 
    951 
    952 /**
    953   PAL Procedure - PAL_FREQ_RATIOS.
    954 
    955   Return ratio of processor, bus, and interval time counter to
    956   processor input clock or output clock for platform use, if
    957   generated by the processor. It is required by Itanium processors. The PAL
    958   procedure supports the Static Registers calling convention. It
    959   could be called at physical mode and virtual mode.
    960 
    961   @param Index  Index of PAL_FREQ_RATIOS within the list of PAL
    962                 procedures.
    963 
    964   @retval 0     Call completed without error
    965   @retval -2    Invalid argument
    966   @retval -3    Call completed with error.
    967 
    968   @return R9    Ratio of the processor frequency to the input
    969                 clock of the processor, if the platform clock is
    970                 generated externally or to the output clock to the
    971                 platform, if the platform clock is generated by
    972                 the processor.
    973   @return R10   Ratio of the bus frequency to the input clock of
    974                 the processor, if the platform clock is generated
    975                 externally or to the output clock to the platform,
    976                 if the platform clock is generated by the
    977                 processor.
    978   @return R11   Ratio of the interval timer counter rate to input
    979                 clock of the processor, if the platform clock is
    980                 generated externally or to the output clock to the
    981                 platform, if the platform clock is generated by
    982                 the processor.
    983 
    984 **/
    985 #define PAL_FREQ_RATIOS 14
    986 
    987 typedef struct {
    988   UINT64  NumberOfLogicalProcessors:16;     ///< Total number of logical
    989                                             ///< processors on this physical
    990                                             ///< processor package that are
    991                                             ///< enabled.
    992   UINT64  ThreadsPerCore:8;                 ///< Number of threads per core.
    993   UINT64  Reserved1:8;
    994   UINT64  CoresPerProcessor:8;              ///< Total number of cores on this
    995                                             ///< physical processor package.
    996   UINT64  Reserved2:8;
    997   UINT64  PhysicalProcessorPackageId:8;     ///< Physical processor package
    998                                             ///< identifier which was
    999                                             ///< assigned at reset by the
   1000                                             ///< platform or bus
   1001                                             ///< controller. This value may
   1002                                             ///< or may not be unique
   1003                                             ///< across the entire platform
   1004                                             ///< since it depends on the
   1005                                             ///< platform vendor's policy.
   1006   UINT64  Reserved3:8;
   1007 } PAL_LOGICAL_PROCESSPR_OVERVIEW;
   1008 
   1009 typedef struct {
   1010    UINT64 ThreadId:16;      ///< The thread identifier of the logical
   1011                             ///< processor for which information is being
   1012                             ///< returned. This value will be unique on a per
   1013                             ///< core basis.
   1014    UINT64 Reserved1:16;
   1015    UINT64 CoreId:16;        ///< The core identifier of the logical processor
   1016                             ///< for which information is being returned.
   1017                             ///< This value will be unique on a per physical
   1018                             ///< processor package basis.
   1019    UINT64 Reserved2:16;
   1020 } PAL_LOGICAL_PROCESSORN_INFO1;
   1021 
   1022 typedef struct {
   1023    UINT64 LogicalAddress:16;    ///< Geographical address of the logical
   1024                                 ///< processor for which information is being
   1025                                 ///< returned. This is the same value that is
   1026                                 ///< returned by the PAL_FIXED_ADDR procedure
   1027                                 ///< when it is called on the logical processor.
   1028    UINT64 Reserved:48;
   1029 } PAL_LOGICAL_PROCESSORN_INFO2;
   1030 
   1031 /**
   1032   PAL Procedure - PAL_LOGICAL_TO_PHYSICAL.
   1033 
   1034   Return information on which logical processors map to a
   1035   physical processor die. It is optinal. The PAL procedure
   1036   supports the Static Registers calling convention. It could be
   1037   called at physical mode and virtual mode.
   1038 
   1039   @param Index            Index of PAL_LOGICAL_TO_PHYSICAL within the list of PAL
   1040                           procedures.
   1041   @param ProcessorNumber  Signed 64-bit integer that specifies
   1042                           for which logical processor
   1043                           information is being requested. When
   1044                           this input argument is -1, information
   1045                           is returned about the logical
   1046                           processor on which the procedure call
   1047                           is made. This input argument must be
   1048                           in the range of 1 up to one less than
   1049                           the number of logical processors
   1050                           returned by num_log in the
   1051                           log_overview return value.
   1052 
   1053   @retval 0               Call completed without error
   1054   @retval -1              Unimplemented procedure
   1055   @retval -2              Invalid argument
   1056   @retval -3              Call completed with error.
   1057 
   1058   @return R9              The format of PAL_LOGICAL_PROCESSPR_OVERVIEW.
   1059   @return R10             The format of PAL_LOGICAL_PROCESSORN_INFO1.
   1060   @return R11             The format of PAL_LOGICAL_PROCESSORN_INFO2.
   1061 
   1062 **/
   1063 #define PAL_LOGICAL_TO_PHYSICAL 42
   1064 
   1065 typedef struct {
   1066   UINT64  NumberOfPmcPairs:8;               ///< Unsigned 8-bit number defining the
   1067                                             ///< number of generic PMC/PMD pairs.
   1068   UINT64  WidthOfCounter:8;                 ///< Unsigned 8-bit number in the range
   1069                                             ///< 0:60 defining the number of
   1070                                             ///< implemented counter bits.
   1071   UINT64  TypeOfCycleCounting:8;            ///< Unsigned 8-bit number defining the
   1072                                             ///< event type for counting processor cycles.
   1073   UINT64  TypeOfRetiredInstructionBundle:8; ///< Retired Unsigned 8-bit
   1074                                             ///< number defining the
   1075                                             ///< event type for retired
   1076                                             ///< instruction bundles.
   1077   UINT64  Reserved:32;
   1078 } PAL_PERFORMANCE_INFO;
   1079 
   1080 /**
   1081   PAL Procedure - PAL_PERF_MON_INFO.
   1082 
   1083   Return the number and type of performance monitors. It is
   1084   required by Itanium processors. The PAL procedure supports the Static
   1085   Registers calling convention. It could be called at physical
   1086   mode and virtual mode.
   1087 
   1088   @param Index              Index of PAL_PERF_MON_INFO within the list of
   1089                             PAL procedures.
   1090   @param PerformanceBuffer  An address to an 8-byte aligned
   1091                             128-byte memory buffer.
   1092 
   1093   @retval 0                 Call completed without error
   1094   @retval -2                Invalid argument
   1095   @retval -3                Call completed with error.
   1096 
   1097   @return R9                Information about the performance monitors
   1098                             implemented. See PAL_PERFORMANCE_INFO;
   1099 
   1100 **/
   1101 #define PAL_PERF_MON_INFO 15
   1102 
   1103 #define PAL_PLATFORM_ADDR_INTERRUPT_BLOCK_TOKEN                       0x0
   1104 #define PAL_PLATFORM_ADDR_IO_BLOCK_TOKEN                              0x1
   1105 
   1106 /**
   1107   PAL Procedure - PAL_PLATFORM_ADDR.
   1108 
   1109   Specify processor interrupt block address and I/O port space
   1110   address. It is required by Itanium processors. The PAL procedure supports the
   1111   Static Registers calling convention. It could be called at
   1112   physical mode and virtual mode.
   1113 
   1114   @param Index    Index of PAL_PLATFORM_ADDR within the list of
   1115                   PAL procedures.
   1116   @param Type     Unsigned 64-bit integer specifying the type of
   1117                   block. 0 indicates that the processor interrupt
   1118                   block pointer should be initialized. 1 indicates
   1119                   that the processor I/O block pointer should be
   1120                   initialized.
   1121   @param Address  Unsigned 64-bit integer specifying the address
   1122                   to which the processor I/O block or interrupt
   1123                   block shall be set. The address must specify
   1124                   an implemented physical address on the
   1125                   processor model, bit 63 is ignored.
   1126 
   1127   @retval 0       Call completed without error
   1128   @retval -1      Unimplemented procedure.
   1129   @retval -2      Invalid argument
   1130   @retval -3      Call completed with error.
   1131 
   1132 **/
   1133 #define PAL_PLATFORM_ADDR 16
   1134 
   1135 typedef struct {
   1136   UINT64  Reserved1:36;
   1137   UINT64  FaultInUndefinedIns:1;                ///< Bit36, No Unimplemented
   1138                                                 ///< instruction address reported as
   1139                                                 ///< fault. Denotes how the processor
   1140                                                 ///< reports the detection of
   1141                                                 ///< unimplemented instruction
   1142                                                 ///< addresses. When 1, the processor
   1143                                                 ///< reports an Unimplemented
   1144                                                 ///< Instruction Address fault on the
   1145                                                 ///< unimplemented address; when 0, it
   1146                                                 ///< reports an Unimplemented
   1147                                                 ///< Instruction Address trap on the
   1148                                                 ///< previous instruction in program
   1149                                                 ///< order. This feature may only be
   1150                                                 ///< interrogated by
   1151                                                 ///< PAL_PROC_GET_FEATURES. It may not
   1152                                                 ///< be enabled or disabled by
   1153                                                 ///< PAL_PROC_SET_FEATURES. The
   1154                                                 ///< corresponding argument is ignored.
   1155 
   1156   UINT64  NoPresentPmi:1;                       ///< Bit37, No INIT, PMI, and LINT pins
   1157                                                 ///< present. Denotes the absence of INIT,
   1158                                                 ///< PMI, LINT0 and LINT1 pins on the
   1159                                                 ///< processor. When 1, the pins are absent.
   1160                                                 ///< When 0, the pins are present. This
   1161                                                 ///< feature may only be interrogated by
   1162                                                 ///< PAL_PROC_GET_FEATURES. It may not be
   1163                                                 ///< enabled or disabled by
   1164                                                 ///< PAL_PROC_SET_FEATURES. The corresponding
   1165                                                 ///< argument is ignored.
   1166 
   1167   UINT64  NoSimpleImpInUndefinedIns:1;          ///< Bit38, No Simple
   1168                                                 ///< implementation of
   1169                                                 ///< unimplemented instruction
   1170                                                 ///< addresses. Denotes how an
   1171                                                 ///< unimplemented instruction
   1172                                                 ///< address is recorded in IIP
   1173                                                 ///< on an Unimplemented
   1174                                                 ///< Instruction Address trap or
   1175                                                 ///< fault. When 1, the full
   1176                                                 ///< unimplemented address is
   1177                                                 ///< recorded in IIP; when 0, the
   1178                                                 ///< address is sign extended
   1179                                                 ///< (virtual addresses) or zero
   1180                                                 ///< extended (physical
   1181                                                 ///< addresses). This feature may
   1182                                                 ///< only be interrogated by
   1183                                                 ///< PAL_PROC_GET_FEATURES. It
   1184                                                 ///< may not be enabled or
   1185                                                 ///< disabled by
   1186                                                 ///< PAL_PROC_SET_FEATURES. The
   1187                                                 ///< corresponding argument is
   1188                                                 ///< ignored.
   1189 
   1190   UINT64  NoVariablePState:1;                   ///< Bit39, No Variable P-state
   1191                                                 ///< performance: A value of 1, indicates
   1192                                                 ///< that a processor implements
   1193                                                 ///< techniques to optimize performance
   1194                                                 ///< for the given P-state power budget
   1195                                                 ///< by dynamically varying the
   1196                                                 ///< frequency, such that maximum
   1197                                                 ///< performance is achieved for the
   1198                                                 ///< power budget. A value of 0,
   1199                                                 ///< indicates that P-states have no
   1200                                                 ///< frequency variation or very small
   1201                                                 ///< frequency variations for their given
   1202                                                 ///< power budget. This feature may only
   1203                                                 ///< be interrogated by
   1204                                                 ///< PAL_PROC_GET_FEATURES. it may not be
   1205                                                 ///< enabled or disabled by
   1206                                                 ///< PAL_PROC_SET_FEATURES. The
   1207                                                 ///< corresponding argument is ignored.
   1208 
   1209   UINT64  NoVM:1;                               ///< Bit40, No Virtual Machine features implemented.
   1210                                                 ///< Denotes whether PSR.vm is implemented. This
   1211                                                 ///< feature may only be interrogated by
   1212                                                 ///< PAL_PROC_GET_FEATURES. It may not be enabled or
   1213                                                 ///< disabled by PAL_PROC_SET_FEATURES. The
   1214                                                 ///< corresponding argument is ignored.
   1215 
   1216   UINT64  NoXipXpsrXfs:1;                       ///< Bit41, No XIP, XPSR, and XFS
   1217                                                 ///< implemented. Denotes whether XIP, XPSR,
   1218                                                 ///< and XFS are implemented for machine
   1219                                                 ///< check recovery. This feature may only be
   1220                                                 ///< interrogated by PAL_PROC_GET_FEATURES.
   1221                                                 ///< It may not be enabled or disabled by
   1222                                                 ///< PAL_PROC_SET_FEATURES. The corresponding
   1223                                                 ///< argument is ignored.
   1224 
   1225   UINT64  NoXr1ThroughXr3:1;                    ///< Bit42, No XR1 through XR3 implemented.
   1226                                                 ///<   Denotes whether XR1 XR3 are
   1227                                                 ///<   implemented for machine check
   1228                                                 ///<   recovery. This feature may only be
   1229                                                 ///<   interrogated by PAL_PROC_GET_FEATURES.
   1230                                                 ///<   It may not be enabled or disabled by
   1231                                                 ///<   PAL_PROC_SET_FEATURES. The
   1232                                                 ///<   corresponding argument is ignored.
   1233 
   1234   UINT64  DisableDynamicPrediction:1;           ///< Bit43, Disable Dynamic
   1235                                                 ///< Predicate Prediction. When
   1236                                                 ///< 0, the processor may predict
   1237                                                 ///< predicate results and
   1238                                                 ///< execute speculatively, but
   1239                                                 ///< may not commit results until
   1240                                                 ///< the actual predicates are
   1241                                                 ///< known. When 1, the processor
   1242                                                 ///< shall not execute predicated
   1243                                                 ///< instructions until the
   1244                                                 ///< actual predicates are known.
   1245 
   1246   UINT64  DisableSpontaneousDeferral:1;         ///< Bit44, Disable Spontaneous
   1247                                                 ///<   Deferral. When 1, the
   1248                                                 ///<   processor may optionally
   1249                                                 ///<   defer speculative loads
   1250                                                 ///<   that do not encounter any
   1251                                                 ///<   exception conditions, but
   1252                                                 ///<   that trigger other
   1253                                                 ///<   implementation-dependent
   1254                                                 ///<   conditions (e.g., cache
   1255                                                 ///<   miss). When 0, spontaneous
   1256                                                 ///<   deferral is disabled.
   1257 
   1258   UINT64  DisableDynamicDataCachePrefetch:1;    ///< Bit45, Disable Dynamic
   1259                                                 ///<   Data Cache Prefetch.
   1260                                                 ///<   When 0, the processor
   1261                                                 ///<   may prefetch into the
   1262                                                 ///<   caches any data which
   1263                                                 ///<   has not been accessed
   1264                                                 ///<   by instruction
   1265                                                 ///<   execution, but which
   1266                                                 ///<   is likely to be
   1267                                                 ///<   accessed. When 1, no
   1268                                                 ///<   data may be fetched
   1269                                                 ///<   until it is needed for
   1270                                                 ///<   instruction execution
   1271                                                 ///<   or is fetched by an
   1272                                                 ///<   lfetch instruction.
   1273 
   1274   UINT64  DisableDynamicInsCachePrefetch:1;     ///< Bit46, Disable
   1275                                                 ///< DynamicInstruction Cache
   1276                                                 ///< Prefetch. When 0, the
   1277                                                 ///< processor may prefetch
   1278                                                 ///< into the caches any
   1279                                                 ///< instruction which has
   1280                                                 ///< not been executed, but
   1281                                                 ///< whose execution is
   1282                                                 ///< likely. When 1,
   1283                                                 ///< instructions may not be
   1284                                                 ///< fetched until needed or
   1285                                                 ///< hinted for execution.
   1286                                                 ///< (Prefetch for a hinted
   1287                                                 ///< branch is allowed even
   1288                                                 ///< when dynamic instruction
   1289                                                 ///< cache prefetch is
   1290                                                 ///< disabled.)
   1291 
   1292   UINT64  DisableBranchPrediction:1;            ///< Bit47, Disable Dynamic branch
   1293                                                 ///<   prediction. When 0, the
   1294                                                 ///<   processor may predict branch
   1295                                                 ///<   targets and speculatively
   1296                                                 ///<   execute, but may not commit
   1297                                                 ///<   results. When 1, the processor
   1298                                                 ///<   must wait until branch targets
   1299                                                 ///<   are known to execute.
   1300   UINT64  Reserved2:4;
   1301   UINT64  DisablePState:1;                      ///< Bit52, Disable P-states. When 1, the PAL
   1302                                                 ///< P-state procedures (PAL_PSTATE_INFO,
   1303                                                 ///< PAL_SET_PSTATE, PAL_GET_PSTATE) will
   1304                                                 ///< return with a status of -1
   1305                                                 ///< (Unimplemented procedure).
   1306 
   1307   UINT64  EnableMcaOnDataPoisoning:1;           ///< Bit53, Enable MCA signaling
   1308                                                 ///< on data-poisoning event
   1309                                                 ///< detection. When 0, a CMCI
   1310                                                 ///< will be signaled on error
   1311                                                 ///< detection. When 1, an MCA
   1312                                                 ///< will be signaled on error
   1313                                                 ///< detection. If this feature
   1314                                                 ///< is not supported, then the
   1315                                                 ///< corresponding argument is
   1316                                                 ///< ignored when calling
   1317                                                 ///< PAL_PROC_SET_FEATURES. Note
   1318                                                 ///< that the functionality of
   1319                                                 ///< this bit is independent of
   1320                                                 ///< the setting in bit 60
   1321                                                 ///< (Enable CMCI promotion), and
   1322                                                 ///< that the bit 60 setting does
   1323                                                 ///< not affect CMCI signaling
   1324                                                 ///< for data-poisoning related
   1325                                                 ///< events. Volume 2: Processor
   1326                                                 ///< Abstraction Layer 2:431
   1327                                                 ///< PAL_PROC_GET_FEATURES
   1328 
   1329   UINT64  EnableVmsw:1;                         ///< Bit54, Enable the use of the vmsw
   1330                                                 ///<   instruction. When 0, the vmsw instruction
   1331                                                 ///<   causes a Virtualization fault when
   1332                                                 ///<   executed at the most privileged level.
   1333                                                 ///<   When 1, this bit will enable normal
   1334                                                 ///<   operation of the vmsw instruction.
   1335 
   1336   UINT64  EnableEnvNotification:1;              ///< Bit55, Enable external
   1337                                                 ///< notification when the processor
   1338                                                 ///< detects hardware errors caused
   1339                                                 ///< by environmental factors that
   1340                                                 ///< could cause loss of
   1341                                                 ///< deterministic behavior of the
   1342                                                 ///< processor. When 1, this bit will
   1343                                                 ///< enable external notification,
   1344                                                 ///< when 0 external notification is
   1345                                                 ///< not provided. The type of
   1346                                                 ///< external notification of these
   1347                                                 ///< errors is processor-dependent. A
   1348                                                 ///< loss of processor deterministic
   1349                                                 ///< behavior is considered to have
   1350                                                 ///< occurred if these
   1351                                                 ///< environmentally induced errors
   1352                                                 ///< cause the processor to deviate
   1353                                                 ///< from its normal execution and
   1354                                                 ///< eventually causes different
   1355                                                 ///< behavior which can be observed
   1356                                                 ///<  at the processor bus pins.
   1357                                                 ///< Processor errors that do not
   1358                                                 ///< have this effects (i.e.,
   1359                                                 ///< software induced machine checks)
   1360                                                 ///< may or may not be promoted
   1361                                                 ///< depending on the processor
   1362                                                 ///< implementation.
   1363 
   1364   UINT64  DisableBinitWithTimeout:1;            ///< Bit56, Disable a BINIT on
   1365                                                 ///<   internal processor time-out.
   1366                                                 ///<   When 0, the processor may
   1367                                                 ///<   generate a BINIT on an
   1368                                                 ///<   internal processor time-out.
   1369                                                 ///<   When 1, the processor will not
   1370                                                 ///<   generate a BINIT on an
   1371                                                 ///<   internal processor time-out.
   1372                                                 ///<   The event is silently ignored.
   1373 
   1374   UINT64  DisableDPM:1;                         ///< Bit57, Disable Dynamic Power Management
   1375                                                 ///<   (DPM). When 0, the hardware may reduce
   1376                                                 ///<   power consumption by removing the clock
   1377                                                 ///<   input from idle functional units. When 1,
   1378                                                 ///<   all functional units will receive clock
   1379                                                 ///<   input, even when idle.
   1380 
   1381   UINT64  DisableCoherency:1;                   ///< Bit58, Disable Coherency. When 0,
   1382                                                 ///< the processor uses normal coherency
   1383                                                 ///< requests and responses. When 1, the
   1384                                                 ///< processor answers all requests as if
   1385                                                 ///< the line were not present.
   1386 
   1387   UINT64  DisableCache:1;                       ///< Bit59, Disable Cache. When 0, the
   1388                                                 ///< processor performs cast outs on
   1389                                                 ///< cacheable pages and issues and responds
   1390                                                 ///< to coherency requests normally. When 1,
   1391                                                 ///< the processor performs a memory access
   1392                                                 ///< for each reference regardless of cache
   1393                                                 ///< contents and issues no coherence
   1394                                                 ///< requests and responds as if the line
   1395                                                 ///< were not present. Cache contents cannot
   1396                                                 ///< be relied upon when the cache is
   1397                                                 ///< disabled. WARNING: Semaphore
   1398                                                 ///< instructions may not be atomic or may
   1399                                                 ///< cause Unsupported Data Reference faults
   1400                                                 ///< if caches are disabled.
   1401 
   1402   UINT64  EnableCmciPromotion:1;                ///< Bit60, Enable CMCI promotion When
   1403                                                 ///<   1, Corrected Machine Check
   1404                                                 ///<   Interrupts (CMCI) are promoted to
   1405                                                 ///<   MCAs. They are also further
   1406                                                 ///<   promoted to BERR if bit 39, Enable
   1407                                                 ///<   MCA promotion, is also set and
   1408                                                 ///<   they are promoted to BINIT if bit
   1409                                                 ///<   38, Enable MCA to BINIT promotion,
   1410                                                 ///<   is also set. This bit has no
   1411                                                 ///<   effect if MCA signalling is
   1412                                                 ///<   disabled (see
   1413                                                 ///<   PAL_BUS_GET/SET_FEATURES)
   1414 
   1415   UINT64  EnableMcaToBinitPromotion:1;          ///< Bit61, Enable MCA to BINIT
   1416                                                 ///< promotion. When 1, machine
   1417                                                 ///< check aborts (MCAs) are
   1418                                                 ///< promoted to the Bus
   1419                                                 ///< Initialization signal, and
   1420                                                 ///< the BINIT pin is assert on
   1421                                                 ///< each occurrence of an MCA.
   1422                                                 ///< Setting this bit has no
   1423                                                 ///< effect if BINIT signalling
   1424                                                 ///< is disabled. (See
   1425                                                 ///< PAL_BUS_GET/SET_FEATURES)
   1426 
   1427   UINT64  EnableMcaPromotion:1;                 ///< Bit62, Enable MCA promotion. When
   1428                                                 ///<   1, machine check aborts (MCAs) are
   1429                                                 ///<   promoted to the Bus Error signal,
   1430                                                 ///<   and the BERR pin is assert on each
   1431                                                 ///<   occurrence of an MCA. Setting this
   1432                                                 ///<   bit has no effect if BERR
   1433                                                 ///<   signalling is disabled. (See
   1434                                                 ///<   PAL_BUS_GET/SET_FEATURES)
   1435 
   1436   UINT64  EnableBerrPromotion:1;                ///< Bit63. Enable BERR promotion. When
   1437                                                 ///<   1, the Bus Error (BERR) signal is
   1438                                                 ///<   promoted to the Bus Initialization
   1439                                                 ///<   (BINIT) signal, and the BINIT pin
   1440                                                 ///<   is asserted on the occurrence of
   1441                                                 ///<   each Bus Error. Setting this bit
   1442                                                 ///<   has no effect if BINIT signalling
   1443                                                 ///<   is disabled. (See
   1444                                                 ///<   PAL_BUS_GET/SET_FEATURES)
   1445 } PAL_PROCESSOR_FEATURES;
   1446 
   1447 /**
   1448   PAL Procedure - PAL_PROC_GET_FEATURES.
   1449 
   1450   Return configurable processor features and their current
   1451   setting. It is required by Itanium processors. The PAL procedure supports the
   1452   Static Registers calling convention. It could be called at
   1453   physical mode and virtual mode.
   1454 
   1455   @param Index      Index of PAL_PROC_GET_FEATURES within the list of
   1456                     PAL procedures.
   1457   @param Reserved   Reserved parameter.
   1458   @param FeatureSet Feature set information is being requested
   1459                     for.
   1460 
   1461   @retval 1         Call completed without error; The
   1462                     feature_set passed is not supported but a
   1463                     feature_set of a larger value is supported.
   1464   @retval 0         Call completed without error
   1465   @retval -2        Invalid argument
   1466   @retval -3        Call completed with error.
   1467   @retval -8        feature_set passed is beyond the maximum
   1468                     feature_set supported
   1469 
   1470   @return R9        64-bit vector of features implemented. See
   1471                     PAL_PROCESSOR_FEATURES.
   1472   @return R10       64-bit vector of current feature settings. See
   1473                     PAL_PROCESSOR_FEATURES.
   1474   @return R11       64-bit vector of features controllable by
   1475                     software.
   1476 
   1477 **/
   1478 #define PAL_PROC_GET_FEATURES 17
   1479 
   1480 
   1481 /**
   1482   PAL Procedure - PAL_PROC_SET_FEATURES.
   1483 
   1484   Enable or disable configurable processor features. It is
   1485   required by Itanium processors. The PAL procedure supports the Static
   1486   Registers calling convention. It could be called at physical
   1487   mode.
   1488 
   1489   @param Index          Index of PAL_PROC_SET_FEATURES within the list of
   1490                         PAL procedures.
   1491   @param FeatureSelect  64-bit vector denoting desired state of
   1492                         each feature (1=select, 0=non-select).
   1493   @param FeatureSet     Feature set to apply changes to. See
   1494                         PAL_PROC_GET_FEATURES for more information
   1495                         on feature sets.
   1496 
   1497   @retval 1             Call completed without error; The
   1498                         feature_set passed is not supported but a
   1499                         feature_set of a larger value is supported
   1500   @retval 0             Call completed without error
   1501   @retval -2            Invalid argument
   1502   @retval -3            Call completed with error.
   1503   @retval -8            feature_set passed is beyond the maximum
   1504                         feature_set supported
   1505 
   1506 **/
   1507 #define PAL_PROC_SET_FEATURES 18
   1508 
   1509 
   1510 //
   1511 // Value of PAL_REGISTER_INFO.InfoRequest.
   1512 //
   1513 #define PAL_APPLICATION_REGISTER_IMPLEMENTED  0
   1514 #define PAL_APPLICATION_REGISTER_READABLE     1
   1515 #define PAL_CONTROL_REGISTER_IMPLEMENTED      2
   1516 #define PAL_CONTROL_REGISTER_READABLE         3
   1517 
   1518 
   1519 /**
   1520   PAL Procedure - PAL_REGISTER_INFO.
   1521 
   1522   Return AR and CR register information. It is required by Itanium processors.
   1523   The PAL procedure supports the Static Registers calling
   1524   convention. It could be called at physical mode and virtual
   1525   mode.
   1526 
   1527   @param Index        Index of PAL_REGISTER_INFO within the list of
   1528                       PAL procedures.
   1529   @param InfoRequest  Unsigned 64-bit integer denoting what
   1530                       register information is requested. See
   1531                       PAL_REGISTER_INFO.InfoRequest above.
   1532 
   1533   @retval 0           Call completed without error
   1534   @retval -2          Invalid argument
   1535   @retval -3          Call completed with error.
   1536 
   1537   @return R9          64-bit vector denoting information for registers
   1538                       0-63. Bit 0 is register 0, bit 63 is register 63.
   1539   @return R10         64-bit vector denoting information for registers
   1540                       64-127. Bit 0 is register 64, bit 63 is register
   1541                       127.
   1542 
   1543 **/
   1544 #define PAL_REGISTER_INFO 39
   1545 
   1546 /**
   1547   PAL Procedure - PAL_RSE_INFO.
   1548 
   1549   Return RSE information. It is required by Itanium processors. The PAL
   1550   procedure supports the Static Registers calling convention. It
   1551   could be called at physical mode and virtual mode.
   1552 
   1553   @param Index        Index of PAL_RSE_INFO within the list of
   1554                       PAL procedures.
   1555   @param InfoRequest  Unsigned 64-bit integer denoting what
   1556                       register information is requested. See
   1557                       PAL_REGISTER_INFO.InfoRequest above.
   1558 
   1559   @retval 0           Call completed without error
   1560   @retval -2          Invalid argument
   1561   @retval -3          Call completed with error.
   1562 
   1563   @return R9          Number of physical stacked general registers.
   1564   @return R10         RSE hints supported by processor.
   1565 
   1566 **/
   1567 #define PAL_RSE_INFO 19
   1568 
   1569 typedef struct {
   1570   UINT64  VersionOfPalB:16;     ///< Is a 16-bit binary coded decimal (BCD)
   1571                                 ///< number that provides identification
   1572                                 ///< information about the PAL_B firmware.
   1573   UINT64  Reserved1:8;
   1574   UINT64  PalVendor:8;          ///< Is an unsigned 8-bit integer indicating the
   1575                                 ///< vendor of the PAL code.
   1576   UINT64  VersionOfPalA:16;     ///< Is a 16-bit binary coded decimal (BCD)
   1577                                 ///< number that provides identification
   1578                                 ///< information about the PAL_A firmware. In
   1579                                 ///< the split PAL_A model, this return value
   1580                                 ///< is the version number of the
   1581                                 ///< processor-specific PAL_A. The generic
   1582                                 ///< PAL_A version is not returned by this
   1583                                 ///< procedure in the split PAL_A model.
   1584   UINT64  Reserved2:16;
   1585 } PAL_VERSION_INFO;
   1586 
   1587 /**
   1588   PAL Procedure - PAL_VERSION.
   1589 
   1590   Return version of PAL code. It is required by Itanium processors. The PAL
   1591   procedure supports the Static Registers calling convention. It
   1592   could be called at physical mode and virtual mode.
   1593 
   1594   @param Index        Index of PAL_VERSION within the list of
   1595                       PAL procedures.
   1596   @param InfoRequest  Unsigned 64-bit integer denoting what
   1597                       register information is requested. See
   1598                       PAL_REGISTER_INFO.InfoRequest above.
   1599 
   1600   @retval 0           Call completed without error
   1601   @retval -2          Invalid argument
   1602   @retval -3          Call completed with error.
   1603 
   1604   @return R9          8-byte formatted value returning the minimum PAL
   1605                       version needed for proper operation of the
   1606                       processor. See PAL_VERSION_INFO above.
   1607   @return R10         8-byte formatted value returning the current PAL
   1608                       version running on the processor. See
   1609                       PAL_VERSION_INFO above.
   1610 
   1611 **/
   1612 #define PAL_VERSION 20
   1613 
   1614 
   1615 
   1616 //
   1617 // Vectors of PAL_MC_CLEAR_LOG.pending
   1618 //
   1619 #define PAL_MC_PENDING    BIT0
   1620 #define PAL_INIT_PENDING  BIT1
   1621 
   1622 /**
   1623   PAL Procedure - PAL_MC_CLEAR_LOG.
   1624 
   1625   Clear all error information from processor error logging
   1626   registers. It is required by Itanium processors. The PAL procedure supports
   1627   the Static Registers calling convention. It could be called at
   1628   physical mode and virtual mode.
   1629 
   1630   @param Index  Index of PAL_MC_CLEAR_LOG within the list of
   1631                 PAL procedures.
   1632 
   1633   @retval 0     Call completed without error
   1634   @retval -2    Invalid argument
   1635   @retval -3    Call completed with error.
   1636 
   1637   @return R9    64-bit vector denoting whether an event is
   1638                 pending. See PAL_MC_CLEAR_LOG.pending above.
   1639 
   1640 **/
   1641 #define PAL_MC_CLEAR_LOG 21
   1642 
   1643 /**
   1644   PAL Procedure - PAL_MC_DRAIN.
   1645 
   1646   Ensure that all operations that could cause an MCA have
   1647   completed. It is required by Itanium processors. The PAL procedure supports
   1648   the Static Registers calling convention. It could be called at
   1649   physical mode and virtual mode.
   1650 
   1651   @param Index  Index of PAL_MC_DRAIN within the list of PAL
   1652                 procedures.
   1653 
   1654   @retval 0     Call completed without error
   1655   @retval -2    Invalid argument
   1656   @retval -3    Call completed with error.
   1657 
   1658 **/
   1659 #define PAL_MC_DRAIN 22
   1660 
   1661 
   1662 /**
   1663   PAL Procedure - PAL_MC_DYNAMIC_STATE.
   1664 
   1665   Return Processor Dynamic State for logging by SAL. It is
   1666   optional. The PAL procedure supports the Static Registers
   1667   calling convention. It could be called at physical mode.
   1668 
   1669   @param Index  Index of PAL_MC_DYNAMIC_STATE within the list of PAL
   1670                 procedures.
   1671   @param Offset Offset of the next 8 bytes of Dynamic Processor
   1672                 State to return. (multiple of 8).
   1673 
   1674   @retval 0     Call completed without error
   1675   @retval -1    Unimplemented procedure.
   1676   @retval -2    Invalid argument
   1677   @retval -3    Call completed with error.
   1678 
   1679   @return R9    Unsigned 64-bit integer denoting bytes of Dynamic
   1680                 Processor State returned.
   1681   @return R10   Next 8 bytes of Dynamic Processor State.
   1682 
   1683 **/
   1684 #define PAL_MC_DYNAMIC_STATE 24
   1685 
   1686 
   1687 
   1688 //
   1689 // Values of PAL_MC_ERROR_INFO.InfoIndex.
   1690 //
   1691 #define PAL_PROCESSOR_ERROR_MAP       0
   1692 #define PAL_PROCESSOR_STATE_PARAM     1
   1693 #define PAL_STRUCTURE_SPECIFIC_ERROR  2
   1694 
   1695 typedef struct {
   1696  UINT64 CoreId:4;                   ///< Bit3:0,  Processor core ID (default is 0 for
   1697                                     ///< processors with a single core)
   1698 
   1699  UINT64 ThreadId:4;                 ///< Bit7:4, Logical thread ID (default is 0 for
   1700                                     ///< processors that execute a single thread)
   1701 
   1702  UINT64 InfoOfInsCache:4;           ///< Bit11:8, Error information is
   1703                                     ///< available for 1st, 2nd, 3rd, and 4th
   1704                                     ///< level instruction caches.
   1705 
   1706  UINT64 InfoOfDataCache:4;          ///< Bit15:12, Error information is
   1707                                     ///<   available for 1st, 2nd, 3rd, and 4th
   1708                                     ///<   level data/unified caches.
   1709 
   1710  UINT64 InfoOfInsTlb:4;             ///< Bit19:16 Error information is available
   1711                                     ///< for 1st, 2nd, 3rd, and 4th level
   1712                                     ///< instruction TLB.
   1713 
   1714  UINT64 InfoOfDataTlb:4;            ///< Bit23:20, Error information is available
   1715                                     ///< for 1st, 2nd, 3rd, and 4th level
   1716                                     ///< data/unified TLB
   1717 
   1718  UINT64 InfoOfProcessorBus:4;       ///< Bit27:24 Error information is
   1719                                     ///<   available for the 1st, 2nd, 3rd,
   1720                                     ///<   and 4th level processor bus
   1721                                     ///<   hierarchy.
   1722  UINT64 InfoOfRegisterFile:4;       ///< Bit31:28 Error information is
   1723                                     ///<   available on register file
   1724                                     ///<   structures.
   1725  UINT64 InfoOfMicroArch:4;          ///< Bit47:32, Error information is
   1726                                     ///<   available on micro-architectural
   1727                                     ///<   structures.
   1728  UINT64 Reserved:16;
   1729 } PAL_MC_ERROR_INFO_LEVEL_INDEX;
   1730 
   1731 //
   1732 // Value of PAL_MC_ERROR_INFO.ErrorTypeIndex
   1733 //
   1734 #define PAL_ERR_INFO_BY_LEVEL_INDEX               0
   1735 #define PAL_ERR_INFO_TARGET_ADDRESS               1
   1736 #define PAL_ERR_INFO_REQUESTER_IDENTIFIER         2
   1737 #define PAL_ERR_INFO_REPONSER_INDENTIFIER         3
   1738 #define PAL_ERR_INFO_PRECISE_INSTRUCTION_POINTER  4
   1739 
   1740 typedef struct {
   1741   UINT64  Operation:4;                  ///< Bit3:0, Type of cache operation that caused
   1742                                         ///< the machine check: 0 - unknown or internal
   1743                                         ///< error 1 - load 2 - store 3 - instruction
   1744                                         ///< fetch or instruction prefetch 4 - data
   1745                                         ///< prefetch (both hardware and software) 5 -
   1746                                         ///< snoop (coherency check) 6 - cast out
   1747                                         ///< (explicit or implicit write-back of a cache
   1748                                         ///< line) 7 - move in (cache line fill)
   1749 
   1750   UINT64  FailedCacheLevel:2;           ///< Bit5:4 Level of cache where the
   1751                                         ///< error occurred. A value of 0
   1752                                         ///< indicates the first level of cache.
   1753   UINT64  Reserved1:2;
   1754   UINT64  FailedInDataPart:1;           ///< Bit8, Failure located in the data part of the cache line.
   1755   UINT64  FailedInTagPart:1;            ///< Bit9, Failure located in the tag part of the cache line.
   1756   UINT64  FailedInDataCache:1;          ///< Bit10, Failure located in the data cache
   1757 
   1758   UINT64  FailedInInsCache:1;           ///< Bit11, Failure located in the
   1759                                         ///< instruction cache.
   1760 
   1761   UINT64  Mesi:3;                       ///< Bit14:12,  0 - cache line is invalid. 1 - cache
   1762                                         ///< line is held shared. 2 - cache line is held
   1763                                         ///< exclusive. 3 - cache line is modified. All other
   1764                                         ///< values are reserved.
   1765 
   1766   UINT64  MesiIsValid:1;                ///< Bit15, The mesi field in the cache_check
   1767                                         ///< parameter is valid.
   1768 
   1769   UINT64  FailedWay:5;                  ///< Bit20:16, Failure located in the way of
   1770                                         ///< the cache indicated by this value.
   1771 
   1772   UINT64  WayIndexIsValid:1;            ///< Bit21, The way and index field in the
   1773                                         ///< cache_check parameter is valid.
   1774 
   1775   UINT64  Reserved2:1;
   1776   UINT64  MultipleBitsError:1;          ///< Bit23, A multiple-bit error was
   1777                                         ///< detected, and data was poisoned for
   1778                                         ///< the corresponding cache line during
   1779                                         ///< castout.
   1780   UINT64  Reserved3:8;
   1781   UINT64  IndexOfCacheLineError:20;     ///< Bit51:32, Index of the cache
   1782                                         ///< line where the error occurred.
   1783   UINT64  Reserved4:2;
   1784 
   1785   UINT64  InstructionSet:1;             ///< Bit54, Instruction set. If this value
   1786                                         ///<   is set to zero, the instruction that
   1787                                         ///<   generated the machine check was an
   1788                                         ///<   Intel Itanium instruction. If this bit
   1789                                         ///<   is set to one, the instruction that
   1790                                         ///<   generated the machine check was IA-32
   1791                                         ///<   instruction.
   1792 
   1793   UINT64  InstructionSetIsValid:1;      ///< Bit55, The is field in the
   1794                                         ///< cache_check parameter is valid.
   1795 
   1796   UINT64  PrivilegeLevel:2;             ///< Bit57:56, Privilege level. The
   1797                                         ///<   privilege level of the instruction
   1798                                         ///<   bundle responsible for generating the
   1799                                         ///<   machine check.
   1800 
   1801   UINT64  PrivilegeLevelIsValide:1;     ///< Bit58, The pl field of the
   1802                                         ///<   cache_check parameter is
   1803                                         ///<   valid.
   1804 
   1805   UINT64  McCorrected:1;                ///< Bit59, Machine check corrected: This bit
   1806                                         ///<   is set to one to indicate that the machine
   1807                                         ///<   check has been corrected.
   1808 
   1809   UINT64  TargetAddressIsValid:1;       ///< Bit60, Target address is valid:
   1810                                         ///< This bit is set to one to
   1811                                         ///< indicate that a valid target
   1812                                         ///< address has been logged.
   1813 
   1814   UINT64  RequesterIdentifier:1;        ///< Bit61, Requester identifier: This
   1815                                         ///<   bit is set to one to indicate that
   1816                                         ///<   a valid requester identifier has
   1817                                         ///<   been logged.
   1818 
   1819   UINT64  ResponserIdentifier:1;        ///< Bit62, Responder identifier: This
   1820                                         ///<   bit is set to one to indicate that
   1821                                         ///<   a valid responder identifier has
   1822                                         ///<   been logged.
   1823 
   1824   UINT64  PreciseInsPointer:1;          ///< Bit63,  Precise instruction pointer.
   1825                                         ///< This bit is set to one to indicate
   1826                                         ///< that a valid precise instruction
   1827                                         ///< pointer has been logged.
   1828 
   1829 } PAL_CACHE_CHECK_INFO;
   1830 
   1831 
   1832 typedef struct {
   1833   UINT64  FailedSlot:8;                 ///< Bit7:0, Slot number of the translation
   1834                                         ///< register where the failure occurred.
   1835   UINT64  FailedSlotIsValid:1;          ///< Bit8, The tr_slot field in the
   1836                                         ///< TLB_check parameter is valid.
   1837   UINT64  Reserved1 :1;
   1838   UINT64  TlbLevel:2;                   ///< Bit11:10,  The level of the TLB where the
   1839                                         ///< error occurred. A value of 0 indicates the
   1840                                         ///< first level of TLB
   1841   UINT64  Reserved2 :4;
   1842 
   1843   UINT64  FailedInDataTr:1;             ///< Bit16, Error occurred in the data
   1844                                         ///< translation registers.
   1845 
   1846   UINT64  FailedInInsTr:1;              ///< Bit17, Error occurred in the instruction
   1847                                         ///< translation registers
   1848 
   1849   UINT64  FailedInDataTc:1;             ///< Bit18, Error occurred in data
   1850                                         ///< translation cache.
   1851 
   1852   UINT64  FailedInInsTc:1;              ///< Bit19, Error occurred in the instruction
   1853                                         ///< translation cache.
   1854 
   1855   UINT64  FailedOperation:4;            ///< Bit23:20, Type of cache operation that
   1856                                         ///<   caused the machine check: 0 - unknown
   1857                                         ///<   1 - TLB access due to load instruction
   1858                                         ///<   2 - TLB access due to store
   1859                                         ///<   instruction 3 - TLB access due to
   1860                                         ///<   instruction fetch or instruction
   1861                                         ///<   prefetch 4 - TLB access due to data
   1862                                         ///<   prefetch (both hardware and software)
   1863                                         ///<   5 - TLB shoot down access 6 - TLB
   1864                                         ///<   probe instruction (probe, tpa) 7 -
   1865                                         ///<   move in (VHPT fill) 8 - purge (insert
   1866                                         ///<   operation that purges entries or a TLB
   1867                                         ///<   purge instruction) All other values
   1868                                         ///<   are reserved.
   1869 
   1870   UINT64  Reserved3:30;
   1871   UINT64  InstructionSet:1;             ///< Bit54, Instruction set. If this value
   1872                                         ///<   is set to zero, the instruction that
   1873                                         ///<   generated the machine check was an
   1874                                         ///<   Intel Itanium instruction. If this bit
   1875                                         ///<   is set to one, the instruction that
   1876                                         ///<   generated the machine check was IA-32
   1877                                         ///<   instruction.
   1878 
   1879   UINT64  InstructionSetIsValid:1;      ///< Bit55, The is field in the
   1880                                         ///< TLB_check parameter is valid.
   1881 
   1882   UINT64  PrivelegeLevel:2;             ///< Bit57:56, Privilege level. The
   1883                                         ///<   privilege level of the instruction
   1884                                         ///<   bundle responsible for generating the
   1885                                         ///<   machine check.
   1886 
   1887   UINT64  PrivelegeLevelIsValid:1;      ///< Bit58,  The pl field of the
   1888                                         ///< TLB_check parameter is valid.
   1889 
   1890   UINT64  McCorrected:1;                ///< Bit59, Machine check corrected: This bit
   1891                                         ///<   is set to one to indicate that the machine
   1892                                         ///<   check has been corrected.
   1893 
   1894   UINT64  TargetAddressIsValid:1;       ///< Bit60, Target address is valid:
   1895                                         ///< This bit is set to one to
   1896                                         ///< indicate that a valid target
   1897                                         ///< address has been logged.
   1898 
   1899   UINT64  RequesterIdentifier:1;        ///< Bit61 Requester identifier: This
   1900                                         ///<   bit is set to one to indicate that
   1901                                         ///<   a valid requester identifier has
   1902                                         ///<   been logged.
   1903 
   1904   UINT64  ResponserIdentifier:1;        ///< Bit62, Responder identifier:  This
   1905                                         ///<   bit is set to one to indicate that
   1906                                         ///<   a valid responder identifier has
   1907                                         ///<   been logged.
   1908 
   1909   UINT64  PreciseInsPointer:1;          ///< Bit63 Precise instruction pointer.
   1910                                         ///<   This bit is set to one to indicate
   1911                                         ///<   that a valid precise instruction
   1912                                         ///<   pointer has been logged.
   1913 } PAL_TLB_CHECK_INFO;
   1914 
   1915 /**
   1916   PAL Procedure - PAL_MC_ERROR_INFO.
   1917 
   1918   Return Processor Machine Check Information and Processor
   1919   Static State for logging by SAL. It is required by Itanium processors. The
   1920   PAL procedure supports the Static Registers calling
   1921   convention. It could be called at physical and virtual mode.
   1922 
   1923   @param Index            Index of PAL_MC_ERROR_INFO within the list of PAL
   1924                           procedures.
   1925   @param InfoIndex        Unsigned 64-bit integer identifying the
   1926                           error information that is being requested.
   1927                           See PAL_MC_ERROR_INFO.InfoIndex.
   1928   @param LevelIndex       8-byte formatted value identifying the
   1929                           structure to return error information
   1930                           on. See PAL_MC_ERROR_INFO_LEVEL_INDEX.
   1931   @param ErrorTypeIndex   Unsigned 64-bit integer denoting the
   1932                           type of error information that is
   1933                           being requested for the structure
   1934                           identified in LevelIndex.
   1935 
   1936   @retval 0               Call completed without error
   1937   @retval -2              Invalid argument
   1938   @retval -3              Call completed with error.
   1939   @retval -6              Argument was valid, but no error
   1940                           information was available
   1941 
   1942   @return R9              Error information returned. The format of this
   1943                           value is dependant on the input values passed.
   1944   @return R10             If this value is zero, all the error information
   1945                           specified by err_type_index has been returned. If
   1946                           this value is one, more structure-specific error
   1947                           information is available and the caller needs to
   1948                           make this procedure call again with level_index
   1949                           unchanged and err_type_index, incremented.
   1950 
   1951 **/
   1952 #define PAL_MC_ERROR_INFO 25
   1953 
   1954 /**
   1955   PAL Procedure - PAL_MC_EXPECTED.
   1956 
   1957   Set/Reset Expected Machine Check Indicator. It is required by
   1958   Itanium processors. The PAL procedure supports the Static Registers calling
   1959   convention. It could be called at physical mode.
   1960 
   1961   @param Index      Index of PAL_MC_EXPECTED within the list of PAL
   1962                     procedures.
   1963   @param Expected   Unsigned integer with a value of 0 or 1 to
   1964                     set or reset the hardware resource
   1965                     PALE_CHECK examines for expected machine
   1966                     checks.
   1967 
   1968   @retval 0         Call completed without error
   1969   @retval -2        Invalid argument
   1970   @retval -3        Call completed with error.
   1971 
   1972   @return R9        Unsigned integer denoting whether a machine check
   1973                     was previously expected.
   1974 
   1975 **/
   1976 #define PAL_MC_EXPECTED 23
   1977 
   1978 /**
   1979   PAL Procedure - PAL_MC_REGISTER_MEM.
   1980 
   1981   Register min-state save area with PAL for machine checks and
   1982   inits. It is required by Itanium processors. The PAL procedure supports the
   1983   Static Registers calling convention. It could be called at
   1984   physical mode.
   1985 
   1986   @param Index    Index of PAL_MC_REGISTER_MEM within the list of PAL
   1987                   procedures.
   1988   @param Address  Physical address of the buffer to be
   1989                   registered with PAL.
   1990 
   1991   @retval 0       Call completed without error
   1992   @retval -2      Invalid argument
   1993   @retval -3      Call completed with error.
   1994 
   1995 **/
   1996 #define PAL_MC_REGISTER_MEM 27
   1997 
   1998 /**
   1999   PAL Procedure - PAL_MC_RESUME.
   2000 
   2001   Restore minimal architected state and return to interrupted
   2002   process. It is required by Itanium processors. The PAL procedure supports the
   2003   Static Registers calling convention. It could be called at
   2004   physical mode.
   2005 
   2006   @param Index        Index of PAL_MC_RESUME within the list of PAL
   2007                       procedures.
   2008   @param SetCmci      Unsigned 64 bit integer denoting whether to
   2009                       set the CMC interrupt. A value of 0 indicates
   2010                       not to set the interrupt, a value of 1
   2011                       indicated to set the interrupt, and all other
   2012                       values are reserved.
   2013   @param SavePtr      Physical address of min-state save area used
   2014                       to used to restore processor state.
   2015   @param NewContext   Unsigned 64-bit integer denoting whether
   2016                       the caller is returning to a new context.
   2017                       A value of 0 indicates the caller is
   2018                       returning to the interrupted context, a
   2019                       value of 1 indicates that the caller is
   2020                       returning to a new context.
   2021 
   2022   @retval -2          Invalid argument
   2023   @retval -3          Call completed with error.
   2024 
   2025 **/
   2026 #define PAL_MC_RESUME 26
   2027 
   2028 /**
   2029   PAL Procedure - PAL_HALT.
   2030 
   2031   Enter the low-power HALT state or an implementation-dependent
   2032   low-power state. It is optinal. The PAL procedure supports the
   2033   Static Registers calling convention. It could be called at
   2034   physical mode.
   2035 
   2036   @param Index        Index of PAL_HALT within the list of PAL
   2037                       procedures.
   2038   @param HaltState    Unsigned 64-bit integer denoting low power
   2039                       state requested.
   2040   @param IoDetailPtr  8-byte aligned physical address pointer to
   2041                       information on the type of I/O
   2042                       (load/store) requested.
   2043 
   2044   @retval 0           Call completed without error
   2045   @retval -1          Unimplemented procedure
   2046   @retval -2          Invalid argument
   2047   @retval -3          Call completed with error.
   2048 
   2049   @return R9          Value returned if a load instruction is requested
   2050                       in the io_detail_ptr
   2051 
   2052 **/
   2053 #define PAL_HALT 28
   2054 
   2055 
   2056 /**
   2057   PAL Procedure - PAL_HALT_INFO.
   2058 
   2059   Return the low power capabilities of the processor. It is
   2060   required by Itanium processors. The PAL procedure supports the
   2061   Stacked Registers calling convention. It could be called at
   2062   physical and virtual mode.
   2063 
   2064   @param Index        Index of PAL_HALT_INFO within the list of PAL
   2065                       procedures.
   2066   @param PowerBuffer  64-bit pointer to a 64-byte buffer aligned
   2067                       on an 8-byte boundary.
   2068 
   2069   @retval 0           Call completed without error
   2070   @retval -2          Invalid argument
   2071   @retval -3          Call completed with error.
   2072 
   2073 **/
   2074 #define PAL_HALT_INFO 257
   2075 
   2076 
   2077 /**
   2078   PAL Procedure - PAL_HALT_LIGHT.
   2079 
   2080   Enter the low power LIGHT HALT state. It is required by
   2081   Itanium processors. The PAL procedure supports the Static Registers calling
   2082   convention. It could be called at physical and virtual mode.
   2083 
   2084   @param Index  Index of PAL_HALT_LIGHT within the list of PAL
   2085                 procedures.
   2086 
   2087   @retval 0     Call completed without error
   2088   @retval -2    Invalid argument
   2089   @retval -3    Call completed with error.
   2090 
   2091 **/
   2092 #define PAL_HALT_LIGHT 29
   2093 
   2094 /**
   2095   PAL Procedure - PAL_CACHE_LINE_INIT.
   2096 
   2097   Initialize tags and data of a cache line for processor
   2098   testing. It is required by Itanium processors. The PAL procedure supports the
   2099   Static Registers calling convention. It could be called at
   2100   physical and virtual mode.
   2101 
   2102   @param Index      Index of PAL_CACHE_LINE_INIT within the list of PAL
   2103                     procedures.
   2104   @param Address    Unsigned 64-bit integer value denoting the
   2105                     physical address from which the physical page
   2106                     number is to be generated. The address must be
   2107                     an implemented physical address, bit 63 must
   2108                     be zero.
   2109   @param DataValue  64-bit data value which is used to
   2110                     initialize the cache line.
   2111 
   2112   @retval 0         Call completed without error
   2113   @retval -2        Invalid argument
   2114   @retval -3        Call completed with error.
   2115 
   2116 **/
   2117 #define PAL_CACHE_LINE_INIT 31
   2118 
   2119 /**
   2120   PAL Procedure - PAL_CACHE_READ.
   2121 
   2122   Read tag and data of a cache line for diagnostic testing. It
   2123   is optional. The PAL procedure supports the
   2124   Satcked Registers calling convention. It could be called at
   2125   physical mode.
   2126 
   2127   @param Index    Index of PAL_CACHE_READ within the list of PAL
   2128                   procedures.
   2129   @param LineId   8-byte formatted value describing where in the
   2130                   cache to read the data.
   2131   @param Address  64-bit 8-byte aligned physical address from
   2132                   which to read the data. The address must be an
   2133                   implemented physical address on the processor
   2134                   model with bit 63 set to zero.
   2135 
   2136   @retval 1       The word at address was found in the
   2137                   cache, but the line was invalid.
   2138   @retval 0       Call completed without error
   2139   @retval -2      Invalid argument
   2140   @retval -3      Call completed with error.
   2141   @retval -5      The word at address was not found in the
   2142                   cache.
   2143   @retval -7      The operation requested is not supported
   2144                   for this cache_type and level.
   2145 
   2146   @return R9      Right-justified value returned from the cache
   2147                   line.
   2148   @return R10     The number of bits returned in data.
   2149   @return R11     The status of the cache line.
   2150 
   2151 **/
   2152 #define PAL_CACHE_READ 259
   2153 
   2154 
   2155 /**
   2156   PAL Procedure - PAL_CACHE_WRITE.
   2157 
   2158   Write tag and data of a cache for diagnostic testing. It is
   2159   optional. The PAL procedure supports the Satcked Registers
   2160   calling convention. It could be called at physical mode.
   2161 
   2162   @param Index    Index of PAL_CACHE_WRITE within the list of PAL
   2163                   procedures.
   2164   @param LineId   8-byte formatted value describing where in the
   2165                   cache to write the data.
   2166   @param Address  64-bit 8-byte aligned physical address at
   2167                   which the data should be written. The address
   2168                   must be an implemented physical address on the
   2169                   processor model with bit 63 set to 0.
   2170   @param Data     Unsigned 64-bit integer value to write into
   2171                   the specified part of the cache.
   2172 
   2173   @retval 0       Call completed without error
   2174   @retval -2      Invalid argument
   2175   @retval -3      Call completed with error.
   2176   @retval -7      The operation requested is not supported
   2177                   for this cache_type and level.
   2178 
   2179 **/
   2180 #define PAL_CACHE_WRITE 260
   2181 
   2182 /**
   2183   PAL Procedure - PAL_TEST_INFO.
   2184 
   2185   Returns alignment and size requirements needed for the memory
   2186   buffer passed to the PAL_TEST_PROC procedure as well as
   2187   information on self-test control words for the processor self
   2188   tests. It is required by Itanium processors. The PAL procedure supports the
   2189   Static Registers calling convention. It could be called at
   2190   physical mode.
   2191 
   2192   @param Index      Index of PAL_TEST_INFO within the list of PAL
   2193                     procedures.
   2194   @param TestPhase  Unsigned integer that specifies which phase
   2195                     of the processor self-test information is
   2196                     being requested on. A value of 0 indicates
   2197                     the phase two of the processor self-test and
   2198                     a value of 1 indicates phase one of the
   2199                     processor self-test. All other values are
   2200                     reserved.
   2201 
   2202   @retval 0         Call completed without error
   2203   @retval -2        Invalid argument
   2204   @retval -3        Call completed with error.
   2205 
   2206   @return R9        Unsigned 64-bit integer denoting the number of
   2207                     bytes of main memory needed to perform the second
   2208                     phase of processor self-test.
   2209   @return R10       Unsigned 64-bit integer denoting the alignment
   2210                     required for the memory buffer.
   2211   @return R11       48-bit wide bit-field indicating if control of
   2212                     the processor self-tests is supported and which
   2213                     bits of the test_control field are defined for
   2214                     use.
   2215 
   2216 **/
   2217 #define PAL_TEST_INFO 37
   2218 
   2219 typedef struct {
   2220   UINT64  BufferSize:56;    ///< Indicates the size in bytes of the memory
   2221                             ///< buffer that is passed to this procedure.
   2222                             ///< BufferSize must be greater than or equal in
   2223                             ///< size to the bytes_needed return value from
   2224                             ///< PAL_TEST_INFO, otherwise this procedure will
   2225                             ///< return with an invalid argument return
   2226                             ///< value.
   2227 
   2228   UINT64  TestPhase:8;      ///< Defines which phase of the processor
   2229                             ///< self-tests are requested to be run. A value
   2230                             ///< of zero indicates to run phase two of the
   2231                             ///< processor self-tests. Phase two of the
   2232                             ///< processor self-tests are ones that require
   2233                             ///< external memory to execute correctly. A
   2234                             ///< value of one indicates to run phase one of
   2235                             ///< the processor self-tests. Phase one of the
   2236                             ///< processor self-tests are tests run during
   2237                             ///< PALE_RESET and do not depend on external
   2238                             ///< memory to run correctly. When the caller
   2239                             ///< requests to have phase one of the processor
   2240                             ///< self-test run via this procedure call, a
   2241                             ///< memory buffer may be needed to save and
   2242                             ///< restore state as required by the PAL calling
   2243                             ///< conventions. The procedure PAL_TEST_INFO
   2244                             ///< informs the caller about the requirements of
   2245                             ///< the memory buffer.
   2246 } PAL_TEST_INFO_INFO;
   2247 
   2248 typedef struct {
   2249   UINT64  TestControl:47;       ///< This is an ordered implementation-specific
   2250                                 ///<   control word that allows the user control
   2251                                 ///<   over the length and runtime of the
   2252                                 ///<   processor self-tests. This control word is
   2253                                 ///<   ordered from the longest running tests up
   2254                                 ///<   to the shortest running tests with bit 0
   2255                                 ///<   controlling the longest running test. PAL
   2256                                 ///<   may not implement all 47-bits of the
   2257                                 ///<   test_control word. PAL communicates if a
   2258                                 ///<   bit provides control by placing a zero in
   2259                                 ///<   that bit. If a bit provides no control,
   2260                                 ///<   PAL will place a one in it. PAL will have
   2261                                 ///<   two sets of test_control bits for the two
   2262                                 ///<   phases of the processor self-test. PAL
   2263                                 ///<   provides information about implemented
   2264                                 ///<   test_control bits at the hand-off from PAL
   2265                                 ///<   to SAL for the firmware recovery check.
   2266                                 ///<   These test_control bits provide control
   2267                                 ///<   for phase one of processor self-test. It
   2268                                 ///<   also provides this information via the PAL
   2269                                 ///<   procedure call PAL_TEST_INFO for both the
   2270                                 ///<   phase one and phase two processor tests
   2271                                 ///<   depending on which information the caller
   2272                                 ///<   is requesting. PAL interprets these bits
   2273                                 ///<   as input parameters on two occasions. The
   2274                                 ///<   first time is when SAL passes control back
   2275                                 ///<   to PAL after the firmware recovery check.
   2276                                 ///<   The second time is when a call to
   2277                                 ///<   PAL_TEST_PROC is made. When PAL interprets
   2278                                 ///<   these bits it will only interpret
   2279                                 ///<   implemented test_control bits and will
   2280                                 ///<   ignore the values located in the
   2281                                 ///<   unimplemented test_control bits. PAL
   2282                                 ///<   interprets the implemented bits such that
   2283                                 ///<   if a bit contains a zero, this indicates
   2284                                 ///<   to run the test. If a bit contains a one,
   2285                                 ///<   this indicates to PAL to skip the test. If
   2286                                 ///<   the cs bit indicates that control is not
   2287                                 ///<    available, the test_control bits will be
   2288                                 ///<   ignored or generate an illegal argument in
   2289                                 ///<   procedure calls if the caller sets these
   2290                                 ///<   bits.
   2291 
   2292   UINT64  ControlSupport:1;     ///< This bit defines if an implementation
   2293                                 ///<  supports control of the PAL self-tests
   2294                                 ///<  via the self-test control word. If
   2295                                 ///<  this bit is 0, the implementation does
   2296                                 ///<  not support control of the processor
   2297                                 ///<  self-tests via the self-test control
   2298                                 ///<  word. If this bit is 1, the
   2299                                 ///<  implementation does support control of
   2300                                 ///<  the processor self-tests via the
   2301                                 ///<  self-test control word. If control is
   2302                                 ///<  not supported, GR37 will be ignored at
   2303                                 ///<  the hand-off between SAL and PAL after
   2304                                 ///<  the firmware recovery check and the
   2305                                 ///<  PAL procedures related to the
   2306                                 ///<  processor self-tests may return
   2307                                 ///<  illegal arguments if a user tries to
   2308                                 ///<  use the self-test control features.
   2309   UINT64  Reserved:16;
   2310 } PAL_SELF_TEST_CONTROL;
   2311 
   2312 typedef struct {
   2313   UINT64  Attributes:8;         ///< Specifies the memory attributes that are
   2314                                 ///<  allowed to be used with the memory buffer
   2315                                 ///<  passed to this procedure. The attributes
   2316                                 ///<  parameter is a vector where each bit
   2317                                 ///<  represents one of the virtual memory
   2318                                 ///<  attributes defined by the architecture.See
   2319                                 ///<  MEMORY_AATRIBUTES. The caller is required
   2320                                 ///<  to support the cacheable attribute for the
   2321                                 ///<  memory buffer, otherwise an invalid
   2322                                 ///<  argument will be returned.
   2323   UINT64  Reserved:8;
   2324   UINT64  TestControl:48;       ///< Is the self-test control word
   2325                                 ///<  corresponding to the test_phase passed.
   2326                                 ///<  This test_control directs the coverage and
   2327                                 ///<  runtime of the processor self-tests
   2328                                 ///<  specified by the test_phase input
   2329                                 ///<  argument. Information on if this
   2330                                 ///<  feature is implemented and the number of
   2331                                 ///<  bits supported can be obtained by the
   2332                                 ///<  PAL_TEST_INFO procedure call. If this
   2333                                 ///<  feature is implemented by the processor,
   2334                                 ///<  the caller can selectively skip parts of
   2335                                 ///<  the processor self-test by setting
   2336                                 ///<  test_control bits to a one. If a bit has a
   2337                                 ///<  zero, this test will be run. The values in
   2338                                 ///<  the unimplemented bits are ignored. If
   2339                                 ///<  PAL_TEST_INFO indicated that the self-test
   2340                                 ///<  control word is not implemented, this
   2341                                 ///<  procedure will return with an invalid
   2342                                 ///<  argument status if the caller sets any of
   2343                                 ///<  the test_control bits. See
   2344                                 ///<  PAL_SELF_TEST_CONTROL.
   2345 } PAL_TEST_CONTROL;
   2346 
   2347 /**
   2348   PAL Procedure - PAL_TEST_PROC.
   2349 
   2350   Perform late processor self test. It is required by Itanium processors. The
   2351   PAL procedure supports the Static Registers calling
   2352   convention. It could be called at physical mode.
   2353 
   2354   @param Index        Index of PAL_TEST_PROC within the list of PAL
   2355                       procedures.
   2356   @param TestAddress  64-bit physical address of main memory
   2357                       area to be used by processor self-test.
   2358                       The memory region passed must be
   2359                       cacheable, bit 63 must be zero.
   2360   @param TestInfo     Input argument specifying the size of the
   2361                       memory buffer passed and the phase of the
   2362                       processor self-test that should be run. See
   2363                       PAL_TEST_INFO.
   2364   @param TestParam    Input argument specifying the self-test
   2365                       control word and the allowable memory
   2366                       attributes that can be used with the memory
   2367                       buffer. See PAL_TEST_CONTROL.
   2368 
   2369   @retval 1           Call completed without error, but hardware
   2370                       failures occurred during self-test.
   2371   @retval 0           Call completed without error
   2372   @retval -2          Invalid argument
   2373   @retval -3          Call completed with error.
   2374 
   2375   @return R9          Formatted 8-byte value denoting the state of the
   2376                       processor after self-test
   2377 
   2378 **/
   2379 #define PAL_TEST_PROC 258
   2380 
   2381 typedef struct {
   2382   UINT32  NumberOfInterruptControllers;     ///< Number of interrupt
   2383                                             ///< controllers currently
   2384                                             ///< enabled on the system.
   2385 
   2386   UINT32  NumberOfProcessors;               ///< Number of processors currently
   2387                                             ///< enabled on the system.
   2388 } PAL_PLATFORM_INFO;
   2389 
   2390 /**
   2391   PAL Procedure - PAL_COPY_INFO.
   2392 
   2393   Return information needed to relocate PAL procedures and PAL
   2394   PMI code to memory. It is required by Itanium processors. The PAL procedure
   2395   supports the Static Registers calling convention. It could be
   2396   called at physical mode.
   2397 
   2398   @param Index              Index of PAL_COPY_INFO within the list of PAL
   2399                             procedures.
   2400   @param CopyType           Unsigned integer denoting type of procedures
   2401                             for which copy information is requested.
   2402   @param PlatformInfo       8-byte formatted value describing the
   2403                             number of processors and the number of
   2404                             interrupt controllers currently enabled
   2405                             on the system. See PAL_PLATFORM_INFO.
   2406   @param McaProcStateInfo   Unsigned integer denoting the number
   2407                             of bytes that SAL needs for the
   2408                             min-state save area for each
   2409                             processor.
   2410 
   2411   @retval 0                 Call completed without error
   2412   @retval -2                Invalid argument
   2413   @retval -3                Call completed with error.
   2414 
   2415   @return R9                Unsigned integer denoting the number of bytes of
   2416                             PAL information that must be copied to main
   2417                             memory.
   2418   @return R10               Unsigned integer denoting the starting alignment
   2419                             of the data to be copied.
   2420 
   2421 **/
   2422 #define PAL_COPY_INFO 30
   2423 
   2424 /**
   2425   PAL Procedure - PAL_COPY_PAL.
   2426 
   2427   Relocate PAL procedures and PAL PMI code to memory. It is
   2428   required by Itanium processors. The PAL procedure supports the Stacked
   2429   Registers calling convention. It could be called at physical
   2430   mode.
   2431 
   2432   @param Index          Index of PAL_COPY_PAL within the list of PAL
   2433                         procedures.
   2434   @param TargetAddress  Physical address of a memory buffer to
   2435                         copy relocatable PAL procedures and PAL
   2436                         PMI code.
   2437   @param AllocSize      Unsigned integer denoting the size of the
   2438                         buffer passed by SAL for the copy operation.
   2439   @param CopyOption     Unsigned integer indicating whether
   2440                         relocatable PAL code and PAL PMI code
   2441                         should be copied from firmware address
   2442                         space to main memory.
   2443 
   2444   @retval 0             Call completed without error
   2445   @retval -2            Invalid argument
   2446   @retval -3            Call completed with error.
   2447 
   2448   @return R9            Unsigned integer denoting the offset of PAL_PROC
   2449                         in the relocatable segment copied.
   2450 
   2451 **/
   2452 #define PAL_COPY_PAL 256
   2453 
   2454 /**
   2455   PAL Procedure - PAL_ENTER_IA_32_ENV.
   2456 
   2457   Enter IA-32 System environment. It is optional. The PAL
   2458   procedure supports the Static Registers calling convention.
   2459   It could be called at physical mode.
   2460 
   2461   Note: Since this is a special call, it does not follow the PAL
   2462   static register calling convention. GR28 contains the index of
   2463   PAL_ENTER_IA_32_ENV within the list of PAL procedures. All other
   2464   input arguments including GR29-GR31 are setup by SAL to values
   2465   as required by the IA-32 operating system defined in Table
   2466   11-67. The registers that are designated as preserved, scratch,
   2467   input arguments and procedure return values by the static
   2468   procedure calling convention are not followed by this call. For
   2469   instance, GR5 and GR6 need not be preserved since these are
   2470   regarded as scratch by the IA-32 operating system. Note: In an
   2471   MP system, this call must be COMPLETED on the first CPU to enter
   2472   the IA-32 System Environment (may or may not be the BSP) prior
   2473   to being called on the remaining processors in the MP system.
   2474 
   2475   @param Index  GR28 contains the index of the
   2476                 PAL_ENTER_IA_32_ENV call within the list of PAL
   2477                 procedures.
   2478 
   2479 
   2480   @retval  The status is returned in GR4.
   2481                   -1 - Un-implemented procedure 0 JMPE detected
   2482                   at privilege level
   2483 
   2484                   0 - 1 SAL allocated buffer for IA-32 System
   2485                   Environment operation is too small
   2486 
   2487                   2 - IA-32 Firmware Checksum Error
   2488 
   2489                   3 -  SAL allocated buffer for IA-32 System
   2490                   Environment operation is not properly aligned
   2491 
   2492                   4 - Error in SAL MP Info Table
   2493 
   2494                   5 - Error in SAL Memory Descriptor Table
   2495 
   2496                   6 - Error in SAL System Table
   2497 
   2498                   7 - Inconsistent IA-32 state
   2499 
   2500                   8 - IA-32 Firmware Internal Error
   2501 
   2502                   9 - IA-32 Soft Reset (Note: remaining register
   2503                   state is undefined for this termination
   2504                   reason)
   2505 
   2506                   10 - Machine Check Error
   2507 
   2508                   11 - Error in SAL I/O Intercept Table
   2509 
   2510                   12 - Processor exit due to other processor in
   2511                   MP system terminating the IA32 system
   2512                   environment. (Note: remaining register state
   2513                   is undefined for this termination reason.)
   2514 
   2515                   13 - Itanium architecture-based state
   2516                   corruption by either SAL PMI handler or I/O
   2517                   Intercept callback function.
   2518 
   2519 
   2520 **/
   2521 #define PAL_ENTER_IA_32_ENV 33
   2522 
   2523 /**
   2524   PAL Procedure - PAL_PMI_ENTRYPOINT.
   2525 
   2526   Register PMI memory entrypoints with processor. It is required
   2527   by Itanium processors. The PAL procedure supports the Stacked Registers
   2528   calling convention. It could be called at physical mode.
   2529 
   2530   @param Index        Index of PAL_PMI_ENTRYPOINT within the list of
   2531                       PAL procedures.
   2532   @param SalPmiEntry  256-byte aligned physical address of SAL
   2533                       PMI entrypoint in memory.
   2534 
   2535   @retval 0           Call completed without error
   2536   @retval -2          Invalid argument
   2537   @retval -3          Call completed with error.
   2538 
   2539 **/
   2540 #define PAL_PMI_ENTRYPOINT 32
   2541 
   2542 
   2543 /**
   2544 
   2545   The ASCII brand identification string will be copied to the
   2546   address specified in the address input argument. The processor
   2547   brand identification string is defined to be a maximum of 128
   2548   characters long; 127 bytes will contain characters and the 128th
   2549   byte is defined to be NULL (0). A processor may return less than
   2550   the 127 ASCII characters as long as the string is null
   2551   terminated. The string length will be placed in the brand_info
   2552   return argument.
   2553 
   2554 **/
   2555 #define PAL_BRAND_INFO_ID_REQUEST  0
   2556 
   2557 /**
   2558   PAL Procedure - PAL_BRAND_INFO.
   2559 
   2560   Provides processor branding information. It is optional by
   2561   Itanium processors. The PAL procedure supports the Stacked Registers calling
   2562   convention. It could be called at physical and Virtual mode.
   2563 
   2564   @param Index        Index of PAL_BRAND_INFO within the list of PAL
   2565                       procedures.
   2566   @param InfoRequest  Unsigned 64-bit integer specifying the
   2567                       information that is being requested. (See
   2568                       PAL_BRAND_INFO_ID_REQUEST)
   2569   @param Address      Unsigned 64-bit integer specifying the
   2570                       address of the 128-byte block to which the
   2571                       processor brand string shall be written.
   2572 
   2573   @retval 0           Call completed without error
   2574   @retval -1          Unimplemented procedure
   2575   @retval -2          Invalid argument
   2576   @retval -3          Call completed with error.
   2577   @retval -6          Input argument is not implemented.
   2578 
   2579   @return R9          Brand information returned. The format of this
   2580                       value is dependent on the input values passed.
   2581 
   2582 **/
   2583 #define PAL_BRAND_INFO  274
   2584 
   2585 /**
   2586   PAL Procedure - PAL_GET_HW_POLICY.
   2587 
   2588   Returns the current hardware resource sharing policy of the
   2589   processor. It is optional by Itanium processors. The PAL procedure supports
   2590   the Static Registers calling convention. It could be called at
   2591   physical and Virtual mode.
   2592 
   2593 
   2594   @param Index            Index of PAL_GET_HW_POLICY within the list of PAL
   2595                           procedures.
   2596   @param ProcessorNumber  Unsigned 64-bit integer that specifies
   2597                           for which logical processor
   2598                           information is being requested. This
   2599                           input argument must be zero for the
   2600                           first call to this procedure and can
   2601                           be a maximum value of one less than
   2602                           the number of logical processors
   2603                           impacted by the hardware resource
   2604                           sharing policy, which is returned by
   2605                           the R10 return value.
   2606 
   2607   @retval 0               Call completed without error
   2608   @retval -1              Unimplemented procedure
   2609   @retval -2              Invalid argument
   2610   @retval -3              Call completed with error.
   2611   @retval -9              Call requires PAL memory buffer.
   2612 
   2613   @return R9              Unsigned 64-bit integer representing the current
   2614                           hardware resource sharing policy.
   2615   @return R10             Unsigned 64-bit integer that returns the number
   2616                           of logical processors impacted by the policy
   2617                           input argument.
   2618   @return R11             Unsigned 64-bit integer containing the logical
   2619                           address of one of the logical processors
   2620                           impacted by policy modification.
   2621 
   2622 **/
   2623 #define PAL_GET_HW_POLICY   48
   2624 
   2625 
   2626 //
   2627 // Value of PAL_SET_HW_POLICY.Policy
   2628 //
   2629 #define PAL_SET_HW_POLICY_PERFORMANCE               0
   2630 #define PAL_SET_HW_POLICY_FAIRNESS                  1
   2631 #define PAL_SET_HW_POLICY_HIGH_PRIORITY             2
   2632 #define PAL_SET_HW_POLICY_EXCLUSIVE_HIGH_PRIORITY   3
   2633 
   2634 /**
   2635   PAL Procedure - PAL_SET_HW_POLICY.
   2636 
   2637   Sets the current hardware resource sharing policy of the
   2638   processor. It is optional by Itanium processors. The PAL procedure supports
   2639   the Static Registers calling convention. It could be called at
   2640   physical and Virtual mode.
   2641 
   2642   @param Index    Index of PAL_SET_HW_POLICY within the list of PAL
   2643                   procedures.
   2644   @param Policy   Unsigned 64-bit integer specifying the hardware
   2645                   resource sharing policy the caller is setting.
   2646                   See Value of PAL_SET_HW_POLICY.Policy above.
   2647 
   2648   @retval 1       Call completed successfully but could not
   2649                   change the hardware policy since a
   2650                   competing logical processor is set in
   2651                   exclusive high priority.
   2652   @retval 0       Call completed without error
   2653   @retval -1      Unimplemented procedure
   2654   @retval -2      Invalid argument
   2655   @retval -3      Call completed with error.
   2656   @retval -9      Call requires PAL memory buffer.
   2657 
   2658 **/
   2659 #define PAL_SET_HW_POLICY   49
   2660 
   2661 typedef struct {
   2662   UINT64  Mode:3;                   ///< Bit2:0, Indicates the mode of operation for this
   2663                                     ///<    procedure: 0 - Query mode 1 - Error inject mode
   2664                                     ///<    (err_inj should also be specified) 2 - Cancel
   2665                                     ///<    outstanding trigger. All other fields in
   2666                                     ///<    PAL_MC_ERROR_TYPE_INFO,
   2667                                     ///<    PAL_MC_ERROR_STRUCTURE_INFO and
   2668                                     ///<    PAL_MC_ERROR_DATA_BUFFER are ignored. All other
   2669                                     ///<    values are reserved.
   2670 
   2671   UINT64  ErrorInjection:3;         ///< Bit5:3, indicates the mode of error
   2672                                     ///<  injection: 0 - Error inject only (no
   2673                                     ///<  error consumption) 1 - Error inject
   2674                                     ///<  and consume All other values are
   2675                                     ///<  reserved.
   2676 
   2677   UINT64  ErrorSeverity:2;          ///< Bit7:6, indicates the severity desired
   2678                                     ///<  for error injection/query. Definitions
   2679                                     ///<  of the different error severity types
   2680                                     ///<  0 - Corrected error 1 - Recoverable
   2681                                     ///<  error 2 - Fatal error 3 - Reserved
   2682 
   2683   UINT64  ErrorStructure:5;         ///< Bit12:8, Indicates the structure
   2684                                     ///<  identification for error
   2685                                     ///<  injection/query: 0 - Any structure
   2686                                     ///<  (cannot be used during query mode).
   2687                                     ///<  When selected, the structure type used
   2688                                     ///<  for error injection is determined by
   2689                                     ///<  PAL. 1 - Cache 2 - TLB 3 - Register
   2690                                     ///<  file 4 - Bus/System interconnect 5-15
   2691                                     ///<  - Reserved 16-31 - Processor
   2692                                     ///<  specific error injection
   2693                                     ///<  capabilities.ErrorDataBuffer is used
   2694                                     ///<  to specify error types. Please refer
   2695                                     ///<  to the processor specific
   2696                                     ///<  documentation for additional details.
   2697 
   2698   UINT64  StructureHierarchy:3;     ///< Bit15:13, Indicates the structure
   2699                                     ///<  hierarchy for error
   2700                                     ///<  injection/query: 0 - Any level of
   2701                                     ///<  hierarchy (cannot be used during
   2702                                     ///<  query mode). When selected, the
   2703                                     ///<  structure hierarchy used for error
   2704                                     ///<  injection is determined by PAL. 1
   2705                                     ///<  - Error structure hierarchy
   2706                                     ///<  level-1 2 - Error structure
   2707                                     ///<  hierarchy level-2 3 - Error
   2708                                     ///<  structure hierarchy level-3 4 -
   2709                                     ///<  Error structure hierarchy level-4
   2710                                     ///<  All other values are reserved.
   2711 
   2712   UINT64  Reserved:32;              ///< Reserved 47:16 Reserved
   2713 
   2714   UINT64  ImplSpec:16;              ///< Bit63:48, Processor specific error injection capabilities.
   2715 } PAL_MC_ERROR_TYPE_INFO;
   2716 
   2717 typedef struct {
   2718   UINT64  StructInfoIsValid:1;              ///< Bit0 When 1, indicates that the
   2719                                             ///< structure information fields
   2720                                             ///< (c_t,cl_p,cl_id) are valid and
   2721                                             ///< should be used for error injection.
   2722                                             ///< When 0, the structure information
   2723                                             ///< fields are ignored, and the values
   2724                                             ///< of these fields used for error
   2725                                             ///< injection are
   2726                                             ///< implementation-specific.
   2727 
   2728   UINT64  CacheType:2;                      ///< Bit2:1  Indicates which cache should be used
   2729                                             ///< for error injection: 0 - Reserved 1 -
   2730                                             ///< Instruction cache 2 - Data or unified cache
   2731                                             ///< 3 - Reserved
   2732 
   2733   UINT64  PortionOfCacheLine:3;             ///< Bit5:3 Indicates the portion of the
   2734                                             ///<   cache line where the error should
   2735                                             ///<   be injected: 0 - Reserved 1 - Tag
   2736                                             ///<   2 - Data 3 - mesi All other
   2737                                             ///<   values are reserved.
   2738 
   2739   UINT64  Mechanism:3;                      ///< Bit8:6 Indicates which mechanism is used to
   2740                                             ///< identify the cache line to be used for error
   2741                                             ///< injection: 0 - Reserved 1 - Virtual address
   2742                                             ///< provided in the inj_addr field of the buffer
   2743                                             ///< pointed to by err_data_buffer should be used
   2744                                             ///< to identify the cache line for error
   2745                                             ///< injection. 2 - Physical address provided in
   2746                                             ///< the inj_addr field of the buffer pointed to
   2747                                             ///< by err_data_buffershould be used to identify
   2748                                             ///< the cache line for error injection. 3 - way
   2749                                             ///< and index fields provided in err_data_buffer
   2750                                             ///< should be used to identify the cache line
   2751                                             ///< for error injection. All other values are
   2752                                             ///< reserved.
   2753 
   2754   UINT64  DataPoisonOfCacheLine:1;          ///< Bit9 When 1, indicates that a
   2755                                             ///< multiple bit, non-correctable
   2756                                             ///< error should be injected in the
   2757                                             ///< cache line specified by cl_id.
   2758                                             ///< If this injected error is not
   2759                                             ///< consumed, it may eventually
   2760                                             ///< cause a data-poisoning event
   2761                                             ///< resulting in a corrected error
   2762                                             ///< signal, when the associated
   2763                                             ///< cache line is cast out (implicit
   2764                                             ///< or explicit write-back of the
   2765                                             ///< cache line). The error severity
   2766                                             ///< specified by err_sev in
   2767                                             ///< err_type_info must be set to 0
   2768                                             ///< (corrected error) when this bit
   2769                                             ///< is set.
   2770 
   2771   UINT64  Reserved1:22;
   2772 
   2773   UINT64  TrigerInfoIsValid:1;              ///< Bit32 When 1, indicates that the
   2774                                             ///< trigger information fields (trigger,
   2775                                             ///< trigger_pl) are valid and should be
   2776                                             ///< used for error injection. When 0,
   2777                                             ///< the trigger information fields are
   2778                                             ///< ignored and error injection is
   2779                                             ///< performed immediately.
   2780 
   2781   UINT64  Triger:4;                         ///< Bit36:33 Indicates the operation type to be
   2782                                             ///<   used as the error trigger condition. The
   2783                                             ///<   address corresponding to the trigger is
   2784                                             ///<   specified in the trigger_addr field of the
   2785                                             ///<   buffer pointed to by err_data_buffer: 0 -
   2786                                             ///<   Instruction memory access. The trigger match
   2787                                             ///<   conditions for this operation type are similar
   2788                                             ///<   to the IBR address breakpoint match conditions
   2789                                             ///<   1 - Data memory access. The trigger match
   2790                                             ///<   conditions for this operation type are similar
   2791                                             ///<   to the DBR address breakpoint match conditions
   2792                                             ///<   All other values are reserved.
   2793 
   2794   UINT64  PrivilegeOfTriger:3;              ///< Bit39:37  Indicates the privilege
   2795                                             ///< level of the context during which
   2796                                             ///< the error should be injected: 0 -
   2797                                             ///< privilege level 0 1 - privilege
   2798                                             ///< level 1 2 - privilege level 2 3 -
   2799                                             ///< privilege level 3 All other values
   2800                                             ///< are reserved. If the implementation
   2801                                             ///< does not support privilege level
   2802                                             ///< qualifier for triggers (i.e. if
   2803                                             ///< trigger_pl is 0 in the capabilities
   2804                                             ///< vector), this field is ignored and
   2805                                             ///< triggers can be taken at any
   2806                                             ///< privilege level.
   2807 
   2808   UINT64  Reserved2:24;
   2809 } PAL_MC_ERROR_STRUCT_INFO;
   2810 
   2811 /**
   2812 
   2813    Buffer Pointed to by err_data_buffer - TLB
   2814 
   2815 **/
   2816 typedef struct {
   2817   UINT64  TrigerAddress;
   2818   UINT64  VirtualPageNumber:52;
   2819   UINT64  Reserved1:8;
   2820   UINT64  RegionId:24;
   2821   UINT64  Reserved2:40;
   2822 } PAL_MC_ERROR_DATA_BUFFER_TLB;
   2823 
   2824 /**
   2825   PAL Procedure - PAL_MC_ERROR_INJECT.
   2826 
   2827   Injects the requested processor error or returns information
   2828   on the supported injection capabilities for this particular
   2829   processor implementation. It is optional by Itanium processors. The PAL
   2830   procedure supports the Stacked Registers calling convention.
   2831   It could be called at physical and Virtual mode.
   2832 
   2833   @param Index            Index of PAL_MC_ERROR_INJECT within the list of PAL
   2834                           procedures.
   2835   @param ErrorTypeInfo    Unsigned 64-bit integer specifying the
   2836                           first level error information which
   2837                           identifies the error structure and
   2838                           corresponding structure hierarchy, and
   2839                           the error severity.
   2840   @param ErrorStructInfo  Unsigned 64-bit integer identifying
   2841                           the optional structure specific
   2842                           information that provides the  second
   2843                           level details for the requested error.
   2844   @param ErrorDataBuffer  64-bit physical address of a buffer
   2845                           providing additional parameters for
   2846                           the requested error. The address of
   2847                           this buffer must be 8-byte aligned.
   2848 
   2849   @retval 0               Call completed without error
   2850   @retval -1              Unimplemented procedure
   2851   @retval -2              Invalid argument
   2852   @retval -3              Call completed with error.
   2853   @retval -4              Call completed with error; the requested
   2854                           error could not be injected due to failure in
   2855                           locating the target location in the specified
   2856                           structure.
   2857   @retval -5              Argument was valid, but requested error
   2858                           injection capability is not supported.
   2859   @retval -9              Call requires PAL memory buffer.
   2860 
   2861   @return R9              64-bit vector specifying the supported error
   2862                           injection capabilities for the input argument
   2863                           combination of struct_hier, err_struct and
   2864                           err_sev fields in ErrorTypeInfo.
   2865   @return R10             64-bit vector specifying the architectural
   2866                           resources that are used by the procedure.
   2867 
   2868 **/
   2869 #define PAL_MC_ERROR_INJECT 276
   2870 
   2871 
   2872 //
   2873 // Types of PAL_GET_PSTATE.Type
   2874 //
   2875 #define PAL_GET_PSTATE_RECENT                 0
   2876 #define PAL_GET_PSTATE_AVERAGE_NEW_START      1
   2877 #define PAL_GET_PSTATE_AVERAGE                2
   2878 #define PAL_GET_PSTATE_NOW                    3
   2879 
   2880 /**
   2881   PAL Procedure - PAL_GET_PSTATE.
   2882 
   2883   Returns the performance index of the processor. It is optional
   2884   by Itanium processors. The PAL procedure supports the Stacked Registers
   2885   calling convention. It could be called at physical and Virtual
   2886   mode.
   2887 
   2888   @param Index  Index of PAL_GET_PSTATE within the list of PAL
   2889                 procedures.
   2890   @param Type   Type of performance_index value to be returned
   2891                 by this procedure.See PAL_GET_PSTATE.Type above.
   2892 
   2893   @retval 1     Call completed without error, but accuracy
   2894                 of performance index has been impacted by a
   2895                 thermal throttling event, or a
   2896                 hardware-initiated event.
   2897   @retval 0     Call completed without error
   2898   @retval -1    Unimplemented procedure
   2899   @retval -2    Invalid argument
   2900   @retval -3    Call completed with error.
   2901   @retval -9    Call requires PAL memory buffer.
   2902 
   2903   @return R9    Unsigned integer denoting the processor
   2904                 performance for the time duration since the last
   2905                 PAL_GET_PSTATE procedure call was made. The
   2906                 value returned is between 0 and 100, and is
   2907                 relative to the performance index of the highest
   2908                 available P-state.
   2909 
   2910 **/
   2911 #define PAL_GET_PSTATE      262
   2912 
   2913 /**
   2914 
   2915   Layout of PAL_PSTATE_INFO.PStateBuffer
   2916 
   2917 **/
   2918 typedef struct {
   2919   UINT32  PerformanceIndex:7;
   2920   UINT32  Reserved1:5;
   2921   UINT32  TypicalPowerDissipation:20;
   2922   UINT32  TransitionLatency1;
   2923   UINT32  TransitionLatency2;
   2924   UINT32  Reserved2;
   2925 } PAL_PSTATE_INFO_BUFFER;
   2926 
   2927 
   2928 /**
   2929   PAL Procedure - PAL_PSTATE_INFO.
   2930 
   2931   Returns information about the P-states supported by the
   2932   processor. It is optional by Itanium processors. The PAL procedure supports
   2933   the Static Registers calling convention. It could be called
   2934   at physical and Virtual mode.
   2935 
   2936   @param Index          Index of PAL_PSTATE_INFO within the list of PAL
   2937                         procedures.
   2938   @param PStateBuffer   64-bit pointer to a 256-byte buffer
   2939                         aligned on an 8-byte boundary. See
   2940                         PAL_PSTATE_INFO_BUFFER above.
   2941 
   2942   @retval 0             Call completed without error
   2943   @retval -1            Unimplemented procedure
   2944   @retval -2            Invalid argument
   2945   @retval -3            Call completed with error.
   2946 
   2947   @return R9            Unsigned integer denoting the number of P-states
   2948                         supported. The maximum value of this field is 16.
   2949   @return R10           Dependency domain information
   2950 
   2951 **/
   2952 #define PAL_PSTATE_INFO     44
   2953 
   2954 
   2955 /**
   2956   PAL Procedure - PAL_SET_PSTATE.
   2957 
   2958   To request a processor transition to a given P-state. It is
   2959   optional by Itanium processors. The PAL procedure supports the Stacked
   2960   Registers calling convention. It could be called at physical
   2961   and Virtual mode.
   2962 
   2963   @param Index        Index of PAL_SET_PSTATE within the list of PAL
   2964                       procedures.
   2965   @param PState       Unsigned integer denoting the processor
   2966                       P-state being requested.
   2967   @param ForcePState  Unsigned integer denoting whether the
   2968                       P-state change should be forced for the
   2969                       logical processor.
   2970 
   2971   @retval 1           Call completed without error, but
   2972                       transition request was not accepted
   2973   @retval 0           Call completed without error
   2974   @retval -1          Unimplemented procedure
   2975   @retval -2          Invalid argument
   2976   @retval -3          Call completed with error.
   2977   @retval -9          Call requires PAL memory buffer.
   2978 
   2979 **/
   2980 #define PAL_SET_PSTATE      263
   2981 
   2982 /**
   2983   PAL Procedure - PAL_SHUTDOWN.
   2984 
   2985   Put the logical processor into a low power state which can be
   2986   exited only by a reset event. It is optional by Itanium processors. The PAL
   2987   procedure supports the Static Registers calling convention. It
   2988   could be called at physical mode.
   2989 
   2990   @param Index            Index of PAL_SHUTDOWN within the list of PAL
   2991                           procedures.
   2992   @param NotifyPlatform   8-byte aligned physical address
   2993                           pointer providing details on how to
   2994                           optionally notify the platform that
   2995                           the processor is entering a shutdown
   2996                           state.
   2997 
   2998   @retval -1              Unimplemented procedure
   2999   @retval -2              Invalid argument
   3000   @retval -3              Call completed with error.
   3001   @retval -9              Call requires PAL memory buffer.
   3002 
   3003 **/
   3004 #define PAL_SHUTDOWN        45
   3005 
   3006 /**
   3007 
   3008   Layout of PAL_MEMORY_BUFFER.ControlWord
   3009 
   3010 **/
   3011 typedef struct {
   3012   UINT64  Registration:1;
   3013   UINT64  ProbeInterrupt:1;
   3014   UINT64  Reserved:62;
   3015 } PAL_MEMORY_CONTROL_WORD;
   3016 
   3017 /**
   3018   PAL Procedure - PAL_MEMORY_BUFFER.
   3019 
   3020   Provides cacheable memory to PAL for exclusive use during
   3021   runtime. It is optional by Itanium processors. The PAL procedure supports the
   3022   Static Registers calling convention. It could be called at
   3023   physical mode.
   3024 
   3025   @param Index        Index of PAL_MEMORY_BUFFER within the list of PAL
   3026                       procedures.
   3027   @param BaseAddress  Physical address of the memory buffer
   3028                       allocated for PAL use.
   3029   @param AllocSize    Unsigned integer denoting the size of the
   3030                       memory buffer.
   3031   @param ControlWord  Formatted bit vector that provides control
   3032                       options for this procedure. See
   3033                       PAL_MEMORY_CONTROL_WORD above.
   3034 
   3035   @retval 1           Call has not completed a buffer relocation
   3036                       due to a pending interrupt
   3037   @retval 0           Call completed without error
   3038   @retval -1          Unimplemented procedure
   3039   @retval -2          Invalid argument
   3040   @retval -3          Call completed with error.
   3041   @retval -9          Call requires PAL memory buffer.
   3042 
   3043   @return R9          Returns the minimum size of the memory buffer
   3044                       required if the alloc_size input argument was
   3045                       not large enough.
   3046 
   3047 **/
   3048 #define PAL_MEMORY_BUFFER   277
   3049 
   3050 
   3051 /**
   3052   PAL Procedure - PAL_VP_CREATE.
   3053 
   3054   Initializes a new vpd for the operation of a new virtual
   3055   processor in the virtual environment. It is optional by Itanium processors.
   3056   The PAL procedure supports the Stacked Registers calling
   3057   convention. It could be called at Virtual mode.
   3058 
   3059   @param Index            Index of PAL_VP_CREATE within the list of PAL
   3060                           procedures.
   3061   @param Vpd              64-bit host virtual pointer to the Virtual
   3062                           Processor Descriptor (VPD).
   3063   @param HostIva          64-bit host virtual pointer to the host IVT
   3064                           for the virtual processor
   3065   @param OptionalHandler  64-bit non-zero host-virtual pointer
   3066                           to an optional handler for
   3067                           virtualization intercepts.
   3068 
   3069   @retval 0               Call completed without error
   3070   @retval -1              Unimplemented procedure
   3071   @retval -2              Invalid argument
   3072   @retval -3              Call completed with error.
   3073   @retval -9              Call requires PAL memory buffer.
   3074 
   3075 **/
   3076 #define PAL_VP_CREATE       265
   3077 
   3078 /**
   3079 
   3080   Virtual Environment Information Parameter
   3081 
   3082 **/
   3083 typedef struct {
   3084   UINT64    Reserved1:8;
   3085   UINT64    Opcode:1;
   3086   UINT64    Reserved:53;
   3087 } PAL_VP_ENV_INFO_RETURN;
   3088 
   3089 /**
   3090   PAL Procedure - PAL_VP_ENV_INFO.
   3091 
   3092   Returns the parameters needed to enter a virtual environment.
   3093   It is optional by Itanium processors. The PAL procedure supports the Stacked
   3094   Registers calling convention. It could be called at Virtual
   3095   mode.
   3096 
   3097   @param Index            Index of PAL_VP_ENV_INFO within the list of PAL
   3098                           procedures.
   3099   @param Vpd              64-bit host virtual pointer to the Virtual
   3100                           Processor Descriptor (VPD).
   3101   @param HostIva          64-bit host virtual pointer to the host IVT
   3102                           for the virtual processor
   3103   @param OptionalHandler  64-bit non-zero host-virtual pointer
   3104                           to an optional handler for
   3105                           virtualization intercepts.
   3106 
   3107   @retval 0               Call completed without error
   3108   @retval -1              Unimplemented procedure
   3109   @retval -2              Invalid argument
   3110   @retval -3              Call completed with error.
   3111   @retval -9              Call requires PAL memory buffer.
   3112 
   3113   @return R9              Unsigned integer denoting the number of bytes
   3114                           required by the PAL virtual environment buffer
   3115                           during PAL_VP_INIT_ENV
   3116   @return R10             64-bit vector of virtual environment
   3117                           information. See PAL_VP_ENV_INFO_RETURN.
   3118 
   3119 
   3120 **/
   3121 #define PAL_VP_ENV_INFO       266
   3122 
   3123 /**
   3124   PAL Procedure - PAL_VP_EXIT_ENV.
   3125 
   3126   Allows a logical processor to exit a virtual environment.
   3127   It is optional by Itanium processors. The PAL procedure supports the Stacked
   3128   Registers calling convention. It could be called at Virtual
   3129   mode.
   3130 
   3131   @param Index  Index of PAL_VP_EXIT_ENV within the list of PAL
   3132                 procedures.
   3133   @param Iva    Optional 64-bit host virtual pointer to the IVT
   3134                 when this procedure is done
   3135 
   3136   @retval 0     Call completed without error
   3137   @retval -1    Unimplemented procedure
   3138   @retval -2    Invalid argument
   3139   @retval -3    Call completed with error.
   3140   @retval -9    Call requires PAL memory buffer.
   3141 
   3142 **/
   3143 #define PAL_VP_EXIT_ENV       267
   3144 
   3145 
   3146 
   3147 /**
   3148   PAL Procedure - PAL_VP_INIT_ENV.
   3149 
   3150   Allows a logical processor to enter a virtual environment. It
   3151   is optional by Itanium processors. The PAL procedure supports the Stacked
   3152   Registers calling convention. It could be called at Virtual
   3153   mode.
   3154 
   3155   @param Index          Index of PAL_VP_INIT_ENV within the list of PAL
   3156                         procedures.
   3157   @param ConfigOptions  64-bit vector of global configuration
   3158                         settings.
   3159   @param PhysicalBase   Host physical base address of a block of
   3160                         contiguous physical memory for the PAL
   3161                         virtual environment buffer 1) This
   3162                         memory area must be allocated by the VMM
   3163                         and be 4K aligned. The first logical
   3164                         processor to enter the environment will
   3165                         initialize the physical block for
   3166                         virtualization operations.
   3167   @param VirtualBase    Host virtual base address of the
   3168                         corresponding physical memory block for
   3169                         the PAL virtual environment buffer : The
   3170                         VMM must maintain the host virtual to host
   3171                         physical data and instruction translations
   3172                         in TRs for addresses within the allocated
   3173                         address space. Logical processors in this
   3174                         virtual environment will use this address
   3175                         when transitioning to virtual mode
   3176                         operations.
   3177 
   3178   @retval 0             Call completed without error
   3179   @retval -1            Unimplemented procedure
   3180   @retval -2            Invalid argument
   3181   @retval -3            Call completed with error.
   3182   @retval -9            Call requires PAL memory buffer.
   3183 
   3184   @return R9            Virtualization Service Address - VSA specifies
   3185                         the virtual base address of the PAL
   3186                         virtualization services in this virtual
   3187                         environment.
   3188 
   3189 
   3190 **/
   3191 #define PAL_VP_INIT_ENV       268
   3192 
   3193 
   3194 /**
   3195   PAL Procedure - PAL_VP_REGISTER.
   3196 
   3197   Register a different host IVT and/or a different optional
   3198   virtualization intercept handler for the virtual processor
   3199   specified by vpd. It is optional by Itanium processors. The PAL procedure
   3200   supports the Stacked Registers calling convention. It could be
   3201   called at Virtual mode.
   3202 
   3203   @param Index            Index of PAL_VP_REGISTER within the list of PAL
   3204                           procedures.
   3205   @param Vpd              64-bit host virtual pointer to the Virtual
   3206                           Processor Descriptor (VPD) host_iva 64-bit host
   3207                           virtual pointer to the host IVT for the virtual
   3208                           processor
   3209   @param OptionalHandler  64-bit non-zero host-virtual pointer
   3210                           to an optional handler for
   3211                           virtualization intercepts.
   3212 
   3213   @retval 0               Call completed without error
   3214   @retval -1              Unimplemented procedure
   3215   @retval -2              Invalid argument
   3216   @retval -3              Call completed with error.
   3217   @retval -9              Call requires PAL memory buffer.
   3218 
   3219 **/
   3220 #define PAL_VP_REGISTER       269
   3221 
   3222 
   3223 /**
   3224   PAL Procedure - PAL_VP_RESTORE.
   3225 
   3226   Restores virtual processor state for the specified vpd on the
   3227   logical processor. It is optional by Itanium processors. The PAL procedure
   3228   supports the Stacked Registers calling convention. It could be
   3229   called at Virtual mode.
   3230 
   3231   @param Index      Index of PAL_VP_RESTORE within the list of PAL
   3232                     procedures.
   3233   @param Vpd        64-bit host virtual pointer to the Virtual
   3234                     Processor Descriptor (VPD) host_iva 64-bit host
   3235                     virtual pointer to the host IVT for the virtual
   3236                     processor
   3237   @param PalVector  Vector specifies PAL procedure
   3238                     implementation-specific state to be
   3239                     restored.
   3240 
   3241   @retval 0         Call completed without error
   3242   @retval -1        Unimplemented procedure
   3243   @retval -2        Invalid argument
   3244   @retval -3        Call completed with error.
   3245   @retval -9        Call requires PAL memory buffer.
   3246 
   3247 **/
   3248 #define PAL_VP_RESTORE       270
   3249 
   3250 /**
   3251   PAL Procedure - PAL_VP_SAVE.
   3252 
   3253   Saves virtual processor state for the specified vpd on the
   3254   logical processor. It is optional by Itanium processors. The PAL procedure
   3255   supports the Stacked Registers calling convention. It could be
   3256   called at Virtual mode.
   3257 
   3258   @param Index      Index of PAL_VP_SAVE within the list of PAL
   3259                     procedures.
   3260   @param Vpd        64-bit host virtual pointer to the Virtual
   3261                     Processor Descriptor (VPD) host_iva 64-bit host
   3262                     virtual pointer to the host IVT for the virtual
   3263                     processor
   3264   @param PalVector  Vector specifies PAL procedure
   3265                     implementation-specific state to be
   3266                     restored.
   3267 
   3268   @retval 0         Call completed without error
   3269   @retval -1        Unimplemented procedure
   3270   @retval -2        Invalid argument
   3271   @retval -3        Call completed with error.
   3272   @retval -9        Call requires PAL memory buffer.
   3273 
   3274 **/
   3275 #define PAL_VP_SAVE       271
   3276 
   3277 
   3278 /**
   3279   PAL Procedure - PAL_VP_TERMINATE.
   3280 
   3281   Terminates operation for the specified virtual processor. It
   3282   is optional by Itanium processors. The PAL procedure supports the Stacked
   3283   Registers calling convention. It could be called at Virtual
   3284   mode.
   3285 
   3286   @param Index  Index of PAL_VP_TERMINATE within the list of PAL
   3287                 procedures.
   3288   @param Vpd    64-bit host virtual pointer to the Virtual
   3289                 Processor Descriptor (VPD)
   3290   @param Iva    Optional 64-bit host virtual pointer to the IVT
   3291                 when this procedure is done.
   3292 
   3293   @retval 0     Call completed without error
   3294   @retval -1    Unimplemented procedure
   3295   @retval -2    Invalid argument
   3296   @retval -3    Call completed with error.
   3297   @retval -9    Call requires PAL memory buffer.
   3298 
   3299 **/
   3300 #define PAL_VP_TERMINATE       272
   3301 
   3302 #endif
   3303