x86msr.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 658 行 · 第 1/2 页
C
658 行
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
)
);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?