/** @file
  Declaration of internal functions in BaseLib.

  Copyright (c) 2006 - 2009, Intel Corporation<BR>
  All rights reserved. This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __BASE_LIB_INTERNALS__
#define __BASE_LIB_INTERNALS__

#include <Base.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>

//
// Math functions
//

/**
  Shifts a 64-bit integer left between 0 and 63 bits. The low bits
  are filled with zeros. The shifted value is returned.

  This function shifts the 64-bit value Operand to the left by Count bits. The
  low Count bits are set to zero. The shifted value is returned.

  @param  Operand The 64-bit operand to shift left.
  @param  Count   The number of bits to shift left.

  @return Operand << Count

**/
UINT64
EFIAPI
InternalMathLShiftU64 (
  IN      UINT64                    Operand,
  IN      UINTN                     Count
  );

/**
  Shifts a 64-bit integer right between 0 and 63 bits. This high bits
  are filled with zeros. The shifted value is returned.

  This function shifts the 64-bit value Operand to the right by Count bits. The
  high Count bits are set to zero. The shifted value is returned.

  @param  Operand The 64-bit operand to shift right.
  @param  Count   The number of bits to shift right.

  @return Operand >> Count

**/
UINT64
EFIAPI
InternalMathRShiftU64 (
  IN      UINT64                    Operand,
  IN      UINTN                     Count
  );

/**
  Shifts a 64-bit integer right between 0 and 63 bits. The high bits
  are filled with original integer's bit 63. The shifted value is returned.

  This function shifts the 64-bit value Operand to the right by Count bits. The
  high Count bits are set to bit 63 of Operand.  The shifted value is returned.

  @param  Operand The 64-bit operand to shift right.
  @param  Count   The number of bits to shift right.

  @return Operand arithmetically shifted right by Count

**/
UINT64
EFIAPI
InternalMathARShiftU64 (
  IN      UINT64                    Operand,
  IN      UINTN                     Count
  );

/**
  Rotates a 64-bit integer left between 0 and 63 bits, filling
  the low bits with the high bits that were rotated.

  This function rotates the 64-bit value Operand to the left by Count bits. The
  low Count bits are fill with the high Count bits of Operand. The rotated
  value is returned.

  @param  Operand The 64-bit operand to rotate left.
  @param  Count   The number of bits to rotate left.

  @return Operand <<< Count

**/
UINT64
EFIAPI
InternalMathLRotU64 (
  IN      UINT64                    Operand,
  IN      UINTN                     Count
  );

/**
  Rotates a 64-bit integer right between 0 and 63 bits, filling
  the high bits with the high low bits that were rotated.

  This function rotates the 64-bit value Operand to the right by Count bits.
  The high Count bits are fill with the low Count bits of Operand. The rotated
  value is returned.

  @param  Operand The 64-bit operand to rotate right.
  @param  Count   The number of bits to rotate right.

  @return Operand >>> Count

**/
UINT64
EFIAPI
InternalMathRRotU64 (
  IN      UINT64                    Operand,
  IN      UINTN                     Count
  );

/**
  Switches the endianess of a 64-bit integer.

  This function swaps the bytes in a 64-bit unsigned value to switch the value
  from little endian to big endian or vice versa. The byte swapped value is
  returned.

  @param  Operand A 64-bit unsigned value.

  @return The byte swapped Operand.

**/
UINT64
EFIAPI
InternalMathSwapBytes64 (
  IN      UINT64                    Operand
  );

/**
  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer
  and generates a 64-bit unsigned result.

  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
  bit unsigned result is returned.

  @param  Multiplicand  A 64-bit unsigned value.
  @param  Multiplier    A 32-bit unsigned value.

  @return Multiplicand * Multiplier

**/
UINT64
EFIAPI
InternalMathMultU64x32 (
  IN      UINT64                    Multiplicand,
  IN      UINT32                    Multiplier
  );

/**
  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer
  and generates a 64-bit unsigned result.

  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
  bit unsigned result is returned.

  @param  Multiplicand  A 64-bit unsigned value.
  @param  Multiplier    A 64-bit unsigned value.

  @return Multiplicand * Multiplier

**/
UINT64
EFIAPI
InternalMathMultU64x64 (
  IN      UINT64                    Multiplicand,
  IN      UINT64                    Multiplier
  );

/**
  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
  generates a 64-bit unsigned result.

  This function divides the 64-bit unsigned value Dividend by the 32-bit
  unsigned value Divisor and generates a 64-bit unsigned quotient. This
  function returns the 64-bit unsigned quotient.

  @param  Dividend  A 64-bit unsigned value.
  @param  Divisor   A 32-bit unsigned value.

  @return Dividend / Divisor

**/
UINT64
EFIAPI
InternalMathDivU64x32 (
  IN      UINT64                    Dividend,
  IN      UINT32                    Divisor
  );

/**
  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
  generates a 32-bit unsigned remainder.

  This function divides the 64-bit unsigned value Dividend by the 32-bit
  unsigned value Divisor and generates a 32-bit remainder. This function
  returns the 32-bit unsigned remainder.

  @param  Dividend  A 64-bit unsigned value.
  @param  Divisor   A 32-bit unsigned value.

  @return Dividend % Divisor

**/
UINT32
EFIAPI
InternalMathModU64x32 (
  IN      UINT64                    Dividend,
  IN      UINT32                    Divisor
  );

/**
  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
  generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.

  This function divides the 64-bit unsigned value Dividend by the 32-bit
  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
  This function returns the 64-bit unsigned quotient.

  @param  Dividend  A 64-bit unsigned value.
  @param  Divisor   A 32-bit unsigned value.
  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is
                    optional and may be NULL.

  @return Dividend / Divisor

**/
UINT64
EFIAPI
InternalMathDivRemU64x32 (
  IN      UINT64                    Dividend,
  IN      UINT32                    Divisor,
  OUT     UINT32                    *Remainder OPTIONAL
  );

/**
  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and
  generates a 64-bit unsigned result and an optional 64-bit unsigned remainder.

  This function divides the 64-bit unsigned value Dividend by the 64-bit
  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
  This function returns the 64-bit unsigned quotient.

  @param  Dividend  A 64-bit unsigned value.
  @param  Divisor   A 64-bit unsigned value.
  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is
                    optional and may be NULL.

  @return Dividend / Divisor

**/
UINT64
EFIAPI
InternalMathDivRemU64x64 (
  IN      UINT64                    Dividend,
  IN      UINT64                    Divisor,
  OUT     UINT64                    *Remainder OPTIONAL
  );

/**
  Divides a 64-bit signed integer by a 64-bit signed integer and
  generates a 64-bit signed result and an optional 64-bit signed remainder.

  This function divides the 64-bit signed value Dividend by the 64-bit
  signed value Divisor and generates a 64-bit signed quotient. If Remainder
  is not NULL, then the 64-bit signed remainder is returned in Remainder.
  This function returns the 64-bit signed quotient.

  @param  Dividend  A 64-bit signed value.
  @param  Divisor   A 64-bit signed value.
  @param  Remainder A pointer to a 64-bit signed value. This parameter is
                    optional and may be NULL.

  @return Dividend / Divisor

**/
INT64
EFIAPI
InternalMathDivRemS64x64 (
  IN      INT64                     Dividend,
  IN      INT64                     Divisor,
  OUT     INT64                     *Remainder  OPTIONAL
  );

/**
  Transfers control to a function starting with a new stack.

  Transfers control to the function specified by EntryPoint using the
  new stack specified by NewStack and passing in the parameters specified
  by Context1 and Context2.  Context1 and Context2 are optional and may
  be NULL.  The function EntryPoint must never return.
  Marker will be ignored on IA-32, x64, and EBC.
  IPF CPUs expect one additional parameter of type VOID * that specifies
  the new backing store pointer.

  If EntryPoint is NULL, then ASSERT().
  If NewStack is NULL, then ASSERT().

  @param  EntryPoint  A pointer to function to call with the new stack.
  @param  Context1    A pointer to the context to pass into the EntryPoint
                      function.
  @param  Context2    A pointer to the context to pass into the EntryPoint
                      function.
  @param  NewStack    A pointer to the new stack to use for the EntryPoint
                      function.
  @param  Marker      VA_LIST marker for the variable argument list.

**/
VOID
EFIAPI
InternalSwitchStack (
  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
  IN      VOID                      *Context1,   OPTIONAL
  IN      VOID                      *Context2,   OPTIONAL
  IN      VOID                      *NewStack,
  IN      VA_LIST                   Marker
  );


/**
  Worker function that locates the Node in the List.

  By searching the List, finds the location of the Node in List. At the same time,
  verifies the validity of this list.

  If List is NULL, then ASSERT().
  If List->ForwardLink is NULL, then ASSERT().
  If List->backLink is NULL, then ASSERT().
  If Node is NULL, then ASSERT();
  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
  of nodes in ListHead, including the ListHead node, is greater than or
  equal to PcdMaximumLinkedListLength, then ASSERT().

  @param  List  A pointer to a node in a linked list.
  @param  Node  A pointer to one nod.

  @retval TRUE   Node is in List
  @retval FALSE  Node isn't in List, or List is invalid

**/
BOOLEAN
EFIAPI
IsNodeInList (
  IN      CONST LIST_ENTRY      *List,
  IN      CONST LIST_ENTRY      *Node
  );

/**
  Worker function that returns a bit field from Operand.

  Returns the bitfield specified by the StartBit and the EndBit from Operand.

  @param  Operand   Operand on which to perform the bitfield operation.
  @param  StartBit  The ordinal of the least significant bit in the bit field.
  @param  EndBit    The ordinal of the most significant bit in the bit field.

  @return The bit field read.

**/
UINTN
EFIAPI
BitFieldReadUint (
  IN      UINTN                     Operand,
  IN      UINTN                     StartBit,
  IN      UINTN                     EndBit
  );


/**
  Worker function that reads a bit field from Operand, performs a bitwise OR,
  and returns the result.

  Performs a bitwise OR between the bit field specified by StartBit and EndBit
  in Operand and the value specified by AndData. All other bits in Operand are
  preserved. The new value is returned.

  @param  Operand   Operand on which to perform the bitfield operation.
  @param  StartBit  The ordinal of the least significant bit in the bit field.
  @param  EndBit    The ordinal of the most significant bit in the bit field.
  @param  OrData    The value to OR with the read value from the value

  @return The new value.

**/
UINTN
EFIAPI
BitFieldOrUint (
  IN      UINTN                     Operand,
  IN      UINTN                     StartBit,
  IN      UINTN                     EndBit,
  IN      UINTN                     OrData
  );


/**
  Worker function that reads a bit field from Operand, performs a bitwise AND,
  and returns the result.

  Performs a bitwise AND between the bit field specified by StartBit and EndBit
  in Operand and the value specified by AndData. All other bits in Operand are
  preserved. The new value is returned.

  @param  Operand   Operand on which to perform the bitfield operation.
  @param  StartBit  The ordinal of the least significant bit in the bit field.
  @param  EndBit    The ordinal of the most significant bit in the bit field.
  @param  AndData    The value to And with the read value from the value

  @return The new value.

**/
UINTN
EFIAPI
BitFieldAndUint (
  IN      UINTN                     Operand,
  IN      UINTN                     StartBit,
  IN      UINTN                     EndBit,
  IN      UINTN                     AndData
  );


/**
  Worker function that checks ASSERT condition for JumpBuffer

  Checks ASSERT condition for JumpBuffer.

  If JumpBuffer is NULL, then ASSERT().
  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().

  @param  JumpBuffer    A pointer to CPU context buffer.

**/
VOID
EFIAPI
InternalAssertJumpBuffer (
  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
  );


/**
  Restores the CPU context that was saved with SetJump().

  Restores the CPU context from the buffer specified by JumpBuffer.
  This function never returns to the caller.
  Instead is resumes execution based on the state of JumpBuffer.

  @param  JumpBuffer    A pointer to CPU context buffer.
  @param  Value         The value to return when the SetJump() context is restored.

**/
VOID
EFIAPI
InternalLongJump (
  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
  IN      UINTN                     Value
  );


//
// Ia32 and x64 specific functions
//
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)

/**
  Reads the current Global Descriptor Table Register(GDTR) descriptor.

  Reads and returns the current GDTR descriptor and returns it in Gdtr. This
  function is only available on IA-32 and x64.

  @param  Gdtr  Pointer to a GDTR descriptor.

**/
VOID
EFIAPI
InternalX86ReadGdtr (
  OUT     IA32_DESCRIPTOR           *Gdtr
  );

/**
  Writes the current Global Descriptor Table Register (GDTR) descriptor.

  Writes and the current GDTR descriptor specified by Gdtr. This function is
  only available on IA-32 and x64.

  @param  Gdtr  Pointer to a GDTR descriptor.

**/
VOID
EFIAPI
InternalX86WriteGdtr (
  IN      CONST IA32_DESCRIPTOR     *Gdtr
  );

/**
  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.

  Reads and returns the current IDTR descriptor and returns it in Idtr. This
  function is only available on IA-32 and x64.

  @param  Idtr  Pointer to a IDTR descriptor.

**/
VOID
EFIAPI
InternalX86ReadIdtr (
  OUT     IA32_DESCRIPTOR           *Idtr
  );

/**
  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.

  Writes the current IDTR descriptor and returns it in Idtr. This function is
  only available on IA-32 and x64.

  @param  Idtr  Pointer to a IDTR descriptor.

**/
VOID
EFIAPI
InternalX86WriteIdtr (
  IN      CONST IA32_DESCRIPTOR     *Idtr
  );

/**
  Save the current floating point/SSE/SSE2 context to a buffer.

  Saves the current floating point/SSE/SSE2 state to the buffer specified by
  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
  available on IA-32 and x64.

  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.

**/
VOID
EFIAPI
InternalX86FxSave (
  OUT     IA32_FX_BUFFER            *Buffer
  );

/**
  Restores the current floating point/SSE/SSE2 context from a buffer.

  Restores the current floating point/SSE/SSE2 state from the buffer specified
  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
  only available on IA-32 and x64.

  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.

**/
VOID
EFIAPI
InternalX86FxRestore (
  IN      CONST IA32_FX_BUFFER      *Buffer
  );

/**
  Enables the 32-bit paging mode on the CPU.

  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
  must be properly initialized prior to calling this service. This function
  assumes the current execution mode is 32-bit protected mode. This function is
  only available on IA-32. After the 32-bit paging mode is enabled, control is
  transferred to the function specified by EntryPoint using the new stack
  specified by NewStack and passing in the parameters specified by Context1 and
  Context2. Context1 and Context2 are optional and may be NULL. The function
  EntryPoint must never return.

  There are a number of constraints that must be followed before calling this
  function:
  1)  Interrupts must be disabled.
  2)  The caller must be in 32-bit protected mode with flat descriptors. This
      means all descriptors must have a base of 0 and a limit of 4GB.
  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat
      descriptors.
  4)  CR3 must point to valid page tables that will be used once the transition
      is complete, and those page tables must guarantee that the pages for this
      function and the stack are identity mapped.

  @param  EntryPoint  A pointer to function to call with the new stack after
                      paging is enabled.
  @param  Context1    A pointer to the context to pass into the EntryPoint
                      function as the first parameter after paging is enabled.
  @param  Context2    A pointer to the context to pass into the EntryPoint
                      function as the second parameter after paging is enabled.
  @param  NewStack    A pointer to the new stack to use for the EntryPoint
                      function after paging is enabled.

**/
VOID
EFIAPI
InternalX86EnablePaging32 (
  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
  IN      VOID                      *Context1,  OPTIONAL
  IN      VOID                      *Context2,  OPTIONAL
  IN      VOID                      *NewStack
  );

/**
  Disables the 32-bit paging mode on the CPU.

  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
  mode. This function assumes the current execution mode is 32-paged protected
  mode. This function is only available on IA-32. After the 32-bit paging mode
  is disabled, control is transferred to the function specified by EntryPoint
  using the new stack specified by NewStack and passing in the parameters
  specified by Context1 and Context2. Context1 and Context2 are optional and
  may be NULL. The function EntryPoint must never return.

  There are a number of constraints that must be followed before calling this
  function:
  1)  Interrupts must be disabled.
  2)  The caller must be in 32-bit paged mode.
  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
  4)  CR3 must point to valid page tables that guarantee that the pages for
      this function and the stack are identity mapped.

  @param  EntryPoint  A pointer to function to call with the new stack after
                      paging is disabled.
  @param  Context1    A pointer to the context to pass into the EntryPoint
                      function as the first parameter after paging is disabled.
  @param  Context2    A pointer to the context to pass into the EntryPoint
                      function as the second parameter after paging is
                      disabled.
  @param  NewStack    A pointer to the new stack to use for the EntryPoint
                      function after paging is disabled.

**/
VOID
EFIAPI
InternalX86DisablePaging32 (
  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
  IN      VOID                      *Context1,  OPTIONAL
  IN      VOID                      *Context2,  OPTIONAL
  IN      VOID                      *NewStack
  );

/**
  Enables the 64-bit paging mode on the CPU.

  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
  must be properly initialized prior to calling this service. This function
  assumes the current execution mode is 32-bit protected mode with flat
  descriptors. This function is only available on IA-32. After the 64-bit
  paging mode is enabled, control is transferred to the function specified by
  EntryPoint using the new stack specified by NewStack and passing in the
  parameters specified by Context1 and Context2. Context1 and Context2 are
  optional and may be 0. The function EntryPoint must never return.

  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
                      is called. The descriptor in the GDT that this selector
                      references must be setup for long mode.
  @param  EntryPoint  The 64-bit virtual address of the function to call with
                      the new stack after paging is enabled.
  @param  Context1    The 64-bit virtual address of the context to pass into
                      the EntryPoint function as the first parameter after
                      paging is enabled.
  @param  Context2    The 64-bit virtual address of the context to pass into
                      the EntryPoint function as the second parameter after
                      paging is enabled.
  @param  NewStack    The 64-bit virtual address of the new stack to use for
                      the EntryPoint function after paging is enabled.

**/
VOID
EFIAPI
InternalX86EnablePaging64 (
  IN      UINT16                    Cs,
  IN      UINT64                    EntryPoint,
  IN      UINT64                    Context1,  OPTIONAL
  IN      UINT64                    Context2,  OPTIONAL
  IN      UINT64                    NewStack
  );

/**
  Disables the 64-bit paging mode on the CPU.

  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
  mode. This function assumes the current execution mode is 64-paging mode.
  This function is only available on x64. After the 64-bit paging mode is
  disabled, control is transferred to the function specified by EntryPoint
  using the new stack specified by NewStack and passing in the parameters
  specified by Context1 and Context2. Context1 and Context2 are optional and
  may be 0. The function EntryPoint must never return.

  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
                      is called. The descriptor in the GDT that this selector
                      references must be setup for 32-bit protected mode.
  @param  EntryPoint  The 64-bit virtual address of the function to call with
                      the new stack after paging is disabled.
  @param  Context1    The 64-bit virtual address of the context to pass into
                      the EntryPoint function as the first parameter after
                      paging is disabled.
  @param  Context2    The 64-bit virtual address of the context to pass into
                      the EntryPoint function as the second parameter after
                      paging is disabled.
  @param  NewStack    The 64-bit virtual address of the new stack to use for
                      the EntryPoint function after paging is disabled.

**/
VOID
EFIAPI
InternalX86DisablePaging64 (
  IN      UINT16                    Cs,
  IN      UINT32                    EntryPoint,
  IN      UINT32                    Context1,  OPTIONAL
  IN      UINT32                    Context2,  OPTIONAL
  IN      UINT32                    NewStack
  );


#elif defined (MDE_CPU_IPF)
//
//
// IPF specific functions
//

/**
  Reads control register DCR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_DCR

  @return The 64-bit control register DCR.

**/
UINT64
EFIAPI
AsmReadControlRegisterDcr (
  VOID
  );


/**
  Reads control register ITM.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_ITM

  @return The 64-bit control register ITM.

**/
UINT64
EFIAPI
AsmReadControlRegisterItm (
  VOID
  );


/**
  Reads control register IVA.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IVA

  @return The 64-bit control register IVA.

**/
UINT64
EFIAPI
AsmReadControlRegisterIva (
  VOID
  );


/**
  Reads control register PTA.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_PTA

  @return The 64-bit control register PTA.

**/
UINT64
EFIAPI
AsmReadControlRegisterPta (
  VOID
  );


/**
  Reads control register IPSR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IPSR

  @return The 64-bit control register IPSR.

**/
UINT64
EFIAPI
AsmReadControlRegisterIpsr (
  VOID
  );


/**
  Reads control register ISR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_ISR

  @return The 64-bit control register ISR.

**/
UINT64
EFIAPI
AsmReadControlRegisterIsr (
  VOID
  );


/**
  Reads control register IIP.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IIP

  @return The 64-bit control register IIP.

**/
UINT64
EFIAPI
AsmReadControlRegisterIip (
  VOID
  );


/**
  Reads control register IFA.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IFA

  @return The 64-bit control register IFA.

**/
UINT64
EFIAPI
AsmReadControlRegisterIfa (
  VOID
  );


/**
  Reads control register ITIR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_ITIR

  @return The 64-bit control register ITIR.

**/
UINT64
EFIAPI
AsmReadControlRegisterItir (
  VOID
  );


/**
  Reads control register IIPA.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IIPA

  @return The 64-bit control register IIPA.

**/
UINT64
EFIAPI
AsmReadControlRegisterIipa (
  VOID
  );


/**
  Reads control register IFS.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IFS

  @return The 64-bit control register IFS.

**/
UINT64
EFIAPI
AsmReadControlRegisterIfs (
  VOID
  );


/**
  Reads control register IIM.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IIM

  @return The 64-bit control register IIM.

**/
UINT64
EFIAPI
AsmReadControlRegisterIim (
  VOID
  );


/**
  Reads control register IHA.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IHA

  @return The 64-bit control register IHA.

**/
UINT64
EFIAPI
AsmReadControlRegisterIha (
  VOID
  );


/**
  Reads control register LID.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_LID

  @return The 64-bit control register LID.

**/
UINT64
EFIAPI
AsmReadControlRegisterLid (
  VOID
  );


/**
  Reads control register IVR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IVR

  @return The 64-bit control register IVR.

**/
UINT64
EFIAPI
AsmReadControlRegisterIvr (
  VOID
  );


/**
  Reads control register TPR.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_TPR

  @return The 64-bit control register TPR.

**/
UINT64
EFIAPI
AsmReadControlRegisterTpr (
  VOID
  );


/**
  Reads control register EOI.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_EOI

  @return The 64-bit control register EOI.

**/
UINT64
EFIAPI
AsmReadControlRegisterEoi (
  VOID
  );


/**
  Reads control register IRR0.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IRR0

  @return The 64-bit control register IRR0.

**/
UINT64
EFIAPI
AsmReadControlRegisterIrr0 (
  VOID
  );


/**
  Reads control register IRR1.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IRR1

  @return The 64-bit control register IRR1.

**/
UINT64
EFIAPI
AsmReadControlRegisterIrr1 (
  VOID
  );


/**
  Reads control register IRR2.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IRR2

  @return The 64-bit control register IRR2.

**/
UINT64
EFIAPI
AsmReadControlRegisterIrr2 (
  VOID
  );


/**
  Reads control register IRR3.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_IRR3

  @return The 64-bit control register IRR3.

**/
UINT64
EFIAPI
AsmReadControlRegisterIrr3 (
  VOID
  );


/**
  Reads control register ITV.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_ITV

  @return The 64-bit control register ITV.

**/
UINT64
EFIAPI
AsmReadControlRegisterItv (
  VOID
  );


/**
  Reads control register PMV.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_PMV

  @return The 64-bit control register PMV.

**/
UINT64
EFIAPI
AsmReadControlRegisterPmv (
  VOID
  );


/**
  Reads control register CMCV.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_CMCV

  @return The 64-bit control register CMCV.

**/
UINT64
EFIAPI
AsmReadControlRegisterCmcv (
  VOID
  );


/**
  Reads control register LRR0.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_LRR0

  @return The 64-bit control register LRR0.

**/
UINT64
EFIAPI
AsmReadControlRegisterLrr0 (
  VOID
  );


/**
  Reads control register LRR1.

  This is a worker function for AsmReadControlRegister()
  when its parameter Index is IPF_CONTROL_REGISTER_LRR1

  @return The 64-bit control register LRR1.

**/
UINT64
EFIAPI
AsmReadControlRegisterLrr1 (
  VOID
  );


/**
  Reads application register K0.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K0

  @return The 64-bit application register K0.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK0 (
  VOID
  );



/**
  Reads application register K1.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K1

  @return The 64-bit application register K1.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK1 (
  VOID
  );


/**
  Reads application register K2.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K2

  @return The 64-bit application register K2.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK2 (
  VOID
  );


/**
  Reads application register K3.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K3

  @return The 64-bit application register K3.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK3 (
  VOID
  );


/**
  Reads application register K4.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K4

  @return The 64-bit application register K4.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK4 (
  VOID
  );


/**
  Reads application register K5.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K5

  @return The 64-bit application register K5.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK5 (
  VOID
  );


/**
  Reads application register K6.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K6

  @return The 64-bit application register K6.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK6 (
  VOID
  );


/**
  Reads application register K7.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_K7

  @return The 64-bit application register K7.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterK7 (
  VOID
  );


/**
  Reads application register RSC.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_RSC

  @return The 64-bit application register RSC.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterRsc (
  VOID
  );


/**
  Reads application register BSP.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_BSP

  @return The 64-bit application register BSP.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterBsp (
  VOID
  );


/**
  Reads application register BSPSTORE.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_BSPSTORE

  @return The 64-bit application register BSPSTORE.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterBspstore (
  VOID
  );


/**
  Reads application register RNAT.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_RNAT

  @return The 64-bit application register RNAT.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterRnat (
  VOID
  );


/**
  Reads application register FCR.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_FCR

  @return The 64-bit application register FCR.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterFcr (
  VOID
  );


/**
  Reads application register EFLAG.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_EFLAG

  @return The 64-bit application register EFLAG.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterEflag (
  VOID
  );


/**
  Reads application register CSD.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_CSD

  @return The 64-bit application register CSD.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterCsd (
  VOID
  );


/**
  Reads application register SSD.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_SSD

  @return The 64-bit application register SSD.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterSsd (
  VOID
  );


/**
  Reads application register CFLG.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_CFLG

  @return The 64-bit application register CFLG.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterCflg (
  VOID
  );


/**
  Reads application register FSR.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_FSR

  @return The 64-bit application register FSR.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterFsr (
  VOID
  );


/**
  Reads application register FIR.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_FIR

  @return The 64-bit application register FIR.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterFir (
  VOID
  );


/**
  Reads application register FDR.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_FDR

  @return The 64-bit application register FDR.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterFdr (
  VOID
  );


/**
  Reads application register CCV.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_CCV

  @return The 64-bit application register CCV.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterCcv (
  VOID
  );


/**
  Reads application register UNAT.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_UNAT

  @return The 64-bit application register UNAT.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterUnat (
  VOID
  );


/**
  Reads application register FPSR.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_FPSR

  @return The 64-bit application register FPSR.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterFpsr (
  VOID
  );


/**
  Reads application register ITC.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_ITC

  @return The 64-bit application register ITC.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterItc (
  VOID
  );


/**
  Reads application register PFS.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_PFS

  @return The 64-bit application register PFS.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterPfs (
  VOID
  );


/**
  Reads application register LC.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_LC

  @return The 64-bit application register LC.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterLc (
  VOID
  );


/**
  Reads application register EC.

  This is a worker function for AsmReadApplicationRegister()
  when its parameter Index is IPF_APPLICATION_REGISTER_EC

  @return The 64-bit application register EC.

**/
UINT64
EFIAPI
AsmReadApplicationRegisterEc (
  VOID
  );



/**
  Transfers control to a function starting with a new stack.

  Transfers control to the function specified by EntryPoint using the new stack
  specified by NewStack and passing in the parameters specified by Context1 and
  Context2. Context1 and Context2 are optional and may be NULL. The function
  EntryPoint must never return.

  If EntryPoint is NULL, then ASSERT().
  If NewStack is NULL, then ASSERT().

  @param  EntryPoint  A pointer to function to call with the new stack.
  @param  Context1    A pointer to the context to pass into the EntryPoint
                      function.
  @param  Context2    A pointer to the context to pass into the EntryPoint
                      function.
  @param  NewStack    A pointer to the new stack to use for the EntryPoint
                      function.
  @param  NewBsp      A pointer to the new memory location for RSE backing
                      store.

**/
VOID
EFIAPI
AsmSwitchStackAndBackingStore (
  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
  IN      VOID                      *Context1,  OPTIONAL
  IN      VOID                      *Context2,  OPTIONAL
  IN      VOID                      *NewStack,
  IN      VOID                      *NewBsp
  );

/**
  Internal worker function to invalidate a range of instruction cache lines
  in the cache coherency domain of the calling CPU.

  Internal worker function to invalidate the instruction cache lines specified
  by Address and Length. If Address is not aligned on a cache line boundary,
  then entire instruction cache line containing Address is invalidated. If
  Address + Length is not aligned on a cache line boundary, then the entire
  instruction cache line containing Address + Length -1 is invalidated. This
  function may choose to invalidate the entire instruction cache if that is more
  efficient than invalidating the specified range. If Length is 0, the no instruction
  cache lines are invalidated. Address is returned.
  This function is only available on IPF.

  @param  Address The base address of the instruction cache lines to
                  invalidate. If the CPU is in a physical addressing mode, then
                  Address is a physical address. If the CPU is in a virtual
                  addressing mode, then Address is a virtual address.

  @param  Length  The number of bytes to invalidate from the instruction cache.

  @return Address

**/
VOID *
EFIAPI
InternalFlushCacheRange (
  IN      VOID                      *Address,
  IN      UINTN                     Length
  );

#else

#endif

#endif
