git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6330 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			652 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			652 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  IA-32/x64 MSR functions.
 | 
						|
 | 
						|
  Copyright (c) 2006, 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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
 | 
						|
#include "BaseLibInternals.h"
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Returns the lower 32-bits of a Machine Specific Register(MSR).
 | 
						|
 | 
						|
  Reads and returns the lower 32-bits of the MSR specified by Index.
 | 
						|
  No parameter checking is performed on Index, and some Index values may cause
 | 
						|
  CPU exceptions. The caller must either guarantee that Index is valid, or the
 | 
						|
  caller must set up exception handlers to catch the exceptions. This function
 | 
						|
  is only available on IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index The 32-bit MSR index to read.
 | 
						|
 | 
						|
  @return The lower 32 bits of the MSR identified by Index.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmReadMsr32 (
 | 
						|
  IN      UINT32                    Index
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (UINT32)AsmReadMsr64 (Index);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).
 | 
						|
 | 
						|
  Writes the 32-bit value specified by Value to the MSR specified by Index. The
 | 
						|
  upper 32-bits of the MSR write are set to zero. The 32-bit value written to
 | 
						|
  the MSR is returned. No parameter checking is performed on Index or Value,
 | 
						|
  and some of these may cause CPU exceptions. The caller must either guarantee
 | 
						|
  that Index and Value are valid, or the caller must establish proper exception
 | 
						|
  handlers. This function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index The 32-bit MSR index to write.
 | 
						|
  @param  Value The 32-bit value to write to the MSR.
 | 
						|
 | 
						|
  @return Value
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmWriteMsr32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT32                    Value
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (UINT32)AsmWriteMsr64 (Index, Value);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise inclusive OR on the lower 32-bits, and
 | 
						|
  writes the result back to the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
 | 
						|
  between the lower 32-bits of the read result and the value specified by
 | 
						|
  OrData, and writes the result to the 64-bit MSR specified by Index. The lower
 | 
						|
  32-bits of the value written to the MSR is returned. No parameter checking is
 | 
						|
  performed on Index or OrData, and some of these may cause CPU exceptions. The
 | 
						|
  caller must either guarantee that Index and OrData are valid, or the caller
 | 
						|
  must establish proper exception handlers. This function is only available on
 | 
						|
  IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  OrData  The value to OR with the read value from the MSR.
 | 
						|
 | 
						|
  @return The lower 32-bit value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrOr32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT32                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (UINT32)AsmMsrOr64 (Index, OrData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
 | 
						|
  the result back to the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
 | 
						|
  lower 32-bits of the read result and the value specified by AndData, and
 | 
						|
  writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
 | 
						|
  the value written to the MSR is returned. No parameter checking is performed
 | 
						|
  on Index or AndData, and some of these may cause CPU exceptions. The caller
 | 
						|
  must either guarantee that Index and AndData are valid, or the caller must
 | 
						|
  establish proper exception handlers. This function is only available on IA-32
 | 
						|
  and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  AndData The value to AND with the read value from the MSR.
 | 
						|
 | 
						|
  @return The lower 32-bit value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrAnd32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT32                    AndData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (UINT32)AsmMsrAnd64 (Index, AndData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive OR
 | 
						|
  on the lower 32-bits, and writes the result back to the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
 | 
						|
  lower 32-bits of the read result and the value specified by AndData
 | 
						|
  preserving the upper 32-bits, performs a bitwise inclusive OR between the
 | 
						|
  result of the AND operation and the value specified by OrData, and writes the
 | 
						|
  result to the 64-bit MSR specified by Address. The lower 32-bits of the value
 | 
						|
  written to the MSR is returned. No parameter checking is performed on Index,
 | 
						|
  AndData, or OrData, and some of these may cause CPU exceptions. The caller
 | 
						|
  must either guarantee that Index, AndData, and OrData are valid, or the
 | 
						|
  caller must establish proper exception handlers. This function is only
 | 
						|
  available on IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  AndData The value to AND with the read value from the MSR.
 | 
						|
  @param  OrData  The value to OR with the result of the AND operation.
 | 
						|
 | 
						|
  @return The lower 32-bit value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrAndThenOr32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT32                    AndData,
 | 
						|
  IN      UINT32                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (UINT32)AsmMsrAndThenOr64 (Index, AndData, OrData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field of an MSR.
 | 
						|
 | 
						|
  Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
 | 
						|
  specified by the StartBit and the EndBit. The value of the bit field is
 | 
						|
  returned. The caller must either guarantee that Index is valid, or the caller
 | 
						|
  must set up exception handlers to catch the exceptions. This function is only
 | 
						|
  available on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to read.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
 | 
						|
  @return The bit field read from the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldRead32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit
 | 
						|
  )
 | 
						|
{
 | 
						|
  return BitFieldRead32 (AsmReadMsr32 (Index), StartBit, EndBit);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Writes a bit field to an MSR.
 | 
						|
 | 
						|
  Writes Value to a bit field in the lower 32-bits of a  64-bit MSR. The bit
 | 
						|
  field is specified by the StartBit and the EndBit. All other bits in the
 | 
						|
  destination MSR are preserved. The lower 32-bits of the MSR written is
 | 
						|
  returned. Extra left bits in Value are stripped. The caller must either
 | 
						|
  guarantee that Index and the data written is valid, or the caller must set up
 | 
						|
  exception handlers to catch the exceptions. This function is only available
 | 
						|
  on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  Value     New value of the bit field.
 | 
						|
 | 
						|
  @return The lower 32-bit of the value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldWrite32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT32                    Value
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (EndBit < sizeof (Value) * 8);
 | 
						|
  ASSERT (StartBit <= EndBit);
 | 
						|
  return (UINT32)AsmMsrBitFieldWrite64 (Index, StartBit, EndBit, Value);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
 | 
						|
  result back to the bit field in the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
 | 
						|
  between the read result and the value specified by OrData, and writes the
 | 
						|
  result to the 64-bit MSR specified by Index. The lower 32-bits of the value
 | 
						|
  written to the MSR are returned. Extra left bits in OrData are stripped. The
 | 
						|
  caller must either guarantee that Index and the data written is valid, or
 | 
						|
  the caller must set up exception handlers to catch the exceptions. This
 | 
						|
  function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  OrData    The value to OR with the read value from the MSR.
 | 
						|
 | 
						|
  @return The lower 32-bit of the value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldOr32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT32                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (EndBit < sizeof (OrData) * 8);
 | 
						|
  ASSERT (StartBit <= EndBit);
 | 
						|
  return (UINT32)AsmMsrBitFieldOr64 (Index, StartBit, EndBit, OrData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
 | 
						|
  result back to the bit field in the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
 | 
						|
  read result and the value specified by AndData, and writes the result to the
 | 
						|
  64-bit MSR specified by Index. The lower 32-bits of the value written to the
 | 
						|
  MSR are returned. Extra left bits in AndData are stripped. The caller must
 | 
						|
  either guarantee that Index and the data written is valid, or the caller must
 | 
						|
  set up exception handlers to catch the exceptions. This function is only
 | 
						|
  available on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  AndData   The value to AND with the read value from the MSR.
 | 
						|
 | 
						|
  @return The lower 32-bit of the value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldAnd32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT32                    AndData
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (EndBit < sizeof (AndData) * 8);
 | 
						|
  ASSERT (StartBit <= EndBit);
 | 
						|
  return (UINT32)AsmMsrBitFieldAnd64 (Index, StartBit, EndBit, AndData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
 | 
						|
  bitwise inclusive OR, and writes the result back to the bit field in the
 | 
						|
  64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
 | 
						|
  bitwise inclusive OR between the read result and the value specified by
 | 
						|
  AndData, and writes the result to the 64-bit MSR specified by Index. The
 | 
						|
  lower 32-bits of the value written to the MSR are returned. Extra left bits
 | 
						|
  in both AndData and OrData are stripped. The caller must either guarantee
 | 
						|
  that Index and the data written is valid, or the caller must set up exception
 | 
						|
  handlers to catch the exceptions. This function is only available on IA-32
 | 
						|
  and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is greater than 31, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..31.
 | 
						|
  @param  AndData   The value to AND with the read value from the MSR.
 | 
						|
  @param  OrData    The value to OR with the result of the AND operation.
 | 
						|
 | 
						|
  @return The lower 32-bit of the value written to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldAndThenOr32 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT32                    AndData,
 | 
						|
  IN      UINT32                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  ASSERT (EndBit < sizeof (AndData) * 8);
 | 
						|
  ASSERT (StartBit <= EndBit);
 | 
						|
  return (UINT32)AsmMsrBitFieldAndThenOr64 (
 | 
						|
                   Index,
 | 
						|
                   StartBit,
 | 
						|
                   EndBit,
 | 
						|
                   AndData,
 | 
						|
                   OrData
 | 
						|
                   );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise inclusive OR, and writes the result
 | 
						|
  back to the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
 | 
						|
  between the read result and the value specified by OrData, and writes the
 | 
						|
  result to the 64-bit MSR specified by Index. The value written to the MSR is
 | 
						|
  returned. No parameter checking is performed on Index or OrData, and some of
 | 
						|
  these may cause CPU exceptions. The caller must either guarantee that Index
 | 
						|
  and OrData are valid, or the caller must establish proper exception handlers.
 | 
						|
  This function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  OrData  The value to OR with the read value from the MSR.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrOr64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT64                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (Index, AsmReadMsr64 (Index) | OrData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
 | 
						|
  64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
 | 
						|
  read result and the value specified by OrData, and writes the result to the
 | 
						|
  64-bit MSR specified by Index. The value written to the MSR is returned. No
 | 
						|
  parameter checking is performed on Index or OrData, and some of these may
 | 
						|
  cause CPU exceptions. The caller must either guarantee that Index and OrData
 | 
						|
  are valid, or the caller must establish proper exception handlers. This
 | 
						|
  function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  AndData The value to AND with the read value from the MSR.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrAnd64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT64                    AndData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (Index, AsmReadMsr64 (Index) & AndData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive
 | 
						|
  OR, and writes the result back to the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
 | 
						|
  result and the value specified by AndData, performs a bitwise inclusive OR
 | 
						|
  between the result of the AND operation and the value specified by OrData,
 | 
						|
  and writes the result to the 64-bit MSR specified by Index. The value written
 | 
						|
  to the MSR is returned. No parameter checking is performed on Index, AndData,
 | 
						|
  or OrData, and some of these may cause CPU exceptions. The caller must either
 | 
						|
  guarantee that Index, AndData, and OrData are valid, or the caller must
 | 
						|
  establish proper exception handlers. This function is only available on IA-32
 | 
						|
  and X64.
 | 
						|
 | 
						|
  @param  Index   The 32-bit MSR index to write.
 | 
						|
  @param  AndData The value to AND with the read value from the MSR.
 | 
						|
  @param  OrData  The value to OR with the result of the AND operation.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrAndThenOr64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINT64                    AndData,
 | 
						|
  IN      UINT64                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (Index, (AsmReadMsr64 (Index) & AndData) | OrData);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field of an MSR.
 | 
						|
 | 
						|
  Reads the bit field in the 64-bit MSR. The bit field is specified by the
 | 
						|
  StartBit and the EndBit. The value of the bit field is returned. The caller
 | 
						|
  must either guarantee that Index is valid, or the caller must set up
 | 
						|
  exception handlers to catch the exceptions. This function is only available
 | 
						|
  on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to read.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldRead64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit
 | 
						|
  )
 | 
						|
{
 | 
						|
  return BitFieldRead64 (AsmReadMsr64 (Index), StartBit, EndBit);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Writes a bit field to an MSR.
 | 
						|
 | 
						|
  Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
 | 
						|
  the StartBit and the EndBit. All other bits in the destination MSR are
 | 
						|
  preserved. The MSR written is returned. Extra left bits in Value are
 | 
						|
  stripped. The caller must either guarantee that Index and the data written is
 | 
						|
  valid, or the caller must set up exception handlers to catch the exceptions.
 | 
						|
  This function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  Value     New value of the bit field.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldWrite64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT64                    Value
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (
 | 
						|
           Index,
 | 
						|
           BitFieldWrite64 (AsmReadMsr64 (Index), StartBit, EndBit, Value)
 | 
						|
           );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise inclusive OR, and
 | 
						|
  writes the result back to the bit field in the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
 | 
						|
  between the read result and the value specified by OrData, and writes the
 | 
						|
  result to the 64-bit MSR specified by Index. The value written to the MSR is
 | 
						|
  returned. Extra left bits in OrData are stripped. The caller must either
 | 
						|
  guarantee that Index and the data written is valid, or the caller must set up
 | 
						|
  exception handlers to catch the exceptions. This function is only available
 | 
						|
  on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  OrData    The value to OR with the read value from the bit field.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldOr64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT64                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (
 | 
						|
           Index,
 | 
						|
           BitFieldOr64 (AsmReadMsr64 (Index), StartBit, EndBit, OrData)
 | 
						|
           );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
 | 
						|
  result back to the bit field in the 64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
 | 
						|
  read result and the value specified by AndData, and writes the result to the
 | 
						|
  64-bit MSR specified by Index. The value written to the MSR is returned.
 | 
						|
  Extra left bits in AndData are stripped. The caller must either guarantee
 | 
						|
  that Index and the data written is valid, or the caller must set up exception
 | 
						|
  handlers to catch the exceptions. This function is only available on IA-32
 | 
						|
  and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  AndData   The value to AND with the read value from the bit field.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldAnd64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT64                    AndData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (
 | 
						|
           Index,
 | 
						|
           BitFieldAnd64 (AsmReadMsr64 (Index), StartBit, EndBit, AndData)
 | 
						|
           );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
 | 
						|
  bitwise inclusive OR, and writes the result back to the bit field in the
 | 
						|
  64-bit MSR.
 | 
						|
 | 
						|
  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
 | 
						|
  a bitwise inclusive OR between the read result and the value specified by
 | 
						|
  AndData, and writes the result to the 64-bit MSR specified by Index. The
 | 
						|
  value written to the MSR is returned. Extra left bits in both AndData and
 | 
						|
  OrData are stripped. The caller must either guarantee that Index and the data
 | 
						|
  written is valid, or the caller must set up exception handlers to catch the
 | 
						|
  exceptions. This function is only available on IA-32 and X64.
 | 
						|
 | 
						|
  If StartBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is greater than 63, then ASSERT().
 | 
						|
  If EndBit is less than StartBit, then ASSERT().
 | 
						|
 | 
						|
  @param  Index     The 32-bit MSR index to write.
 | 
						|
  @param  StartBit  The ordinal of the least significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  EndBit    The ordinal of the most significant bit in the bit field.
 | 
						|
                    Range 0..63.
 | 
						|
  @param  AndData   The value to AND with the read value from the bit field.
 | 
						|
  @param  OrData    The value to OR with the result of the AND operation.
 | 
						|
 | 
						|
  @return The value written back to the MSR.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
EFIAPI
 | 
						|
AsmMsrBitFieldAndThenOr64 (
 | 
						|
  IN      UINT32                    Index,
 | 
						|
  IN      UINTN                     StartBit,
 | 
						|
  IN      UINTN                     EndBit,
 | 
						|
  IN      UINT64                    AndData,
 | 
						|
  IN      UINT64                    OrData
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AsmWriteMsr64 (
 | 
						|
           Index,
 | 
						|
           BitFieldAndThenOr64 (
 | 
						|
             AsmReadMsr64 (Index),
 | 
						|
             StartBit,
 | 
						|
             EndBit,
 | 
						|
             AndData,
 | 
						|
             OrData
 | 
						|
             )
 | 
						|
           );
 | 
						|
}
 |