Date   
Re: [PATCH v4 22/35] OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall

Roger Pau Monné
 

On Thu, Aug 08, 2019 at 11:41:18AM +0100, Anthony PERARD wrote:
On Wed, Aug 07, 2019 at 05:14:33PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:31PM +0100, Anthony PERARD wrote:
When the Xen PVH entry point has been used, hvmloader hasn't run and
hasn't prepared an E820 table. The only way left to get an E820 table
is to ask Xen via an hypercall, the call can only be made once so keep
the result cached for later.
I think we agreed that the above is not true, and that the memory
map can be fetched as many times as desired using the hypercall
interface.
Yes, I'll change the commit message. How about:

When the Xen PVH entry point has been used, hvmloader hasn't run and
hasn't prepared an E820 table. The only way left to get an E820 table
is to ask Xen via an hypercall. We keep the result cached to avoid
making a second hypercall which would give the same result.
LGTM, thanks.

Re: [PATCH v4 20/35] OvmfPkg/XenPlatformPei: Introduce XenPvhDetected

Roger Pau Monné
 

On Thu, Aug 08, 2019 at 11:38:13AM +0100, Anthony PERARD wrote:
On Wed, Aug 07, 2019 at 05:03:46PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:29PM +0100, Anthony PERARD wrote:
+BOOLEAN
+XenPvhDetected (
+ VOID
+ )
+{
+ //
+ // This function should only be used after XenConnect
+ //
+ ASSERT (mXenInfo.VersionMajor != 0);
That's IMO dangerous. Using the version as an indication that
XenConnect has run seems like a bad idea, since returning a major
version of 0 is a valid number to return. Can't you check against
something else that doesn't depends on hypervisor provided data? (ie:
like some allocations or such that happen in XenConnect)

A paranoid could provider could even return major == 0 and minor == 0
in order to attempt to hide the Xen version used, since guests are not
supposed to infer anything from the Xen version, available hypervisor
features are reported by other means.
I'm sure a paranoid provider wouldn't use a debug build of OVMF :-). So
that assert doesn't matter. There's nothing dangerous in a `nop'! :-D

But I could use mXenInfo.HyperPages instead.
It's just a nit, and TBH it's quite unlikely for anyone to report a
major version of 0, it's just that if you have something else to
assert for initialization it might be safer.

Thanks, Roger.

Re: [PATCH v4 22/35] OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall

Anthony PERARD
 

On Wed, Aug 07, 2019 at 05:14:33PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:31PM +0100, Anthony PERARD wrote:
When the Xen PVH entry point has been used, hvmloader hasn't run and
hasn't prepared an E820 table. The only way left to get an E820 table
is to ask Xen via an hypercall, the call can only be made once so keep
the result cached for later.
I think we agreed that the above is not true, and that the memory
map can be fetched as many times as desired using the hypercall
interface.
Yes, I'll change the commit message. How about:

When the Xen PVH entry point has been used, hvmloader hasn't run and
hasn't prepared an E820 table. The only way left to get an E820 table
is to ask Xen via an hypercall. We keep the result cached to avoid
making a second hypercall which would give the same result.

Thanks,

--
Anthony PERARD

Re: [PATCH v4 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct

Roger Pau Monné
 

On Thu, Aug 08, 2019 at 11:26:41AM +0100, Anthony PERARD wrote:
On Wed, Aug 07, 2019 at 04:35:58PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:21PM +0100, Anthony PERARD wrote:
Check if there's a start of the day struct provided to PVH guest, save
the ACPI RSDP address for later.

This patch import import arch-x86/hvm/start_info.h from xen.git.
You seem to change the types when importing start_info.h, is that
absolutely necessary?
I guess one could try to map xen's types to EDKII's type with typedefs,
but I'm not sur how well that would work. Importing the xen headers is
documented so changing the types is fairly easy, see
https://github.com/tianocore/edk2/blob/master/OvmfPkg/Include/IndustryStandard/Xen/README

Also, changing the header further might have been something useful to
do, we could have match EDKII's naming convention and source files would
have looked a bit less weird.
Ack, didn't know there was a README for this procedure.

From my experience working with different projects when importing such
headers it's better to keep them verbatim, this makes importing future
versions from upstream easier.

I have a comment below, but it's more like a question.

diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
index 5c7d7ddc1c..b366139a0a 100644
--- a/OvmfPkg/XenPlatformPei/Xen.c
+++ b/OvmfPkg/XenPlatformPei/Xen.c
@@ -25,6 +25,7 @@
#include <IndustryStandard/E820.h>
#include <Library/ResourcePublicationLib.h>
#include <Library/MtrrLib.h>
+#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>

#include "Platform.h"
#include "Xen.h"
@@ -86,6 +87,7 @@ XenConnect (
UINT32 XenVersion;
EFI_XEN_OVMF_INFO *Info;
CHAR8 Sig[sizeof (Info->Signature) + 1];
+ UINT32 *PVHResetVectorData;

AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
mXenInfo.HyperPages = AllocatePages (TransferPages);
@@ -121,6 +123,29 @@ XenConnect (
mXenHvmloaderInfo = NULL;
}

+ mXenInfo.RsdpPvh = NULL;
+
+ //
+ // Locate and use information from the start of day structure if we have
+ // booted via the PVH entry point.
+ //
+
+ PVHResetVectorData = (VOID *)(UINTN) PcdGet32 (PcdXenPvhStartOfDayStructPtr);
+ //
+ // That magic value is written in XenResetVector/Ia32/XenPVHMain.asm
+ //
+ if (PVHResetVectorData[1] == SIGNATURE_32 ('X', 'P', 'V', 'H')) {
+ struct hvm_start_info *HVMStartInfo;
+
+ HVMStartInfo = (VOID *)(UINTN) PVHResetVectorData[0];
+ if (HVMStartInfo->magic == XEN_HVM_START_MAGIC_VALUE) {
+ ASSERT (HVMStartInfo->rsdp_paddr != 0);
+ if (HVMStartInfo->rsdp_paddr != 0) {
+ mXenInfo.RsdpPvh = (VOID *)(UINTN)HVMStartInfo->rsdp_paddr;
I guess you can do this because OVMF has an identity map of virtual
addresses to physical addresses?
I think so, yes. I know that early code does created page table like
that, but I don't know if later code rework those page table or not.

I wonder the size of such identity map, and whether you need to check
that the rsdp address is indeed inside of that region before
converting it to a pointer. The same would apply to
PcdXenPvhStartOfDayStructPtr, but that's likely safe because it's
always < 4GB, which I assume OVMF always has identity mapped?
PcdXenPvhStartOfDayStructPtr is safe because OVMF owns it. As for the
rspd_paddr* and the HVMStartInfo*, I need to check. As you say, it's
probably fine as long as it's <4GB.

I've looked at the comment here:
https://github.com/tianocore/edk2/blob/master/OvmfPkg/ResetVector/Ia32/PageTables64.asm#L94
This mean that the code executed in the patch (accessing the hvm start
info struct) is executed while the id map is setup up to 4GB. So as long
as the struct is below 4G, it's fine.
Yes, the start_info struct is guaranteed to be below 4GB because the
physical memory address of it is passed on a register when starting
the kernel in 32bit protected mode, so the address cannot be greater
than 4GB or it would be truncated.

As for the RSDP, I think that pointer is accessed much later, when a
different page table is setup, I think that would be that code:
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
But I'm not sure how much is setup. But I'm guessing that whatever is
pointed by RSDP, it will be in the 1:1, because we tell the UEFI about
it while parsing the e820.
OK, as long as we know it's safe to access. Note it's quite likely the
rsdp is also below 4GB anyway, but better be safe than sorry.

Thanks, Roger.

Re: [PATCH v4 20/35] OvmfPkg/XenPlatformPei: Introduce XenPvhDetected

Anthony PERARD
 

On Wed, Aug 07, 2019 at 05:03:46PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:29PM +0100, Anthony PERARD wrote:
+BOOLEAN
+XenPvhDetected (
+ VOID
+ )
+{
+ //
+ // This function should only be used after XenConnect
+ //
+ ASSERT (mXenInfo.VersionMajor != 0);
That's IMO dangerous. Using the version as an indication that
XenConnect has run seems like a bad idea, since returning a major
version of 0 is a valid number to return. Can't you check against
something else that doesn't depends on hypervisor provided data? (ie:
like some allocations or such that happen in XenConnect)

A paranoid could provider could even return major == 0 and minor == 0
in order to attempt to hide the Xen version used, since guests are not
supposed to infer anything from the Xen version, available hypervisor
features are reported by other means.
I'm sure a paranoid provider wouldn't use a debug build of OVMF :-). So
that assert doesn't matter. There's nothing dangerous in a `nop'! :-D

But I could use mXenInfo.HyperPages instead.

Thanks,

--
Anthony PERARD

Re: [PATCH v4 12/35] OvmfPkg/XenPlatformPei: Grab RSDP from PVH guest start of day struct

Anthony PERARD
 

On Wed, Aug 07, 2019 at 04:35:58PM +0200, Roger Pau Monné wrote:
On Mon, Jul 29, 2019 at 04:39:21PM +0100, Anthony PERARD wrote:
Check if there's a start of the day struct provided to PVH guest, save
the ACPI RSDP address for later.

This patch import import arch-x86/hvm/start_info.h from xen.git.
You seem to change the types when importing start_info.h, is that
absolutely necessary?
I guess one could try to map xen's types to EDKII's type with typedefs,
but I'm not sur how well that would work. Importing the xen headers is
documented so changing the types is fairly easy, see
https://github.com/tianocore/edk2/blob/master/OvmfPkg/Include/IndustryStandard/Xen/README

Also, changing the header further might have been something useful to
do, we could have match EDKII's naming convention and source files would
have looked a bit less weird.

From my experience working with different projects when importing such
headers it's better to keep them verbatim, this makes importing future
versions from upstream easier.

I have a comment below, but it's more like a question.

diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
index 5c7d7ddc1c..b366139a0a 100644
--- a/OvmfPkg/XenPlatformPei/Xen.c
+++ b/OvmfPkg/XenPlatformPei/Xen.c
@@ -25,6 +25,7 @@
#include <IndustryStandard/E820.h>
#include <Library/ResourcePublicationLib.h>
#include <Library/MtrrLib.h>
+#include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>

#include "Platform.h"
#include "Xen.h"
@@ -86,6 +87,7 @@ XenConnect (
UINT32 XenVersion;
EFI_XEN_OVMF_INFO *Info;
CHAR8 Sig[sizeof (Info->Signature) + 1];
+ UINT32 *PVHResetVectorData;

AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
mXenInfo.HyperPages = AllocatePages (TransferPages);
@@ -121,6 +123,29 @@ XenConnect (
mXenHvmloaderInfo = NULL;
}

+ mXenInfo.RsdpPvh = NULL;
+
+ //
+ // Locate and use information from the start of day structure if we have
+ // booted via the PVH entry point.
+ //
+
+ PVHResetVectorData = (VOID *)(UINTN) PcdGet32 (PcdXenPvhStartOfDayStructPtr);
+ //
+ // That magic value is written in XenResetVector/Ia32/XenPVHMain.asm
+ //
+ if (PVHResetVectorData[1] == SIGNATURE_32 ('X', 'P', 'V', 'H')) {
+ struct hvm_start_info *HVMStartInfo;
+
+ HVMStartInfo = (VOID *)(UINTN) PVHResetVectorData[0];
+ if (HVMStartInfo->magic == XEN_HVM_START_MAGIC_VALUE) {
+ ASSERT (HVMStartInfo->rsdp_paddr != 0);
+ if (HVMStartInfo->rsdp_paddr != 0) {
+ mXenInfo.RsdpPvh = (VOID *)(UINTN)HVMStartInfo->rsdp_paddr;
I guess you can do this because OVMF has an identity map of virtual
addresses to physical addresses?
I think so, yes. I know that early code does created page table like
that, but I don't know if later code rework those page table or not.

I wonder the size of such identity map, and whether you need to check
that the rsdp address is indeed inside of that region before
converting it to a pointer. The same would apply to
PcdXenPvhStartOfDayStructPtr, but that's likely safe because it's
always < 4GB, which I assume OVMF always has identity mapped?
PcdXenPvhStartOfDayStructPtr is safe because OVMF owns it. As for the
rspd_paddr* and the HVMStartInfo*, I need to check. As you say, it's
probably fine as long as it's <4GB.

I've looked at the comment here:
https://github.com/tianocore/edk2/blob/master/OvmfPkg/ResetVector/Ia32/PageTables64.asm#L94
This mean that the code executed in the patch (accessing the hvm start
info struct) is executed while the id map is setup up to 4GB. So as long
as the struct is below 4G, it's fine.

As for the RSDP, I think that pointer is accessed much later, when a
different page table is setup, I think that would be that code:
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
But I'm not sure how much is setup. But I'm guessing that whatever is
pointed by RSDP, it will be in the 1:1, because we tell the UEFI about
it while parsing the e820.

Thanks,

--
Anthony PERARD

Re: [PATCH 1/1] BaseTools: Remove tool chain in tools_def.template

Leif Lindholm
 

Hi Shenglei,

On Thu, Aug 08, 2019 at 04:09:18PM +0800, Zhang, Shenglei wrote:
Remove definition of RVCT, RVCTLINUX, RVCTCYGWIN and CLANG35
in tools_def.template. These tool chains are for ARM and AARCH64 only.
There is no change recently and they are not used.
https://bugzilla.tianocore.org/show_bug.cgi?id=1750
This still does not address my comment in the BZ that deleting all
RVCT profiles before full VS support is enabled for (32-bit) ARM, we
orphan an awful lot of .asm files.

This may not have much of a practical effect, since I doubt anyone is
using these toolchains today - but it does prevent someone from
actively going through and testing future updates (where before, they
may just have neglected to do so).

This point needs discussing rather than ignoring, and I think we're
getting too close to the freeze to consider the patch to go in as is
at this point.

Whenever this patch does go in should be in the week after a stable
tag is made, to give plenty of time for anyone affected to shout
before the next stable tag is made.

After the 2019.08 stable tag has been made, I am happy for a patch
going in that deletes CLANG35, RVCTCYGWIN and *one*of* RVCT/RVCTLINUX.

The deletion of the final RVCT profile needs further discussion.

Best Regards,

Leif

Re: [PATCH 2/3] ShellPkg/UefiShellAcpiViewCommandLib: Add missing header files in INF

Gao, Zhichao
 

Reviewed-by: Zhichao Gao <zhichao.gao@...>

Thanks,
Zhichao

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Zhang, Shenglei
Sent: Thursday, August 8, 2019 2:25 PM
To: devel@edk2.groups.io
Cc: Carsey, Jaben <jaben.carsey@...>; Ni, Ray <ray.ni@...>;
Gao, Zhichao <zhichao.gao@...>
Subject: [edk2-devel] [PATCH 2/3] ShellPkg/UefiShellAcpiViewCommandLib:
Add missing header files in INF

MadtParser.h and PpttParser.h are actually used but missing INF file, which
will generate warning message when building this package.

Cc: Jaben Carsey <jaben.carsey@...>
Cc: Ray Ni <ray.ni@...>
Cc: Zhichao Gao <zhichao.gao@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
---
.../UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf | 2 ++
1 file changed, 2 insertions(+)

diff --git
a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm
andLib.inf
b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm
andLib.inf
index e06e2082a197..1e2fa52b00a3 100644
---
a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm
andLib.inf
+++
b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm
+++ andLib.inf
@@ -43,6 +43,8 @@ [Sources.common]
Parsers/Srat/SratParser.c
Parsers/Ssdt/SsdtParser.c
Parsers/Xsdt/XsdtParser.c
+ Parsers/Madt/MadtParser.h
+ Parsers/Pptt/PpttParser.h

[Packages]
MdePkg/MdePkg.dec
--
2.18.0.windows.1


Capsule PCI device firmware update, could capsule embedded driver override PCI option ROM driver?

Lin, Derek (HPS SW)
 

Hi,

I have searched EDK2 devel discussion and Mantis but I couldn't find answer.


Recently we found some PCI card vendor release capsule to update device firmware.

Background:
The PCI card has option ROM which provide FMP service.
The capsule has a firmware payload and device driver which also provide FMP.

Problem:
The vendor put option ROM device driver into capsule, the only differences is it is newer version.
The FMP in old PCI option ROM is not functional.
Thus they put a new device driver in capsule, and expect UEFI to disconnect the old option ROM driver, and connect the new one from capsule.

This is different to current EDK2 implementation. UEFI spec 2.8 CH 23.3.3 define process to handle capsule and embedded driver, it will call embedded driver's entry point, but won't connect anything.

Our PCI card vendor is asking to disconnect old option ROM driver, and connect new driver from capsule.
It makes sense for device vendor to simply provide a device driver in capsule.


Any advice? Do you think it make sense to disconnect PCI option ROM driver and reconnect capsule driver?

Thanks,
Derek

Re: [edk2-platforms] [PATCH v2 0/6] Fix the boot order, SMBIOS, and capsule GUIDs of Minnowboard

Gary Lin
 

On Thu, Aug 08, 2019 at 07:26:04AM +0000, Michael D Kinney wrote:
Hi Gary,
Hi Michael,

Thank you for these patches.

I am seeing one behavior change in the setup forms.
The following 2 forms are missing information that
used to be filled in. I will help look into this
tomorrow.

1) Device Manager -> System Setup -> Main

2) Device Manager -> System Setup -> Main -> Platform Information
I built another firmware without my patches and those information were
still missing, so the bug is probably introduced by other patch.

Thanks,

Gary Lin

Best regards,

Mike

-----Original Message-----
From: Gary Lin [mailto:GLin@...]
Sent: Tuesday, July 30, 2019 1:16 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@...>; Qian, Yi
<yi.qian@...>; Kinney, Michael D
<michael.d.kinney@...>
Subject: [edk2-platforms] [PATCH v2 0/6] Fix the boot
order, SMBIOS, and capsule GUIDs of Minnowboard

After switching to MdeModulePkg BdsDxe, the boot option
created by OS was always put at the end of BootOrder
after reboot. Besides, the PXE boot options were always
the first boot options.

The 1st to 3rd patches fix the priority of boot options
and stop sorting the boot options after the first boot.
The missing BootManagerMenuApp is also added back.

The 4th patch cleans up PlatformBootOption.c to remove
the unused variables and function.

The 5th patch adds some missing bits of BIOS
Characteristics Extension in SMBIOS, so that fwupd can
detect the system correctly.

The 6th patch converts the device GUIDs in metainfo.xml
to lowercase to be compatible with LVFS/fwupd.

The patches are also available in my github branch:
https://github.com/lcp/edk2-platforms/tree/fix-
minnowboard-bds-v2

v2:
* Add the missing MSG_URI_DP to BootOptionPriority()
* Update the descriptioins of 2nd and 4th patches
* Add the 5th and 6th patches

Cc: Zailiang Sun <zailiang.sun@...>
Cc: Yi Qian <yi.qian@...>
Cc: Michael D Kinney <michael.d.kinney@...>

Gary Lin (6):
Vlv2TbltDevicePkg: Adjust the device priority
Vlv2TbltDevicePkg: Add the missing BootManagerMenuApp
Vlv2TbltDevicePkg: Only sort boot options when
necessary
Vlv2TbltDevicePkg: Clean up the unused variables and
function
Vlv2TbltDevicePkg: Add the missing SMBIOS bits
Vlv2TbltDevicePkg: Convert the device GUIDs of
capsules to lowercase


Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Genera
teCapsule/GenCapsuleAll.py | 24 +++---

Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoo
tManagerLib/BdsPlatform.c | 9 +-

Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoo
tManagerLib/PlatformBootOption.c | 86 ++++++-----------
---
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
| 3 +-
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
| 1 +
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
| 1 +

Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubR
ecords.h | 5 +-

Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBios
VendorData.c | 5 +-
8 files changed, 54 insertions(+), 80 deletions(-)

--
2.22.0



[PATCH 1/1] BaseTools: Remove tool chain in tools_def.template

Zhang, Shenglei
 

Remove definition of RVCT, RVCTLINUX, RVCTCYGWIN and CLANG35
in tools_def.template. These tool chains are for ARM and AARCH64 only.
There is no change recently and they are not used.
https://bugzilla.tianocore.org/show_bug.cgi?id=1750

Cc: Bob Feng <bob.c.feng@...>
Cc: Liming Gao <liming.gao@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Cc: Leif Lindholm <leif.lindholm@...>
Cc: Eugene Cohen <eugene@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
---
BaseTools/Conf/tools_def.template | 240 ------------------------------
1 file changed, 240 deletions(-)

diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 26a2cf604f74..a65cd276bc6e 100755
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -236,12 +236,6 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc
# Required to build platforms or ACPI tables:
# Intel(r) ACPI Compiler from
# https://acpica.org/downloads
-# CLANG35 -Linux,Windows- Requires:
-# Clang v3.5 or later, and GNU binutils targeting aarch64-linux-gnu or arm-linux-gnueabi
-# Optional:
-# Required to build platforms or ACPI tables:
-# Intel(r) ACPI Compiler from
-# https://acpica.org/downloads
# CLANG38 -Linux- Requires:
# Clang v3.8, LLVMgold plugin and GNU binutils 2.26 targeting x86_64-linux-gnu, aarch64-linux-gnu or arm-linux-gnueabi
# Clang v3.9 or later, LLVMgold plugin and GNU binutils 2.28 targeting x86_64-linux-gnu, aarch64-linux-gnu or arm-linux-gnueabi
@@ -284,20 +278,6 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc
# Required to build platforms or ACPI tables:
# Intel(r) ACPI Compiler (iasl.exe) from
# https://acpica.org/downloads
-# RVCT -win- Requires:
-# ARM C/C++ Compiler, 5.00
-# Optional:
-# Required to build EBC drivers:
-# Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler)
-# Required to build platforms or ACPI tables:
-# Microsoft ASL ACPI Compiler (asl.exe) v4.0.0 from
-# http://download.microsoft.com/download/2/c/1/2c16c7e0-96c1-40f5-81fc-3e4bf7b65496/microsoft_asl_compiler-v4-0-0.msi
-# RVCTLINUX -unix- Requires:
-# ARM C/C++ Compiler, 5.00
-# Optional:
-# Required to build platforms or ACPI tables:
-# Intel(r) ACPI Compiler from
-# https://acpica.org/downloads
# * Commented out - All versions of VS2005 use the same standard install directory
#
####################################################################################
@@ -308,7 +288,6 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc
# MSFT - Microsoft
# GCC - GNU GCC
# INTEL - INTEL
-# RVCT - ARM RealView Toolchain
####################################################################################
####################################################################################
#
@@ -2247,87 +2226,6 @@ RELEASE_GCC5_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20
NOOPT_GCC5_AARCH64_DLINK_FLAGS = DEF(GCC5_AARCH64_DLINK_FLAGS) -O0
NOOPT_GCC5_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 -O0

-####################################################################################
-#
-# CLANG35 - This configuration is used to compile under Linux to produce
-# PE/COFF binaries using the clang compiler and assembler (v3.5 and up)
-# and GNU linker
-#
-####################################################################################
-*_CLANG35_*_*_FAMILY = GCC
-
-*_CLANG35_*_MAKE_PATH = make
-*_CLANG35_*_*_DLL = ENV(CLANG35_DLL)
-*_CLANG35_*_ASL_PATH = DEF(UNIX_IASL_BIN)
-
-*_CLANG35_*_PP_FLAGS = DEF(GCC_PP_FLAGS)
-*_CLANG35_*_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
-*_CLANG35_*_APP_FLAGS =
-*_CLANG35_*_ASL_FLAGS = DEF(IASL_FLAGS)
-*_CLANG35_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS)
-*_CLANG35_*_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS)
-
-*_CLANG35_*_CC_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_ASM_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_PP_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_VFRPP_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_ASLCC_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_ASLPP_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_DLINK_PATH = ENV(CLANG35_BIN)clang
-*_CLANG35_*_ASLDLINK_PATH = ENV(CLANG35_BIN)clang
-
-DEFINE CLANG35_ARM_TARGET = -target arm-linux-gnueabi
-DEFINE CLANG35_AARCH64_TARGET = -target aarch64-linux-gnu
-
-DEFINE CLANG35_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unknown-warning-option
-DEFINE CLANG35_ARM_CC_FLAGS = DEF(GCC_ARM_CC_FLAGS) DEF(CLANG35_ARM_TARGET) DEF(CLANG35_WARNING_OVERRIDES)
-DEFINE CLANG35_AARCH64_CC_FLAGS = DEF(GCC_AARCH64_CC_FLAGS) DEF(CLANG35_AARCH64_TARGET) -mcmodel=small DEF(CLANG35_WARNING_OVERRIDES)
-
-##################
-# CLANG35 ARM definitions
-##################
-*_CLANG35_ARM_SLINK_PATH = ENV(CLANG35_ARM_PREFIX)ar
-*_CLANG35_ARM_RC_PATH = ENV(CLANG35_ARM_PREFIX)objcopy
-
-*_CLANG35_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
-*_CLANG35_ARM_ASLDLINK_FLAGS = DEF(CLANG35_ARM_TARGET) DEF(GCC_ARM_ASLDLINK_FLAGS)
-*_CLANG35_ARM_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -Qunused-arguments
-*_CLANG35_ARM_DLINK_FLAGS = DEF(CLANG35_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS)
-*_CLANG35_ARM_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x220
-*_CLANG35_ARM_PLATFORM_FLAGS = -march=armv7-a -mkernel -Qunused-arguments
-*_CLANG35_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
-*_CLANG35_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS)
-*_CLANG35_ARM_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANG35_ARM_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
-*_CLANG35_ARM_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANG35_ARM_TARGET)
-*_CLANG35_ARM_CC_XIPFLAGS = DEF(GCC_ARM_CC_XIPFLAGS)
-
- DEBUG_CLANG35_ARM_CC_FLAGS = DEF(CLANG35_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O1
-RELEASE_CLANG35_ARM_CC_FLAGS = DEF(CLANG35_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -Oz
- NOOPT_CLANG35_ARM_CC_FLAGS = DEF(CLANG35_ARM_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0
-
-##################
-# CLANG35 AARCH64 definitions
-##################
-*_CLANG35_AARCH64_SLINK_PATH = ENV(CLANG35_AARCH64_PREFIX)ar
-*_CLANG35_AARCH64_RC_PATH = ENV(CLANG35_AARCH64_PREFIX)objcopy
-
-*_CLANG35_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
-*_CLANG35_AARCH64_ASLDLINK_FLAGS = DEF(CLANG35_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS)
-*_CLANG35_AARCH64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANG35_AARCH64_TARGET) $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -Qunused-arguments
-*_CLANG35_AARCH64_DLINK_FLAGS = DEF(CLANG35_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000
-*_CLANG35_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20
-*_CLANG35_AARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228
-*_CLANG35_AARCH64_PLATFORM_FLAGS =
-*_CLANG35_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANG35_AARCH64_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
-*_CLANG35_AARCH64_RC_FLAGS = DEF(GCC_AARCH64_RC_FLAGS)
-*_CLANG35_AARCH64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANG35_AARCH64_TARGET) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
-*_CLANG35_AARCH64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANG35_AARCH64_TARGET)
-*_CLANG35_AARCH64_CC_XIPFLAGS = DEF(GCC_AARCH64_CC_XIPFLAGS)
-
- DEBUG_CLANG35_AARCH64_CC_FLAGS = DEF(CLANG35_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O1
-RELEASE_CLANG35_AARCH64_CC_FLAGS = DEF(CLANG35_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -Oz
- NOOPT_CLANG35_AARCH64_CC_FLAGS = DEF(CLANG35_AARCH64_CC_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0
-
####################################################################################
#
# Clang 3.8 - This configuration is used to compile under Linux to produce
@@ -2597,144 +2495,6 @@ RELEASE_XCODE5_X64_ASM_FLAGS = -arch x86_64
NOOPT_XCODE5_X64_CC_FLAGS = -target x86_64-pc-win32-macho -c -g -O0 -Wall -Werror -Wextra -include AutoGen.h -funsigned-char -fno-ms-extensions -fno-stack-protector -fno-builtin -fshort-wchar -mno-implicit-float -mms-bitfields -Wno-unused-parameter -Wno-missing-braces -Wno-missing-field-initializers -Wno-tautological-compare -Wno-sign-compare -Wno-varargs -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -D NO_MSABI_VA_FUNCS $(PLATFORM_FLAGS)
RELEASE_XCODE5_X64_CC_FLAGS = -target x86_64-pc-win32-macho -c -Os -Wall -Werror -Wextra -include AutoGen.h -funsigned-char -fno-ms-extensions -fno-stack-protector -fno-builtin -fshort-wchar -mno-implicit-float -mms-bitfields -Wno-unused-parameter -Wno-missing-braces -Wno-missing-field-initializers -Wno-tautological-compare -Wno-sign-compare -Wno-varargs -Wno-unused-const-variable -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -D NO_MSABI_VA_FUNCS $(PLATFORM_FLAGS)

-####################################################################################
-#
-# RVCT Common
-#
-####################################################################################
-
-DEFINE RVCT_ALL_ASM_FLAGS = --diag_suppress=1786 --diag_error=warning --apcs /interwork
-DEFINE RVCT_ALL_CC_FLAGS = --c90 --no_autoinline --asm --gnu --apcs /interwork --signed_chars --no_unaligned_access --split_sections --enum_is_int --preinclude AutoGen.h --diag_suppress=186,188,1,111,68 --diag_warning 167 --diag_error=warning --diag_style=ide --protect_stack
-DEFINE RVCT_ALL_DLINK_FLAGS = --no_scanlib --no_exceptions --datacompressor off --strict --symbols --diag_style=ide --no_legacyalign --scatter $(EDK_TOOLS_PATH)/Scripts/Rvct-Align32.sct
-
-####################################################################################
-#
-# ARM RealView Tools - Windows
-#
-####################################################################################
-# RVCT - Tools from ARM
-
-*_RVCT_*_*_FAMILY = RVCT
-
-#
-# Use default values, or override in DSC file
-#
-*_RVCT_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp
-*_RVCT_ARM_ARCHASM_FLAGS =
-*_RVCT_ARM_ARCHDLINK_FLAGS =
-*_RVCT_ARM_PLATFORM_FLAGS = --cpu 7-A
-
- DEBUG_RVCT_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-RELEASE_RVCT_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-
-
-*_RVCT_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_ASM_FLAGS)
-*_RVCT_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E --preinclude AutoGen.h
-*_RVCT_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -DVFRCOMPILE --preinclude $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
-*_RVCT_ARM_MAKE_PATH = nmake /NOLOGO
-*_RVCT_ARM_SLINK_FLAGS = --partial -o
- DEBUG_RVCT_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_CC_FLAGS) -O1 -g
-RELEASE_RVCT_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --diag_suppress=550 DEF(RVCT_ALL_CC_FLAGS) -O2
-
-##################
-# ARM definitions
-##################
-*_RVCT_ARM_CC_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCT_ARM_SLINK_PATH = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCT_ARM_DLINK_PATH = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCT_ARM_ASM_PATH = ENV(RVCT_TOOLS_PATH)armasm
-*_RVCT_ARM_PP_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCT_ARM_VFRPP_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCT_ARM_FROMELF_PATH = ENV(RVCT_TOOLS_PATH)fromelf
-
-####################################################################################
-#
-# ARM RealView Tools - Linux
-#
-####################################################################################
-# RVCTLINUX - Tools from ARM in a Cygwin environment
-*_RVCTLINUX_*_*_FAMILY = RVCT
-*_RVCTLINUX_*_*_BUILDRULEFAMILY = RVCTLINUX
-
-*_RVCTLINUX_*_MAKE_PATH = make
-
-#
-# Use default values, or override in DSC file
-#
-*_RVCTLINUX_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp
-*_RVCTLINUX_ARM_ARCHASM_FLAGS =
-*_RVCTLINUX_ARM_ARCHDLINK_FLAGS =
-*_RVCTLINUX_ARM_PLATFORM_FLAGS = --cpu 7-A
-
-DEBUG_RVCTLINUX_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-RELEASE_RVCTLINUX_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-
-*_RVCTLINUX_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_ASM_FLAGS)
-*_RVCTLINUX_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E
-*_RVCTLINUX_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -DVFRCOMPILE --preinclude $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
-*_RVCTLINUX_ARM_SLINK_FLAGS = --partial -o
- DEBUG_RVCTLINUX_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_CC_FLAGS) -O1 -g
-RELEASE_RVCTLINUX_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --diag_suppress=550 DEF(RVCT_ALL_CC_FLAGS) -O2
-
-##################
-# ARM definitions
-##################
-*_RVCTLINUX_ARM_CC_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTLINUX_ARM_SLINK_PATH = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCTLINUX_ARM_DLINK_PATH = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCTLINUX_ARM_ASM_PATH = ENV(RVCT_TOOLS_PATH)armasm
-*_RVCTLINUX_ARM_PP_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTLINUX_ARM_VFRPP_PATH = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTLINUX_ARM_FROMELF_PATH = ENV(RVCT_TOOLS_PATH)fromelf
-
-####################################################################################
-#
-# ARM RealView Tools - Cygwin
-#
-####################################################################################
-# ARMCYGWIN - Tools from ARM in a Cygwin environment
-
-*_RVCTCYGWIN_*_*_FAMILY = RVCT
-*_RVCTCYGWIN_*_*_BUILDRULEFAMILY = RVCTCYGWIN
-
-*_RVCTCYGWIN_ARM_CCPATH_FLAG = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTCYGWIN_ARM_SLINKPATH_FLAG = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCTCYGWIN_ARM_DLINKPATH_FLAG = ENV(RVCT_TOOLS_PATH)armlink
-*_RVCTCYGWIN_ARM_ASMPATH_FLAG = ENV(RVCT_TOOLS_PATH)armasm
-*_RVCTCYGWIN_ARM_PPPATH_FLAG = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTCYGWIN_ARM_VFRPPPATH_FLAG = ENV(RVCT_TOOLS_PATH)armcc
-*_RVCTCYGWIN_ARM_FROMELFPATH_FLAG = ENV(RVCT_TOOLS_PATH)fromelf
-
-#
-# Use default values, or override in DSC file
-#
-*_RVCTCYGWIN_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp
-*_RVCTCYGWIN_ARM_ARCHASM_FLAGS =
-*_RVCTCYGWIN_ARM_ARCHDLINK_FLAGS =
-*_RVCTCYGWIN_ARM_PLATFORM_FLAGS = --cpu 7-A
-
- DEBUG_RVCTCYGWIN_ARM_DLINK_FLAGS = "$(DLINKPATH_FLAG)" $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list `cygpath -m $(DEST_DIR_DEBUG)/$(BASE_NAME).map`
-RELEASE_RVCTCYGWIN_ARM_DLINK_FLAGS = "$(DLINKPATH_FLAG)" $(ARCHDLINK_FLAGS) DEF(RVCT_ALL_DLINK_FLAGS) --entry $(IMAGE_ENTRY_POINT) --map --list `cygpath -m $(DEST_DIR_DEBUG)/$(BASE_NAME).map`
-
-*_RVCTCYGWIN_ARM_ASM_FLAGS = "$(ASMPATH_FLAG)" $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_ASM_FLAGS)
-*_RVCTCYGWIN_ARM_PP_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E
-*_RVCTCYGWIN_ARM_VFRPP_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -DVFRCOMPILE --preinclude `cygpath -m $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h`
-*_RVCTCYGWIN_ARM_MAKE_PATH = make
-*_RVCTCYGWIN_ARM_SLINK_FLAGS = "$(SLINKPATH_FLAG)" --partial -o
- DEBUG_RVCTCYGWIN_ARM_CC_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(RVCT_ALL_CC_FLAGS) -O1 -g
-RELEASE_RVCTCYGWIN_ARM_CC_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --diag_suppress=550 DEF(RVCT_ALL_CC_FLAGS) -O2
-
-##################
-# ARM definitions
-##################
-*_RVCTCYGWIN_ARM_CC_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_SLINK_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_DLINK_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_ASM_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_PP_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_VFRPP_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-*_RVCTCYGWIN_ARM_FROMELF_PATH = ENV(WORKSPACE)/BaseTools/Bin/CYGWIN_NT-5.1-i686/armcc_wrapper.py
-
#################
# ASM 16 linker definitions
#################
--
2.18.0.windows.1

Re: [PATCH 00/14] Multiple Controllers Support solution

Eric Jin
 

Liming and Dandan,

Thank you for the comments. Will follow up.

Best Regards
Eric

-----Original Message-----
From: Gao, Liming
Sent: Thursday, August 8, 2019 2:35 PM
To: devel@edk2.groups.io; Bi, Dandan <dandan.bi@...>; Jin, Eric <eric.jin@...>
Subject: RE: [edk2-devel] [PATCH 00/14] Multiple Controllers Support solution

Eric:
I review this patch set. I think patch 14 can be merged into patch 4, patch 13 can be merged into patch 5.

And, patch 2 introduces new APIs in FmpDeviceLib. I see edk2-platform Platform\Intel\Vlv2TbltDevicePkg\Feature\Capsule\Library\FmpDeviceLib
is the FmpDeviceLib library instance. Have you the patch to update it to support new APIs?

Last, ECC reports some issues. Please make sure they be fixed in next version.

"All include file contents should be guarded by a #ifndef statement.",FmpDevicePkg\CapsuleUpdatePolicyDxe\CapsuleUpdatePolicyDxe.h,1,""
FmpDevicePkg\Library\FmpDeviceLibNull\FmpDeviceLib.c,71,"in Comment, <@param[in, out]> does NOT have [out] "
FmpDevicePkg\Include\Library\FmpDeviceLib.h,107,"in Comment, <@param[in, out]> does NOT have [out] "
FmpDevicePkg\FmpDxe\FmpDxe.c,202,"No doxygen tags in comment "
FmpDevicePkg\FmpDxe\FmpDxe.c,261,"No doxygen tags in comment "

Thanks
Liming
-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Dandan Bi
Sent: Tuesday, August 06, 2019 4:11 PM
To: devel@edk2.groups.io; Jin, Eric <eric.jin@...>
Subject: Re: [edk2-devel] [PATCH 00/14] Multiple Controllers Support
solution

Hi Eric,

This patch series also can be consolidated to a smaller patch set.
Please help double check.


Thanks,
Dandan

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Eric Jin
Sent: Thursday, August 1, 2019 4:39 PM
To: devel@edk2.groups.io
Subject: [edk2-devel] [PATCH 00/14] Multiple Controllers Support
solution

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1525

The patch set is to support drivers that manage multiple controllers
and also provide a firmware update capability to each managed controller.

The following modules are related to Multiple Controllers Support
solution

FmpDevicePkg\FmpDxe\FmpDxe.inf - Driver to manage multiple
controllers and provide the firmware update capability to each managed controller.
FmpDevicePkg\CapsuleUpdatePolicyDxe\CapsuleUpdatePolicyDxe.inf -
Driver to produce the Capsule Update Policy Protocol using the
services of the CapsuleUpdatePolicyLib class. The protocol is a
private interface to the FmpDevicePkg
FmpDevicePkg\Library\CapsuleUpdatePolicyLibOnProtocol\CapsuleUpdateP
olicyLibOnProtocol.inf - CapsuleUpdatePolicyLib instance that uses
the services of the Capsule Update Policy Protocol produced by
CapsuleUpdatePolicyDxe
FmpDevicePkg\Library\CapsuleUpdatePolicyLibNull\CapsuleUpdatePolicyLi
b Null.inf - Null CapsuleUpdatePolicyLib instance and the template
for
platform
specific implementation
FmpDevicePkg\Library\FmpDeviceLibNull\FmpDeviceLibNull.inf - Null
FmpDeviceLib instance and the template for platform specific
implementation


Eric Jin (14):
FmpDevicePkg: Add UEFI_DRIVER support
FmpDevicePkg: Add APIs to FmpDeviceLib
FmpDEvicePkg/FmpDeviceLibNull: Implement new APIs
FmpDevicePkg/FmpDxe: Use new FmpDeviceLib APIs
FmpDevicePkg/FmpDxe: Different variable for each FMP Descriptor
FmpDevicePkg: Add Capsule Update Policy Protocol
FmpDevicePkg/FmpDxe: Improve all DEBUG() messages
FmpDevicePkg/FmpDxe: Add PcdFmpDeviceImageTypeIdGuid
FmpDevicePkg/FmpDxe: Add PcdFmpDeviceStorageAccessEnable
FmpDevicePkg/FmpDxe: Remove use of CatSprint()
FmpDevicePkg/FmpDxe: Fix SetLowestSupportedVersionInVariable()
FmpDevicePkg/FmpDxe: Change where FmpControllerState is updated
FmpDevicePkg/FmpDxe: Fix code indent
FmpDevicePkg/FmpDxe: Add FmpDxe.h to [Sources]

.../CapsuleUpdatePolicyDxe.c | 173 ++++
.../CapsuleUpdatePolicyDxe.h | 135 +++
.../CapsuleUpdatePolicyDxe.inf | 48 +
.../CapsuleUpdatePolicyDxe.uni | 14 +
.../CapsuleUpdatePolicyDxeExtra.uni | 14 +
FmpDevicePkg/FmpDevicePkg.dec | 43 +-
FmpDevicePkg/FmpDevicePkg.dsc | 64 +-
FmpDevicePkg/FmpDevicePkg.uni | 16 +-
FmpDevicePkg/FmpDxe/DetectTestKey.c | 16 +-
FmpDevicePkg/FmpDxe/FmpDxe.c | 787 ++++++++++------
FmpDevicePkg/FmpDxe/FmpDxe.h | 355 ++++++++
FmpDevicePkg/FmpDxe/FmpDxe.inf | 7 +-
FmpDevicePkg/FmpDxe/FmpDxeLib.inf | 7 +-
FmpDevicePkg/FmpDxe/VariableSupport.c | 844 +++++++++++++-----
FmpDevicePkg/FmpDxe/VariableSupport.h | 135 ++-
FmpDevicePkg/Include/Library/FmpDeviceLib.h | 104 ++-
.../CapsuleUpdatePolicyLibOnProtocol.c | 171 ++++
.../CapsuleUpdatePolicyLibOnProtocol.inf | 40 +
.../CapsuleUpdatePolicyLibOnProtocol.uni | 15 +
.../Library/FmpDeviceLibNull/FmpDeviceLib.c | 93 +-
.../FmpDeviceLibNull/FmpDeviceLibNull.inf | 4 +-
.../FmpPayloadHeaderLibV1.inf | 4 +-
.../Library/FmpPayloadHeaderLib.h | 0
.../Protocol/CapsuleUpdatePolicy.h | 132 +++
24 files changed, 2635 insertions(+), 586 deletions(-) create mode
100644 FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.c
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.h
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.inf
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.uni
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxeExtra.uni
create mode 100644 FmpDevicePkg/FmpDxe/FmpDxe.h create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.c
create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.inf
create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.uni
rename FmpDevicePkg/{Include =>
PrivateInclude}/Library/FmpPayloadHeaderLib.h (100%) create mode
100644 FmpDevicePkg/PrivateInclude/Protocol/CapsuleUpdatePolicy.h

--
2.20.1.windows.1



[PATCH v2] UefiCpuPkg/PiSmmCpuDxeSmm: Fix coding style

Zhang, Shenglei
 

1. Update CPUStatus to CpuStatus in comments to align comments
with code.
2. Add "OUT" attribute for "ProcedureArguments" parameter in function
header.

Cc: Eric Dong <eric.dong@...>
Cc: Ray Ni <ray.ni@...>
Cc: Laszlo Ersek <lersek@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
---
v2: Add "OUT" attribute for "ProcedureArguments" parameter in both function
header and comments,in MpService.c.
UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 6 +++---
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
index 328d7ae53a49..d8d2b6f44461 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
@@ -1967,7 +1967,7 @@ RegisterSmmEntry (
EFI_MP_SERVICES_PROTOCOL.StartupAllAPs.
If caller may pass a value of NULL to deregister any existing
startup procedure.
- @param[in] ProcedureArguments Allows the caller to pass a list of parameters to the code that is
+ @param[in,out] ProcedureArguments Allows the caller to pass a list of parameters to the code that is
run by the AP. It is an optional common mailbox between APs and
the caller to share information

@@ -1977,8 +1977,8 @@ RegisterSmmEntry (
**/
EFI_STATUS
RegisterStartupProcedure (
- IN EFI_AP_PROCEDURE Procedure,
- IN VOID *ProcedureArguments OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN OUT VOID *ProcedureArguments OPTIONAL
)
{
if (Procedure == NULL && ProcedureArguments != NULL) {
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
index a0e59f20886b..7b3fbc8b55ec 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
@@ -1311,7 +1311,7 @@ RestoreCr2 (
Note that timeout support is optional. Whether an implementation
supports this feature can be determined via the Attributes data
member.
- @param[in,out] CPUStatus This optional pointer may be used to get the status code returned
+ @param[in,out] CpuStatus This optional pointer may be used to get the status code returned
by Procedure when it completes execution on the target AP, or with
EFI_TIMEOUT if the Procedure fails to complete within the optional
timeout. The implementation will update this variable with
@@ -1437,8 +1437,8 @@ InternalSmmStartupAllAPs (
**/
EFI_STATUS
RegisterStartupProcedure (
- IN EFI_AP_PROCEDURE Procedure,
- IN VOID *ProcedureArguments OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN OUT VOID *ProcedureArguments OPTIONAL
);

/**
--
2.18.0.windows.1

Re: [edk2-platforms] [PATCH v2 0/6] Fix the boot order, SMBIOS, and capsule GUIDs of Minnowboard

Michael D Kinney
 

Hi Gary,

Thank you for these patches.

I am seeing one behavior change in the setup forms.
The following 2 forms are missing information that
used to be filled in. I will help look into this
tomorrow.

1) Device Manager -> System Setup -> Main

2) Device Manager -> System Setup -> Main -> Platform Information

Best regards,

Mike

-----Original Message-----
From: Gary Lin [mailto:GLin@...]
Sent: Tuesday, July 30, 2019 1:16 AM
To: devel@edk2.groups.io
Cc: Sun, Zailiang <zailiang.sun@...>; Qian, Yi
<yi.qian@...>; Kinney, Michael D
<michael.d.kinney@...>
Subject: [edk2-platforms] [PATCH v2 0/6] Fix the boot
order, SMBIOS, and capsule GUIDs of Minnowboard

After switching to MdeModulePkg BdsDxe, the boot option
created by OS was always put at the end of BootOrder
after reboot. Besides, the PXE boot options were always
the first boot options.

The 1st to 3rd patches fix the priority of boot options
and stop sorting the boot options after the first boot.
The missing BootManagerMenuApp is also added back.

The 4th patch cleans up PlatformBootOption.c to remove
the unused variables and function.

The 5th patch adds some missing bits of BIOS
Characteristics Extension in SMBIOS, so that fwupd can
detect the system correctly.

The 6th patch converts the device GUIDs in metainfo.xml
to lowercase to be compatible with LVFS/fwupd.

The patches are also available in my github branch:
https://github.com/lcp/edk2-platforms/tree/fix-
minnowboard-bds-v2

v2:
* Add the missing MSG_URI_DP to BootOptionPriority()
* Update the descriptioins of 2nd and 4th patches
* Add the 5th and 6th patches

Cc: Zailiang Sun <zailiang.sun@...>
Cc: Yi Qian <yi.qian@...>
Cc: Michael D Kinney <michael.d.kinney@...>

Gary Lin (6):
Vlv2TbltDevicePkg: Adjust the device priority
Vlv2TbltDevicePkg: Add the missing BootManagerMenuApp
Vlv2TbltDevicePkg: Only sort boot options when
necessary
Vlv2TbltDevicePkg: Clean up the unused variables and
function
Vlv2TbltDevicePkg: Add the missing SMBIOS bits
Vlv2TbltDevicePkg: Convert the device GUIDs of
capsules to lowercase


Platform/Intel/Vlv2TbltDevicePkg/Feature/Capsule/Genera
teCapsule/GenCapsuleAll.py | 24 +++---

Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoo
tManagerLib/BdsPlatform.c | 9 +-

Platform/Intel/Vlv2TbltDevicePkg/Library/DxePlatformBoo
tManagerLib/PlatformBootOption.c | 86 ++++++-----------
---
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkg.fdf
| 3 +-
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc
| 1 +
Platform/Intel/Vlv2TbltDevicePkg/PlatformPkgX64.dsc
| 1 +

Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/DataHubR
ecords.h | 5 +-

Platform/Intel/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscBios
VendorData.c | 5 +-
8 files changed, 54 insertions(+), 80 deletions(-)

--
2.22.0

Re: [PATCH 3/3] IntelFsp2Pkg/FspSecCore: Add missing header file in INF file

Chiu, Chasel
 

Please extend copyright to 2019 of this file.
With above change Reviewed-by: Chasel Chiu <chasel.chiu@...>

-----Original Message-----
From: Zhang, Shenglei
Sent: Thursday, August 8, 2019 2:25 PM
To: devel@edk2.groups.io
Cc: Chiu, Chasel <chasel.chiu@...>; Desimone, Nathaniel L
<@natedesimone>; Zeng, Star <star.zeng@...>
Subject: [PATCH 3/3] IntelFsp2Pkg/FspSecCore: Add missing header file in INF
file

SecFsp.h is used but missing inf file, which will cause generating warning
message.

Cc: Chasel Chiu <chasel.chiu@...>
Cc: Nate DeSimone <@natedesimone>
Cc: Star Zeng <star.zeng@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
---
IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf | 1 +
1 file changed, 1 insertion(+)

diff --git a/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
b/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
index 3de09b5b4921..86d3d31d3269 100644
--- a/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
+++ b/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
@@ -22,6 +22,7 @@ [Defines]

[Sources]
SecFspApiChk.c
+ SecFsp.h

[Sources.IA32]
Ia32/Stack.nasm
--
2.18.0.windows.1

Re: [PATCH 00/14] Multiple Controllers Support solution

Liming Gao
 

Eric:
I review this patch set. I think patch 14 can be merged into patch 4, patch 13 can be merged into patch 5.

And, patch 2 introduces new APIs in FmpDeviceLib. I see edk2-platform Platform\Intel\Vlv2TbltDevicePkg\Feature\Capsule\Library\FmpDeviceLib
is the FmpDeviceLib library instance. Have you the patch to update it to support new APIs?

Last, ECC reports some issues. Please make sure they be fixed in next version.

"All include file contents should be guarded by a #ifndef statement.",FmpDevicePkg\CapsuleUpdatePolicyDxe\CapsuleUpdatePolicyDxe.h,1,""
FmpDevicePkg\Library\FmpDeviceLibNull\FmpDeviceLib.c,71,"in Comment, <@param[in, out]> does NOT have [out] "
FmpDevicePkg\Include\Library\FmpDeviceLib.h,107,"in Comment, <@param[in, out]> does NOT have [out] "
FmpDevicePkg\FmpDxe\FmpDxe.c,202,"No doxygen tags in comment "
FmpDevicePkg\FmpDxe\FmpDxe.c,261,"No doxygen tags in comment "

Thanks
Liming

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Dandan Bi
Sent: Tuesday, August 06, 2019 4:11 PM
To: devel@edk2.groups.io; Jin, Eric <eric.jin@...>
Subject: Re: [edk2-devel] [PATCH 00/14] Multiple Controllers Support solution

Hi Eric,

This patch series also can be consolidated to a smaller patch set.
Please help double check.


Thanks,
Dandan

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Eric Jin
Sent: Thursday, August 1, 2019 4:39 PM
To: devel@edk2.groups.io
Subject: [edk2-devel] [PATCH 00/14] Multiple Controllers Support solution

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1525

The patch set is to support drivers that manage multiple controllers and also
provide a firmware update capability to each managed controller.

The following modules are related to Multiple Controllers Support solution

FmpDevicePkg\FmpDxe\FmpDxe.inf - Driver to manage multiple controllers
and provide the firmware update capability to each managed controller.
FmpDevicePkg\CapsuleUpdatePolicyDxe\CapsuleUpdatePolicyDxe.inf -
Driver to produce the Capsule Update Policy Protocol using the services of
the CapsuleUpdatePolicyLib class. The protocol is a private interface to the
FmpDevicePkg
FmpDevicePkg\Library\CapsuleUpdatePolicyLibOnProtocol\CapsuleUpdateP
olicyLibOnProtocol.inf - CapsuleUpdatePolicyLib instance that uses the
services of the Capsule Update Policy Protocol produced by
CapsuleUpdatePolicyDxe
FmpDevicePkg\Library\CapsuleUpdatePolicyLibNull\CapsuleUpdatePolicyLib
Null.inf - Null CapsuleUpdatePolicyLib instance and the template for
platform
specific implementation
FmpDevicePkg\Library\FmpDeviceLibNull\FmpDeviceLibNull.inf - Null
FmpDeviceLib instance and the template for platform specific
implementation


Eric Jin (14):
FmpDevicePkg: Add UEFI_DRIVER support
FmpDevicePkg: Add APIs to FmpDeviceLib
FmpDEvicePkg/FmpDeviceLibNull: Implement new APIs
FmpDevicePkg/FmpDxe: Use new FmpDeviceLib APIs
FmpDevicePkg/FmpDxe: Different variable for each FMP Descriptor
FmpDevicePkg: Add Capsule Update Policy Protocol
FmpDevicePkg/FmpDxe: Improve all DEBUG() messages
FmpDevicePkg/FmpDxe: Add PcdFmpDeviceImageTypeIdGuid
FmpDevicePkg/FmpDxe: Add PcdFmpDeviceStorageAccessEnable
FmpDevicePkg/FmpDxe: Remove use of CatSprint()
FmpDevicePkg/FmpDxe: Fix SetLowestSupportedVersionInVariable()
FmpDevicePkg/FmpDxe: Change where FmpControllerState is updated
FmpDevicePkg/FmpDxe: Fix code indent
FmpDevicePkg/FmpDxe: Add FmpDxe.h to [Sources]

.../CapsuleUpdatePolicyDxe.c | 173 ++++
.../CapsuleUpdatePolicyDxe.h | 135 +++
.../CapsuleUpdatePolicyDxe.inf | 48 +
.../CapsuleUpdatePolicyDxe.uni | 14 +
.../CapsuleUpdatePolicyDxeExtra.uni | 14 +
FmpDevicePkg/FmpDevicePkg.dec | 43 +-
FmpDevicePkg/FmpDevicePkg.dsc | 64 +-
FmpDevicePkg/FmpDevicePkg.uni | 16 +-
FmpDevicePkg/FmpDxe/DetectTestKey.c | 16 +-
FmpDevicePkg/FmpDxe/FmpDxe.c | 787 ++++++++++------
FmpDevicePkg/FmpDxe/FmpDxe.h | 355 ++++++++
FmpDevicePkg/FmpDxe/FmpDxe.inf | 7 +-
FmpDevicePkg/FmpDxe/FmpDxeLib.inf | 7 +-
FmpDevicePkg/FmpDxe/VariableSupport.c | 844 +++++++++++++-----
FmpDevicePkg/FmpDxe/VariableSupport.h | 135 ++-
FmpDevicePkg/Include/Library/FmpDeviceLib.h | 104 ++-
.../CapsuleUpdatePolicyLibOnProtocol.c | 171 ++++
.../CapsuleUpdatePolicyLibOnProtocol.inf | 40 +
.../CapsuleUpdatePolicyLibOnProtocol.uni | 15 +
.../Library/FmpDeviceLibNull/FmpDeviceLib.c | 93 +-
.../FmpDeviceLibNull/FmpDeviceLibNull.inf | 4 +-
.../FmpPayloadHeaderLibV1.inf | 4 +-
.../Library/FmpPayloadHeaderLib.h | 0
.../Protocol/CapsuleUpdatePolicy.h | 132 +++
24 files changed, 2635 insertions(+), 586 deletions(-)
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.c
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.h
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.inf
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxe.uni
create mode 100644
FmpDevicePkg/CapsuleUpdatePolicyDxe/CapsuleUpdatePolicyDxeExtra.uni
create mode 100644 FmpDevicePkg/FmpDxe/FmpDxe.h
create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.c
create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.inf
create mode 100644
FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdateP
olicyLibOnProtocol.uni
rename FmpDevicePkg/{Include =>
PrivateInclude}/Library/FmpPayloadHeaderLib.h (100%)
create mode 100644
FmpDevicePkg/PrivateInclude/Protocol/CapsuleUpdatePolicy.h

--
2.20.1.windows.1



Re: [Patch v5 0/9] Support 5-level paging in DXE long mode

Dong, Eric
 

Please ignore this serial which error adds "Signed-off-by: Eric Dong.." tag by git tool.

V6 serial has been send out.

Thanks,
Eric

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Dong, Eric
Sent: Thursday, August 8, 2019 2:15 PM
To: devel@edk2.groups.io
Subject: [edk2-devel] [Patch v5 0/9] Support 5-level paging in DXE long mode

V5:
Correct the copyright time.
Update print format code.

v4:
Move all files under UefiCpuPkg/Include/Register/ to MdePkg.
NOTE: Changes like updating BaseLib.h to include Cpuid.h is not included.

v3:
Move UefiCpuPkg/Include/Register/Cpuid.h to
MdePkg/Include/Register/Intel/ directory.
Create UefiCpuPkg/Include/Register/Cpuid.h to include
MdePkg/Include/Register/Intel/Cpuid.h.
NOTE:
Changes like moving Amd/Cpuid.h to MdePkg is not included.
Changes like updating BaseLib.h to include Cpuid.h is not included.

v2:
Refined the patch according to reviewers' all comments except:
0A0h cannot be changed to A0h or build fails.
A big change in this patch is Cpuid.h is moved from UefiCpuPkg to MdePkg.
The move is based on real requirement when certain modules that cannot
depend on UefiCpuPkg but needs to reference structures defined in SDM.


Eric Dong (1):
OvmfPkg/PlatformPei: Change referenced MSR name.

Ni, Ray (8):
UefiCpuPkg/MpInitLib: Enable 5-level paging for AP when BSP's enabled
UefiCpuPkg/CpuDxe: Remove unnecessary macros
UefiCpuPkg/CpuDxe: Support parsing 5-level page table
MdeModulePkg/DxeIpl: Introduce PCD PcdUse5LevelPageTable
MdePkg/Cpuid.h: Move Cpuid.h from UefiCpuPkg to MdePkg
MdeModulePkg/DxeIpl: Create 5-level page table for long mode
UefiCpuPkg|MdePkg: Move Register/ folder to MdePkg/Include/
UefiCpuPkg: Update code to include register definitions from MdePkg

MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 1 +
.../Core/DxeIplPeim/X64/VirtualMemory.c | 229 +-
MdeModulePkg/MdeModulePkg.dec | 7 +
MdeModulePkg/MdeModulePkg.uni | 7 +
.../Include/Register/Amd/Cpuid.h | 0
.../Include/Register/Amd/Fam17Msr.h | 0
.../Include/Register/Amd/Msr.h | 4 +-
.../Include/Register/Intel/ArchitecturalMsr.h | 6572 +++++++++++++++++
MdePkg/Include/Register/Intel/Cpuid.h | 3997 ++++++++++
MdePkg/Include/Register/Intel/LocalApic.h | 183 +
MdePkg/Include/Register/Intel/Microcode.h | 194 +
MdePkg/Include/Register/Intel/Msr.h | 44 +
.../Include/Register/Intel}/Msr/AtomMsr.h | 4 +-
.../Register/Intel}/Msr/BroadwellMsr.h | 4 +-
.../Include/Register/Intel}/Msr/Core2Msr.h | 4 +-
.../Include/Register/Intel}/Msr/CoreMsr.h | 4 +-
.../Include/Register/Intel}/Msr/GoldmontMsr.h | 4 +-
.../Register/Intel}/Msr/GoldmontPlusMsr.h | 4 +-
.../Include/Register/Intel}/Msr/HaswellEMsr.h | 4 +-
.../Include/Register/Intel}/Msr/HaswellMsr.h | 4 +-
.../Register/Intel}/Msr/IvyBridgeMsr.h | 4 +-
.../Include/Register/Intel}/Msr/NehalemMsr.h | 4 +-
.../Include/Register/Intel}/Msr/P6Msr.h | 4 +-
.../Include/Register/Intel}/Msr/Pentium4Msr.h | 4 +-
.../Include/Register/Intel}/Msr/PentiumMMsr.h | 4 +-
.../Include/Register/Intel}/Msr/PentiumMsr.h | 4 +-
.../Register/Intel}/Msr/SandyBridgeMsr.h | 4 +-
.../Register/Intel}/Msr/SilvermontMsr.h | 4 +-
.../Include/Register/Intel}/Msr/SkylakeMsr.h | 4 +-
.../Include/Register/Intel}/Msr/Xeon5600Msr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonDMsr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonE7Msr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonPhiMsr.h | 4 +-
.../Register/Intel/SmramSaveStateMap.h | 184 +
MdePkg/Include/Register/Intel/StmApi.h | 948 +++
.../Register/Intel}/StmResourceDescriptor.h | 6 +-
.../Include/Register/Intel}/StmStatusCode.h | 6 +-
OvmfPkg/PlatformPei/FeatureControl.c | 4 +-
UefiCpuPkg/Application/Cpuid/Cpuid.c | 2 +-
UefiCpuPkg/CpuDxe/CpuDxe.h | 4 +-
UefiCpuPkg/CpuDxe/CpuPageTable.c | 63 +-
UefiCpuPkg/CpuDxe/CpuPageTable.h | 3 +-
UefiCpuPkg/CpuMpPei/CpuPaging.c | 6 +-
.../Include/Library/RegisterCpuFeaturesLib.h | 2 +-
.../Include/Library/SmmCpuFeaturesLib.h | 2 +-
UefiCpuPkg/Include/Protocol/SmMonitorInit.h | 4 +-
.../Include/Register/ArchitecturalMsr.h | 6565 +---------------
UefiCpuPkg/Include/Register/Cpuid.h | 3988 +---------
UefiCpuPkg/Include/Register/LocalApic.h | 175 +-
UefiCpuPkg/Include/Register/Microcode.h | 187 +-
UefiCpuPkg/Include/Register/Msr.h | 36 +-
.../Include/Register/SmramSaveStateMap.h | 179 +-
UefiCpuPkg/Include/Register/StmApi.h | 941 +--
.../Library/BaseXApicLib/BaseXApicLib.c | 6 +-
.../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 6 +-
.../CpuCommonFeaturesLib/CpuCommonFeatures.h | 6 +-
UefiCpuPkg/Library/MpInitLib/MpLib.c | 13 +
UefiCpuPkg/Library/MpInitLib/MpLib.h | 12 +-
UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc | 3 +-
UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 14 +-
UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 4 +-
.../SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 6 +-
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c | 6 +-
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 4 +-
UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 2 -
65 files changed, 12471 insertions(+), 12238 deletions(-) rename
{UefiCpuPkg => MdePkg}/Include/Register/Amd/Cpuid.h (100%) rename
{UefiCpuPkg => MdePkg}/Include/Register/Amd/Fam17Msr.h (100%)
rename {UefiCpuPkg => MdePkg}/Include/Register/Amd/Msr.h (78%)
create mode 100644 MdePkg/Include/Register/Intel/ArchitecturalMsr.h
create mode 100644 MdePkg/Include/Register/Intel/Cpuid.h
create mode 100644 MdePkg/Include/Register/Intel/LocalApic.h
create mode 100644 MdePkg/Include/Register/Intel/Microcode.h
create mode 100644 MdePkg/Include/Register/Intel/Msr.h
rename {UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/AtomMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/BroadwellMsr.h (95%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/Core2Msr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/CoreMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/GoldmontMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/GoldmontPlusMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/HaswellEMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/HaswellMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/IvyBridgeMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/NehalemMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/P6Msr.h (95%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/Pentium4Msr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/PentiumMMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/PentiumMsr.h (93%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/SandyBridgeMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/SilvermontMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/SkylakeMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/Xeon5600Msr.h (94%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/XeonDMsr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/XeonE7Msr.h (96%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/Msr/XeonPhiMsr.h (96%) create mode
100644 MdePkg/Include/Register/Intel/SmramSaveStateMap.h
create mode 100644 MdePkg/Include/Register/Intel/StmApi.h
rename {UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/StmResourceDescriptor.h (92%) rename
{UefiCpuPkg/Include/Register =>
MdePkg/Include/Register/Intel}/StmStatusCode.h (94%)

--
2.21.0.windows.1


[Patch v6 9/9] UefiCpuPkg: Update code to include register definitions from MdePkg

Dong, Eric
 

From: "Ni, Ray" <ray.ni@...>

Signed-off-by: Ray Ni <ray.ni@...>
Reviewed-by: Eric Dong <eric.dong@...>
Regression-tested-by: Laszlo Ersek <lersek@...>
---
UefiCpuPkg/Application/Cpuid/Cpuid.c | 2 +-
UefiCpuPkg/CpuDxe/CpuDxe.h | 4 ++--
UefiCpuPkg/CpuDxe/CpuPageTable.c | 4 ++--
UefiCpuPkg/CpuMpPei/CpuPaging.c | 6 +++---
UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h | 2 +-
UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h | 2 +-
UefiCpuPkg/Include/Protocol/SmMonitorInit.h | 4 ++--
UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c | 6 +++---
.../Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 6 +++---
.../Library/CpuCommonFeaturesLib/CpuCommonFeatures.h | 6 +++---
UefiCpuPkg/Library/MpInitLib/MpLib.h | 8 ++++----
UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 4 ++--
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 6 +++---
UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c | 6 +++---
UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 4 ++--
UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 2 --
16 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/UefiCpuPkg/Application/Cpuid/Cpuid.c b/UefiCpuPkg/Application/Cpuid/Cpuid.c
index 2f907034e6..7a994eba9a 100644
--- a/UefiCpuPkg/Application/Cpuid/Cpuid.c
+++ b/UefiCpuPkg/Application/Cpuid/Cpuid.c
@@ -9,7 +9,7 @@
#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
-#include <Register/Cpuid.h>
+#include <Register/Intel/Cpuid.h>

///
/// Macro used to display the value of a bit field in a register returned by CPUID.
diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.h b/UefiCpuPkg/CpuDxe/CpuDxe.h
index b029be430b..a6762f1a0b 100644
--- a/UefiCpuPkg/CpuDxe/CpuDxe.h
+++ b/UefiCpuPkg/CpuDxe/CpuDxe.h
@@ -1,7 +1,7 @@
/** @file
CPU DXE Module to produce CPU ARCH Protocol and CPU MP Protocol.

- Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
@@ -13,7 +13,7 @@

#include <Protocol/Cpu.h>
#include <Protocol/MpService.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Msr.h>

#include <Ppi/SecPlatformInformation.h>
#include <Ppi/SecPlatformInformation2.h>
diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c
index 36ce90d66c..ec5cd424fc 100644
--- a/UefiCpuPkg/CpuDxe/CpuPageTable.c
+++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c
@@ -15,8 +15,8 @@
#include <Library/SynchronizationLib.h>
#include <Library/PrintLib.h>
#include <Protocol/SmmBase2.h>
-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>

#include "CpuDxe.h"
#include "CpuPageTable.h"
diff --git a/UefiCpuPkg/CpuMpPei/CpuPaging.c b/UefiCpuPkg/CpuMpPei/CpuPaging.c
index 57a75539ee..a462e7ee1e 100644
--- a/UefiCpuPkg/CpuMpPei/CpuPaging.c
+++ b/UefiCpuPkg/CpuMpPei/CpuPaging.c
@@ -1,14 +1,14 @@
/** @file
Basic paging support for the CPU to enable Stack Guard.

-Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/CpuLib.h>
#include <Library/BaseLib.h>
diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
index 191348d770..e420e7f075 100644
--- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
+++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
@@ -10,7 +10,7 @@
#define __REGISTER_CPU_FEATURES_LIB_H__

#include <AcpiCpuData.h>
-#include <Register/Cpuid.h>
+#include <Register/Intel/Cpuid.h>
#include <Protocol/MpService.h>

///
diff --git a/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h b/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h
index e6c5679e13..39ca304b31 100644
--- a/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h
+++ b/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h
@@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent

#include <Protocol/MpService.h>
#include <Protocol/SmmCpu.h>
-#include <Register/SmramSaveStateMap.h>
+#include <Register/Intel/SmramSaveStateMap.h>
#include <CpuHotPlugData.h>

///
diff --git a/UefiCpuPkg/Include/Protocol/SmMonitorInit.h b/UefiCpuPkg/Include/Protocol/SmMonitorInit.h
index fa57cb18a5..db2ce11f1e 100644
--- a/UefiCpuPkg/Include/Protocol/SmMonitorInit.h
+++ b/UefiCpuPkg/Include/Protocol/SmMonitorInit.h
@@ -1,7 +1,7 @@
/** @file
STM service protocol definition

- Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
@@ -10,7 +10,7 @@
#define _SM_MONITOR_INIT_PROTOCOL_H_

#include <PiSmm.h>
-#include <Register/StmApi.h>
+#include <Register/Intel/StmApi.h>

#define EFI_SM_MONITOR_INIT_PROTOCOL_GUID \
{ 0x228f344d, 0xb3de, 0x43bb, 0xa4, 0xd7, 0xea, 0x20, 0xb, 0x1b, 0x14, 0x82}
diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c
index 89f4f6550f..33ea15ca29 100644
--- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c
+++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c
@@ -10,10 +10,10 @@

**/

-#include <Register/Cpuid.h>
+#include <Register/Intel/Cpuid.h>
#include <Register/Amd/Cpuid.h>
-#include <Register/Msr.h>
-#include <Register/LocalApic.h>
+#include <Register/Intel/Msr.h>
+#include <Register/Intel/LocalApic.h>

#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c
index 89eeb3a955..d0f92b33dc 100644
--- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c
+++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c
@@ -11,10 +11,10 @@

**/

-#include <Register/Cpuid.h>
+#include <Register/Intel/Cpuid.h>
#include <Register/Amd/Cpuid.h>
-#include <Register/Msr.h>
-#include <Register/LocalApic.h>
+#include <Register/Intel/Msr.h>
+#include <Register/Intel/LocalApic.h>

#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h
index 8406c6c161..25d0174727 100644
--- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h
+++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h
@@ -1,7 +1,7 @@
/** @file
CPU Common features library header file.

- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
@@ -19,8 +19,8 @@
#include <Library/MemoryAllocationLib.h>
#include <Library/LocalApicLib.h>

-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>

/**
Prepares for the data used by CPU feature detection and initialization.
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 4b12f91d47..107872b367 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -11,10 +11,10 @@

#include <PiPei.h>

-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
-#include <Register/LocalApic.h>
-#include <Register/Microcode.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>
+#include <Register/Intel/LocalApic.h>
+#include <Register/Intel/Microcode.h>

#include <Library/MpInitLib.h>
#include <Library/BaseLib.h>
diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
index 9415897b48..dfa848022b 100644
--- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
+++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
@@ -11,8 +11,8 @@
**/

#include <Uefi.h>
-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>

#include <Library/MtrrLib.h>
#include <Library/BaseLib.h>
diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c
index 0e7fd80488..bddb7a219c 100644
--- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c
@@ -1,7 +1,7 @@
/** @file
The CPU specific programming for PiSmmCpuDxeSmm module.

-Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
@@ -13,8 +13,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/PcdLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
-#include <Register/Cpuid.h>
-#include <Register/SmramSaveStateMap.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/SmramSaveStateMap.h>

//
// Machine Specific Registers (MSRs)
diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c
index 82c63da002..52a376c27d 100644
--- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c
+++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c
@@ -15,9 +15,9 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/SmmServicesTableLib.h>
#include <Library/TpmMeasurementLib.h>
-#include <Register/Cpuid.h>
-#include <Register/ArchitecturalMsr.h>
-#include <Register/SmramSaveStateMap.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/ArchitecturalMsr.h>
+#include <Register/Intel/SmramSaveStateMap.h>

#include <Protocol/MpService.h>

diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
index 186809f431..92f0db351c 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
@@ -53,8 +53,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <AcpiCpuData.h>
#include <CpuHotPlugData.h>

-#include <Register/Cpuid.h>
-#include <Register/Msr.h>
+#include <Register/Intel/Cpuid.h>
+#include <Register/Intel/Msr.h>

#include "CpuService.h"
#include "SmmProfile.h"
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c
index 11102c9cbf..b1a492725a 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c
@@ -14,8 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/BaseMemoryLib.h>
#include <Library/SmmServicesTableLib.h>
#include <Library/DebugLib.h>
-#include <Register/Cpuid.h>
-#include <Register/SmramSaveStateMap.h>

#include "PiSmmCpuDxeSmm.h"

--
2.21.0.windows.1

[Patch v6 8/9] UefiCpuPkg|MdePkg: Move Register/ folder to MdePkg/Include/

Dong, Eric
 

From: "Ni, Ray" <ray.ni@...>

The patch moves all files under UefiCpuPkg/Include/Register/ to
MdePkg/Include/Register using following detailed approaches:
1. Move UefiCpuPkg/Include/Register/Amd/ to
MdePkg/Include/Register/Amd folder.
2. Move remaining in UefiCpuPkg/Include/Register/ to
MdePkg/Include/Register/Intel folder.
3. Create wrapper header files under UefiCpuPkg/Include/Register/
to include the accordingly files in MdePkg/Include/Register/Intel.
This is to avoid build break because code in other repos like
edk2-platform includes the file from UefiCpuPkg.

The wrapper header files will be removed after all consumers code
is updated.

Signed-off-by: Ray Ni <ray.ni@...>
Reviewed-by: Eric Dong <eric.dong@...>
Regression-tested-by: Laszlo Ersek <lersek@...>
Reviewed-by: Liming Gao <liming.gao@...>
---
.../Include/Register/Amd/Cpuid.h | 0
.../Include/Register/Amd/Fam17Msr.h | 0
.../Include/Register/Amd/Msr.h | 4 +-
.../Include/Register/Intel/ArchitecturalMsr.h | 6572 +++++++++++++++++
MdePkg/Include/Register/Intel/LocalApic.h | 183 +
MdePkg/Include/Register/Intel/Microcode.h | 194 +
MdePkg/Include/Register/Intel/Msr.h | 44 +
.../Include/Register/Intel}/Msr/AtomMsr.h | 4 +-
.../Register/Intel}/Msr/BroadwellMsr.h | 4 +-
.../Include/Register/Intel}/Msr/Core2Msr.h | 4 +-
.../Include/Register/Intel}/Msr/CoreMsr.h | 4 +-
.../Include/Register/Intel}/Msr/GoldmontMsr.h | 4 +-
.../Register/Intel}/Msr/GoldmontPlusMsr.h | 4 +-
.../Include/Register/Intel}/Msr/HaswellEMsr.h | 4 +-
.../Include/Register/Intel}/Msr/HaswellMsr.h | 4 +-
.../Register/Intel}/Msr/IvyBridgeMsr.h | 4 +-
.../Include/Register/Intel}/Msr/NehalemMsr.h | 4 +-
.../Include/Register/Intel}/Msr/P6Msr.h | 4 +-
.../Include/Register/Intel}/Msr/Pentium4Msr.h | 4 +-
.../Include/Register/Intel}/Msr/PentiumMMsr.h | 4 +-
.../Include/Register/Intel}/Msr/PentiumMsr.h | 4 +-
.../Register/Intel}/Msr/SandyBridgeMsr.h | 4 +-
.../Register/Intel}/Msr/SilvermontMsr.h | 4 +-
.../Include/Register/Intel}/Msr/SkylakeMsr.h | 4 +-
.../Include/Register/Intel}/Msr/Xeon5600Msr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonDMsr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonE7Msr.h | 4 +-
.../Include/Register/Intel}/Msr/XeonPhiMsr.h | 4 +-
.../Register/Intel/SmramSaveStateMap.h | 184 +
MdePkg/Include/Register/Intel/StmApi.h | 948 +++
.../Register/Intel}/StmResourceDescriptor.h | 6 +-
.../Include/Register/Intel}/StmStatusCode.h | 6 +-
.../Include/Register/ArchitecturalMsr.h | 6565 +---------------
UefiCpuPkg/Include/Register/Cpuid.h | 5 -
UefiCpuPkg/Include/Register/LocalApic.h | 175 +-
UefiCpuPkg/Include/Register/Microcode.h | 187 +-
UefiCpuPkg/Include/Register/Msr.h | 36 +-
.../Include/Register/SmramSaveStateMap.h | 179 +-
UefiCpuPkg/Include/Register/StmApi.h | 941 +--
39 files changed, 8194 insertions(+), 8119 deletions(-)
rename {UefiCpuPkg => MdePkg}/Include/Register/Amd/Cpuid.h (100%)
rename {UefiCpuPkg => MdePkg}/Include/Register/Amd/Fam17Msr.h (100%)
rename {UefiCpuPkg => MdePkg}/Include/Register/Amd/Msr.h (78%)
create mode 100644 MdePkg/Include/Register/Intel/ArchitecturalMsr.h
create mode 100644 MdePkg/Include/Register/Intel/LocalApic.h
create mode 100644 MdePkg/Include/Register/Intel/Microcode.h
create mode 100644 MdePkg/Include/Register/Intel/Msr.h
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/AtomMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/BroadwellMsr.h (95%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/Core2Msr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/CoreMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/GoldmontMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/GoldmontPlusMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/HaswellEMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/HaswellMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/IvyBridgeMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/NehalemMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/P6Msr.h (95%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/Pentium4Msr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/PentiumMMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/PentiumMsr.h (93%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/SandyBridgeMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/SilvermontMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/SkylakeMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/Xeon5600Msr.h (94%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/XeonDMsr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/XeonE7Msr.h (96%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/Msr/XeonPhiMsr.h (96%)
create mode 100644 MdePkg/Include/Register/Intel/SmramSaveStateMap.h
create mode 100644 MdePkg/Include/Register/Intel/StmApi.h
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/StmResourceDescriptor.h (92%)
rename {UefiCpuPkg/Include/Register => MdePkg/Include/Register/Intel}/StmStatusCode.h (94%)

diff --git a/UefiCpuPkg/Include/Register/Amd/Cpuid.h b/MdePkg/Include/Register/Amd/Cpuid.h
similarity index 100%
rename from UefiCpuPkg/Include/Register/Amd/Cpuid.h
rename to MdePkg/Include/Register/Amd/Cpuid.h
diff --git a/UefiCpuPkg/Include/Register/Amd/Fam17Msr.h b/MdePkg/Include/Register/Amd/Fam17Msr.h
similarity index 100%
rename from UefiCpuPkg/Include/Register/Amd/Fam17Msr.h
rename to MdePkg/Include/Register/Amd/Fam17Msr.h
diff --git a/UefiCpuPkg/Include/Register/Amd/Msr.h b/MdePkg/Include/Register/Amd/Msr.h
similarity index 78%
rename from UefiCpuPkg/Include/Register/Amd/Msr.h
rename to MdePkg/Include/Register/Amd/Msr.h
index b7db0ae042..e74de7a1df 100644
--- a/UefiCpuPkg/Include/Register/Amd/Msr.h
+++ b/MdePkg/Include/Register/Amd/Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2017, Advanced Micro Devices. All rights reserved.<BR>
+ Copyright (c) 2017 - 2019, Advanced Micro Devices. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -17,7 +17,7 @@
#ifndef __AMD_MSR_H__
#define __AMD_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>
#include <Register/Amd/Fam17Msr.h>

#endif
diff --git a/MdePkg/Include/Register/Intel/ArchitecturalMsr.h b/MdePkg/Include/Register/Intel/ArchitecturalMsr.h
new file mode 100644
index 0000000000..28e71cf713
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/ArchitecturalMsr.h
@@ -0,0 +1,6572 @@
+/** @file
+ Intel Architectural MSR Definitions.
+
+ Provides defines for Machine Specific Registers(MSR) indexes. Data structures
+ are provided for MSRs that contain one or more bit fields. If the MSR value
+ returned is a single 32-bit or 64-bit value, then a data structure is not
+ provided for that MSR.
+
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Specification Reference:
+ Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 4,
+ May 2018, Volume 4: Model-Specific-Registers (MSR)
+
+**/
+
+#ifndef __INTEL_ARCHITECTURAL_MSR_H__
+#define __INTEL_ARCHITECTURAL_MSR_H__
+
+/**
+ See Section 2.22, "MSRs in Pentium Processors.". Pentium Processor (05_01H).
+
+ @param ECX MSR_IA32_P5_MC_ADDR (0x00000000)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_P5_MC_ADDR);
+ AsmWriteMsr64 (MSR_IA32_P5_MC_ADDR, Msr);
+ @endcode
+ @note MSR_IA32_P5_MC_ADDR is defined as IA32_P5_MC_ADDR in SDM.
+**/
+#define MSR_IA32_P5_MC_ADDR 0x00000000
+
+
+/**
+ See Section 2.22, "MSRs in Pentium Processors.". DF_DM = 05_01H.
+
+ @param ECX MSR_IA32_P5_MC_TYPE (0x00000001)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_P5_MC_TYPE);
+ AsmWriteMsr64 (MSR_IA32_P5_MC_TYPE, Msr);
+ @endcode
+ @note MSR_IA32_P5_MC_TYPE is defined as IA32_P5_MC_TYPE in SDM.
+**/
+#define MSR_IA32_P5_MC_TYPE 0x00000001
+
+
+/**
+ See Section 8.10.5, "Monitor/Mwait Address Range Determination.". Introduced
+ at Display Family / Display Model 0F_03H.
+
+ @param ECX MSR_IA32_MONITOR_FILTER_SIZE (0x00000006)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MONITOR_FILTER_SIZE);
+ AsmWriteMsr64 (MSR_IA32_MONITOR_FILTER_SIZE, Msr);
+ @endcode
+ @note MSR_IA32_MONITOR_FILTER_SIZE is defined as IA32_MONITOR_FILTER_SIZE in SDM.
+**/
+#define MSR_IA32_MONITOR_FILTER_SIZE 0x00000006
+
+
+/**
+ See Section 17.17, "Time-Stamp Counter.". Introduced at Display Family /
+ Display Model 05_01H.
+
+ @param ECX MSR_IA32_TIME_STAMP_COUNTER (0x00000010)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_TIME_STAMP_COUNTER);
+ AsmWriteMsr64 (MSR_IA32_TIME_STAMP_COUNTER, Msr);
+ @endcode
+ @note MSR_IA32_TIME_STAMP_COUNTER is defined as IA32_TIME_STAMP_COUNTER in SDM.
+**/
+#define MSR_IA32_TIME_STAMP_COUNTER 0x00000010
+
+
+/**
+ Platform ID (RO) The operating system can use this MSR to determine "slot"
+ information for the processor and the proper microcode update to load.
+ Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_PLATFORM_ID (0x00000017)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PLATFORM_ID_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PLATFORM_ID_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PLATFORM_ID_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PLATFORM_ID);
+ @endcode
+ @note MSR_IA32_PLATFORM_ID is defined as IA32_PLATFORM_ID in SDM.
+**/
+#define MSR_IA32_PLATFORM_ID 0x00000017
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PLATFORM_ID
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved1:32;
+ UINT32 Reserved2:18;
+ ///
+ /// [Bits 52:50] Platform Id (RO) Contains information concerning the
+ /// intended platform for the processor.
+ /// 52 51 50
+ /// -- -- --
+ /// 0 0 0 Processor Flag 0.
+ /// 0 0 1 Processor Flag 1
+ /// 0 1 0 Processor Flag 2
+ /// 0 1 1 Processor Flag 3
+ /// 1 0 0 Processor Flag 4
+ /// 1 0 1 Processor Flag 5
+ /// 1 1 0 Processor Flag 6
+ /// 1 1 1 Processor Flag 7
+ ///
+ UINT32 PlatformId:3;
+ UINT32 Reserved3:11;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PLATFORM_ID_REGISTER;
+
+
+/**
+ 06_01H.
+
+ @param ECX MSR_IA32_APIC_BASE (0x0000001B)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_APIC_BASE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_APIC_BASE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_APIC_BASE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
+ AsmWriteMsr64 (MSR_IA32_APIC_BASE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_APIC_BASE is defined as IA32_APIC_BASE in SDM.
+**/
+#define MSR_IA32_APIC_BASE 0x0000001B
+
+/**
+ MSR information returned for MSR index #MSR_IA32_APIC_BASE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved1:8;
+ ///
+ /// [Bit 8] BSP flag (R/W).
+ ///
+ UINT32 BSP:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bit 10] Enable x2APIC mode. Introduced at Display Family / Display
+ /// Model 06_1AH.
+ ///
+ UINT32 EXTD:1;
+ ///
+ /// [Bit 11] APIC Global Enable (R/W).
+ ///
+ UINT32 EN:1;
+ ///
+ /// [Bits 31:12] APIC Base (R/W).
+ ///
+ UINT32 ApicBase:20;
+ ///
+ /// [Bits 63:32] APIC Base (R/W).
+ ///
+ UINT32 ApicBaseHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_APIC_BASE_REGISTER;
+
+
+/**
+ Control Features in Intel 64 Processor (R/W). If any one enumeration
+ condition for defined bit field holds.
+
+ @param ECX MSR_IA32_FEATURE_CONTROL (0x0000003A)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_FEATURE_CONTROL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_FEATURE_CONTROL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_FEATURE_CONTROL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);
+ AsmWriteMsr64 (MSR_IA32_FEATURE_CONTROL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_FEATURE_CONTROL is defined as IA32_FEATURE_CONTROL in SDM.
+**/
+#define MSR_IA32_FEATURE_CONTROL 0x0000003A
+
+/**
+ MSR information returned for MSR index #MSR_IA32_FEATURE_CONTROL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Lock bit (R/WO): (1 = locked). When set, locks this MSR from
+ /// being written, writes to this bit will result in GP(0). Note: Once the
+ /// Lock bit is set, the contents of this register cannot be modified.
+ /// Therefore the lock bit must be set after configuring support for Intel
+ /// Virtualization Technology and prior to transferring control to an
+ /// option ROM or the OS. Hence, once the Lock bit is set, the entire
+ /// IA32_FEATURE_CONTROL contents are preserved across RESET when PWRGOOD
+ /// is not deasserted. If any one enumeration condition for defined bit
+ /// field position greater than bit 0 holds.
+ ///
+ UINT32 Lock:1;
+ ///
+ /// [Bit 1] Enable VMX inside SMX operation (R/WL): This bit enables a
+ /// system executive to use VMX in conjunction with SMX to support
+ /// Intel(R) Trusted Execution Technology. BIOS must set this bit only
+ /// when the CPUID function 1 returns VMX feature flag and SMX feature
+ /// flag set (ECX bits 5 and 6 respectively). If CPUID.01H:ECX[5] = 1 &&
+ /// CPUID.01H:ECX[6] = 1.
+ ///
+ UINT32 EnableVmxInsideSmx:1;
+ ///
+ /// [Bit 2] Enable VMX outside SMX operation (R/WL): This bit enables VMX
+ /// for system executive that do not require SMX. BIOS must set this bit
+ /// only when the CPUID function 1 returns VMX feature flag set (ECX bit
+ /// 5). If CPUID.01H:ECX[5] = 1.
+ ///
+ UINT32 EnableVmxOutsideSmx:1;
+ UINT32 Reserved1:5;
+ ///
+ /// [Bits 14:8] SENTER Local Function Enables (R/WL): When set, each bit
+ /// in the field represents an enable control for a corresponding SENTER
+ /// function. This bit is supported only if CPUID.1:ECX.[bit 6] is set. If
+ /// CPUID.01H:ECX[6] = 1.
+ ///
+ UINT32 SenterLocalFunctionEnables:7;
+ ///
+ /// [Bit 15] SENTER Global Enable (R/WL): This bit must be set to enable
+ /// SENTER leaf functions. This bit is supported only if CPUID.1:ECX.[bit
+ /// 6] is set. If CPUID.01H:ECX[6] = 1.
+ ///
+ UINT32 SenterGlobalEnable:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bit 17] SGX Launch Control Enable (R/WL): This bit must be set to
+ /// enable runtime reconfiguration of SGX Launch Control via
+ /// IA32_SGXLEPUBKEYHASHn MSR. If CPUID.(EAX=07H, ECX=0H): ECX[30] = 1.
+ ///
+ UINT32 SgxLaunchControlEnable:1;
+ ///
+ /// [Bit 18] SGX Global Enable (R/WL): This bit must be set to enable SGX
+ /// leaf functions. If CPUID.(EAX=07H, ECX=0H): EBX[2] = 1.
+ ///
+ UINT32 SgxEnable:1;
+ UINT32 Reserved3:1;
+ ///
+ /// [Bit 20] LMCE On (R/WL): When set, system software can program the
+ /// MSRs associated with LMCE to configure delivery of some machine check
+ /// exceptions to a single logical processor. If IA32_MCG_CAP[27] = 1.
+ ///
+ UINT32 LmceOn:1;
+ UINT32 Reserved4:11;
+ UINT32 Reserved5:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_FEATURE_CONTROL_REGISTER;
+
+
+/**
+ Per Logical Processor TSC Adjust (R/Write to clear). If CPUID.(EAX=07H,
+ ECX=0H): EBX[1] = 1. THREAD_ADJUST: Local offset value of the IA32_TSC for
+ a logical processor. Reset value is Zero. A write to IA32_TSC will modify
+ the local offset in IA32_TSC_ADJUST and the content of IA32_TSC, but does
+ not affect the internal invariant TSC hardware.
+
+ @param ECX MSR_IA32_TSC_ADJUST (0x0000003B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_TSC_ADJUST);
+ AsmWriteMsr64 (MSR_IA32_TSC_ADJUST, Msr);
+ @endcode
+ @note MSR_IA32_TSC_ADJUST is defined as IA32_TSC_ADJUST in SDM.
+**/
+#define MSR_IA32_TSC_ADJUST 0x0000003B
+
+
+/**
+ BIOS Update Trigger (W) Executing a WRMSR instruction to this MSR causes a
+ microcode update to be loaded into the processor. See Section 9.11.6,
+ "Microcode Update Loader." A processor may prevent writing to this MSR when
+ loading guest states on VM entries or saving guest states on VM exits.
+ Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_BIOS_UPDT_TRIG (0x00000079)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = 0;
+ AsmWriteMsr64 (MSR_IA32_BIOS_UPDT_TRIG, Msr);
+ @endcode
+ @note MSR_IA32_BIOS_UPDT_TRIG is defined as IA32_BIOS_UPDT_TRIG in SDM.
+**/
+#define MSR_IA32_BIOS_UPDT_TRIG 0x00000079
+
+
+/**
+ BIOS Update Signature (RO) Returns the microcode update signature following
+ the execution of CPUID.01H. A processor may prevent writing to this MSR when
+ loading guest states on VM entries or saving guest states on VM exits.
+ Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_BIOS_SIGN_ID (0x0000008B)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_BIOS_SIGN_ID_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_BIOS_SIGN_ID_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_BIOS_SIGN_ID_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_BIOS_SIGN_ID);
+ @endcode
+ @note MSR_IA32_BIOS_SIGN_ID is defined as IA32_BIOS_SIGN_ID in SDM.
+**/
+#define MSR_IA32_BIOS_SIGN_ID 0x0000008B
+
+/**
+ MSR information returned for MSR index #MSR_IA32_BIOS_SIGN_ID
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved:32;
+ ///
+ /// [Bits 63:32] Microcode update signature. This field contains the
+ /// signature of the currently loaded microcode update when read following
+ /// the execution of the CPUID instruction, function 1. It is required
+ /// that this register field be pre-loaded with zero prior to executing
+ /// the CPUID, function 1. If the field remains equal to zero, then there
+ /// is no microcode update loaded. Another nonzero value will be the
+ /// signature.
+ ///
+ UINT32 MicrocodeUpdateSignature:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_BIOS_SIGN_ID_REGISTER;
+
+
+/**
+ IA32_SGXLEPUBKEYHASH[(64*n+63):(64*n)] (R/W) Bits (64*n+63):(64*n) of the
+ SHA256 digest of the SIGSTRUCT.MODULUS for SGX Launch Enclave. On reset, the
+ default value is the digest of Intel's signing key. Read permitted If
+ CPUID.(EAX=12H,ECX=0H):EAX[0]=1, Write permitted if CPUID.(EAX=12H,ECX=0H):
+ EAX[0]=1 && IA32_FEATURE_CONTROL[17] = 1 && IA32_FEATURE_CONTROL[0] = 1.
+
+ @param ECX MSR_IA32_SGXLEPUBKEYHASHn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_SGXLEPUBKEYHASHn);
+ AsmWriteMsr64 (MSR_IA32_SGXLEPUBKEYHASHn, Msr);
+ @endcode
+ @note MSR_IA32_SGXLEPUBKEYHASH0 is defined as IA32_SGXLEPUBKEYHASH0 in SDM.
+ MSR_IA32_SGXLEPUBKEYHASH1 is defined as IA32_SGXLEPUBKEYHASH1 in SDM.
+ MSR_IA32_SGXLEPUBKEYHASH2 is defined as IA32_SGXLEPUBKEYHASH2 in SDM.
+ MSR_IA32_SGXLEPUBKEYHASH3 is defined as IA32_SGXLEPUBKEYHASH3 in SDM.
+ @{
+**/
+#define MSR_IA32_SGXLEPUBKEYHASH0 0x0000008C
+#define MSR_IA32_SGXLEPUBKEYHASH1 0x0000008D
+#define MSR_IA32_SGXLEPUBKEYHASH2 0x0000008E
+#define MSR_IA32_SGXLEPUBKEYHASH3 0x0000008F
+/// @}
+
+
+/**
+ SMM Monitor Configuration (R/W). If CPUID.01H: ECX[5]=1 or CPUID.01H: ECX[6] =
+ 1.
+
+ @param ECX MSR_IA32_SMM_MONITOR_CTL (0x0000009B)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_SMM_MONITOR_CTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_SMM_MONITOR_CTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_SMM_MONITOR_CTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMM_MONITOR_CTL);
+ AsmWriteMsr64 (MSR_IA32_SMM_MONITOR_CTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_SMM_MONITOR_CTL is defined as IA32_SMM_MONITOR_CTL in SDM.
+**/
+#define MSR_IA32_SMM_MONITOR_CTL 0x0000009B
+
+/**
+ MSR information returned for MSR index #MSR_IA32_SMM_MONITOR_CTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Valid (R/W). The STM may be invoked using VMCALL only if this
+ /// bit is 1. Because VMCALL is used to activate the dual-monitor treatment
+ /// (see Section 34.15.6), the dual-monitor treatment cannot be activated
+ /// if the bit is 0. This bit is cleared when the logical processor is
+ /// reset.
+ ///
+ UINT32 Valid:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 2] Controls SMI unblocking by VMXOFF (see Section 34.14.4). If
+ /// IA32_VMX_MISC[28].
+ ///
+ UINT32 BlockSmi:1;
+ UINT32 Reserved2:9;
+ ///
+ /// [Bits 31:12] MSEG Base (R/W).
+ ///
+ UINT32 MsegBase:20;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_SMM_MONITOR_CTL_REGISTER;
+
+/**
+ MSEG header that is located at the physical address specified by the MsegBase
+ field of #MSR_IA32_SMM_MONITOR_CTL_REGISTER.
+**/
+typedef struct {
+ ///
+ /// Different processors may use different MSEG revision identifiers. These
+ /// identifiers enable software to avoid using an MSEG header formatted for
+ /// one processor on a processor that uses a different format. Software can
+ /// discover the MSEG revision identifier that a processor uses by reading
+ /// the VMX capability MSR IA32_VMX_MISC.
+ //
+ UINT32 MsegHeaderRevision;
+ ///
+ /// Bits 31:1 of this field are reserved and must be zero. Bit 0 of the field
+ /// is the IA-32e mode SMM feature bit. It indicates whether the logical
+ /// processor will be in IA-32e mode after the STM is activated.
+ ///
+ UINT32 MonitorFeatures;
+ UINT32 GdtrLimit;
+ UINT32 GdtrBaseOffset;
+ UINT32 CsSelector;
+ UINT32 EipOffset;
+ UINT32 EspOffset;
+ UINT32 Cr3Offset;
+ ///
+ /// Pad header so total size is 2KB
+ ///
+ UINT8 Reserved[SIZE_2KB - 8 * sizeof (UINT32)];
+} MSEG_HEADER;
+
+///
+/// @{ Define values for the MonitorFeatures field of #MSEG_HEADER
+///
+#define STM_FEATURES_IA32E 0x1
+///
+/// @}
+///
+
+/**
+ Base address of the logical processor's SMRAM image (RO, SMM only). If
+ IA32_VMX_MISC[15].
+
+ @param ECX MSR_IA32_SMBASE (0x0000009E)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_SMBASE);
+ @endcode
+ @note MSR_IA32_SMBASE is defined as IA32_SMBASE in SDM.
+**/
+#define MSR_IA32_SMBASE 0x0000009E
+
+
+/**
+ General Performance Counters (R/W).
+ MSR_IA32_PMCn is supported if CPUID.0AH: EAX[15:8] > n.
+
+ @param ECX MSR_IA32_PMCn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_PMC0);
+ AsmWriteMsr64 (MSR_IA32_PMC0, Msr);
+ @endcode
+ @note MSR_IA32_PMC0 is defined as IA32_PMC0 in SDM.
+ MSR_IA32_PMC1 is defined as IA32_PMC1 in SDM.
+ MSR_IA32_PMC2 is defined as IA32_PMC2 in SDM.
+ MSR_IA32_PMC3 is defined as IA32_PMC3 in SDM.
+ MSR_IA32_PMC4 is defined as IA32_PMC4 in SDM.
+ MSR_IA32_PMC5 is defined as IA32_PMC5 in SDM.
+ MSR_IA32_PMC6 is defined as IA32_PMC6 in SDM.
+ MSR_IA32_PMC7 is defined as IA32_PMC7 in SDM.
+ @{
+**/
+#define MSR_IA32_PMC0 0x000000C1
+#define MSR_IA32_PMC1 0x000000C2
+#define MSR_IA32_PMC2 0x000000C3
+#define MSR_IA32_PMC3 0x000000C4
+#define MSR_IA32_PMC4 0x000000C5
+#define MSR_IA32_PMC5 0x000000C6
+#define MSR_IA32_PMC6 0x000000C7
+#define MSR_IA32_PMC7 0x000000C8
+/// @}
+
+
+/**
+ TSC Frequency Clock Counter (R/Write to clear). If CPUID.06H: ECX[0] = 1.
+ C0_MCNT: C0 TSC Frequency Clock Count Increments at fixed interval (relative
+ to TSC freq.) when the logical processor is in C0. Cleared upon overflow /
+ wrap-around of IA32_APERF.
+
+ @param ECX MSR_IA32_MPERF (0x000000E7)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MPERF);
+ AsmWriteMsr64 (MSR_IA32_MPERF, Msr);
+ @endcode
+ @note MSR_IA32_MPERF is defined as IA32_MPERF in SDM.
+**/
+#define MSR_IA32_MPERF 0x000000E7
+
+
+/**
+ Actual Performance Clock Counter (R/Write to clear). If CPUID.06H: ECX[0] =
+ 1. C0_ACNT: C0 Actual Frequency Clock Count Accumulates core clock counts at
+ the coordinated clock frequency, when the logical processor is in C0.
+ Cleared upon overflow / wrap-around of IA32_MPERF.
+
+ @param ECX MSR_IA32_APERF (0x000000E8)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_APERF);
+ AsmWriteMsr64 (MSR_IA32_APERF, Msr);
+ @endcode
+ @note MSR_IA32_APERF is defined as IA32_APERF in SDM.
+**/
+#define MSR_IA32_APERF 0x000000E8
+
+
+/**
+ MTRR Capability (RO) Section 11.11.2.1, "IA32_MTRR_DEF_TYPE MSR.".
+ Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_MTRRCAP (0x000000FE)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRRCAP_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRRCAP_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MTRRCAP_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRRCAP);
+ @endcode
+ @note MSR_IA32_MTRRCAP is defined as IA32_MTRRCAP in SDM.
+**/
+#define MSR_IA32_MTRRCAP 0x000000FE
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MTRRCAP
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] VCNT: The number of variable memory type ranges in the
+ /// processor.
+ ///
+ UINT32 VCNT:8;
+ ///
+ /// [Bit 8] Fixed range MTRRs are supported when set.
+ ///
+ UINT32 FIX:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 10] WC Supported when set.
+ ///
+ UINT32 WC:1;
+ ///
+ /// [Bit 11] SMRR Supported when set.
+ ///
+ UINT32 SMRR:1;
+ UINT32 Reserved2:20;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MTRRCAP_REGISTER;
+
+
+/**
+ SYSENTER_CS_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_SYSENTER_CS (0x00000174)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_SYSENTER_CS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_SYSENTER_CS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_SYSENTER_CS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SYSENTER_CS);
+ AsmWriteMsr64 (MSR_IA32_SYSENTER_CS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_SYSENTER_CS is defined as IA32_SYSENTER_CS in SDM.
+**/
+#define MSR_IA32_SYSENTER_CS 0x00000174
+
+/**
+ MSR information returned for MSR index #MSR_IA32_SYSENTER_CS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 15:0] CS Selector.
+ ///
+ UINT32 CS:16;
+ UINT32 Reserved1:16;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_SYSENTER_CS_REGISTER;
+
+
+/**
+ SYSENTER_ESP_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_SYSENTER_ESP (0x00000175)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_SYSENTER_ESP);
+ AsmWriteMsr64 (MSR_IA32_SYSENTER_ESP, Msr);
+ @endcode
+ @note MSR_IA32_SYSENTER_ESP is defined as IA32_SYSENTER_ESP in SDM.
+**/
+#define MSR_IA32_SYSENTER_ESP 0x00000175
+
+
+/**
+ SYSENTER_EIP_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
+
+ @param ECX MSR_IA32_SYSENTER_EIP (0x00000176)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_SYSENTER_EIP);
+ AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr);
+ @endcode
+ @note MSR_IA32_SYSENTER_EIP is defined as IA32_SYSENTER_EIP in SDM.
+**/
+#define MSR_IA32_SYSENTER_EIP 0x00000176
+
+
+/**
+ Global Machine Check Capability (RO). Introduced at Display Family / Display
+ Model 06_01H.
+
+ @param ECX MSR_IA32_MCG_CAP (0x00000179)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_CAP_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_CAP_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MCG_CAP_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_CAP);
+ @endcode
+ @note MSR_IA32_MCG_CAP is defined as IA32_MCG_CAP in SDM.
+**/
+#define MSR_IA32_MCG_CAP 0x00000179
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MCG_CAP
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Count: Number of reporting banks.
+ ///
+ UINT32 Count:8;
+ ///
+ /// [Bit 8] MCG_CTL_P: IA32_MCG_CTL is present if this bit is set.
+ ///
+ UINT32 MCG_CTL_P:1;
+ ///
+ /// [Bit 9] MCG_EXT_P: Extended machine check state registers are present
+ /// if this bit is set.
+ ///
+ UINT32 MCG_EXT_P:1;
+ ///
+ /// [Bit 10] MCP_CMCI_P: Support for corrected MC error event is present.
+ /// Introduced at Display Family / Display Model 06_01H.
+ ///
+ UINT32 MCP_CMCI_P:1;
+ ///
+ /// [Bit 11] MCG_TES_P: Threshold-based error status register are present
+ /// if this bit is set.
+ ///
+ UINT32 MCG_TES_P:1;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bits 23:16] MCG_EXT_CNT: Number of extended machine check state
+ /// registers present.
+ ///
+ UINT32 MCG_EXT_CNT:8;
+ ///
+ /// [Bit 24] MCG_SER_P: The processor supports software error recovery if
+ /// this bit is set.
+ ///
+ UINT32 MCG_SER_P:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bit 26] MCG_ELOG_P: Indicates that the processor allows platform
+ /// firmware to be invoked when an error is detected so that it may
+ /// provide additional platform specific information in an ACPI format
+ /// "Generic Error Data Entry" that augments the data included in machine
+ /// check bank registers. Introduced at Display Family / Display Model
+ /// 06_3EH.
+ ///
+ UINT32 MCG_ELOG_P:1;
+ ///
+ /// [Bit 27] MCG_LMCE_P: Indicates that the processor support extended
+ /// state in IA32_MCG_STATUS and associated MSR necessary to configure
+ /// Local Machine Check Exception (LMCE). Introduced at Display Family /
+ /// Display Model 06_3EH.
+ ///
+ UINT32 MCG_LMCE_P:1;
+ UINT32 Reserved3:4;
+ UINT32 Reserved4:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MCG_CAP_REGISTER;
+
+
+/**
+ Global Machine Check Status (R/W0). Introduced at Display Family / Display
+ Model 06_01H.
+
+ @param ECX MSR_IA32_MCG_STATUS (0x0000017A)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MCG_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_STATUS);
+ AsmWriteMsr64 (MSR_IA32_MCG_STATUS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MCG_STATUS is defined as IA32_MCG_STATUS in SDM.
+**/
+#define MSR_IA32_MCG_STATUS 0x0000017A
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MCG_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] RIPV. Restart IP valid. Introduced at Display Family / Display
+ /// Model 06_01H.
+ ///
+ UINT32 RIPV:1;
+ ///
+ /// [Bit 1] EIPV. Error IP valid. Introduced at Display Family / Display
+ /// Model 06_01H.
+ ///
+ UINT32 EIPV:1;
+ ///
+ /// [Bit 2] MCIP. Machine check in progress. Introduced at Display Family
+ /// / Display Model 06_01H.
+ ///
+ UINT32 MCIP:1;
+ ///
+ /// [Bit 3] LMCE_S. If IA32_MCG_CAP.LMCE_P[2 7] =1.
+ ///
+ UINT32 LMCE_S:1;
+ UINT32 Reserved1:28;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MCG_STATUS_REGISTER;
+
+
+/**
+ Global Machine Check Control (R/W). If IA32_MCG_CAP.CTL_P[8] =1.
+
+ @param ECX MSR_IA32_MCG_CTL (0x0000017B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MCG_CTL);
+ AsmWriteMsr64 (MSR_IA32_MCG_CTL, Msr);
+ @endcode
+ @note MSR_IA32_MCG_CTL is defined as IA32_MCG_CTL in SDM.
+**/
+#define MSR_IA32_MCG_CTL 0x0000017B
+
+
+/**
+ Performance Event Select Register n (R/W). If CPUID.0AH: EAX[15:8] > n.
+
+ @param ECX MSR_IA32_PERFEVTSELn
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERFEVTSEL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERFEVTSEL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERFEVTSEL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERFEVTSEL0);
+ AsmWriteMsr64 (MSR_IA32_PERFEVTSEL0, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERFEVTSEL0 is defined as IA32_PERFEVTSEL0 in SDM.
+ MSR_IA32_PERFEVTSEL1 is defined as IA32_PERFEVTSEL1 in SDM.
+ MSR_IA32_PERFEVTSEL2 is defined as IA32_PERFEVTSEL2 in SDM.
+ MSR_IA32_PERFEVTSEL3 is defined as IA32_PERFEVTSEL3 in SDM.
+ @{
+**/
+#define MSR_IA32_PERFEVTSEL0 0x00000186
+#define MSR_IA32_PERFEVTSEL1 0x00000187
+#define MSR_IA32_PERFEVTSEL2 0x00000188
+#define MSR_IA32_PERFEVTSEL3 0x00000189
+/// @}
+
+/**
+ MSR information returned for MSR indexes #MSR_IA32_PERFEVTSEL0 to
+ #MSR_IA32_PERFEVTSEL3
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Event Select: Selects a performance event logic unit.
+ ///
+ UINT32 EventSelect:8;
+ ///
+ /// [Bits 15:8] UMask: Qualifies the microarchitectural condition to
+ /// detect on the selected event logic.
+ ///
+ UINT32 UMASK:8;
+ ///
+ /// [Bit 16] USR: Counts while in privilege level is not ring 0.
+ ///
+ UINT32 USR:1;
+ ///
+ /// [Bit 17] OS: Counts while in privilege level is ring 0.
+ ///
+ UINT32 OS:1;
+ ///
+ /// [Bit 18] Edge: Enables edge detection if set.
+ ///
+ UINT32 E:1;
+ ///
+ /// [Bit 19] PC: enables pin control.
+ ///
+ UINT32 PC:1;
+ ///
+ /// [Bit 20] INT: enables interrupt on counter overflow.
+ ///
+ UINT32 INT:1;
+ ///
+ /// [Bit 21] AnyThread: When set to 1, it enables counting the associated
+ /// event conditions occurring across all logical processors sharing a
+ /// processor core. When set to 0, the counter only increments the
+ /// associated event conditions occurring in the logical processor which
+ /// programmed the MSR.
+ ///
+ UINT32 ANY:1;
+ ///
+ /// [Bit 22] EN: enables the corresponding performance counter to commence
+ /// counting when this bit is set.
+ ///
+ UINT32 EN:1;
+ ///
+ /// [Bit 23] INV: invert the CMASK.
+ ///
+ UINT32 INV:1;
+ ///
+ /// [Bits 31:24] CMASK: When CMASK is not zero, the corresponding
+ /// performance counter increments each cycle if the event count is
+ /// greater than or equal to the CMASK.
+ ///
+ UINT32 CMASK:8;
+ UINT32 Reserved:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERFEVTSEL_REGISTER;
+
+
+/**
+ Current performance state(P-State) operating point (RO). Introduced at
+ Display Family / Display Model 0F_03H.
+
+ @param ECX MSR_IA32_PERF_STATUS (0x00000198)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_STATUS);
+ @endcode
+ @note MSR_IA32_PERF_STATUS is defined as IA32_PERF_STATUS in SDM.
+**/
+#define MSR_IA32_PERF_STATUS 0x00000198
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 15:0] Current performance State Value.
+ ///
+ UINT32 State:16;
+ UINT32 Reserved1:16;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_STATUS_REGISTER;
+
+
+/**
+ (R/W). Introduced at Display Family / Display Model 0F_03H.
+
+ @param ECX MSR_IA32_PERF_CTL (0x00000199)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_CTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_CTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_CTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_CTL);
+ AsmWriteMsr64 (MSR_IA32_PERF_CTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_CTL is defined as IA32_PERF_CTL in SDM.
+**/
+#define MSR_IA32_PERF_CTL 0x00000199
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_CTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 15:0] Target performance State Value.
+ ///
+ UINT32 TargetState:16;
+ UINT32 Reserved1:16;
+ ///
+ /// [Bit 32] IDA Engage. (R/W) When set to 1: disengages IDA. 06_0FH
+ /// (Mobile only).
+ ///
+ UINT32 IDA:1;
+ UINT32 Reserved2:31;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_CTL_REGISTER;
+
+
+/**
+ Clock Modulation Control (R/W) See Section 14.7.3, "Software Controlled
+ Clock Modulation.". If CPUID.01H:EDX[22] = 1.
+
+ @param ECX MSR_IA32_CLOCK_MODULATION (0x0000019A)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_CLOCK_MODULATION_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_CLOCK_MODULATION_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_CLOCK_MODULATION_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_CLOCK_MODULATION);
+ AsmWriteMsr64 (MSR_IA32_CLOCK_MODULATION, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_CLOCK_MODULATION is defined as IA32_CLOCK_MODULATION in SDM.
+**/
+#define MSR_IA32_CLOCK_MODULATION 0x0000019A
+
+/**
+ MSR information returned for MSR index #MSR_IA32_CLOCK_MODULATION
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Extended On-Demand Clock Modulation Duty Cycle:. If
+ /// CPUID.06H:EAX[5] = 1.
+ ///
+ UINT32 ExtendedOnDemandClockModulationDutyCycle:1;
+ ///
+ /// [Bits 3:1] On-Demand Clock Modulation Duty Cycle: Specific encoded
+ /// values for target duty cycle modulation. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 OnDemandClockModulationDutyCycle:3;
+ ///
+ /// [Bit 4] On-Demand Clock Modulation Enable: Set 1 to enable modulation.
+ /// If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 OnDemandClockModulationEnable:1;
+ UINT32 Reserved1:27;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_CLOCK_MODULATION_REGISTER;
+
+
+/**
+ Thermal Interrupt Control (R/W) Enables and disables the generation of an
+ interrupt on temperature transitions detected with the processor's thermal
+ sensors and thermal monitor. See Section 14.7.2, "Thermal Monitor.".
+ If CPUID.01H:EDX[22] = 1
+
+ @param ECX MSR_IA32_THERM_INTERRUPT (0x0000019B)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_THERM_INTERRUPT_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_THERM_INTERRUPT_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_THERM_INTERRUPT_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_THERM_INTERRUPT);
+ AsmWriteMsr64 (MSR_IA32_THERM_INTERRUPT, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_THERM_INTERRUPT is defined as IA32_THERM_INTERRUPT in SDM.
+**/
+#define MSR_IA32_THERM_INTERRUPT 0x0000019B
+
+/**
+ MSR information returned for MSR index #MSR_IA32_THERM_INTERRUPT
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] High-Temperature Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 HighTempEnable:1;
+ ///
+ /// [Bit 1] Low-Temperature Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 LowTempEnable:1;
+ ///
+ /// [Bit 2] PROCHOT# Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 PROCHOT_Enable:1;
+ ///
+ /// [Bit 3] FORCEPR# Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 FORCEPR_Enable:1;
+ ///
+ /// [Bit 4] Critical Temperature Interrupt Enable.
+ /// If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 CriticalTempEnable:1;
+ UINT32 Reserved1:3;
+ ///
+ /// [Bits 14:8] Threshold #1 Value. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 Threshold1:7;
+ ///
+ /// [Bit 15] Threshold #1 Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 Threshold1Enable:1;
+ ///
+ /// [Bits 22:16] Threshold #2 Value. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 Threshold2:7;
+ ///
+ /// [Bit 23] Threshold #2 Interrupt Enable. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 Threshold2Enable:1;
+ ///
+ /// [Bit 24] Power Limit Notification Enable. If CPUID.06H:EAX[4] = 1.
+ ///
+ UINT32 PowerLimitNotificationEnable:1;
+ UINT32 Reserved2:7;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_THERM_INTERRUPT_REGISTER;
+
+
+/**
+ Thermal Status Information (RO) Contains status information about the
+ processor's thermal sensor and automatic thermal monitoring facilities. See
+ Section 14.7.2, "Thermal Monitor". If CPUID.01H:EDX[22] = 1.
+
+ @param ECX MSR_IA32_THERM_STATUS (0x0000019C)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_THERM_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_THERM_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_THERM_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_THERM_STATUS);
+ @endcode
+ @note MSR_IA32_THERM_STATUS is defined as IA32_THERM_STATUS in SDM.
+**/
+#define MSR_IA32_THERM_STATUS 0x0000019C
+
+/**
+ MSR information returned for MSR index #MSR_IA32_THERM_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Thermal Status (RO):. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 ThermalStatus:1;
+ ///
+ /// [Bit 1] Thermal Status Log (R/W):. If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 ThermalStatusLog:1;
+ ///
+ /// [Bit 2] PROCHOT # or FORCEPR# event (RO). If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 PROCHOT_FORCEPR_Event:1;
+ ///
+ /// [Bit 3] PROCHOT # or FORCEPR# log (R/WC0). If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 PROCHOT_FORCEPR_Log:1;
+ ///
+ /// [Bit 4] Critical Temperature Status (RO). If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 CriticalTempStatus:1;
+ ///
+ /// [Bit 5] Critical Temperature Status log (R/WC0).
+ /// If CPUID.01H:EDX[22] = 1.
+ ///
+ UINT32 CriticalTempStatusLog:1;
+ ///
+ /// [Bit 6] Thermal Threshold #1 Status (RO). If CPUID.01H:ECX[8] = 1.
+ ///
+ UINT32 ThermalThreshold1Status:1;
+ ///
+ /// [Bit 7] Thermal Threshold #1 log (R/WC0). If CPUID.01H:ECX[8] = 1.
+ ///
+ UINT32 ThermalThreshold1Log:1;
+ ///
+ /// [Bit 8] Thermal Threshold #2 Status (RO). If CPUID.01H:ECX[8] = 1.
+ ///
+ UINT32 ThermalThreshold2Status:1;
+ ///
+ /// [Bit 9] Thermal Threshold #2 log (R/WC0). If CPUID.01H:ECX[8] = 1.
+ ///
+ UINT32 ThermalThreshold2Log:1;
+ ///
+ /// [Bit 10] Power Limitation Status (RO). If CPUID.06H:EAX[4] = 1.
+ ///
+ UINT32 PowerLimitStatus:1;
+ ///
+ /// [Bit 11] Power Limitation log (R/WC0). If CPUID.06H:EAX[4] = 1.
+ ///
+ UINT32 PowerLimitLog:1;
+ ///
+ /// [Bit 12] Current Limit Status (RO). If CPUID.06H:EAX[7] = 1.
+ ///
+ UINT32 CurrentLimitStatus:1;
+ ///
+ /// [Bit 13] Current Limit log (R/WC0). If CPUID.06H:EAX[7] = 1.
+ ///
+ UINT32 CurrentLimitLog:1;
+ ///
+ /// [Bit 14] Cross Domain Limit Status (RO). If CPUID.06H:EAX[7] = 1.
+ ///
+ UINT32 CrossDomainLimitStatus:1;
+ ///
+ /// [Bit 15] Cross Domain Limit log (R/WC0). If CPUID.06H:EAX[7] = 1.
+ ///
+ UINT32 CrossDomainLimitLog:1;
+ ///
+ /// [Bits 22:16] Digital Readout (RO). If CPUID.06H:EAX[0] = 1.
+ ///
+ UINT32 DigitalReadout:7;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bits 30:27] Resolution in Degrees Celsius (RO). If CPUID.06H:EAX[0] =
+ /// 1.
+ ///
+ UINT32 ResolutionInDegreesCelsius:4;
+ ///
+ /// [Bit 31] Reading Valid (RO). If CPUID.06H:EAX[0] = 1.
+ ///
+ UINT32 ReadingValid:1;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_THERM_STATUS_REGISTER;
+
+
+/**
+ Enable Misc. Processor Features (R/W) Allows a variety of processor
+ functions to be enabled and disabled.
+
+ @param ECX MSR_IA32_MISC_ENABLE (0x000001A0)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MISC_ENABLE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MISC_ENABLE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MISC_ENABLE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MISC_ENABLE);
+ AsmWriteMsr64 (MSR_IA32_MISC_ENABLE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MISC_ENABLE is defined as IA32_MISC_ENABLE in SDM.
+**/
+#define MSR_IA32_MISC_ENABLE 0x000001A0
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MISC_ENABLE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Fast-Strings Enable When set, the fast-strings feature (for
+ /// REP MOVS and REP STORS) is enabled (default); when clear, fast-strings
+ /// are disabled. Introduced at Display Family / Display Model 0F_0H.
+ ///
+ UINT32 FastStrings:1;
+ UINT32 Reserved1:2;
+ ///
+ /// [Bit 3] Automatic Thermal Control Circuit Enable (R/W) 1 = Setting
+ /// this bit enables the thermal control circuit (TCC) portion of the
+ /// Intel Thermal Monitor feature. This allows the processor to
+ /// automatically reduce power consumption in response to TCC activation.
+ /// 0 = Disabled. Note: In some products clearing this bit might be
+ /// ignored in critical thermal conditions, and TM1, TM2 and adaptive
+ /// thermal throttling will still be activated. The default value of this
+ /// field varies with product. See respective tables where default value is
+ /// listed. Introduced at Display Family / Display Model 0F_0H.
+ ///
+ UINT32 AutomaticThermalControlCircuit:1;
+ UINT32 Reserved2:3;
+ ///
+ /// [Bit 7] Performance Monitoring Available (R) 1 = Performance
+ /// monitoring enabled 0 = Performance monitoring disabled. Introduced at
+ /// Display Family / Display Model 0F_0H.
+ ///
+ UINT32 PerformanceMonitoring:1;
+ UINT32 Reserved3:3;
+ ///
+ /// [Bit 11] Branch Trace Storage Unavailable (RO) 1 = Processor doesn't
+ /// support branch trace storage (BTS) 0 = BTS is supported. Introduced at
+ /// Display Family / Display Model 0F_0H.
+ ///
+ UINT32 BTS:1;
+ ///
+ /// [Bit 12] Processor Event Based Sampling (PEBS) Unavailable (RO) 1 =
+ /// PEBS is not supported; 0 = PEBS is supported. Introduced at Display
+ /// Family / Display Model 06_0FH.
+ ///
+ UINT32 PEBS:1;
+ UINT32 Reserved4:3;
+ ///
+ /// [Bit 16] Enhanced Intel SpeedStep Technology Enable (R/W) 0= Enhanced
+ /// Intel SpeedStep Technology disabled 1 = Enhanced Intel SpeedStep
+ /// Technology enabled. If CPUID.01H: ECX[7] =1.
+ ///
+ UINT32 EIST:1;
+ UINT32 Reserved5:1;
+ ///
+ /// [Bit 18] ENABLE MONITOR FSM (R/W) When this bit is set to 0, the
+ /// MONITOR feature flag is not set (CPUID.01H:ECX[bit 3] = 0). This
+ /// indicates that MONITOR/MWAIT are not supported. Software attempts to
+ /// execute MONITOR/MWAIT will cause #UD when this bit is 0. When this bit
+ /// is set to 1 (default), MONITOR/MWAIT are supported (CPUID.01H:ECX[bit
+ /// 3] = 1). If the SSE3 feature flag ECX[0] is not set (CPUID.01H:ECX[bit
+ /// 0] = 0), the OS must not attempt to alter this bit. BIOS must leave it
+ /// in the default state. Writing this bit when the SSE3 feature flag is
+ /// set to 0 may generate a #GP exception. Introduced at Display Family /
+ /// Display Model 0F_03H.
+ ///
+ UINT32 MONITOR:1;
+ UINT32 Reserved6:3;
+ ///
+ /// [Bit 22] Limit CPUID Maxval (R/W) When this bit is set to 1, CPUID.00H
+ /// returns a maximum value in EAX[7:0] of 2. BIOS should contain a setup
+ /// question that allows users to specify when the installed OS does not
+ /// support CPUID functions greater than 2. Before setting this bit, BIOS
+ /// must execute the CPUID.0H and examine the maximum value returned in
+ /// EAX[7:0]. If the maximum value is greater than 2, this bit is
+ /// supported. Otherwise, this bit is not supported. Setting this bit when
+ /// the maximum value is not greater than 2 may generate a #GP exception.
+ /// Setting this bit may cause unexpected behavior in software that
+ /// depends on the availability of CPUID leaves greater than 2. Introduced
+ /// at Display Family / Display Model 0F_03H.
+ ///
+ UINT32 LimitCpuidMaxval:1;
+ ///
+ /// [Bit 23] xTPR Message Disable (R/W) When set to 1, xTPR messages are
+ /// disabled. xTPR messages are optional messages that allow the processor
+ /// to inform the chipset of its priority. if CPUID.01H:ECX[14] = 1.
+ ///
+ UINT32 xTPR_Message_Disable:1;
+ UINT32 Reserved7:8;
+ UINT32 Reserved8:2;
+ ///
+ /// [Bit 34] XD Bit Disable (R/W) When set to 1, the Execute Disable Bit
+ /// feature (XD Bit) is disabled and the XD Bit extended feature flag will
+ /// be clear (CPUID.80000001H: EDX[20]=0). When set to a 0 (default), the
+ /// Execute Disable Bit feature (if available) allows the OS to enable PAE
+ /// paging and take advantage of data only pages. BIOS must not alter the
+ /// contents of this bit location, if XD bit is not supported. Writing
+ /// this bit to 1 when the XD Bit extended feature flag is set to 0 may
+ /// generate a #GP exception. if CPUID.80000001H:EDX[2 0] = 1.
+ ///
+ UINT32 XD:1;
+ UINT32 Reserved9:29;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MISC_ENABLE_REGISTER;
+
+
+/**
+ Performance Energy Bias Hint (R/W). if CPUID.6H:ECX[3] = 1.
+
+ @param ECX MSR_IA32_ENERGY_PERF_BIAS (0x000001B0)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_ENERGY_PERF_BIAS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_ENERGY_PERF_BIAS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_ENERGY_PERF_BIAS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_ENERGY_PERF_BIAS);
+ AsmWriteMsr64 (MSR_IA32_ENERGY_PERF_BIAS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_ENERGY_PERF_BIAS is defined as IA32_ENERGY_PERF_BIAS in SDM.
+**/
+#define MSR_IA32_ENERGY_PERF_BIAS 0x000001B0
+
+/**
+ MSR information returned for MSR index #MSR_IA32_ENERGY_PERF_BIAS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 3:0] Power Policy Preference: 0 indicates preference to highest
+ /// performance. 15 indicates preference to maximize energy saving.
+ ///
+ UINT32 PowerPolicyPreference:4;
+ UINT32 Reserved1:28;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_ENERGY_PERF_BIAS_REGISTER;
+
+
+/**
+ Package Thermal Status Information (RO) Contains status information about
+ the package's thermal sensor. See Section 14.8, "Package Level Thermal
+ Management.". If CPUID.06H: EAX[6] = 1.
+
+ @param ECX MSR_IA32_PACKAGE_THERM_STATUS (0x000001B1)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PACKAGE_THERM_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PACKAGE_THERM_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PACKAGE_THERM_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PACKAGE_THERM_STATUS);
+ @endcode
+ @note MSR_IA32_PACKAGE_THERM_STATUS is defined as IA32_PACKAGE_THERM_STATUS in SDM.
+**/
+#define MSR_IA32_PACKAGE_THERM_STATUS 0x000001B1
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PACKAGE_THERM_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Pkg Thermal Status (RO):.
+ ///
+ UINT32 ThermalStatus:1;
+ ///
+ /// [Bit 1] Pkg Thermal Status Log (R/W):.
+ ///
+ UINT32 ThermalStatusLog:1;
+ ///
+ /// [Bit 2] Pkg PROCHOT # event (RO).
+ ///
+ UINT32 PROCHOT_Event:1;
+ ///
+ /// [Bit 3] Pkg PROCHOT # log (R/WC0).
+ ///
+ UINT32 PROCHOT_Log:1;
+ ///
+ /// [Bit 4] Pkg Critical Temperature Status (RO).
+ ///
+ UINT32 CriticalTempStatus:1;
+ ///
+ /// [Bit 5] Pkg Critical Temperature Status log (R/WC0).
+ ///
+ UINT32 CriticalTempStatusLog:1;
+ ///
+ /// [Bit 6] Pkg Thermal Threshold #1 Status (RO).
+ ///
+ UINT32 ThermalThreshold1Status:1;
+ ///
+ /// [Bit 7] Pkg Thermal Threshold #1 log (R/WC0).
+ ///
+ UINT32 ThermalThreshold1Log:1;
+ ///
+ /// [Bit 8] Pkg Thermal Threshold #2 Status (RO).
+ ///
+ UINT32 ThermalThreshold2Status:1;
+ ///
+ /// [Bit 9] Pkg Thermal Threshold #1 log (R/WC0).
+ ///
+ UINT32 ThermalThreshold2Log:1;
+ ///
+ /// [Bit 10] Pkg Power Limitation Status (RO).
+ ///
+ UINT32 PowerLimitStatus:1;
+ ///
+ /// [Bit 11] Pkg Power Limitation log (R/WC0).
+ ///
+ UINT32 PowerLimitLog:1;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bits 22:16] Pkg Digital Readout (RO).
+ ///
+ UINT32 DigitalReadout:7;
+ UINT32 Reserved2:9;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PACKAGE_THERM_STATUS_REGISTER;
+
+
+/**
+ Pkg Thermal Interrupt Control (R/W) Enables and disables the generation of
+ an interrupt on temperature transitions detected with the package's thermal
+ sensor. See Section 14.8, "Package Level Thermal Management.". If CPUID.06H:
+ EAX[6] = 1.
+
+ @param ECX MSR_IA32_PACKAGE_THERM_INTERRUPT (0x000001B2)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PACKAGE_THERM_INTERRUPT);
+ AsmWriteMsr64 (MSR_IA32_PACKAGE_THERM_INTERRUPT, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PACKAGE_THERM_INTERRUPT is defined as IA32_PACKAGE_THERM_INTERRUPT in SDM.
+**/
+#define MSR_IA32_PACKAGE_THERM_INTERRUPT 0x000001B2
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PACKAGE_THERM_INTERRUPT
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Pkg High-Temperature Interrupt Enable.
+ ///
+ UINT32 HighTempEnable:1;
+ ///
+ /// [Bit 1] Pkg Low-Temperature Interrupt Enable.
+ ///
+ UINT32 LowTempEnable:1;
+ ///
+ /// [Bit 2] Pkg PROCHOT# Interrupt Enable.
+ ///
+ UINT32 PROCHOT_Enable:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 4] Pkg Overheat Interrupt Enable.
+ ///
+ UINT32 OverheatEnable:1;
+ UINT32 Reserved2:3;
+ ///
+ /// [Bits 14:8] Pkg Threshold #1 Value.
+ ///
+ UINT32 Threshold1:7;
+ ///
+ /// [Bit 15] Pkg Threshold #1 Interrupt Enable.
+ ///
+ UINT32 Threshold1Enable:1;
+ ///
+ /// [Bits 22:16] Pkg Threshold #2 Value.
+ ///
+ UINT32 Threshold2:7;
+ ///
+ /// [Bit 23] Pkg Threshold #2 Interrupt Enable.
+ ///
+ UINT32 Threshold2Enable:1;
+ ///
+ /// [Bit 24] Pkg Power Limit Notification Enable.
+ ///
+ UINT32 PowerLimitNotificationEnable:1;
+ UINT32 Reserved3:7;
+ UINT32 Reserved4:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER;
+
+
+/**
+ Trace/Profile Resource Control (R/W). Introduced at Display Family / Display
+ Model 06_0EH.
+
+ @param ECX MSR_IA32_DEBUGCTL (0x000001D9)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_DEBUGCTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_DEBUGCTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_DEBUGCTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DEBUGCTL);
+ AsmWriteMsr64 (MSR_IA32_DEBUGCTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_DEBUGCTL is defined as IA32_DEBUGCTL in SDM.
+**/
+#define MSR_IA32_DEBUGCTL 0x000001D9
+
+/**
+ MSR information returned for MSR index #MSR_IA32_DEBUGCTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] LBR: Setting this bit to 1 enables the processor to record a
+ /// running trace of the most recent branches taken by the processor in
+ /// the LBR stack. Introduced at Display Family / Display Model 06_01H.
+ ///
+ UINT32 LBR:1;
+ ///
+ /// [Bit 1] BTF: Setting this bit to 1 enables the processor to treat
+ /// EFLAGS.TF as single-step on branches instead of single-step on
+ /// instructions. Introduced at Display Family / Display Model 06_01H.
+ ///
+ UINT32 BTF:1;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bit 6] TR: Setting this bit to 1 enables branch trace messages to be
+ /// sent. Introduced at Display Family / Display Model 06_0EH.
+ ///
+ UINT32 TR:1;
+ ///
+ /// [Bit 7] BTS: Setting this bit enables branch trace messages (BTMs) to
+ /// be logged in a BTS buffer. Introduced at Display Family / Display
+ /// Model 06_0EH.
+ ///
+ UINT32 BTS:1;
+ ///
+ /// [Bit 8] BTINT: When clear, BTMs are logged in a BTS buffer in circular
+ /// fashion. When this bit is set, an interrupt is generated by the BTS
+ /// facility when the BTS buffer is full. Introduced at Display Family /
+ /// Display Model 06_0EH.
+ ///
+ UINT32 BTINT:1;
+ ///
+ /// [Bit 9] BTS_OFF_OS: When set, BTS or BTM is skipped if CPL = 0.
+ /// Introduced at Display Family / Display Model 06_0FH.
+ ///
+ UINT32 BTS_OFF_OS:1;
+ ///
+ /// [Bit 10] BTS_OFF_USR: When set, BTS or BTM is skipped if CPL > 0.
+ /// Introduced at Display Family / Display Model 06_0FH.
+ ///
+ UINT32 BTS_OFF_USR:1;
+ ///
+ /// [Bit 11] FREEZE_LBRS_ON_PMI: When set, the LBR stack is frozen on a
+ /// PMI request. If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1.
+ ///
+ UINT32 FREEZE_LBRS_ON_PMI:1;
+ ///
+ /// [Bit 12] FREEZE_PERFMON_ON_PMI: When set, each ENABLE bit of the
+ /// global counter control MSR are frozen (address 38FH) on a PMI request.
+ /// If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1.
+ ///
+ UINT32 FREEZE_PERFMON_ON_PMI:1;
+ ///
+ /// [Bit 13] ENABLE_UNCORE_PMI: When set, enables the logical processor to
+ /// receive and generate PMI on behalf of the uncore. Introduced at
+ /// Display Family / Display Model 06_1AH.
+ ///
+ UINT32 ENABLE_UNCORE_PMI:1;
+ ///
+ /// [Bit 14] FREEZE_WHILE_SMM: When set, freezes perfmon and trace
+ /// messages while in SMM. If IA32_PERF_CAPABILITIES[ 12] = 1.
+ ///
+ UINT32 FREEZE_WHILE_SMM:1;
+ ///
+ /// [Bit 15] RTM_DEBUG: When set, enables DR7 debug bit on XBEGIN. If
+ /// (CPUID.(EAX=07H, ECX=0):EBX[11] = 1).
+ ///
+ UINT32 RTM_DEBUG:1;
+ UINT32 Reserved2:16;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_DEBUGCTL_REGISTER;
+
+
+/**
+ SMRR Base Address (Writeable only in SMM) Base address of SMM memory range.
+ If IA32_MTRRCAP.SMRR[11] = 1.
+
+ @param ECX MSR_IA32_SMRR_PHYSBASE (0x000001F2)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_SMRR_PHYSBASE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_SMRR_PHYSBASE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_SMRR_PHYSBASE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMRR_PHYSBASE);
+ AsmWriteMsr64 (MSR_IA32_SMRR_PHYSBASE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_SMRR_PHYSBASE is defined as IA32_SMRR_PHYSBASE in SDM.
+**/
+#define MSR_IA32_SMRR_PHYSBASE 0x000001F2
+
+/**
+ MSR information returned for MSR index #MSR_IA32_SMRR_PHYSBASE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Type. Specifies memory type of the range.
+ ///
+ UINT32 Type:8;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bits 31:12] PhysBase. SMRR physical Base Address.
+ ///
+ UINT32 PhysBase:20;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_SMRR_PHYSBASE_REGISTER;
+
+
+/**
+ SMRR Range Mask (Writeable only in SMM) Range Mask of SMM memory range. If
+ IA32_MTRRCAP[SMRR] = 1.
+
+ @param ECX MSR_IA32_SMRR_PHYSMASK (0x000001F3)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_SMRR_PHYSMASK_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_SMRR_PHYSMASK_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_SMRR_PHYSMASK_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMRR_PHYSMASK);
+ AsmWriteMsr64 (MSR_IA32_SMRR_PHYSMASK, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_SMRR_PHYSMASK is defined as IA32_SMRR_PHYSMASK in SDM.
+**/
+#define MSR_IA32_SMRR_PHYSMASK 0x000001F3
+
+/**
+ MSR information returned for MSR index #MSR_IA32_SMRR_PHYSMASK
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved1:11;
+ ///
+ /// [Bit 11] Valid Enable range mask.
+ ///
+ UINT32 Valid:1;
+ ///
+ /// [Bits 31:12] PhysMask SMRR address range mask.
+ ///
+ UINT32 PhysMask:20;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_SMRR_PHYSMASK_REGISTER;
+
+
+/**
+ DCA Capability (R). If CPUID.01H: ECX[18] = 1.
+
+ @param ECX MSR_IA32_PLATFORM_DCA_CAP (0x000001F8)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_PLATFORM_DCA_CAP);
+ @endcode
+ @note MSR_IA32_PLATFORM_DCA_CAP is defined as IA32_PLATFORM_DCA_CAP in SDM.
+**/
+#define MSR_IA32_PLATFORM_DCA_CAP 0x000001F8
+
+
+/**
+ If set, CPU supports Prefetch-Hint type. If CPUID.01H: ECX[18] = 1.
+
+ @param ECX MSR_IA32_CPU_DCA_CAP (0x000001F9)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_CPU_DCA_CAP);
+ AsmWriteMsr64 (MSR_IA32_CPU_DCA_CAP, Msr);
+ @endcode
+ @note MSR_IA32_CPU_DCA_CAP is defined as IA32_CPU_DCA_CAP in SDM.
+**/
+#define MSR_IA32_CPU_DCA_CAP 0x000001F9
+
+
+/**
+ DCA type 0 Status and Control register. If CPUID.01H: ECX[18] = 1.
+
+ @param ECX MSR_IA32_DCA_0_CAP (0x000001FA)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_DCA_0_CAP_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_DCA_0_CAP_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_DCA_0_CAP_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DCA_0_CAP);
+ AsmWriteMsr64 (MSR_IA32_DCA_0_CAP, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_DCA_0_CAP is defined as IA32_DCA_0_CAP in SDM.
+**/
+#define MSR_IA32_DCA_0_CAP 0x000001FA
+
+/**
+ MSR information returned for MSR index #MSR_IA32_DCA_0_CAP
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] DCA_ACTIVE: Set by HW when DCA is fuseenabled and no
+ /// defeatures are set.
+ ///
+ UINT32 DCA_ACTIVE:1;
+ ///
+ /// [Bits 2:1] TRANSACTION.
+ ///
+ UINT32 TRANSACTION:2;
+ ///
+ /// [Bits 6:3] DCA_TYPE.
+ ///
+ UINT32 DCA_TYPE:4;
+ ///
+ /// [Bits 10:7] DCA_QUEUE_SIZE.
+ ///
+ UINT32 DCA_QUEUE_SIZE:4;
+ UINT32 Reserved1:2;
+ ///
+ /// [Bits 16:13] DCA_DELAY: Writes will update the register but have no HW
+ /// side-effect.
+ ///
+ UINT32 DCA_DELAY:4;
+ UINT32 Reserved2:7;
+ ///
+ /// [Bit 24] SW_BLOCK: SW can request DCA block by setting this bit.
+ ///
+ UINT32 SW_BLOCK:1;
+ UINT32 Reserved3:1;
+ ///
+ /// [Bit 26] HW_BLOCK: Set when DCA is blocked by HW (e.g. CR0.CD = 1).
+ ///
+ UINT32 HW_BLOCK:1;
+ UINT32 Reserved4:5;
+ UINT32 Reserved5:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_DCA_0_CAP_REGISTER;
+
+
+/**
+ MTRRphysBasen. See Section 11.11.2.3, "Variable Range MTRRs".
+ If CPUID.01H: EDX.MTRR[12] = 1 and IA32_MTRRCAP[7:0] > n.
+
+ @param ECX MSR_IA32_MTRR_PHYSBASEn
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_PHYSBASE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_PHYSBASE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MTRR_PHYSBASE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_PHYSBASE0);
+ AsmWriteMsr64 (MSR_IA32_MTRR_PHYSBASE0, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MTRR_PHYSBASE0 is defined as IA32_MTRR_PHYSBASE0 in SDM.
+ MSR_IA32_MTRR_PHYSBASE1 is defined as IA32_MTRR_PHYSBASE1 in SDM.
+ MSR_IA32_MTRR_PHYSBASE2 is defined as IA32_MTRR_PHYSBASE2 in SDM.
+ MSR_IA32_MTRR_PHYSBASE3 is defined as IA32_MTRR_PHYSBASE3 in SDM.
+ MSR_IA32_MTRR_PHYSBASE4 is defined as IA32_MTRR_PHYSBASE4 in SDM.
+ MSR_IA32_MTRR_PHYSBASE5 is defined as IA32_MTRR_PHYSBASE5 in SDM.
+ MSR_IA32_MTRR_PHYSBASE6 is defined as IA32_MTRR_PHYSBASE6 in SDM.
+ MSR_IA32_MTRR_PHYSBASE7 is defined as IA32_MTRR_PHYSBASE7 in SDM.
+ MSR_IA32_MTRR_PHYSBASE8 is defined as IA32_MTRR_PHYSBASE8 in SDM.
+ MSR_IA32_MTRR_PHYSBASE9 is defined as IA32_MTRR_PHYSBASE9 in SDM.
+ @{
+**/
+#define MSR_IA32_MTRR_PHYSBASE0 0x00000200
+#define MSR_IA32_MTRR_PHYSBASE1 0x00000202
+#define MSR_IA32_MTRR_PHYSBASE2 0x00000204
+#define MSR_IA32_MTRR_PHYSBASE3 0x00000206
+#define MSR_IA32_MTRR_PHYSBASE4 0x00000208
+#define MSR_IA32_MTRR_PHYSBASE5 0x0000020A
+#define MSR_IA32_MTRR_PHYSBASE6 0x0000020C
+#define MSR_IA32_MTRR_PHYSBASE7 0x0000020E
+#define MSR_IA32_MTRR_PHYSBASE8 0x00000210
+#define MSR_IA32_MTRR_PHYSBASE9 0x00000212
+/// @}
+
+/**
+ MSR information returned for MSR indexes #MSR_IA32_MTRR_PHYSBASE0 to
+ #MSR_IA32_MTRR_PHYSBASE9
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Type. Specifies memory type of the range.
+ ///
+ UINT32 Type:8;
+ UINT32 Reserved1:4;
+ ///
+ /// [Bits 31:12] PhysBase. MTRR physical Base Address.
+ ///
+ UINT32 PhysBase:20;
+ ///
+ /// [Bits MAXPHYSADDR:32] PhysBase. Upper bits of MTRR physical Base Address.
+ /// MAXPHYADDR: The bit position indicated by MAXPHYADDR depends on the
+ /// maximum physical address range supported by the processor. It is
+ /// reported by CPUID leaf function 80000008H. If CPUID does not support
+ /// leaf 80000008H, the processor supports 36-bit physical address size,
+ /// then bit PhysMask consists of bits 35:12, and bits 63:36 are reserved.
+ ///
+ UINT32 PhysBaseHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MTRR_PHYSBASE_REGISTER;
+
+
+/**
+ MTRRphysMaskn. See Section 11.11.2.3, "Variable Range MTRRs".
+ If CPUID.01H: EDX.MTRR[12] = 1 and IA32_MTRRCAP[7:0] > n.
+
+ @param ECX MSR_IA32_MTRR_PHYSMASKn
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_PHYSMASK_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_PHYSMASK_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MTRR_PHYSMASK_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_PHYSMASK0);
+ AsmWriteMsr64 (MSR_IA32_MTRR_PHYSMASK0, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MTRR_PHYSMASK0 is defined as IA32_MTRR_PHYSMASK0 in SDM.
+ MSR_IA32_MTRR_PHYSMASK1 is defined as IA32_MTRR_PHYSMASK1 in SDM.
+ MSR_IA32_MTRR_PHYSMASK2 is defined as IA32_MTRR_PHYSMASK2 in SDM.
+ MSR_IA32_MTRR_PHYSMASK3 is defined as IA32_MTRR_PHYSMASK3 in SDM.
+ MSR_IA32_MTRR_PHYSMASK4 is defined as IA32_MTRR_PHYSMASK4 in SDM.
+ MSR_IA32_MTRR_PHYSMASK5 is defined as IA32_MTRR_PHYSMASK5 in SDM.
+ MSR_IA32_MTRR_PHYSMASK6 is defined as IA32_MTRR_PHYSMASK6 in SDM.
+ MSR_IA32_MTRR_PHYSMASK7 is defined as IA32_MTRR_PHYSMASK7 in SDM.
+ MSR_IA32_MTRR_PHYSMASK8 is defined as IA32_MTRR_PHYSMASK8 in SDM.
+ MSR_IA32_MTRR_PHYSMASK9 is defined as IA32_MTRR_PHYSMASK9 in SDM.
+ @{
+**/
+#define MSR_IA32_MTRR_PHYSMASK0 0x00000201
+#define MSR_IA32_MTRR_PHYSMASK1 0x00000203
+#define MSR_IA32_MTRR_PHYSMASK2 0x00000205
+#define MSR_IA32_MTRR_PHYSMASK3 0x00000207
+#define MSR_IA32_MTRR_PHYSMASK4 0x00000209
+#define MSR_IA32_MTRR_PHYSMASK5 0x0000020B
+#define MSR_IA32_MTRR_PHYSMASK6 0x0000020D
+#define MSR_IA32_MTRR_PHYSMASK7 0x0000020F
+#define MSR_IA32_MTRR_PHYSMASK8 0x00000211
+#define MSR_IA32_MTRR_PHYSMASK9 0x00000213
+/// @}
+
+/**
+ MSR information returned for MSR indexes #MSR_IA32_MTRR_PHYSMASK0 to
+ #MSR_IA32_MTRR_PHYSMASK9
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved1:11;
+ ///
+ /// [Bit 11] Valid Enable range mask.
+ ///
+ UINT32 V:1;
+ ///
+ /// [Bits 31:12] PhysMask. MTRR address range mask.
+ ///
+ UINT32 PhysMask:20;
+ ///
+ /// [Bits MAXPHYSADDR:32] PhysMask. Upper bits of MTRR address range mask.
+ /// MAXPHYADDR: The bit position indicated by MAXPHYADDR depends on the
+ /// maximum physical address range supported by the processor. It is
+ /// reported by CPUID leaf function 80000008H. If CPUID does not support
+ /// leaf 80000008H, the processor supports 36-bit physical address size,
+ /// then bit PhysMask consists of bits 35:12, and bits 63:36 are reserved.
+ ///
+ UINT32 PhysMaskHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MTRR_PHYSMASK_REGISTER;
+
+
+/**
+ MTRRfix64K_00000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX64K_00000 (0x00000250)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX64K_00000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX64K_00000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX64K_00000 is defined as IA32_MTRR_FIX64K_00000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX64K_00000 0x00000250
+
+
+/**
+ MTRRfix16K_80000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX16K_80000 (0x00000258)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX16K_80000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX16K_80000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX16K_80000 is defined as IA32_MTRR_FIX16K_80000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX16K_80000 0x00000258
+
+
+/**
+ MTRRfix16K_A0000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX16K_A0000 (0x00000259)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX16K_A0000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX16K_A0000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX16K_A0000 is defined as IA32_MTRR_FIX16K_A0000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX16K_A0000 0x00000259
+
+
+/**
+ See Section 11.11.2.2, "Fixed Range MTRRs.". If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_C0000 (0x00000268)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_C0000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_C0000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_C0000 is defined as IA32_MTRR_FIX4K_C0000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_C0000 0x00000268
+
+
+/**
+ MTRRfix4K_C8000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_C8000 (0x00000269)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_C8000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_C8000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_C8000 is defined as IA32_MTRR_FIX4K_C8000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_C8000 0x00000269
+
+
+/**
+ MTRRfix4K_D0000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_D0000 (0x0000026A)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_D0000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_D0000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_D0000 is defined as IA32_MTRR_FIX4K_D0000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_D0000 0x0000026A
+
+
+/**
+ MTRRfix4K_D8000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_D8000 (0x0000026B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_D8000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_D8000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_D8000 is defined as IA32_MTRR_FIX4K_D8000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_D8000 0x0000026B
+
+
+/**
+ MTRRfix4K_E0000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_E0000 (0x0000026C)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_E0000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_E0000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_E0000 is defined as IA32_MTRR_FIX4K_E0000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_E0000 0x0000026C
+
+
+/**
+ MTRRfix4K_E8000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_E8000 (0x0000026D)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_E8000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_E8000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_E8000 is defined as IA32_MTRR_FIX4K_E8000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_E8000 0x0000026D
+
+
+/**
+ MTRRfix4K_F0000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_F0000 (0x0000026E)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_F0000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_F0000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_F0000 is defined as IA32_MTRR_FIX4K_F0000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_F0000 0x0000026E
+
+
+/**
+ MTRRfix4K_F8000. If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_FIX4K_F8000 (0x0000026F)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_F8000);
+ AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_F8000, Msr);
+ @endcode
+ @note MSR_IA32_MTRR_FIX4K_F8000 is defined as IA32_MTRR_FIX4K_F8000 in SDM.
+**/
+#define MSR_IA32_MTRR_FIX4K_F8000 0x0000026F
+
+
+/**
+ IA32_PAT (R/W). If CPUID.01H: EDX.MTRR[16] =1.
+
+ @param ECX MSR_IA32_PAT (0x00000277)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PAT_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PAT_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PAT_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PAT);
+ AsmWriteMsr64 (MSR_IA32_PAT, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PAT is defined as IA32_PAT in SDM.
+**/
+#define MSR_IA32_PAT 0x00000277
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PAT
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 2:0] PA0.
+ ///
+ UINT32 PA0:3;
+ UINT32 Reserved1:5;
+ ///
+ /// [Bits 10:8] PA1.
+ ///
+ UINT32 PA1:3;
+ UINT32 Reserved2:5;
+ ///
+ /// [Bits 18:16] PA2.
+ ///
+ UINT32 PA2:3;
+ UINT32 Reserved3:5;
+ ///
+ /// [Bits 26:24] PA3.
+ ///
+ UINT32 PA3:3;
+ UINT32 Reserved4:5;
+ ///
+ /// [Bits 34:32] PA4.
+ ///
+ UINT32 PA4:3;
+ UINT32 Reserved5:5;
+ ///
+ /// [Bits 42:40] PA5.
+ ///
+ UINT32 PA5:3;
+ UINT32 Reserved6:5;
+ ///
+ /// [Bits 50:48] PA6.
+ ///
+ UINT32 PA6:3;
+ UINT32 Reserved7:5;
+ ///
+ /// [Bits 58:56] PA7.
+ ///
+ UINT32 PA7:3;
+ UINT32 Reserved8:5;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PAT_REGISTER;
+
+
+/**
+ Provides the programming interface to use corrected MC error signaling
+ capability (R/W). If IA32_MCG_CAP[10] = 1 && IA32_MCG_CAP[7:0] > n.
+
+ @param ECX MSR_IA32_MCn_CTL2
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MC_CTL2_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MC_CTL2_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MC_CTL2_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MC0_CTL2);
+ AsmWriteMsr64 (MSR_IA32_MC0_CTL2, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MC0_CTL2 is defined as IA32_MC0_CTL2 in SDM.
+ MSR_IA32_MC1_CTL2 is defined as IA32_MC1_CTL2 in SDM.
+ MSR_IA32_MC2_CTL2 is defined as IA32_MC2_CTL2 in SDM.
+ MSR_IA32_MC3_CTL2 is defined as IA32_MC3_CTL2 in SDM.
+ MSR_IA32_MC4_CTL2 is defined as IA32_MC4_CTL2 in SDM.
+ MSR_IA32_MC5_CTL2 is defined as IA32_MC5_CTL2 in SDM.
+ MSR_IA32_MC6_CTL2 is defined as IA32_MC6_CTL2 in SDM.
+ MSR_IA32_MC7_CTL2 is defined as IA32_MC7_CTL2 in SDM.
+ MSR_IA32_MC8_CTL2 is defined as IA32_MC8_CTL2 in SDM.
+ MSR_IA32_MC9_CTL2 is defined as IA32_MC9_CTL2 in SDM.
+ MSR_IA32_MC10_CTL2 is defined as IA32_MC10_CTL2 in SDM.
+ MSR_IA32_MC11_CTL2 is defined as IA32_MC11_CTL2 in SDM.
+ MSR_IA32_MC12_CTL2 is defined as IA32_MC12_CTL2 in SDM.
+ MSR_IA32_MC13_CTL2 is defined as IA32_MC13_CTL2 in SDM.
+ MSR_IA32_MC14_CTL2 is defined as IA32_MC14_CTL2 in SDM.
+ MSR_IA32_MC15_CTL2 is defined as IA32_MC15_CTL2 in SDM.
+ MSR_IA32_MC16_CTL2 is defined as IA32_MC16_CTL2 in SDM.
+ MSR_IA32_MC17_CTL2 is defined as IA32_MC17_CTL2 in SDM.
+ MSR_IA32_MC18_CTL2 is defined as IA32_MC18_CTL2 in SDM.
+ MSR_IA32_MC19_CTL2 is defined as IA32_MC19_CTL2 in SDM.
+ MSR_IA32_MC20_CTL2 is defined as IA32_MC20_CTL2 in SDM.
+ MSR_IA32_MC21_CTL2 is defined as IA32_MC21_CTL2 in SDM.
+ MSR_IA32_MC22_CTL2 is defined as IA32_MC22_CTL2 in SDM.
+ MSR_IA32_MC23_CTL2 is defined as IA32_MC23_CTL2 in SDM.
+ MSR_IA32_MC24_CTL2 is defined as IA32_MC24_CTL2 in SDM.
+ MSR_IA32_MC25_CTL2 is defined as IA32_MC25_CTL2 in SDM.
+ MSR_IA32_MC26_CTL2 is defined as IA32_MC26_CTL2 in SDM.
+ MSR_IA32_MC27_CTL2 is defined as IA32_MC27_CTL2 in SDM.
+ MSR_IA32_MC28_CTL2 is defined as IA32_MC28_CTL2 in SDM.
+ MSR_IA32_MC29_CTL2 is defined as IA32_MC29_CTL2 in SDM.
+ MSR_IA32_MC30_CTL2 is defined as IA32_MC30_CTL2 in SDM.
+ MSR_IA32_MC31_CTL2 is defined as IA32_MC31_CTL2 in SDM.
+ @{
+**/
+#define MSR_IA32_MC0_CTL2 0x00000280
+#define MSR_IA32_MC1_CTL2 0x00000281
+#define MSR_IA32_MC2_CTL2 0x00000282
+#define MSR_IA32_MC3_CTL2 0x00000283
+#define MSR_IA32_MC4_CTL2 0x00000284
+#define MSR_IA32_MC5_CTL2 0x00000285
+#define MSR_IA32_MC6_CTL2 0x00000286
+#define MSR_IA32_MC7_CTL2 0x00000287
+#define MSR_IA32_MC8_CTL2 0x00000288
+#define MSR_IA32_MC9_CTL2 0x00000289
+#define MSR_IA32_MC10_CTL2 0x0000028A
+#define MSR_IA32_MC11_CTL2 0x0000028B
+#define MSR_IA32_MC12_CTL2 0x0000028C
+#define MSR_IA32_MC13_CTL2 0x0000028D
+#define MSR_IA32_MC14_CTL2 0x0000028E
+#define MSR_IA32_MC15_CTL2 0x0000028F
+#define MSR_IA32_MC16_CTL2 0x00000290
+#define MSR_IA32_MC17_CTL2 0x00000291
+#define MSR_IA32_MC18_CTL2 0x00000292
+#define MSR_IA32_MC19_CTL2 0x00000293
+#define MSR_IA32_MC20_CTL2 0x00000294
+#define MSR_IA32_MC21_CTL2 0x00000295
+#define MSR_IA32_MC22_CTL2 0x00000296
+#define MSR_IA32_MC23_CTL2 0x00000297
+#define MSR_IA32_MC24_CTL2 0x00000298
+#define MSR_IA32_MC25_CTL2 0x00000299
+#define MSR_IA32_MC26_CTL2 0x0000029A
+#define MSR_IA32_MC27_CTL2 0x0000029B
+#define MSR_IA32_MC28_CTL2 0x0000029C
+#define MSR_IA32_MC29_CTL2 0x0000029D
+#define MSR_IA32_MC30_CTL2 0x0000029E
+#define MSR_IA32_MC31_CTL2 0x0000029F
+/// @}
+
+/**
+ MSR information returned for MSR indexes #MSR_IA32_MC0_CTL2
+ to #MSR_IA32_MC31_CTL2
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 14:0] Corrected error count threshold.
+ ///
+ UINT32 CorrectedErrorCountThreshold:15;
+ UINT32 Reserved1:15;
+ ///
+ /// [Bit 30] CMCI_EN.
+ ///
+ UINT32 CMCI_EN:1;
+ UINT32 Reserved2:1;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MC_CTL2_REGISTER;
+
+
+/**
+ MTRRdefType (R/W). If CPUID.01H: EDX.MTRR[12] =1.
+
+ @param ECX MSR_IA32_MTRR_DEF_TYPE (0x000002FF)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_DEF_TYPE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MTRR_DEF_TYPE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MTRR_DEF_TYPE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE);
+ AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MTRR_DEF_TYPE is defined as IA32_MTRR_DEF_TYPE in SDM.
+**/
+#define MSR_IA32_MTRR_DEF_TYPE 0x000002FF
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MTRR_DEF_TYPE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 2:0] Default Memory Type.
+ ///
+ UINT32 Type:3;
+ UINT32 Reserved1:7;
+ ///
+ /// [Bit 10] Fixed Range MTRR Enable.
+ ///
+ UINT32 FE:1;
+ ///
+ /// [Bit 11] MTRR Enable.
+ ///
+ UINT32 E:1;
+ UINT32 Reserved2:20;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MTRR_DEF_TYPE_REGISTER;
+
+
+/**
+ Fixed-Function Performance Counter 0 (R/W): Counts Instr_Retired.Any. If
+ CPUID.0AH: EDX[4:0] > 0.
+
+ @param ECX MSR_IA32_FIXED_CTR0 (0x00000309)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR0);
+ AsmWriteMsr64 (MSR_IA32_FIXED_CTR0, Msr);
+ @endcode
+ @note MSR_IA32_FIXED_CTR0 is defined as IA32_FIXED_CTR0 in SDM.
+**/
+#define MSR_IA32_FIXED_CTR0 0x00000309
+
+
+/**
+ Fixed-Function Performance Counter 1 (R/W): Counts CPU_CLK_Unhalted.Core. If
+ CPUID.0AH: EDX[4:0] > 1.
+
+ @param ECX MSR_IA32_FIXED_CTR1 (0x0000030A)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR1);
+ AsmWriteMsr64 (MSR_IA32_FIXED_CTR1, Msr);
+ @endcode
+ @note MSR_IA32_FIXED_CTR1 is defined as IA32_FIXED_CTR1 in SDM.
+**/
+#define MSR_IA32_FIXED_CTR1 0x0000030A
+
+
+/**
+ Fixed-Function Performance Counter 2 (R/W): Counts CPU_CLK_Unhalted.Ref. If
+ CPUID.0AH: EDX[4:0] > 2.
+
+ @param ECX MSR_IA32_FIXED_CTR2 (0x0000030B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR2);
+ AsmWriteMsr64 (MSR_IA32_FIXED_CTR2, Msr);
+ @endcode
+ @note MSR_IA32_FIXED_CTR2 is defined as IA32_FIXED_CTR2 in SDM.
+**/
+#define MSR_IA32_FIXED_CTR2 0x0000030B
+
+
+/**
+ RO. If CPUID.01H: ECX[15] = 1.
+
+ @param ECX MSR_IA32_PERF_CAPABILITIES (0x00000345)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_CAPABILITIES_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_CAPABILITIES_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_CAPABILITIES_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_CAPABILITIES);
+ AsmWriteMsr64 (MSR_IA32_PERF_CAPABILITIES, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_CAPABILITIES is defined as IA32_PERF_CAPABILITIES in SDM.
+**/
+#define MSR_IA32_PERF_CAPABILITIES 0x00000345
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_CAPABILITIES
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 5:0] LBR format.
+ ///
+ UINT32 LBR_FMT:6;
+ ///
+ /// [Bit 6] PEBS Trap.
+ ///
+ UINT32 PEBS_TRAP:1;
+ ///
+ /// [Bit 7] PEBSSaveArchRegs.
+ ///
+ UINT32 PEBS_ARCH_REG:1;
+ ///
+ /// [Bits 11:8] PEBS Record Format.
+ ///
+ UINT32 PEBS_REC_FMT:4;
+ ///
+ /// [Bit 12] 1: Freeze while SMM is supported.
+ ///
+ UINT32 SMM_FREEZE:1;
+ ///
+ /// [Bit 13] 1: Full width of counter writable via IA32_A_PMCx.
+ ///
+ UINT32 FW_WRITE:1;
+ UINT32 Reserved1:18;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_CAPABILITIES_REGISTER;
+
+
+/**
+ Fixed-Function Performance Counter Control (R/W) Counter increments while
+ the results of ANDing respective enable bit in IA32_PERF_GLOBAL_CTRL with
+ the corresponding OS or USR bits in this MSR is true. If CPUID.0AH: EAX[7:0]
+ > 1.
+
+ @param ECX MSR_IA32_FIXED_CTR_CTRL (0x0000038D)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_FIXED_CTR_CTRL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_FIXED_CTR_CTRL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_FIXED_CTR_CTRL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_FIXED_CTR_CTRL);
+ AsmWriteMsr64 (MSR_IA32_FIXED_CTR_CTRL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_FIXED_CTR_CTRL is defined as IA32_FIXED_CTR_CTRL in SDM.
+**/
+#define MSR_IA32_FIXED_CTR_CTRL 0x0000038D
+
+/**
+ MSR information returned for MSR index #MSR_IA32_FIXED_CTR_CTRL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] EN0_OS: Enable Fixed Counter 0 to count while CPL = 0.
+ ///
+ UINT32 EN0_OS:1;
+ ///
+ /// [Bit 1] EN0_Usr: Enable Fixed Counter 0 to count while CPL > 0.
+ ///
+ UINT32 EN0_Usr:1;
+ ///
+ /// [Bit 2] AnyThread: When set to 1, it enables counting the associated
+ /// event conditions occurring across all logical processors sharing a
+ /// processor core. When set to 0, the counter only increments the
+ /// associated event conditions occurring in the logical processor which
+ /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
+ ///
+ UINT32 AnyThread0:1;
+ ///
+ /// [Bit 3] EN0_PMI: Enable PMI when fixed counter 0 overflows.
+ ///
+ UINT32 EN0_PMI:1;
+ ///
+ /// [Bit 4] EN1_OS: Enable Fixed Counter 1 to count while CPL = 0.
+ ///
+ UINT32 EN1_OS:1;
+ ///
+ /// [Bit 5] EN1_Usr: Enable Fixed Counter 1 to count while CPL > 0.
+ ///
+ UINT32 EN1_Usr:1;
+ ///
+ /// [Bit 6] AnyThread: When set to 1, it enables counting the associated
+ /// event conditions occurring across all logical processors sharing a
+ /// processor core. When set to 0, the counter only increments the
+ /// associated event conditions occurring in the logical processor which
+ /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
+ ///
+ UINT32 AnyThread1:1;
+ ///
+ /// [Bit 7] EN1_PMI: Enable PMI when fixed counter 1 overflows.
+ ///
+ UINT32 EN1_PMI:1;
+ ///
+ /// [Bit 8] EN2_OS: Enable Fixed Counter 2 to count while CPL = 0.
+ ///
+ UINT32 EN2_OS:1;
+ ///
+ /// [Bit 9] EN2_Usr: Enable Fixed Counter 2 to count while CPL > 0.
+ ///
+ UINT32 EN2_Usr:1;
+ ///
+ /// [Bit 10] AnyThread: When set to 1, it enables counting the associated
+ /// event conditions occurring across all logical processors sharing a
+ /// processor core. When set to 0, the counter only increments the
+ /// associated event conditions occurring in the logical processor which
+ /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
+ ///
+ UINT32 AnyThread2:1;
+ ///
+ /// [Bit 11] EN2_PMI: Enable PMI when fixed counter 2 overflows.
+ ///
+ UINT32 EN2_PMI:1;
+ UINT32 Reserved1:20;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_FIXED_CTR_CTRL_REGISTER;
+
+
+/**
+ Global Performance Counter Status (RO). If CPUID.0AH: EAX[7:0] > 0.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_STATUS (0x0000038E)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_STATUS is defined as IA32_PERF_GLOBAL_STATUS in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_STATUS 0x0000038E
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Ovf_PMC0: Overflow status of IA32_PMC0. If CPUID.0AH:
+ /// EAX[15:8] > 0.
+ ///
+ UINT32 Ovf_PMC0:1;
+ ///
+ /// [Bit 1] Ovf_PMC1: Overflow status of IA32_PMC1. If CPUID.0AH:
+ /// EAX[15:8] > 1.
+ ///
+ UINT32 Ovf_PMC1:1;
+ ///
+ /// [Bit 2] Ovf_PMC2: Overflow status of IA32_PMC2. If CPUID.0AH:
+ /// EAX[15:8] > 2.
+ ///
+ UINT32 Ovf_PMC2:1;
+ ///
+ /// [Bit 3] Ovf_PMC3: Overflow status of IA32_PMC3. If CPUID.0AH:
+ /// EAX[15:8] > 3.
+ ///
+ UINT32 Ovf_PMC3:1;
+ UINT32 Reserved1:28;
+ ///
+ /// [Bit 32] Ovf_FixedCtr0: Overflow status of IA32_FIXED_CTR0. If
+ /// CPUID.0AH: EAX[7:0] > 1.
+ ///
+ UINT32 Ovf_FixedCtr0:1;
+ ///
+ /// [Bit 33] Ovf_FixedCtr1: Overflow status of IA32_FIXED_CTR1. If
+ /// CPUID.0AH: EAX[7:0] > 1.
+ ///
+ UINT32 Ovf_FixedCtr1:1;
+ ///
+ /// [Bit 34] Ovf_FixedCtr2: Overflow status of IA32_FIXED_CTR2. If
+ /// CPUID.0AH: EAX[7:0] > 1.
+ ///
+ UINT32 Ovf_FixedCtr2:1;
+ UINT32 Reserved2:20;
+ ///
+ /// [Bit 55] Trace_ToPA_PMI: A PMI occurred due to a ToPA entry memory
+ /// buffer was completely filled. If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1)
+ /// && IA32_RTIT_CTL.ToPA = 1.
+ ///
+ UINT32 Trace_ToPA_PMI:1;
+ UINT32 Reserved3:2;
+ ///
+ /// [Bit 58] LBR_Frz: LBRs are frozen due to -
+ /// IA32_DEBUGCTL.FREEZE_LBR_ON_PMI=1, - The LBR stack overflowed. If
+ /// CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 LBR_Frz:1;
+ ///
+ /// [Bit 59] CTR_Frz: Performance counters in the core PMU are frozen due
+ /// to - IA32_DEBUGCTL.FREEZE_PERFMON_ON_ PMI=1, - one or more core PMU
+ /// counters overflowed. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 CTR_Frz:1;
+ ///
+ /// [Bit 60] ASCI: Data in the performance counters in the core PMU may
+ /// include contributions from the direct or indirect operation intel SGX
+ /// to protect an enclave. If CPUID.(EAX=07H, ECX=0):EBX[2] = 1.
+ ///
+ UINT32 ASCI:1;
+ ///
+ /// [Bit 61] Ovf_Uncore: Uncore counter overflow status. If CPUID.0AH:
+ /// EAX[7:0] > 2.
+ ///
+ UINT32 Ovf_Uncore:1;
+ ///
+ /// [Bit 62] OvfBuf: DS SAVE area Buffer overflow status. If CPUID.0AH:
+ /// EAX[7:0] > 0.
+ ///
+ UINT32 OvfBuf:1;
+ ///
+ /// [Bit 63] CondChgd: status bits of this register has changed. If
+ /// CPUID.0AH: EAX[7:0] > 0.
+ ///
+ UINT32 CondChgd:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_STATUS_REGISTER;
+
+
+/**
+ Global Performance Counter Control (R/W) Counter increments while the result
+ of ANDing respective enable bit in this MSR with the corresponding OS or USR
+ bits in the general-purpose or fixed counter control MSR is true. If
+ CPUID.0AH: EAX[7:0] > 0.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_CTRL (0x0000038F)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_CTRL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_CTRL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_CTRL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_CTRL);
+ AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_CTRL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_CTRL is defined as IA32_PERF_GLOBAL_CTRL in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_CTRL 0x0000038F
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_CTRL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+///
+ struct {
+ ///
+ /// [Bits 31:0] EN_PMCn. If CPUID.0AH: EAX[15:8] > n.
+ /// Enable bitmask. Only the first n-1 bits are valid.
+ /// Bits n..31 are reserved.
+ ///
+ UINT32 EN_PMCn:32;
+ ///
+ /// [Bits 63:32] EN_FIXED_CTRn. If CPUID.0AH: EDX[4:0] > n.
+ /// Enable bitmask. Only the first n-1 bits are valid.
+ /// Bits 31:n are reserved.
+ ///
+ UINT32 EN_FIXED_CTRn:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_CTRL_REGISTER;
+
+
+/**
+ Global Performance Counter Overflow Control (R/W). If CPUID.0AH: EAX[7:0] >
+ 0 && CPUID.0AH: EAX[7:0] <= 3.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_OVF_CTRL (0x00000390)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_OVF_CTRL);
+ AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_OVF_CTRL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_OVF_CTRL is defined as IA32_PERF_GLOBAL_OVF_CTRL in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_OVF_CTRL 0x00000390
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_OVF_CTRL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Set 1 to Clear Ovf_PMC0 bit. If CPUID.0AH: EAX[15:8] > n.
+ /// Clear bitmask. Only the first n-1 bits are valid.
+ /// Bits 31:n are reserved.
+ ///
+ UINT32 Ovf_PMCn:32;
+ ///
+ /// [Bits 54:32] Set 1 to Clear Ovf_FIXED_CTR0 bit.
+ /// If CPUID.0AH: EDX[4:0] > n.
+ /// Clear bitmask. Only the first n-1 bits are valid.
+ /// Bits 22:n are reserved.
+ ///
+ UINT32 Ovf_FIXED_CTRn:23;
+ ///
+ /// [Bit 55] Set 1 to Clear Trace_ToPA_PMI bit. If (CPUID.(EAX=07H,
+ /// ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA = 1.
+ ///
+ UINT32 Trace_ToPA_PMI:1;
+ UINT32 Reserved2:5;
+ ///
+ /// [Bit 61] Set 1 to Clear Ovf_Uncore bit. Introduced at Display Family /
+ /// Display Model 06_2EH.
+ ///
+ UINT32 Ovf_Uncore:1;
+ ///
+ /// [Bit 62] Set 1 to Clear OvfBuf: bit. If CPUID.0AH: EAX[7:0] > 0.
+ ///
+ UINT32 OvfBuf:1;
+ ///
+ /// [Bit 63] Set to 1to clear CondChgd: bit. If CPUID.0AH: EAX[7:0] > 0.
+ ///
+ UINT32 CondChgd:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER;
+
+
+/**
+ Global Performance Counter Overflow Reset Control (R/W). If CPUID.0AH:
+ EAX[7:0] > 3.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_STATUS_RESET (0x00000390)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_RESET);
+ AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_RESET, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_STATUS_RESET is defined as IA32_PERF_GLOBAL_STATUS_RESET in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_STATUS_RESET 0x00000390
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS_RESET
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Set 1 to Clear Ovf_PMC0 bit. If CPUID.0AH: EAX[15:8] > n.
+ /// Clear bitmask. Only the first n-1 bits are valid.
+ /// Bits 31:n are reserved.
+ ///
+ UINT32 Ovf_PMCn:32;
+ ///
+ /// [Bits 54:32] Set 1 to Clear Ovf_FIXED_CTR0 bit.
+ /// If CPUID.0AH: EDX[4:0] > n.
+ /// Clear bitmask. Only the first n-1 bits are valid.
+ /// Bits 22:n are reserved.
+ ///
+ UINT32 Ovf_FIXED_CTRn:23;
+ ///
+ /// [Bit 55] Set 1 to Clear Trace_ToPA_PMI bit. If (CPUID.(EAX=07H,
+ /// ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA[8] = 1.
+ ///
+ UINT32 Trace_ToPA_PMI:1;
+ UINT32 Reserved2:2;
+ ///
+ /// [Bit 58] Set 1 to Clear LBR_Frz bit. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 LBR_Frz:1;
+ ///
+ /// [Bit 59] Set 1 to Clear CTR_Frz bit. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 CTR_Frz:1;
+ ///
+ /// [Bit 60] Set 1 to Clear ASCI bit. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 ASCI:1;
+ ///
+ /// [Bit 61] Set 1 to Clear Ovf_Uncore bit. Introduced at Display Family /
+ /// Display Model 06_2EH.
+ ///
+ UINT32 Ovf_Uncore:1;
+ ///
+ /// [Bit 62] Set 1 to Clear OvfBuf: bit. If CPUID.0AH: EAX[7:0] > 0.
+ ///
+ UINT32 OvfBuf:1;
+ ///
+ /// [Bit 63] Set to 1to clear CondChgd: bit. If CPUID.0AH: EAX[7:0] > 0.
+ ///
+ UINT32 CondChgd:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER;
+
+
+/**
+ Global Performance Counter Overflow Set Control (R/W). If CPUID.0AH:
+ EAX[7:0] > 3.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_STATUS_SET (0x00000391)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_SET);
+ AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_SET, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_STATUS_SET is defined as IA32_PERF_GLOBAL_STATUS_SET in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_STATUS_SET 0x00000391
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS_SET
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Set 1 to cause Ovf_PMCn = 1. If CPUID.0AH: EAX[7:0] > n.
+ /// Set bitmask. Only the first n-1 bits are valid.
+ /// Bits 31:n are reserved.
+ ///
+ UINT32 Ovf_PMCn:32;
+ ///
+ /// [Bits 54:32] Set 1 to cause Ovf_FIXED_CTRn = 1.
+ /// If CPUID.0AH: EAX[7:0] > n.
+ /// Set bitmask. Only the first n-1 bits are valid.
+ /// Bits 22:n are reserved.
+ ///
+ UINT32 Ovf_FIXED_CTRn:23;
+ ///
+ /// [Bit 55] Set 1 to cause Trace_ToPA_PMI = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 Trace_ToPA_PMI:1;
+ UINT32 Reserved2:2;
+ ///
+ /// [Bit 58] Set 1 to cause LBR_Frz = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 LBR_Frz:1;
+ ///
+ /// [Bit 59] Set 1 to cause CTR_Frz = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 CTR_Frz:1;
+ ///
+ /// [Bit 60] Set 1 to cause ASCI = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 ASCI:1;
+ ///
+ /// [Bit 61] Set 1 to cause Ovf_Uncore = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 Ovf_Uncore:1;
+ ///
+ /// [Bit 62] Set 1 to cause OvfBuf = 1. If CPUID.0AH: EAX[7:0] > 3.
+ ///
+ UINT32 OvfBuf:1;
+ UINT32 Reserved3:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER;
+
+
+/**
+ Indicator of core perfmon interface is in use (RO). If CPUID.0AH: EAX[7:0] >
+ 3.
+
+ @param ECX MSR_IA32_PERF_GLOBAL_INUSE (0x00000392)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_INUSE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PERF_GLOBAL_INUSE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PERF_GLOBAL_INUSE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_INUSE);
+ @endcode
+ @note MSR_IA32_PERF_GLOBAL_INUSE is defined as IA32_PERF_GLOBAL_INUSE in SDM.
+**/
+#define MSR_IA32_PERF_GLOBAL_INUSE 0x00000392
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_INUSE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] IA32_PERFEVTSELn in use. If CPUID.0AH: EAX[7:0] > n.
+ /// Status bitmask. Only the first n-1 bits are valid.
+ /// Bits 31:n are reserved.
+ ///
+ UINT32 IA32_PERFEVTSELn:32;
+ ///
+ /// [Bits 62:32] IA32_FIXED_CTRn in use.
+ /// If CPUID.0AH: EAX[7:0] > n.
+ /// Status bitmask. Only the first n-1 bits are valid.
+ /// Bits 30:n are reserved.
+ ///
+ UINT32 IA32_FIXED_CTRn:31;
+ ///
+ /// [Bit 63] PMI in use.
+ ///
+ UINT32 PMI:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PERF_GLOBAL_INUSE_REGISTER;
+
+
+/**
+ PEBS Control (R/W).
+
+ @param ECX MSR_IA32_PEBS_ENABLE (0x000003F1)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PEBS_ENABLE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PEBS_ENABLE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PEBS_ENABLE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PEBS_ENABLE);
+ AsmWriteMsr64 (MSR_IA32_PEBS_ENABLE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PEBS_ENABLE is defined as IA32_PEBS_ENABLE in SDM.
+**/
+#define MSR_IA32_PEBS_ENABLE 0x000003F1
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PEBS_ENABLE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Enable PEBS on IA32_PMC0. Introduced at Display Family /
+ /// Display Model 06_0FH.
+ ///
+ UINT32 Enable:1;
+ ///
+ /// [Bits 3:1] Reserved or Model specific.
+ ///
+ UINT32 Reserved1:3;
+ UINT32 Reserved2:28;
+ ///
+ /// [Bits 35:32] Reserved or Model specific.
+ ///
+ UINT32 Reserved3:4;
+ UINT32 Reserved4:28;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PEBS_ENABLE_REGISTER;
+
+
+/**
+ MCn_CTL. If IA32_MCG_CAP.CNT > n.
+
+ @param ECX MSR_IA32_MCn_CTL
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MC0_CTL);
+ AsmWriteMsr64 (MSR_IA32_MC0_CTL, Msr);
+ @endcode
+ @note MSR_IA32_MC0_CTL is defined as IA32_MC0_CTL in SDM.
+ MSR_IA32_MC1_CTL is defined as IA32_MC1_CTL in SDM.
+ MSR_IA32_MC2_CTL is defined as IA32_MC2_CTL in SDM.
+ MSR_IA32_MC3_CTL is defined as IA32_MC3_CTL in SDM.
+ MSR_IA32_MC4_CTL is defined as IA32_MC4_CTL in SDM.
+ MSR_IA32_MC5_CTL is defined as IA32_MC5_CTL in SDM.
+ MSR_IA32_MC6_CTL is defined as IA32_MC6_CTL in SDM.
+ MSR_IA32_MC7_CTL is defined as IA32_MC7_CTL in SDM.
+ MSR_IA32_MC8_CTL is defined as IA32_MC8_CTL in SDM.
+ MSR_IA32_MC9_CTL is defined as IA32_MC9_CTL in SDM.
+ MSR_IA32_MC10_CTL is defined as IA32_MC10_CTL in SDM.
+ MSR_IA32_MC11_CTL is defined as IA32_MC11_CTL in SDM.
+ MSR_IA32_MC12_CTL is defined as IA32_MC12_CTL in SDM.
+ MSR_IA32_MC13_CTL is defined as IA32_MC13_CTL in SDM.
+ MSR_IA32_MC14_CTL is defined as IA32_MC14_CTL in SDM.
+ MSR_IA32_MC15_CTL is defined as IA32_MC15_CTL in SDM.
+ MSR_IA32_MC16_CTL is defined as IA32_MC16_CTL in SDM.
+ MSR_IA32_MC17_CTL is defined as IA32_MC17_CTL in SDM.
+ MSR_IA32_MC18_CTL is defined as IA32_MC18_CTL in SDM.
+ MSR_IA32_MC19_CTL is defined as IA32_MC19_CTL in SDM.
+ MSR_IA32_MC20_CTL is defined as IA32_MC20_CTL in SDM.
+ MSR_IA32_MC21_CTL is defined as IA32_MC21_CTL in SDM.
+ MSR_IA32_MC22_CTL is defined as IA32_MC22_CTL in SDM.
+ MSR_IA32_MC23_CTL is defined as IA32_MC23_CTL in SDM.
+ MSR_IA32_MC24_CTL is defined as IA32_MC24_CTL in SDM.
+ MSR_IA32_MC25_CTL is defined as IA32_MC25_CTL in SDM.
+ MSR_IA32_MC26_CTL is defined as IA32_MC26_CTL in SDM.
+ MSR_IA32_MC27_CTL is defined as IA32_MC27_CTL in SDM.
+ MSR_IA32_MC28_CTL is defined as IA32_MC28_CTL in SDM.
+ @{
+**/
+#define MSR_IA32_MC0_CTL 0x00000400
+#define MSR_IA32_MC1_CTL 0x00000404
+#define MSR_IA32_MC2_CTL 0x00000408
+#define MSR_IA32_MC3_CTL 0x0000040C
+#define MSR_IA32_MC4_CTL 0x00000410
+#define MSR_IA32_MC5_CTL 0x00000414
+#define MSR_IA32_MC6_CTL 0x00000418
+#define MSR_IA32_MC7_CTL 0x0000041C
+#define MSR_IA32_MC8_CTL 0x00000420
+#define MSR_IA32_MC9_CTL 0x00000424
+#define MSR_IA32_MC10_CTL 0x00000428
+#define MSR_IA32_MC11_CTL 0x0000042C
+#define MSR_IA32_MC12_CTL 0x00000430
+#define MSR_IA32_MC13_CTL 0x00000434
+#define MSR_IA32_MC14_CTL 0x00000438
+#define MSR_IA32_MC15_CTL 0x0000043C
+#define MSR_IA32_MC16_CTL 0x00000440
+#define MSR_IA32_MC17_CTL 0x00000444
+#define MSR_IA32_MC18_CTL 0x00000448
+#define MSR_IA32_MC19_CTL 0x0000044C
+#define MSR_IA32_MC20_CTL 0x00000450
+#define MSR_IA32_MC21_CTL 0x00000454
+#define MSR_IA32_MC22_CTL 0x00000458
+#define MSR_IA32_MC23_CTL 0x0000045C
+#define MSR_IA32_MC24_CTL 0x00000460
+#define MSR_IA32_MC25_CTL 0x00000464
+#define MSR_IA32_MC26_CTL 0x00000468
+#define MSR_IA32_MC27_CTL 0x0000046C
+#define MSR_IA32_MC28_CTL 0x00000470
+/// @}
+
+
+/**
+ MCn_STATUS. If IA32_MCG_CAP.CNT > n.
+
+ @param ECX MSR_IA32_MCn_STATUS
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MC0_STATUS);
+ AsmWriteMsr64 (MSR_IA32_MC0_STATUS, Msr);
+ @endcode
+ @note MSR_IA32_MC0_STATUS is defined as IA32_MC0_STATUS in SDM.
+ MSR_IA32_MC1_STATUS is defined as IA32_MC1_STATUS in SDM.
+ MSR_IA32_MC2_STATUS is defined as IA32_MC2_STATUS in SDM.
+ MSR_IA32_MC3_STATUS is defined as IA32_MC3_STATUS in SDM.
+ MSR_IA32_MC4_STATUS is defined as IA32_MC4_STATUS in SDM.
+ MSR_IA32_MC5_STATUS is defined as IA32_MC5_STATUS in SDM.
+ MSR_IA32_MC6_STATUS is defined as IA32_MC6_STATUS in SDM.
+ MSR_IA32_MC7_STATUS is defined as IA32_MC7_STATUS in SDM.
+ MSR_IA32_MC8_STATUS is defined as IA32_MC8_STATUS in SDM.
+ MSR_IA32_MC9_STATUS is defined as IA32_MC9_STATUS in SDM.
+ MSR_IA32_MC10_STATUS is defined as IA32_MC10_STATUS in SDM.
+ MSR_IA32_MC11_STATUS is defined as IA32_MC11_STATUS in SDM.
+ MSR_IA32_MC12_STATUS is defined as IA32_MC12_STATUS in SDM.
+ MSR_IA32_MC13_STATUS is defined as IA32_MC13_STATUS in SDM.
+ MSR_IA32_MC14_STATUS is defined as IA32_MC14_STATUS in SDM.
+ MSR_IA32_MC15_STATUS is defined as IA32_MC15_STATUS in SDM.
+ MSR_IA32_MC16_STATUS is defined as IA32_MC16_STATUS in SDM.
+ MSR_IA32_MC17_STATUS is defined as IA32_MC17_STATUS in SDM.
+ MSR_IA32_MC18_STATUS is defined as IA32_MC18_STATUS in SDM.
+ MSR_IA32_MC19_STATUS is defined as IA32_MC19_STATUS in SDM.
+ MSR_IA32_MC20_STATUS is defined as IA32_MC20_STATUS in SDM.
+ MSR_IA32_MC21_STATUS is defined as IA32_MC21_STATUS in SDM.
+ MSR_IA32_MC22_STATUS is defined as IA32_MC22_STATUS in SDM.
+ MSR_IA32_MC23_STATUS is defined as IA32_MC23_STATUS in SDM.
+ MSR_IA32_MC24_STATUS is defined as IA32_MC24_STATUS in SDM.
+ MSR_IA32_MC25_STATUS is defined as IA32_MC25_STATUS in SDM.
+ MSR_IA32_MC26_STATUS is defined as IA32_MC26_STATUS in SDM.
+ MSR_IA32_MC27_STATUS is defined as IA32_MC27_STATUS in SDM.
+ MSR_IA32_MC28_STATUS is defined as IA32_MC28_STATUS in SDM.
+ @{
+**/
+#define MSR_IA32_MC0_STATUS 0x00000401
+#define MSR_IA32_MC1_STATUS 0x00000405
+#define MSR_IA32_MC2_STATUS 0x00000409
+#define MSR_IA32_MC3_STATUS 0x0000040D
+#define MSR_IA32_MC4_STATUS 0x00000411
+#define MSR_IA32_MC5_STATUS 0x00000415
+#define MSR_IA32_MC6_STATUS 0x00000419
+#define MSR_IA32_MC7_STATUS 0x0000041D
+#define MSR_IA32_MC8_STATUS 0x00000421
+#define MSR_IA32_MC9_STATUS 0x00000425
+#define MSR_IA32_MC10_STATUS 0x00000429
+#define MSR_IA32_MC11_STATUS 0x0000042D
+#define MSR_IA32_MC12_STATUS 0x00000431
+#define MSR_IA32_MC13_STATUS 0x00000435
+#define MSR_IA32_MC14_STATUS 0x00000439
+#define MSR_IA32_MC15_STATUS 0x0000043D
+#define MSR_IA32_MC16_STATUS 0x00000441
+#define MSR_IA32_MC17_STATUS 0x00000445
+#define MSR_IA32_MC18_STATUS 0x00000449
+#define MSR_IA32_MC19_STATUS 0x0000044D
+#define MSR_IA32_MC20_STATUS 0x00000451
+#define MSR_IA32_MC21_STATUS 0x00000455
+#define MSR_IA32_MC22_STATUS 0x00000459
+#define MSR_IA32_MC23_STATUS 0x0000045D
+#define MSR_IA32_MC24_STATUS 0x00000461
+#define MSR_IA32_MC25_STATUS 0x00000465
+#define MSR_IA32_MC26_STATUS 0x00000469
+#define MSR_IA32_MC27_STATUS 0x0000046D
+#define MSR_IA32_MC28_STATUS 0x00000471
+/// @}
+
+
+/**
+ MCn_ADDR. If IA32_MCG_CAP.CNT > n.
+
+ @param ECX MSR_IA32_MCn_ADDR
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MC0_ADDR);
+ AsmWriteMsr64 (MSR_IA32_MC0_ADDR, Msr);
+ @endcode
+ @note MSR_IA32_MC0_ADDR is defined as IA32_MC0_ADDR in SDM.
+ MSR_IA32_MC1_ADDR is defined as IA32_MC1_ADDR in SDM.
+ MSR_IA32_MC2_ADDR is defined as IA32_MC2_ADDR in SDM.
+ MSR_IA32_MC3_ADDR is defined as IA32_MC3_ADDR in SDM.
+ MSR_IA32_MC4_ADDR is defined as IA32_MC4_ADDR in SDM.
+ MSR_IA32_MC5_ADDR is defined as IA32_MC5_ADDR in SDM.
+ MSR_IA32_MC6_ADDR is defined as IA32_MC6_ADDR in SDM.
+ MSR_IA32_MC7_ADDR is defined as IA32_MC7_ADDR in SDM.
+ MSR_IA32_MC8_ADDR is defined as IA32_MC8_ADDR in SDM.
+ MSR_IA32_MC9_ADDR is defined as IA32_MC9_ADDR in SDM.
+ MSR_IA32_MC10_ADDR is defined as IA32_MC10_ADDR in SDM.
+ MSR_IA32_MC11_ADDR is defined as IA32_MC11_ADDR in SDM.
+ MSR_IA32_MC12_ADDR is defined as IA32_MC12_ADDR in SDM.
+ MSR_IA32_MC13_ADDR is defined as IA32_MC13_ADDR in SDM.
+ MSR_IA32_MC14_ADDR is defined as IA32_MC14_ADDR in SDM.
+ MSR_IA32_MC15_ADDR is defined as IA32_MC15_ADDR in SDM.
+ MSR_IA32_MC16_ADDR is defined as IA32_MC16_ADDR in SDM.
+ MSR_IA32_MC17_ADDR is defined as IA32_MC17_ADDR in SDM.
+ MSR_IA32_MC18_ADDR is defined as IA32_MC18_ADDR in SDM.
+ MSR_IA32_MC19_ADDR is defined as IA32_MC19_ADDR in SDM.
+ MSR_IA32_MC20_ADDR is defined as IA32_MC20_ADDR in SDM.
+ MSR_IA32_MC21_ADDR is defined as IA32_MC21_ADDR in SDM.
+ MSR_IA32_MC22_ADDR is defined as IA32_MC22_ADDR in SDM.
+ MSR_IA32_MC23_ADDR is defined as IA32_MC23_ADDR in SDM.
+ MSR_IA32_MC24_ADDR is defined as IA32_MC24_ADDR in SDM.
+ MSR_IA32_MC25_ADDR is defined as IA32_MC25_ADDR in SDM.
+ MSR_IA32_MC26_ADDR is defined as IA32_MC26_ADDR in SDM.
+ MSR_IA32_MC27_ADDR is defined as IA32_MC27_ADDR in SDM.
+ MSR_IA32_MC28_ADDR is defined as IA32_MC28_ADDR in SDM.
+ @{
+**/
+#define MSR_IA32_MC0_ADDR 0x00000402
+#define MSR_IA32_MC1_ADDR 0x00000406
+#define MSR_IA32_MC2_ADDR 0x0000040A
+#define MSR_IA32_MC3_ADDR 0x0000040E
+#define MSR_IA32_MC4_ADDR 0x00000412
+#define MSR_IA32_MC5_ADDR 0x00000416
+#define MSR_IA32_MC6_ADDR 0x0000041A
+#define MSR_IA32_MC7_ADDR 0x0000041E
+#define MSR_IA32_MC8_ADDR 0x00000422
+#define MSR_IA32_MC9_ADDR 0x00000426
+#define MSR_IA32_MC10_ADDR 0x0000042A
+#define MSR_IA32_MC11_ADDR 0x0000042E
+#define MSR_IA32_MC12_ADDR 0x00000432
+#define MSR_IA32_MC13_ADDR 0x00000436
+#define MSR_IA32_MC14_ADDR 0x0000043A
+#define MSR_IA32_MC15_ADDR 0x0000043E
+#define MSR_IA32_MC16_ADDR 0x00000442
+#define MSR_IA32_MC17_ADDR 0x00000446
+#define MSR_IA32_MC18_ADDR 0x0000044A
+#define MSR_IA32_MC19_ADDR 0x0000044E
+#define MSR_IA32_MC20_ADDR 0x00000452
+#define MSR_IA32_MC21_ADDR 0x00000456
+#define MSR_IA32_MC22_ADDR 0x0000045A
+#define MSR_IA32_MC23_ADDR 0x0000045E
+#define MSR_IA32_MC24_ADDR 0x00000462
+#define MSR_IA32_MC25_ADDR 0x00000466
+#define MSR_IA32_MC26_ADDR 0x0000046A
+#define MSR_IA32_MC27_ADDR 0x0000046E
+#define MSR_IA32_MC28_ADDR 0x00000472
+/// @}
+
+
+/**
+ MCn_MISC. If IA32_MCG_CAP.CNT > n.
+
+ @param ECX MSR_IA32_MCn_MISC
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_MC0_MISC);
+ AsmWriteMsr64 (MSR_IA32_MC0_MISC, Msr);
+ @endcode
+ @note MSR_IA32_MC0_MISC is defined as IA32_MC0_MISC in SDM.
+ MSR_IA32_MC1_MISC is defined as IA32_MC1_MISC in SDM.
+ MSR_IA32_MC2_MISC is defined as IA32_MC2_MISC in SDM.
+ MSR_IA32_MC3_MISC is defined as IA32_MC3_MISC in SDM.
+ MSR_IA32_MC4_MISC is defined as IA32_MC4_MISC in SDM.
+ MSR_IA32_MC5_MISC is defined as IA32_MC5_MISC in SDM.
+ MSR_IA32_MC6_MISC is defined as IA32_MC6_MISC in SDM.
+ MSR_IA32_MC7_MISC is defined as IA32_MC7_MISC in SDM.
+ MSR_IA32_MC8_MISC is defined as IA32_MC8_MISC in SDM.
+ MSR_IA32_MC9_MISC is defined as IA32_MC9_MISC in SDM.
+ MSR_IA32_MC10_MISC is defined as IA32_MC10_MISC in SDM.
+ MSR_IA32_MC11_MISC is defined as IA32_MC11_MISC in SDM.
+ MSR_IA32_MC12_MISC is defined as IA32_MC12_MISC in SDM.
+ MSR_IA32_MC13_MISC is defined as IA32_MC13_MISC in SDM.
+ MSR_IA32_MC14_MISC is defined as IA32_MC14_MISC in SDM.
+ MSR_IA32_MC15_MISC is defined as IA32_MC15_MISC in SDM.
+ MSR_IA32_MC16_MISC is defined as IA32_MC16_MISC in SDM.
+ MSR_IA32_MC17_MISC is defined as IA32_MC17_MISC in SDM.
+ MSR_IA32_MC18_MISC is defined as IA32_MC18_MISC in SDM.
+ MSR_IA32_MC19_MISC is defined as IA32_MC19_MISC in SDM.
+ MSR_IA32_MC20_MISC is defined as IA32_MC20_MISC in SDM.
+ MSR_IA32_MC21_MISC is defined as IA32_MC21_MISC in SDM.
+ MSR_IA32_MC22_MISC is defined as IA32_MC22_MISC in SDM.
+ MSR_IA32_MC23_MISC is defined as IA32_MC23_MISC in SDM.
+ MSR_IA32_MC24_MISC is defined as IA32_MC24_MISC in SDM.
+ MSR_IA32_MC25_MISC is defined as IA32_MC25_MISC in SDM.
+ MSR_IA32_MC26_MISC is defined as IA32_MC26_MISC in SDM.
+ MSR_IA32_MC27_MISC is defined as IA32_MC27_MISC in SDM.
+ MSR_IA32_MC28_MISC is defined as IA32_MC28_MISC in SDM.
+ @{
+**/
+#define MSR_IA32_MC0_MISC 0x00000403
+#define MSR_IA32_MC1_MISC 0x00000407
+#define MSR_IA32_MC2_MISC 0x0000040B
+#define MSR_IA32_MC3_MISC 0x0000040F
+#define MSR_IA32_MC4_MISC 0x00000413
+#define MSR_IA32_MC5_MISC 0x00000417
+#define MSR_IA32_MC6_MISC 0x0000041B
+#define MSR_IA32_MC7_MISC 0x0000041F
+#define MSR_IA32_MC8_MISC 0x00000423
+#define MSR_IA32_MC9_MISC 0x00000427
+#define MSR_IA32_MC10_MISC 0x0000042B
+#define MSR_IA32_MC11_MISC 0x0000042F
+#define MSR_IA32_MC12_MISC 0x00000433
+#define MSR_IA32_MC13_MISC 0x00000437
+#define MSR_IA32_MC14_MISC 0x0000043B
+#define MSR_IA32_MC15_MISC 0x0000043F
+#define MSR_IA32_MC16_MISC 0x00000443
+#define MSR_IA32_MC17_MISC 0x00000447
+#define MSR_IA32_MC18_MISC 0x0000044B
+#define MSR_IA32_MC19_MISC 0x0000044F
+#define MSR_IA32_MC20_MISC 0x00000453
+#define MSR_IA32_MC21_MISC 0x00000457
+#define MSR_IA32_MC22_MISC 0x0000045B
+#define MSR_IA32_MC23_MISC 0x0000045F
+#define MSR_IA32_MC24_MISC 0x00000463
+#define MSR_IA32_MC25_MISC 0x00000467
+#define MSR_IA32_MC26_MISC 0x0000046B
+#define MSR_IA32_MC27_MISC 0x0000046F
+#define MSR_IA32_MC28_MISC 0x00000473
+/// @}
+
+
+/**
+ Reporting Register of Basic VMX Capabilities (R/O) See Appendix A.1, "Basic
+ VMX Information.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_BASIC (0x00000480)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_VMX_BASIC_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_VMX_BASIC);
+ @endcode
+ @note MSR_IA32_VMX_BASIC is defined as IA32_VMX_BASIC in SDM.
+**/
+#define MSR_IA32_VMX_BASIC 0x00000480
+
+/**
+ MSR information returned for MSR index #MSR_IA32_VMX_BASIC
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 30:0] VMCS revision identifier used by the processor. Processors
+ /// that use the same VMCS revision identifier use the same size for VMCS
+ /// regions (see subsequent item on bits 44:32).
+ ///
+ /// @note Earlier versions of this manual specified that the VMCS revision
+ /// identifier was a 32-bit field in bits 31:0 of this MSR. For all
+ /// processors produced prior to this change, bit 31 of this MSR was read
+ /// as 0.
+ ///
+ UINT32 VmcsRevisonId:31;
+ UINT32 MustBeZero:1;
+ ///
+ /// [Bit 44:32] Reports the number of bytes that software should allocate
+ /// for the VMXON region and any VMCS region. It is a value greater than
+ /// 0 and at most 4096(bit 44 is set if and only if bits 43:32 are clear).
+ ///
+ UINT32 VmcsSize:13;
+ UINT32 Reserved1:3;
+ ///
+ /// [Bit 48] Indicates the width of the physical addresses that may be used
+ /// for the VMXON region, each VMCS, and data structures referenced by
+ /// pointers in a VMCS (I/O bitmaps, virtual-APIC page, MSR areas for VMX
+ /// transitions). If the bit is 0, these addresses are limited to the
+ /// processor's physical-address width. If the bit is 1, these addresses
+ /// are limited to 32 bits. This bit is always 0 for processors that
+ /// support Intel 64 architecture.
+ ///
+ /// @note On processors that support Intel 64 architecture, the pointer
+ /// must not set bits beyond the processor's physical address width.
+ ///
+ UINT32 VmcsAddressWidth:1;
+ ///
+ /// [Bit 49] If bit 49 is read as 1, the logical processor supports the
+ /// dual-monitor treatment of system-management interrupts and
+ /// system-management mode. See Section 34.15 for details of this treatment.
+ ///
+ UINT32 DualMonitor:1;
+ ///
+ /// [Bit 53:50] report the memory type that should be used for the VMCS,
+ /// for data structures referenced by pointers in the VMCS (I/O bitmaps,
+ /// virtual-APIC page, MSR areas for VMX transitions), and for the MSEG
+ /// header. If software needs to access these data structures (e.g., to
+ /// modify the contents of the MSR bitmaps), it can configure the paging
+ /// structures to map them into the linear-address space. If it does so,
+ /// it should establish mappings that use the memory type reported bits
+ /// 53:50 in this MSR.
+ ///
+ /// As of this writing, all processors that support VMX operation indicate
+ /// the write-back type.
+ ///
+ /// If software needs to access these data structures (e.g., to modify
+ /// the contents of the MSR bitmaps), it can configure the paging
+ /// structures to map them into the linear-address space. If it does so,
+ /// it should establish mappings that use the memory type reported in this
+ /// MSR.
+ ///
+ /// @note Alternatively, software may map any of these regions or
+ /// structures with the UC memory type. (This may be necessary for the MSEG
+ /// header.) Doing so is discouraged unless necessary as it will cause the
+ /// performance of software accesses to those structures to suffer.
+ ///
+ ///
+ UINT32 MemoryType:4;
+ ///
+ /// [Bit 54] If bit 54 is read as 1, the processor reports information in
+ /// the VM-exit instruction-information field on VM exitsdue to execution
+ /// of the INS and OUTS instructions (see Section 27.2.4). This reporting
+ /// is done only if this bit is read as 1.
+ ///
+ UINT32 InsOutsReporting:1;
+ ///
+ /// [Bit 55] Bit 55 is read as 1 if any VMX controls that default to 1 may
+ /// be cleared to 0. See Appendix A.2 for details. It also reports support
+ /// for the VMX capability MSRs IA32_VMX_TRUE_PINBASED_CTLS,
+ /// IA32_VMX_TRUE_PROCBASED_CTLS, IA32_VMX_TRUE_EXIT_CTLS, and
+ /// IA32_VMX_TRUE_ENTRY_CTLS. See Appendix A.3.1, Appendix A.3.2,
+ /// Appendix A.4, and Appendix A.5 for details.
+ ///
+ UINT32 VmxControls:1;
+ UINT32 Reserved2:8;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_VMX_BASIC_REGISTER;
+
+///
+/// @{ Define value for bit field MSR_IA32_VMX_BASIC_REGISTER.MemoryType
+///
+#define MSR_IA32_VMX_BASIC_REGISTER_MEMORY_TYPE_UNCACHEABLE 0x00
+#define MSR_IA32_VMX_BASIC_REGISTER_MEMORY_TYPE_WRITE_BACK 0x06
+///
+/// @}
+///
+
+
+/**
+ Capability Reporting Register of Pinbased VM-execution Controls (R/O) See
+ Appendix A.3.1, "Pin-Based VMExecution Controls.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_PINBASED_CTLS (0x00000481)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_PINBASED_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_PINBASED_CTLS is defined as IA32_VMX_PINBASED_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_PINBASED_CTLS 0x00000481
+
+
+/**
+ Capability Reporting Register of Primary Processor-based VM-execution
+ Controls (R/O) See Appendix A.3.2, "Primary Processor- Based VM-Execution
+ Controls.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_PROCBASED_CTLS (0x00000482)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_PROCBASED_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_PROCBASED_CTLS is defined as IA32_VMX_PROCBASED_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_PROCBASED_CTLS 0x00000482
+
+
+/**
+ Capability Reporting Register of VM-exit Controls (R/O) See Appendix A.4,
+ "VM-Exit Controls.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_EXIT_CTLS (0x00000483)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_EXIT_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_EXIT_CTLS is defined as IA32_VMX_EXIT_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_EXIT_CTLS 0x00000483
+
+
+/**
+ Capability Reporting Register of VMentry Controls (R/O) See Appendix A.5,
+ "VM-Entry Controls.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_ENTRY_CTLS (0x00000484)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_ENTRY_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_ENTRY_CTLS is defined as IA32_VMX_ENTRY_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_ENTRY_CTLS 0x00000484
+
+
+/**
+ Reporting Register of Miscellaneous VMX Capabilities (R/O) See Appendix A.6,
+ "Miscellaneous Data.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_MISC (0x00000485)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ IA32_VMX_MISC_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_VMX_MISC);
+ @endcode
+ @note MSR_IA32_VMX_MISC is defined as IA32_VMX_MISC in SDM.
+**/
+#define MSR_IA32_VMX_MISC 0x00000485
+
+/**
+ MSR information returned for MSR index #IA32_VMX_MISC
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 4:0] Reports a value X that specifies the relationship between the
+ /// rate of the VMX-preemption timer and that of the timestamp counter (TSC).
+ /// Specifically, the VMX-preemption timer (if it is active) counts down by
+ /// 1 every time bit X in the TSC changes due to a TSC increment.
+ ///
+ UINT32 VmxTimerRatio:5;
+ ///
+ /// [Bit 5] If bit 5 is read as 1, VM exits store the value of IA32_EFER.LMA
+ /// into the "IA-32e mode guest" VM-entry control;see Section 27.2 for more
+ /// details. This bit is read as 1 on any logical processor that supports
+ /// the 1-setting of the "unrestricted guest" VM-execution control.
+ ///
+ UINT32 VmExitEferLma:1;
+ ///
+ /// [Bit 6] reports (if set) the support for activity state 1 (HLT).
+ ///
+ UINT32 HltActivityStateSupported:1;
+ ///
+ /// [Bit 7] reports (if set) the support for activity state 2 (shutdown).
+ ///
+ UINT32 ShutdownActivityStateSupported:1;
+ ///
+ /// [Bit 8] reports (if set) the support for activity state 3 (wait-for-SIPI).
+ ///
+ UINT32 WaitForSipiActivityStateSupported:1;
+ UINT32 Reserved1:5;
+ ///
+ /// [Bit 14] If read as 1, Intel(R) Processor Trace (Intel PT) can be used
+ /// in VMX operation. If the processor supports Intel PT but does not allow
+ /// it to be used in VMX operation, execution of VMXON clears
+ /// IA32_RTIT_CTL.TraceEn (see "VMXON-Enter VMX Operation" in Chapter 30);
+ /// any attempt to set that bit while in VMX operation (including VMX root
+ /// operation) using the WRMSR instruction causes a general-protection
+ /// exception.
+ ///
+ UINT32 ProcessorTraceSupported:1;
+ ///
+ /// [Bit 15] If read as 1, the RDMSR instruction can be used in system-
+ /// management mode (SMM) to read the IA32_SMBASE MSR (MSR address 9EH).
+ /// See Section 34.15.6.3.
+ ///
+ UINT32 SmBaseMsrSupported:1;
+ ///
+ /// [Bits 24:16] Indicate the number of CR3-target values supported by the
+ /// processor. This number is a value between 0 and 256, inclusive (bit 24
+ /// is set if and only if bits 23:16 are clear).
+ ///
+ UINT32 NumberOfCr3TargetValues:9;
+ ///
+ /// [Bit 27:25] Bits 27:25 is used to compute the recommended maximum
+ /// number of MSRs that should appear in the VM-exit MSR-store list, the
+ /// VM-exit MSR-load list, or the VM-entry MSR-load list. Specifically, if
+ /// the value bits 27:25 of IA32_VMX_MISC is N, then 512 * (N + 1) is the
+ /// recommended maximum number of MSRs to be included in each list. If the
+ /// limit is exceeded, undefined processor behavior may result (including a
+ /// machine check during the VMX transition).
+ ///
+ UINT32 MsrStoreListMaximum:3;
+ ///
+ /// [Bit 28] If read as 1, bit 2 of the IA32_SMM_MONITOR_CTL can be set
+ /// to 1. VMXOFF unblocks SMIs unless IA32_SMM_MONITOR_CTL[bit 2] is 1
+ /// (see Section 34.14.4).
+ ///
+ UINT32 BlockSmiSupported:1;
+ ///
+ /// [Bit 29] read as 1, software can use VMWRITE to write to any supported
+ /// field in the VMCS; otherwise, VMWRITE cannot be used to modify VM-exit
+ /// information fields.
+ ///
+ UINT32 VmWriteSupported:1;
+ ///
+ /// [Bit 30] If read as 1, VM entry allows injection of a software
+ /// interrupt, software exception, or privileged software exception with an
+ /// instruction length of 0.
+ ///
+ UINT32 VmInjectSupported:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bits 63:32] Reports the 32-bit MSEG revision identifier used by the
+ /// processor.
+ ///
+ UINT32 MsegRevisionIdentifier:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} IA32_VMX_MISC_REGISTER;
+
+
+/**
+ Capability Reporting Register of CR0 Bits Fixed to 0 (R/O) See Appendix A.7,
+ "VMX-Fixed Bits in CR0.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_CR0_FIXED0 (0x00000486)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_CR0_FIXED0);
+ @endcode
+ @note MSR_IA32_VMX_CR0_FIXED0 is defined as IA32_VMX_CR0_FIXED0 in SDM.
+**/
+#define MSR_IA32_VMX_CR0_FIXED0 0x00000486
+
+
+/**
+ Capability Reporting Register of CR0 Bits Fixed to 1 (R/O) See Appendix A.7,
+ "VMX-Fixed Bits in CR0.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_CR0_FIXED1 (0x00000487)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_CR0_FIXED1);
+ @endcode
+ @note MSR_IA32_VMX_CR0_FIXED1 is defined as IA32_VMX_CR0_FIXED1 in SDM.
+**/
+#define MSR_IA32_VMX_CR0_FIXED1 0x00000487
+
+
+/**
+ Capability Reporting Register of CR4 Bits Fixed to 0 (R/O) See Appendix A.8,
+ "VMX-Fixed Bits in CR4.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_CR4_FIXED0 (0x00000488)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_CR4_FIXED0);
+ @endcode
+ @note MSR_IA32_VMX_CR4_FIXED0 is defined as IA32_VMX_CR4_FIXED0 in SDM.
+**/
+#define MSR_IA32_VMX_CR4_FIXED0 0x00000488
+
+
+/**
+ Capability Reporting Register of CR4 Bits Fixed to 1 (R/O) See Appendix A.8,
+ "VMX-Fixed Bits in CR4.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_CR4_FIXED1 (0x00000489)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_CR4_FIXED1);
+ @endcode
+ @note MSR_IA32_VMX_CR4_FIXED1 is defined as IA32_VMX_CR4_FIXED1 in SDM.
+**/
+#define MSR_IA32_VMX_CR4_FIXED1 0x00000489
+
+
+/**
+ Capability Reporting Register of VMCS Field Enumeration (R/O) See Appendix
+ A.9, "VMCS Enumeration.". If CPUID.01H:ECX.[5] = 1.
+
+ @param ECX MSR_IA32_VMX_VMCS_ENUM (0x0000048A)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_VMCS_ENUM);
+ @endcode
+ @note MSR_IA32_VMX_VMCS_ENUM is defined as IA32_VMX_VMCS_ENUM in SDM.
+**/
+#define MSR_IA32_VMX_VMCS_ENUM 0x0000048A
+
+
+/**
+ Capability Reporting Register of Secondary Processor-based VM-execution
+ Controls (R/O) See Appendix A.3.3, "Secondary Processor- Based VM-Execution
+ Controls.". If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_C TLS[63]).
+
+ @param ECX MSR_IA32_VMX_PROCBASED_CTLS2 (0x0000048B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_PROCBASED_CTLS2);
+ @endcode
+ @note MSR_IA32_VMX_PROCBASED_CTLS2 is defined as IA32_VMX_PROCBASED_CTLS2 in SDM.
+**/
+#define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048B
+
+
+/**
+ Capability Reporting Register of EPT and VPID (R/O) See Appendix A.10,
+ "VPID and EPT Capabilities.". If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_C
+ TLS[63] && ( IA32_VMX_PROCBASED_C TLS2[33] IA32_VMX_PROCBASED_C TLS2[37]) ).
+
+ @param ECX MSR_IA32_VMX_EPT_VPID_CAP (0x0000048C)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_EPT_VPID_CAP);
+ @endcode
+ @note MSR_IA32_VMX_EPT_VPID_CAP is defined as IA32_VMX_EPT_VPID_CAP in SDM.
+**/
+#define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048C
+
+
+/**
+ Capability Reporting Register of Pinbased VM-execution Flex Controls (R/O)
+ See Appendix A.3.1, "Pin-Based VMExecution Controls.". If (
+ CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
+
+ @param ECX MSR_IA32_VMX_TRUE_PINBASED_CTLS (0x0000048D)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_PINBASED_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_TRUE_PINBASED_CTLS is defined as IA32_VMX_TRUE_PINBASED_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_TRUE_PINBASED_CTLS 0x0000048D
+
+
+/**
+ Capability Reporting Register of Primary Processor-based VM-execution Flex
+ Controls (R/O) See Appendix A.3.2, "Primary Processor- Based VM-Execution
+ Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
+
+ @param ECX MSR_IA32_VMX_TRUE_PROCBASED_CTLS (0x0000048E)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_PROCBASED_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_TRUE_PROCBASED_CTLS is defined as IA32_VMX_TRUE_PROCBASED_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_TRUE_PROCBASED_CTLS 0x0000048E
+
+
+/**
+ Capability Reporting Register of VM-exit Flex Controls (R/O) See Appendix
+ A.4, "VM-Exit Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
+
+ @param ECX MSR_IA32_VMX_TRUE_EXIT_CTLS (0x0000048F)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_EXIT_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_TRUE_EXIT_CTLS is defined as IA32_VMX_TRUE_EXIT_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_TRUE_EXIT_CTLS 0x0000048F
+
+
+/**
+ Capability Reporting Register of VMentry Flex Controls (R/O) See Appendix
+ A.5, "VM-Entry Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
+
+ @param ECX MSR_IA32_VMX_TRUE_ENTRY_CTLS (0x00000490)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_ENTRY_CTLS);
+ @endcode
+ @note MSR_IA32_VMX_TRUE_ENTRY_CTLS is defined as IA32_VMX_TRUE_ENTRY_CTLS in SDM.
+**/
+#define MSR_IA32_VMX_TRUE_ENTRY_CTLS 0x00000490
+
+
+/**
+ Capability Reporting Register of VMfunction Controls (R/O). If(
+ CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
+
+ @param ECX MSR_IA32_VMX_VMFUNC (0x00000491)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_VMX_VMFUNC);
+ @endcode
+ @note MSR_IA32_VMX_VMFUNC is defined as IA32_VMX_VMFUNC in SDM.
+**/
+#define MSR_IA32_VMX_VMFUNC 0x00000491
+
+
+/**
+ Full Width Writable IA32_PMCn Alias (R/W). (If CPUID.0AH: EAX[15:8] > n) &&
+ IA32_PERF_CAPABILITIES[ 13] = 1.
+
+ @param ECX MSR_IA32_A_PMCn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_A_PMC0);
+ AsmWriteMsr64 (MSR_IA32_A_PMC0, Msr);
+ @endcode
+ @note MSR_IA32_A_PMC0 is defined as IA32_A_PMC0 in SDM.
+ MSR_IA32_A_PMC1 is defined as IA32_A_PMC1 in SDM.
+ MSR_IA32_A_PMC2 is defined as IA32_A_PMC2 in SDM.
+ MSR_IA32_A_PMC3 is defined as IA32_A_PMC3 in SDM.
+ MSR_IA32_A_PMC4 is defined as IA32_A_PMC4 in SDM.
+ MSR_IA32_A_PMC5 is defined as IA32_A_PMC5 in SDM.
+ MSR_IA32_A_PMC6 is defined as IA32_A_PMC6 in SDM.
+ MSR_IA32_A_PMC7 is defined as IA32_A_PMC7 in SDM.
+ @{
+**/
+#define MSR_IA32_A_PMC0 0x000004C1
+#define MSR_IA32_A_PMC1 0x000004C2
+#define MSR_IA32_A_PMC2 0x000004C3
+#define MSR_IA32_A_PMC3 0x000004C4
+#define MSR_IA32_A_PMC4 0x000004C5
+#define MSR_IA32_A_PMC5 0x000004C6
+#define MSR_IA32_A_PMC6 0x000004C7
+#define MSR_IA32_A_PMC7 0x000004C8
+/// @}
+
+
+/**
+ (R/W). If IA32_MCG_CAP.LMCE_P =1.
+
+ @param ECX MSR_IA32_MCG_EXT_CTL (0x000004D0)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_EXT_CTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_MCG_EXT_CTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_MCG_EXT_CTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_EXT_CTL);
+ AsmWriteMsr64 (MSR_IA32_MCG_EXT_CTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_MCG_EXT_CTL is defined as IA32_MCG_EXT_CTL in SDM.
+**/
+#define MSR_IA32_MCG_EXT_CTL 0x000004D0
+
+/**
+ MSR information returned for MSR index #MSR_IA32_MCG_EXT_CTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] LMCE_EN.
+ ///
+ UINT32 LMCE_EN:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_MCG_EXT_CTL_REGISTER;
+
+
+/**
+ Status and SVN Threshold of SGX Support for ACM (RO). If CPUID.(EAX=07H,
+ ECX=0H): EBX[2] = 1.
+
+ @param ECX MSR_IA32_SGX_SVN_STATUS (0x00000500)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_SGX_SVN_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_SGX_SVN_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_SGX_SVN_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SGX_SVN_STATUS);
+ @endcode
+ @note MSR_IA32_SGX_SVN_STATUS is defined as IA32_SGX_SVN_STATUS in SDM.
+**/
+#define MSR_IA32_SGX_SVN_STATUS 0x00000500
+
+/**
+ MSR information returned for MSR index #MSR_IA32_SGX_SVN_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Lock. See Section 41.11.3, "Interactions with Authenticated
+ /// Code Modules (ACMs)".
+ ///
+ UINT32 Lock:1;
+ UINT32 Reserved1:15;
+ ///
+ /// [Bits 23:16] SGX_SVN_SINIT. See Section 41.11.3, "Interactions with
+ /// Authenticated Code Modules (ACMs)".
+ ///
+ UINT32 SGX_SVN_SINIT:8;
+ UINT32 Reserved2:8;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_SGX_SVN_STATUS_REGISTER;
+
+
+/**
+ Trace Output Base Register (R/W). If ((CPUID.(EAX=07H, ECX=0):EBX[25] = 1)
+ && ( (CPUID.(EAX=14H,ECX=0): ECX[0] = 1) (CPUID.(EAX=14H,ECX=0): ECX[2] = 1)
+ ) ).
+
+ @param ECX MSR_IA32_RTIT_OUTPUT_BASE (0x00000560)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_OUTPUT_BASE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_OUTPUT_BASE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_OUTPUT_BASE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_BASE);
+ AsmWriteMsr64 (MSR_IA32_RTIT_OUTPUT_BASE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_OUTPUT_BASE is defined as IA32_RTIT_OUTPUT_BASE in SDM.
+**/
+#define MSR_IA32_RTIT_OUTPUT_BASE 0x00000560
+
+/**
+ MSR information returned for MSR index #MSR_IA32_RTIT_OUTPUT_BASE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved:7;
+ ///
+ /// [Bits 31:7] Base physical address.
+ ///
+ UINT32 Base:25;
+ ///
+ /// [Bits 63:32] Base physical address.
+ ///
+ UINT32 BaseHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_OUTPUT_BASE_REGISTER;
+
+
+/**
+ Trace Output Mask Pointers Register (R/W). If ((CPUID.(EAX=07H,
+ ECX=0):EBX[25] = 1) && ( (CPUID.(EAX=14H,ECX=0): ECX[0] = 1)
+ (CPUID.(EAX=14H,ECX=0): ECX[2] = 1) ) ).
+
+ @param ECX MSR_IA32_RTIT_OUTPUT_MASK_PTRS (0x00000561)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS);
+ AsmWriteMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_OUTPUT_MASK_PTRS is defined as IA32_RTIT_OUTPUT_MASK_PTRS in SDM.
+**/
+#define MSR_IA32_RTIT_OUTPUT_MASK_PTRS 0x00000561
+
+/**
+ MSR information returned for MSR index #MSR_IA32_RTIT_OUTPUT_MASK_PTRS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved:7;
+ ///
+ /// [Bits 31:7] MaskOrTableOffset.
+ ///
+ UINT32 MaskOrTableOffset:25;
+ ///
+ /// [Bits 63:32] Output Offset.
+ ///
+ UINT32 OutputOffset:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER;
+
+/**
+ Format of ToPA table entries.
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] END. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 END:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 2] INT. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 INT:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bit 4] STOP. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 STOP:1;
+ UINT32 Reserved3:1;
+ ///
+ /// [Bit 6:9] Indicates the size of the associated output region. See Section
+ /// 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 Size:4;
+ UINT32 Reserved4:2;
+ ///
+ /// [Bit 12:31] Output Region Base Physical Address low part.
+ /// [Bit 12:31] Output Region Base Physical Address [12:63] value to match.
+ /// ATTENTION: The size of the address field is determined by the processor's
+ /// physical-address width (MAXPHYADDR) in bits, as reported in
+ /// CPUID.80000008H:EAX[7:0]. the above part of address reserved.
+ /// True address field is [12:MAXPHYADDR-1], [MAXPHYADDR:63] is reserved part.
+ /// Detail see Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 Base:20;
+ ///
+ /// [Bit 32:63] Output Region Base Physical Address high part.
+ /// [Bit 32:63] Output Region Base Physical Address [12:63] value to match.
+ /// ATTENTION: The size of the address field is determined by the processor's
+ /// physical-address width (MAXPHYADDR) in bits, as reported in
+ /// CPUID.80000008H:EAX[7:0]. the above part of address reserved.
+ /// True address field is [12:MAXPHYADDR-1], [MAXPHYADDR:63] is reserved part.
+ /// Detail see Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
+ ///
+ UINT32 BaseHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} RTIT_TOPA_TABLE_ENTRY;
+
+///
+/// The size of the associated output region usd by Topa.
+///
+typedef enum {
+ RtitTopaMemorySize4K = 0,
+ RtitTopaMemorySize8K,
+ RtitTopaMemorySize16K,
+ RtitTopaMemorySize32K,
+ RtitTopaMemorySize64K,
+ RtitTopaMemorySize128K,
+ RtitTopaMemorySize256K,
+ RtitTopaMemorySize512K,
+ RtitTopaMemorySize1M,
+ RtitTopaMemorySize2M,
+ RtitTopaMemorySize4M,
+ RtitTopaMemorySize8M,
+ RtitTopaMemorySize16M,
+ RtitTopaMemorySize32M,
+ RtitTopaMemorySize64M,
+ RtitTopaMemorySize128M
+} RTIT_TOPA_MEMORY_SIZE;
+
+/**
+ Trace Control Register (R/W). If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
+
+ @param ECX MSR_IA32_RTIT_CTL (0x00000570)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_CTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_CTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_CTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_CTL);
+ AsmWriteMsr64 (MSR_IA32_RTIT_CTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_CTL is defined as IA32_RTIT_CTL in SDM.
+**/
+#define MSR_IA32_RTIT_CTL 0x00000570
+
+/**
+ MSR information returned for MSR index #MSR_IA32_RTIT_CTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] TraceEn.
+ ///
+ UINT32 TraceEn:1;
+ ///
+ /// [Bit 1] CYCEn. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
+ ///
+ UINT32 CYCEn:1;
+ ///
+ /// [Bit 2] OS.
+ ///
+ UINT32 OS:1;
+ ///
+ /// [Bit 3] User.
+ ///
+ UINT32 User:1;
+ ///
+ /// [Bit 4] PwrEvtEn.
+ ///
+ UINT32 PwrEvtEn:1;
+ ///
+ /// [Bit 5] FUPonPTW.
+ ///
+ UINT32 FUPonPTW:1;
+ ///
+ /// [Bit 6] FabricEn. If (CPUID.(EAX=07H, ECX=0):ECX[3] = 1).
+ ///
+ UINT32 FabricEn:1;
+ ///
+ /// [Bit 7] CR3 filter.
+ ///
+ UINT32 CR3:1;
+ ///
+ /// [Bit 8] ToPA.
+ ///
+ UINT32 ToPA:1;
+ ///
+ /// [Bit 9] MTCEn. If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1).
+ ///
+ UINT32 MTCEn:1;
+ ///
+ /// [Bit 10] TSCEn.
+ ///
+ UINT32 TSCEn:1;
+ ///
+ /// [Bit 11] DisRETC.
+ ///
+ UINT32 DisRETC:1;
+ ///
+ /// [Bit 12] PTWEn.
+ ///
+ UINT32 PTWEn:1;
+ ///
+ /// [Bit 13] BranchEn.
+ ///
+ UINT32 BranchEn:1;
+ ///
+ /// [Bits 17:14] MTCFreq. If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1).
+ ///
+ UINT32 MTCFreq:4;
+ UINT32 Reserved3:1;
+ ///
+ /// [Bits 22:19] CYCThresh. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
+ ///
+ UINT32 CYCThresh:4;
+ UINT32 Reserved4:1;
+ ///
+ /// [Bits 27:24] PSBFreq. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
+ ///
+ UINT32 PSBFreq:4;
+ UINT32 Reserved5:4;
+ ///
+ /// [Bits 35:32] ADDR0_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 0).
+ ///
+ UINT32 ADDR0_CFG:4;
+ ///
+ /// [Bits 39:36] ADDR1_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 1).
+ ///
+ UINT32 ADDR1_CFG:4;
+ ///
+ /// [Bits 43:40] ADDR2_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 2).
+ ///
+ UINT32 ADDR2_CFG:4;
+ ///
+ /// [Bits 47:44] ADDR3_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 3).
+ ///
+ UINT32 ADDR3_CFG:4;
+ UINT32 Reserved6:16;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_CTL_REGISTER;
+
+
+/**
+ Tracing Status Register (R/W). If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
+
+ @param ECX MSR_IA32_RTIT_STATUS (0x00000571)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_STATUS);
+ AsmWriteMsr64 (MSR_IA32_RTIT_STATUS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_STATUS is defined as IA32_RTIT_STATUS in SDM.
+**/
+#define MSR_IA32_RTIT_STATUS 0x00000571
+
+/**
+ MSR information returned for MSR index #MSR_IA32_RTIT_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] FilterEn, (writes ignored).
+ /// If (CPUID.(EAX=07H, ECX=0):EBX[2] = 1).
+ ///
+ UINT32 FilterEn:1;
+ ///
+ /// [Bit 1] ContexEn, (writes ignored).
+ ///
+ UINT32 ContexEn:1;
+ ///
+ /// [Bit 2] TriggerEn, (writes ignored).
+ ///
+ UINT32 TriggerEn:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 4] Error.
+ ///
+ UINT32 Error:1;
+ ///
+ /// [Bit 5] Stopped.
+ ///
+ UINT32 Stopped:1;
+ UINT32 Reserved2:26;
+ ///
+ /// [Bits 48:32] PacketByteCnt. If (CPUID.(EAX=07H, ECX=0):EBX[1] > 3).
+ ///
+ UINT32 PacketByteCnt:17;
+ UINT32 Reserved3:15;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_STATUS_REGISTER;
+
+
+/**
+ Trace Filter CR3 Match Register (R/W).
+ If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
+
+ @param ECX MSR_IA32_RTIT_CR3_MATCH (0x00000572)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_CR3_MATCH_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_CR3_MATCH_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_CR3_MATCH_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_CR3_MATCH);
+ AsmWriteMsr64 (MSR_IA32_RTIT_CR3_MATCH, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_CR3_MATCH is defined as IA32_RTIT_CR3_MATCH in SDM.
+**/
+#define MSR_IA32_RTIT_CR3_MATCH 0x00000572
+
+/**
+ MSR information returned for MSR index #MSR_IA32_RTIT_CR3_MATCH
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved:5;
+ ///
+ /// [Bits 31:5] CR3[63:5] value to match.
+ ///
+ UINT32 Cr3:27;
+ ///
+ /// [Bits 63:32] CR3[63:5] value to match.
+ ///
+ UINT32 Cr3Hi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_CR3_MATCH_REGISTER;
+
+
+/**
+ Region n Start Address (R/W). If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n).
+
+ @param ECX MSR_IA32_RTIT_ADDRn_A
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_ADDR_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_ADDR0_A);
+ AsmWriteMsr64 (MSR_IA32_RTIT_ADDR0_A, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_ADDR0_A is defined as IA32_RTIT_ADDR0_A in SDM.
+ MSR_IA32_RTIT_ADDR1_A is defined as IA32_RTIT_ADDR1_A in SDM.
+ MSR_IA32_RTIT_ADDR2_A is defined as IA32_RTIT_ADDR2_A in SDM.
+ MSR_IA32_RTIT_ADDR3_A is defined as IA32_RTIT_ADDR3_A in SDM.
+ @{
+**/
+#define MSR_IA32_RTIT_ADDR0_A 0x00000580
+#define MSR_IA32_RTIT_ADDR1_A 0x00000582
+#define MSR_IA32_RTIT_ADDR2_A 0x00000584
+#define MSR_IA32_RTIT_ADDR3_A 0x00000586
+/// @}
+
+
+/**
+ Region n End Address (R/W). If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n).
+
+ @param ECX MSR_IA32_RTIT_ADDRn_B
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_RTIT_ADDR_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_ADDR0_B);
+ AsmWriteMsr64 (MSR_IA32_RTIT_ADDR0_B, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_RTIT_ADDR0_B is defined as IA32_RTIT_ADDR0_B in SDM.
+ MSR_IA32_RTIT_ADDR1_B is defined as IA32_RTIT_ADDR1_B in SDM.
+ MSR_IA32_RTIT_ADDR2_B is defined as IA32_RTIT_ADDR2_B in SDM.
+ MSR_IA32_RTIT_ADDR3_B is defined as IA32_RTIT_ADDR3_B in SDM.
+ @{
+**/
+#define MSR_IA32_RTIT_ADDR0_B 0x00000581
+#define MSR_IA32_RTIT_ADDR1_B 0x00000583
+#define MSR_IA32_RTIT_ADDR2_B 0x00000585
+#define MSR_IA32_RTIT_ADDR3_B 0x00000587
+/// @}
+
+
+/**
+ MSR information returned for MSR indexes
+ #MSR_IA32_RTIT_ADDR0_A to #MSR_IA32_RTIT_ADDR3_A and
+ #MSR_IA32_RTIT_ADDR0_B to #MSR_IA32_RTIT_ADDR3_B
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Virtual Address.
+ ///
+ UINT32 VirtualAddress:32;
+ ///
+ /// [Bits 47:32] Virtual Address.
+ ///
+ UINT32 VirtualAddressHi:16;
+ ///
+ /// [Bits 63:48] SignExt_VA.
+ ///
+ UINT32 SignExt_VA:16;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_RTIT_ADDR_REGISTER;
+
+
+/**
+ DS Save Area (R/W) Points to the linear address of the first byte of the DS
+ buffer management area, which is used to manage the BTS and PEBS buffers.
+ See Section 18.6.3.4, "Debug Store (DS) Mechanism.". If(
+ CPUID.01H:EDX.DS[21] = 1. The linear address of the first byte of the DS
+ buffer management area, if IA-32e mode is active.
+
+ @param ECX MSR_IA32_DS_AREA (0x00000600)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_DS_AREA_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_DS_AREA_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_DS_AREA);
+ AsmWriteMsr64 (MSR_IA32_DS_AREA, Msr);
+ @endcode
+ @note MSR_IA32_DS_AREA is defined as IA32_DS_AREA in SDM.
+**/
+#define MSR_IA32_DS_AREA 0x00000600
+
+
+/**
+ TSC Target of Local APIC's TSC Deadline Mode (R/W). If CPUID.01H:ECX.[24] =
+ 1.
+
+ @param ECX MSR_IA32_TSC_DEADLINE (0x000006E0)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_TSC_DEADLINE);
+ AsmWriteMsr64 (MSR_IA32_TSC_DEADLINE, Msr);
+ @endcode
+ @note MSR_IA32_TSC_DEADLINE is defined as IA32_TSC_DEADLINE in SDM.
+**/
+#define MSR_IA32_TSC_DEADLINE 0x000006E0
+
+
+/**
+ Enable/disable HWP (R/W). If CPUID.06H:EAX.[7] = 1.
+
+ @param ECX MSR_IA32_PM_ENABLE (0x00000770)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PM_ENABLE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PM_ENABLE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PM_ENABLE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PM_ENABLE);
+ AsmWriteMsr64 (MSR_IA32_PM_ENABLE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PM_ENABLE is defined as IA32_PM_ENABLE in SDM.
+**/
+#define MSR_IA32_PM_ENABLE 0x00000770
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PM_ENABLE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] HWP_ENABLE (R/W1-Once). See Section 14.4.2, "Enabling HWP". If
+ /// CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 HWP_ENABLE:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PM_ENABLE_REGISTER;
+
+
+/**
+ HWP Performance Range Enumeration (RO). If CPUID.06H:EAX.[7] = 1.
+
+ @param ECX MSR_IA32_HWP_CAPABILITIES (0x00000771)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_CAPABILITIES_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_CAPABILITIES_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_HWP_CAPABILITIES_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_CAPABILITIES);
+ @endcode
+ @note MSR_IA32_HWP_CAPABILITIES is defined as IA32_HWP_CAPABILITIES in SDM.
+**/
+#define MSR_IA32_HWP_CAPABILITIES 0x00000771
+
+/**
+ MSR information returned for MSR index #MSR_IA32_HWP_CAPABILITIES
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Highest_Performance See Section 14.4.3, "HWP Performance
+ /// Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Highest_Performance:8;
+ ///
+ /// [Bits 15:8] Guaranteed_Performance See Section 14.4.3, "HWP
+ /// Performance Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Guaranteed_Performance:8;
+ ///
+ /// [Bits 23:16] Most_Efficient_Performance See Section 14.4.3, "HWP
+ /// Performance Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Most_Efficient_Performance:8;
+ ///
+ /// [Bits 31:24] Lowest_Performance See Section 14.4.3, "HWP Performance
+ /// Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Lowest_Performance:8;
+ UINT32 Reserved:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_HWP_CAPABILITIES_REGISTER;
+
+
+/**
+ Power Management Control Hints for All Logical Processors in a Package
+ (R/W). If CPUID.06H:EAX.[11] = 1.
+
+ @param ECX MSR_IA32_HWP_REQUEST_PKG (0x00000772)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_REQUEST_PKG_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_REQUEST_PKG_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_HWP_REQUEST_PKG_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_REQUEST_PKG);
+ AsmWriteMsr64 (MSR_IA32_HWP_REQUEST_PKG, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_HWP_REQUEST_PKG is defined as IA32_HWP_REQUEST_PKG in SDM.
+**/
+#define MSR_IA32_HWP_REQUEST_PKG 0x00000772
+
+/**
+ MSR information returned for MSR index #MSR_IA32_HWP_REQUEST_PKG
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Minimum_Performance See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[11] = 1.
+ ///
+ UINT32 Minimum_Performance:8;
+ ///
+ /// [Bits 15:8] Maximum_Performance See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[11] = 1.
+ ///
+ UINT32 Maximum_Performance:8;
+ ///
+ /// [Bits 23:16] Desired_Performance See Section 14.4.4, "Managing HWP".
+ /// If CPUID.06H:EAX.[11] = 1.
+ ///
+ UINT32 Desired_Performance:8;
+ ///
+ /// [Bits 31:24] Energy_Performance_Preference See Section 14.4.4,
+ /// "Managing HWP". If CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[10] = 1.
+ ///
+ UINT32 Energy_Performance_Preference:8;
+ ///
+ /// [Bits 41:32] Activity_Window See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[9] = 1.
+ ///
+ UINT32 Activity_Window:10;
+ UINT32 Reserved:22;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_HWP_REQUEST_PKG_REGISTER;
+
+
+/**
+ Control HWP Native Interrupts (R/W). If CPUID.06H:EAX.[8] = 1.
+
+ @param ECX MSR_IA32_HWP_INTERRUPT (0x00000773)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_INTERRUPT_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_INTERRUPT_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_HWP_INTERRUPT_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_INTERRUPT);
+ AsmWriteMsr64 (MSR_IA32_HWP_INTERRUPT, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_HWP_INTERRUPT is defined as IA32_HWP_INTERRUPT in SDM.
+**/
+#define MSR_IA32_HWP_INTERRUPT 0x00000773
+
+/**
+ MSR information returned for MSR index #MSR_IA32_HWP_INTERRUPT
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] EN_Guaranteed_Performance_Change. See Section 14.4.6, "HWP
+ /// Notifications". If CPUID.06H:EAX.[8] = 1.
+ ///
+ UINT32 EN_Guaranteed_Performance_Change:1;
+ ///
+ /// [Bit 1] EN_Excursion_Minimum. See Section 14.4.6, "HWP Notifications".
+ /// If CPUID.06H:EAX.[8] = 1.
+ ///
+ UINT32 EN_Excursion_Minimum:1;
+ UINT32 Reserved1:30;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_HWP_INTERRUPT_REGISTER;
+
+
+/**
+ Power Management Control Hints to a Logical Processor (R/W). If
+ CPUID.06H:EAX.[7] = 1.
+
+ @param ECX MSR_IA32_HWP_REQUEST (0x00000774)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_REQUEST_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_REQUEST_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_HWP_REQUEST_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_REQUEST);
+ AsmWriteMsr64 (MSR_IA32_HWP_REQUEST, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_HWP_REQUEST is defined as IA32_HWP_REQUEST in SDM.
+**/
+#define MSR_IA32_HWP_REQUEST 0x00000774
+
+/**
+ MSR information returned for MSR index #MSR_IA32_HWP_REQUEST
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Minimum_Performance See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Minimum_Performance:8;
+ ///
+ /// [Bits 15:8] Maximum_Performance See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Maximum_Performance:8;
+ ///
+ /// [Bits 23:16] Desired_Performance See Section 14.4.4, "Managing HWP".
+ /// If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Desired_Performance:8;
+ ///
+ /// [Bits 31:24] Energy_Performance_Preference See Section 14.4.4,
+ /// "Managing HWP". If CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[10] = 1.
+ ///
+ UINT32 Energy_Performance_Preference:8;
+ ///
+ /// [Bits 41:32] Activity_Window See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[9] = 1.
+ ///
+ UINT32 Activity_Window:10;
+ ///
+ /// [Bit 42] Package_Control See Section 14.4.4, "Managing HWP". If
+ /// CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[11] = 1.
+ ///
+ UINT32 Package_Control:1;
+ UINT32 Reserved:21;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_HWP_REQUEST_REGISTER;
+
+
+/**
+ Log bits indicating changes to Guaranteed & excursions to Minimum (R/W). If
+ CPUID.06H:EAX.[7] = 1.
+
+ @param ECX MSR_IA32_HWP_STATUS (0x00000777)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_STATUS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_HWP_STATUS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_HWP_STATUS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_STATUS);
+ AsmWriteMsr64 (MSR_IA32_HWP_STATUS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_HWP_STATUS is defined as IA32_HWP_STATUS in SDM.
+**/
+#define MSR_IA32_HWP_STATUS 0x00000777
+
+/**
+ MSR information returned for MSR index #MSR_IA32_HWP_STATUS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Guaranteed_Performance_Change (R/WC0). See Section 14.4.5,
+ /// "HWP Feedback". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Guaranteed_Performance_Change:1;
+ UINT32 Reserved1:1;
+ ///
+ /// [Bit 2] Excursion_To_Minimum (R/WC0). See Section 14.4.5, "HWP
+ /// Feedback". If CPUID.06H:EAX.[7] = 1.
+ ///
+ UINT32 Excursion_To_Minimum:1;
+ UINT32 Reserved2:29;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_HWP_STATUS_REGISTER;
+
+
+/**
+ x2APIC ID Register (R/O) See x2APIC Specification. If CPUID.01H:ECX[21] = 1
+ && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_APICID (0x00000802)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_APICID);
+ @endcode
+ @note MSR_IA32_X2APIC_APICID is defined as IA32_X2APIC_APICID in SDM.
+**/
+#define MSR_IA32_X2APIC_APICID 0x00000802
+
+
+/**
+ x2APIC Version Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_VERSION (0x00000803)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_VERSION);
+ @endcode
+ @note MSR_IA32_X2APIC_VERSION is defined as IA32_X2APIC_VERSION in SDM.
+**/
+#define MSR_IA32_X2APIC_VERSION 0x00000803
+
+
+/**
+ x2APIC Task Priority Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_TPR (0x00000808)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_TPR);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_TPR, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_TPR is defined as IA32_X2APIC_TPR in SDM.
+**/
+#define MSR_IA32_X2APIC_TPR 0x00000808
+
+
+/**
+ x2APIC Processor Priority Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_PPR (0x0000080A)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_PPR);
+ @endcode
+ @note MSR_IA32_X2APIC_PPR is defined as IA32_X2APIC_PPR in SDM.
+**/
+#define MSR_IA32_X2APIC_PPR 0x0000080A
+
+
+/**
+ x2APIC EOI Register (W/O). If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10]
+ = 1.
+
+ @param ECX MSR_IA32_X2APIC_EOI (0x0000080B)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = 0;
+ AsmWriteMsr64 (MSR_IA32_X2APIC_EOI, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_EOI is defined as IA32_X2APIC_EOI in SDM.
+**/
+#define MSR_IA32_X2APIC_EOI 0x0000080B
+
+
+/**
+ x2APIC Logical Destination Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LDR (0x0000080D)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LDR);
+ @endcode
+ @note MSR_IA32_X2APIC_LDR is defined as IA32_X2APIC_LDR in SDM.
+**/
+#define MSR_IA32_X2APIC_LDR 0x0000080D
+
+
+/**
+ x2APIC Spurious Interrupt Vector Register (R/W). If CPUID.01H:ECX.[21] = 1
+ && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_SIVR (0x0000080F)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_SIVR);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_SIVR, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_SIVR is defined as IA32_X2APIC_SIVR in SDM.
+**/
+#define MSR_IA32_X2APIC_SIVR 0x0000080F
+
+
+/**
+ x2APIC In-Service Register Bits (n * 32 + 31):(n * 32) (R/O).
+ If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_ISRn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ISR0);
+ @endcode
+ @note MSR_IA32_X2APIC_ISR0 is defined as IA32_X2APIC_ISR0 in SDM.
+ MSR_IA32_X2APIC_ISR1 is defined as IA32_X2APIC_ISR1 in SDM.
+ MSR_IA32_X2APIC_ISR2 is defined as IA32_X2APIC_ISR2 in SDM.
+ MSR_IA32_X2APIC_ISR3 is defined as IA32_X2APIC_ISR3 in SDM.
+ MSR_IA32_X2APIC_ISR4 is defined as IA32_X2APIC_ISR4 in SDM.
+ MSR_IA32_X2APIC_ISR5 is defined as IA32_X2APIC_ISR5 in SDM.
+ MSR_IA32_X2APIC_ISR6 is defined as IA32_X2APIC_ISR6 in SDM.
+ MSR_IA32_X2APIC_ISR7 is defined as IA32_X2APIC_ISR7 in SDM.
+ @{
+**/
+#define MSR_IA32_X2APIC_ISR0 0x00000810
+#define MSR_IA32_X2APIC_ISR1 0x00000811
+#define MSR_IA32_X2APIC_ISR2 0x00000812
+#define MSR_IA32_X2APIC_ISR3 0x00000813
+#define MSR_IA32_X2APIC_ISR4 0x00000814
+#define MSR_IA32_X2APIC_ISR5 0x00000815
+#define MSR_IA32_X2APIC_ISR6 0x00000816
+#define MSR_IA32_X2APIC_ISR7 0x00000817
+/// @}
+
+
+/**
+ x2APIC Trigger Mode Register Bits (n * 32 + ):(n * 32) (R/O).
+ If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_TMRn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_TMR0);
+ @endcode
+ @note MSR_IA32_X2APIC_TMR0 is defined as IA32_X2APIC_TMR0 in SDM.
+ MSR_IA32_X2APIC_TMR1 is defined as IA32_X2APIC_TMR1 in SDM.
+ MSR_IA32_X2APIC_TMR2 is defined as IA32_X2APIC_TMR2 in SDM.
+ MSR_IA32_X2APIC_TMR3 is defined as IA32_X2APIC_TMR3 in SDM.
+ MSR_IA32_X2APIC_TMR4 is defined as IA32_X2APIC_TMR4 in SDM.
+ MSR_IA32_X2APIC_TMR5 is defined as IA32_X2APIC_TMR5 in SDM.
+ MSR_IA32_X2APIC_TMR6 is defined as IA32_X2APIC_TMR6 in SDM.
+ MSR_IA32_X2APIC_TMR7 is defined as IA32_X2APIC_TMR7 in SDM.
+ @{
+**/
+#define MSR_IA32_X2APIC_TMR0 0x00000818
+#define MSR_IA32_X2APIC_TMR1 0x00000819
+#define MSR_IA32_X2APIC_TMR2 0x0000081A
+#define MSR_IA32_X2APIC_TMR3 0x0000081B
+#define MSR_IA32_X2APIC_TMR4 0x0000081C
+#define MSR_IA32_X2APIC_TMR5 0x0000081D
+#define MSR_IA32_X2APIC_TMR6 0x0000081E
+#define MSR_IA32_X2APIC_TMR7 0x0000081F
+/// @}
+
+
+/**
+ x2APIC Interrupt Request Register Bits (n* 32 + 31):(n * 32) (R/O).
+ If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_IRRn
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_IRR0);
+ @endcode
+ @note MSR_IA32_X2APIC_IRR0 is defined as IA32_X2APIC_IRR0 in SDM.
+ MSR_IA32_X2APIC_IRR1 is defined as IA32_X2APIC_IRR1 in SDM.
+ MSR_IA32_X2APIC_IRR2 is defined as IA32_X2APIC_IRR2 in SDM.
+ MSR_IA32_X2APIC_IRR3 is defined as IA32_X2APIC_IRR3 in SDM.
+ MSR_IA32_X2APIC_IRR4 is defined as IA32_X2APIC_IRR4 in SDM.
+ MSR_IA32_X2APIC_IRR5 is defined as IA32_X2APIC_IRR5 in SDM.
+ MSR_IA32_X2APIC_IRR6 is defined as IA32_X2APIC_IRR6 in SDM.
+ MSR_IA32_X2APIC_IRR7 is defined as IA32_X2APIC_IRR7 in SDM.
+ @{
+**/
+#define MSR_IA32_X2APIC_IRR0 0x00000820
+#define MSR_IA32_X2APIC_IRR1 0x00000821
+#define MSR_IA32_X2APIC_IRR2 0x00000822
+#define MSR_IA32_X2APIC_IRR3 0x00000823
+#define MSR_IA32_X2APIC_IRR4 0x00000824
+#define MSR_IA32_X2APIC_IRR5 0x00000825
+#define MSR_IA32_X2APIC_IRR6 0x00000826
+#define MSR_IA32_X2APIC_IRR7 0x00000827
+/// @}
+
+
+/**
+ x2APIC Error Status Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_ESR (0x00000828)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ESR);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_ESR, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_ESR is defined as IA32_X2APIC_ESR in SDM.
+**/
+#define MSR_IA32_X2APIC_ESR 0x00000828
+
+
+/**
+ x2APIC LVT Corrected Machine Check Interrupt Register (R/W). If
+ CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_CMCI (0x0000082F)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_CMCI);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_CMCI, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_CMCI is defined as IA32_X2APIC_LVT_CMCI in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_CMCI 0x0000082F
+
+
+/**
+ x2APIC Interrupt Command Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_ICR (0x00000830)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ICR);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_ICR, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_ICR is defined as IA32_X2APIC_ICR in SDM.
+**/
+#define MSR_IA32_X2APIC_ICR 0x00000830
+
+
+/**
+ x2APIC LVT Timer Interrupt Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_TIMER (0x00000832)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_TIMER);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_TIMER, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_TIMER is defined as IA32_X2APIC_LVT_TIMER in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_TIMER 0x00000832
+
+
+/**
+ x2APIC LVT Thermal Sensor Interrupt Register (R/W). If CPUID.01H:ECX.[21] =
+ 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_THERMAL (0x00000833)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_THERMAL);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_THERMAL, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_THERMAL is defined as IA32_X2APIC_LVT_THERMAL in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_THERMAL 0x00000833
+
+
+/**
+ x2APIC LVT Performance Monitor Interrupt Register (R/W). If
+ CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_PMI (0x00000834)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_PMI);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_PMI, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_PMI is defined as IA32_X2APIC_LVT_PMI in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_PMI 0x00000834
+
+
+/**
+ x2APIC LVT LINT0 Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_LINT0 (0x00000835)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_LINT0);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_LINT0, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_LINT0 is defined as IA32_X2APIC_LVT_LINT0 in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_LINT0 0x00000835
+
+
+/**
+ x2APIC LVT LINT1 Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_LINT1 (0x00000836)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_LINT1);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_LINT1, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_LINT1 is defined as IA32_X2APIC_LVT_LINT1 in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_LINT1 0x00000836
+
+
+/**
+ x2APIC LVT Error Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_LVT_ERROR (0x00000837)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_ERROR);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_ERROR, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_LVT_ERROR is defined as IA32_X2APIC_LVT_ERROR in SDM.
+**/
+#define MSR_IA32_X2APIC_LVT_ERROR 0x00000837
+
+
+/**
+ x2APIC Initial Count Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_INIT_COUNT (0x00000838)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_INIT_COUNT);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_INIT_COUNT, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_INIT_COUNT is defined as IA32_X2APIC_INIT_COUNT in SDM.
+**/
+#define MSR_IA32_X2APIC_INIT_COUNT 0x00000838
+
+
+/**
+ x2APIC Current Count Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_CUR_COUNT (0x00000839)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_CUR_COUNT);
+ @endcode
+ @note MSR_IA32_X2APIC_CUR_COUNT is defined as IA32_X2APIC_CUR_COUNT in SDM.
+**/
+#define MSR_IA32_X2APIC_CUR_COUNT 0x00000839
+
+
+/**
+ x2APIC Divide Configuration Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_DIV_CONF (0x0000083E)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_X2APIC_DIV_CONF);
+ AsmWriteMsr64 (MSR_IA32_X2APIC_DIV_CONF, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_DIV_CONF is defined as IA32_X2APIC_DIV_CONF in SDM.
+**/
+#define MSR_IA32_X2APIC_DIV_CONF 0x0000083E
+
+
+/**
+ x2APIC Self IPI Register (W/O). If CPUID.01H:ECX.[21] = 1 &&
+ IA32_APIC_BASE.[10] = 1.
+
+ @param ECX MSR_IA32_X2APIC_SELF_IPI (0x0000083F)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = 0;
+ AsmWriteMsr64 (MSR_IA32_X2APIC_SELF_IPI, Msr);
+ @endcode
+ @note MSR_IA32_X2APIC_SELF_IPI is defined as IA32_X2APIC_SELF_IPI in SDM.
+**/
+#define MSR_IA32_X2APIC_SELF_IPI 0x0000083F
+
+
+/**
+ Silicon Debug Feature Control (R/W). If CPUID.01H:ECX.[11] = 1.
+
+ @param ECX MSR_IA32_DEBUG_INTERFACE (0x00000C80)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_DEBUG_INTERFACE_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_DEBUG_INTERFACE_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_DEBUG_INTERFACE_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DEBUG_INTERFACE);
+ AsmWriteMsr64 (MSR_IA32_DEBUG_INTERFACE, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_DEBUG_INTERFACE is defined as IA32_DEBUG_INTERFACE in SDM.
+**/
+#define MSR_IA32_DEBUG_INTERFACE 0x00000C80
+
+/**
+ MSR information returned for MSR index #MSR_IA32_DEBUG_INTERFACE
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Enable (R/W) BIOS set 1 to enable Silicon debug features.
+ /// Default is 0. If CPUID.01H:ECX.[11] = 1.
+ ///
+ UINT32 Enable:1;
+ UINT32 Reserved1:29;
+ ///
+ /// [Bit 30] Lock (R/W): If 1, locks any further change to the MSR. The
+ /// lock bit is set automatically on the first SMI assertion even if not
+ /// explicitly set by BIOS. Default is 0. If CPUID.01H:ECX.[11] = 1.
+ ///
+ UINT32 Lock:1;
+ ///
+ /// [Bit 31] Debug Occurred (R/O): This "sticky bit" is set by hardware to
+ /// indicate the status of bit 0. Default is 0. If CPUID.01H:ECX.[11] = 1.
+ ///
+ UINT32 DebugOccurred:1;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_DEBUG_INTERFACE_REGISTER;
+
+
+/**
+ L3 QOS Configuration (R/W). If ( CPUID.(EAX=10H, ECX=1):ECX.[2] = 1 ).
+
+ @param ECX MSR_IA32_L3_QOS_CFG (0x00000C81)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_L3_QOS_CFG_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_L3_QOS_CFG_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_L3_QOS_CFG_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_L3_QOS_CFG);
+ AsmWriteMsr64 (MSR_IA32_L3_QOS_CFG, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_L3_QOS_CFG is defined as IA32_L3_QOS_CFG in SDM.
+**/
+#define MSR_IA32_L3_QOS_CFG 0x00000C81
+
+/**
+ MSR information returned for MSR index #MSR_IA32_L3_QOS_CFG
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Enable (R/W) Set 1 to enable L3 CAT masks and COS to operate
+ /// in Code and Data Prioritization (CDP) mode.
+ ///
+ UINT32 Enable:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_L3_QOS_CFG_REGISTER;
+
+/**
+ L2 QOS Configuration (R/W). If ( CPUID.(EAX=10H, ECX=2):ECX.[2] = 1 ).
+
+ @param ECX MSR_IA32_L2_QOS_CFG (0x00000C82)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_L2_QOS_CFG_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_L2_QOS_CFG_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_L2_QOS_CFG_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_L2_QOS_CFG);
+ AsmWriteMsr64 (MSR_IA32_L2_QOS_CFG, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_L2_QOS_CFG is defined as IA32_L2_QOS_CFG in SDM.
+**/
+#define MSR_IA32_L2_QOS_CFG 0x00000C82
+
+/**
+ MSR information returned for MSR index #MSR_IA32_L2_QOS_CFG
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] Enable (R/W) Set 1 to enable L2 CAT masks and COS to operate
+ /// in Code and Data Prioritization (CDP) mode.
+ ///
+ UINT32 Enable:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_L2_QOS_CFG_REGISTER;
+
+/**
+ Monitoring Event Select Register (R/W). If ( CPUID.(EAX=07H, ECX=0):EBX.[12]
+ = 1 ).
+
+ @param ECX MSR_IA32_QM_EVTSEL (0x00000C8D)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_QM_EVTSEL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_QM_EVTSEL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_QM_EVTSEL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_QM_EVTSEL);
+ AsmWriteMsr64 (MSR_IA32_QM_EVTSEL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_QM_EVTSEL is defined as IA32_QM_EVTSEL in SDM.
+**/
+#define MSR_IA32_QM_EVTSEL 0x00000C8D
+
+/**
+ MSR information returned for MSR index #MSR_IA32_QM_EVTSEL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 7:0] Event ID: ID of a supported monitoring event to report via
+ /// IA32_QM_CTR.
+ ///
+ UINT32 EventID:8;
+ UINT32 Reserved:24;
+ ///
+ /// [Bits 63:32] Resource Monitoring ID: ID for monitoring hardware to
+ /// report monitored data via IA32_QM_CTR. N = Ceil (Log:sub:`2` (
+ /// CPUID.(EAX= 0FH, ECX=0H).EBX[31:0] +1)).
+ ///
+ UINT32 ResourceMonitoringID:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_QM_EVTSEL_REGISTER;
+
+
+/**
+ Monitoring Counter Register (R/O). If ( CPUID.(EAX=07H, ECX=0):EBX.[12] = 1
+ ).
+
+ @param ECX MSR_IA32_QM_CTR (0x00000C8E)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_QM_CTR_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_QM_CTR_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_QM_CTR_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_QM_CTR);
+ @endcode
+ @note MSR_IA32_QM_CTR is defined as IA32_QM_CTR in SDM.
+**/
+#define MSR_IA32_QM_CTR 0x00000C8E
+
+/**
+ MSR information returned for MSR index #MSR_IA32_QM_CTR
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Resource Monitored Data.
+ ///
+ UINT32 ResourceMonitoredData:32;
+ ///
+ /// [Bits 61:32] Resource Monitored Data.
+ ///
+ UINT32 ResourceMonitoredDataHi:30;
+ ///
+ /// [Bit 62] Unavailable: If 1, indicates data for this RMID is not
+ /// available or not monitored for this resource or RMID.
+ ///
+ UINT32 Unavailable:1;
+ ///
+ /// [Bit 63] Error: If 1, indicates and unsupported RMID or event type was
+ /// written to IA32_PQR_QM_EVTSEL.
+ ///
+ UINT32 Error:1;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_QM_CTR_REGISTER;
+
+
+/**
+ Resource Association Register (R/W). If ( (CPUID.(EAX=07H, ECX=0):EBX[12]
+ =1) or (CPUID.(EAX=07H, ECX=0):EBX[15] =1 ) ).
+
+ @param ECX MSR_IA32_PQR_ASSOC (0x00000C8F)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PQR_ASSOC_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PQR_ASSOC_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PQR_ASSOC_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PQR_ASSOC);
+ AsmWriteMsr64 (MSR_IA32_PQR_ASSOC, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PQR_ASSOC is defined as IA32_PQR_ASSOC in SDM.
+**/
+#define MSR_IA32_PQR_ASSOC 0x00000C8F
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PQR_ASSOC
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] Resource Monitoring ID (R/W): ID for monitoring hardware
+ /// to track internal operation, e.g. memory access. N = Ceil (Log:sub:`2`
+ /// ( CPUID.(EAX= 0FH, ECX=0H).EBX[31:0] +1)).
+ ///
+ UINT32 ResourceMonitoringID:32;
+ ///
+ /// [Bits 63:32] COS (R/W). The class of service (COS) to enforce (on
+ /// writes); returns the current COS when read. If ( CPUID.(EAX=07H,
+ /// ECX=0):EBX.[15] = 1 ).
+ ///
+ UINT32 COS:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PQR_ASSOC_REGISTER;
+
+
+/**
+ Supervisor State of MPX Configuration. (R/W). If (CPUID.(EAX=07H,
+ ECX=0H):EBX[14] = 1).
+
+ @param ECX MSR_IA32_BNDCFGS (0x00000D90)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_BNDCFGS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_BNDCFGS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_BNDCFGS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_BNDCFGS);
+ AsmWriteMsr64 (MSR_IA32_BNDCFGS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_BNDCFGS is defined as IA32_BNDCFGS in SDM.
+**/
+#define MSR_IA32_BNDCFGS 0x00000D90
+
+/**
+ MSR information returned for MSR index #MSR_IA32_BNDCFGS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] EN: Enable Intel MPX in supervisor mode.
+ ///
+ UINT32 EN:1;
+ ///
+ /// [Bit 1] BNDPRESERVE: Preserve the bounds registers for near branch
+ /// instructions in the absence of the BND prefix.
+ ///
+ UINT32 BNDPRESERVE:1;
+ UINT32 Reserved:10;
+ ///
+ /// [Bits 31:12] Base Address of Bound Directory.
+ ///
+ UINT32 Base:20;
+ ///
+ /// [Bits 63:32] Base Address of Bound Directory.
+ ///
+ UINT32 BaseHi:32;
+ } Bits;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_BNDCFGS_REGISTER;
+
+
+/**
+ Extended Supervisor State Mask (R/W). If( CPUID.(0DH, 1):EAX.[3] = 1.
+
+ @param ECX MSR_IA32_XSS (0x00000DA0)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_XSS_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_XSS_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_XSS_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_XSS);
+ AsmWriteMsr64 (MSR_IA32_XSS, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_XSS is defined as IA32_XSS in SDM.
+**/
+#define MSR_IA32_XSS 0x00000DA0
+
+/**
+ MSR information returned for MSR index #MSR_IA32_XSS
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ UINT32 Reserved1:8;
+ ///
+ /// [Bit 8] Trace Packet Configuration State (R/W).
+ ///
+ UINT32 TracePacketConfigurationState:1;
+ UINT32 Reserved2:23;
+ UINT32 Reserved3:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_XSS_REGISTER;
+
+
+/**
+ Package Level Enable/disable HDC (R/W). If CPUID.06H:EAX.[13] = 1.
+
+ @param ECX MSR_IA32_PKG_HDC_CTL (0x00000DB0)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PKG_HDC_CTL_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PKG_HDC_CTL_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PKG_HDC_CTL_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PKG_HDC_CTL);
+ AsmWriteMsr64 (MSR_IA32_PKG_HDC_CTL, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PKG_HDC_CTL is defined as IA32_PKG_HDC_CTL in SDM.
+**/
+#define MSR_IA32_PKG_HDC_CTL 0x00000DB0
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PKG_HDC_CTL
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] HDC_Pkg_Enable (R/W) Force HDC idling or wake up HDC-idled
+ /// logical processors in the package. See Section 14.5.2, "Package level
+ /// Enabling HDC". If CPUID.06H:EAX.[13] = 1.
+ ///
+ UINT32 HDC_Pkg_Enable:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PKG_HDC_CTL_REGISTER;
+
+
+/**
+ Enable/disable HWP (R/W). If CPUID.06H:EAX.[13] = 1.
+
+ @param ECX MSR_IA32_PM_CTL1 (0x00000DB1)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_PM_CTL1_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_PM_CTL1_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_PM_CTL1_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PM_CTL1);
+ AsmWriteMsr64 (MSR_IA32_PM_CTL1, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_PM_CTL1 is defined as IA32_PM_CTL1 in SDM.
+**/
+#define MSR_IA32_PM_CTL1 0x00000DB1
+
+/**
+ MSR information returned for MSR index #MSR_IA32_PM_CTL1
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] HDC_Allow_Block (R/W) Allow/Block this logical processor for
+ /// package level HDC control. See Section 14.5.3.
+ /// If CPUID.06H:EAX.[13] = 1.
+ ///
+ UINT32 HDC_Allow_Block:1;
+ UINT32 Reserved1:31;
+ UINT32 Reserved2:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_PM_CTL1_REGISTER;
+
+
+/**
+ Per-Logical_Processor HDC Idle Residency (R/0). If CPUID.06H:EAX.[13] = 1.
+ Stall_Cycle_Cnt (R/W) Stalled cycles due to HDC forced idle on this logical
+ processor. See Section 14.5.4.1. If CPUID.06H:EAX.[13] = 1.
+
+ @param ECX MSR_IA32_THREAD_STALL (0x00000DB2)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_THREAD_STALL);
+ @endcode
+ @note MSR_IA32_THREAD_STALL is defined as IA32_THREAD_STALL in SDM.
+**/
+#define MSR_IA32_THREAD_STALL 0x00000DB2
+
+
+/**
+ Extended Feature Enables. If ( CPUID.80000001H:EDX.[2 0]
+ CPUID.80000001H:EDX.[2 9]).
+
+ @param ECX MSR_IA32_EFER (0xC0000080)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_EFER_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_EFER_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_EFER_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_EFER);
+ AsmWriteMsr64 (MSR_IA32_EFER, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_EFER is defined as IA32_EFER in SDM.
+**/
+#define MSR_IA32_EFER 0xC0000080
+
+/**
+ MSR information returned for MSR index #MSR_IA32_EFER
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bit 0] SYSCALL Enable: IA32_EFER.SCE (R/W) Enables SYSCALL/SYSRET
+ /// instructions in 64-bit mode.
+ ///
+ UINT32 SCE:1;
+ UINT32 Reserved1:7;
+ ///
+ /// [Bit 8] IA-32e Mode Enable: IA32_EFER.LME (R/W) Enables IA-32e mode
+ /// operation.
+ ///
+ UINT32 LME:1;
+ UINT32 Reserved2:1;
+ ///
+ /// [Bit 10] IA-32e Mode Active: IA32_EFER.LMA (R) Indicates IA-32e mode
+ /// is active when set.
+ ///
+ UINT32 LMA:1;
+ ///
+ /// [Bit 11] Execute Disable Bit Enable: IA32_EFER.NXE (R/W).
+ ///
+ UINT32 NXE:1;
+ UINT32 Reserved3:20;
+ UINT32 Reserved4:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_EFER_REGISTER;
+
+
+/**
+ System Call Target Address (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_STAR (0xC0000081)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_STAR);
+ AsmWriteMsr64 (MSR_IA32_STAR, Msr);
+ @endcode
+ @note MSR_IA32_STAR is defined as IA32_STAR in SDM.
+**/
+#define MSR_IA32_STAR 0xC0000081
+
+
+/**
+ IA-32e Mode System Call Target Address (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_LSTAR (0xC0000082)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_LSTAR);
+ AsmWriteMsr64 (MSR_IA32_LSTAR, Msr);
+ @endcode
+ @note MSR_IA32_LSTAR is defined as IA32_LSTAR in SDM.
+**/
+#define MSR_IA32_LSTAR 0xC0000082
+
+/**
+ IA-32e Mode System Call Target Address (R/W) Not used, as the SYSCALL
+ instruction is not recognized in compatibility mode. If
+ CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_CSTAR (0xC0000083)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_CSTAR);
+ AsmWriteMsr64 (MSR_IA32_CSTAR, Msr);
+ @endcode
+ @note MSR_IA32_CSTAR is defined as IA32_CSTAR in SDM.
+**/
+#define MSR_IA32_CSTAR 0xC0000083
+
+/**
+ System Call Flag Mask (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_FMASK (0xC0000084)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_FMASK);
+ AsmWriteMsr64 (MSR_IA32_FMASK, Msr);
+ @endcode
+ @note MSR_IA32_FMASK is defined as IA32_FMASK in SDM.
+**/
+#define MSR_IA32_FMASK 0xC0000084
+
+
+/**
+ Map of BASE Address of FS (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_FS_BASE (0xC0000100)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_FS_BASE);
+ AsmWriteMsr64 (MSR_IA32_FS_BASE, Msr);
+ @endcode
+ @note MSR_IA32_FS_BASE is defined as IA32_FS_BASE in SDM.
+**/
+#define MSR_IA32_FS_BASE 0xC0000100
+
+
+/**
+ Map of BASE Address of GS (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_GS_BASE (0xC0000101)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_GS_BASE);
+ AsmWriteMsr64 (MSR_IA32_GS_BASE, Msr);
+ @endcode
+ @note MSR_IA32_GS_BASE is defined as IA32_GS_BASE in SDM.
+**/
+#define MSR_IA32_GS_BASE 0xC0000101
+
+
+/**
+ Swap Target of BASE Address of GS (R/W). If CPUID.80000001:EDX.[29] = 1.
+
+ @param ECX MSR_IA32_KERNEL_GS_BASE (0xC0000102)
+ @param EAX Lower 32-bits of MSR value.
+ @param EDX Upper 32-bits of MSR value.
+
+ <b>Example usage</b>
+ @code
+ UINT64 Msr;
+
+ Msr = AsmReadMsr64 (MSR_IA32_KERNEL_GS_BASE);
+ AsmWriteMsr64 (MSR_IA32_KERNEL_GS_BASE, Msr);
+ @endcode
+ @note MSR_IA32_KERNEL_GS_BASE is defined as IA32_KERNEL_GS_BASE in SDM.
+**/
+#define MSR_IA32_KERNEL_GS_BASE 0xC0000102
+
+
+/**
+ Auxiliary TSC (RW). If CPUID.80000001H: EDX[27] = 1.
+
+ @param ECX MSR_IA32_TSC_AUX (0xC0000103)
+ @param EAX Lower 32-bits of MSR value.
+ Described by the type MSR_IA32_TSC_AUX_REGISTER.
+ @param EDX Upper 32-bits of MSR value.
+ Described by the type MSR_IA32_TSC_AUX_REGISTER.
+
+ <b>Example usage</b>
+ @code
+ MSR_IA32_TSC_AUX_REGISTER Msr;
+
+ Msr.Uint64 = AsmReadMsr64 (MSR_IA32_TSC_AUX);
+ AsmWriteMsr64 (MSR_IA32_TSC_AUX, Msr.Uint64);
+ @endcode
+ @note MSR_IA32_TSC_AUX is defined as IA32_TSC_AUX in SDM.
+**/
+#define MSR_IA32_TSC_AUX 0xC0000103
+
+/**
+ MSR information returned for MSR index #MSR_IA32_TSC_AUX
+**/
+typedef union {
+ ///
+ /// Individual bit fields
+ ///
+ struct {
+ ///
+ /// [Bits 31:0] AUX: Auxiliary signature of TSC.
+ ///
+ UINT32 AUX:32;
+ UINT32 Reserved:32;
+ } Bits;
+ ///
+ /// All bit fields as a 32-bit value
+ ///
+ UINT32 Uint32;
+ ///
+ /// All bit fields as a 64-bit value
+ ///
+ UINT64 Uint64;
+} MSR_IA32_TSC_AUX_REGISTER;
+
+#endif
diff --git a/MdePkg/Include/Register/Intel/LocalApic.h b/MdePkg/Include/Register/Intel/LocalApic.h
new file mode 100644
index 0000000000..35625cff70
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/LocalApic.h
@@ -0,0 +1,183 @@
+/** @file
+ IA32 Local APIC Definitions.
+
+ Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __INTEL_LOCAL_APIC_H__
+#define __INTEL_LOCAL_APIC_H__
+
+//
+// Definition for Local APIC registers and related values
+//
+#define XAPIC_ID_OFFSET 0x20
+#define XAPIC_VERSION_OFFSET 0x30
+#define XAPIC_EOI_OFFSET 0x0b0
+#define XAPIC_ICR_DFR_OFFSET 0x0e0
+#define XAPIC_SPURIOUS_VECTOR_OFFSET 0x0f0
+#define XAPIC_ICR_LOW_OFFSET 0x300
+#define XAPIC_ICR_HIGH_OFFSET 0x310
+#define XAPIC_LVT_TIMER_OFFSET 0x320
+#define XAPIC_LVT_LINT0_OFFSET 0x350
+#define XAPIC_LVT_LINT1_OFFSET 0x360
+#define XAPIC_TIMER_INIT_COUNT_OFFSET 0x380
+#define XAPIC_TIMER_CURRENT_COUNT_OFFSET 0x390
+#define XAPIC_TIMER_DIVIDE_CONFIGURATION_OFFSET 0x3E0
+
+#define X2APIC_MSR_BASE_ADDRESS 0x800
+#define X2APIC_MSR_ICR_ADDRESS 0x830
+
+#define LOCAL_APIC_DELIVERY_MODE_FIXED 0
+#define LOCAL_APIC_DELIVERY_MODE_LOWEST_PRIORITY 1
+#define LOCAL_APIC_DELIVERY_MODE_SMI 2
+#define LOCAL_APIC_DELIVERY_MODE_NMI 4
+#define LOCAL_APIC_DELIVERY_MODE_INIT 5
+#define LOCAL_APIC_DELIVERY_MODE_STARTUP 6
+#define LOCAL_APIC_DELIVERY_MODE_EXTINT 7
+
+#define LOCAL_APIC_DESTINATION_SHORTHAND_NO_SHORTHAND 0
+#define LOCAL_APIC_DESTINATION_SHORTHAND_SELF 1
+#define LOCAL_APIC_DESTINATION_SHORTHAND_ALL_INCLUDING_SELF 2
+#define LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF 3
+
+//
+// Local APIC Version Register.
+//
+typedef union {
+ struct {
+ UINT32 Version:8; ///< The version numbers of the local APIC.
+ UINT32 Reserved0:8; ///< Reserved.
+ UINT32 MaxLvtEntry:8; ///< Number of LVT entries minus 1.
+ UINT32 EoiBroadcastSuppression:1; ///< 1 if EOI-broadcast suppression supported.
+ UINT32 Reserved1:7; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_VERSION;
+
+//
+// Low half of Interrupt Command Register (ICR).
+//
+typedef union {
+ struct {
+ UINT32 Vector:8; ///< The vector number of the interrupt being sent.
+ UINT32 DeliveryMode:3; ///< Specifies the type of IPI to be sent.
+ UINT32 DestinationMode:1; ///< 0: physical destination mode, 1: logical destination mode.
+ UINT32 DeliveryStatus:1; ///< Indicates the IPI delivery status. This field is reserved in x2APIC mode.
+ UINT32 Reserved0:1; ///< Reserved.
+ UINT32 Level:1; ///< 0 for the INIT level de-assert delivery mode. Otherwise 1.
+ UINT32 TriggerMode:1; ///< 0: edge, 1: level when using the INIT level de-assert delivery mode.
+ UINT32 Reserved1:2; ///< Reserved.
+ UINT32 DestinationShorthand:2; ///< A shorthand notation to specify the destination of the interrupt.
+ UINT32 Reserved2:12; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_ICR_LOW;
+
+//
+// High half of Interrupt Command Register (ICR)
+//
+typedef union {
+ struct {
+ UINT32 Reserved0:24; ///< Reserved.
+ UINT32 Destination:8; ///< Specifies the target processor or processors in xAPIC mode.
+ } Bits;
+ UINT32 Uint32; ///< Destination field expanded to 32-bit in x2APIC mode.
+} LOCAL_APIC_ICR_HIGH;
+
+//
+// Spurious-Interrupt Vector Register (SVR)
+//
+typedef union {
+ struct {
+ UINT32 SpuriousVector:8; ///< Spurious Vector.
+ UINT32 SoftwareEnable:1; ///< APIC Software Enable/Disable.
+ UINT32 FocusProcessorChecking:1; ///< Focus Processor Checking.
+ UINT32 Reserved0:2; ///< Reserved.
+ UINT32 EoiBroadcastSuppression:1; ///< EOI-Broadcast Suppression.
+ UINT32 Reserved1:19; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_SVR;
+
+//
+// Divide Configuration Register (DCR)
+//
+typedef union {
+ struct {
+ UINT32 DivideValue1:2; ///< Low 2 bits of the divide value.
+ UINT32 Reserved0:1; ///< Always 0.
+ UINT32 DivideValue2:1; ///< Highest 1 bit of the divide value.
+ UINT32 Reserved1:28; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_DCR;
+
+//
+// LVT Timer Register
+//
+typedef union {
+ struct {
+ UINT32 Vector:8; ///< The vector number of the interrupt being sent.
+ UINT32 Reserved0:4; ///< Reserved.
+ UINT32 DeliveryStatus:1; ///< 0: Idle, 1: send pending.
+ UINT32 Reserved1:3; ///< Reserved.
+ UINT32 Mask:1; ///< 0: Not masked, 1: Masked.
+ UINT32 TimerMode:1; ///< 0: One-shot, 1: Periodic.
+ UINT32 Reserved2:14; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_LVT_TIMER;
+
+//
+// LVT LINT0/LINT1 Register
+//
+typedef union {
+ struct {
+ UINT32 Vector:8; ///< The vector number of the interrupt being sent.
+ UINT32 DeliveryMode:3; ///< Specifies the type of interrupt to be sent.
+ UINT32 Reserved0:1; ///< Reserved.
+ UINT32 DeliveryStatus:1; ///< 0: Idle, 1: send pending.
+ UINT32 InputPinPolarity:1; ///< Interrupt Input Pin Polarity.
+ UINT32 RemoteIrr:1; ///< RO. Set when the local APIC accepts the interrupt and reset when an EOI is received.
+ UINT32 TriggerMode:1; ///< 0:edge, 1:level.
+ UINT32 Mask:1; ///< 0: Not masked, 1: Masked.
+ UINT32 Reserved1:15; ///< Reserved.
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_LVT_LINT;
+
+//
+// MSI Address Register
+//
+typedef union {
+ struct {
+ UINT32 Reserved0:2; ///< Reserved
+ UINT32 DestinationMode:1; ///< Specifies the Destination Mode.
+ UINT32 RedirectionHint:1; ///< Specifies the Redirection Hint.
+ UINT32 Reserved1:8; ///< Reserved.
+ UINT32 DestinationId:8; ///< Specifies the Destination ID.
+ UINT32 BaseAddress:12; ///< Must be 0FEEH
+ } Bits;
+ UINT32 Uint32;
+} LOCAL_APIC_MSI_ADDRESS;
+
+//
+// MSI Address Register
+//
+typedef union {
+ struct {
+ UINT32 Vector:8; ///< Interrupt vector in range 010h..0FEH
+ UINT32 DeliveryMode:3; ///< Specifies the type of interrupt to be sent.
+ UINT32 Reserved0:3; ///< Reserved.
+ UINT32 Level:1; ///< 0:Deassert, 1:Assert. Ignored for Edge triggered interrupts.
+ UINT32 TriggerMode:1; ///< 0:Edge, 1:Level.
+ UINT32 Reserved1:16; ///< Reserved.
+ UINT32 Reserved2:32; ///< Reserved.
+ } Bits;
+ UINT64 Uint64;
+} LOCAL_APIC_MSI_DATA;
+
+#endif
+
diff --git a/MdePkg/Include/Register/Intel/Microcode.h b/MdePkg/Include/Register/Intel/Microcode.h
new file mode 100644
index 0000000000..93fa3d6d53
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/Microcode.h
@@ -0,0 +1,194 @@
+/** @file
+ Microcode Definitions.
+
+ Microcode Definitions based on contents of the
+ Intel(R) 64 and IA-32 Architectures Software Developer's Manual
+ Volume 3A, Section 9.11 Microcode Definitions
+
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Specification Reference:
+ Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A,
+ June 2016, Chapter 9 Processor Management and Initialization, Section 9-11.
+
+**/
+
+#ifndef __INTEL_MICROCODE_H__
+#define __INTEL_MICROCODE_H__
+
+///
+/// CPU Microcode Date in BCD format
+///
+typedef union {
+ struct {
+ UINT32 Year:16;
+ UINT32 Day:8;
+ UINT32 Month:8;
+ } Bits;
+ UINT32 Uint32;
+} CPU_MICROCODE_DATE;
+
+///
+/// CPU Microcode Processor Signature format
+///
+typedef union {
+ struct {
+ UINT32 Stepping:4;
+ UINT32 Model:4;
+ UINT32 Family:4;
+ UINT32 Type:2;
+ UINT32 Reserved1:2;
+ UINT32 ExtendedModel:4;
+ UINT32 ExtendedFamily:8;
+ UINT32 Reserved2:4;
+ } Bits;
+ UINT32 Uint32;
+} CPU_MICROCODE_PROCESSOR_SIGNATURE;
+
+#pragma pack (1)
+
+///
+/// Microcode Update Format definition
+///
+typedef struct {
+ ///
+ /// Version number of the update header
+ ///
+ UINT32 HeaderVersion;
+ ///
+ /// Unique version number for the update, the basis for the update
+ /// signature provided by the processor to indicate the current update
+ /// functioning within the processor. Used by the BIOS to authenticate
+ /// the update and verify that the processor loads successfully. The
+ /// value in this field cannot be used for processor stepping identification
+ /// alone. This is a signed 32-bit number.
+ ///
+ UINT32 UpdateRevision;
+ ///
+ /// Date of the update creation in binary format: mmddyyyy (e.g.
+ /// 07/18/98 is 07181998H).
+ ///
+ CPU_MICROCODE_DATE Date;
+ ///
+ /// Extended family, extended model, type, family, model, and stepping
+ /// of processor that requires this particular update revision (e.g.,
+ /// 00000650H). Each microcode update is designed specifically for a
+ /// given extended family, extended model, type, family, model, and
+ /// stepping of the processor.
+ /// The BIOS uses the processor signature field in conjunction with the
+ /// CPUID instruction to determine whether or not an update is
+ /// appropriate to load on a processor. The information encoded within
+ /// this field exactly corresponds to the bit representations returned by
+ /// the CPUID instruction.
+ ///
+ CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature;
+ ///
+ /// Checksum of Update Data and Header. Used to verify the integrity of
+ /// the update header and data. Checksum is correct when the
+ /// summation of all the DWORDs (including the extended Processor
+ /// Signature Table) that comprise the microcode update result in
+ /// 00000000H.
+ ///
+ UINT32 Checksum;
+ ///
+ /// Version number of the loader program needed to correctly load this
+ /// update. The initial version is 00000001H
+ ///
+ UINT32 LoaderRevision;
+ ///
+ /// Platform type information is encoded in the lower 8 bits of this 4-
+ /// byte field. Each bit represents a particular platform type for a given
+ /// CPUID. The BIOS uses the processor flags field in conjunction with
+ /// the platform Id bits in MSR (17H) to determine whether or not an
+ /// update is appropriate to load on a processor. Multiple bits may be set
+ /// representing support for multiple platform IDs.
+ ///
+ UINT32 ProcessorFlags;
+ ///
+ /// Specifies the size of the encrypted data in bytes, and must be a
+ /// multiple of DWORDs. If this value is 00000000H, then the microcode
+ /// update encrypted data is 2000 bytes (or 500 DWORDs).
+ ///
+ UINT32 DataSize;
+ ///
+ /// Specifies the total size of the microcode update in bytes. It is the
+ /// summation of the header size, the encrypted data size and the size of
+ /// the optional extended signature table. This value is always a multiple
+ /// of 1024.
+ ///
+ UINT32 TotalSize;
+ ///
+ /// Reserved fields for future expansion.
+ ///
+ UINT8 Reserved[12];
+} CPU_MICROCODE_HEADER;
+
+///
+/// Extended Signature Table Header Field Definitions
+///
+typedef struct {
+ ///
+ /// Specifies the number of extended signature structures (Processor
+ /// Signature[n], processor flags[n] and checksum[n]) that exist in this
+ /// microcode update
+ ///
+ UINT32 ExtendedSignatureCount;
+ ///
+ /// Checksum of update extended processor signature table. Used to
+ /// verify the integrity of the extended processor signature table.
+ /// Checksum is correct when the summation of the DWORDs that
+ /// comprise the extended processor signature table results in
+ /// 00000000H.
+ ///
+ UINT32 ExtendedChecksum;
+ ///
+ /// Reserved fields.
+ ///
+ UINT8 Reserved[12];
+} CPU_MICROCODE_EXTENDED_TABLE_HEADER;
+
+///
+/// Extended Signature Table Field Definitions
+///
+typedef struct {
+ ///
+ /// Extended family, extended model, type, family, model, and stepping
+ /// of processor that requires this particular update revision (e.g.,
+ /// 00000650H). Each microcode update is designed specifically for a
+ /// given extended family, extended model, type, family, model, and
+ /// stepping of the processor.
+ /// The BIOS uses the processor signature field in conjunction with the
+ /// CPUID instruction to determine whether or not an update is
+ /// appropriate to load on a processor. The information encoded within
+ /// this field exactly corresponds to the bit representations returned by
+ /// the CPUID instruction.
+ ///
+ CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature;
+ ///
+ /// Platform type information is encoded in the lower 8 bits of this 4-
+ /// byte field. Each bit represents a particular platform type for a given
+ /// CPUID. The BIOS uses the processor flags field in conjunction with
+ /// the platform Id bits in MSR (17H) to determine whether or not an
+ /// update is appropriate to load on a processor. Multiple bits may be set
+ /// representing support for multiple platform IDs.
+ ///
+ UINT32 ProcessorFlag;
+ ///
+ /// Used by utility software to decompose a microcode update into
+ /// multiple microcode updates where each of the new updates is
+ /// constructed without the optional Extended Processor Signature
+ /// Table.
+ /// To calculate the Checksum, substitute the Primary Processor
+ /// Signature entry and the Processor Flags entry with the
+ /// corresponding Extended Patch entry. Delete the Extended Processor
+ /// Signature Table entries. The Checksum is correct when the
+ /// summation of all DWORDs that comprise the created Extended
+ /// Processor Patch results in 00000000H.
+ ///
+ UINT32 Checksum;
+} CPU_MICROCODE_EXTENDED_TABLE;
+
+#pragma pack ()
+
+#endif
diff --git a/MdePkg/Include/Register/Intel/Msr.h b/MdePkg/Include/Register/Intel/Msr.h
new file mode 100644
index 0000000000..0857d8bffd
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/Msr.h
@@ -0,0 +1,44 @@
+/** @file
+ MSR Definitions.
+
+ Provides defines for Machine Specific Registers(MSR) indexes. Data structures
+ are provided for MSRs that contain one or more bit fields. If the MSR value
+ returned is a single 32-bit or 64-bit value, then a data structure is not
+ provided for that MSR.
+
+ Copyright (c) 2016 ~ 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Specification Reference:
+ Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 4,
+ May 2018, Volume 4: Model-Specific-Registers (MSR)
+
+**/
+
+#ifndef __INTEL_MSR_H__
+#define __INTEL_MSR_H__
+
+#include <Register/Intel/ArchitecturalMsr.h>
+#include <Register/Intel/Msr/Core2Msr.h>
+#include <Register/Intel/Msr/AtomMsr.h>
+#include <Register/Intel/Msr/SilvermontMsr.h>
+#include <Register/Intel/Msr/GoldmontMsr.h>
+#include <Register/Intel/Msr/GoldmontPlusMsr.h>
+#include <Register/Intel/Msr/NehalemMsr.h>
+#include <Register/Intel/Msr/Xeon5600Msr.h>
+#include <Register/Intel/Msr/XeonE7Msr.h>
+#include <Register/Intel/Msr/SandyBridgeMsr.h>
+#include <Register/Intel/Msr/IvyBridgeMsr.h>
+#include <Register/Intel/Msr/HaswellMsr.h>
+#include <Register/Intel/Msr/HaswellEMsr.h>
+#include <Register/Intel/Msr/BroadwellMsr.h>
+#include <Register/Intel/Msr/XeonDMsr.h>
+#include <Register/Intel/Msr/SkylakeMsr.h>
+#include <Register/Intel/Msr/XeonPhiMsr.h>
+#include <Register/Intel/Msr/Pentium4Msr.h>
+#include <Register/Intel/Msr/CoreMsr.h>
+#include <Register/Intel/Msr/PentiumMMsr.h>
+#include <Register/Intel/Msr/P6Msr.h>
+#include <Register/Intel/Msr/PentiumMsr.h>
+
+#endif
diff --git a/UefiCpuPkg/Include/Register/Msr/AtomMsr.h b/MdePkg/Include/Register/Intel/Msr/AtomMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/AtomMsr.h
rename to MdePkg/Include/Register/Intel/Msr/AtomMsr.h
index 802efe54a6..c174df1535 100644
--- a/UefiCpuPkg/Include/Register/Msr/AtomMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/AtomMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __ATOM_MSR_H__
#define __ATOM_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Atom(TM) Processor Family?
diff --git a/UefiCpuPkg/Include/Register/Msr/BroadwellMsr.h b/MdePkg/Include/Register/Intel/Msr/BroadwellMsr.h
similarity index 95%
rename from UefiCpuPkg/Include/Register/Msr/BroadwellMsr.h
rename to MdePkg/Include/Register/Intel/Msr/BroadwellMsr.h
index e9d39d99c4..d05869e037 100644
--- a/UefiCpuPkg/Include/Register/Msr/BroadwellMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/BroadwellMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __BROADWELL_MSR_H__
#define __BROADWELL_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Broadwell microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/Core2Msr.h b/MdePkg/Include/Register/Intel/Msr/Core2Msr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/Core2Msr.h
rename to MdePkg/Include/Register/Intel/Msr/Core2Msr.h
index a5d66261ec..e9d999cdd5 100644
--- a/UefiCpuPkg/Include/Register/Msr/Core2Msr.h
+++ b/MdePkg/Include/Register/Intel/Msr/Core2Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __CORE2_MSR_H__
#define __CORE2_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Core(TM) 2 Processor Family?
diff --git a/UefiCpuPkg/Include/Register/Msr/CoreMsr.h b/MdePkg/Include/Register/Intel/Msr/CoreMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/CoreMsr.h
rename to MdePkg/Include/Register/Intel/Msr/CoreMsr.h
index 5368db83ba..1e43bc13f5 100644
--- a/UefiCpuPkg/Include/Register/Msr/CoreMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/CoreMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __CORE_MSR_H__
#define __CORE_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel Core Solo and Intel Core Duo Processors?
diff --git a/UefiCpuPkg/Include/Register/Msr/GoldmontMsr.h b/MdePkg/Include/Register/Intel/Msr/GoldmontMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/GoldmontMsr.h
rename to MdePkg/Include/Register/Intel/Msr/GoldmontMsr.h
index a7db0374f8..d44172f29c 100644
--- a/UefiCpuPkg/Include/Register/Msr/GoldmontMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/GoldmontMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __GOLDMONT_MSR_H__
#define __GOLDMONT_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel Atom processors based on the Goldmont microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/GoldmontPlusMsr.h b/MdePkg/Include/Register/Intel/Msr/GoldmontPlusMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/GoldmontPlusMsr.h
rename to MdePkg/Include/Register/Intel/Msr/GoldmontPlusMsr.h
index 635f4cae43..2edc1363b7 100644
--- a/UefiCpuPkg/Include/Register/Msr/GoldmontPlusMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/GoldmontPlusMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __GOLDMONT_PLUS_MSR_H__
#define __GOLDMONT_PLUS_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel Atom processors based on the Goldmont plus microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/HaswellEMsr.h b/MdePkg/Include/Register/Intel/Msr/HaswellEMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/HaswellEMsr.h
rename to MdePkg/Include/Register/Intel/Msr/HaswellEMsr.h
index 6cde974b1d..6c8e29d2ac 100644
--- a/UefiCpuPkg/Include/Register/Msr/HaswellEMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/HaswellEMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __HASWELL_E_MSR_H__
#define __HASWELL_E_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Haswell-E microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/HaswellMsr.h b/MdePkg/Include/Register/Intel/Msr/HaswellMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/HaswellMsr.h
rename to MdePkg/Include/Register/Intel/Msr/HaswellMsr.h
index 3aec00cab2..704a7079f2 100644
--- a/UefiCpuPkg/Include/Register/Msr/HaswellMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/HaswellMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __HASWELL_MSR_H__
#define __HASWELL_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Haswell microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/IvyBridgeMsr.h b/MdePkg/Include/Register/Intel/Msr/IvyBridgeMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/IvyBridgeMsr.h
rename to MdePkg/Include/Register/Intel/Msr/IvyBridgeMsr.h
index fc94f91be0..bc8559d519 100644
--- a/UefiCpuPkg/Include/Register/Msr/IvyBridgeMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/IvyBridgeMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __IVY_BRIDGE_MSR_H__
#define __IVY_BRIDGE_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Ivy Bridge microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/NehalemMsr.h b/MdePkg/Include/Register/Intel/Msr/NehalemMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/NehalemMsr.h
rename to MdePkg/Include/Register/Intel/Msr/NehalemMsr.h
index ada2084654..a21e8a5e85 100644
--- a/UefiCpuPkg/Include/Register/Msr/NehalemMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/NehalemMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __NEHALEM_MSR_H__
#define __NEHALEM_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Nehalem microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/P6Msr.h b/MdePkg/Include/Register/Intel/Msr/P6Msr.h
similarity index 95%
rename from UefiCpuPkg/Include/Register/Msr/P6Msr.h
rename to MdePkg/Include/Register/Intel/Msr/P6Msr.h
index 020349291a..d4af2774d3 100644
--- a/UefiCpuPkg/Include/Register/Msr/P6Msr.h
+++ b/MdePkg/Include/Register/Intel/Msr/P6Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __P6_MSR_H__
#define __P6_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is P6 Family Processors?
diff --git a/UefiCpuPkg/Include/Register/Msr/Pentium4Msr.h b/MdePkg/Include/Register/Intel/Msr/Pentium4Msr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/Pentium4Msr.h
rename to MdePkg/Include/Register/Intel/Msr/Pentium4Msr.h
index 1d66cc2b31..579e4fbd09 100644
--- a/UefiCpuPkg/Include/Register/Msr/Pentium4Msr.h
+++ b/MdePkg/Include/Register/Intel/Msr/Pentium4Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __PENTIUM_4_MSR_H__
#define __PENTIUM_4_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Pentium(R) 4 Processors?
diff --git a/UefiCpuPkg/Include/Register/Msr/PentiumMMsr.h b/MdePkg/Include/Register/Intel/Msr/PentiumMMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/PentiumMMsr.h
rename to MdePkg/Include/Register/Intel/Msr/PentiumMMsr.h
index 869eec1114..4a0e0ba3bd 100644
--- a/UefiCpuPkg/Include/Register/Msr/PentiumMMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/PentiumMMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __PENTIUM_M_MSR_H__
#define __PENTIUM_M_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Pentium M Processors?
diff --git a/UefiCpuPkg/Include/Register/Msr/PentiumMsr.h b/MdePkg/Include/Register/Intel/Msr/PentiumMsr.h
similarity index 93%
rename from UefiCpuPkg/Include/Register/Msr/PentiumMsr.h
rename to MdePkg/Include/Register/Intel/Msr/PentiumMsr.h
index c87212f08f..5907432b7b 100644
--- a/UefiCpuPkg/Include/Register/Msr/PentiumMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/PentiumMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __PENTIUM_MSR_H__
#define __PENTIUM_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Pentium Processors?
diff --git a/UefiCpuPkg/Include/Register/Msr/SandyBridgeMsr.h b/MdePkg/Include/Register/Intel/Msr/SandyBridgeMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/SandyBridgeMsr.h
rename to MdePkg/Include/Register/Intel/Msr/SandyBridgeMsr.h
index 0f977e2a2f..7118bf29ff 100644
--- a/UefiCpuPkg/Include/Register/Msr/SandyBridgeMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/SandyBridgeMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __SANDY_BRIDGE_MSR_H__
#define __SANDY_BRIDGE_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Sandy Bridge microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/SilvermontMsr.h b/MdePkg/Include/Register/Intel/Msr/SilvermontMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/SilvermontMsr.h
rename to MdePkg/Include/Register/Intel/Msr/SilvermontMsr.h
index fc2a8f6c87..cc0dc03c7c 100644
--- a/UefiCpuPkg/Include/Register/Msr/SilvermontMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/SilvermontMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __SILVERMONT_MSR_H__
#define __SILVERMONT_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Silvermont microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/SkylakeMsr.h b/MdePkg/Include/Register/Intel/Msr/SkylakeMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/SkylakeMsr.h
rename to MdePkg/Include/Register/Intel/Msr/SkylakeMsr.h
index 01166e3446..30f96f0e82 100644
--- a/UefiCpuPkg/Include/Register/Msr/SkylakeMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/SkylakeMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __SKYLAKE_MSR_H__
#define __SKYLAKE_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel processors based on the Skylake microarchitecture?
diff --git a/UefiCpuPkg/Include/Register/Msr/Xeon5600Msr.h b/MdePkg/Include/Register/Intel/Msr/Xeon5600Msr.h
similarity index 94%
rename from UefiCpuPkg/Include/Register/Msr/Xeon5600Msr.h
rename to MdePkg/Include/Register/Intel/Msr/Xeon5600Msr.h
index c285d1877f..01293ff293 100644
--- a/UefiCpuPkg/Include/Register/Msr/Xeon5600Msr.h
+++ b/MdePkg/Include/Register/Intel/Msr/Xeon5600Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __XEON_5600_MSR_H__
#define __XEON_5600_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Xeon(R) Processor Series 5600?
diff --git a/UefiCpuPkg/Include/Register/Msr/XeonDMsr.h b/MdePkg/Include/Register/Intel/Msr/XeonDMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/XeonDMsr.h
rename to MdePkg/Include/Register/Intel/Msr/XeonDMsr.h
index dae11c8e30..f742aeb163 100644
--- a/UefiCpuPkg/Include/Register/Msr/XeonDMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/XeonDMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __XEON_D_MSR_H__
#define __XEON_D_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Xeon(R) Processor D product Family?
diff --git a/UefiCpuPkg/Include/Register/Msr/XeonE7Msr.h b/MdePkg/Include/Register/Intel/Msr/XeonE7Msr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/XeonE7Msr.h
rename to MdePkg/Include/Register/Intel/Msr/XeonE7Msr.h
index 2e9b296d51..6e8c61e19b 100644
--- a/UefiCpuPkg/Include/Register/Msr/XeonE7Msr.h
+++ b/MdePkg/Include/Register/Intel/Msr/XeonE7Msr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __XEON_E7_MSR_H__
#define __XEON_E7_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Xeon(R) Processor E7 Family?
diff --git a/UefiCpuPkg/Include/Register/Msr/XeonPhiMsr.h b/MdePkg/Include/Register/Intel/Msr/XeonPhiMsr.h
similarity index 96%
rename from UefiCpuPkg/Include/Register/Msr/XeonPhiMsr.h
rename to MdePkg/Include/Register/Intel/Msr/XeonPhiMsr.h
index 57d71d6a7d..b4dbb52ca5 100644
--- a/UefiCpuPkg/Include/Register/Msr/XeonPhiMsr.h
+++ b/MdePkg/Include/Register/Intel/Msr/XeonPhiMsr.h
@@ -6,7 +6,7 @@
returned is a single 32-bit or 64-bit value, then a data structure is not
provided for that MSR.

- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -18,7 +18,7 @@
#ifndef __XEON_PHI_MSR_H__
#define __XEON_PHI_MSR_H__

-#include <Register/ArchitecturalMsr.h>
+#include <Register/Intel/ArchitecturalMsr.h>

/**
Is Intel(R) Xeon(R) Phi(TM) processor Family?
diff --git a/MdePkg/Include/Register/Intel/SmramSaveStateMap.h b/MdePkg/Include/Register/Intel/SmramSaveStateMap.h
new file mode 100644
index 0000000000..81aa6c3c66
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/SmramSaveStateMap.h
@@ -0,0 +1,184 @@
+/** @file
+SMRAM Save State Map Definitions.
+
+SMRAM Save State Map definitions based on contents of the
+Intel(R) 64 and IA-32 Architectures Software Developer's Manual
+ Volume 3C, Section 34.4 SMRAM
+ Volume 3C, Section 34.5 SMI Handler Execution Environment
+ Volume 3C, Section 34.7 Managing Synchronous and Asynchronous SMIs
+
+Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __INTEL_SMRAM_SAVE_STATE_MAP_H__
+#define __INTEL_SMRAM_SAVE_STATE_MAP_H__
+
+///
+/// Default SMBASE address
+///
+#define SMM_DEFAULT_SMBASE 0x30000
+
+///
+/// Offset of SMM handler from SMBASE
+///
+#define SMM_HANDLER_OFFSET 0x8000
+
+///
+/// Offset of SMRAM Save State Map from SMBASE
+///
+#define SMRAM_SAVE_STATE_MAP_OFFSET 0xfc00
+
+#pragma pack (1)
+
+///
+/// 32-bit SMRAM Save State Map
+///
+typedef struct {
+ UINT8 Reserved[0x200]; // 7c00h
+ // Padded an extra 0x200 bytes so 32-bit and 64-bit
+ // SMRAM Save State Maps are the same size
+ UINT8 Reserved1[0xf8]; // 7e00h
+ UINT32 SMBASE; // 7ef8h
+ UINT32 SMMRevId; // 7efch
+ UINT16 IORestart; // 7f00h
+ UINT16 AutoHALTRestart; // 7f02h
+ UINT8 Reserved2[0x9C]; // 7f08h
+ UINT32 IOMemAddr; // 7fa0h
+ UINT32 IOMisc; // 7fa4h
+ UINT32 _ES; // 7fa8h
+ UINT32 _CS; // 7fach
+ UINT32 _SS; // 7fb0h
+ UINT32 _DS; // 7fb4h
+ UINT32 _FS; // 7fb8h
+ UINT32 _GS; // 7fbch
+ UINT32 Reserved3; // 7fc0h
+ UINT32 _TR; // 7fc4h
+ UINT32 _DR7; // 7fc8h
+ UINT32 _DR6; // 7fcch
+ UINT32 _EAX; // 7fd0h
+ UINT32 _ECX; // 7fd4h
+ UINT32 _EDX; // 7fd8h
+ UINT32 _EBX; // 7fdch
+ UINT32 _ESP; // 7fe0h
+ UINT32 _EBP; // 7fe4h
+ UINT32 _ESI; // 7fe8h
+ UINT32 _EDI; // 7fech
+ UINT32 _EIP; // 7ff0h
+ UINT32 _EFLAGS; // 7ff4h
+ UINT32 _CR3; // 7ff8h
+ UINT32 _CR0; // 7ffch
+} SMRAM_SAVE_STATE_MAP32;
+
+///
+/// 64-bit SMRAM Save State Map
+///
+typedef struct {
+ UINT8 Reserved1[0x1d0]; // 7c00h
+ UINT32 GdtBaseHiDword; // 7dd0h
+ UINT32 LdtBaseHiDword; // 7dd4h
+ UINT32 IdtBaseHiDword; // 7dd8h
+ UINT8 Reserved2[0xc]; // 7ddch
+ UINT64 IO_EIP; // 7de8h
+ UINT8 Reserved3[0x50]; // 7df0h
+ UINT32 _CR4; // 7e40h
+ UINT8 Reserved4[0x48]; // 7e44h
+ UINT32 GdtBaseLoDword; // 7e8ch
+ UINT32 Reserved5; // 7e90h
+ UINT32 IdtBaseLoDword; // 7e94h
+ UINT32 Reserved6; // 7e98h
+ UINT32 LdtBaseLoDword; // 7e9ch
+ UINT8 Reserved7[0x38]; // 7ea0h
+ UINT64 EptVmxControl; // 7ed8h
+ UINT32 EnEptVmxControl; // 7ee0h
+ UINT8 Reserved8[0x14]; // 7ee4h
+ UINT32 SMBASE; // 7ef8h
+ UINT32 SMMRevId; // 7efch
+ UINT16 IORestart; // 7f00h
+ UINT16 AutoHALTRestart; // 7f02h
+ UINT8 Reserved9[0x18]; // 7f04h
+ UINT64 _R15; // 7f1ch
+ UINT64 _R14;
+ UINT64 _R13;
+ UINT64 _R12;
+ UINT64 _R11;
+ UINT64 _R10;
+ UINT64 _R9;
+ UINT64 _R8;
+ UINT64 _RAX; // 7f5ch
+ UINT64 _RCX;
+ UINT64 _RDX;
+ UINT64 _RBX;
+ UINT64 _RSP;
+ UINT64 _RBP;
+ UINT64 _RSI;
+ UINT64 _RDI;
+ UINT64 IOMemAddr; // 7f9ch
+ UINT32 IOMisc; // 7fa4h
+ UINT32 _ES; // 7fa8h
+ UINT32 _CS;
+ UINT32 _SS;
+ UINT32 _DS;
+ UINT32 _FS;
+ UINT32 _GS;
+ UINT32 _LDTR; // 7fc0h
+ UINT32 _TR;
+ UINT64 _DR7; // 7fc8h
+ UINT64 _DR6;
+ UINT64 _RIP; // 7fd8h
+ UINT64 IA32_EFER; // 7fe0h
+ UINT64 _RFLAGS; // 7fe8h
+ UINT64 _CR3; // 7ff0h
+ UINT64 _CR0; // 7ff8h
+} SMRAM_SAVE_STATE_MAP64;
+
+///
+/// Union of 32-bit and 64-bit SMRAM Save State Maps
+///
+typedef union {
+ SMRAM_SAVE_STATE_MAP32 x86;
+ SMRAM_SAVE_STATE_MAP64 x64;
+} SMRAM_SAVE_STATE_MAP;
+
+///
+/// Minimum SMM Revision ID that supports IOMisc field in SMRAM Save State Map
+///
+#define SMRAM_SAVE_STATE_MIN_REV_ID_IOMISC 0x30004
+
+///
+/// SMRAM Save State Map IOMisc I/O Length Values
+///
+#define SMM_IO_LENGTH_BYTE 0x01
+#define SMM_IO_LENGTH_WORD 0x02
+#define SMM_IO_LENGTH_DWORD 0x04
+
+///
+/// SMRAM Save State Map IOMisc I/O Instruction Type Values
+///
+#define SMM_IO_TYPE_IN_IMMEDIATE 0x9
+#define SMM_IO_TYPE_IN_DX 0x1
+#define SMM_IO_TYPE_OUT_IMMEDIATE 0x8
+#define SMM_IO_TYPE_OUT_DX 0x0
+#define SMM_IO_TYPE_INS 0x3
+#define SMM_IO_TYPE_OUTS 0x2
+#define SMM_IO_TYPE_REP_INS 0x7
+#define SMM_IO_TYPE_REP_OUTS 0x6
+
+///
+/// SMRAM Save State Map IOMisc structure
+///
+typedef union {
+ struct {
+ UINT32 SmiFlag:1;
+ UINT32 Length:3;
+ UINT32 Type:4;
+ UINT32 Reserved1:8;
+ UINT32 Port:16;
+ } Bits;
+ UINT32 Uint32;
+} SMRAM_SAVE_STATE_IOMISC;
+
+#pragma pack ()
+
+#endif
diff --git a/MdePkg/Include/Register/Intel/StmApi.h b/MdePkg/Include/Register/Intel/StmApi.h
new file mode 100644
index 0000000000..63f215ca34
--- /dev/null
+++ b/MdePkg/Include/Register/Intel/StmApi.h
@@ -0,0 +1,948 @@
+/** @file
+ STM API definition
+
+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Specification Reference:
+ SMI Transfer Monitor (STM) User Guide Revision 1.00
+
+**/
+
+#ifndef _INTEL_STM_API_H_
+#define _INTEL_STM_API_H_
+
+#include <Register/Intel/StmStatusCode.h>
+#include <Register/Intel/StmResourceDescriptor.h>
+#include <Register/Intel/ArchitecturalMsr.h>
+
+#pragma pack (1)
+
+/**
+ STM Header Structures
+**/
+
+typedef struct {
+ UINT32 Intel64ModeSupported :1; ///> bitfield
+ UINT32 EptSupported :1; ///> bitfield
+ UINT32 Reserved :30; ///> must be 0
+} STM_FEAT;
+
+#define STM_SPEC_VERSION_MAJOR 1
+#define STM_SPEC_VERSION_MINOR 0
+
+typedef struct {
+ UINT8 StmSpecVerMajor;
+ UINT8 StmSpecVerMinor;
+ ///
+ /// Must be zero
+ ///
+ UINT16 Reserved;
+ UINT32 StaticImageSize;
+ UINT32 PerProcDynamicMemorySize;
+ UINT32 AdditionalDynamicMemorySize;
+ STM_FEAT StmFeatures;
+ UINT32 NumberOfRevIDs;
+ UINT32 StmSmmRevID[1];
+ ///
+ /// The total STM_HEADER should be 4K.
+ ///
+} SOFTWARE_STM_HEADER;
+
+typedef struct {
+ MSEG_HEADER HwStmHdr;
+ SOFTWARE_STM_HEADER SwStmHdr;
+} STM_HEADER;
+
+
+/**
+ VMCALL API Numbers
+ API number convention: BIOS facing VMCALL interfaces have bit 16 clear
+**/
+
+/**
+ StmMapAddressRange enables a SMM guest to create a non-1:1 virtual to
+ physical mapping of an address range into the SMM guest's virtual
+ memory space.
+
+ @param EAX #STM_API_MAP_ADDRESS_RANGE (0x00000001)
+ @param EBX Low 32 bits of physical address of caller allocated
+ STM_MAP_ADDRESS_RANGE_DESCRIPTOR structure.
+ @param ECX High 32 bits of physical address of caller allocated
+ STM_MAP_ADDRESS_RANGE_DESCRIPTOR structure. If Intel64Mode is
+ clear (0), ECX must be 0.
+
+ @note All fields of STM_MAP_ADDRESS_RANGE_DESCRIPTOR are inputs only. They
+ are not modified by StmMapAddressRange.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS.
+ The memory range was mapped as requested.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_SECURITY_VIOLATION
+ The requested mapping contains a protected resource.
+ @retval EAX #ERROR_STM_CACHE_TYPE_NOT_SUPPORTED
+ The requested cache type could not be satisfied.
+ @retval EAX #ERROR_STM_PAGE_NOT_FOUND
+ Page count must not be zero.
+ @retval EAX #ERROR_STM_FUNCTION_NOT_SUPPORTED
+ STM supports EPT and has not implemented StmMapAddressRange().
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_MAP_ADDRESS_RANGE 0x00000001
+
+/**
+ STM Map Address Range Descriptor for #STM_API_MAP_ADDRESS_RANGE VMCALL
+**/
+typedef struct {
+ UINT64 PhysicalAddress;
+ UINT64 VirtualAddress;
+ UINT32 PageCount;
+ UINT32 PatCacheType;
+} STM_MAP_ADDRESS_RANGE_DESCRIPTOR;
+
+/**
+ Define values for PatCacheType field of #STM_MAP_ADDRESS_RANGE_DESCRIPTOR
+ @{
+**/
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_ST_UC 0x00
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WC 0x01
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WT 0x04
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WP 0x05
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WB 0x06
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_UC 0x07
+#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_FOLLOW_MTRR 0xFFFFFFFF
+/// @}
+
+/**
+ StmUnmapAddressRange enables a SMM guest to remove mappings from its page
+ table.
+
+ If TXT_PROCESSOR_SMM_DESCRIPTOR.EptEnabled bit is set by the STM, BIOS can
+ control its own page tables. In this case, the STM implementation may
+ optionally return ERROR_STM_FUNCTION_NOT_SUPPORTED.
+
+ @param EAX #STM_API_UNMAP_ADDRESS_RANGE (0x00000002)
+ @param EBX Low 32 bits of virtual address of caller allocated
+ STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR structure.
+ @param ECX High 32 bits of virtual address of caller allocated
+ STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR structure. If Intel64Mode is
+ clear (0), ECX must be zero.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The memory range was unmapped
+ as requested.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_FUNCTION_NOT_SUPPORTED
+ STM supports EPT and has not implemented StmUnmapAddressRange().
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_UNMAP_ADDRESS_RANGE 0x00000002
+
+/**
+ STM Unmap Address Range Descriptor for #STM_API_UNMAP_ADDRESS_RANGE VMCALL
+**/
+typedef struct {
+ UINT64 VirtualAddress;
+ UINT32 Length;
+} STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR;
+
+
+/**
+ Since the normal OS environment runs with a different set of page tables than
+ the SMM guest, virtual mappings will certainly be different. In order to do a
+ guest virtual to host physical translation of an address from the normal OS
+ code (EIP for example), it is necessary to walk the page tables governing the
+ OS page mappings. Since the SMM guest has no direct access to the page tables,
+ it must ask the STM to do this page table walk. This is supported via the
+ StmAddressLookup VMCALL. All OS page table formats need to be supported,
+ (e.g. PAE, PSE, Intel64, EPT, etc.)
+
+ StmAddressLookup takes a CR3 value and a virtual address from the interrupted
+ code as input and returns the corresponding physical address. It also
+ optionally maps the physical address into the SMM guest's virtual address
+ space. This new mapping persists ONLY for the duration of the SMI and if
+ needed in subsequent SMIs it must be remapped. PAT cache types follow the
+ interrupted environment's page table.
+
+ If EPT is enabled, OS CR3 only provides guest physical address information,
+ but the SMM guest might also need to know the host physical address. Since
+ SMM does not have direct access rights to EPT (it is protected by the STM),
+ SMM can input InterruptedEptp to let STM help to walk through it, and output
+ the host physical address.
+
+ @param EAX #STM_API_ADDRESS_LOOKUP (0x00000003)
+ @param EBX Low 32 bits of virtual address of caller allocated
+ STM_ADDRESS_LOOKUP_DESCRIPTOR structure.
+ @param ECX High 32 bits of virtual address of caller allocated
+ STM_ADDRESS_LOOKUP_DESCRIPTOR structure. If Intel64Mode is
+ clear (0), ECX must be zero.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. PhysicalAddress contains the
+ host physical address determined by walking the interrupted SMM
+ guest's page tables. SmmGuestVirtualAddress contains the SMM
+ guest's virtual mapping of the requested address.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_SECURITY_VIOLATION
+ The requested page was a protected page.
+ @retval EAX #ERROR_STM_PAGE_NOT_FOUND
+ The requested virtual address did not exist in the page given
+ page table.
+ @retval EAX #ERROR_STM_BAD_CR3
+ The CR3 input was invalid. CR3 values must be from one of the
+ interrupted guest, or from the interrupted guest of another
+ processor.
+ @retval EAX #ERROR_STM_PHYSICAL_OVER_4G
+ The resulting physical address is greater than 4G and no virtual
+ address was supplied. The STM could not determine what address
+ within the SMM guest's virtual address space to do the mapping.
+ STM_ADDRESS_LOOKUP_DESCRIPTOR field PhysicalAddress contains the
+ physical address determined by walking the interrupted
+ environment's page tables.
+ @retval EAX #ERROR_STM_VIRTUAL_SPACE_TOO_SMALL
+ A specific virtual mapping was requested, but
+ SmmGuestVirtualAddress + Length exceeds 4G and the SMI handler
+ is running in 32 bit mode.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_ADDRESS_LOOKUP 0x00000003
+
+/**
+ STM Lookup Address Range Descriptor for #STM_API_ADDRESS_LOOKUP VMCALL
+**/
+typedef struct {
+ UINT64 InterruptedGuestVirtualAddress;
+ UINT32 Length;
+ UINT64 InterruptedCr3;
+ UINT64 InterruptedEptp;
+ UINT32 MapToSmmGuest:2;
+ UINT32 InterruptedCr4Pae:1;
+ UINT32 InterruptedCr4Pse:1;
+ UINT32 InterruptedIa32eMode:1;
+ UINT32 Reserved1:27;
+ UINT32 Reserved2;
+ UINT64 PhysicalAddress;
+ UINT64 SmmGuestVirtualAddress;
+} STM_ADDRESS_LOOKUP_DESCRIPTOR;
+
+/**
+ Define values for the MapToSmmGuest field of #STM_ADDRESS_LOOKUP_DESCRIPTOR
+ @{
+**/
+#define STM_ADDRESS_LOOKUP_DESCRIPTOR_DO_NOT_MAP 0
+#define STM_ADDRESS_LOOKUP_DESCRIPTOR_ONE_TO_ONE 1
+#define STM_ADDRESS_LOOKUP_DESCRIPTOR_VIRTUAL_ADDRESS_SPECIFIED 3
+/// @}
+
+
+/**
+ When returning from a protection exception (see section 6.2), the SMM guest
+ can instruct the STM to take one of two paths. It can either request a value
+ be logged to the TXT.ERRORCODE register and subsequently reset the machine
+ (indicating it couldn't resolve the problem), or it can request that the STM
+ resume the SMM guest again with the specified register state.
+
+ Unlike other VMCALL interfaces, StmReturnFromProtectionException behaves more
+ like a jump or an IRET instruction than a "call". It does not return directly
+ to the caller, but indirectly to a different location specified on the
+ caller's stack (see section 6.2) or not at all.
+
+ If the SMM guest STM protection exception handler itself causes a protection
+ exception (e.g. a single nested exception), or more than 100 un-nested
+ exceptions occur within the scope of a single SMI event, the STM must write
+ STM_CRASH_PROTECTION_EXCEPTION_FAILURE to the TXT.ERRORCODE register and
+ assert TXT.CMD.SYS_RESET. The reason for these restrictions is to simplify
+ the code requirements while still enabling a reasonable debugging capability.
+
+ @param EAX #STM_API_RETURN_FROM_PROTECTION_EXCEPTION (0x00000004)
+ @param EBX If 0, resume SMM guest using register state found on exception
+ stack. If in range 0x01..0x0F, EBX contains a BIOS error code
+ which the STM must record in the TXT.ERRORCODE register and
+ subsequently reset the system via TXT.CMD.SYS_RESET. The value
+ of the TXT.ERRORCODE register is calculated as follows:
+
+ TXT.ERRORCODE = (EBX & 0x0F) | STM_CRASH_BIOS_PANIC
+
+ Values 0x10..0xFFFFFFFF are reserved, do not use.
+
+**/
+#define STM_API_RETURN_FROM_PROTECTION_EXCEPTION 0x00000004
+
+
+/**
+ VMCALL API Numbers
+ API number convention: MLE facing VMCALL interfaces have bit 16 set.
+
+ The STM configuration lifecycle is as follows:
+ 1. SENTER->SINIT->MLE: MLE begins execution with SMI disabled (masked).
+ 2. MLE invokes #STM_API_INITIALIZE_PROTECTION VMCALL to prepare STM for
+ setup of initial protection profile. This is done on a single CPU and
+ has global effect.
+ 3. MLE invokes #STM_API_PROTECT_RESOURCE VMCALL to define the initial
+ protection profile. The protection profile is global across all CPUs.
+ 4. MLE invokes #STM_API_START VMCALL to enable the STM to begin receiving
+ SMI events. This must be done on every logical CPU.
+ 5. MLE may invoke #STM_API_PROTECT_RESOURCE VMCALL or
+ #STM_API_UNPROTECT_RESOURCE VMCALL during runtime as many times as
+ necessary.
+ 6. MLE invokes #STM_API_STOP VMCALL to disable the STM. SMI is again masked
+ following #STM_API_STOP VMCALL.
+**/
+
+/**
+ StartStmVmcall() is used to configure an STM that is present in MSEG. SMIs
+ should remain disabled from the invocation of GETSEC[SENTER] until they are
+ re-enabled by StartStmVMCALL(). When StartStmVMCALL() returns, SMI is
+ enabled and the STM has been started and is active. Prior to invoking
+ StartStmVMCALL(), the MLE root should first invoke
+ InitializeProtectionVMCALL() followed by as many iterations of
+ ProtectResourceVMCALL() as necessary to establish the initial protection
+ profile. StartStmVmcall() must be invoked on all processor threads.
+
+ @param EAX #STM_API_START (0x00010001)
+ @param EDX STM configuration options. These provide the MLE with the
+ ability to pass configuration parameters to the STM.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The STM has been configured
+ and is now active and the guarding all requested resources.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_ALREADY_STARTED
+ The STM is already configured and active. STM remains active and
+ guarding previously enabled resource list.
+ @retval EAX #ERROR_STM_WITHOUT_SMX_UNSUPPORTED
+ The StartStmVMCALL() was invoked from VMX root mode, but outside
+ of SMX. This error code indicates the STM or platform does not
+ support the STM outside of SMX. The SMI handler remains active
+ and operates in legacy mode. See Appendix C
+ @retval EAX #ERROR_STM_UNSUPPORTED_MSR_BIT
+ The CPU doesn't support the MSR bit. The STM is not active.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_START (BIT16 | 1)
+
+/**
+ Bit values for EDX input parameter to #STM_API_START VMCALL
+ @{
+**/
+#define STM_CONFIG_SMI_UNBLOCKING_BY_VMX_OFF BIT0
+/// @}
+
+
+/**
+ The StopStmVMCALL() is invoked by the MLE to teardown an active STM. This is
+ normally done as part of a full teardown of the SMX environment when the
+ system is being shut down. At the time the call is invoked, SMI is enabled
+ and the STM is active. When the call returns, the STM has been stopped and
+ all STM context is discarded and SMI is disabled.
+
+ @param EAX #STM_API_STOP (0x00010002)
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The STM has been stopped and
+ is no longer processing SMI events. SMI is blocked.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_STOPPED
+ The STM was not active.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_STOP (BIT16 | 2)
+
+
+/**
+ The ProtectResourceVMCALL() is invoked by the MLE root to request protection
+ of specific resources. The request is defined by a STM_RESOURCE_LIST, which
+ may contain more than one resource descriptor. Each resource descriptor is
+ processed separately by the STM. Whether or not protection for any specific
+ resource is granted is returned by the STM via the ReturnStatus bit in the
+ associated STM_RSC_DESC_HEADER.
+
+ @param EAX #STM_API_PROTECT_RESOURCE (0x00010003)
+ @param EBX Low 32 bits of physical address of caller allocated
+ STM_RESOURCE_LIST. Bits 11:0 are ignored and assumed to be zero,
+ making the buffer 4K aligned.
+ @param ECX High 32 bits of physical address of caller allocated
+ STM_RESOURCE_LIST.
+
+ @note All fields of STM_RESOURCE_LIST are inputs only, except for the
+ ReturnStatus bit. On input, the ReturnStatus bit must be clear. On
+ return, the ReturnStatus bit is set for each resource request granted,
+ and clear for each resource request denied. There are no other fields
+ modified by ProtectResourceVMCALL(). The STM_RESOURCE_LIST must be
+ contained entirely within a single 4K page.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The STM has successfully
+ merged the entire protection request into the active protection
+ profile. There is therefore no need to check the ReturnStatus
+ bits in the STM_RESOURCE_LIST.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_UNPROTECTABLE_RESOURCE
+ At least one of the requested resource protections intersects a
+ BIOS required resource. Therefore, the caller must walk through
+ the STM_RESOURCE_LIST to determine which of the requested
+ resources was not granted protection. The entire list must be
+ traversed since there may be multiple failures.
+ @retval EAX #ERROR_STM_MALFORMED_RESOURCE_LIST
+ The resource list could not be parsed correctly, or did not
+ terminate before crossing a 4K page boundary. The caller must
+ walk through the STM_RESOURCE_LIST to determine which of the
+ requested resources was not granted protection. The entire list
+ must be traversed since there may be multiple failures.
+ @retval EAX #ERROR_STM_OUT_OF_RESOURCES
+ The STM has encountered an internal error and cannot complete
+ the request.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_PROTECT_RESOURCE (BIT16 | 3)
+
+
+/**
+ The UnProtectResourceVMCALL() is invoked by the MLE root to request that the
+ STM allow the SMI handler access to the specified resources.
+
+ @param EAX #STM_API_UNPROTECT_RESOURCE (0x00010004)
+ @param EBX Low 32 bits of physical address of caller allocated
+ STM_RESOURCE_LIST. Bits 11:0 are ignored and assumed to be zero,
+ making the buffer 4K aligned.
+ @param ECX High 32 bits of physical address of caller allocated
+ STM_RESOURCE_LIST.
+
+ @note All fields of STM_RESOURCE_LIST are inputs only, except for the
+ ReturnStatus bit. On input, the ReturnStatus bit must be clear. On
+ return, the ReturnStatus bit is set for each resource processed. For
+ a properly formed STM_RESOURCE_LIST, this should be all resources
+ listed. There are no other fields modified by
+ UnProtectResourceVMCALL(). The STM_RESOURCE_LIST must be contained
+ entirely within a single 4K page.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The requested resources are
+ not being guarded by the STM.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_MALFORMED_RESOURCE_LIST
+ The resource list could not be parsed correctly, or did not
+ terminate before crossing a 4K page boundary. The caller must
+ walk through the STM_RESOURCE_LIST to determine which of the
+ requested resources were not able to be unprotected. The entire
+ list must be traversed since there may be multiple failures.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_UNPROTECT_RESOURCE (BIT16 | 4)
+
+
+/**
+ The GetBiosResourcesVMCALL() is invoked by the MLE root to request the list
+ of BIOS required resources from the STM.
+
+ @param EAX #STM_API_GET_BIOS_RESOURCES (0x00010005)
+ @param EBX Low 32 bits of physical address of caller allocated destination
+ buffer. Bits 11:0 are ignored and assumed to be zero, making the
+ buffer 4K aligned.
+ @param ECX High 32 bits of physical address of caller allocated destination
+ buffer.
+ @param EDX Indicates which page of the BIOS resource list to copy into the
+ destination buffer. The first page is indicated by 0, the second
+ page by 1, etc.
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS. The destination buffer
+ contains the BIOS required resources. If the page retrieved is
+ the last page, EDX will be cleared to 0. If there are more pages
+ to retrieve, EDX is incremented to the next page index. Calling
+ software should iterate on GetBiosResourcesVMCALL() until EDX is
+ returned cleared to 0.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_PAGE_NOT_FOUND
+ The page index supplied in EDX input was out of range.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+ @retval EDX Page index of next page to read. A return of EDX=0 signifies
+ that the entire list has been read.
+ @note EDX is both an input and an output register.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_GET_BIOS_RESOURCES (BIT16 | 5)
+
+
+/**
+ The ManageVmcsDatabaseVMCALL() is invoked by the MLE root to add or remove an
+ MLE guest (including the MLE root) from the list of protected domains.
+
+ @param EAX #STM_API_MANAGE_VMCS_DATABASE (0x00010006)
+ @param EBX Low 32 bits of physical address of caller allocated
+ STM_VMCS_DATABASE_REQUEST. Bits 11:0 are ignored and assumed to
+ be zero, making the buffer 4K aligned.
+ @param ECX High 32 bits of physical address of caller allocated
+ STM_VMCS_DATABASE_REQUEST.
+
+ @note All fields of STM_VMCS_DATABASE_REQUEST are inputs only. They are not
+ modified by ManageVmcsDatabaseVMCALL().
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_INVALID_VMCS
+ Indicates a request to remove a VMCS from the database was made,
+ but the referenced VMCS was not found in the database.
+ @retval EAX #ERROR_STM_VMCS_PRESENT
+ Indicates a request to add a VMCS to the database was made, but
+ the referenced VMCS was already present in the database.
+ @retval EAX #ERROR_INVALID_PARAMETER
+ Indicates non-zero reserved field.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred
+
+ @note All other registers unmodified.
+**/
+#define STM_API_MANAGE_VMCS_DATABASE (BIT16 | 6)
+
+/**
+ STM VMCS Database Request for #STM_API_MANAGE_VMCS_DATABASE VMCALL
+**/
+typedef struct {
+ ///
+ /// bits 11:0 are reserved and must be 0
+ ///
+ UINT64 VmcsPhysPointer;
+ UINT32 DomainType :4;
+ UINT32 XStatePolicy :2;
+ UINT32 DegradationPolicy :4;
+ ///
+ /// Must be 0
+ ///
+ UINT32 Reserved1 :22;
+ UINT32 AddOrRemove;
+} STM_VMCS_DATABASE_REQUEST;
+
+/**
+ Values for the DomainType field of #STM_VMCS_DATABASE_REQUEST
+ @{
+**/
+#define DOMAIN_UNPROTECTED 0
+#define DOMAIN_DISALLOWED_IO_OUT BIT0
+#define DOMAIN_DISALLOWED_IO_IN BIT1
+#define DOMAIN_INTEGRITY BIT2
+#define DOMAIN_CONFIDENTIALITY BIT3
+#define DOMAIN_INTEGRITY_PROT_OUT_IN (DOMAIN_INTEGRITY)
+#define DOMAIN_FULLY_PROT_OUT_IN (DOMAIN_CONFIDENTIALITY | DOMAIN_INTEGRITY)
+#define DOMAIN_FULLY_PROT (DOMAIN_FULLY_PROT_OUT_IN | DOMAIN_DISALLOWED_IO_IN | DOMAIN_DISALLOWED_IO_OUT)
+/// @}
+
+/**
+ Values for the XStatePolicy field of #STM_VMCS_DATABASE_REQUEST
+ @{
+**/
+#define XSTATE_READWRITE 0x00
+#define XSTATE_READONLY 0x01
+#define XSTATE_SCRUB 0x03
+/// @}
+
+/**
+ Values for the AddOrRemove field of #STM_VMCS_DATABASE_REQUEST
+ @{
+**/
+#define STM_VMCS_DATABASE_REQUEST_ADD 1
+#define STM_VMCS_DATABASE_REQUEST_REMOVE 0
+/// @}
+
+
+/**
+ InitializeProtectionVMCALL() prepares the STM for setup of the initial
+ protection profile which is subsequently communicated via one or more
+ invocations of ProtectResourceVMCALL(), prior to invoking StartStmVMCALL().
+ It is only necessary to invoke InitializeProtectionVMCALL() on one processor
+ thread. InitializeProtectionVMCALL() does not alter whether SMIs are masked
+ or unmasked. The STM should return back to the MLE with "Blocking by SMI" set
+ to 1 in the GUEST_INTERRUPTIBILITY field for the VMCS the STM created for the
+ MLE guest.
+
+ @param EAX #STM_API_INITIALIZE_PROTECTION (0x00010007)
+
+ @retval CF 0
+ No error, EAX set to STM_SUCCESS, EBX bits set to indicate STM
+ capabilities as defined below. The STM has set up an empty
+ protection profile, except for the resources that it sets up to
+ protect itself. The STM must not allow the SMI handler to map
+ any pages from the MSEG Base to the top of TSEG. The STM must
+ also not allow SMI handler access to those MSRs which the STM
+ requires for its own protection.
+ @retval CF 1
+ An error occurred, EAX holds relevant error value.
+ @retval EAX #ERROR_STM_ALREADY_STARTED
+ The STM is already configured and active. The STM remains active
+ and guarding the previously enabled resource list.
+ @retval EAX #ERROR_STM_UNPROTECTABLE
+ The STM determines that based on the platform configuration, the
+ STM is unable to protect itself. For example, the BIOS required
+ resource list contains memory pages in MSEG.
+ @retval EAX #ERROR_STM_UNSPECIFIED
+ An unspecified error occurred.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_INITIALIZE_PROTECTION (BIT16 | 7)
+
+/**
+ Byte granular support bits returned in EBX from #STM_API_INITIALIZE_PROTECTION
+ @{
+**/
+#define STM_RSC_BGI BIT1
+#define STM_RSC_BGM BIT2
+#define STM_RSC_MSR BIT3
+/// @}
+
+
+/**
+ The ManageEventLogVMCALL() is invoked by the MLE root to control the logging
+ feature. It consists of several sub-functions to facilitate establishment of
+ the log itself, configuring what events will be logged, and functions to
+ start, stop, and clear the log.
+
+ @param EAX #STM_API_MANAGE_EVENT_LOG (0x00010008)
+ @param EBX Low 32 bits of physical address of caller allocated
+ STM_EVENT_LOG_MANAGEMENT_REQUEST. Bits 11:0 are ignored and
+ assumed to be zero, making the buffer 4K aligned.
+ @param ECX High 32 bits of physical address of caller allocated
+ STM_EVENT_LOG_MANAGEMENT_REQUEST.
+
+ @retval CF=0
+ No error, EAX set to STM_SUCCESS.
+ @retval CF=1
+ An error occurred, EAX holds relevant error value. See subfunction
+ descriptions below for details.
+
+ @note All other registers unmodified.
+**/
+#define STM_API_MANAGE_EVENT_LOG (BIT16 | 8)
+
+///
+/// STM Event Log Management Request for #STM_API_MANAGE_EVENT_LOG VMCALL
+///
+typedef struct {
+ UINT32 SubFunctionIndex;
+ union {
+ struct {
+ UINT32 PageCount;
+ //
+ // number of elements is PageCount
+ //
+ UINT64 Pages[];
+ } LogBuffer;
+ //
+ // bitmap of EVENT_TYPE
+ //
+ UINT32 EventEnableBitmap;
+ } Data;
+} STM_EVENT_LOG_MANAGEMENT_REQUEST;
+
+/**
+ Defines values for the SubFunctionIndex field of
+ #STM_EVENT_LOG_MANAGEMENT_REQUEST
+ @{
+**/
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_NEW_LOG 1
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_CONFIGURE_LOG 2
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_START_LOG 3
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_STOP_LOG 4
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_CLEAR_LOG 5
+#define STM_EVENT_LOG_MANAGEMENT_REQUEST_DELETE_LOG 6
+/// @}
+
+/**
+ Log Entry Header
+**/
+typedef struct {
+ UINT32 EventSerialNumber;
+ UINT16 Type;
+ UINT16 Lock :1;
+ UINT16 Valid :1;
+ UINT16 ReadByMle :1;
+ UINT16 Wrapped :1;
+ UINT16 Reserved :12;
+} LOG_ENTRY_HEADER;
+
+/**
+ Enum values for the Type field of #LOG_ENTRY_HEADER
+**/
+typedef enum {
+ EvtLogStarted,
+ EvtLogStopped,
+ EvtLogInvalidParameterDetected,
+ EvtHandledProtectionException,
+ ///
+ /// unhandled protection exceptions result in reset & cannot be logged
+ ///
+ EvtBiosAccessToUnclaimedResource,
+ EvtMleResourceProtectionGranted,
+ EvtMleResourceProtectionDenied,
+ EvtMleResourceUnprotect,
+ EvtMleResourceUnprotectError,
+ EvtMleDomainTypeDegraded,
+ ///
+ /// add more here
+ ///
+ EvtMleMax,
+ ///
+ /// Not used
+ ///
+ EvtInvalid = 0xFFFFFFFF,
+} EVENT_TYPE;
+
+typedef struct {
+ UINT32 Reserved;
+} ENTRY_EVT_LOG_STARTED;
+
+typedef struct {
+ UINT32 Reserved;
+} ENTRY_EVT_LOG_STOPPED;
+
+typedef struct {
+ UINT32 VmcallApiNumber;
+} ENTRY_EVT_LOG_INVALID_PARAM;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_MLE_RSC_PROT_GRANTED;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_MLE_RSC_PROT_DENIED;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_MLE_RSC_UNPROT;
+
+typedef struct {
+ STM_RSC Resource;
+} ENTRY_EVT_MLE_RSC_UNPROT_ERROR;
+
+typedef struct {
+ UINT64 VmcsPhysPointer;
+ UINT8 ExpectedDomainType;
+ UINT8 DegradedDomainType;
+} ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED;
+
+typedef union {
+ ENTRY_EVT_LOG_STARTED Started;
+ ENTRY_EVT_LOG_STOPPED Stopped;
+ ENTRY_EVT_LOG_INVALID_PARAM InvalidParam;
+ ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION HandledProtectionException;
+ ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC BiosUnclaimedRsc;
+ ENTRY_EVT_MLE_RSC_PROT_GRANTED MleRscProtGranted;
+ ENTRY_EVT_MLE_RSC_PROT_DENIED MleRscProtDenied;
+ ENTRY_EVT_MLE_RSC_UNPROT MleRscUnprot;
+ ENTRY_EVT_MLE_RSC_UNPROT_ERROR MleRscUnprotError;
+ ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED MleDomainTypeDegraded;
+} LOG_ENTRY_DATA;
+
+typedef struct {
+ LOG_ENTRY_HEADER Hdr;
+ LOG_ENTRY_DATA Data;
+} STM_LOG_ENTRY;
+
+/**
+ Maximum STM Log Entry Size
+**/
+#define STM_LOG_ENTRY_SIZE 256
+
+
+/**
+ STM Protection Exception Stack Frame Structures
+**/
+
+typedef struct {
+ UINT32 Rdi;
+ UINT32 Rsi;
+ UINT32 Rbp;
+ UINT32 Rdx;
+ UINT32 Rcx;
+ UINT32 Rbx;
+ UINT32 Rax;
+ UINT32 Cr3;
+ UINT32 Cr2;
+ UINT32 Cr0;
+ UINT32 VmcsExitInstructionInfo;
+ UINT32 VmcsExitInstructionLength;
+ UINT64 VmcsExitQualification;
+ ///
+ /// An TXT_SMM_PROTECTION_EXCEPTION_TYPE num value
+ ///
+ UINT32 ErrorCode;
+ UINT32 Rip;
+ UINT32 Cs;
+ UINT32 Rflags;
+ UINT32 Rsp;
+ UINT32 Ss;
+} STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32;
+
+typedef struct {
+ UINT64 R15;
+ UINT64 R14;
+ UINT64 R13;
+ UINT64 R12;
+ UINT64 R11;
+ UINT64 R10;
+ UINT64 R9;
+ UINT64 R8;
+ UINT64 Rdi;
+ UINT64 Rsi;
+ UINT64 Rbp;
+ UINT64 Rdx;
+ UINT64 Rcx;
+ UINT64 Rbx;
+ UINT64 Rax;
+ UINT64 Cr8;
+ UINT64 Cr3;
+ UINT64 Cr2;
+ UINT64 Cr0;
+ UINT64 VmcsExitInstructionInfo;
+ UINT64 VmcsExitInstructionLength;
+ UINT64 VmcsExitQualification;
+ ///
+ /// An TXT_SMM_PROTECTION_EXCEPTION_TYPE num value
+ ///
+ UINT64 ErrorCode;
+ UINT64 Rip;
+ UINT64 Cs;
+ UINT64 Rflags;
+ UINT64 Rsp;
+ UINT64 Ss;
+} STM_PROTECTION_EXCEPTION_STACK_FRAME_X64;
+
+typedef union {
+ STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32 *Ia32StackFrame;
+ STM_PROTECTION_EXCEPTION_STACK_FRAME_X64 *X64StackFrame;
+} STM_PROTECTION_EXCEPTION_STACK_FRAME;
+
+/**
+ Enum values for the ErrorCode field in
+ #STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32 and
+ #STM_PROTECTION_EXCEPTION_STACK_FRAME_X64
+**/
+typedef enum {
+ TxtSmmPageViolation = 1,
+ TxtSmmMsrViolation,
+ TxtSmmRegisterViolation,
+ TxtSmmIoViolation,
+ TxtSmmPciViolation
+} TXT_SMM_PROTECTION_EXCEPTION_TYPE;
+
+/**
+ TXT Pocessor SMM Descriptor (PSD) structures
+**/
+
+typedef struct {
+ UINT64 SpeRip;
+ UINT64 SpeRsp;
+ UINT16 SpeSs;
+ UINT16 PageViolationException:1;
+ UINT16 MsrViolationException:1;
+ UINT16 RegisterViolationException:1;
+ UINT16 IoViolationException:1;
+ UINT16 PciViolationException:1;
+ UINT16 Reserved1:11;
+ UINT32 Reserved2;
+} STM_PROTECTION_EXCEPTION_HANDLER;
+
+typedef struct {
+ UINT8 ExecutionDisableOutsideSmrr:1;
+ UINT8 Intel64Mode:1;
+ UINT8 Cr4Pae : 1;
+ UINT8 Cr4Pse : 1;
+ UINT8 Reserved1 : 4;
+} STM_SMM_ENTRY_STATE;
+
+typedef struct {
+ UINT8 SmramToVmcsRestoreRequired : 1; ///> BIOS restore hint
+ UINT8 ReinitializeVmcsRequired : 1; ///> BIOS request
+ UINT8 Reserved2 : 6;
+} STM_SMM_RESUME_STATE;
+
+typedef struct {
+ UINT8 DomainType : 4; ///> STM input to BIOS on each SMI
+ UINT8 XStatePolicy : 2; ///> STM input to BIOS on each SMI
+ UINT8 EptEnabled : 1;
+ UINT8 Reserved3 : 1;
+} STM_SMM_STATE;
+
+#define TXT_SMM_PSD_OFFSET 0xfb00
+#define TXT_PROCESSOR_SMM_DESCRIPTOR_SIGNATURE SIGNATURE_64('T', 'X', 'T', 'P', 'S', 'S', 'I', 'G')
+#define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MAJOR 1
+#define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MINOR 0
+
+typedef struct {
+ UINT64 Signature;
+ UINT16 Size;
+ UINT8 SmmDescriptorVerMajor;
+ UINT8 SmmDescriptorVerMinor;
+ UINT32 LocalApicId;
+ STM_SMM_ENTRY_STATE SmmEntryState;
+ STM_SMM_RESUME_STATE SmmResumeState;
+ STM_SMM_STATE StmSmmState;
+ UINT8 Reserved4;
+ UINT16 SmmCs;
+ UINT16 SmmDs;
+ UINT16 SmmSs;
+ UINT16 SmmOtherSegment;
+ UINT16 SmmTr;
+ UINT16 Reserved5;
+ UINT64 SmmCr3;
+ UINT64 SmmStmSetupRip;
+ UINT64 SmmStmTeardownRip;
+ UINT64 SmmSmiHandlerRip;
+ UINT64 SmmSmiHandlerRsp;
+ UINT64 SmmGdtPtr;
+ UINT32 SmmGdtSize;
+ UINT32 RequiredStmSmmRevId;
+ STM_PROTECTION_EXCEPTION_HANDLER StmProtectionExceptionHandler;
+ UINT64 Reserved6;
+ UINT64 BiosHwResourceRequirementsPtr;
+ // extend area
+ UINT64 AcpiRsdp;
+ UINT8 PhysicalAddressBits;
+} TXT_PROCESSOR_SMM_DESCRIPTOR;
+
+#pragma pack ()
+
+#endif
diff --git a/UefiCpuPkg/Include/Register/StmResourceDescriptor.h b/MdePkg/Include/Register/Intel/StmResourceDescriptor.h
similarity index 92%
rename from UefiCpuPkg/Include/Register/StmResourceDescriptor.h
rename to MdePkg/Include/Register/Intel/StmResourceDescriptor.h
index ec043c909e..da4c91d0f4 100644
--- a/UefiCpuPkg/Include/Register/StmResourceDescriptor.h
+++ b/MdePkg/Include/Register/Intel/StmResourceDescriptor.h
@@ -1,7 +1,7 @@
/** @file
STM Resource Descriptor

- Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -9,8 +9,8 @@

**/

-#ifndef _STM_RESOURCE_DESCRIPTOR_H_
-#define _STM_RESOURCE_DESCRIPTOR_H_
+#ifndef _INTEL_STM_RESOURCE_DESCRIPTOR_H_
+#define _INTEL_STM_RESOURCE_DESCRIPTOR_H_

#pragma pack (1)

diff --git a/UefiCpuPkg/Include/Register/StmStatusCode.h b/MdePkg/Include/Register/Intel/StmStatusCode.h
similarity index 94%
rename from UefiCpuPkg/Include/Register/StmStatusCode.h
rename to MdePkg/Include/Register/Intel/StmStatusCode.h
index 42f95fbda4..2460c12598 100644
--- a/UefiCpuPkg/Include/Register/StmStatusCode.h
+++ b/MdePkg/Include/Register/Intel/StmStatusCode.h
@@ -1,7 +1,7 @@
/** @file
STM Status Codes

- Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Specification Reference:
@@ -9,8 +9,8 @@

**/

-#ifndef _STM_STATUS_CODE_H_
-#define _STM_STATUS_CODE_H_
+#ifndef _INTEL_STM_STATUS_CODE_H_
+#define _INTEL_STM_STATUS_CODE_H_

/**
STM Status Codes
diff --git a/UefiCpuPkg/Include/Register/ArchitecturalMsr.h b/UefiCpuPkg/Include/Register/ArchitecturalMsr.h
index c2bd382000..15f8094a62 100644
--- a/UefiCpuPkg/Include/Register/ArchitecturalMsr.h
+++ b/UefiCpuPkg/Include/Register/ArchitecturalMsr.h
@@ -1,6572 +1,13 @@
/** @file
- Architectural MSR Definitions.
+ Wrapper header file to include <Register/Intel/ArchitecturalMsr.h> in MdePkg.

- Provides defines for Machine Specific Registers(MSR) indexes. Data structures
- are provided for MSRs that contain one or more bit fields. If the MSR value
- returned is a single 32-bit or 64-bit value, then a data structure is not
- provided for that MSR.
-
- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
-
- @par Specification Reference:
- Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 4,
- May 2018, Volume 4: Model-Specific-Registers (MSR)
-
**/

#ifndef __ARCHITECTURAL_MSR_H__
#define __ARCHITECTURAL_MSR_H__

-/**
- See Section 2.22, "MSRs in Pentium Processors.". Pentium Processor (05_01H).
-
- @param ECX MSR_IA32_P5_MC_ADDR (0x00000000)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_P5_MC_ADDR);
- AsmWriteMsr64 (MSR_IA32_P5_MC_ADDR, Msr);
- @endcode
- @note MSR_IA32_P5_MC_ADDR is defined as IA32_P5_MC_ADDR in SDM.
-**/
-#define MSR_IA32_P5_MC_ADDR 0x00000000
-
-
-/**
- See Section 2.22, "MSRs in Pentium Processors.". DF_DM = 05_01H.
-
- @param ECX MSR_IA32_P5_MC_TYPE (0x00000001)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_P5_MC_TYPE);
- AsmWriteMsr64 (MSR_IA32_P5_MC_TYPE, Msr);
- @endcode
- @note MSR_IA32_P5_MC_TYPE is defined as IA32_P5_MC_TYPE in SDM.
-**/
-#define MSR_IA32_P5_MC_TYPE 0x00000001
-
-
-/**
- See Section 8.10.5, "Monitor/Mwait Address Range Determination.". Introduced
- at Display Family / Display Model 0F_03H.
-
- @param ECX MSR_IA32_MONITOR_FILTER_SIZE (0x00000006)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MONITOR_FILTER_SIZE);
- AsmWriteMsr64 (MSR_IA32_MONITOR_FILTER_SIZE, Msr);
- @endcode
- @note MSR_IA32_MONITOR_FILTER_SIZE is defined as IA32_MONITOR_FILTER_SIZE in SDM.
-**/
-#define MSR_IA32_MONITOR_FILTER_SIZE 0x00000006
-
-
-/**
- See Section 17.17, "Time-Stamp Counter.". Introduced at Display Family /
- Display Model 05_01H.
-
- @param ECX MSR_IA32_TIME_STAMP_COUNTER (0x00000010)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_TIME_STAMP_COUNTER);
- AsmWriteMsr64 (MSR_IA32_TIME_STAMP_COUNTER, Msr);
- @endcode
- @note MSR_IA32_TIME_STAMP_COUNTER is defined as IA32_TIME_STAMP_COUNTER in SDM.
-**/
-#define MSR_IA32_TIME_STAMP_COUNTER 0x00000010
-
-
-/**
- Platform ID (RO) The operating system can use this MSR to determine "slot"
- information for the processor and the proper microcode update to load.
- Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_PLATFORM_ID (0x00000017)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PLATFORM_ID_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PLATFORM_ID_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PLATFORM_ID_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PLATFORM_ID);
- @endcode
- @note MSR_IA32_PLATFORM_ID is defined as IA32_PLATFORM_ID in SDM.
-**/
-#define MSR_IA32_PLATFORM_ID 0x00000017
-
-/**
- MSR information returned for MSR index #MSR_IA32_PLATFORM_ID
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved1:32;
- UINT32 Reserved2:18;
- ///
- /// [Bits 52:50] Platform Id (RO) Contains information concerning the
- /// intended platform for the processor.
- /// 52 51 50
- /// -- -- --
- /// 0 0 0 Processor Flag 0.
- /// 0 0 1 Processor Flag 1
- /// 0 1 0 Processor Flag 2
- /// 0 1 1 Processor Flag 3
- /// 1 0 0 Processor Flag 4
- /// 1 0 1 Processor Flag 5
- /// 1 1 0 Processor Flag 6
- /// 1 1 1 Processor Flag 7
- ///
- UINT32 PlatformId:3;
- UINT32 Reserved3:11;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PLATFORM_ID_REGISTER;
-
-
-/**
- 06_01H.
-
- @param ECX MSR_IA32_APIC_BASE (0x0000001B)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_APIC_BASE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_APIC_BASE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_APIC_BASE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
- AsmWriteMsr64 (MSR_IA32_APIC_BASE, Msr.Uint64);
- @endcode
- @note MSR_IA32_APIC_BASE is defined as IA32_APIC_BASE in SDM.
-**/
-#define MSR_IA32_APIC_BASE 0x0000001B
-
-/**
- MSR information returned for MSR index #MSR_IA32_APIC_BASE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved1:8;
- ///
- /// [Bit 8] BSP flag (R/W).
- ///
- UINT32 BSP:1;
- UINT32 Reserved2:1;
- ///
- /// [Bit 10] Enable x2APIC mode. Introduced at Display Family / Display
- /// Model 06_1AH.
- ///
- UINT32 EXTD:1;
- ///
- /// [Bit 11] APIC Global Enable (R/W).
- ///
- UINT32 EN:1;
- ///
- /// [Bits 31:12] APIC Base (R/W).
- ///
- UINT32 ApicBase:20;
- ///
- /// [Bits 63:32] APIC Base (R/W).
- ///
- UINT32 ApicBaseHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_APIC_BASE_REGISTER;
-
-
-/**
- Control Features in Intel 64 Processor (R/W). If any one enumeration
- condition for defined bit field holds.
-
- @param ECX MSR_IA32_FEATURE_CONTROL (0x0000003A)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_FEATURE_CONTROL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_FEATURE_CONTROL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_FEATURE_CONTROL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);
- AsmWriteMsr64 (MSR_IA32_FEATURE_CONTROL, Msr.Uint64);
- @endcode
- @note MSR_IA32_FEATURE_CONTROL is defined as IA32_FEATURE_CONTROL in SDM.
-**/
-#define MSR_IA32_FEATURE_CONTROL 0x0000003A
-
-/**
- MSR information returned for MSR index #MSR_IA32_FEATURE_CONTROL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Lock bit (R/WO): (1 = locked). When set, locks this MSR from
- /// being written, writes to this bit will result in GP(0). Note: Once the
- /// Lock bit is set, the contents of this register cannot be modified.
- /// Therefore the lock bit must be set after configuring support for Intel
- /// Virtualization Technology and prior to transferring control to an
- /// option ROM or the OS. Hence, once the Lock bit is set, the entire
- /// IA32_FEATURE_CONTROL contents are preserved across RESET when PWRGOOD
- /// is not deasserted. If any one enumeration condition for defined bit
- /// field position greater than bit 0 holds.
- ///
- UINT32 Lock:1;
- ///
- /// [Bit 1] Enable VMX inside SMX operation (R/WL): This bit enables a
- /// system executive to use VMX in conjunction with SMX to support
- /// Intel(R) Trusted Execution Technology. BIOS must set this bit only
- /// when the CPUID function 1 returns VMX feature flag and SMX feature
- /// flag set (ECX bits 5 and 6 respectively). If CPUID.01H:ECX[5] = 1 &&
- /// CPUID.01H:ECX[6] = 1.
- ///
- UINT32 EnableVmxInsideSmx:1;
- ///
- /// [Bit 2] Enable VMX outside SMX operation (R/WL): This bit enables VMX
- /// for system executive that do not require SMX. BIOS must set this bit
- /// only when the CPUID function 1 returns VMX feature flag set (ECX bit
- /// 5). If CPUID.01H:ECX[5] = 1.
- ///
- UINT32 EnableVmxOutsideSmx:1;
- UINT32 Reserved1:5;
- ///
- /// [Bits 14:8] SENTER Local Function Enables (R/WL): When set, each bit
- /// in the field represents an enable control for a corresponding SENTER
- /// function. This bit is supported only if CPUID.1:ECX.[bit 6] is set. If
- /// CPUID.01H:ECX[6] = 1.
- ///
- UINT32 SenterLocalFunctionEnables:7;
- ///
- /// [Bit 15] SENTER Global Enable (R/WL): This bit must be set to enable
- /// SENTER leaf functions. This bit is supported only if CPUID.1:ECX.[bit
- /// 6] is set. If CPUID.01H:ECX[6] = 1.
- ///
- UINT32 SenterGlobalEnable:1;
- UINT32 Reserved2:1;
- ///
- /// [Bit 17] SGX Launch Control Enable (R/WL): This bit must be set to
- /// enable runtime reconfiguration of SGX Launch Control via
- /// IA32_SGXLEPUBKEYHASHn MSR. If CPUID.(EAX=07H, ECX=0H): ECX[30] = 1.
- ///
- UINT32 SgxLaunchControlEnable:1;
- ///
- /// [Bit 18] SGX Global Enable (R/WL): This bit must be set to enable SGX
- /// leaf functions. If CPUID.(EAX=07H, ECX=0H): EBX[2] = 1.
- ///
- UINT32 SgxEnable:1;
- UINT32 Reserved3:1;
- ///
- /// [Bit 20] LMCE On (R/WL): When set, system software can program the
- /// MSRs associated with LMCE to configure delivery of some machine check
- /// exceptions to a single logical processor. If IA32_MCG_CAP[27] = 1.
- ///
- UINT32 LmceOn:1;
- UINT32 Reserved4:11;
- UINT32 Reserved5:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_FEATURE_CONTROL_REGISTER;
-
-
-/**
- Per Logical Processor TSC Adjust (R/Write to clear). If CPUID.(EAX=07H,
- ECX=0H): EBX[1] = 1. THREAD_ADJUST: Local offset value of the IA32_TSC for
- a logical processor. Reset value is Zero. A write to IA32_TSC will modify
- the local offset in IA32_TSC_ADJUST and the content of IA32_TSC, but does
- not affect the internal invariant TSC hardware.
-
- @param ECX MSR_IA32_TSC_ADJUST (0x0000003B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_TSC_ADJUST);
- AsmWriteMsr64 (MSR_IA32_TSC_ADJUST, Msr);
- @endcode
- @note MSR_IA32_TSC_ADJUST is defined as IA32_TSC_ADJUST in SDM.
-**/
-#define MSR_IA32_TSC_ADJUST 0x0000003B
-
-
-/**
- BIOS Update Trigger (W) Executing a WRMSR instruction to this MSR causes a
- microcode update to be loaded into the processor. See Section 9.11.6,
- "Microcode Update Loader." A processor may prevent writing to this MSR when
- loading guest states on VM entries or saving guest states on VM exits.
- Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_BIOS_UPDT_TRIG (0x00000079)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = 0;
- AsmWriteMsr64 (MSR_IA32_BIOS_UPDT_TRIG, Msr);
- @endcode
- @note MSR_IA32_BIOS_UPDT_TRIG is defined as IA32_BIOS_UPDT_TRIG in SDM.
-**/
-#define MSR_IA32_BIOS_UPDT_TRIG 0x00000079
-
-
-/**
- BIOS Update Signature (RO) Returns the microcode update signature following
- the execution of CPUID.01H. A processor may prevent writing to this MSR when
- loading guest states on VM entries or saving guest states on VM exits.
- Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_BIOS_SIGN_ID (0x0000008B)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_BIOS_SIGN_ID_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_BIOS_SIGN_ID_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_BIOS_SIGN_ID_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_BIOS_SIGN_ID);
- @endcode
- @note MSR_IA32_BIOS_SIGN_ID is defined as IA32_BIOS_SIGN_ID in SDM.
-**/
-#define MSR_IA32_BIOS_SIGN_ID 0x0000008B
-
-/**
- MSR information returned for MSR index #MSR_IA32_BIOS_SIGN_ID
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved:32;
- ///
- /// [Bits 63:32] Microcode update signature. This field contains the
- /// signature of the currently loaded microcode update when read following
- /// the execution of the CPUID instruction, function 1. It is required
- /// that this register field be pre-loaded with zero prior to executing
- /// the CPUID, function 1. If the field remains equal to zero, then there
- /// is no microcode update loaded. Another nonzero value will be the
- /// signature.
- ///
- UINT32 MicrocodeUpdateSignature:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_BIOS_SIGN_ID_REGISTER;
-
-
-/**
- IA32_SGXLEPUBKEYHASH[(64*n+63):(64*n)] (R/W) Bits (64*n+63):(64*n) of the
- SHA256 digest of the SIGSTRUCT.MODULUS for SGX Launch Enclave. On reset, the
- default value is the digest of Intel's signing key. Read permitted If
- CPUID.(EAX=12H,ECX=0H):EAX[0]=1, Write permitted if CPUID.(EAX=12H,ECX=0H):
- EAX[0]=1 && IA32_FEATURE_CONTROL[17] = 1 && IA32_FEATURE_CONTROL[0] = 1.
-
- @param ECX MSR_IA32_SGXLEPUBKEYHASHn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_SGXLEPUBKEYHASHn);
- AsmWriteMsr64 (MSR_IA32_SGXLEPUBKEYHASHn, Msr);
- @endcode
- @note MSR_IA32_SGXLEPUBKEYHASH0 is defined as IA32_SGXLEPUBKEYHASH0 in SDM.
- MSR_IA32_SGXLEPUBKEYHASH1 is defined as IA32_SGXLEPUBKEYHASH1 in SDM.
- MSR_IA32_SGXLEPUBKEYHASH2 is defined as IA32_SGXLEPUBKEYHASH2 in SDM.
- MSR_IA32_SGXLEPUBKEYHASH3 is defined as IA32_SGXLEPUBKEYHASH3 in SDM.
- @{
-**/
-#define MSR_IA32_SGXLEPUBKEYHASH0 0x0000008C
-#define MSR_IA32_SGXLEPUBKEYHASH1 0x0000008D
-#define MSR_IA32_SGXLEPUBKEYHASH2 0x0000008E
-#define MSR_IA32_SGXLEPUBKEYHASH3 0x0000008F
-/// @}
-
-
-/**
- SMM Monitor Configuration (R/W). If CPUID.01H: ECX[5]=1 or CPUID.01H: ECX[6] =
- 1.
-
- @param ECX MSR_IA32_SMM_MONITOR_CTL (0x0000009B)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_SMM_MONITOR_CTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_SMM_MONITOR_CTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_SMM_MONITOR_CTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMM_MONITOR_CTL);
- AsmWriteMsr64 (MSR_IA32_SMM_MONITOR_CTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_SMM_MONITOR_CTL is defined as IA32_SMM_MONITOR_CTL in SDM.
-**/
-#define MSR_IA32_SMM_MONITOR_CTL 0x0000009B
-
-/**
- MSR information returned for MSR index #MSR_IA32_SMM_MONITOR_CTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Valid (R/W). The STM may be invoked using VMCALL only if this
- /// bit is 1. Because VMCALL is used to activate the dual-monitor treatment
- /// (see Section 34.15.6), the dual-monitor treatment cannot be activated
- /// if the bit is 0. This bit is cleared when the logical processor is
- /// reset.
- ///
- UINT32 Valid:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 2] Controls SMI unblocking by VMXOFF (see Section 34.14.4). If
- /// IA32_VMX_MISC[28].
- ///
- UINT32 BlockSmi:1;
- UINT32 Reserved2:9;
- ///
- /// [Bits 31:12] MSEG Base (R/W).
- ///
- UINT32 MsegBase:20;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_SMM_MONITOR_CTL_REGISTER;
-
-/**
- MSEG header that is located at the physical address specified by the MsegBase
- field of #MSR_IA32_SMM_MONITOR_CTL_REGISTER.
-**/
-typedef struct {
- ///
- /// Different processors may use different MSEG revision identifiers. These
- /// identifiers enable software to avoid using an MSEG header formatted for
- /// one processor on a processor that uses a different format. Software can
- /// discover the MSEG revision identifier that a processor uses by reading
- /// the VMX capability MSR IA32_VMX_MISC.
- //
- UINT32 MsegHeaderRevision;
- ///
- /// Bits 31:1 of this field are reserved and must be zero. Bit 0 of the field
- /// is the IA-32e mode SMM feature bit. It indicates whether the logical
- /// processor will be in IA-32e mode after the STM is activated.
- ///
- UINT32 MonitorFeatures;
- UINT32 GdtrLimit;
- UINT32 GdtrBaseOffset;
- UINT32 CsSelector;
- UINT32 EipOffset;
- UINT32 EspOffset;
- UINT32 Cr3Offset;
- ///
- /// Pad header so total size is 2KB
- ///
- UINT8 Reserved[SIZE_2KB - 8 * sizeof (UINT32)];
-} MSEG_HEADER;
-
-///
-/// @{ Define values for the MonitorFeatures field of #MSEG_HEADER
-///
-#define STM_FEATURES_IA32E 0x1
-///
-/// @}
-///
-
-/**
- Base address of the logical processor's SMRAM image (RO, SMM only). If
- IA32_VMX_MISC[15].
-
- @param ECX MSR_IA32_SMBASE (0x0000009E)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_SMBASE);
- @endcode
- @note MSR_IA32_SMBASE is defined as IA32_SMBASE in SDM.
-**/
-#define MSR_IA32_SMBASE 0x0000009E
-
-
-/**
- General Performance Counters (R/W).
- MSR_IA32_PMCn is supported if CPUID.0AH: EAX[15:8] > n.
-
- @param ECX MSR_IA32_PMCn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_PMC0);
- AsmWriteMsr64 (MSR_IA32_PMC0, Msr);
- @endcode
- @note MSR_IA32_PMC0 is defined as IA32_PMC0 in SDM.
- MSR_IA32_PMC1 is defined as IA32_PMC1 in SDM.
- MSR_IA32_PMC2 is defined as IA32_PMC2 in SDM.
- MSR_IA32_PMC3 is defined as IA32_PMC3 in SDM.
- MSR_IA32_PMC4 is defined as IA32_PMC4 in SDM.
- MSR_IA32_PMC5 is defined as IA32_PMC5 in SDM.
- MSR_IA32_PMC6 is defined as IA32_PMC6 in SDM.
- MSR_IA32_PMC7 is defined as IA32_PMC7 in SDM.
- @{
-**/
-#define MSR_IA32_PMC0 0x000000C1
-#define MSR_IA32_PMC1 0x000000C2
-#define MSR_IA32_PMC2 0x000000C3
-#define MSR_IA32_PMC3 0x000000C4
-#define MSR_IA32_PMC4 0x000000C5
-#define MSR_IA32_PMC5 0x000000C6
-#define MSR_IA32_PMC6 0x000000C7
-#define MSR_IA32_PMC7 0x000000C8
-/// @}
-
-
-/**
- TSC Frequency Clock Counter (R/Write to clear). If CPUID.06H: ECX[0] = 1.
- C0_MCNT: C0 TSC Frequency Clock Count Increments at fixed interval (relative
- to TSC freq.) when the logical processor is in C0. Cleared upon overflow /
- wrap-around of IA32_APERF.
-
- @param ECX MSR_IA32_MPERF (0x000000E7)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MPERF);
- AsmWriteMsr64 (MSR_IA32_MPERF, Msr);
- @endcode
- @note MSR_IA32_MPERF is defined as IA32_MPERF in SDM.
-**/
-#define MSR_IA32_MPERF 0x000000E7
-
-
-/**
- Actual Performance Clock Counter (R/Write to clear). If CPUID.06H: ECX[0] =
- 1. C0_ACNT: C0 Actual Frequency Clock Count Accumulates core clock counts at
- the coordinated clock frequency, when the logical processor is in C0.
- Cleared upon overflow / wrap-around of IA32_MPERF.
-
- @param ECX MSR_IA32_APERF (0x000000E8)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_APERF);
- AsmWriteMsr64 (MSR_IA32_APERF, Msr);
- @endcode
- @note MSR_IA32_APERF is defined as IA32_APERF in SDM.
-**/
-#define MSR_IA32_APERF 0x000000E8
-
-
-/**
- MTRR Capability (RO) Section 11.11.2.1, "IA32_MTRR_DEF_TYPE MSR.".
- Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_MTRRCAP (0x000000FE)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MTRRCAP_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MTRRCAP_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MTRRCAP_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRRCAP);
- @endcode
- @note MSR_IA32_MTRRCAP is defined as IA32_MTRRCAP in SDM.
-**/
-#define MSR_IA32_MTRRCAP 0x000000FE
-
-/**
- MSR information returned for MSR index #MSR_IA32_MTRRCAP
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] VCNT: The number of variable memory type ranges in the
- /// processor.
- ///
- UINT32 VCNT:8;
- ///
- /// [Bit 8] Fixed range MTRRs are supported when set.
- ///
- UINT32 FIX:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 10] WC Supported when set.
- ///
- UINT32 WC:1;
- ///
- /// [Bit 11] SMRR Supported when set.
- ///
- UINT32 SMRR:1;
- UINT32 Reserved2:20;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MTRRCAP_REGISTER;
-
-
-/**
- SYSENTER_CS_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_SYSENTER_CS (0x00000174)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_SYSENTER_CS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_SYSENTER_CS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_SYSENTER_CS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SYSENTER_CS);
- AsmWriteMsr64 (MSR_IA32_SYSENTER_CS, Msr.Uint64);
- @endcode
- @note MSR_IA32_SYSENTER_CS is defined as IA32_SYSENTER_CS in SDM.
-**/
-#define MSR_IA32_SYSENTER_CS 0x00000174
-
-/**
- MSR information returned for MSR index #MSR_IA32_SYSENTER_CS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 15:0] CS Selector.
- ///
- UINT32 CS:16;
- UINT32 Reserved1:16;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_SYSENTER_CS_REGISTER;
-
-
-/**
- SYSENTER_ESP_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_SYSENTER_ESP (0x00000175)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_SYSENTER_ESP);
- AsmWriteMsr64 (MSR_IA32_SYSENTER_ESP, Msr);
- @endcode
- @note MSR_IA32_SYSENTER_ESP is defined as IA32_SYSENTER_ESP in SDM.
-**/
-#define MSR_IA32_SYSENTER_ESP 0x00000175
-
-
-/**
- SYSENTER_EIP_MSR (R/W). Introduced at Display Family / Display Model 06_01H.
-
- @param ECX MSR_IA32_SYSENTER_EIP (0x00000176)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_SYSENTER_EIP);
- AsmWriteMsr64 (MSR_IA32_SYSENTER_EIP, Msr);
- @endcode
- @note MSR_IA32_SYSENTER_EIP is defined as IA32_SYSENTER_EIP in SDM.
-**/
-#define MSR_IA32_SYSENTER_EIP 0x00000176
-
-
-/**
- Global Machine Check Capability (RO). Introduced at Display Family / Display
- Model 06_01H.
-
- @param ECX MSR_IA32_MCG_CAP (0x00000179)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_CAP_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_CAP_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MCG_CAP_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_CAP);
- @endcode
- @note MSR_IA32_MCG_CAP is defined as IA32_MCG_CAP in SDM.
-**/
-#define MSR_IA32_MCG_CAP 0x00000179
-
-/**
- MSR information returned for MSR index #MSR_IA32_MCG_CAP
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Count: Number of reporting banks.
- ///
- UINT32 Count:8;
- ///
- /// [Bit 8] MCG_CTL_P: IA32_MCG_CTL is present if this bit is set.
- ///
- UINT32 MCG_CTL_P:1;
- ///
- /// [Bit 9] MCG_EXT_P: Extended machine check state registers are present
- /// if this bit is set.
- ///
- UINT32 MCG_EXT_P:1;
- ///
- /// [Bit 10] MCP_CMCI_P: Support for corrected MC error event is present.
- /// Introduced at Display Family / Display Model 06_01H.
- ///
- UINT32 MCP_CMCI_P:1;
- ///
- /// [Bit 11] MCG_TES_P: Threshold-based error status register are present
- /// if this bit is set.
- ///
- UINT32 MCG_TES_P:1;
- UINT32 Reserved1:4;
- ///
- /// [Bits 23:16] MCG_EXT_CNT: Number of extended machine check state
- /// registers present.
- ///
- UINT32 MCG_EXT_CNT:8;
- ///
- /// [Bit 24] MCG_SER_P: The processor supports software error recovery if
- /// this bit is set.
- ///
- UINT32 MCG_SER_P:1;
- UINT32 Reserved2:1;
- ///
- /// [Bit 26] MCG_ELOG_P: Indicates that the processor allows platform
- /// firmware to be invoked when an error is detected so that it may
- /// provide additional platform specific information in an ACPI format
- /// "Generic Error Data Entry" that augments the data included in machine
- /// check bank registers. Introduced at Display Family / Display Model
- /// 06_3EH.
- ///
- UINT32 MCG_ELOG_P:1;
- ///
- /// [Bit 27] MCG_LMCE_P: Indicates that the processor support extended
- /// state in IA32_MCG_STATUS and associated MSR necessary to configure
- /// Local Machine Check Exception (LMCE). Introduced at Display Family /
- /// Display Model 06_3EH.
- ///
- UINT32 MCG_LMCE_P:1;
- UINT32 Reserved3:4;
- UINT32 Reserved4:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MCG_CAP_REGISTER;
-
-
-/**
- Global Machine Check Status (R/W0). Introduced at Display Family / Display
- Model 06_01H.
-
- @param ECX MSR_IA32_MCG_STATUS (0x0000017A)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MCG_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_STATUS);
- AsmWriteMsr64 (MSR_IA32_MCG_STATUS, Msr.Uint64);
- @endcode
- @note MSR_IA32_MCG_STATUS is defined as IA32_MCG_STATUS in SDM.
-**/
-#define MSR_IA32_MCG_STATUS 0x0000017A
-
-/**
- MSR information returned for MSR index #MSR_IA32_MCG_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] RIPV. Restart IP valid. Introduced at Display Family / Display
- /// Model 06_01H.
- ///
- UINT32 RIPV:1;
- ///
- /// [Bit 1] EIPV. Error IP valid. Introduced at Display Family / Display
- /// Model 06_01H.
- ///
- UINT32 EIPV:1;
- ///
- /// [Bit 2] MCIP. Machine check in progress. Introduced at Display Family
- /// / Display Model 06_01H.
- ///
- UINT32 MCIP:1;
- ///
- /// [Bit 3] LMCE_S. If IA32_MCG_CAP.LMCE_P[2 7] =1.
- ///
- UINT32 LMCE_S:1;
- UINT32 Reserved1:28;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MCG_STATUS_REGISTER;
-
-
-/**
- Global Machine Check Control (R/W). If IA32_MCG_CAP.CTL_P[8] =1.
-
- @param ECX MSR_IA32_MCG_CTL (0x0000017B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MCG_CTL);
- AsmWriteMsr64 (MSR_IA32_MCG_CTL, Msr);
- @endcode
- @note MSR_IA32_MCG_CTL is defined as IA32_MCG_CTL in SDM.
-**/
-#define MSR_IA32_MCG_CTL 0x0000017B
-
-
-/**
- Performance Event Select Register n (R/W). If CPUID.0AH: EAX[15:8] > n.
-
- @param ECX MSR_IA32_PERFEVTSELn
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERFEVTSEL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERFEVTSEL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERFEVTSEL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERFEVTSEL0);
- AsmWriteMsr64 (MSR_IA32_PERFEVTSEL0, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERFEVTSEL0 is defined as IA32_PERFEVTSEL0 in SDM.
- MSR_IA32_PERFEVTSEL1 is defined as IA32_PERFEVTSEL1 in SDM.
- MSR_IA32_PERFEVTSEL2 is defined as IA32_PERFEVTSEL2 in SDM.
- MSR_IA32_PERFEVTSEL3 is defined as IA32_PERFEVTSEL3 in SDM.
- @{
-**/
-#define MSR_IA32_PERFEVTSEL0 0x00000186
-#define MSR_IA32_PERFEVTSEL1 0x00000187
-#define MSR_IA32_PERFEVTSEL2 0x00000188
-#define MSR_IA32_PERFEVTSEL3 0x00000189
-/// @}
-
-/**
- MSR information returned for MSR indexes #MSR_IA32_PERFEVTSEL0 to
- #MSR_IA32_PERFEVTSEL3
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Event Select: Selects a performance event logic unit.
- ///
- UINT32 EventSelect:8;
- ///
- /// [Bits 15:8] UMask: Qualifies the microarchitectural condition to
- /// detect on the selected event logic.
- ///
- UINT32 UMASK:8;
- ///
- /// [Bit 16] USR: Counts while in privilege level is not ring 0.
- ///
- UINT32 USR:1;
- ///
- /// [Bit 17] OS: Counts while in privilege level is ring 0.
- ///
- UINT32 OS:1;
- ///
- /// [Bit 18] Edge: Enables edge detection if set.
- ///
- UINT32 E:1;
- ///
- /// [Bit 19] PC: enables pin control.
- ///
- UINT32 PC:1;
- ///
- /// [Bit 20] INT: enables interrupt on counter overflow.
- ///
- UINT32 INT:1;
- ///
- /// [Bit 21] AnyThread: When set to 1, it enables counting the associated
- /// event conditions occurring across all logical processors sharing a
- /// processor core. When set to 0, the counter only increments the
- /// associated event conditions occurring in the logical processor which
- /// programmed the MSR.
- ///
- UINT32 ANY:1;
- ///
- /// [Bit 22] EN: enables the corresponding performance counter to commence
- /// counting when this bit is set.
- ///
- UINT32 EN:1;
- ///
- /// [Bit 23] INV: invert the CMASK.
- ///
- UINT32 INV:1;
- ///
- /// [Bits 31:24] CMASK: When CMASK is not zero, the corresponding
- /// performance counter increments each cycle if the event count is
- /// greater than or equal to the CMASK.
- ///
- UINT32 CMASK:8;
- UINT32 Reserved:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERFEVTSEL_REGISTER;
-
-
-/**
- Current performance state(P-State) operating point (RO). Introduced at
- Display Family / Display Model 0F_03H.
-
- @param ECX MSR_IA32_PERF_STATUS (0x00000198)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_STATUS);
- @endcode
- @note MSR_IA32_PERF_STATUS is defined as IA32_PERF_STATUS in SDM.
-**/
-#define MSR_IA32_PERF_STATUS 0x00000198
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 15:0] Current performance State Value.
- ///
- UINT32 State:16;
- UINT32 Reserved1:16;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_STATUS_REGISTER;
-
-
-/**
- (R/W). Introduced at Display Family / Display Model 0F_03H.
-
- @param ECX MSR_IA32_PERF_CTL (0x00000199)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_CTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_CTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_CTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_CTL);
- AsmWriteMsr64 (MSR_IA32_PERF_CTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_CTL is defined as IA32_PERF_CTL in SDM.
-**/
-#define MSR_IA32_PERF_CTL 0x00000199
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_CTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 15:0] Target performance State Value.
- ///
- UINT32 TargetState:16;
- UINT32 Reserved1:16;
- ///
- /// [Bit 32] IDA Engage. (R/W) When set to 1: disengages IDA. 06_0FH
- /// (Mobile only).
- ///
- UINT32 IDA:1;
- UINT32 Reserved2:31;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_CTL_REGISTER;
-
-
-/**
- Clock Modulation Control (R/W) See Section 14.7.3, "Software Controlled
- Clock Modulation.". If CPUID.01H:EDX[22] = 1.
-
- @param ECX MSR_IA32_CLOCK_MODULATION (0x0000019A)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_CLOCK_MODULATION_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_CLOCK_MODULATION_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_CLOCK_MODULATION_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_CLOCK_MODULATION);
- AsmWriteMsr64 (MSR_IA32_CLOCK_MODULATION, Msr.Uint64);
- @endcode
- @note MSR_IA32_CLOCK_MODULATION is defined as IA32_CLOCK_MODULATION in SDM.
-**/
-#define MSR_IA32_CLOCK_MODULATION 0x0000019A
-
-/**
- MSR information returned for MSR index #MSR_IA32_CLOCK_MODULATION
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Extended On-Demand Clock Modulation Duty Cycle:. If
- /// CPUID.06H:EAX[5] = 1.
- ///
- UINT32 ExtendedOnDemandClockModulationDutyCycle:1;
- ///
- /// [Bits 3:1] On-Demand Clock Modulation Duty Cycle: Specific encoded
- /// values for target duty cycle modulation. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 OnDemandClockModulationDutyCycle:3;
- ///
- /// [Bit 4] On-Demand Clock Modulation Enable: Set 1 to enable modulation.
- /// If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 OnDemandClockModulationEnable:1;
- UINT32 Reserved1:27;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_CLOCK_MODULATION_REGISTER;
-
-
-/**
- Thermal Interrupt Control (R/W) Enables and disables the generation of an
- interrupt on temperature transitions detected with the processor's thermal
- sensors and thermal monitor. See Section 14.7.2, "Thermal Monitor.".
- If CPUID.01H:EDX[22] = 1
-
- @param ECX MSR_IA32_THERM_INTERRUPT (0x0000019B)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_THERM_INTERRUPT_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_THERM_INTERRUPT_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_THERM_INTERRUPT_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_THERM_INTERRUPT);
- AsmWriteMsr64 (MSR_IA32_THERM_INTERRUPT, Msr.Uint64);
- @endcode
- @note MSR_IA32_THERM_INTERRUPT is defined as IA32_THERM_INTERRUPT in SDM.
-**/
-#define MSR_IA32_THERM_INTERRUPT 0x0000019B
-
-/**
- MSR information returned for MSR index #MSR_IA32_THERM_INTERRUPT
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] High-Temperature Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 HighTempEnable:1;
- ///
- /// [Bit 1] Low-Temperature Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 LowTempEnable:1;
- ///
- /// [Bit 2] PROCHOT# Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 PROCHOT_Enable:1;
- ///
- /// [Bit 3] FORCEPR# Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 FORCEPR_Enable:1;
- ///
- /// [Bit 4] Critical Temperature Interrupt Enable.
- /// If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 CriticalTempEnable:1;
- UINT32 Reserved1:3;
- ///
- /// [Bits 14:8] Threshold #1 Value. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 Threshold1:7;
- ///
- /// [Bit 15] Threshold #1 Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 Threshold1Enable:1;
- ///
- /// [Bits 22:16] Threshold #2 Value. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 Threshold2:7;
- ///
- /// [Bit 23] Threshold #2 Interrupt Enable. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 Threshold2Enable:1;
- ///
- /// [Bit 24] Power Limit Notification Enable. If CPUID.06H:EAX[4] = 1.
- ///
- UINT32 PowerLimitNotificationEnable:1;
- UINT32 Reserved2:7;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_THERM_INTERRUPT_REGISTER;
-
-
-/**
- Thermal Status Information (RO) Contains status information about the
- processor's thermal sensor and automatic thermal monitoring facilities. See
- Section 14.7.2, "Thermal Monitor". If CPUID.01H:EDX[22] = 1.
-
- @param ECX MSR_IA32_THERM_STATUS (0x0000019C)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_THERM_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_THERM_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_THERM_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_THERM_STATUS);
- @endcode
- @note MSR_IA32_THERM_STATUS is defined as IA32_THERM_STATUS in SDM.
-**/
-#define MSR_IA32_THERM_STATUS 0x0000019C
-
-/**
- MSR information returned for MSR index #MSR_IA32_THERM_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Thermal Status (RO):. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 ThermalStatus:1;
- ///
- /// [Bit 1] Thermal Status Log (R/W):. If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 ThermalStatusLog:1;
- ///
- /// [Bit 2] PROCHOT # or FORCEPR# event (RO). If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 PROCHOT_FORCEPR_Event:1;
- ///
- /// [Bit 3] PROCHOT # or FORCEPR# log (R/WC0). If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 PROCHOT_FORCEPR_Log:1;
- ///
- /// [Bit 4] Critical Temperature Status (RO). If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 CriticalTempStatus:1;
- ///
- /// [Bit 5] Critical Temperature Status log (R/WC0).
- /// If CPUID.01H:EDX[22] = 1.
- ///
- UINT32 CriticalTempStatusLog:1;
- ///
- /// [Bit 6] Thermal Threshold #1 Status (RO). If CPUID.01H:ECX[8] = 1.
- ///
- UINT32 ThermalThreshold1Status:1;
- ///
- /// [Bit 7] Thermal Threshold #1 log (R/WC0). If CPUID.01H:ECX[8] = 1.
- ///
- UINT32 ThermalThreshold1Log:1;
- ///
- /// [Bit 8] Thermal Threshold #2 Status (RO). If CPUID.01H:ECX[8] = 1.
- ///
- UINT32 ThermalThreshold2Status:1;
- ///
- /// [Bit 9] Thermal Threshold #2 log (R/WC0). If CPUID.01H:ECX[8] = 1.
- ///
- UINT32 ThermalThreshold2Log:1;
- ///
- /// [Bit 10] Power Limitation Status (RO). If CPUID.06H:EAX[4] = 1.
- ///
- UINT32 PowerLimitStatus:1;
- ///
- /// [Bit 11] Power Limitation log (R/WC0). If CPUID.06H:EAX[4] = 1.
- ///
- UINT32 PowerLimitLog:1;
- ///
- /// [Bit 12] Current Limit Status (RO). If CPUID.06H:EAX[7] = 1.
- ///
- UINT32 CurrentLimitStatus:1;
- ///
- /// [Bit 13] Current Limit log (R/WC0). If CPUID.06H:EAX[7] = 1.
- ///
- UINT32 CurrentLimitLog:1;
- ///
- /// [Bit 14] Cross Domain Limit Status (RO). If CPUID.06H:EAX[7] = 1.
- ///
- UINT32 CrossDomainLimitStatus:1;
- ///
- /// [Bit 15] Cross Domain Limit log (R/WC0). If CPUID.06H:EAX[7] = 1.
- ///
- UINT32 CrossDomainLimitLog:1;
- ///
- /// [Bits 22:16] Digital Readout (RO). If CPUID.06H:EAX[0] = 1.
- ///
- UINT32 DigitalReadout:7;
- UINT32 Reserved1:4;
- ///
- /// [Bits 30:27] Resolution in Degrees Celsius (RO). If CPUID.06H:EAX[0] =
- /// 1.
- ///
- UINT32 ResolutionInDegreesCelsius:4;
- ///
- /// [Bit 31] Reading Valid (RO). If CPUID.06H:EAX[0] = 1.
- ///
- UINT32 ReadingValid:1;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_THERM_STATUS_REGISTER;
-
-
-/**
- Enable Misc. Processor Features (R/W) Allows a variety of processor
- functions to be enabled and disabled.
-
- @param ECX MSR_IA32_MISC_ENABLE (0x000001A0)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MISC_ENABLE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MISC_ENABLE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MISC_ENABLE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MISC_ENABLE);
- AsmWriteMsr64 (MSR_IA32_MISC_ENABLE, Msr.Uint64);
- @endcode
- @note MSR_IA32_MISC_ENABLE is defined as IA32_MISC_ENABLE in SDM.
-**/
-#define MSR_IA32_MISC_ENABLE 0x000001A0
-
-/**
- MSR information returned for MSR index #MSR_IA32_MISC_ENABLE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Fast-Strings Enable When set, the fast-strings feature (for
- /// REP MOVS and REP STORS) is enabled (default); when clear, fast-strings
- /// are disabled. Introduced at Display Family / Display Model 0F_0H.
- ///
- UINT32 FastStrings:1;
- UINT32 Reserved1:2;
- ///
- /// [Bit 3] Automatic Thermal Control Circuit Enable (R/W) 1 = Setting
- /// this bit enables the thermal control circuit (TCC) portion of the
- /// Intel Thermal Monitor feature. This allows the processor to
- /// automatically reduce power consumption in response to TCC activation.
- /// 0 = Disabled. Note: In some products clearing this bit might be
- /// ignored in critical thermal conditions, and TM1, TM2 and adaptive
- /// thermal throttling will still be activated. The default value of this
- /// field varies with product. See respective tables where default value is
- /// listed. Introduced at Display Family / Display Model 0F_0H.
- ///
- UINT32 AutomaticThermalControlCircuit:1;
- UINT32 Reserved2:3;
- ///
- /// [Bit 7] Performance Monitoring Available (R) 1 = Performance
- /// monitoring enabled 0 = Performance monitoring disabled. Introduced at
- /// Display Family / Display Model 0F_0H.
- ///
- UINT32 PerformanceMonitoring:1;
- UINT32 Reserved3:3;
- ///
- /// [Bit 11] Branch Trace Storage Unavailable (RO) 1 = Processor doesn't
- /// support branch trace storage (BTS) 0 = BTS is supported. Introduced at
- /// Display Family / Display Model 0F_0H.
- ///
- UINT32 BTS:1;
- ///
- /// [Bit 12] Processor Event Based Sampling (PEBS) Unavailable (RO) 1 =
- /// PEBS is not supported; 0 = PEBS is supported. Introduced at Display
- /// Family / Display Model 06_0FH.
- ///
- UINT32 PEBS:1;
- UINT32 Reserved4:3;
- ///
- /// [Bit 16] Enhanced Intel SpeedStep Technology Enable (R/W) 0= Enhanced
- /// Intel SpeedStep Technology disabled 1 = Enhanced Intel SpeedStep
- /// Technology enabled. If CPUID.01H: ECX[7] =1.
- ///
- UINT32 EIST:1;
- UINT32 Reserved5:1;
- ///
- /// [Bit 18] ENABLE MONITOR FSM (R/W) When this bit is set to 0, the
- /// MONITOR feature flag is not set (CPUID.01H:ECX[bit 3] = 0). This
- /// indicates that MONITOR/MWAIT are not supported. Software attempts to
- /// execute MONITOR/MWAIT will cause #UD when this bit is 0. When this bit
- /// is set to 1 (default), MONITOR/MWAIT are supported (CPUID.01H:ECX[bit
- /// 3] = 1). If the SSE3 feature flag ECX[0] is not set (CPUID.01H:ECX[bit
- /// 0] = 0), the OS must not attempt to alter this bit. BIOS must leave it
- /// in the default state. Writing this bit when the SSE3 feature flag is
- /// set to 0 may generate a #GP exception. Introduced at Display Family /
- /// Display Model 0F_03H.
- ///
- UINT32 MONITOR:1;
- UINT32 Reserved6:3;
- ///
- /// [Bit 22] Limit CPUID Maxval (R/W) When this bit is set to 1, CPUID.00H
- /// returns a maximum value in EAX[7:0] of 2. BIOS should contain a setup
- /// question that allows users to specify when the installed OS does not
- /// support CPUID functions greater than 2. Before setting this bit, BIOS
- /// must execute the CPUID.0H and examine the maximum value returned in
- /// EAX[7:0]. If the maximum value is greater than 2, this bit is
- /// supported. Otherwise, this bit is not supported. Setting this bit when
- /// the maximum value is not greater than 2 may generate a #GP exception.
- /// Setting this bit may cause unexpected behavior in software that
- /// depends on the availability of CPUID leaves greater than 2. Introduced
- /// at Display Family / Display Model 0F_03H.
- ///
- UINT32 LimitCpuidMaxval:1;
- ///
- /// [Bit 23] xTPR Message Disable (R/W) When set to 1, xTPR messages are
- /// disabled. xTPR messages are optional messages that allow the processor
- /// to inform the chipset of its priority. if CPUID.01H:ECX[14] = 1.
- ///
- UINT32 xTPR_Message_Disable:1;
- UINT32 Reserved7:8;
- UINT32 Reserved8:2;
- ///
- /// [Bit 34] XD Bit Disable (R/W) When set to 1, the Execute Disable Bit
- /// feature (XD Bit) is disabled and the XD Bit extended feature flag will
- /// be clear (CPUID.80000001H: EDX[20]=0). When set to a 0 (default), the
- /// Execute Disable Bit feature (if available) allows the OS to enable PAE
- /// paging and take advantage of data only pages. BIOS must not alter the
- /// contents of this bit location, if XD bit is not supported. Writing
- /// this bit to 1 when the XD Bit extended feature flag is set to 0 may
- /// generate a #GP exception. if CPUID.80000001H:EDX[2 0] = 1.
- ///
- UINT32 XD:1;
- UINT32 Reserved9:29;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MISC_ENABLE_REGISTER;
-
-
-/**
- Performance Energy Bias Hint (R/W). if CPUID.6H:ECX[3] = 1.
-
- @param ECX MSR_IA32_ENERGY_PERF_BIAS (0x000001B0)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_ENERGY_PERF_BIAS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_ENERGY_PERF_BIAS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_ENERGY_PERF_BIAS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_ENERGY_PERF_BIAS);
- AsmWriteMsr64 (MSR_IA32_ENERGY_PERF_BIAS, Msr.Uint64);
- @endcode
- @note MSR_IA32_ENERGY_PERF_BIAS is defined as IA32_ENERGY_PERF_BIAS in SDM.
-**/
-#define MSR_IA32_ENERGY_PERF_BIAS 0x000001B0
-
-/**
- MSR information returned for MSR index #MSR_IA32_ENERGY_PERF_BIAS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 3:0] Power Policy Preference: 0 indicates preference to highest
- /// performance. 15 indicates preference to maximize energy saving.
- ///
- UINT32 PowerPolicyPreference:4;
- UINT32 Reserved1:28;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_ENERGY_PERF_BIAS_REGISTER;
-
-
-/**
- Package Thermal Status Information (RO) Contains status information about
- the package's thermal sensor. See Section 14.8, "Package Level Thermal
- Management.". If CPUID.06H: EAX[6] = 1.
-
- @param ECX MSR_IA32_PACKAGE_THERM_STATUS (0x000001B1)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PACKAGE_THERM_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PACKAGE_THERM_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PACKAGE_THERM_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PACKAGE_THERM_STATUS);
- @endcode
- @note MSR_IA32_PACKAGE_THERM_STATUS is defined as IA32_PACKAGE_THERM_STATUS in SDM.
-**/
-#define MSR_IA32_PACKAGE_THERM_STATUS 0x000001B1
-
-/**
- MSR information returned for MSR index #MSR_IA32_PACKAGE_THERM_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Pkg Thermal Status (RO):.
- ///
- UINT32 ThermalStatus:1;
- ///
- /// [Bit 1] Pkg Thermal Status Log (R/W):.
- ///
- UINT32 ThermalStatusLog:1;
- ///
- /// [Bit 2] Pkg PROCHOT # event (RO).
- ///
- UINT32 PROCHOT_Event:1;
- ///
- /// [Bit 3] Pkg PROCHOT # log (R/WC0).
- ///
- UINT32 PROCHOT_Log:1;
- ///
- /// [Bit 4] Pkg Critical Temperature Status (RO).
- ///
- UINT32 CriticalTempStatus:1;
- ///
- /// [Bit 5] Pkg Critical Temperature Status log (R/WC0).
- ///
- UINT32 CriticalTempStatusLog:1;
- ///
- /// [Bit 6] Pkg Thermal Threshold #1 Status (RO).
- ///
- UINT32 ThermalThreshold1Status:1;
- ///
- /// [Bit 7] Pkg Thermal Threshold #1 log (R/WC0).
- ///
- UINT32 ThermalThreshold1Log:1;
- ///
- /// [Bit 8] Pkg Thermal Threshold #2 Status (RO).
- ///
- UINT32 ThermalThreshold2Status:1;
- ///
- /// [Bit 9] Pkg Thermal Threshold #1 log (R/WC0).
- ///
- UINT32 ThermalThreshold2Log:1;
- ///
- /// [Bit 10] Pkg Power Limitation Status (RO).
- ///
- UINT32 PowerLimitStatus:1;
- ///
- /// [Bit 11] Pkg Power Limitation log (R/WC0).
- ///
- UINT32 PowerLimitLog:1;
- UINT32 Reserved1:4;
- ///
- /// [Bits 22:16] Pkg Digital Readout (RO).
- ///
- UINT32 DigitalReadout:7;
- UINT32 Reserved2:9;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PACKAGE_THERM_STATUS_REGISTER;
-
-
-/**
- Pkg Thermal Interrupt Control (R/W) Enables and disables the generation of
- an interrupt on temperature transitions detected with the package's thermal
- sensor. See Section 14.8, "Package Level Thermal Management.". If CPUID.06H:
- EAX[6] = 1.
-
- @param ECX MSR_IA32_PACKAGE_THERM_INTERRUPT (0x000001B2)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PACKAGE_THERM_INTERRUPT);
- AsmWriteMsr64 (MSR_IA32_PACKAGE_THERM_INTERRUPT, Msr.Uint64);
- @endcode
- @note MSR_IA32_PACKAGE_THERM_INTERRUPT is defined as IA32_PACKAGE_THERM_INTERRUPT in SDM.
-**/
-#define MSR_IA32_PACKAGE_THERM_INTERRUPT 0x000001B2
-
-/**
- MSR information returned for MSR index #MSR_IA32_PACKAGE_THERM_INTERRUPT
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Pkg High-Temperature Interrupt Enable.
- ///
- UINT32 HighTempEnable:1;
- ///
- /// [Bit 1] Pkg Low-Temperature Interrupt Enable.
- ///
- UINT32 LowTempEnable:1;
- ///
- /// [Bit 2] Pkg PROCHOT# Interrupt Enable.
- ///
- UINT32 PROCHOT_Enable:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 4] Pkg Overheat Interrupt Enable.
- ///
- UINT32 OverheatEnable:1;
- UINT32 Reserved2:3;
- ///
- /// [Bits 14:8] Pkg Threshold #1 Value.
- ///
- UINT32 Threshold1:7;
- ///
- /// [Bit 15] Pkg Threshold #1 Interrupt Enable.
- ///
- UINT32 Threshold1Enable:1;
- ///
- /// [Bits 22:16] Pkg Threshold #2 Value.
- ///
- UINT32 Threshold2:7;
- ///
- /// [Bit 23] Pkg Threshold #2 Interrupt Enable.
- ///
- UINT32 Threshold2Enable:1;
- ///
- /// [Bit 24] Pkg Power Limit Notification Enable.
- ///
- UINT32 PowerLimitNotificationEnable:1;
- UINT32 Reserved3:7;
- UINT32 Reserved4:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PACKAGE_THERM_INTERRUPT_REGISTER;
-
-
-/**
- Trace/Profile Resource Control (R/W). Introduced at Display Family / Display
- Model 06_0EH.
-
- @param ECX MSR_IA32_DEBUGCTL (0x000001D9)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_DEBUGCTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_DEBUGCTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_DEBUGCTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DEBUGCTL);
- AsmWriteMsr64 (MSR_IA32_DEBUGCTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_DEBUGCTL is defined as IA32_DEBUGCTL in SDM.
-**/
-#define MSR_IA32_DEBUGCTL 0x000001D9
-
-/**
- MSR information returned for MSR index #MSR_IA32_DEBUGCTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] LBR: Setting this bit to 1 enables the processor to record a
- /// running trace of the most recent branches taken by the processor in
- /// the LBR stack. Introduced at Display Family / Display Model 06_01H.
- ///
- UINT32 LBR:1;
- ///
- /// [Bit 1] BTF: Setting this bit to 1 enables the processor to treat
- /// EFLAGS.TF as single-step on branches instead of single-step on
- /// instructions. Introduced at Display Family / Display Model 06_01H.
- ///
- UINT32 BTF:1;
- UINT32 Reserved1:4;
- ///
- /// [Bit 6] TR: Setting this bit to 1 enables branch trace messages to be
- /// sent. Introduced at Display Family / Display Model 06_0EH.
- ///
- UINT32 TR:1;
- ///
- /// [Bit 7] BTS: Setting this bit enables branch trace messages (BTMs) to
- /// be logged in a BTS buffer. Introduced at Display Family / Display
- /// Model 06_0EH.
- ///
- UINT32 BTS:1;
- ///
- /// [Bit 8] BTINT: When clear, BTMs are logged in a BTS buffer in circular
- /// fashion. When this bit is set, an interrupt is generated by the BTS
- /// facility when the BTS buffer is full. Introduced at Display Family /
- /// Display Model 06_0EH.
- ///
- UINT32 BTINT:1;
- ///
- /// [Bit 9] BTS_OFF_OS: When set, BTS or BTM is skipped if CPL = 0.
- /// Introduced at Display Family / Display Model 06_0FH.
- ///
- UINT32 BTS_OFF_OS:1;
- ///
- /// [Bit 10] BTS_OFF_USR: When set, BTS or BTM is skipped if CPL > 0.
- /// Introduced at Display Family / Display Model 06_0FH.
- ///
- UINT32 BTS_OFF_USR:1;
- ///
- /// [Bit 11] FREEZE_LBRS_ON_PMI: When set, the LBR stack is frozen on a
- /// PMI request. If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1.
- ///
- UINT32 FREEZE_LBRS_ON_PMI:1;
- ///
- /// [Bit 12] FREEZE_PERFMON_ON_PMI: When set, each ENABLE bit of the
- /// global counter control MSR are frozen (address 38FH) on a PMI request.
- /// If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1.
- ///
- UINT32 FREEZE_PERFMON_ON_PMI:1;
- ///
- /// [Bit 13] ENABLE_UNCORE_PMI: When set, enables the logical processor to
- /// receive and generate PMI on behalf of the uncore. Introduced at
- /// Display Family / Display Model 06_1AH.
- ///
- UINT32 ENABLE_UNCORE_PMI:1;
- ///
- /// [Bit 14] FREEZE_WHILE_SMM: When set, freezes perfmon and trace
- /// messages while in SMM. If IA32_PERF_CAPABILITIES[ 12] = 1.
- ///
- UINT32 FREEZE_WHILE_SMM:1;
- ///
- /// [Bit 15] RTM_DEBUG: When set, enables DR7 debug bit on XBEGIN. If
- /// (CPUID.(EAX=07H, ECX=0):EBX[11] = 1).
- ///
- UINT32 RTM_DEBUG:1;
- UINT32 Reserved2:16;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_DEBUGCTL_REGISTER;
-
-
-/**
- SMRR Base Address (Writeable only in SMM) Base address of SMM memory range.
- If IA32_MTRRCAP.SMRR[11] = 1.
-
- @param ECX MSR_IA32_SMRR_PHYSBASE (0x000001F2)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_SMRR_PHYSBASE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_SMRR_PHYSBASE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_SMRR_PHYSBASE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMRR_PHYSBASE);
- AsmWriteMsr64 (MSR_IA32_SMRR_PHYSBASE, Msr.Uint64);
- @endcode
- @note MSR_IA32_SMRR_PHYSBASE is defined as IA32_SMRR_PHYSBASE in SDM.
-**/
-#define MSR_IA32_SMRR_PHYSBASE 0x000001F2
-
-/**
- MSR information returned for MSR index #MSR_IA32_SMRR_PHYSBASE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Type. Specifies memory type of the range.
- ///
- UINT32 Type:8;
- UINT32 Reserved1:4;
- ///
- /// [Bits 31:12] PhysBase. SMRR physical Base Address.
- ///
- UINT32 PhysBase:20;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_SMRR_PHYSBASE_REGISTER;
-
-
-/**
- SMRR Range Mask (Writeable only in SMM) Range Mask of SMM memory range. If
- IA32_MTRRCAP[SMRR] = 1.
-
- @param ECX MSR_IA32_SMRR_PHYSMASK (0x000001F3)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_SMRR_PHYSMASK_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_SMRR_PHYSMASK_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_SMRR_PHYSMASK_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SMRR_PHYSMASK);
- AsmWriteMsr64 (MSR_IA32_SMRR_PHYSMASK, Msr.Uint64);
- @endcode
- @note MSR_IA32_SMRR_PHYSMASK is defined as IA32_SMRR_PHYSMASK in SDM.
-**/
-#define MSR_IA32_SMRR_PHYSMASK 0x000001F3
-
-/**
- MSR information returned for MSR index #MSR_IA32_SMRR_PHYSMASK
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved1:11;
- ///
- /// [Bit 11] Valid Enable range mask.
- ///
- UINT32 Valid:1;
- ///
- /// [Bits 31:12] PhysMask SMRR address range mask.
- ///
- UINT32 PhysMask:20;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_SMRR_PHYSMASK_REGISTER;
-
-
-/**
- DCA Capability (R). If CPUID.01H: ECX[18] = 1.
-
- @param ECX MSR_IA32_PLATFORM_DCA_CAP (0x000001F8)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_PLATFORM_DCA_CAP);
- @endcode
- @note MSR_IA32_PLATFORM_DCA_CAP is defined as IA32_PLATFORM_DCA_CAP in SDM.
-**/
-#define MSR_IA32_PLATFORM_DCA_CAP 0x000001F8
-
-
-/**
- If set, CPU supports Prefetch-Hint type. If CPUID.01H: ECX[18] = 1.
-
- @param ECX MSR_IA32_CPU_DCA_CAP (0x000001F9)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_CPU_DCA_CAP);
- AsmWriteMsr64 (MSR_IA32_CPU_DCA_CAP, Msr);
- @endcode
- @note MSR_IA32_CPU_DCA_CAP is defined as IA32_CPU_DCA_CAP in SDM.
-**/
-#define MSR_IA32_CPU_DCA_CAP 0x000001F9
-
-
-/**
- DCA type 0 Status and Control register. If CPUID.01H: ECX[18] = 1.
-
- @param ECX MSR_IA32_DCA_0_CAP (0x000001FA)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_DCA_0_CAP_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_DCA_0_CAP_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_DCA_0_CAP_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DCA_0_CAP);
- AsmWriteMsr64 (MSR_IA32_DCA_0_CAP, Msr.Uint64);
- @endcode
- @note MSR_IA32_DCA_0_CAP is defined as IA32_DCA_0_CAP in SDM.
-**/
-#define MSR_IA32_DCA_0_CAP 0x000001FA
-
-/**
- MSR information returned for MSR index #MSR_IA32_DCA_0_CAP
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] DCA_ACTIVE: Set by HW when DCA is fuseenabled and no
- /// defeatures are set.
- ///
- UINT32 DCA_ACTIVE:1;
- ///
- /// [Bits 2:1] TRANSACTION.
- ///
- UINT32 TRANSACTION:2;
- ///
- /// [Bits 6:3] DCA_TYPE.
- ///
- UINT32 DCA_TYPE:4;
- ///
- /// [Bits 10:7] DCA_QUEUE_SIZE.
- ///
- UINT32 DCA_QUEUE_SIZE:4;
- UINT32 Reserved1:2;
- ///
- /// [Bits 16:13] DCA_DELAY: Writes will update the register but have no HW
- /// side-effect.
- ///
- UINT32 DCA_DELAY:4;
- UINT32 Reserved2:7;
- ///
- /// [Bit 24] SW_BLOCK: SW can request DCA block by setting this bit.
- ///
- UINT32 SW_BLOCK:1;
- UINT32 Reserved3:1;
- ///
- /// [Bit 26] HW_BLOCK: Set when DCA is blocked by HW (e.g. CR0.CD = 1).
- ///
- UINT32 HW_BLOCK:1;
- UINT32 Reserved4:5;
- UINT32 Reserved5:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_DCA_0_CAP_REGISTER;
-
-
-/**
- MTRRphysBasen. See Section 11.11.2.3, "Variable Range MTRRs".
- If CPUID.01H: EDX.MTRR[12] = 1 and IA32_MTRRCAP[7:0] > n.
-
- @param ECX MSR_IA32_MTRR_PHYSBASEn
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_PHYSBASE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_PHYSBASE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MTRR_PHYSBASE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_PHYSBASE0);
- AsmWriteMsr64 (MSR_IA32_MTRR_PHYSBASE0, Msr.Uint64);
- @endcode
- @note MSR_IA32_MTRR_PHYSBASE0 is defined as IA32_MTRR_PHYSBASE0 in SDM.
- MSR_IA32_MTRR_PHYSBASE1 is defined as IA32_MTRR_PHYSBASE1 in SDM.
- MSR_IA32_MTRR_PHYSBASE2 is defined as IA32_MTRR_PHYSBASE2 in SDM.
- MSR_IA32_MTRR_PHYSBASE3 is defined as IA32_MTRR_PHYSBASE3 in SDM.
- MSR_IA32_MTRR_PHYSBASE4 is defined as IA32_MTRR_PHYSBASE4 in SDM.
- MSR_IA32_MTRR_PHYSBASE5 is defined as IA32_MTRR_PHYSBASE5 in SDM.
- MSR_IA32_MTRR_PHYSBASE6 is defined as IA32_MTRR_PHYSBASE6 in SDM.
- MSR_IA32_MTRR_PHYSBASE7 is defined as IA32_MTRR_PHYSBASE7 in SDM.
- MSR_IA32_MTRR_PHYSBASE8 is defined as IA32_MTRR_PHYSBASE8 in SDM.
- MSR_IA32_MTRR_PHYSBASE9 is defined as IA32_MTRR_PHYSBASE9 in SDM.
- @{
-**/
-#define MSR_IA32_MTRR_PHYSBASE0 0x00000200
-#define MSR_IA32_MTRR_PHYSBASE1 0x00000202
-#define MSR_IA32_MTRR_PHYSBASE2 0x00000204
-#define MSR_IA32_MTRR_PHYSBASE3 0x00000206
-#define MSR_IA32_MTRR_PHYSBASE4 0x00000208
-#define MSR_IA32_MTRR_PHYSBASE5 0x0000020A
-#define MSR_IA32_MTRR_PHYSBASE6 0x0000020C
-#define MSR_IA32_MTRR_PHYSBASE7 0x0000020E
-#define MSR_IA32_MTRR_PHYSBASE8 0x00000210
-#define MSR_IA32_MTRR_PHYSBASE9 0x00000212
-/// @}
-
-/**
- MSR information returned for MSR indexes #MSR_IA32_MTRR_PHYSBASE0 to
- #MSR_IA32_MTRR_PHYSBASE9
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Type. Specifies memory type of the range.
- ///
- UINT32 Type:8;
- UINT32 Reserved1:4;
- ///
- /// [Bits 31:12] PhysBase. MTRR physical Base Address.
- ///
- UINT32 PhysBase:20;
- ///
- /// [Bits MAXPHYSADDR:32] PhysBase. Upper bits of MTRR physical Base Address.
- /// MAXPHYADDR: The bit position indicated by MAXPHYADDR depends on the
- /// maximum physical address range supported by the processor. It is
- /// reported by CPUID leaf function 80000008H. If CPUID does not support
- /// leaf 80000008H, the processor supports 36-bit physical address size,
- /// then bit PhysMask consists of bits 35:12, and bits 63:36 are reserved.
- ///
- UINT32 PhysBaseHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MTRR_PHYSBASE_REGISTER;
-
-
-/**
- MTRRphysMaskn. See Section 11.11.2.3, "Variable Range MTRRs".
- If CPUID.01H: EDX.MTRR[12] = 1 and IA32_MTRRCAP[7:0] > n.
-
- @param ECX MSR_IA32_MTRR_PHYSMASKn
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_PHYSMASK_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_PHYSMASK_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MTRR_PHYSMASK_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_PHYSMASK0);
- AsmWriteMsr64 (MSR_IA32_MTRR_PHYSMASK0, Msr.Uint64);
- @endcode
- @note MSR_IA32_MTRR_PHYSMASK0 is defined as IA32_MTRR_PHYSMASK0 in SDM.
- MSR_IA32_MTRR_PHYSMASK1 is defined as IA32_MTRR_PHYSMASK1 in SDM.
- MSR_IA32_MTRR_PHYSMASK2 is defined as IA32_MTRR_PHYSMASK2 in SDM.
- MSR_IA32_MTRR_PHYSMASK3 is defined as IA32_MTRR_PHYSMASK3 in SDM.
- MSR_IA32_MTRR_PHYSMASK4 is defined as IA32_MTRR_PHYSMASK4 in SDM.
- MSR_IA32_MTRR_PHYSMASK5 is defined as IA32_MTRR_PHYSMASK5 in SDM.
- MSR_IA32_MTRR_PHYSMASK6 is defined as IA32_MTRR_PHYSMASK6 in SDM.
- MSR_IA32_MTRR_PHYSMASK7 is defined as IA32_MTRR_PHYSMASK7 in SDM.
- MSR_IA32_MTRR_PHYSMASK8 is defined as IA32_MTRR_PHYSMASK8 in SDM.
- MSR_IA32_MTRR_PHYSMASK9 is defined as IA32_MTRR_PHYSMASK9 in SDM.
- @{
-**/
-#define MSR_IA32_MTRR_PHYSMASK0 0x00000201
-#define MSR_IA32_MTRR_PHYSMASK1 0x00000203
-#define MSR_IA32_MTRR_PHYSMASK2 0x00000205
-#define MSR_IA32_MTRR_PHYSMASK3 0x00000207
-#define MSR_IA32_MTRR_PHYSMASK4 0x00000209
-#define MSR_IA32_MTRR_PHYSMASK5 0x0000020B
-#define MSR_IA32_MTRR_PHYSMASK6 0x0000020D
-#define MSR_IA32_MTRR_PHYSMASK7 0x0000020F
-#define MSR_IA32_MTRR_PHYSMASK8 0x00000211
-#define MSR_IA32_MTRR_PHYSMASK9 0x00000213
-/// @}
-
-/**
- MSR information returned for MSR indexes #MSR_IA32_MTRR_PHYSMASK0 to
- #MSR_IA32_MTRR_PHYSMASK9
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved1:11;
- ///
- /// [Bit 11] Valid Enable range mask.
- ///
- UINT32 V:1;
- ///
- /// [Bits 31:12] PhysMask. MTRR address range mask.
- ///
- UINT32 PhysMask:20;
- ///
- /// [Bits MAXPHYSADDR:32] PhysMask. Upper bits of MTRR address range mask.
- /// MAXPHYADDR: The bit position indicated by MAXPHYADDR depends on the
- /// maximum physical address range supported by the processor. It is
- /// reported by CPUID leaf function 80000008H. If CPUID does not support
- /// leaf 80000008H, the processor supports 36-bit physical address size,
- /// then bit PhysMask consists of bits 35:12, and bits 63:36 are reserved.
- ///
- UINT32 PhysMaskHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MTRR_PHYSMASK_REGISTER;
-
-
-/**
- MTRRfix64K_00000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX64K_00000 (0x00000250)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX64K_00000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX64K_00000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX64K_00000 is defined as IA32_MTRR_FIX64K_00000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX64K_00000 0x00000250
-
-
-/**
- MTRRfix16K_80000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX16K_80000 (0x00000258)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX16K_80000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX16K_80000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX16K_80000 is defined as IA32_MTRR_FIX16K_80000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX16K_80000 0x00000258
-
-
-/**
- MTRRfix16K_A0000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX16K_A0000 (0x00000259)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX16K_A0000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX16K_A0000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX16K_A0000 is defined as IA32_MTRR_FIX16K_A0000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX16K_A0000 0x00000259
-
-
-/**
- See Section 11.11.2.2, "Fixed Range MTRRs.". If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_C0000 (0x00000268)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_C0000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_C0000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_C0000 is defined as IA32_MTRR_FIX4K_C0000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_C0000 0x00000268
-
-
-/**
- MTRRfix4K_C8000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_C8000 (0x00000269)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_C8000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_C8000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_C8000 is defined as IA32_MTRR_FIX4K_C8000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_C8000 0x00000269
-
-
-/**
- MTRRfix4K_D0000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_D0000 (0x0000026A)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_D0000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_D0000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_D0000 is defined as IA32_MTRR_FIX4K_D0000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_D0000 0x0000026A
-
-
-/**
- MTRRfix4K_D8000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_D8000 (0x0000026B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_D8000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_D8000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_D8000 is defined as IA32_MTRR_FIX4K_D8000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_D8000 0x0000026B
-
-
-/**
- MTRRfix4K_E0000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_E0000 (0x0000026C)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_E0000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_E0000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_E0000 is defined as IA32_MTRR_FIX4K_E0000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_E0000 0x0000026C
-
-
-/**
- MTRRfix4K_E8000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_E8000 (0x0000026D)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_E8000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_E8000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_E8000 is defined as IA32_MTRR_FIX4K_E8000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_E8000 0x0000026D
-
-
-/**
- MTRRfix4K_F0000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_F0000 (0x0000026E)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_F0000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_F0000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_F0000 is defined as IA32_MTRR_FIX4K_F0000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_F0000 0x0000026E
-
-
-/**
- MTRRfix4K_F8000. If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_FIX4K_F8000 (0x0000026F)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MTRR_FIX4K_F8000);
- AsmWriteMsr64 (MSR_IA32_MTRR_FIX4K_F8000, Msr);
- @endcode
- @note MSR_IA32_MTRR_FIX4K_F8000 is defined as IA32_MTRR_FIX4K_F8000 in SDM.
-**/
-#define MSR_IA32_MTRR_FIX4K_F8000 0x0000026F
-
-
-/**
- IA32_PAT (R/W). If CPUID.01H: EDX.MTRR[16] =1.
-
- @param ECX MSR_IA32_PAT (0x00000277)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PAT_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PAT_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PAT_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PAT);
- AsmWriteMsr64 (MSR_IA32_PAT, Msr.Uint64);
- @endcode
- @note MSR_IA32_PAT is defined as IA32_PAT in SDM.
-**/
-#define MSR_IA32_PAT 0x00000277
-
-/**
- MSR information returned for MSR index #MSR_IA32_PAT
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 2:0] PA0.
- ///
- UINT32 PA0:3;
- UINT32 Reserved1:5;
- ///
- /// [Bits 10:8] PA1.
- ///
- UINT32 PA1:3;
- UINT32 Reserved2:5;
- ///
- /// [Bits 18:16] PA2.
- ///
- UINT32 PA2:3;
- UINT32 Reserved3:5;
- ///
- /// [Bits 26:24] PA3.
- ///
- UINT32 PA3:3;
- UINT32 Reserved4:5;
- ///
- /// [Bits 34:32] PA4.
- ///
- UINT32 PA4:3;
- UINT32 Reserved5:5;
- ///
- /// [Bits 42:40] PA5.
- ///
- UINT32 PA5:3;
- UINT32 Reserved6:5;
- ///
- /// [Bits 50:48] PA6.
- ///
- UINT32 PA6:3;
- UINT32 Reserved7:5;
- ///
- /// [Bits 58:56] PA7.
- ///
- UINT32 PA7:3;
- UINT32 Reserved8:5;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PAT_REGISTER;
-
-
-/**
- Provides the programming interface to use corrected MC error signaling
- capability (R/W). If IA32_MCG_CAP[10] = 1 && IA32_MCG_CAP[7:0] > n.
-
- @param ECX MSR_IA32_MCn_CTL2
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MC_CTL2_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MC_CTL2_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MC_CTL2_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MC0_CTL2);
- AsmWriteMsr64 (MSR_IA32_MC0_CTL2, Msr.Uint64);
- @endcode
- @note MSR_IA32_MC0_CTL2 is defined as IA32_MC0_CTL2 in SDM.
- MSR_IA32_MC1_CTL2 is defined as IA32_MC1_CTL2 in SDM.
- MSR_IA32_MC2_CTL2 is defined as IA32_MC2_CTL2 in SDM.
- MSR_IA32_MC3_CTL2 is defined as IA32_MC3_CTL2 in SDM.
- MSR_IA32_MC4_CTL2 is defined as IA32_MC4_CTL2 in SDM.
- MSR_IA32_MC5_CTL2 is defined as IA32_MC5_CTL2 in SDM.
- MSR_IA32_MC6_CTL2 is defined as IA32_MC6_CTL2 in SDM.
- MSR_IA32_MC7_CTL2 is defined as IA32_MC7_CTL2 in SDM.
- MSR_IA32_MC8_CTL2 is defined as IA32_MC8_CTL2 in SDM.
- MSR_IA32_MC9_CTL2 is defined as IA32_MC9_CTL2 in SDM.
- MSR_IA32_MC10_CTL2 is defined as IA32_MC10_CTL2 in SDM.
- MSR_IA32_MC11_CTL2 is defined as IA32_MC11_CTL2 in SDM.
- MSR_IA32_MC12_CTL2 is defined as IA32_MC12_CTL2 in SDM.
- MSR_IA32_MC13_CTL2 is defined as IA32_MC13_CTL2 in SDM.
- MSR_IA32_MC14_CTL2 is defined as IA32_MC14_CTL2 in SDM.
- MSR_IA32_MC15_CTL2 is defined as IA32_MC15_CTL2 in SDM.
- MSR_IA32_MC16_CTL2 is defined as IA32_MC16_CTL2 in SDM.
- MSR_IA32_MC17_CTL2 is defined as IA32_MC17_CTL2 in SDM.
- MSR_IA32_MC18_CTL2 is defined as IA32_MC18_CTL2 in SDM.
- MSR_IA32_MC19_CTL2 is defined as IA32_MC19_CTL2 in SDM.
- MSR_IA32_MC20_CTL2 is defined as IA32_MC20_CTL2 in SDM.
- MSR_IA32_MC21_CTL2 is defined as IA32_MC21_CTL2 in SDM.
- MSR_IA32_MC22_CTL2 is defined as IA32_MC22_CTL2 in SDM.
- MSR_IA32_MC23_CTL2 is defined as IA32_MC23_CTL2 in SDM.
- MSR_IA32_MC24_CTL2 is defined as IA32_MC24_CTL2 in SDM.
- MSR_IA32_MC25_CTL2 is defined as IA32_MC25_CTL2 in SDM.
- MSR_IA32_MC26_CTL2 is defined as IA32_MC26_CTL2 in SDM.
- MSR_IA32_MC27_CTL2 is defined as IA32_MC27_CTL2 in SDM.
- MSR_IA32_MC28_CTL2 is defined as IA32_MC28_CTL2 in SDM.
- MSR_IA32_MC29_CTL2 is defined as IA32_MC29_CTL2 in SDM.
- MSR_IA32_MC30_CTL2 is defined as IA32_MC30_CTL2 in SDM.
- MSR_IA32_MC31_CTL2 is defined as IA32_MC31_CTL2 in SDM.
- @{
-**/
-#define MSR_IA32_MC0_CTL2 0x00000280
-#define MSR_IA32_MC1_CTL2 0x00000281
-#define MSR_IA32_MC2_CTL2 0x00000282
-#define MSR_IA32_MC3_CTL2 0x00000283
-#define MSR_IA32_MC4_CTL2 0x00000284
-#define MSR_IA32_MC5_CTL2 0x00000285
-#define MSR_IA32_MC6_CTL2 0x00000286
-#define MSR_IA32_MC7_CTL2 0x00000287
-#define MSR_IA32_MC8_CTL2 0x00000288
-#define MSR_IA32_MC9_CTL2 0x00000289
-#define MSR_IA32_MC10_CTL2 0x0000028A
-#define MSR_IA32_MC11_CTL2 0x0000028B
-#define MSR_IA32_MC12_CTL2 0x0000028C
-#define MSR_IA32_MC13_CTL2 0x0000028D
-#define MSR_IA32_MC14_CTL2 0x0000028E
-#define MSR_IA32_MC15_CTL2 0x0000028F
-#define MSR_IA32_MC16_CTL2 0x00000290
-#define MSR_IA32_MC17_CTL2 0x00000291
-#define MSR_IA32_MC18_CTL2 0x00000292
-#define MSR_IA32_MC19_CTL2 0x00000293
-#define MSR_IA32_MC20_CTL2 0x00000294
-#define MSR_IA32_MC21_CTL2 0x00000295
-#define MSR_IA32_MC22_CTL2 0x00000296
-#define MSR_IA32_MC23_CTL2 0x00000297
-#define MSR_IA32_MC24_CTL2 0x00000298
-#define MSR_IA32_MC25_CTL2 0x00000299
-#define MSR_IA32_MC26_CTL2 0x0000029A
-#define MSR_IA32_MC27_CTL2 0x0000029B
-#define MSR_IA32_MC28_CTL2 0x0000029C
-#define MSR_IA32_MC29_CTL2 0x0000029D
-#define MSR_IA32_MC30_CTL2 0x0000029E
-#define MSR_IA32_MC31_CTL2 0x0000029F
-/// @}
-
-/**
- MSR information returned for MSR indexes #MSR_IA32_MC0_CTL2
- to #MSR_IA32_MC31_CTL2
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 14:0] Corrected error count threshold.
- ///
- UINT32 CorrectedErrorCountThreshold:15;
- UINT32 Reserved1:15;
- ///
- /// [Bit 30] CMCI_EN.
- ///
- UINT32 CMCI_EN:1;
- UINT32 Reserved2:1;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MC_CTL2_REGISTER;
-
-
-/**
- MTRRdefType (R/W). If CPUID.01H: EDX.MTRR[12] =1.
-
- @param ECX MSR_IA32_MTRR_DEF_TYPE (0x000002FF)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_DEF_TYPE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MTRR_DEF_TYPE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MTRR_DEF_TYPE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE);
- AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, Msr.Uint64);
- @endcode
- @note MSR_IA32_MTRR_DEF_TYPE is defined as IA32_MTRR_DEF_TYPE in SDM.
-**/
-#define MSR_IA32_MTRR_DEF_TYPE 0x000002FF
-
-/**
- MSR information returned for MSR index #MSR_IA32_MTRR_DEF_TYPE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 2:0] Default Memory Type.
- ///
- UINT32 Type:3;
- UINT32 Reserved1:7;
- ///
- /// [Bit 10] Fixed Range MTRR Enable.
- ///
- UINT32 FE:1;
- ///
- /// [Bit 11] MTRR Enable.
- ///
- UINT32 E:1;
- UINT32 Reserved2:20;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MTRR_DEF_TYPE_REGISTER;
-
-
-/**
- Fixed-Function Performance Counter 0 (R/W): Counts Instr_Retired.Any. If
- CPUID.0AH: EDX[4:0] > 0.
-
- @param ECX MSR_IA32_FIXED_CTR0 (0x00000309)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR0);
- AsmWriteMsr64 (MSR_IA32_FIXED_CTR0, Msr);
- @endcode
- @note MSR_IA32_FIXED_CTR0 is defined as IA32_FIXED_CTR0 in SDM.
-**/
-#define MSR_IA32_FIXED_CTR0 0x00000309
-
-
-/**
- Fixed-Function Performance Counter 1 (R/W): Counts CPU_CLK_Unhalted.Core. If
- CPUID.0AH: EDX[4:0] > 1.
-
- @param ECX MSR_IA32_FIXED_CTR1 (0x0000030A)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR1);
- AsmWriteMsr64 (MSR_IA32_FIXED_CTR1, Msr);
- @endcode
- @note MSR_IA32_FIXED_CTR1 is defined as IA32_FIXED_CTR1 in SDM.
-**/
-#define MSR_IA32_FIXED_CTR1 0x0000030A
-
-
-/**
- Fixed-Function Performance Counter 2 (R/W): Counts CPU_CLK_Unhalted.Ref. If
- CPUID.0AH: EDX[4:0] > 2.
-
- @param ECX MSR_IA32_FIXED_CTR2 (0x0000030B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_FIXED_CTR2);
- AsmWriteMsr64 (MSR_IA32_FIXED_CTR2, Msr);
- @endcode
- @note MSR_IA32_FIXED_CTR2 is defined as IA32_FIXED_CTR2 in SDM.
-**/
-#define MSR_IA32_FIXED_CTR2 0x0000030B
-
-
-/**
- RO. If CPUID.01H: ECX[15] = 1.
-
- @param ECX MSR_IA32_PERF_CAPABILITIES (0x00000345)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_CAPABILITIES_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_CAPABILITIES_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_CAPABILITIES_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_CAPABILITIES);
- AsmWriteMsr64 (MSR_IA32_PERF_CAPABILITIES, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_CAPABILITIES is defined as IA32_PERF_CAPABILITIES in SDM.
-**/
-#define MSR_IA32_PERF_CAPABILITIES 0x00000345
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_CAPABILITIES
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 5:0] LBR format.
- ///
- UINT32 LBR_FMT:6;
- ///
- /// [Bit 6] PEBS Trap.
- ///
- UINT32 PEBS_TRAP:1;
- ///
- /// [Bit 7] PEBSSaveArchRegs.
- ///
- UINT32 PEBS_ARCH_REG:1;
- ///
- /// [Bits 11:8] PEBS Record Format.
- ///
- UINT32 PEBS_REC_FMT:4;
- ///
- /// [Bit 12] 1: Freeze while SMM is supported.
- ///
- UINT32 SMM_FREEZE:1;
- ///
- /// [Bit 13] 1: Full width of counter writable via IA32_A_PMCx.
- ///
- UINT32 FW_WRITE:1;
- UINT32 Reserved1:18;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_CAPABILITIES_REGISTER;
-
-
-/**
- Fixed-Function Performance Counter Control (R/W) Counter increments while
- the results of ANDing respective enable bit in IA32_PERF_GLOBAL_CTRL with
- the corresponding OS or USR bits in this MSR is true. If CPUID.0AH: EAX[7:0]
- > 1.
-
- @param ECX MSR_IA32_FIXED_CTR_CTRL (0x0000038D)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_FIXED_CTR_CTRL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_FIXED_CTR_CTRL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_FIXED_CTR_CTRL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_FIXED_CTR_CTRL);
- AsmWriteMsr64 (MSR_IA32_FIXED_CTR_CTRL, Msr.Uint64);
- @endcode
- @note MSR_IA32_FIXED_CTR_CTRL is defined as IA32_FIXED_CTR_CTRL in SDM.
-**/
-#define MSR_IA32_FIXED_CTR_CTRL 0x0000038D
-
-/**
- MSR information returned for MSR index #MSR_IA32_FIXED_CTR_CTRL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] EN0_OS: Enable Fixed Counter 0 to count while CPL = 0.
- ///
- UINT32 EN0_OS:1;
- ///
- /// [Bit 1] EN0_Usr: Enable Fixed Counter 0 to count while CPL > 0.
- ///
- UINT32 EN0_Usr:1;
- ///
- /// [Bit 2] AnyThread: When set to 1, it enables counting the associated
- /// event conditions occurring across all logical processors sharing a
- /// processor core. When set to 0, the counter only increments the
- /// associated event conditions occurring in the logical processor which
- /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
- ///
- UINT32 AnyThread0:1;
- ///
- /// [Bit 3] EN0_PMI: Enable PMI when fixed counter 0 overflows.
- ///
- UINT32 EN0_PMI:1;
- ///
- /// [Bit 4] EN1_OS: Enable Fixed Counter 1 to count while CPL = 0.
- ///
- UINT32 EN1_OS:1;
- ///
- /// [Bit 5] EN1_Usr: Enable Fixed Counter 1 to count while CPL > 0.
- ///
- UINT32 EN1_Usr:1;
- ///
- /// [Bit 6] AnyThread: When set to 1, it enables counting the associated
- /// event conditions occurring across all logical processors sharing a
- /// processor core. When set to 0, the counter only increments the
- /// associated event conditions occurring in the logical processor which
- /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
- ///
- UINT32 AnyThread1:1;
- ///
- /// [Bit 7] EN1_PMI: Enable PMI when fixed counter 1 overflows.
- ///
- UINT32 EN1_PMI:1;
- ///
- /// [Bit 8] EN2_OS: Enable Fixed Counter 2 to count while CPL = 0.
- ///
- UINT32 EN2_OS:1;
- ///
- /// [Bit 9] EN2_Usr: Enable Fixed Counter 2 to count while CPL > 0.
- ///
- UINT32 EN2_Usr:1;
- ///
- /// [Bit 10] AnyThread: When set to 1, it enables counting the associated
- /// event conditions occurring across all logical processors sharing a
- /// processor core. When set to 0, the counter only increments the
- /// associated event conditions occurring in the logical processor which
- /// programmed the MSR. If CPUID.0AH: EAX[7:0] > 2.
- ///
- UINT32 AnyThread2:1;
- ///
- /// [Bit 11] EN2_PMI: Enable PMI when fixed counter 2 overflows.
- ///
- UINT32 EN2_PMI:1;
- UINT32 Reserved1:20;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_FIXED_CTR_CTRL_REGISTER;
-
-
-/**
- Global Performance Counter Status (RO). If CPUID.0AH: EAX[7:0] > 0.
-
- @param ECX MSR_IA32_PERF_GLOBAL_STATUS (0x0000038E)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_STATUS is defined as IA32_PERF_GLOBAL_STATUS in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_STATUS 0x0000038E
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Ovf_PMC0: Overflow status of IA32_PMC0. If CPUID.0AH:
- /// EAX[15:8] > 0.
- ///
- UINT32 Ovf_PMC0:1;
- ///
- /// [Bit 1] Ovf_PMC1: Overflow status of IA32_PMC1. If CPUID.0AH:
- /// EAX[15:8] > 1.
- ///
- UINT32 Ovf_PMC1:1;
- ///
- /// [Bit 2] Ovf_PMC2: Overflow status of IA32_PMC2. If CPUID.0AH:
- /// EAX[15:8] > 2.
- ///
- UINT32 Ovf_PMC2:1;
- ///
- /// [Bit 3] Ovf_PMC3: Overflow status of IA32_PMC3. If CPUID.0AH:
- /// EAX[15:8] > 3.
- ///
- UINT32 Ovf_PMC3:1;
- UINT32 Reserved1:28;
- ///
- /// [Bit 32] Ovf_FixedCtr0: Overflow status of IA32_FIXED_CTR0. If
- /// CPUID.0AH: EAX[7:0] > 1.
- ///
- UINT32 Ovf_FixedCtr0:1;
- ///
- /// [Bit 33] Ovf_FixedCtr1: Overflow status of IA32_FIXED_CTR1. If
- /// CPUID.0AH: EAX[7:0] > 1.
- ///
- UINT32 Ovf_FixedCtr1:1;
- ///
- /// [Bit 34] Ovf_FixedCtr2: Overflow status of IA32_FIXED_CTR2. If
- /// CPUID.0AH: EAX[7:0] > 1.
- ///
- UINT32 Ovf_FixedCtr2:1;
- UINT32 Reserved2:20;
- ///
- /// [Bit 55] Trace_ToPA_PMI: A PMI occurred due to a ToPA entry memory
- /// buffer was completely filled. If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1)
- /// && IA32_RTIT_CTL.ToPA = 1.
- ///
- UINT32 Trace_ToPA_PMI:1;
- UINT32 Reserved3:2;
- ///
- /// [Bit 58] LBR_Frz: LBRs are frozen due to -
- /// IA32_DEBUGCTL.FREEZE_LBR_ON_PMI=1, - The LBR stack overflowed. If
- /// CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 LBR_Frz:1;
- ///
- /// [Bit 59] CTR_Frz: Performance counters in the core PMU are frozen due
- /// to - IA32_DEBUGCTL.FREEZE_PERFMON_ON_ PMI=1, - one or more core PMU
- /// counters overflowed. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 CTR_Frz:1;
- ///
- /// [Bit 60] ASCI: Data in the performance counters in the core PMU may
- /// include contributions from the direct or indirect operation intel SGX
- /// to protect an enclave. If CPUID.(EAX=07H, ECX=0):EBX[2] = 1.
- ///
- UINT32 ASCI:1;
- ///
- /// [Bit 61] Ovf_Uncore: Uncore counter overflow status. If CPUID.0AH:
- /// EAX[7:0] > 2.
- ///
- UINT32 Ovf_Uncore:1;
- ///
- /// [Bit 62] OvfBuf: DS SAVE area Buffer overflow status. If CPUID.0AH:
- /// EAX[7:0] > 0.
- ///
- UINT32 OvfBuf:1;
- ///
- /// [Bit 63] CondChgd: status bits of this register has changed. If
- /// CPUID.0AH: EAX[7:0] > 0.
- ///
- UINT32 CondChgd:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_STATUS_REGISTER;
-
-
-/**
- Global Performance Counter Control (R/W) Counter increments while the result
- of ANDing respective enable bit in this MSR with the corresponding OS or USR
- bits in the general-purpose or fixed counter control MSR is true. If
- CPUID.0AH: EAX[7:0] > 0.
-
- @param ECX MSR_IA32_PERF_GLOBAL_CTRL (0x0000038F)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_CTRL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_CTRL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_CTRL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_CTRL);
- AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_CTRL, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_CTRL is defined as IA32_PERF_GLOBAL_CTRL in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_CTRL 0x0000038F
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_CTRL
-**/
-typedef union {
- ///
- /// Individual bit fields
-///
- struct {
- ///
- /// [Bits 31:0] EN_PMCn. If CPUID.0AH: EAX[15:8] > n.
- /// Enable bitmask. Only the first n-1 bits are valid.
- /// Bits n..31 are reserved.
- ///
- UINT32 EN_PMCn:32;
- ///
- /// [Bits 63:32] EN_FIXED_CTRn. If CPUID.0AH: EDX[4:0] > n.
- /// Enable bitmask. Only the first n-1 bits are valid.
- /// Bits 31:n are reserved.
- ///
- UINT32 EN_FIXED_CTRn:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_CTRL_REGISTER;
-
-
-/**
- Global Performance Counter Overflow Control (R/W). If CPUID.0AH: EAX[7:0] >
- 0 && CPUID.0AH: EAX[7:0] <= 3.
-
- @param ECX MSR_IA32_PERF_GLOBAL_OVF_CTRL (0x00000390)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_OVF_CTRL);
- AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_OVF_CTRL, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_OVF_CTRL is defined as IA32_PERF_GLOBAL_OVF_CTRL in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_OVF_CTRL 0x00000390
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_OVF_CTRL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Set 1 to Clear Ovf_PMC0 bit. If CPUID.0AH: EAX[15:8] > n.
- /// Clear bitmask. Only the first n-1 bits are valid.
- /// Bits 31:n are reserved.
- ///
- UINT32 Ovf_PMCn:32;
- ///
- /// [Bits 54:32] Set 1 to Clear Ovf_FIXED_CTR0 bit.
- /// If CPUID.0AH: EDX[4:0] > n.
- /// Clear bitmask. Only the first n-1 bits are valid.
- /// Bits 22:n are reserved.
- ///
- UINT32 Ovf_FIXED_CTRn:23;
- ///
- /// [Bit 55] Set 1 to Clear Trace_ToPA_PMI bit. If (CPUID.(EAX=07H,
- /// ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA = 1.
- ///
- UINT32 Trace_ToPA_PMI:1;
- UINT32 Reserved2:5;
- ///
- /// [Bit 61] Set 1 to Clear Ovf_Uncore bit. Introduced at Display Family /
- /// Display Model 06_2EH.
- ///
- UINT32 Ovf_Uncore:1;
- ///
- /// [Bit 62] Set 1 to Clear OvfBuf: bit. If CPUID.0AH: EAX[7:0] > 0.
- ///
- UINT32 OvfBuf:1;
- ///
- /// [Bit 63] Set to 1to clear CondChgd: bit. If CPUID.0AH: EAX[7:0] > 0.
- ///
- UINT32 CondChgd:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_OVF_CTRL_REGISTER;
-
-
-/**
- Global Performance Counter Overflow Reset Control (R/W). If CPUID.0AH:
- EAX[7:0] > 3.
-
- @param ECX MSR_IA32_PERF_GLOBAL_STATUS_RESET (0x00000390)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_RESET);
- AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_RESET, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_STATUS_RESET is defined as IA32_PERF_GLOBAL_STATUS_RESET in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_STATUS_RESET 0x00000390
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS_RESET
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Set 1 to Clear Ovf_PMC0 bit. If CPUID.0AH: EAX[15:8] > n.
- /// Clear bitmask. Only the first n-1 bits are valid.
- /// Bits 31:n are reserved.
- ///
- UINT32 Ovf_PMCn:32;
- ///
- /// [Bits 54:32] Set 1 to Clear Ovf_FIXED_CTR0 bit.
- /// If CPUID.0AH: EDX[4:0] > n.
- /// Clear bitmask. Only the first n-1 bits are valid.
- /// Bits 22:n are reserved.
- ///
- UINT32 Ovf_FIXED_CTRn:23;
- ///
- /// [Bit 55] Set 1 to Clear Trace_ToPA_PMI bit. If (CPUID.(EAX=07H,
- /// ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA[8] = 1.
- ///
- UINT32 Trace_ToPA_PMI:1;
- UINT32 Reserved2:2;
- ///
- /// [Bit 58] Set 1 to Clear LBR_Frz bit. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 LBR_Frz:1;
- ///
- /// [Bit 59] Set 1 to Clear CTR_Frz bit. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 CTR_Frz:1;
- ///
- /// [Bit 60] Set 1 to Clear ASCI bit. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 ASCI:1;
- ///
- /// [Bit 61] Set 1 to Clear Ovf_Uncore bit. Introduced at Display Family /
- /// Display Model 06_2EH.
- ///
- UINT32 Ovf_Uncore:1;
- ///
- /// [Bit 62] Set 1 to Clear OvfBuf: bit. If CPUID.0AH: EAX[7:0] > 0.
- ///
- UINT32 OvfBuf:1;
- ///
- /// [Bit 63] Set to 1to clear CondChgd: bit. If CPUID.0AH: EAX[7:0] > 0.
- ///
- UINT32 CondChgd:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_STATUS_RESET_REGISTER;
-
-
-/**
- Global Performance Counter Overflow Set Control (R/W). If CPUID.0AH:
- EAX[7:0] > 3.
-
- @param ECX MSR_IA32_PERF_GLOBAL_STATUS_SET (0x00000391)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_SET);
- AsmWriteMsr64 (MSR_IA32_PERF_GLOBAL_STATUS_SET, Msr.Uint64);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_STATUS_SET is defined as IA32_PERF_GLOBAL_STATUS_SET in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_STATUS_SET 0x00000391
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_STATUS_SET
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Set 1 to cause Ovf_PMCn = 1. If CPUID.0AH: EAX[7:0] > n.
- /// Set bitmask. Only the first n-1 bits are valid.
- /// Bits 31:n are reserved.
- ///
- UINT32 Ovf_PMCn:32;
- ///
- /// [Bits 54:32] Set 1 to cause Ovf_FIXED_CTRn = 1.
- /// If CPUID.0AH: EAX[7:0] > n.
- /// Set bitmask. Only the first n-1 bits are valid.
- /// Bits 22:n are reserved.
- ///
- UINT32 Ovf_FIXED_CTRn:23;
- ///
- /// [Bit 55] Set 1 to cause Trace_ToPA_PMI = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 Trace_ToPA_PMI:1;
- UINT32 Reserved2:2;
- ///
- /// [Bit 58] Set 1 to cause LBR_Frz = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 LBR_Frz:1;
- ///
- /// [Bit 59] Set 1 to cause CTR_Frz = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 CTR_Frz:1;
- ///
- /// [Bit 60] Set 1 to cause ASCI = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 ASCI:1;
- ///
- /// [Bit 61] Set 1 to cause Ovf_Uncore = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 Ovf_Uncore:1;
- ///
- /// [Bit 62] Set 1 to cause OvfBuf = 1. If CPUID.0AH: EAX[7:0] > 3.
- ///
- UINT32 OvfBuf:1;
- UINT32 Reserved3:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_STATUS_SET_REGISTER;
-
-
-/**
- Indicator of core perfmon interface is in use (RO). If CPUID.0AH: EAX[7:0] >
- 3.
-
- @param ECX MSR_IA32_PERF_GLOBAL_INUSE (0x00000392)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_INUSE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PERF_GLOBAL_INUSE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PERF_GLOBAL_INUSE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PERF_GLOBAL_INUSE);
- @endcode
- @note MSR_IA32_PERF_GLOBAL_INUSE is defined as IA32_PERF_GLOBAL_INUSE in SDM.
-**/
-#define MSR_IA32_PERF_GLOBAL_INUSE 0x00000392
-
-/**
- MSR information returned for MSR index #MSR_IA32_PERF_GLOBAL_INUSE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] IA32_PERFEVTSELn in use. If CPUID.0AH: EAX[7:0] > n.
- /// Status bitmask. Only the first n-1 bits are valid.
- /// Bits 31:n are reserved.
- ///
- UINT32 IA32_PERFEVTSELn:32;
- ///
- /// [Bits 62:32] IA32_FIXED_CTRn in use.
- /// If CPUID.0AH: EAX[7:0] > n.
- /// Status bitmask. Only the first n-1 bits are valid.
- /// Bits 30:n are reserved.
- ///
- UINT32 IA32_FIXED_CTRn:31;
- ///
- /// [Bit 63] PMI in use.
- ///
- UINT32 PMI:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PERF_GLOBAL_INUSE_REGISTER;
-
-
-/**
- PEBS Control (R/W).
-
- @param ECX MSR_IA32_PEBS_ENABLE (0x000003F1)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PEBS_ENABLE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PEBS_ENABLE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PEBS_ENABLE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PEBS_ENABLE);
- AsmWriteMsr64 (MSR_IA32_PEBS_ENABLE, Msr.Uint64);
- @endcode
- @note MSR_IA32_PEBS_ENABLE is defined as IA32_PEBS_ENABLE in SDM.
-**/
-#define MSR_IA32_PEBS_ENABLE 0x000003F1
-
-/**
- MSR information returned for MSR index #MSR_IA32_PEBS_ENABLE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Enable PEBS on IA32_PMC0. Introduced at Display Family /
- /// Display Model 06_0FH.
- ///
- UINT32 Enable:1;
- ///
- /// [Bits 3:1] Reserved or Model specific.
- ///
- UINT32 Reserved1:3;
- UINT32 Reserved2:28;
- ///
- /// [Bits 35:32] Reserved or Model specific.
- ///
- UINT32 Reserved3:4;
- UINT32 Reserved4:28;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PEBS_ENABLE_REGISTER;
-
-
-/**
- MCn_CTL. If IA32_MCG_CAP.CNT > n.
-
- @param ECX MSR_IA32_MCn_CTL
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MC0_CTL);
- AsmWriteMsr64 (MSR_IA32_MC0_CTL, Msr);
- @endcode
- @note MSR_IA32_MC0_CTL is defined as IA32_MC0_CTL in SDM.
- MSR_IA32_MC1_CTL is defined as IA32_MC1_CTL in SDM.
- MSR_IA32_MC2_CTL is defined as IA32_MC2_CTL in SDM.
- MSR_IA32_MC3_CTL is defined as IA32_MC3_CTL in SDM.
- MSR_IA32_MC4_CTL is defined as IA32_MC4_CTL in SDM.
- MSR_IA32_MC5_CTL is defined as IA32_MC5_CTL in SDM.
- MSR_IA32_MC6_CTL is defined as IA32_MC6_CTL in SDM.
- MSR_IA32_MC7_CTL is defined as IA32_MC7_CTL in SDM.
- MSR_IA32_MC8_CTL is defined as IA32_MC8_CTL in SDM.
- MSR_IA32_MC9_CTL is defined as IA32_MC9_CTL in SDM.
- MSR_IA32_MC10_CTL is defined as IA32_MC10_CTL in SDM.
- MSR_IA32_MC11_CTL is defined as IA32_MC11_CTL in SDM.
- MSR_IA32_MC12_CTL is defined as IA32_MC12_CTL in SDM.
- MSR_IA32_MC13_CTL is defined as IA32_MC13_CTL in SDM.
- MSR_IA32_MC14_CTL is defined as IA32_MC14_CTL in SDM.
- MSR_IA32_MC15_CTL is defined as IA32_MC15_CTL in SDM.
- MSR_IA32_MC16_CTL is defined as IA32_MC16_CTL in SDM.
- MSR_IA32_MC17_CTL is defined as IA32_MC17_CTL in SDM.
- MSR_IA32_MC18_CTL is defined as IA32_MC18_CTL in SDM.
- MSR_IA32_MC19_CTL is defined as IA32_MC19_CTL in SDM.
- MSR_IA32_MC20_CTL is defined as IA32_MC20_CTL in SDM.
- MSR_IA32_MC21_CTL is defined as IA32_MC21_CTL in SDM.
- MSR_IA32_MC22_CTL is defined as IA32_MC22_CTL in SDM.
- MSR_IA32_MC23_CTL is defined as IA32_MC23_CTL in SDM.
- MSR_IA32_MC24_CTL is defined as IA32_MC24_CTL in SDM.
- MSR_IA32_MC25_CTL is defined as IA32_MC25_CTL in SDM.
- MSR_IA32_MC26_CTL is defined as IA32_MC26_CTL in SDM.
- MSR_IA32_MC27_CTL is defined as IA32_MC27_CTL in SDM.
- MSR_IA32_MC28_CTL is defined as IA32_MC28_CTL in SDM.
- @{
-**/
-#define MSR_IA32_MC0_CTL 0x00000400
-#define MSR_IA32_MC1_CTL 0x00000404
-#define MSR_IA32_MC2_CTL 0x00000408
-#define MSR_IA32_MC3_CTL 0x0000040C
-#define MSR_IA32_MC4_CTL 0x00000410
-#define MSR_IA32_MC5_CTL 0x00000414
-#define MSR_IA32_MC6_CTL 0x00000418
-#define MSR_IA32_MC7_CTL 0x0000041C
-#define MSR_IA32_MC8_CTL 0x00000420
-#define MSR_IA32_MC9_CTL 0x00000424
-#define MSR_IA32_MC10_CTL 0x00000428
-#define MSR_IA32_MC11_CTL 0x0000042C
-#define MSR_IA32_MC12_CTL 0x00000430
-#define MSR_IA32_MC13_CTL 0x00000434
-#define MSR_IA32_MC14_CTL 0x00000438
-#define MSR_IA32_MC15_CTL 0x0000043C
-#define MSR_IA32_MC16_CTL 0x00000440
-#define MSR_IA32_MC17_CTL 0x00000444
-#define MSR_IA32_MC18_CTL 0x00000448
-#define MSR_IA32_MC19_CTL 0x0000044C
-#define MSR_IA32_MC20_CTL 0x00000450
-#define MSR_IA32_MC21_CTL 0x00000454
-#define MSR_IA32_MC22_CTL 0x00000458
-#define MSR_IA32_MC23_CTL 0x0000045C
-#define MSR_IA32_MC24_CTL 0x00000460
-#define MSR_IA32_MC25_CTL 0x00000464
-#define MSR_IA32_MC26_CTL 0x00000468
-#define MSR_IA32_MC27_CTL 0x0000046C
-#define MSR_IA32_MC28_CTL 0x00000470
-/// @}
-
-
-/**
- MCn_STATUS. If IA32_MCG_CAP.CNT > n.
-
- @param ECX MSR_IA32_MCn_STATUS
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MC0_STATUS);
- AsmWriteMsr64 (MSR_IA32_MC0_STATUS, Msr);
- @endcode
- @note MSR_IA32_MC0_STATUS is defined as IA32_MC0_STATUS in SDM.
- MSR_IA32_MC1_STATUS is defined as IA32_MC1_STATUS in SDM.
- MSR_IA32_MC2_STATUS is defined as IA32_MC2_STATUS in SDM.
- MSR_IA32_MC3_STATUS is defined as IA32_MC3_STATUS in SDM.
- MSR_IA32_MC4_STATUS is defined as IA32_MC4_STATUS in SDM.
- MSR_IA32_MC5_STATUS is defined as IA32_MC5_STATUS in SDM.
- MSR_IA32_MC6_STATUS is defined as IA32_MC6_STATUS in SDM.
- MSR_IA32_MC7_STATUS is defined as IA32_MC7_STATUS in SDM.
- MSR_IA32_MC8_STATUS is defined as IA32_MC8_STATUS in SDM.
- MSR_IA32_MC9_STATUS is defined as IA32_MC9_STATUS in SDM.
- MSR_IA32_MC10_STATUS is defined as IA32_MC10_STATUS in SDM.
- MSR_IA32_MC11_STATUS is defined as IA32_MC11_STATUS in SDM.
- MSR_IA32_MC12_STATUS is defined as IA32_MC12_STATUS in SDM.
- MSR_IA32_MC13_STATUS is defined as IA32_MC13_STATUS in SDM.
- MSR_IA32_MC14_STATUS is defined as IA32_MC14_STATUS in SDM.
- MSR_IA32_MC15_STATUS is defined as IA32_MC15_STATUS in SDM.
- MSR_IA32_MC16_STATUS is defined as IA32_MC16_STATUS in SDM.
- MSR_IA32_MC17_STATUS is defined as IA32_MC17_STATUS in SDM.
- MSR_IA32_MC18_STATUS is defined as IA32_MC18_STATUS in SDM.
- MSR_IA32_MC19_STATUS is defined as IA32_MC19_STATUS in SDM.
- MSR_IA32_MC20_STATUS is defined as IA32_MC20_STATUS in SDM.
- MSR_IA32_MC21_STATUS is defined as IA32_MC21_STATUS in SDM.
- MSR_IA32_MC22_STATUS is defined as IA32_MC22_STATUS in SDM.
- MSR_IA32_MC23_STATUS is defined as IA32_MC23_STATUS in SDM.
- MSR_IA32_MC24_STATUS is defined as IA32_MC24_STATUS in SDM.
- MSR_IA32_MC25_STATUS is defined as IA32_MC25_STATUS in SDM.
- MSR_IA32_MC26_STATUS is defined as IA32_MC26_STATUS in SDM.
- MSR_IA32_MC27_STATUS is defined as IA32_MC27_STATUS in SDM.
- MSR_IA32_MC28_STATUS is defined as IA32_MC28_STATUS in SDM.
- @{
-**/
-#define MSR_IA32_MC0_STATUS 0x00000401
-#define MSR_IA32_MC1_STATUS 0x00000405
-#define MSR_IA32_MC2_STATUS 0x00000409
-#define MSR_IA32_MC3_STATUS 0x0000040D
-#define MSR_IA32_MC4_STATUS 0x00000411
-#define MSR_IA32_MC5_STATUS 0x00000415
-#define MSR_IA32_MC6_STATUS 0x00000419
-#define MSR_IA32_MC7_STATUS 0x0000041D
-#define MSR_IA32_MC8_STATUS 0x00000421
-#define MSR_IA32_MC9_STATUS 0x00000425
-#define MSR_IA32_MC10_STATUS 0x00000429
-#define MSR_IA32_MC11_STATUS 0x0000042D
-#define MSR_IA32_MC12_STATUS 0x00000431
-#define MSR_IA32_MC13_STATUS 0x00000435
-#define MSR_IA32_MC14_STATUS 0x00000439
-#define MSR_IA32_MC15_STATUS 0x0000043D
-#define MSR_IA32_MC16_STATUS 0x00000441
-#define MSR_IA32_MC17_STATUS 0x00000445
-#define MSR_IA32_MC18_STATUS 0x00000449
-#define MSR_IA32_MC19_STATUS 0x0000044D
-#define MSR_IA32_MC20_STATUS 0x00000451
-#define MSR_IA32_MC21_STATUS 0x00000455
-#define MSR_IA32_MC22_STATUS 0x00000459
-#define MSR_IA32_MC23_STATUS 0x0000045D
-#define MSR_IA32_MC24_STATUS 0x00000461
-#define MSR_IA32_MC25_STATUS 0x00000465
-#define MSR_IA32_MC26_STATUS 0x00000469
-#define MSR_IA32_MC27_STATUS 0x0000046D
-#define MSR_IA32_MC28_STATUS 0x00000471
-/// @}
-
-
-/**
- MCn_ADDR. If IA32_MCG_CAP.CNT > n.
-
- @param ECX MSR_IA32_MCn_ADDR
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MC0_ADDR);
- AsmWriteMsr64 (MSR_IA32_MC0_ADDR, Msr);
- @endcode
- @note MSR_IA32_MC0_ADDR is defined as IA32_MC0_ADDR in SDM.
- MSR_IA32_MC1_ADDR is defined as IA32_MC1_ADDR in SDM.
- MSR_IA32_MC2_ADDR is defined as IA32_MC2_ADDR in SDM.
- MSR_IA32_MC3_ADDR is defined as IA32_MC3_ADDR in SDM.
- MSR_IA32_MC4_ADDR is defined as IA32_MC4_ADDR in SDM.
- MSR_IA32_MC5_ADDR is defined as IA32_MC5_ADDR in SDM.
- MSR_IA32_MC6_ADDR is defined as IA32_MC6_ADDR in SDM.
- MSR_IA32_MC7_ADDR is defined as IA32_MC7_ADDR in SDM.
- MSR_IA32_MC8_ADDR is defined as IA32_MC8_ADDR in SDM.
- MSR_IA32_MC9_ADDR is defined as IA32_MC9_ADDR in SDM.
- MSR_IA32_MC10_ADDR is defined as IA32_MC10_ADDR in SDM.
- MSR_IA32_MC11_ADDR is defined as IA32_MC11_ADDR in SDM.
- MSR_IA32_MC12_ADDR is defined as IA32_MC12_ADDR in SDM.
- MSR_IA32_MC13_ADDR is defined as IA32_MC13_ADDR in SDM.
- MSR_IA32_MC14_ADDR is defined as IA32_MC14_ADDR in SDM.
- MSR_IA32_MC15_ADDR is defined as IA32_MC15_ADDR in SDM.
- MSR_IA32_MC16_ADDR is defined as IA32_MC16_ADDR in SDM.
- MSR_IA32_MC17_ADDR is defined as IA32_MC17_ADDR in SDM.
- MSR_IA32_MC18_ADDR is defined as IA32_MC18_ADDR in SDM.
- MSR_IA32_MC19_ADDR is defined as IA32_MC19_ADDR in SDM.
- MSR_IA32_MC20_ADDR is defined as IA32_MC20_ADDR in SDM.
- MSR_IA32_MC21_ADDR is defined as IA32_MC21_ADDR in SDM.
- MSR_IA32_MC22_ADDR is defined as IA32_MC22_ADDR in SDM.
- MSR_IA32_MC23_ADDR is defined as IA32_MC23_ADDR in SDM.
- MSR_IA32_MC24_ADDR is defined as IA32_MC24_ADDR in SDM.
- MSR_IA32_MC25_ADDR is defined as IA32_MC25_ADDR in SDM.
- MSR_IA32_MC26_ADDR is defined as IA32_MC26_ADDR in SDM.
- MSR_IA32_MC27_ADDR is defined as IA32_MC27_ADDR in SDM.
- MSR_IA32_MC28_ADDR is defined as IA32_MC28_ADDR in SDM.
- @{
-**/
-#define MSR_IA32_MC0_ADDR 0x00000402
-#define MSR_IA32_MC1_ADDR 0x00000406
-#define MSR_IA32_MC2_ADDR 0x0000040A
-#define MSR_IA32_MC3_ADDR 0x0000040E
-#define MSR_IA32_MC4_ADDR 0x00000412
-#define MSR_IA32_MC5_ADDR 0x00000416
-#define MSR_IA32_MC6_ADDR 0x0000041A
-#define MSR_IA32_MC7_ADDR 0x0000041E
-#define MSR_IA32_MC8_ADDR 0x00000422
-#define MSR_IA32_MC9_ADDR 0x00000426
-#define MSR_IA32_MC10_ADDR 0x0000042A
-#define MSR_IA32_MC11_ADDR 0x0000042E
-#define MSR_IA32_MC12_ADDR 0x00000432
-#define MSR_IA32_MC13_ADDR 0x00000436
-#define MSR_IA32_MC14_ADDR 0x0000043A
-#define MSR_IA32_MC15_ADDR 0x0000043E
-#define MSR_IA32_MC16_ADDR 0x00000442
-#define MSR_IA32_MC17_ADDR 0x00000446
-#define MSR_IA32_MC18_ADDR 0x0000044A
-#define MSR_IA32_MC19_ADDR 0x0000044E
-#define MSR_IA32_MC20_ADDR 0x00000452
-#define MSR_IA32_MC21_ADDR 0x00000456
-#define MSR_IA32_MC22_ADDR 0x0000045A
-#define MSR_IA32_MC23_ADDR 0x0000045E
-#define MSR_IA32_MC24_ADDR 0x00000462
-#define MSR_IA32_MC25_ADDR 0x00000466
-#define MSR_IA32_MC26_ADDR 0x0000046A
-#define MSR_IA32_MC27_ADDR 0x0000046E
-#define MSR_IA32_MC28_ADDR 0x00000472
-/// @}
-
-
-/**
- MCn_MISC. If IA32_MCG_CAP.CNT > n.
-
- @param ECX MSR_IA32_MCn_MISC
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_MC0_MISC);
- AsmWriteMsr64 (MSR_IA32_MC0_MISC, Msr);
- @endcode
- @note MSR_IA32_MC0_MISC is defined as IA32_MC0_MISC in SDM.
- MSR_IA32_MC1_MISC is defined as IA32_MC1_MISC in SDM.
- MSR_IA32_MC2_MISC is defined as IA32_MC2_MISC in SDM.
- MSR_IA32_MC3_MISC is defined as IA32_MC3_MISC in SDM.
- MSR_IA32_MC4_MISC is defined as IA32_MC4_MISC in SDM.
- MSR_IA32_MC5_MISC is defined as IA32_MC5_MISC in SDM.
- MSR_IA32_MC6_MISC is defined as IA32_MC6_MISC in SDM.
- MSR_IA32_MC7_MISC is defined as IA32_MC7_MISC in SDM.
- MSR_IA32_MC8_MISC is defined as IA32_MC8_MISC in SDM.
- MSR_IA32_MC9_MISC is defined as IA32_MC9_MISC in SDM.
- MSR_IA32_MC10_MISC is defined as IA32_MC10_MISC in SDM.
- MSR_IA32_MC11_MISC is defined as IA32_MC11_MISC in SDM.
- MSR_IA32_MC12_MISC is defined as IA32_MC12_MISC in SDM.
- MSR_IA32_MC13_MISC is defined as IA32_MC13_MISC in SDM.
- MSR_IA32_MC14_MISC is defined as IA32_MC14_MISC in SDM.
- MSR_IA32_MC15_MISC is defined as IA32_MC15_MISC in SDM.
- MSR_IA32_MC16_MISC is defined as IA32_MC16_MISC in SDM.
- MSR_IA32_MC17_MISC is defined as IA32_MC17_MISC in SDM.
- MSR_IA32_MC18_MISC is defined as IA32_MC18_MISC in SDM.
- MSR_IA32_MC19_MISC is defined as IA32_MC19_MISC in SDM.
- MSR_IA32_MC20_MISC is defined as IA32_MC20_MISC in SDM.
- MSR_IA32_MC21_MISC is defined as IA32_MC21_MISC in SDM.
- MSR_IA32_MC22_MISC is defined as IA32_MC22_MISC in SDM.
- MSR_IA32_MC23_MISC is defined as IA32_MC23_MISC in SDM.
- MSR_IA32_MC24_MISC is defined as IA32_MC24_MISC in SDM.
- MSR_IA32_MC25_MISC is defined as IA32_MC25_MISC in SDM.
- MSR_IA32_MC26_MISC is defined as IA32_MC26_MISC in SDM.
- MSR_IA32_MC27_MISC is defined as IA32_MC27_MISC in SDM.
- MSR_IA32_MC28_MISC is defined as IA32_MC28_MISC in SDM.
- @{
-**/
-#define MSR_IA32_MC0_MISC 0x00000403
-#define MSR_IA32_MC1_MISC 0x00000407
-#define MSR_IA32_MC2_MISC 0x0000040B
-#define MSR_IA32_MC3_MISC 0x0000040F
-#define MSR_IA32_MC4_MISC 0x00000413
-#define MSR_IA32_MC5_MISC 0x00000417
-#define MSR_IA32_MC6_MISC 0x0000041B
-#define MSR_IA32_MC7_MISC 0x0000041F
-#define MSR_IA32_MC8_MISC 0x00000423
-#define MSR_IA32_MC9_MISC 0x00000427
-#define MSR_IA32_MC10_MISC 0x0000042B
-#define MSR_IA32_MC11_MISC 0x0000042F
-#define MSR_IA32_MC12_MISC 0x00000433
-#define MSR_IA32_MC13_MISC 0x00000437
-#define MSR_IA32_MC14_MISC 0x0000043B
-#define MSR_IA32_MC15_MISC 0x0000043F
-#define MSR_IA32_MC16_MISC 0x00000443
-#define MSR_IA32_MC17_MISC 0x00000447
-#define MSR_IA32_MC18_MISC 0x0000044B
-#define MSR_IA32_MC19_MISC 0x0000044F
-#define MSR_IA32_MC20_MISC 0x00000453
-#define MSR_IA32_MC21_MISC 0x00000457
-#define MSR_IA32_MC22_MISC 0x0000045B
-#define MSR_IA32_MC23_MISC 0x0000045F
-#define MSR_IA32_MC24_MISC 0x00000463
-#define MSR_IA32_MC25_MISC 0x00000467
-#define MSR_IA32_MC26_MISC 0x0000046B
-#define MSR_IA32_MC27_MISC 0x0000046F
-#define MSR_IA32_MC28_MISC 0x00000473
-/// @}
-
-
-/**
- Reporting Register of Basic VMX Capabilities (R/O) See Appendix A.1, "Basic
- VMX Information.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_BASIC (0x00000480)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- MSR_IA32_VMX_BASIC_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_VMX_BASIC);
- @endcode
- @note MSR_IA32_VMX_BASIC is defined as IA32_VMX_BASIC in SDM.
-**/
-#define MSR_IA32_VMX_BASIC 0x00000480
-
-/**
- MSR information returned for MSR index #MSR_IA32_VMX_BASIC
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 30:0] VMCS revision identifier used by the processor. Processors
- /// that use the same VMCS revision identifier use the same size for VMCS
- /// regions (see subsequent item on bits 44:32).
- ///
- /// @note Earlier versions of this manual specified that the VMCS revision
- /// identifier was a 32-bit field in bits 31:0 of this MSR. For all
- /// processors produced prior to this change, bit 31 of this MSR was read
- /// as 0.
- ///
- UINT32 VmcsRevisonId:31;
- UINT32 MustBeZero:1;
- ///
- /// [Bit 44:32] Reports the number of bytes that software should allocate
- /// for the VMXON region and any VMCS region. It is a value greater than
- /// 0 and at most 4096(bit 44 is set if and only if bits 43:32 are clear).
- ///
- UINT32 VmcsSize:13;
- UINT32 Reserved1:3;
- ///
- /// [Bit 48] Indicates the width of the physical addresses that may be used
- /// for the VMXON region, each VMCS, and data structures referenced by
- /// pointers in a VMCS (I/O bitmaps, virtual-APIC page, MSR areas for VMX
- /// transitions). If the bit is 0, these addresses are limited to the
- /// processor's physical-address width. If the bit is 1, these addresses
- /// are limited to 32 bits. This bit is always 0 for processors that
- /// support Intel 64 architecture.
- ///
- /// @note On processors that support Intel 64 architecture, the pointer
- /// must not set bits beyond the processor's physical address width.
- ///
- UINT32 VmcsAddressWidth:1;
- ///
- /// [Bit 49] If bit 49 is read as 1, the logical processor supports the
- /// dual-monitor treatment of system-management interrupts and
- /// system-management mode. See Section 34.15 for details of this treatment.
- ///
- UINT32 DualMonitor:1;
- ///
- /// [Bit 53:50] report the memory type that should be used for the VMCS,
- /// for data structures referenced by pointers in the VMCS (I/O bitmaps,
- /// virtual-APIC page, MSR areas for VMX transitions), and for the MSEG
- /// header. If software needs to access these data structures (e.g., to
- /// modify the contents of the MSR bitmaps), it can configure the paging
- /// structures to map them into the linear-address space. If it does so,
- /// it should establish mappings that use the memory type reported bits
- /// 53:50 in this MSR.
- ///
- /// As of this writing, all processors that support VMX operation indicate
- /// the write-back type.
- ///
- /// If software needs to access these data structures (e.g., to modify
- /// the contents of the MSR bitmaps), it can configure the paging
- /// structures to map them into the linear-address space. If it does so,
- /// it should establish mappings that use the memory type reported in this
- /// MSR.
- ///
- /// @note Alternatively, software may map any of these regions or
- /// structures with the UC memory type. (This may be necessary for the MSEG
- /// header.) Doing so is discouraged unless necessary as it will cause the
- /// performance of software accesses to those structures to suffer.
- ///
- ///
- UINT32 MemoryType:4;
- ///
- /// [Bit 54] If bit 54 is read as 1, the processor reports information in
- /// the VM-exit instruction-information field on VM exitsdue to execution
- /// of the INS and OUTS instructions (see Section 27.2.4). This reporting
- /// is done only if this bit is read as 1.
- ///
- UINT32 InsOutsReporting:1;
- ///
- /// [Bit 55] Bit 55 is read as 1 if any VMX controls that default to 1 may
- /// be cleared to 0. See Appendix A.2 for details. It also reports support
- /// for the VMX capability MSRs IA32_VMX_TRUE_PINBASED_CTLS,
- /// IA32_VMX_TRUE_PROCBASED_CTLS, IA32_VMX_TRUE_EXIT_CTLS, and
- /// IA32_VMX_TRUE_ENTRY_CTLS. See Appendix A.3.1, Appendix A.3.2,
- /// Appendix A.4, and Appendix A.5 for details.
- ///
- UINT32 VmxControls:1;
- UINT32 Reserved2:8;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_VMX_BASIC_REGISTER;
-
-///
-/// @{ Define value for bit field MSR_IA32_VMX_BASIC_REGISTER.MemoryType
-///
-#define MSR_IA32_VMX_BASIC_REGISTER_MEMORY_TYPE_UNCACHEABLE 0x00
-#define MSR_IA32_VMX_BASIC_REGISTER_MEMORY_TYPE_WRITE_BACK 0x06
-///
-/// @}
-///
-
-
-/**
- Capability Reporting Register of Pinbased VM-execution Controls (R/O) See
- Appendix A.3.1, "Pin-Based VMExecution Controls.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_PINBASED_CTLS (0x00000481)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_PINBASED_CTLS);
- @endcode
- @note MSR_IA32_VMX_PINBASED_CTLS is defined as IA32_VMX_PINBASED_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_PINBASED_CTLS 0x00000481
-
-
-/**
- Capability Reporting Register of Primary Processor-based VM-execution
- Controls (R/O) See Appendix A.3.2, "Primary Processor- Based VM-Execution
- Controls.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_PROCBASED_CTLS (0x00000482)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_PROCBASED_CTLS);
- @endcode
- @note MSR_IA32_VMX_PROCBASED_CTLS is defined as IA32_VMX_PROCBASED_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_PROCBASED_CTLS 0x00000482
-
-
-/**
- Capability Reporting Register of VM-exit Controls (R/O) See Appendix A.4,
- "VM-Exit Controls.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_EXIT_CTLS (0x00000483)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_EXIT_CTLS);
- @endcode
- @note MSR_IA32_VMX_EXIT_CTLS is defined as IA32_VMX_EXIT_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_EXIT_CTLS 0x00000483
-
-
-/**
- Capability Reporting Register of VMentry Controls (R/O) See Appendix A.5,
- "VM-Entry Controls.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_ENTRY_CTLS (0x00000484)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_ENTRY_CTLS);
- @endcode
- @note MSR_IA32_VMX_ENTRY_CTLS is defined as IA32_VMX_ENTRY_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_ENTRY_CTLS 0x00000484
-
-
-/**
- Reporting Register of Miscellaneous VMX Capabilities (R/O) See Appendix A.6,
- "Miscellaneous Data.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_MISC (0x00000485)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- IA32_VMX_MISC_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_VMX_MISC);
- @endcode
- @note MSR_IA32_VMX_MISC is defined as IA32_VMX_MISC in SDM.
-**/
-#define MSR_IA32_VMX_MISC 0x00000485
-
-/**
- MSR information returned for MSR index #IA32_VMX_MISC
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 4:0] Reports a value X that specifies the relationship between the
- /// rate of the VMX-preemption timer and that of the timestamp counter (TSC).
- /// Specifically, the VMX-preemption timer (if it is active) counts down by
- /// 1 every time bit X in the TSC changes due to a TSC increment.
- ///
- UINT32 VmxTimerRatio:5;
- ///
- /// [Bit 5] If bit 5 is read as 1, VM exits store the value of IA32_EFER.LMA
- /// into the "IA-32e mode guest" VM-entry control;see Section 27.2 for more
- /// details. This bit is read as 1 on any logical processor that supports
- /// the 1-setting of the "unrestricted guest" VM-execution control.
- ///
- UINT32 VmExitEferLma:1;
- ///
- /// [Bit 6] reports (if set) the support for activity state 1 (HLT).
- ///
- UINT32 HltActivityStateSupported:1;
- ///
- /// [Bit 7] reports (if set) the support for activity state 2 (shutdown).
- ///
- UINT32 ShutdownActivityStateSupported:1;
- ///
- /// [Bit 8] reports (if set) the support for activity state 3 (wait-for-SIPI).
- ///
- UINT32 WaitForSipiActivityStateSupported:1;
- UINT32 Reserved1:5;
- ///
- /// [Bit 14] If read as 1, Intel(R) Processor Trace (Intel PT) can be used
- /// in VMX operation. If the processor supports Intel PT but does not allow
- /// it to be used in VMX operation, execution of VMXON clears
- /// IA32_RTIT_CTL.TraceEn (see "VMXON-Enter VMX Operation" in Chapter 30);
- /// any attempt to set that bit while in VMX operation (including VMX root
- /// operation) using the WRMSR instruction causes a general-protection
- /// exception.
- ///
- UINT32 ProcessorTraceSupported:1;
- ///
- /// [Bit 15] If read as 1, the RDMSR instruction can be used in system-
- /// management mode (SMM) to read the IA32_SMBASE MSR (MSR address 9EH).
- /// See Section 34.15.6.3.
- ///
- UINT32 SmBaseMsrSupported:1;
- ///
- /// [Bits 24:16] Indicate the number of CR3-target values supported by the
- /// processor. This number is a value between 0 and 256, inclusive (bit 24
- /// is set if and only if bits 23:16 are clear).
- ///
- UINT32 NumberOfCr3TargetValues:9;
- ///
- /// [Bit 27:25] Bits 27:25 is used to compute the recommended maximum
- /// number of MSRs that should appear in the VM-exit MSR-store list, the
- /// VM-exit MSR-load list, or the VM-entry MSR-load list. Specifically, if
- /// the value bits 27:25 of IA32_VMX_MISC is N, then 512 * (N + 1) is the
- /// recommended maximum number of MSRs to be included in each list. If the
- /// limit is exceeded, undefined processor behavior may result (including a
- /// machine check during the VMX transition).
- ///
- UINT32 MsrStoreListMaximum:3;
- ///
- /// [Bit 28] If read as 1, bit 2 of the IA32_SMM_MONITOR_CTL can be set
- /// to 1. VMXOFF unblocks SMIs unless IA32_SMM_MONITOR_CTL[bit 2] is 1
- /// (see Section 34.14.4).
- ///
- UINT32 BlockSmiSupported:1;
- ///
- /// [Bit 29] read as 1, software can use VMWRITE to write to any supported
- /// field in the VMCS; otherwise, VMWRITE cannot be used to modify VM-exit
- /// information fields.
- ///
- UINT32 VmWriteSupported:1;
- ///
- /// [Bit 30] If read as 1, VM entry allows injection of a software
- /// interrupt, software exception, or privileged software exception with an
- /// instruction length of 0.
- ///
- UINT32 VmInjectSupported:1;
- UINT32 Reserved2:1;
- ///
- /// [Bits 63:32] Reports the 32-bit MSEG revision identifier used by the
- /// processor.
- ///
- UINT32 MsegRevisionIdentifier:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} IA32_VMX_MISC_REGISTER;
-
-
-/**
- Capability Reporting Register of CR0 Bits Fixed to 0 (R/O) See Appendix A.7,
- "VMX-Fixed Bits in CR0.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_CR0_FIXED0 (0x00000486)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_CR0_FIXED0);
- @endcode
- @note MSR_IA32_VMX_CR0_FIXED0 is defined as IA32_VMX_CR0_FIXED0 in SDM.
-**/
-#define MSR_IA32_VMX_CR0_FIXED0 0x00000486
-
-
-/**
- Capability Reporting Register of CR0 Bits Fixed to 1 (R/O) See Appendix A.7,
- "VMX-Fixed Bits in CR0.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_CR0_FIXED1 (0x00000487)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_CR0_FIXED1);
- @endcode
- @note MSR_IA32_VMX_CR0_FIXED1 is defined as IA32_VMX_CR0_FIXED1 in SDM.
-**/
-#define MSR_IA32_VMX_CR0_FIXED1 0x00000487
-
-
-/**
- Capability Reporting Register of CR4 Bits Fixed to 0 (R/O) See Appendix A.8,
- "VMX-Fixed Bits in CR4.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_CR4_FIXED0 (0x00000488)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_CR4_FIXED0);
- @endcode
- @note MSR_IA32_VMX_CR4_FIXED0 is defined as IA32_VMX_CR4_FIXED0 in SDM.
-**/
-#define MSR_IA32_VMX_CR4_FIXED0 0x00000488
-
-
-/**
- Capability Reporting Register of CR4 Bits Fixed to 1 (R/O) See Appendix A.8,
- "VMX-Fixed Bits in CR4.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_CR4_FIXED1 (0x00000489)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_CR4_FIXED1);
- @endcode
- @note MSR_IA32_VMX_CR4_FIXED1 is defined as IA32_VMX_CR4_FIXED1 in SDM.
-**/
-#define MSR_IA32_VMX_CR4_FIXED1 0x00000489
-
-
-/**
- Capability Reporting Register of VMCS Field Enumeration (R/O) See Appendix
- A.9, "VMCS Enumeration.". If CPUID.01H:ECX.[5] = 1.
-
- @param ECX MSR_IA32_VMX_VMCS_ENUM (0x0000048A)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_VMCS_ENUM);
- @endcode
- @note MSR_IA32_VMX_VMCS_ENUM is defined as IA32_VMX_VMCS_ENUM in SDM.
-**/
-#define MSR_IA32_VMX_VMCS_ENUM 0x0000048A
-
-
-/**
- Capability Reporting Register of Secondary Processor-based VM-execution
- Controls (R/O) See Appendix A.3.3, "Secondary Processor- Based VM-Execution
- Controls.". If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_C TLS[63]).
-
- @param ECX MSR_IA32_VMX_PROCBASED_CTLS2 (0x0000048B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_PROCBASED_CTLS2);
- @endcode
- @note MSR_IA32_VMX_PROCBASED_CTLS2 is defined as IA32_VMX_PROCBASED_CTLS2 in SDM.
-**/
-#define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048B
-
-
-/**
- Capability Reporting Register of EPT and VPID (R/O) See Appendix A.10,
- "VPID and EPT Capabilities.". If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_C
- TLS[63] && ( IA32_VMX_PROCBASED_C TLS2[33] IA32_VMX_PROCBASED_C TLS2[37]) ).
-
- @param ECX MSR_IA32_VMX_EPT_VPID_CAP (0x0000048C)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_EPT_VPID_CAP);
- @endcode
- @note MSR_IA32_VMX_EPT_VPID_CAP is defined as IA32_VMX_EPT_VPID_CAP in SDM.
-**/
-#define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048C
-
-
-/**
- Capability Reporting Register of Pinbased VM-execution Flex Controls (R/O)
- See Appendix A.3.1, "Pin-Based VMExecution Controls.". If (
- CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
-
- @param ECX MSR_IA32_VMX_TRUE_PINBASED_CTLS (0x0000048D)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_PINBASED_CTLS);
- @endcode
- @note MSR_IA32_VMX_TRUE_PINBASED_CTLS is defined as IA32_VMX_TRUE_PINBASED_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_TRUE_PINBASED_CTLS 0x0000048D
-
-
-/**
- Capability Reporting Register of Primary Processor-based VM-execution Flex
- Controls (R/O) See Appendix A.3.2, "Primary Processor- Based VM-Execution
- Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
-
- @param ECX MSR_IA32_VMX_TRUE_PROCBASED_CTLS (0x0000048E)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_PROCBASED_CTLS);
- @endcode
- @note MSR_IA32_VMX_TRUE_PROCBASED_CTLS is defined as IA32_VMX_TRUE_PROCBASED_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_TRUE_PROCBASED_CTLS 0x0000048E
-
-
-/**
- Capability Reporting Register of VM-exit Flex Controls (R/O) See Appendix
- A.4, "VM-Exit Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
-
- @param ECX MSR_IA32_VMX_TRUE_EXIT_CTLS (0x0000048F)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_EXIT_CTLS);
- @endcode
- @note MSR_IA32_VMX_TRUE_EXIT_CTLS is defined as IA32_VMX_TRUE_EXIT_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_TRUE_EXIT_CTLS 0x0000048F
-
-
-/**
- Capability Reporting Register of VMentry Flex Controls (R/O) See Appendix
- A.5, "VM-Entry Controls.". If( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
-
- @param ECX MSR_IA32_VMX_TRUE_ENTRY_CTLS (0x00000490)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_TRUE_ENTRY_CTLS);
- @endcode
- @note MSR_IA32_VMX_TRUE_ENTRY_CTLS is defined as IA32_VMX_TRUE_ENTRY_CTLS in SDM.
-**/
-#define MSR_IA32_VMX_TRUE_ENTRY_CTLS 0x00000490
-
-
-/**
- Capability Reporting Register of VMfunction Controls (R/O). If(
- CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ).
-
- @param ECX MSR_IA32_VMX_VMFUNC (0x00000491)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_VMX_VMFUNC);
- @endcode
- @note MSR_IA32_VMX_VMFUNC is defined as IA32_VMX_VMFUNC in SDM.
-**/
-#define MSR_IA32_VMX_VMFUNC 0x00000491
-
-
-/**
- Full Width Writable IA32_PMCn Alias (R/W). (If CPUID.0AH: EAX[15:8] > n) &&
- IA32_PERF_CAPABILITIES[ 13] = 1.
-
- @param ECX MSR_IA32_A_PMCn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_A_PMC0);
- AsmWriteMsr64 (MSR_IA32_A_PMC0, Msr);
- @endcode
- @note MSR_IA32_A_PMC0 is defined as IA32_A_PMC0 in SDM.
- MSR_IA32_A_PMC1 is defined as IA32_A_PMC1 in SDM.
- MSR_IA32_A_PMC2 is defined as IA32_A_PMC2 in SDM.
- MSR_IA32_A_PMC3 is defined as IA32_A_PMC3 in SDM.
- MSR_IA32_A_PMC4 is defined as IA32_A_PMC4 in SDM.
- MSR_IA32_A_PMC5 is defined as IA32_A_PMC5 in SDM.
- MSR_IA32_A_PMC6 is defined as IA32_A_PMC6 in SDM.
- MSR_IA32_A_PMC7 is defined as IA32_A_PMC7 in SDM.
- @{
-**/
-#define MSR_IA32_A_PMC0 0x000004C1
-#define MSR_IA32_A_PMC1 0x000004C2
-#define MSR_IA32_A_PMC2 0x000004C3
-#define MSR_IA32_A_PMC3 0x000004C4
-#define MSR_IA32_A_PMC4 0x000004C5
-#define MSR_IA32_A_PMC5 0x000004C6
-#define MSR_IA32_A_PMC6 0x000004C7
-#define MSR_IA32_A_PMC7 0x000004C8
-/// @}
-
-
-/**
- (R/W). If IA32_MCG_CAP.LMCE_P =1.
-
- @param ECX MSR_IA32_MCG_EXT_CTL (0x000004D0)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_EXT_CTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_MCG_EXT_CTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_MCG_EXT_CTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_EXT_CTL);
- AsmWriteMsr64 (MSR_IA32_MCG_EXT_CTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_MCG_EXT_CTL is defined as IA32_MCG_EXT_CTL in SDM.
-**/
-#define MSR_IA32_MCG_EXT_CTL 0x000004D0
-
-/**
- MSR information returned for MSR index #MSR_IA32_MCG_EXT_CTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] LMCE_EN.
- ///
- UINT32 LMCE_EN:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_MCG_EXT_CTL_REGISTER;
-
-
-/**
- Status and SVN Threshold of SGX Support for ACM (RO). If CPUID.(EAX=07H,
- ECX=0H): EBX[2] = 1.
-
- @param ECX MSR_IA32_SGX_SVN_STATUS (0x00000500)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_SGX_SVN_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_SGX_SVN_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_SGX_SVN_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_SGX_SVN_STATUS);
- @endcode
- @note MSR_IA32_SGX_SVN_STATUS is defined as IA32_SGX_SVN_STATUS in SDM.
-**/
-#define MSR_IA32_SGX_SVN_STATUS 0x00000500
-
-/**
- MSR information returned for MSR index #MSR_IA32_SGX_SVN_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Lock. See Section 41.11.3, "Interactions with Authenticated
- /// Code Modules (ACMs)".
- ///
- UINT32 Lock:1;
- UINT32 Reserved1:15;
- ///
- /// [Bits 23:16] SGX_SVN_SINIT. See Section 41.11.3, "Interactions with
- /// Authenticated Code Modules (ACMs)".
- ///
- UINT32 SGX_SVN_SINIT:8;
- UINT32 Reserved2:8;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_SGX_SVN_STATUS_REGISTER;
-
-
-/**
- Trace Output Base Register (R/W). If ((CPUID.(EAX=07H, ECX=0):EBX[25] = 1)
- && ( (CPUID.(EAX=14H,ECX=0): ECX[0] = 1) (CPUID.(EAX=14H,ECX=0): ECX[2] = 1)
- ) ).
-
- @param ECX MSR_IA32_RTIT_OUTPUT_BASE (0x00000560)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_OUTPUT_BASE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_OUTPUT_BASE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_OUTPUT_BASE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_BASE);
- AsmWriteMsr64 (MSR_IA32_RTIT_OUTPUT_BASE, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_OUTPUT_BASE is defined as IA32_RTIT_OUTPUT_BASE in SDM.
-**/
-#define MSR_IA32_RTIT_OUTPUT_BASE 0x00000560
-
-/**
- MSR information returned for MSR index #MSR_IA32_RTIT_OUTPUT_BASE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved:7;
- ///
- /// [Bits 31:7] Base physical address.
- ///
- UINT32 Base:25;
- ///
- /// [Bits 63:32] Base physical address.
- ///
- UINT32 BaseHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_OUTPUT_BASE_REGISTER;
-
-
-/**
- Trace Output Mask Pointers Register (R/W). If ((CPUID.(EAX=07H,
- ECX=0):EBX[25] = 1) && ( (CPUID.(EAX=14H,ECX=0): ECX[0] = 1)
- (CPUID.(EAX=14H,ECX=0): ECX[2] = 1) ) ).
-
- @param ECX MSR_IA32_RTIT_OUTPUT_MASK_PTRS (0x00000561)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS);
- AsmWriteMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_OUTPUT_MASK_PTRS is defined as IA32_RTIT_OUTPUT_MASK_PTRS in SDM.
-**/
-#define MSR_IA32_RTIT_OUTPUT_MASK_PTRS 0x00000561
-
-/**
- MSR information returned for MSR index #MSR_IA32_RTIT_OUTPUT_MASK_PTRS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved:7;
- ///
- /// [Bits 31:7] MaskOrTableOffset.
- ///
- UINT32 MaskOrTableOffset:25;
- ///
- /// [Bits 63:32] Output Offset.
- ///
- UINT32 OutputOffset:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER;
-
-/**
- Format of ToPA table entries.
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] END. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 END:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 2] INT. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 INT:1;
- UINT32 Reserved2:1;
- ///
- /// [Bit 4] STOP. See Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 STOP:1;
- UINT32 Reserved3:1;
- ///
- /// [Bit 6:9] Indicates the size of the associated output region. See Section
- /// 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 Size:4;
- UINT32 Reserved4:2;
- ///
- /// [Bit 12:31] Output Region Base Physical Address low part.
- /// [Bit 12:31] Output Region Base Physical Address [12:63] value to match.
- /// ATTENTION: The size of the address field is determined by the processor's
- /// physical-address width (MAXPHYADDR) in bits, as reported in
- /// CPUID.80000008H:EAX[7:0]. the above part of address reserved.
- /// True address field is [12:MAXPHYADDR-1], [MAXPHYADDR:63] is reserved part.
- /// Detail see Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 Base:20;
- ///
- /// [Bit 32:63] Output Region Base Physical Address high part.
- /// [Bit 32:63] Output Region Base Physical Address [12:63] value to match.
- /// ATTENTION: The size of the address field is determined by the processor's
- /// physical-address width (MAXPHYADDR) in bits, as reported in
- /// CPUID.80000008H:EAX[7:0]. the above part of address reserved.
- /// True address field is [12:MAXPHYADDR-1], [MAXPHYADDR:63] is reserved part.
- /// Detail see Section 35.2.6.2, "Table of Physical Addresses (ToPA)".
- ///
- UINT32 BaseHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} RTIT_TOPA_TABLE_ENTRY;
-
-///
-/// The size of the associated output region usd by Topa.
-///
-typedef enum {
- RtitTopaMemorySize4K = 0,
- RtitTopaMemorySize8K,
- RtitTopaMemorySize16K,
- RtitTopaMemorySize32K,
- RtitTopaMemorySize64K,
- RtitTopaMemorySize128K,
- RtitTopaMemorySize256K,
- RtitTopaMemorySize512K,
- RtitTopaMemorySize1M,
- RtitTopaMemorySize2M,
- RtitTopaMemorySize4M,
- RtitTopaMemorySize8M,
- RtitTopaMemorySize16M,
- RtitTopaMemorySize32M,
- RtitTopaMemorySize64M,
- RtitTopaMemorySize128M
-} RTIT_TOPA_MEMORY_SIZE;
-
-/**
- Trace Control Register (R/W). If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
-
- @param ECX MSR_IA32_RTIT_CTL (0x00000570)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_CTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_CTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_CTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_CTL);
- AsmWriteMsr64 (MSR_IA32_RTIT_CTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_CTL is defined as IA32_RTIT_CTL in SDM.
-**/
-#define MSR_IA32_RTIT_CTL 0x00000570
-
-/**
- MSR information returned for MSR index #MSR_IA32_RTIT_CTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] TraceEn.
- ///
- UINT32 TraceEn:1;
- ///
- /// [Bit 1] CYCEn. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
- ///
- UINT32 CYCEn:1;
- ///
- /// [Bit 2] OS.
- ///
- UINT32 OS:1;
- ///
- /// [Bit 3] User.
- ///
- UINT32 User:1;
- ///
- /// [Bit 4] PwrEvtEn.
- ///
- UINT32 PwrEvtEn:1;
- ///
- /// [Bit 5] FUPonPTW.
- ///
- UINT32 FUPonPTW:1;
- ///
- /// [Bit 6] FabricEn. If (CPUID.(EAX=07H, ECX=0):ECX[3] = 1).
- ///
- UINT32 FabricEn:1;
- ///
- /// [Bit 7] CR3 filter.
- ///
- UINT32 CR3:1;
- ///
- /// [Bit 8] ToPA.
- ///
- UINT32 ToPA:1;
- ///
- /// [Bit 9] MTCEn. If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1).
- ///
- UINT32 MTCEn:1;
- ///
- /// [Bit 10] TSCEn.
- ///
- UINT32 TSCEn:1;
- ///
- /// [Bit 11] DisRETC.
- ///
- UINT32 DisRETC:1;
- ///
- /// [Bit 12] PTWEn.
- ///
- UINT32 PTWEn:1;
- ///
- /// [Bit 13] BranchEn.
- ///
- UINT32 BranchEn:1;
- ///
- /// [Bits 17:14] MTCFreq. If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1).
- ///
- UINT32 MTCFreq:4;
- UINT32 Reserved3:1;
- ///
- /// [Bits 22:19] CYCThresh. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
- ///
- UINT32 CYCThresh:4;
- UINT32 Reserved4:1;
- ///
- /// [Bits 27:24] PSBFreq. If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1).
- ///
- UINT32 PSBFreq:4;
- UINT32 Reserved5:4;
- ///
- /// [Bits 35:32] ADDR0_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 0).
- ///
- UINT32 ADDR0_CFG:4;
- ///
- /// [Bits 39:36] ADDR1_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 1).
- ///
- UINT32 ADDR1_CFG:4;
- ///
- /// [Bits 43:40] ADDR2_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 2).
- ///
- UINT32 ADDR2_CFG:4;
- ///
- /// [Bits 47:44] ADDR3_CFG. If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 3).
- ///
- UINT32 ADDR3_CFG:4;
- UINT32 Reserved6:16;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_CTL_REGISTER;
-
-
-/**
- Tracing Status Register (R/W). If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
-
- @param ECX MSR_IA32_RTIT_STATUS (0x00000571)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_STATUS);
- AsmWriteMsr64 (MSR_IA32_RTIT_STATUS, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_STATUS is defined as IA32_RTIT_STATUS in SDM.
-**/
-#define MSR_IA32_RTIT_STATUS 0x00000571
-
-/**
- MSR information returned for MSR index #MSR_IA32_RTIT_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] FilterEn, (writes ignored).
- /// If (CPUID.(EAX=07H, ECX=0):EBX[2] = 1).
- ///
- UINT32 FilterEn:1;
- ///
- /// [Bit 1] ContexEn, (writes ignored).
- ///
- UINT32 ContexEn:1;
- ///
- /// [Bit 2] TriggerEn, (writes ignored).
- ///
- UINT32 TriggerEn:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 4] Error.
- ///
- UINT32 Error:1;
- ///
- /// [Bit 5] Stopped.
- ///
- UINT32 Stopped:1;
- UINT32 Reserved2:26;
- ///
- /// [Bits 48:32] PacketByteCnt. If (CPUID.(EAX=07H, ECX=0):EBX[1] > 3).
- ///
- UINT32 PacketByteCnt:17;
- UINT32 Reserved3:15;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_STATUS_REGISTER;
-
-
-/**
- Trace Filter CR3 Match Register (R/W).
- If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1).
-
- @param ECX MSR_IA32_RTIT_CR3_MATCH (0x00000572)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_CR3_MATCH_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_CR3_MATCH_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_CR3_MATCH_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_CR3_MATCH);
- AsmWriteMsr64 (MSR_IA32_RTIT_CR3_MATCH, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_CR3_MATCH is defined as IA32_RTIT_CR3_MATCH in SDM.
-**/
-#define MSR_IA32_RTIT_CR3_MATCH 0x00000572
-
-/**
- MSR information returned for MSR index #MSR_IA32_RTIT_CR3_MATCH
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved:5;
- ///
- /// [Bits 31:5] CR3[63:5] value to match.
- ///
- UINT32 Cr3:27;
- ///
- /// [Bits 63:32] CR3[63:5] value to match.
- ///
- UINT32 Cr3Hi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_CR3_MATCH_REGISTER;
-
-
-/**
- Region n Start Address (R/W). If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n).
-
- @param ECX MSR_IA32_RTIT_ADDRn_A
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_ADDR_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_ADDR0_A);
- AsmWriteMsr64 (MSR_IA32_RTIT_ADDR0_A, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_ADDR0_A is defined as IA32_RTIT_ADDR0_A in SDM.
- MSR_IA32_RTIT_ADDR1_A is defined as IA32_RTIT_ADDR1_A in SDM.
- MSR_IA32_RTIT_ADDR2_A is defined as IA32_RTIT_ADDR2_A in SDM.
- MSR_IA32_RTIT_ADDR3_A is defined as IA32_RTIT_ADDR3_A in SDM.
- @{
-**/
-#define MSR_IA32_RTIT_ADDR0_A 0x00000580
-#define MSR_IA32_RTIT_ADDR1_A 0x00000582
-#define MSR_IA32_RTIT_ADDR2_A 0x00000584
-#define MSR_IA32_RTIT_ADDR3_A 0x00000586
-/// @}
-
-
-/**
- Region n End Address (R/W). If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n).
-
- @param ECX MSR_IA32_RTIT_ADDRn_B
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_RTIT_ADDR_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_RTIT_ADDR_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_ADDR0_B);
- AsmWriteMsr64 (MSR_IA32_RTIT_ADDR0_B, Msr.Uint64);
- @endcode
- @note MSR_IA32_RTIT_ADDR0_B is defined as IA32_RTIT_ADDR0_B in SDM.
- MSR_IA32_RTIT_ADDR1_B is defined as IA32_RTIT_ADDR1_B in SDM.
- MSR_IA32_RTIT_ADDR2_B is defined as IA32_RTIT_ADDR2_B in SDM.
- MSR_IA32_RTIT_ADDR3_B is defined as IA32_RTIT_ADDR3_B in SDM.
- @{
-**/
-#define MSR_IA32_RTIT_ADDR0_B 0x00000581
-#define MSR_IA32_RTIT_ADDR1_B 0x00000583
-#define MSR_IA32_RTIT_ADDR2_B 0x00000585
-#define MSR_IA32_RTIT_ADDR3_B 0x00000587
-/// @}
-
-
-/**
- MSR information returned for MSR indexes
- #MSR_IA32_RTIT_ADDR0_A to #MSR_IA32_RTIT_ADDR3_A and
- #MSR_IA32_RTIT_ADDR0_B to #MSR_IA32_RTIT_ADDR3_B
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Virtual Address.
- ///
- UINT32 VirtualAddress:32;
- ///
- /// [Bits 47:32] Virtual Address.
- ///
- UINT32 VirtualAddressHi:16;
- ///
- /// [Bits 63:48] SignExt_VA.
- ///
- UINT32 SignExt_VA:16;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_RTIT_ADDR_REGISTER;
-
-
-/**
- DS Save Area (R/W) Points to the linear address of the first byte of the DS
- buffer management area, which is used to manage the BTS and PEBS buffers.
- See Section 18.6.3.4, "Debug Store (DS) Mechanism.". If(
- CPUID.01H:EDX.DS[21] = 1. The linear address of the first byte of the DS
- buffer management area, if IA-32e mode is active.
-
- @param ECX MSR_IA32_DS_AREA (0x00000600)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_DS_AREA_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_DS_AREA_REGISTER.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_DS_AREA);
- AsmWriteMsr64 (MSR_IA32_DS_AREA, Msr);
- @endcode
- @note MSR_IA32_DS_AREA is defined as IA32_DS_AREA in SDM.
-**/
-#define MSR_IA32_DS_AREA 0x00000600
-
-
-/**
- TSC Target of Local APIC's TSC Deadline Mode (R/W). If CPUID.01H:ECX.[24] =
- 1.
-
- @param ECX MSR_IA32_TSC_DEADLINE (0x000006E0)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_TSC_DEADLINE);
- AsmWriteMsr64 (MSR_IA32_TSC_DEADLINE, Msr);
- @endcode
- @note MSR_IA32_TSC_DEADLINE is defined as IA32_TSC_DEADLINE in SDM.
-**/
-#define MSR_IA32_TSC_DEADLINE 0x000006E0
-
-
-/**
- Enable/disable HWP (R/W). If CPUID.06H:EAX.[7] = 1.
-
- @param ECX MSR_IA32_PM_ENABLE (0x00000770)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PM_ENABLE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PM_ENABLE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PM_ENABLE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PM_ENABLE);
- AsmWriteMsr64 (MSR_IA32_PM_ENABLE, Msr.Uint64);
- @endcode
- @note MSR_IA32_PM_ENABLE is defined as IA32_PM_ENABLE in SDM.
-**/
-#define MSR_IA32_PM_ENABLE 0x00000770
-
-/**
- MSR information returned for MSR index #MSR_IA32_PM_ENABLE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] HWP_ENABLE (R/W1-Once). See Section 14.4.2, "Enabling HWP". If
- /// CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 HWP_ENABLE:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PM_ENABLE_REGISTER;
-
-
-/**
- HWP Performance Range Enumeration (RO). If CPUID.06H:EAX.[7] = 1.
-
- @param ECX MSR_IA32_HWP_CAPABILITIES (0x00000771)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_CAPABILITIES_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_CAPABILITIES_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_HWP_CAPABILITIES_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_CAPABILITIES);
- @endcode
- @note MSR_IA32_HWP_CAPABILITIES is defined as IA32_HWP_CAPABILITIES in SDM.
-**/
-#define MSR_IA32_HWP_CAPABILITIES 0x00000771
-
-/**
- MSR information returned for MSR index #MSR_IA32_HWP_CAPABILITIES
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Highest_Performance See Section 14.4.3, "HWP Performance
- /// Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Highest_Performance:8;
- ///
- /// [Bits 15:8] Guaranteed_Performance See Section 14.4.3, "HWP
- /// Performance Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Guaranteed_Performance:8;
- ///
- /// [Bits 23:16] Most_Efficient_Performance See Section 14.4.3, "HWP
- /// Performance Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Most_Efficient_Performance:8;
- ///
- /// [Bits 31:24] Lowest_Performance See Section 14.4.3, "HWP Performance
- /// Range and Dynamic Capabilities". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Lowest_Performance:8;
- UINT32 Reserved:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_HWP_CAPABILITIES_REGISTER;
-
-
-/**
- Power Management Control Hints for All Logical Processors in a Package
- (R/W). If CPUID.06H:EAX.[11] = 1.
-
- @param ECX MSR_IA32_HWP_REQUEST_PKG (0x00000772)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_REQUEST_PKG_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_REQUEST_PKG_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_HWP_REQUEST_PKG_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_REQUEST_PKG);
- AsmWriteMsr64 (MSR_IA32_HWP_REQUEST_PKG, Msr.Uint64);
- @endcode
- @note MSR_IA32_HWP_REQUEST_PKG is defined as IA32_HWP_REQUEST_PKG in SDM.
-**/
-#define MSR_IA32_HWP_REQUEST_PKG 0x00000772
-
-/**
- MSR information returned for MSR index #MSR_IA32_HWP_REQUEST_PKG
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Minimum_Performance See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[11] = 1.
- ///
- UINT32 Minimum_Performance:8;
- ///
- /// [Bits 15:8] Maximum_Performance See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[11] = 1.
- ///
- UINT32 Maximum_Performance:8;
- ///
- /// [Bits 23:16] Desired_Performance See Section 14.4.4, "Managing HWP".
- /// If CPUID.06H:EAX.[11] = 1.
- ///
- UINT32 Desired_Performance:8;
- ///
- /// [Bits 31:24] Energy_Performance_Preference See Section 14.4.4,
- /// "Managing HWP". If CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[10] = 1.
- ///
- UINT32 Energy_Performance_Preference:8;
- ///
- /// [Bits 41:32] Activity_Window See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[9] = 1.
- ///
- UINT32 Activity_Window:10;
- UINT32 Reserved:22;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_HWP_REQUEST_PKG_REGISTER;
-
-
-/**
- Control HWP Native Interrupts (R/W). If CPUID.06H:EAX.[8] = 1.
-
- @param ECX MSR_IA32_HWP_INTERRUPT (0x00000773)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_INTERRUPT_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_INTERRUPT_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_HWP_INTERRUPT_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_INTERRUPT);
- AsmWriteMsr64 (MSR_IA32_HWP_INTERRUPT, Msr.Uint64);
- @endcode
- @note MSR_IA32_HWP_INTERRUPT is defined as IA32_HWP_INTERRUPT in SDM.
-**/
-#define MSR_IA32_HWP_INTERRUPT 0x00000773
-
-/**
- MSR information returned for MSR index #MSR_IA32_HWP_INTERRUPT
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] EN_Guaranteed_Performance_Change. See Section 14.4.6, "HWP
- /// Notifications". If CPUID.06H:EAX.[8] = 1.
- ///
- UINT32 EN_Guaranteed_Performance_Change:1;
- ///
- /// [Bit 1] EN_Excursion_Minimum. See Section 14.4.6, "HWP Notifications".
- /// If CPUID.06H:EAX.[8] = 1.
- ///
- UINT32 EN_Excursion_Minimum:1;
- UINT32 Reserved1:30;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_HWP_INTERRUPT_REGISTER;
-
-
-/**
- Power Management Control Hints to a Logical Processor (R/W). If
- CPUID.06H:EAX.[7] = 1.
-
- @param ECX MSR_IA32_HWP_REQUEST (0x00000774)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_REQUEST_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_REQUEST_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_HWP_REQUEST_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_REQUEST);
- AsmWriteMsr64 (MSR_IA32_HWP_REQUEST, Msr.Uint64);
- @endcode
- @note MSR_IA32_HWP_REQUEST is defined as IA32_HWP_REQUEST in SDM.
-**/
-#define MSR_IA32_HWP_REQUEST 0x00000774
-
-/**
- MSR information returned for MSR index #MSR_IA32_HWP_REQUEST
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Minimum_Performance See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Minimum_Performance:8;
- ///
- /// [Bits 15:8] Maximum_Performance See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Maximum_Performance:8;
- ///
- /// [Bits 23:16] Desired_Performance See Section 14.4.4, "Managing HWP".
- /// If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Desired_Performance:8;
- ///
- /// [Bits 31:24] Energy_Performance_Preference See Section 14.4.4,
- /// "Managing HWP". If CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[10] = 1.
- ///
- UINT32 Energy_Performance_Preference:8;
- ///
- /// [Bits 41:32] Activity_Window See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[9] = 1.
- ///
- UINT32 Activity_Window:10;
- ///
- /// [Bit 42] Package_Control See Section 14.4.4, "Managing HWP". If
- /// CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[11] = 1.
- ///
- UINT32 Package_Control:1;
- UINT32 Reserved:21;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_HWP_REQUEST_REGISTER;
-
-
-/**
- Log bits indicating changes to Guaranteed & excursions to Minimum (R/W). If
- CPUID.06H:EAX.[7] = 1.
-
- @param ECX MSR_IA32_HWP_STATUS (0x00000777)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_STATUS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_HWP_STATUS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_HWP_STATUS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_HWP_STATUS);
- AsmWriteMsr64 (MSR_IA32_HWP_STATUS, Msr.Uint64);
- @endcode
- @note MSR_IA32_HWP_STATUS is defined as IA32_HWP_STATUS in SDM.
-**/
-#define MSR_IA32_HWP_STATUS 0x00000777
-
-/**
- MSR information returned for MSR index #MSR_IA32_HWP_STATUS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Guaranteed_Performance_Change (R/WC0). See Section 14.4.5,
- /// "HWP Feedback". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Guaranteed_Performance_Change:1;
- UINT32 Reserved1:1;
- ///
- /// [Bit 2] Excursion_To_Minimum (R/WC0). See Section 14.4.5, "HWP
- /// Feedback". If CPUID.06H:EAX.[7] = 1.
- ///
- UINT32 Excursion_To_Minimum:1;
- UINT32 Reserved2:29;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_HWP_STATUS_REGISTER;
-
-
-/**
- x2APIC ID Register (R/O) See x2APIC Specification. If CPUID.01H:ECX[21] = 1
- && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_APICID (0x00000802)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_APICID);
- @endcode
- @note MSR_IA32_X2APIC_APICID is defined as IA32_X2APIC_APICID in SDM.
-**/
-#define MSR_IA32_X2APIC_APICID 0x00000802
-
-
-/**
- x2APIC Version Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_VERSION (0x00000803)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_VERSION);
- @endcode
- @note MSR_IA32_X2APIC_VERSION is defined as IA32_X2APIC_VERSION in SDM.
-**/
-#define MSR_IA32_X2APIC_VERSION 0x00000803
-
-
-/**
- x2APIC Task Priority Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_TPR (0x00000808)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_TPR);
- AsmWriteMsr64 (MSR_IA32_X2APIC_TPR, Msr);
- @endcode
- @note MSR_IA32_X2APIC_TPR is defined as IA32_X2APIC_TPR in SDM.
-**/
-#define MSR_IA32_X2APIC_TPR 0x00000808
-
-
-/**
- x2APIC Processor Priority Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_PPR (0x0000080A)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_PPR);
- @endcode
- @note MSR_IA32_X2APIC_PPR is defined as IA32_X2APIC_PPR in SDM.
-**/
-#define MSR_IA32_X2APIC_PPR 0x0000080A
-
-
-/**
- x2APIC EOI Register (W/O). If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10]
- = 1.
-
- @param ECX MSR_IA32_X2APIC_EOI (0x0000080B)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = 0;
- AsmWriteMsr64 (MSR_IA32_X2APIC_EOI, Msr);
- @endcode
- @note MSR_IA32_X2APIC_EOI is defined as IA32_X2APIC_EOI in SDM.
-**/
-#define MSR_IA32_X2APIC_EOI 0x0000080B
-
-
-/**
- x2APIC Logical Destination Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LDR (0x0000080D)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LDR);
- @endcode
- @note MSR_IA32_X2APIC_LDR is defined as IA32_X2APIC_LDR in SDM.
-**/
-#define MSR_IA32_X2APIC_LDR 0x0000080D
-
-
-/**
- x2APIC Spurious Interrupt Vector Register (R/W). If CPUID.01H:ECX.[21] = 1
- && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_SIVR (0x0000080F)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_SIVR);
- AsmWriteMsr64 (MSR_IA32_X2APIC_SIVR, Msr);
- @endcode
- @note MSR_IA32_X2APIC_SIVR is defined as IA32_X2APIC_SIVR in SDM.
-**/
-#define MSR_IA32_X2APIC_SIVR 0x0000080F
-
-
-/**
- x2APIC In-Service Register Bits (n * 32 + 31):(n * 32) (R/O).
- If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_ISRn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ISR0);
- @endcode
- @note MSR_IA32_X2APIC_ISR0 is defined as IA32_X2APIC_ISR0 in SDM.
- MSR_IA32_X2APIC_ISR1 is defined as IA32_X2APIC_ISR1 in SDM.
- MSR_IA32_X2APIC_ISR2 is defined as IA32_X2APIC_ISR2 in SDM.
- MSR_IA32_X2APIC_ISR3 is defined as IA32_X2APIC_ISR3 in SDM.
- MSR_IA32_X2APIC_ISR4 is defined as IA32_X2APIC_ISR4 in SDM.
- MSR_IA32_X2APIC_ISR5 is defined as IA32_X2APIC_ISR5 in SDM.
- MSR_IA32_X2APIC_ISR6 is defined as IA32_X2APIC_ISR6 in SDM.
- MSR_IA32_X2APIC_ISR7 is defined as IA32_X2APIC_ISR7 in SDM.
- @{
-**/
-#define MSR_IA32_X2APIC_ISR0 0x00000810
-#define MSR_IA32_X2APIC_ISR1 0x00000811
-#define MSR_IA32_X2APIC_ISR2 0x00000812
-#define MSR_IA32_X2APIC_ISR3 0x00000813
-#define MSR_IA32_X2APIC_ISR4 0x00000814
-#define MSR_IA32_X2APIC_ISR5 0x00000815
-#define MSR_IA32_X2APIC_ISR6 0x00000816
-#define MSR_IA32_X2APIC_ISR7 0x00000817
-/// @}
-
-
-/**
- x2APIC Trigger Mode Register Bits (n * 32 + ):(n * 32) (R/O).
- If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_TMRn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_TMR0);
- @endcode
- @note MSR_IA32_X2APIC_TMR0 is defined as IA32_X2APIC_TMR0 in SDM.
- MSR_IA32_X2APIC_TMR1 is defined as IA32_X2APIC_TMR1 in SDM.
- MSR_IA32_X2APIC_TMR2 is defined as IA32_X2APIC_TMR2 in SDM.
- MSR_IA32_X2APIC_TMR3 is defined as IA32_X2APIC_TMR3 in SDM.
- MSR_IA32_X2APIC_TMR4 is defined as IA32_X2APIC_TMR4 in SDM.
- MSR_IA32_X2APIC_TMR5 is defined as IA32_X2APIC_TMR5 in SDM.
- MSR_IA32_X2APIC_TMR6 is defined as IA32_X2APIC_TMR6 in SDM.
- MSR_IA32_X2APIC_TMR7 is defined as IA32_X2APIC_TMR7 in SDM.
- @{
-**/
-#define MSR_IA32_X2APIC_TMR0 0x00000818
-#define MSR_IA32_X2APIC_TMR1 0x00000819
-#define MSR_IA32_X2APIC_TMR2 0x0000081A
-#define MSR_IA32_X2APIC_TMR3 0x0000081B
-#define MSR_IA32_X2APIC_TMR4 0x0000081C
-#define MSR_IA32_X2APIC_TMR5 0x0000081D
-#define MSR_IA32_X2APIC_TMR6 0x0000081E
-#define MSR_IA32_X2APIC_TMR7 0x0000081F
-/// @}
-
-
-/**
- x2APIC Interrupt Request Register Bits (n* 32 + 31):(n * 32) (R/O).
- If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_IRRn
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_IRR0);
- @endcode
- @note MSR_IA32_X2APIC_IRR0 is defined as IA32_X2APIC_IRR0 in SDM.
- MSR_IA32_X2APIC_IRR1 is defined as IA32_X2APIC_IRR1 in SDM.
- MSR_IA32_X2APIC_IRR2 is defined as IA32_X2APIC_IRR2 in SDM.
- MSR_IA32_X2APIC_IRR3 is defined as IA32_X2APIC_IRR3 in SDM.
- MSR_IA32_X2APIC_IRR4 is defined as IA32_X2APIC_IRR4 in SDM.
- MSR_IA32_X2APIC_IRR5 is defined as IA32_X2APIC_IRR5 in SDM.
- MSR_IA32_X2APIC_IRR6 is defined as IA32_X2APIC_IRR6 in SDM.
- MSR_IA32_X2APIC_IRR7 is defined as IA32_X2APIC_IRR7 in SDM.
- @{
-**/
-#define MSR_IA32_X2APIC_IRR0 0x00000820
-#define MSR_IA32_X2APIC_IRR1 0x00000821
-#define MSR_IA32_X2APIC_IRR2 0x00000822
-#define MSR_IA32_X2APIC_IRR3 0x00000823
-#define MSR_IA32_X2APIC_IRR4 0x00000824
-#define MSR_IA32_X2APIC_IRR5 0x00000825
-#define MSR_IA32_X2APIC_IRR6 0x00000826
-#define MSR_IA32_X2APIC_IRR7 0x00000827
-/// @}
-
-
-/**
- x2APIC Error Status Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_ESR (0x00000828)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ESR);
- AsmWriteMsr64 (MSR_IA32_X2APIC_ESR, Msr);
- @endcode
- @note MSR_IA32_X2APIC_ESR is defined as IA32_X2APIC_ESR in SDM.
-**/
-#define MSR_IA32_X2APIC_ESR 0x00000828
-
-
-/**
- x2APIC LVT Corrected Machine Check Interrupt Register (R/W). If
- CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_CMCI (0x0000082F)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_CMCI);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_CMCI, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_CMCI is defined as IA32_X2APIC_LVT_CMCI in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_CMCI 0x0000082F
-
-
-/**
- x2APIC Interrupt Command Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_ICR (0x00000830)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_ICR);
- AsmWriteMsr64 (MSR_IA32_X2APIC_ICR, Msr);
- @endcode
- @note MSR_IA32_X2APIC_ICR is defined as IA32_X2APIC_ICR in SDM.
-**/
-#define MSR_IA32_X2APIC_ICR 0x00000830
-
-
-/**
- x2APIC LVT Timer Interrupt Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_TIMER (0x00000832)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_TIMER);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_TIMER, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_TIMER is defined as IA32_X2APIC_LVT_TIMER in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_TIMER 0x00000832
-
-
-/**
- x2APIC LVT Thermal Sensor Interrupt Register (R/W). If CPUID.01H:ECX.[21] =
- 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_THERMAL (0x00000833)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_THERMAL);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_THERMAL, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_THERMAL is defined as IA32_X2APIC_LVT_THERMAL in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_THERMAL 0x00000833
-
-
-/**
- x2APIC LVT Performance Monitor Interrupt Register (R/W). If
- CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_PMI (0x00000834)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_PMI);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_PMI, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_PMI is defined as IA32_X2APIC_LVT_PMI in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_PMI 0x00000834
-
-
-/**
- x2APIC LVT LINT0 Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_LINT0 (0x00000835)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_LINT0);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_LINT0, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_LINT0 is defined as IA32_X2APIC_LVT_LINT0 in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_LINT0 0x00000835
-
-
-/**
- x2APIC LVT LINT1 Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_LINT1 (0x00000836)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_LINT1);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_LINT1, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_LINT1 is defined as IA32_X2APIC_LVT_LINT1 in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_LINT1 0x00000836
-
-
-/**
- x2APIC LVT Error Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_LVT_ERROR (0x00000837)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_LVT_ERROR);
- AsmWriteMsr64 (MSR_IA32_X2APIC_LVT_ERROR, Msr);
- @endcode
- @note MSR_IA32_X2APIC_LVT_ERROR is defined as IA32_X2APIC_LVT_ERROR in SDM.
-**/
-#define MSR_IA32_X2APIC_LVT_ERROR 0x00000837
-
-
-/**
- x2APIC Initial Count Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_INIT_COUNT (0x00000838)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_INIT_COUNT);
- AsmWriteMsr64 (MSR_IA32_X2APIC_INIT_COUNT, Msr);
- @endcode
- @note MSR_IA32_X2APIC_INIT_COUNT is defined as IA32_X2APIC_INIT_COUNT in SDM.
-**/
-#define MSR_IA32_X2APIC_INIT_COUNT 0x00000838
-
-
-/**
- x2APIC Current Count Register (R/O). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_CUR_COUNT (0x00000839)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_CUR_COUNT);
- @endcode
- @note MSR_IA32_X2APIC_CUR_COUNT is defined as IA32_X2APIC_CUR_COUNT in SDM.
-**/
-#define MSR_IA32_X2APIC_CUR_COUNT 0x00000839
-
-
-/**
- x2APIC Divide Configuration Register (R/W). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_DIV_CONF (0x0000083E)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_X2APIC_DIV_CONF);
- AsmWriteMsr64 (MSR_IA32_X2APIC_DIV_CONF, Msr);
- @endcode
- @note MSR_IA32_X2APIC_DIV_CONF is defined as IA32_X2APIC_DIV_CONF in SDM.
-**/
-#define MSR_IA32_X2APIC_DIV_CONF 0x0000083E
-
-
-/**
- x2APIC Self IPI Register (W/O). If CPUID.01H:ECX.[21] = 1 &&
- IA32_APIC_BASE.[10] = 1.
-
- @param ECX MSR_IA32_X2APIC_SELF_IPI (0x0000083F)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = 0;
- AsmWriteMsr64 (MSR_IA32_X2APIC_SELF_IPI, Msr);
- @endcode
- @note MSR_IA32_X2APIC_SELF_IPI is defined as IA32_X2APIC_SELF_IPI in SDM.
-**/
-#define MSR_IA32_X2APIC_SELF_IPI 0x0000083F
-
-
-/**
- Silicon Debug Feature Control (R/W). If CPUID.01H:ECX.[11] = 1.
-
- @param ECX MSR_IA32_DEBUG_INTERFACE (0x00000C80)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_DEBUG_INTERFACE_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_DEBUG_INTERFACE_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_DEBUG_INTERFACE_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_DEBUG_INTERFACE);
- AsmWriteMsr64 (MSR_IA32_DEBUG_INTERFACE, Msr.Uint64);
- @endcode
- @note MSR_IA32_DEBUG_INTERFACE is defined as IA32_DEBUG_INTERFACE in SDM.
-**/
-#define MSR_IA32_DEBUG_INTERFACE 0x00000C80
-
-/**
- MSR information returned for MSR index #MSR_IA32_DEBUG_INTERFACE
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Enable (R/W) BIOS set 1 to enable Silicon debug features.
- /// Default is 0. If CPUID.01H:ECX.[11] = 1.
- ///
- UINT32 Enable:1;
- UINT32 Reserved1:29;
- ///
- /// [Bit 30] Lock (R/W): If 1, locks any further change to the MSR. The
- /// lock bit is set automatically on the first SMI assertion even if not
- /// explicitly set by BIOS. Default is 0. If CPUID.01H:ECX.[11] = 1.
- ///
- UINT32 Lock:1;
- ///
- /// [Bit 31] Debug Occurred (R/O): This "sticky bit" is set by hardware to
- /// indicate the status of bit 0. Default is 0. If CPUID.01H:ECX.[11] = 1.
- ///
- UINT32 DebugOccurred:1;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_DEBUG_INTERFACE_REGISTER;
-
-
-/**
- L3 QOS Configuration (R/W). If ( CPUID.(EAX=10H, ECX=1):ECX.[2] = 1 ).
-
- @param ECX MSR_IA32_L3_QOS_CFG (0x00000C81)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_L3_QOS_CFG_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_L3_QOS_CFG_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_L3_QOS_CFG_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_L3_QOS_CFG);
- AsmWriteMsr64 (MSR_IA32_L3_QOS_CFG, Msr.Uint64);
- @endcode
- @note MSR_IA32_L3_QOS_CFG is defined as IA32_L3_QOS_CFG in SDM.
-**/
-#define MSR_IA32_L3_QOS_CFG 0x00000C81
-
-/**
- MSR information returned for MSR index #MSR_IA32_L3_QOS_CFG
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Enable (R/W) Set 1 to enable L3 CAT masks and COS to operate
- /// in Code and Data Prioritization (CDP) mode.
- ///
- UINT32 Enable:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_L3_QOS_CFG_REGISTER;
-
-/**
- L2 QOS Configuration (R/W). If ( CPUID.(EAX=10H, ECX=2):ECX.[2] = 1 ).
-
- @param ECX MSR_IA32_L2_QOS_CFG (0x00000C82)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_L2_QOS_CFG_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_L2_QOS_CFG_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_L2_QOS_CFG_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_L2_QOS_CFG);
- AsmWriteMsr64 (MSR_IA32_L2_QOS_CFG, Msr.Uint64);
- @endcode
- @note MSR_IA32_L2_QOS_CFG is defined as IA32_L2_QOS_CFG in SDM.
-**/
-#define MSR_IA32_L2_QOS_CFG 0x00000C82
-
-/**
- MSR information returned for MSR index #MSR_IA32_L2_QOS_CFG
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] Enable (R/W) Set 1 to enable L2 CAT masks and COS to operate
- /// in Code and Data Prioritization (CDP) mode.
- ///
- UINT32 Enable:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_L2_QOS_CFG_REGISTER;
-
-/**
- Monitoring Event Select Register (R/W). If ( CPUID.(EAX=07H, ECX=0):EBX.[12]
- = 1 ).
-
- @param ECX MSR_IA32_QM_EVTSEL (0x00000C8D)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_QM_EVTSEL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_QM_EVTSEL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_QM_EVTSEL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_QM_EVTSEL);
- AsmWriteMsr64 (MSR_IA32_QM_EVTSEL, Msr.Uint64);
- @endcode
- @note MSR_IA32_QM_EVTSEL is defined as IA32_QM_EVTSEL in SDM.
-**/
-#define MSR_IA32_QM_EVTSEL 0x00000C8D
-
-/**
- MSR information returned for MSR index #MSR_IA32_QM_EVTSEL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 7:0] Event ID: ID of a supported monitoring event to report via
- /// IA32_QM_CTR.
- ///
- UINT32 EventID:8;
- UINT32 Reserved:24;
- ///
- /// [Bits 63:32] Resource Monitoring ID: ID for monitoring hardware to
- /// report monitored data via IA32_QM_CTR. N = Ceil (Log:sub:`2` (
- /// CPUID.(EAX= 0FH, ECX=0H).EBX[31:0] +1)).
- ///
- UINT32 ResourceMonitoringID:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_QM_EVTSEL_REGISTER;
-
-
-/**
- Monitoring Counter Register (R/O). If ( CPUID.(EAX=07H, ECX=0):EBX.[12] = 1
- ).
-
- @param ECX MSR_IA32_QM_CTR (0x00000C8E)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_QM_CTR_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_QM_CTR_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_QM_CTR_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_QM_CTR);
- @endcode
- @note MSR_IA32_QM_CTR is defined as IA32_QM_CTR in SDM.
-**/
-#define MSR_IA32_QM_CTR 0x00000C8E
-
-/**
- MSR information returned for MSR index #MSR_IA32_QM_CTR
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Resource Monitored Data.
- ///
- UINT32 ResourceMonitoredData:32;
- ///
- /// [Bits 61:32] Resource Monitored Data.
- ///
- UINT32 ResourceMonitoredDataHi:30;
- ///
- /// [Bit 62] Unavailable: If 1, indicates data for this RMID is not
- /// available or not monitored for this resource or RMID.
- ///
- UINT32 Unavailable:1;
- ///
- /// [Bit 63] Error: If 1, indicates and unsupported RMID or event type was
- /// written to IA32_PQR_QM_EVTSEL.
- ///
- UINT32 Error:1;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_QM_CTR_REGISTER;
-
-
-/**
- Resource Association Register (R/W). If ( (CPUID.(EAX=07H, ECX=0):EBX[12]
- =1) or (CPUID.(EAX=07H, ECX=0):EBX[15] =1 ) ).
-
- @param ECX MSR_IA32_PQR_ASSOC (0x00000C8F)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PQR_ASSOC_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PQR_ASSOC_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PQR_ASSOC_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PQR_ASSOC);
- AsmWriteMsr64 (MSR_IA32_PQR_ASSOC, Msr.Uint64);
- @endcode
- @note MSR_IA32_PQR_ASSOC is defined as IA32_PQR_ASSOC in SDM.
-**/
-#define MSR_IA32_PQR_ASSOC 0x00000C8F
-
-/**
- MSR information returned for MSR index #MSR_IA32_PQR_ASSOC
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] Resource Monitoring ID (R/W): ID for monitoring hardware
- /// to track internal operation, e.g. memory access. N = Ceil (Log:sub:`2`
- /// ( CPUID.(EAX= 0FH, ECX=0H).EBX[31:0] +1)).
- ///
- UINT32 ResourceMonitoringID:32;
- ///
- /// [Bits 63:32] COS (R/W). The class of service (COS) to enforce (on
- /// writes); returns the current COS when read. If ( CPUID.(EAX=07H,
- /// ECX=0):EBX.[15] = 1 ).
- ///
- UINT32 COS:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PQR_ASSOC_REGISTER;
-
-
-/**
- Supervisor State of MPX Configuration. (R/W). If (CPUID.(EAX=07H,
- ECX=0H):EBX[14] = 1).
-
- @param ECX MSR_IA32_BNDCFGS (0x00000D90)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_BNDCFGS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_BNDCFGS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_BNDCFGS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_BNDCFGS);
- AsmWriteMsr64 (MSR_IA32_BNDCFGS, Msr.Uint64);
- @endcode
- @note MSR_IA32_BNDCFGS is defined as IA32_BNDCFGS in SDM.
-**/
-#define MSR_IA32_BNDCFGS 0x00000D90
-
-/**
- MSR information returned for MSR index #MSR_IA32_BNDCFGS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] EN: Enable Intel MPX in supervisor mode.
- ///
- UINT32 EN:1;
- ///
- /// [Bit 1] BNDPRESERVE: Preserve the bounds registers for near branch
- /// instructions in the absence of the BND prefix.
- ///
- UINT32 BNDPRESERVE:1;
- UINT32 Reserved:10;
- ///
- /// [Bits 31:12] Base Address of Bound Directory.
- ///
- UINT32 Base:20;
- ///
- /// [Bits 63:32] Base Address of Bound Directory.
- ///
- UINT32 BaseHi:32;
- } Bits;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_BNDCFGS_REGISTER;
-
-
-/**
- Extended Supervisor State Mask (R/W). If( CPUID.(0DH, 1):EAX.[3] = 1.
-
- @param ECX MSR_IA32_XSS (0x00000DA0)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_XSS_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_XSS_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_XSS_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_XSS);
- AsmWriteMsr64 (MSR_IA32_XSS, Msr.Uint64);
- @endcode
- @note MSR_IA32_XSS is defined as IA32_XSS in SDM.
-**/
-#define MSR_IA32_XSS 0x00000DA0
-
-/**
- MSR information returned for MSR index #MSR_IA32_XSS
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- UINT32 Reserved1:8;
- ///
- /// [Bit 8] Trace Packet Configuration State (R/W).
- ///
- UINT32 TracePacketConfigurationState:1;
- UINT32 Reserved2:23;
- UINT32 Reserved3:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_XSS_REGISTER;
-
-
-/**
- Package Level Enable/disable HDC (R/W). If CPUID.06H:EAX.[13] = 1.
-
- @param ECX MSR_IA32_PKG_HDC_CTL (0x00000DB0)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PKG_HDC_CTL_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PKG_HDC_CTL_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PKG_HDC_CTL_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PKG_HDC_CTL);
- AsmWriteMsr64 (MSR_IA32_PKG_HDC_CTL, Msr.Uint64);
- @endcode
- @note MSR_IA32_PKG_HDC_CTL is defined as IA32_PKG_HDC_CTL in SDM.
-**/
-#define MSR_IA32_PKG_HDC_CTL 0x00000DB0
-
-/**
- MSR information returned for MSR index #MSR_IA32_PKG_HDC_CTL
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] HDC_Pkg_Enable (R/W) Force HDC idling or wake up HDC-idled
- /// logical processors in the package. See Section 14.5.2, "Package level
- /// Enabling HDC". If CPUID.06H:EAX.[13] = 1.
- ///
- UINT32 HDC_Pkg_Enable:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PKG_HDC_CTL_REGISTER;
-
-
-/**
- Enable/disable HWP (R/W). If CPUID.06H:EAX.[13] = 1.
-
- @param ECX MSR_IA32_PM_CTL1 (0x00000DB1)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_PM_CTL1_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_PM_CTL1_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_PM_CTL1_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_PM_CTL1);
- AsmWriteMsr64 (MSR_IA32_PM_CTL1, Msr.Uint64);
- @endcode
- @note MSR_IA32_PM_CTL1 is defined as IA32_PM_CTL1 in SDM.
-**/
-#define MSR_IA32_PM_CTL1 0x00000DB1
-
-/**
- MSR information returned for MSR index #MSR_IA32_PM_CTL1
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] HDC_Allow_Block (R/W) Allow/Block this logical processor for
- /// package level HDC control. See Section 14.5.3.
- /// If CPUID.06H:EAX.[13] = 1.
- ///
- UINT32 HDC_Allow_Block:1;
- UINT32 Reserved1:31;
- UINT32 Reserved2:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_PM_CTL1_REGISTER;
-
-
-/**
- Per-Logical_Processor HDC Idle Residency (R/0). If CPUID.06H:EAX.[13] = 1.
- Stall_Cycle_Cnt (R/W) Stalled cycles due to HDC forced idle on this logical
- processor. See Section 14.5.4.1. If CPUID.06H:EAX.[13] = 1.
-
- @param ECX MSR_IA32_THREAD_STALL (0x00000DB2)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_THREAD_STALL);
- @endcode
- @note MSR_IA32_THREAD_STALL is defined as IA32_THREAD_STALL in SDM.
-**/
-#define MSR_IA32_THREAD_STALL 0x00000DB2
-
-
-/**
- Extended Feature Enables. If ( CPUID.80000001H:EDX.[2 0]
- CPUID.80000001H:EDX.[2 9]).
-
- @param ECX MSR_IA32_EFER (0xC0000080)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_EFER_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_EFER_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_EFER_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_EFER);
- AsmWriteMsr64 (MSR_IA32_EFER, Msr.Uint64);
- @endcode
- @note MSR_IA32_EFER is defined as IA32_EFER in SDM.
-**/
-#define MSR_IA32_EFER 0xC0000080
-
-/**
- MSR information returned for MSR index #MSR_IA32_EFER
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bit 0] SYSCALL Enable: IA32_EFER.SCE (R/W) Enables SYSCALL/SYSRET
- /// instructions in 64-bit mode.
- ///
- UINT32 SCE:1;
- UINT32 Reserved1:7;
- ///
- /// [Bit 8] IA-32e Mode Enable: IA32_EFER.LME (R/W) Enables IA-32e mode
- /// operation.
- ///
- UINT32 LME:1;
- UINT32 Reserved2:1;
- ///
- /// [Bit 10] IA-32e Mode Active: IA32_EFER.LMA (R) Indicates IA-32e mode
- /// is active when set.
- ///
- UINT32 LMA:1;
- ///
- /// [Bit 11] Execute Disable Bit Enable: IA32_EFER.NXE (R/W).
- ///
- UINT32 NXE:1;
- UINT32 Reserved3:20;
- UINT32 Reserved4:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_EFER_REGISTER;
-
-
-/**
- System Call Target Address (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_STAR (0xC0000081)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_STAR);
- AsmWriteMsr64 (MSR_IA32_STAR, Msr);
- @endcode
- @note MSR_IA32_STAR is defined as IA32_STAR in SDM.
-**/
-#define MSR_IA32_STAR 0xC0000081
-
-
-/**
- IA-32e Mode System Call Target Address (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_LSTAR (0xC0000082)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_LSTAR);
- AsmWriteMsr64 (MSR_IA32_LSTAR, Msr);
- @endcode
- @note MSR_IA32_LSTAR is defined as IA32_LSTAR in SDM.
-**/
-#define MSR_IA32_LSTAR 0xC0000082
-
-/**
- IA-32e Mode System Call Target Address (R/W) Not used, as the SYSCALL
- instruction is not recognized in compatibility mode. If
- CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_CSTAR (0xC0000083)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_CSTAR);
- AsmWriteMsr64 (MSR_IA32_CSTAR, Msr);
- @endcode
- @note MSR_IA32_CSTAR is defined as IA32_CSTAR in SDM.
-**/
-#define MSR_IA32_CSTAR 0xC0000083
-
-/**
- System Call Flag Mask (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_FMASK (0xC0000084)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_FMASK);
- AsmWriteMsr64 (MSR_IA32_FMASK, Msr);
- @endcode
- @note MSR_IA32_FMASK is defined as IA32_FMASK in SDM.
-**/
-#define MSR_IA32_FMASK 0xC0000084
-
-
-/**
- Map of BASE Address of FS (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_FS_BASE (0xC0000100)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_FS_BASE);
- AsmWriteMsr64 (MSR_IA32_FS_BASE, Msr);
- @endcode
- @note MSR_IA32_FS_BASE is defined as IA32_FS_BASE in SDM.
-**/
-#define MSR_IA32_FS_BASE 0xC0000100
-
-
-/**
- Map of BASE Address of GS (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_GS_BASE (0xC0000101)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_GS_BASE);
- AsmWriteMsr64 (MSR_IA32_GS_BASE, Msr);
- @endcode
- @note MSR_IA32_GS_BASE is defined as IA32_GS_BASE in SDM.
-**/
-#define MSR_IA32_GS_BASE 0xC0000101
-
-
-/**
- Swap Target of BASE Address of GS (R/W). If CPUID.80000001:EDX.[29] = 1.
-
- @param ECX MSR_IA32_KERNEL_GS_BASE (0xC0000102)
- @param EAX Lower 32-bits of MSR value.
- @param EDX Upper 32-bits of MSR value.
-
- <b>Example usage</b>
- @code
- UINT64 Msr;
-
- Msr = AsmReadMsr64 (MSR_IA32_KERNEL_GS_BASE);
- AsmWriteMsr64 (MSR_IA32_KERNEL_GS_BASE, Msr);
- @endcode
- @note MSR_IA32_KERNEL_GS_BASE is defined as IA32_KERNEL_GS_BASE in SDM.
-**/
-#define MSR_IA32_KERNEL_GS_BASE 0xC0000102
-
-
-/**
- Auxiliary TSC (RW). If CPUID.80000001H: EDX[27] = 1.
-
- @param ECX MSR_IA32_TSC_AUX (0xC0000103)
- @param EAX Lower 32-bits of MSR value.
- Described by the type MSR_IA32_TSC_AUX_REGISTER.
- @param EDX Upper 32-bits of MSR value.
- Described by the type MSR_IA32_TSC_AUX_REGISTER.
-
- <b>Example usage</b>
- @code
- MSR_IA32_TSC_AUX_REGISTER Msr;
-
- Msr.Uint64 = AsmReadMsr64 (MSR_IA32_TSC_AUX);
- AsmWriteMsr64 (MSR_IA32_TSC_AUX, Msr.Uint64);
- @endcode
- @note MSR_IA32_TSC_AUX is defined as IA32_TSC_AUX in SDM.
-**/
-#define MSR_IA32_TSC_AUX 0xC0000103
-
-/**
- MSR information returned for MSR index #MSR_IA32_TSC_AUX
-**/
-typedef union {
- ///
- /// Individual bit fields
- ///
- struct {
- ///
- /// [Bits 31:0] AUX: Auxiliary signature of TSC.
- ///
- UINT32 AUX:32;
- UINT32 Reserved:32;
- } Bits;
- ///
- /// All bit fields as a 32-bit value
- ///
- UINT32 Uint32;
- ///
- /// All bit fields as a 64-bit value
- ///
- UINT64 Uint64;
-} MSR_IA32_TSC_AUX_REGISTER;
+#include <Register/Intel/ArchitecturalMsr.h>

#endif
diff --git a/UefiCpuPkg/Include/Register/Cpuid.h b/UefiCpuPkg/Include/Register/Cpuid.h
index 3946f2455f..3c3468041c 100644
--- a/UefiCpuPkg/Include/Register/Cpuid.h
+++ b/UefiCpuPkg/Include/Register/Cpuid.h
@@ -3,11 +3,6 @@

Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
-
- @par Specification Reference:
- Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 2A,
- November 2018, CPUID instruction.
-
**/

#ifndef __CPUID_H__
diff --git a/UefiCpuPkg/Include/Register/LocalApic.h b/UefiCpuPkg/Include/Register/LocalApic.h
index 369ba96af8..689c825777 100644
--- a/UefiCpuPkg/Include/Register/LocalApic.h
+++ b/UefiCpuPkg/Include/Register/LocalApic.h
@@ -1,183 +1,14 @@
/** @file
- IA32 Local APIC Definitions.
+ Wrapper header file to include <Register/Intel/LocalApic.h> in MdePkg.

- Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
-
**/

#ifndef __LOCAL_APIC_H__
#define __LOCAL_APIC_H__

-//
-// Definition for Local APIC registers and related values
-//
-#define XAPIC_ID_OFFSET 0x20
-#define XAPIC_VERSION_OFFSET 0x30
-#define XAPIC_EOI_OFFSET 0x0b0
-#define XAPIC_ICR_DFR_OFFSET 0x0e0
-#define XAPIC_SPURIOUS_VECTOR_OFFSET 0x0f0
-#define XAPIC_ICR_LOW_OFFSET 0x300
-#define XAPIC_ICR_HIGH_OFFSET 0x310
-#define XAPIC_LVT_TIMER_OFFSET 0x320
-#define XAPIC_LVT_LINT0_OFFSET 0x350
-#define XAPIC_LVT_LINT1_OFFSET 0x360
-#define XAPIC_TIMER_INIT_COUNT_OFFSET 0x380
-#define XAPIC_TIMER_CURRENT_COUNT_OFFSET 0x390
-#define XAPIC_TIMER_DIVIDE_CONFIGURATION_OFFSET 0x3E0
-
-#define X2APIC_MSR_BASE_ADDRESS 0x800
-#define X2APIC_MSR_ICR_ADDRESS 0x830
-
-#define LOCAL_APIC_DELIVERY_MODE_FIXED 0
-#define LOCAL_APIC_DELIVERY_MODE_LOWEST_PRIORITY 1
-#define LOCAL_APIC_DELIVERY_MODE_SMI 2
-#define LOCAL_APIC_DELIVERY_MODE_NMI 4
-#define LOCAL_APIC_DELIVERY_MODE_INIT 5
-#define LOCAL_APIC_DELIVERY_MODE_STARTUP 6
-#define LOCAL_APIC_DELIVERY_MODE_EXTINT 7
-
-#define LOCAL_APIC_DESTINATION_SHORTHAND_NO_SHORTHAND 0
-#define LOCAL_APIC_DESTINATION_SHORTHAND_SELF 1
-#define LOCAL_APIC_DESTINATION_SHORTHAND_ALL_INCLUDING_SELF 2
-#define LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF 3
-
-//
-// Local APIC Version Register.
-//
-typedef union {
- struct {
- UINT32 Version:8; ///< The version numbers of the local APIC.
- UINT32 Reserved0:8; ///< Reserved.
- UINT32 MaxLvtEntry:8; ///< Number of LVT entries minus 1.
- UINT32 EoiBroadcastSuppression:1; ///< 1 if EOI-broadcast suppression supported.
- UINT32 Reserved1:7; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_VERSION;
-
-//
-// Low half of Interrupt Command Register (ICR).
-//
-typedef union {
- struct {
- UINT32 Vector:8; ///< The vector number of the interrupt being sent.
- UINT32 DeliveryMode:3; ///< Specifies the type of IPI to be sent.
- UINT32 DestinationMode:1; ///< 0: physical destination mode, 1: logical destination mode.
- UINT32 DeliveryStatus:1; ///< Indicates the IPI delivery status. This field is reserved in x2APIC mode.
- UINT32 Reserved0:1; ///< Reserved.
- UINT32 Level:1; ///< 0 for the INIT level de-assert delivery mode. Otherwise 1.
- UINT32 TriggerMode:1; ///< 0: edge, 1: level when using the INIT level de-assert delivery mode.
- UINT32 Reserved1:2; ///< Reserved.
- UINT32 DestinationShorthand:2; ///< A shorthand notation to specify the destination of the interrupt.
- UINT32 Reserved2:12; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_ICR_LOW;
-
-//
-// High half of Interrupt Command Register (ICR)
-//
-typedef union {
- struct {
- UINT32 Reserved0:24; ///< Reserved.
- UINT32 Destination:8; ///< Specifies the target processor or processors in xAPIC mode.
- } Bits;
- UINT32 Uint32; ///< Destination field expanded to 32-bit in x2APIC mode.
-} LOCAL_APIC_ICR_HIGH;
-
-//
-// Spurious-Interrupt Vector Register (SVR)
-//
-typedef union {
- struct {
- UINT32 SpuriousVector:8; ///< Spurious Vector.
- UINT32 SoftwareEnable:1; ///< APIC Software Enable/Disable.
- UINT32 FocusProcessorChecking:1; ///< Focus Processor Checking.
- UINT32 Reserved0:2; ///< Reserved.
- UINT32 EoiBroadcastSuppression:1; ///< EOI-Broadcast Suppression.
- UINT32 Reserved1:19; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_SVR;
-
-//
-// Divide Configuration Register (DCR)
-//
-typedef union {
- struct {
- UINT32 DivideValue1:2; ///< Low 2 bits of the divide value.
- UINT32 Reserved0:1; ///< Always 0.
- UINT32 DivideValue2:1; ///< Highest 1 bit of the divide value.
- UINT32 Reserved1:28; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_DCR;
-
-//
-// LVT Timer Register
-//
-typedef union {
- struct {
- UINT32 Vector:8; ///< The vector number of the interrupt being sent.
- UINT32 Reserved0:4; ///< Reserved.
- UINT32 DeliveryStatus:1; ///< 0: Idle, 1: send pending.
- UINT32 Reserved1:3; ///< Reserved.
- UINT32 Mask:1; ///< 0: Not masked, 1: Masked.
- UINT32 TimerMode:1; ///< 0: One-shot, 1: Periodic.
- UINT32 Reserved2:14; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_LVT_TIMER;
-
-//
-// LVT LINT0/LINT1 Register
-//
-typedef union {
- struct {
- UINT32 Vector:8; ///< The vector number of the interrupt being sent.
- UINT32 DeliveryMode:3; ///< Specifies the type of interrupt to be sent.
- UINT32 Reserved0:1; ///< Reserved.
- UINT32 DeliveryStatus:1; ///< 0: Idle, 1: send pending.
- UINT32 InputPinPolarity:1; ///< Interrupt Input Pin Polarity.
- UINT32 RemoteIrr:1; ///< RO. Set when the local APIC accepts the interrupt and reset when an EOI is received.
- UINT32 TriggerMode:1; ///< 0:edge, 1:level.
- UINT32 Mask:1; ///< 0: Not masked, 1: Masked.
- UINT32 Reserved1:15; ///< Reserved.
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_LVT_LINT;
-
-//
-// MSI Address Register
-//
-typedef union {
- struct {
- UINT32 Reserved0:2; ///< Reserved
- UINT32 DestinationMode:1; ///< Specifies the Destination Mode.
- UINT32 RedirectionHint:1; ///< Specifies the Redirection Hint.
- UINT32 Reserved1:8; ///< Reserved.
- UINT32 DestinationId:8; ///< Specifies the Destination ID.
- UINT32 BaseAddress:12; ///< Must be 0FEEH
- } Bits;
- UINT32 Uint32;
-} LOCAL_APIC_MSI_ADDRESS;
-
-//
-// MSI Address Register
-//
-typedef union {
- struct {
- UINT32 Vector:8; ///< Interrupt vector in range 010h..0FEH
- UINT32 DeliveryMode:3; ///< Specifies the type of interrupt to be sent.
- UINT32 Reserved0:3; ///< Reserved.
- UINT32 Level:1; ///< 0:Deassert, 1:Assert. Ignored for Edge triggered interrupts.
- UINT32 TriggerMode:1; ///< 0:Edge, 1:Level.
- UINT32 Reserved1:16; ///< Reserved.
- UINT32 Reserved2:32; ///< Reserved.
- } Bits;
- UINT64 Uint64;
-} LOCAL_APIC_MSI_DATA;
+#include <Register/Intel/LocalApic.h>

#endif

diff --git a/UefiCpuPkg/Include/Register/Microcode.h b/UefiCpuPkg/Include/Register/Microcode.h
index e85c0cc640..48e2dcd1b8 100644
--- a/UefiCpuPkg/Include/Register/Microcode.h
+++ b/UefiCpuPkg/Include/Register/Microcode.h
@@ -1,194 +1,13 @@
/** @file
- Microcode Definitions.
+ Wrapper header file to include <Register/Intel/Microcode.h> in MdePkg.

- Microcode Definitions based on contents of the
- Intel(R) 64 and IA-32 Architectures Software Developer's Manual
- Volume 3A, Section 9.11 Microcode Definitions
-
- Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
-
- @par Specification Reference:
- Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A,
- June 2016, Chapter 9 Processor Management and Initialization, Section 9-11.
-
**/

#ifndef __MICROCODE_H__
#define __MICROCODE_H__

-///
-/// CPU Microcode Date in BCD format
-///
-typedef union {
- struct {
- UINT32 Year:16;
- UINT32 Day:8;
- UINT32 Month:8;
- } Bits;
- UINT32 Uint32;
-} CPU_MICROCODE_DATE;
-
-///
-/// CPU Microcode Processor Signature format
-///
-typedef union {
- struct {
- UINT32 Stepping:4;
- UINT32 Model:4;
- UINT32 Family:4;
- UINT32 Type:2;
- UINT32 Reserved1:2;
- UINT32 ExtendedModel:4;
- UINT32 ExtendedFamily:8;
- UINT32 Reserved2:4;
- } Bits;
- UINT32 Uint32;
-} CPU_MICROCODE_PROCESSOR_SIGNATURE;
-
-#pragma pack (1)
-
-///
-/// Microcode Update Format definition
-///
-typedef struct {
- ///
- /// Version number of the update header
- ///
- UINT32 HeaderVersion;
- ///
- /// Unique version number for the update, the basis for the update
- /// signature provided by the processor to indicate the current update
- /// functioning within the processor. Used by the BIOS to authenticate
- /// the update and verify that the processor loads successfully. The
- /// value in this field cannot be used for processor stepping identification
- /// alone. This is a signed 32-bit number.
- ///
- UINT32 UpdateRevision;
- ///
- /// Date of the update creation in binary format: mmddyyyy (e.g.
- /// 07/18/98 is 07181998H).
- ///
- CPU_MICROCODE_DATE Date;
- ///
- /// Extended family, extended model, type, family, model, and stepping
- /// of processor that requires this particular update revision (e.g.,
- /// 00000650H). Each microcode update is designed specifically for a
- /// given extended family, extended model, type, family, model, and
- /// stepping of the processor.
- /// The BIOS uses the processor signature field in conjunction with the
- /// CPUID instruction to determine whether or not an update is
- /// appropriate to load on a processor. The information encoded within
- /// this field exactly corresponds to the bit representations returned by
- /// the CPUID instruction.
- ///
- CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature;
- ///
- /// Checksum of Update Data and Header. Used to verify the integrity of
- /// the update header and data. Checksum is correct when the
- /// summation of all the DWORDs (including the extended Processor
- /// Signature Table) that comprise the microcode update result in
- /// 00000000H.
- ///
- UINT32 Checksum;
- ///
- /// Version number of the loader program needed to correctly load this
- /// update. The initial version is 00000001H
- ///
- UINT32 LoaderRevision;
- ///
- /// Platform type information is encoded in the lower 8 bits of this 4-
- /// byte field. Each bit represents a particular platform type for a given
- /// CPUID. The BIOS uses the processor flags field in conjunction with
- /// the platform Id bits in MSR (17H) to determine whether or not an
- /// update is appropriate to load on a processor. Multiple bits may be set
- /// representing support for multiple platform IDs.
- ///
- UINT32 ProcessorFlags;
- ///
- /// Specifies the size of the encrypted data in bytes, and must be a
- /// multiple of DWORDs. If this value is 00000000H, then the microcode
- /// update encrypted data is 2000 bytes (or 500 DWORDs).
- ///
- UINT32 DataSize;
- ///
- /// Specifies the total size of the microcode update in bytes. It is the
- /// summation of the header size, the encrypted data size and the size of
- /// the optional extended signature table. This value is always a multiple
- /// of 1024.
- ///
- UINT32 TotalSize;
- ///
- /// Reserved fields for future expansion.
- ///
- UINT8 Reserved[12];
-} CPU_MICROCODE_HEADER;
-
-///
-/// Extended Signature Table Header Field Definitions
-///
-typedef struct {
- ///
- /// Specifies the number of extended signature structures (Processor
- /// Signature[n], processor flags[n] and checksum[n]) that exist in this
- /// microcode update
- ///
- UINT32 ExtendedSignatureCount;
- ///
- /// Checksum of update extended processor signature table. Used to
- /// verify the integrity of the extended processor signature table.
- /// Checksum is correct when the summation of the DWORDs that
- /// comprise the extended processor signature table results in
- /// 00000000H.
- ///
- UINT32 ExtendedChecksum;
- ///
- /// Reserved fields.
- ///
- UINT8 Reserved[12];
-} CPU_MICROCODE_EXTENDED_TABLE_HEADER;
-
-///
-/// Extended Signature Table Field Definitions
-///
-typedef struct {
- ///
- /// Extended family, extended model, type, family, model, and stepping
- /// of processor that requires this particular update revision (e.g.,
- /// 00000650H). Each microcode update is designed specifically for a
- /// given extended family, extended model, type, family, model, and
- /// stepping of the processor.
- /// The BIOS uses the processor signature field in conjunction with the
- /// CPUID instruction to determine whether or not an update is
- /// appropriate to load on a processor. The information encoded within
- /// this field exactly corresponds to the bit representations returned by
- /// the CPUID instruction.
- ///
- CPU_MICROCODE_PROCESSOR_SIGNATURE ProcessorSignature;
- ///
- /// Platform type information is encoded in the lower 8 bits of this 4-
- /// byte field. Each bit represents a particular platform type for a given
- /// CPUID. The BIOS uses the processor flags field in conjunction with
- /// the platform Id bits in MSR (17H) to determine whether or not an
- /// update is appropriate to load on a processor. Multiple bits may be set
- /// representing support for multiple platform IDs.
- ///
- UINT32 ProcessorFlag;
- ///
- /// Used by utility software to decompose a microcode update into
- /// multiple microcode updates where each of the new updates is
- /// constructed without the optional Extended Processor Signature
- /// Table.
- /// To calculate the Checksum, substitute the Primary Processor
- /// Signature entry and the Processor Flags entry with the
- /// corresponding Extended Patch entry. Delete the Extended Processor
- /// Signature Table entries. The Checksum is correct when the
- /// summation of all DWORDs that comprise the created Extended
- /// Processor Patch results in 00000000H.
- ///
- UINT32 Checksum;
-} CPU_MICROCODE_EXTENDED_TABLE;
-
-#pragma pack ()
+#include <Register/Intel/Microcode.h>

#endif
diff --git a/UefiCpuPkg/Include/Register/Msr.h b/UefiCpuPkg/Include/Register/Msr.h
index c9be042983..79830fa150 100644
--- a/UefiCpuPkg/Include/Register/Msr.h
+++ b/UefiCpuPkg/Include/Register/Msr.h
@@ -1,44 +1,14 @@
/** @file
- MSR Definitions.
+ Wrapper header file to include <Register/Intel/Msr.h> in MdePkg.

- Provides defines for Machine Specific Registers(MSR) indexes. Data structures
- are provided for MSRs that contain one or more bit fields. If the MSR value
- returned is a single 32-bit or 64-bit value, then a data structure is not
- provided for that MSR.
-
- Copyright (c) 2016 ~ 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

- @par Specification Reference:
- Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 4,
- May 2018, Volume 4: Model-Specific-Registers (MSR)
-
**/

#ifndef __MSR_H__
#define __MSR_H__

-#include <Register/ArchitecturalMsr.h>
-#include <Register/Msr/Core2Msr.h>
-#include <Register/Msr/AtomMsr.h>
-#include <Register/Msr/SilvermontMsr.h>
-#include <Register/Msr/GoldmontMsr.h>
-#include <Register/Msr/GoldmontPlusMsr.h>
-#include <Register/Msr/NehalemMsr.h>
-#include <Register/Msr/Xeon5600Msr.h>
-#include <Register/Msr/XeonE7Msr.h>
-#include <Register/Msr/SandyBridgeMsr.h>
-#include <Register/Msr/IvyBridgeMsr.h>
-#include <Register/Msr/HaswellMsr.h>
-#include <Register/Msr/HaswellEMsr.h>
-#include <Register/Msr/BroadwellMsr.h>
-#include <Register/Msr/XeonDMsr.h>
-#include <Register/Msr/SkylakeMsr.h>
-#include <Register/Msr/XeonPhiMsr.h>
-#include <Register/Msr/Pentium4Msr.h>
-#include <Register/Msr/CoreMsr.h>
-#include <Register/Msr/PentiumMMsr.h>
-#include <Register/Msr/P6Msr.h>
-#include <Register/Msr/PentiumMsr.h>
+#include <Register/Intel/Msr.h>

#endif
diff --git a/UefiCpuPkg/Include/Register/SmramSaveStateMap.h b/UefiCpuPkg/Include/Register/SmramSaveStateMap.h
index 6473e51a55..0033043309 100644
--- a/UefiCpuPkg/Include/Register/SmramSaveStateMap.h
+++ b/UefiCpuPkg/Include/Register/SmramSaveStateMap.h
@@ -1,184 +1,13 @@
/** @file
-SMRAM Save State Map Definitions.
-
-SMRAM Save State Map definitions based on contents of the
-Intel(R) 64 and IA-32 Architectures Software Developer's Manual
- Volume 3C, Section 34.4 SMRAM
- Volume 3C, Section 34.5 SMI Handler Execution Environment
- Volume 3C, Section 34.7 Managing Synchronous and Asynchronous SMIs
-
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Wrapper header file to include <Register/Intel/SmramSaveStateMap.h> in MdePkg.

+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#ifndef __SMRAM_SAVE_STATE_MAP_H__
#define __SMRAM_SAVE_STATE_MAP_H__

-///
-/// Default SMBASE address
-///
-#define SMM_DEFAULT_SMBASE 0x30000
-
-///
-/// Offset of SMM handler from SMBASE
-///
-#define SMM_HANDLER_OFFSET 0x8000
-
-///
-/// Offset of SMRAM Save State Map from SMBASE
-///
-#define SMRAM_SAVE_STATE_MAP_OFFSET 0xfc00
-
-#pragma pack (1)
-
-///
-/// 32-bit SMRAM Save State Map
-///
-typedef struct {
- UINT8 Reserved[0x200]; // 7c00h
- // Padded an extra 0x200 bytes so 32-bit and 64-bit
- // SMRAM Save State Maps are the same size
- UINT8 Reserved1[0xf8]; // 7e00h
- UINT32 SMBASE; // 7ef8h
- UINT32 SMMRevId; // 7efch
- UINT16 IORestart; // 7f00h
- UINT16 AutoHALTRestart; // 7f02h
- UINT8 Reserved2[0x9C]; // 7f08h
- UINT32 IOMemAddr; // 7fa0h
- UINT32 IOMisc; // 7fa4h
- UINT32 _ES; // 7fa8h
- UINT32 _CS; // 7fach
- UINT32 _SS; // 7fb0h
- UINT32 _DS; // 7fb4h
- UINT32 _FS; // 7fb8h
- UINT32 _GS; // 7fbch
- UINT32 Reserved3; // 7fc0h
- UINT32 _TR; // 7fc4h
- UINT32 _DR7; // 7fc8h
- UINT32 _DR6; // 7fcch
- UINT32 _EAX; // 7fd0h
- UINT32 _ECX; // 7fd4h
- UINT32 _EDX; // 7fd8h
- UINT32 _EBX; // 7fdch
- UINT32 _ESP; // 7fe0h
- UINT32 _EBP; // 7fe4h
- UINT32 _ESI; // 7fe8h
- UINT32 _EDI; // 7fech
- UINT32 _EIP; // 7ff0h
- UINT32 _EFLAGS; // 7ff4h
- UINT32 _CR3; // 7ff8h
- UINT32 _CR0; // 7ffch
-} SMRAM_SAVE_STATE_MAP32;
-
-///
-/// 64-bit SMRAM Save State Map
-///
-typedef struct {
- UINT8 Reserved1[0x1d0]; // 7c00h
- UINT32 GdtBaseHiDword; // 7dd0h
- UINT32 LdtBaseHiDword; // 7dd4h
- UINT32 IdtBaseHiDword; // 7dd8h
- UINT8 Reserved2[0xc]; // 7ddch
- UINT64 IO_EIP; // 7de8h
- UINT8 Reserved3[0x50]; // 7df0h
- UINT32 _CR4; // 7e40h
- UINT8 Reserved4[0x48]; // 7e44h
- UINT32 GdtBaseLoDword; // 7e8ch
- UINT32 Reserved5; // 7e90h
- UINT32 IdtBaseLoDword; // 7e94h
- UINT32 Reserved6; // 7e98h
- UINT32 LdtBaseLoDword; // 7e9ch
- UINT8 Reserved7[0x38]; // 7ea0h
- UINT64 EptVmxControl; // 7ed8h
- UINT32 EnEptVmxControl; // 7ee0h
- UINT8 Reserved8[0x14]; // 7ee4h
- UINT32 SMBASE; // 7ef8h
- UINT32 SMMRevId; // 7efch
- UINT16 IORestart; // 7f00h
- UINT16 AutoHALTRestart; // 7f02h
- UINT8 Reserved9[0x18]; // 7f04h
- UINT64 _R15; // 7f1ch
- UINT64 _R14;
- UINT64 _R13;
- UINT64 _R12;
- UINT64 _R11;
- UINT64 _R10;
- UINT64 _R9;
- UINT64 _R8;
- UINT64 _RAX; // 7f5ch
- UINT64 _RCX;
- UINT64 _RDX;
- UINT64 _RBX;
- UINT64 _RSP;
- UINT64 _RBP;
- UINT64 _RSI;
- UINT64 _RDI;
- UINT64 IOMemAddr; // 7f9ch
- UINT32 IOMisc; // 7fa4h
- UINT32 _ES; // 7fa8h
- UINT32 _CS;
- UINT32 _SS;
- UINT32 _DS;
- UINT32 _FS;
- UINT32 _GS;
- UINT32 _LDTR; // 7fc0h
- UINT32 _TR;
- UINT64 _DR7; // 7fc8h
- UINT64 _DR6;
- UINT64 _RIP; // 7fd8h
- UINT64 IA32_EFER; // 7fe0h
- UINT64 _RFLAGS; // 7fe8h
- UINT64 _CR3; // 7ff0h
- UINT64 _CR0; // 7ff8h
-} SMRAM_SAVE_STATE_MAP64;
-
-///
-/// Union of 32-bit and 64-bit SMRAM Save State Maps
-///
-typedef union {
- SMRAM_SAVE_STATE_MAP32 x86;
- SMRAM_SAVE_STATE_MAP64 x64;
-} SMRAM_SAVE_STATE_MAP;
-
-///
-/// Minimum SMM Revision ID that supports IOMisc field in SMRAM Save State Map
-///
-#define SMRAM_SAVE_STATE_MIN_REV_ID_IOMISC 0x30004
-
-///
-/// SMRAM Save State Map IOMisc I/O Length Values
-///
-#define SMM_IO_LENGTH_BYTE 0x01
-#define SMM_IO_LENGTH_WORD 0x02
-#define SMM_IO_LENGTH_DWORD 0x04
-
-///
-/// SMRAM Save State Map IOMisc I/O Instruction Type Values
-///
-#define SMM_IO_TYPE_IN_IMMEDIATE 0x9
-#define SMM_IO_TYPE_IN_DX 0x1
-#define SMM_IO_TYPE_OUT_IMMEDIATE 0x8
-#define SMM_IO_TYPE_OUT_DX 0x0
-#define SMM_IO_TYPE_INS 0x3
-#define SMM_IO_TYPE_OUTS 0x2
-#define SMM_IO_TYPE_REP_INS 0x7
-#define SMM_IO_TYPE_REP_OUTS 0x6
-
-///
-/// SMRAM Save State Map IOMisc structure
-///
-typedef union {
- struct {
- UINT32 SmiFlag:1;
- UINT32 Length:3;
- UINT32 Type:4;
- UINT32 Reserved1:8;
- UINT32 Port:16;
- } Bits;
- UINT32 Uint32;
-} SMRAM_SAVE_STATE_IOMISC;
-
-#pragma pack ()
+#include <Register/Intel/SmramSaveStateMap.h>

#endif
diff --git a/UefiCpuPkg/Include/Register/StmApi.h b/UefiCpuPkg/Include/Register/StmApi.h
index 0ecc0b86d5..1fa58aa9fb 100644
--- a/UefiCpuPkg/Include/Register/StmApi.h
+++ b/UefiCpuPkg/Include/Register/StmApi.h
@@ -1,948 +1,13 @@
/** @file
- STM API definition
+ Wrapper header file to include <Register/Intel/StmApi.h> in MdePkg.

- Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
-
- @par Specification Reference:
- SMI Transfer Monitor (STM) User Guide Revision 1.00
-
**/

#ifndef _STM_API_H_
#define _STM_API_H_

-#include <Register/StmStatusCode.h>
-#include <Register/StmResourceDescriptor.h>
-#include <Register/ArchitecturalMsr.h>
-
-#pragma pack (1)
-
-/**
- STM Header Structures
-**/
-
-typedef struct {
- UINT32 Intel64ModeSupported :1; ///> bitfield
- UINT32 EptSupported :1; ///> bitfield
- UINT32 Reserved :30; ///> must be 0
-} STM_FEAT;
-
-#define STM_SPEC_VERSION_MAJOR 1
-#define STM_SPEC_VERSION_MINOR 0
-
-typedef struct {
- UINT8 StmSpecVerMajor;
- UINT8 StmSpecVerMinor;
- ///
- /// Must be zero
- ///
- UINT16 Reserved;
- UINT32 StaticImageSize;
- UINT32 PerProcDynamicMemorySize;
- UINT32 AdditionalDynamicMemorySize;
- STM_FEAT StmFeatures;
- UINT32 NumberOfRevIDs;
- UINT32 StmSmmRevID[1];
- ///
- /// The total STM_HEADER should be 4K.
- ///
-} SOFTWARE_STM_HEADER;
-
-typedef struct {
- MSEG_HEADER HwStmHdr;
- SOFTWARE_STM_HEADER SwStmHdr;
-} STM_HEADER;
-
-
-/**
- VMCALL API Numbers
- API number convention: BIOS facing VMCALL interfaces have bit 16 clear
-**/
-
-/**
- StmMapAddressRange enables a SMM guest to create a non-1:1 virtual to
- physical mapping of an address range into the SMM guest's virtual
- memory space.
-
- @param EAX #STM_API_MAP_ADDRESS_RANGE (0x00000001)
- @param EBX Low 32 bits of physical address of caller allocated
- STM_MAP_ADDRESS_RANGE_DESCRIPTOR structure.
- @param ECX High 32 bits of physical address of caller allocated
- STM_MAP_ADDRESS_RANGE_DESCRIPTOR structure. If Intel64Mode is
- clear (0), ECX must be 0.
-
- @note All fields of STM_MAP_ADDRESS_RANGE_DESCRIPTOR are inputs only. They
- are not modified by StmMapAddressRange.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS.
- The memory range was mapped as requested.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_SECURITY_VIOLATION
- The requested mapping contains a protected resource.
- @retval EAX #ERROR_STM_CACHE_TYPE_NOT_SUPPORTED
- The requested cache type could not be satisfied.
- @retval EAX #ERROR_STM_PAGE_NOT_FOUND
- Page count must not be zero.
- @retval EAX #ERROR_STM_FUNCTION_NOT_SUPPORTED
- STM supports EPT and has not implemented StmMapAddressRange().
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_MAP_ADDRESS_RANGE 0x00000001
-
-/**
- STM Map Address Range Descriptor for #STM_API_MAP_ADDRESS_RANGE VMCALL
-**/
-typedef struct {
- UINT64 PhysicalAddress;
- UINT64 VirtualAddress;
- UINT32 PageCount;
- UINT32 PatCacheType;
-} STM_MAP_ADDRESS_RANGE_DESCRIPTOR;
-
-/**
- Define values for PatCacheType field of #STM_MAP_ADDRESS_RANGE_DESCRIPTOR
- @{
-**/
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_ST_UC 0x00
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WC 0x01
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WT 0x04
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WP 0x05
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_WB 0x06
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_UC 0x07
-#define STM_MAP_ADDRESS_RANGE_PAT_CACHE_TYPE_FOLLOW_MTRR 0xFFFFFFFF
-/// @}
-
-/**
- StmUnmapAddressRange enables a SMM guest to remove mappings from its page
- table.
-
- If TXT_PROCESSOR_SMM_DESCRIPTOR.EptEnabled bit is set by the STM, BIOS can
- control its own page tables. In this case, the STM implementation may
- optionally return ERROR_STM_FUNCTION_NOT_SUPPORTED.
-
- @param EAX #STM_API_UNMAP_ADDRESS_RANGE (0x00000002)
- @param EBX Low 32 bits of virtual address of caller allocated
- STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR structure.
- @param ECX High 32 bits of virtual address of caller allocated
- STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR structure. If Intel64Mode is
- clear (0), ECX must be zero.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The memory range was unmapped
- as requested.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_FUNCTION_NOT_SUPPORTED
- STM supports EPT and has not implemented StmUnmapAddressRange().
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_UNMAP_ADDRESS_RANGE 0x00000002
-
-/**
- STM Unmap Address Range Descriptor for #STM_API_UNMAP_ADDRESS_RANGE VMCALL
-**/
-typedef struct {
- UINT64 VirtualAddress;
- UINT32 Length;
-} STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR;
-
-
-/**
- Since the normal OS environment runs with a different set of page tables than
- the SMM guest, virtual mappings will certainly be different. In order to do a
- guest virtual to host physical translation of an address from the normal OS
- code (EIP for example), it is necessary to walk the page tables governing the
- OS page mappings. Since the SMM guest has no direct access to the page tables,
- it must ask the STM to do this page table walk. This is supported via the
- StmAddressLookup VMCALL. All OS page table formats need to be supported,
- (e.g. PAE, PSE, Intel64, EPT, etc.)
-
- StmAddressLookup takes a CR3 value and a virtual address from the interrupted
- code as input and returns the corresponding physical address. It also
- optionally maps the physical address into the SMM guest's virtual address
- space. This new mapping persists ONLY for the duration of the SMI and if
- needed in subsequent SMIs it must be remapped. PAT cache types follow the
- interrupted environment's page table.
-
- If EPT is enabled, OS CR3 only provides guest physical address information,
- but the SMM guest might also need to know the host physical address. Since
- SMM does not have direct access rights to EPT (it is protected by the STM),
- SMM can input InterruptedEptp to let STM help to walk through it, and output
- the host physical address.
-
- @param EAX #STM_API_ADDRESS_LOOKUP (0x00000003)
- @param EBX Low 32 bits of virtual address of caller allocated
- STM_ADDRESS_LOOKUP_DESCRIPTOR structure.
- @param ECX High 32 bits of virtual address of caller allocated
- STM_ADDRESS_LOOKUP_DESCRIPTOR structure. If Intel64Mode is
- clear (0), ECX must be zero.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. PhysicalAddress contains the
- host physical address determined by walking the interrupted SMM
- guest's page tables. SmmGuestVirtualAddress contains the SMM
- guest's virtual mapping of the requested address.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_SECURITY_VIOLATION
- The requested page was a protected page.
- @retval EAX #ERROR_STM_PAGE_NOT_FOUND
- The requested virtual address did not exist in the page given
- page table.
- @retval EAX #ERROR_STM_BAD_CR3
- The CR3 input was invalid. CR3 values must be from one of the
- interrupted guest, or from the interrupted guest of another
- processor.
- @retval EAX #ERROR_STM_PHYSICAL_OVER_4G
- The resulting physical address is greater than 4G and no virtual
- address was supplied. The STM could not determine what address
- within the SMM guest's virtual address space to do the mapping.
- STM_ADDRESS_LOOKUP_DESCRIPTOR field PhysicalAddress contains the
- physical address determined by walking the interrupted
- environment's page tables.
- @retval EAX #ERROR_STM_VIRTUAL_SPACE_TOO_SMALL
- A specific virtual mapping was requested, but
- SmmGuestVirtualAddress + Length exceeds 4G and the SMI handler
- is running in 32 bit mode.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_ADDRESS_LOOKUP 0x00000003
-
-/**
- STM Lookup Address Range Descriptor for #STM_API_ADDRESS_LOOKUP VMCALL
-**/
-typedef struct {
- UINT64 InterruptedGuestVirtualAddress;
- UINT32 Length;
- UINT64 InterruptedCr3;
- UINT64 InterruptedEptp;
- UINT32 MapToSmmGuest:2;
- UINT32 InterruptedCr4Pae:1;
- UINT32 InterruptedCr4Pse:1;
- UINT32 InterruptedIa32eMode:1;
- UINT32 Reserved1:27;
- UINT32 Reserved2;
- UINT64 PhysicalAddress;
- UINT64 SmmGuestVirtualAddress;
-} STM_ADDRESS_LOOKUP_DESCRIPTOR;
-
-/**
- Define values for the MapToSmmGuest field of #STM_ADDRESS_LOOKUP_DESCRIPTOR
- @{
-**/
-#define STM_ADDRESS_LOOKUP_DESCRIPTOR_DO_NOT_MAP 0
-#define STM_ADDRESS_LOOKUP_DESCRIPTOR_ONE_TO_ONE 1
-#define STM_ADDRESS_LOOKUP_DESCRIPTOR_VIRTUAL_ADDRESS_SPECIFIED 3
-/// @}
-
-
-/**
- When returning from a protection exception (see section 6.2), the SMM guest
- can instruct the STM to take one of two paths. It can either request a value
- be logged to the TXT.ERRORCODE register and subsequently reset the machine
- (indicating it couldn't resolve the problem), or it can request that the STM
- resume the SMM guest again with the specified register state.
-
- Unlike other VMCALL interfaces, StmReturnFromProtectionException behaves more
- like a jump or an IRET instruction than a "call". It does not return directly
- to the caller, but indirectly to a different location specified on the
- caller's stack (see section 6.2) or not at all.
-
- If the SMM guest STM protection exception handler itself causes a protection
- exception (e.g. a single nested exception), or more than 100 un-nested
- exceptions occur within the scope of a single SMI event, the STM must write
- STM_CRASH_PROTECTION_EXCEPTION_FAILURE to the TXT.ERRORCODE register and
- assert TXT.CMD.SYS_RESET. The reason for these restrictions is to simplify
- the code requirements while still enabling a reasonable debugging capability.
-
- @param EAX #STM_API_RETURN_FROM_PROTECTION_EXCEPTION (0x00000004)
- @param EBX If 0, resume SMM guest using register state found on exception
- stack. If in range 0x01..0x0F, EBX contains a BIOS error code
- which the STM must record in the TXT.ERRORCODE register and
- subsequently reset the system via TXT.CMD.SYS_RESET. The value
- of the TXT.ERRORCODE register is calculated as follows:
-
- TXT.ERRORCODE = (EBX & 0x0F) | STM_CRASH_BIOS_PANIC
-
- Values 0x10..0xFFFFFFFF are reserved, do not use.
-
-**/
-#define STM_API_RETURN_FROM_PROTECTION_EXCEPTION 0x00000004
-
-
-/**
- VMCALL API Numbers
- API number convention: MLE facing VMCALL interfaces have bit 16 set.
-
- The STM configuration lifecycle is as follows:
- 1. SENTER->SINIT->MLE: MLE begins execution with SMI disabled (masked).
- 2. MLE invokes #STM_API_INITIALIZE_PROTECTION VMCALL to prepare STM for
- setup of initial protection profile. This is done on a single CPU and
- has global effect.
- 3. MLE invokes #STM_API_PROTECT_RESOURCE VMCALL to define the initial
- protection profile. The protection profile is global across all CPUs.
- 4. MLE invokes #STM_API_START VMCALL to enable the STM to begin receiving
- SMI events. This must be done on every logical CPU.
- 5. MLE may invoke #STM_API_PROTECT_RESOURCE VMCALL or
- #STM_API_UNPROTECT_RESOURCE VMCALL during runtime as many times as
- necessary.
- 6. MLE invokes #STM_API_STOP VMCALL to disable the STM. SMI is again masked
- following #STM_API_STOP VMCALL.
-**/
-
-/**
- StartStmVmcall() is used to configure an STM that is present in MSEG. SMIs
- should remain disabled from the invocation of GETSEC[SENTER] until they are
- re-enabled by StartStmVMCALL(). When StartStmVMCALL() returns, SMI is
- enabled and the STM has been started and is active. Prior to invoking
- StartStmVMCALL(), the MLE root should first invoke
- InitializeProtectionVMCALL() followed by as many iterations of
- ProtectResourceVMCALL() as necessary to establish the initial protection
- profile. StartStmVmcall() must be invoked on all processor threads.
-
- @param EAX #STM_API_START (0x00010001)
- @param EDX STM configuration options. These provide the MLE with the
- ability to pass configuration parameters to the STM.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The STM has been configured
- and is now active and the guarding all requested resources.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_ALREADY_STARTED
- The STM is already configured and active. STM remains active and
- guarding previously enabled resource list.
- @retval EAX #ERROR_STM_WITHOUT_SMX_UNSUPPORTED
- The StartStmVMCALL() was invoked from VMX root mode, but outside
- of SMX. This error code indicates the STM or platform does not
- support the STM outside of SMX. The SMI handler remains active
- and operates in legacy mode. See Appendix C
- @retval EAX #ERROR_STM_UNSUPPORTED_MSR_BIT
- The CPU doesn't support the MSR bit. The STM is not active.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_START (BIT16 | 1)
-
-/**
- Bit values for EDX input parameter to #STM_API_START VMCALL
- @{
-**/
-#define STM_CONFIG_SMI_UNBLOCKING_BY_VMX_OFF BIT0
-/// @}
-
-
-/**
- The StopStmVMCALL() is invoked by the MLE to teardown an active STM. This is
- normally done as part of a full teardown of the SMX environment when the
- system is being shut down. At the time the call is invoked, SMI is enabled
- and the STM is active. When the call returns, the STM has been stopped and
- all STM context is discarded and SMI is disabled.
-
- @param EAX #STM_API_STOP (0x00010002)
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The STM has been stopped and
- is no longer processing SMI events. SMI is blocked.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_STOPPED
- The STM was not active.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_STOP (BIT16 | 2)
-
-
-/**
- The ProtectResourceVMCALL() is invoked by the MLE root to request protection
- of specific resources. The request is defined by a STM_RESOURCE_LIST, which
- may contain more than one resource descriptor. Each resource descriptor is
- processed separately by the STM. Whether or not protection for any specific
- resource is granted is returned by the STM via the ReturnStatus bit in the
- associated STM_RSC_DESC_HEADER.
-
- @param EAX #STM_API_PROTECT_RESOURCE (0x00010003)
- @param EBX Low 32 bits of physical address of caller allocated
- STM_RESOURCE_LIST. Bits 11:0 are ignored and assumed to be zero,
- making the buffer 4K aligned.
- @param ECX High 32 bits of physical address of caller allocated
- STM_RESOURCE_LIST.
-
- @note All fields of STM_RESOURCE_LIST are inputs only, except for the
- ReturnStatus bit. On input, the ReturnStatus bit must be clear. On
- return, the ReturnStatus bit is set for each resource request granted,
- and clear for each resource request denied. There are no other fields
- modified by ProtectResourceVMCALL(). The STM_RESOURCE_LIST must be
- contained entirely within a single 4K page.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The STM has successfully
- merged the entire protection request into the active protection
- profile. There is therefore no need to check the ReturnStatus
- bits in the STM_RESOURCE_LIST.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_UNPROTECTABLE_RESOURCE
- At least one of the requested resource protections intersects a
- BIOS required resource. Therefore, the caller must walk through
- the STM_RESOURCE_LIST to determine which of the requested
- resources was not granted protection. The entire list must be
- traversed since there may be multiple failures.
- @retval EAX #ERROR_STM_MALFORMED_RESOURCE_LIST
- The resource list could not be parsed correctly, or did not
- terminate before crossing a 4K page boundary. The caller must
- walk through the STM_RESOURCE_LIST to determine which of the
- requested resources was not granted protection. The entire list
- must be traversed since there may be multiple failures.
- @retval EAX #ERROR_STM_OUT_OF_RESOURCES
- The STM has encountered an internal error and cannot complete
- the request.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_PROTECT_RESOURCE (BIT16 | 3)
-
-
-/**
- The UnProtectResourceVMCALL() is invoked by the MLE root to request that the
- STM allow the SMI handler access to the specified resources.
-
- @param EAX #STM_API_UNPROTECT_RESOURCE (0x00010004)
- @param EBX Low 32 bits of physical address of caller allocated
- STM_RESOURCE_LIST. Bits 11:0 are ignored and assumed to be zero,
- making the buffer 4K aligned.
- @param ECX High 32 bits of physical address of caller allocated
- STM_RESOURCE_LIST.
-
- @note All fields of STM_RESOURCE_LIST are inputs only, except for the
- ReturnStatus bit. On input, the ReturnStatus bit must be clear. On
- return, the ReturnStatus bit is set for each resource processed. For
- a properly formed STM_RESOURCE_LIST, this should be all resources
- listed. There are no other fields modified by
- UnProtectResourceVMCALL(). The STM_RESOURCE_LIST must be contained
- entirely within a single 4K page.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The requested resources are
- not being guarded by the STM.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_MALFORMED_RESOURCE_LIST
- The resource list could not be parsed correctly, or did not
- terminate before crossing a 4K page boundary. The caller must
- walk through the STM_RESOURCE_LIST to determine which of the
- requested resources were not able to be unprotected. The entire
- list must be traversed since there may be multiple failures.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_UNPROTECT_RESOURCE (BIT16 | 4)
-
-
-/**
- The GetBiosResourcesVMCALL() is invoked by the MLE root to request the list
- of BIOS required resources from the STM.
-
- @param EAX #STM_API_GET_BIOS_RESOURCES (0x00010005)
- @param EBX Low 32 bits of physical address of caller allocated destination
- buffer. Bits 11:0 are ignored and assumed to be zero, making the
- buffer 4K aligned.
- @param ECX High 32 bits of physical address of caller allocated destination
- buffer.
- @param EDX Indicates which page of the BIOS resource list to copy into the
- destination buffer. The first page is indicated by 0, the second
- page by 1, etc.
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS. The destination buffer
- contains the BIOS required resources. If the page retrieved is
- the last page, EDX will be cleared to 0. If there are more pages
- to retrieve, EDX is incremented to the next page index. Calling
- software should iterate on GetBiosResourcesVMCALL() until EDX is
- returned cleared to 0.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_PAGE_NOT_FOUND
- The page index supplied in EDX input was out of range.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
- @retval EDX Page index of next page to read. A return of EDX=0 signifies
- that the entire list has been read.
- @note EDX is both an input and an output register.
-
- @note All other registers unmodified.
-**/
-#define STM_API_GET_BIOS_RESOURCES (BIT16 | 5)
-
-
-/**
- The ManageVmcsDatabaseVMCALL() is invoked by the MLE root to add or remove an
- MLE guest (including the MLE root) from the list of protected domains.
-
- @param EAX #STM_API_MANAGE_VMCS_DATABASE (0x00010006)
- @param EBX Low 32 bits of physical address of caller allocated
- STM_VMCS_DATABASE_REQUEST. Bits 11:0 are ignored and assumed to
- be zero, making the buffer 4K aligned.
- @param ECX High 32 bits of physical address of caller allocated
- STM_VMCS_DATABASE_REQUEST.
-
- @note All fields of STM_VMCS_DATABASE_REQUEST are inputs only. They are not
- modified by ManageVmcsDatabaseVMCALL().
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_INVALID_VMCS
- Indicates a request to remove a VMCS from the database was made,
- but the referenced VMCS was not found in the database.
- @retval EAX #ERROR_STM_VMCS_PRESENT
- Indicates a request to add a VMCS to the database was made, but
- the referenced VMCS was already present in the database.
- @retval EAX #ERROR_INVALID_PARAMETER
- Indicates non-zero reserved field.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred
-
- @note All other registers unmodified.
-**/
-#define STM_API_MANAGE_VMCS_DATABASE (BIT16 | 6)
-
-/**
- STM VMCS Database Request for #STM_API_MANAGE_VMCS_DATABASE VMCALL
-**/
-typedef struct {
- ///
- /// bits 11:0 are reserved and must be 0
- ///
- UINT64 VmcsPhysPointer;
- UINT32 DomainType :4;
- UINT32 XStatePolicy :2;
- UINT32 DegradationPolicy :4;
- ///
- /// Must be 0
- ///
- UINT32 Reserved1 :22;
- UINT32 AddOrRemove;
-} STM_VMCS_DATABASE_REQUEST;
-
-/**
- Values for the DomainType field of #STM_VMCS_DATABASE_REQUEST
- @{
-**/
-#define DOMAIN_UNPROTECTED 0
-#define DOMAIN_DISALLOWED_IO_OUT BIT0
-#define DOMAIN_DISALLOWED_IO_IN BIT1
-#define DOMAIN_INTEGRITY BIT2
-#define DOMAIN_CONFIDENTIALITY BIT3
-#define DOMAIN_INTEGRITY_PROT_OUT_IN (DOMAIN_INTEGRITY)
-#define DOMAIN_FULLY_PROT_OUT_IN (DOMAIN_CONFIDENTIALITY | DOMAIN_INTEGRITY)
-#define DOMAIN_FULLY_PROT (DOMAIN_FULLY_PROT_OUT_IN | DOMAIN_DISALLOWED_IO_IN | DOMAIN_DISALLOWED_IO_OUT)
-/// @}
-
-/**
- Values for the XStatePolicy field of #STM_VMCS_DATABASE_REQUEST
- @{
-**/
-#define XSTATE_READWRITE 0x00
-#define XSTATE_READONLY 0x01
-#define XSTATE_SCRUB 0x03
-/// @}
-
-/**
- Values for the AddOrRemove field of #STM_VMCS_DATABASE_REQUEST
- @{
-**/
-#define STM_VMCS_DATABASE_REQUEST_ADD 1
-#define STM_VMCS_DATABASE_REQUEST_REMOVE 0
-/// @}
-
-
-/**
- InitializeProtectionVMCALL() prepares the STM for setup of the initial
- protection profile which is subsequently communicated via one or more
- invocations of ProtectResourceVMCALL(), prior to invoking StartStmVMCALL().
- It is only necessary to invoke InitializeProtectionVMCALL() on one processor
- thread. InitializeProtectionVMCALL() does not alter whether SMIs are masked
- or unmasked. The STM should return back to the MLE with "Blocking by SMI" set
- to 1 in the GUEST_INTERRUPTIBILITY field for the VMCS the STM created for the
- MLE guest.
-
- @param EAX #STM_API_INITIALIZE_PROTECTION (0x00010007)
-
- @retval CF 0
- No error, EAX set to STM_SUCCESS, EBX bits set to indicate STM
- capabilities as defined below. The STM has set up an empty
- protection profile, except for the resources that it sets up to
- protect itself. The STM must not allow the SMI handler to map
- any pages from the MSEG Base to the top of TSEG. The STM must
- also not allow SMI handler access to those MSRs which the STM
- requires for its own protection.
- @retval CF 1
- An error occurred, EAX holds relevant error value.
- @retval EAX #ERROR_STM_ALREADY_STARTED
- The STM is already configured and active. The STM remains active
- and guarding the previously enabled resource list.
- @retval EAX #ERROR_STM_UNPROTECTABLE
- The STM determines that based on the platform configuration, the
- STM is unable to protect itself. For example, the BIOS required
- resource list contains memory pages in MSEG.
- @retval EAX #ERROR_STM_UNSPECIFIED
- An unspecified error occurred.
-
- @note All other registers unmodified.
-**/
-#define STM_API_INITIALIZE_PROTECTION (BIT16 | 7)
-
-/**
- Byte granular support bits returned in EBX from #STM_API_INITIALIZE_PROTECTION
- @{
-**/
-#define STM_RSC_BGI BIT1
-#define STM_RSC_BGM BIT2
-#define STM_RSC_MSR BIT3
-/// @}
-
-
-/**
- The ManageEventLogVMCALL() is invoked by the MLE root to control the logging
- feature. It consists of several sub-functions to facilitate establishment of
- the log itself, configuring what events will be logged, and functions to
- start, stop, and clear the log.
-
- @param EAX #STM_API_MANAGE_EVENT_LOG (0x00010008)
- @param EBX Low 32 bits of physical address of caller allocated
- STM_EVENT_LOG_MANAGEMENT_REQUEST. Bits 11:0 are ignored and
- assumed to be zero, making the buffer 4K aligned.
- @param ECX High 32 bits of physical address of caller allocated
- STM_EVENT_LOG_MANAGEMENT_REQUEST.
-
- @retval CF=0
- No error, EAX set to STM_SUCCESS.
- @retval CF=1
- An error occurred, EAX holds relevant error value. See subfunction
- descriptions below for details.
-
- @note All other registers unmodified.
-**/
-#define STM_API_MANAGE_EVENT_LOG (BIT16 | 8)
-
-///
-/// STM Event Log Management Request for #STM_API_MANAGE_EVENT_LOG VMCALL
-///
-typedef struct {
- UINT32 SubFunctionIndex;
- union {
- struct {
- UINT32 PageCount;
- //
- // number of elements is PageCount
- //
- UINT64 Pages[];
- } LogBuffer;
- //
- // bitmap of EVENT_TYPE
- //
- UINT32 EventEnableBitmap;
- } Data;
-} STM_EVENT_LOG_MANAGEMENT_REQUEST;
-
-/**
- Defines values for the SubFunctionIndex field of
- #STM_EVENT_LOG_MANAGEMENT_REQUEST
- @{
-**/
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_NEW_LOG 1
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_CONFIGURE_LOG 2
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_START_LOG 3
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_STOP_LOG 4
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_CLEAR_LOG 5
-#define STM_EVENT_LOG_MANAGEMENT_REQUEST_DELETE_LOG 6
-/// @}
-
-/**
- Log Entry Header
-**/
-typedef struct {
- UINT32 EventSerialNumber;
- UINT16 Type;
- UINT16 Lock :1;
- UINT16 Valid :1;
- UINT16 ReadByMle :1;
- UINT16 Wrapped :1;
- UINT16 Reserved :12;
-} LOG_ENTRY_HEADER;
-
-/**
- Enum values for the Type field of #LOG_ENTRY_HEADER
-**/
-typedef enum {
- EvtLogStarted,
- EvtLogStopped,
- EvtLogInvalidParameterDetected,
- EvtHandledProtectionException,
- ///
- /// unhandled protection exceptions result in reset & cannot be logged
- ///
- EvtBiosAccessToUnclaimedResource,
- EvtMleResourceProtectionGranted,
- EvtMleResourceProtectionDenied,
- EvtMleResourceUnprotect,
- EvtMleResourceUnprotectError,
- EvtMleDomainTypeDegraded,
- ///
- /// add more here
- ///
- EvtMleMax,
- ///
- /// Not used
- ///
- EvtInvalid = 0xFFFFFFFF,
-} EVENT_TYPE;
-
-typedef struct {
- UINT32 Reserved;
-} ENTRY_EVT_LOG_STARTED;
-
-typedef struct {
- UINT32 Reserved;
-} ENTRY_EVT_LOG_STOPPED;
-
-typedef struct {
- UINT32 VmcallApiNumber;
-} ENTRY_EVT_LOG_INVALID_PARAM;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_MLE_RSC_PROT_GRANTED;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_MLE_RSC_PROT_DENIED;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_MLE_RSC_UNPROT;
-
-typedef struct {
- STM_RSC Resource;
-} ENTRY_EVT_MLE_RSC_UNPROT_ERROR;
-
-typedef struct {
- UINT64 VmcsPhysPointer;
- UINT8 ExpectedDomainType;
- UINT8 DegradedDomainType;
-} ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED;
-
-typedef union {
- ENTRY_EVT_LOG_STARTED Started;
- ENTRY_EVT_LOG_STOPPED Stopped;
- ENTRY_EVT_LOG_INVALID_PARAM InvalidParam;
- ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION HandledProtectionException;
- ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC BiosUnclaimedRsc;
- ENTRY_EVT_MLE_RSC_PROT_GRANTED MleRscProtGranted;
- ENTRY_EVT_MLE_RSC_PROT_DENIED MleRscProtDenied;
- ENTRY_EVT_MLE_RSC_UNPROT MleRscUnprot;
- ENTRY_EVT_MLE_RSC_UNPROT_ERROR MleRscUnprotError;
- ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED MleDomainTypeDegraded;
-} LOG_ENTRY_DATA;
-
-typedef struct {
- LOG_ENTRY_HEADER Hdr;
- LOG_ENTRY_DATA Data;
-} STM_LOG_ENTRY;
-
-/**
- Maximum STM Log Entry Size
-**/
-#define STM_LOG_ENTRY_SIZE 256
-
-
-/**
- STM Protection Exception Stack Frame Structures
-**/
-
-typedef struct {
- UINT32 Rdi;
- UINT32 Rsi;
- UINT32 Rbp;
- UINT32 Rdx;
- UINT32 Rcx;
- UINT32 Rbx;
- UINT32 Rax;
- UINT32 Cr3;
- UINT32 Cr2;
- UINT32 Cr0;
- UINT32 VmcsExitInstructionInfo;
- UINT32 VmcsExitInstructionLength;
- UINT64 VmcsExitQualification;
- ///
- /// An TXT_SMM_PROTECTION_EXCEPTION_TYPE num value
- ///
- UINT32 ErrorCode;
- UINT32 Rip;
- UINT32 Cs;
- UINT32 Rflags;
- UINT32 Rsp;
- UINT32 Ss;
-} STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32;
-
-typedef struct {
- UINT64 R15;
- UINT64 R14;
- UINT64 R13;
- UINT64 R12;
- UINT64 R11;
- UINT64 R10;
- UINT64 R9;
- UINT64 R8;
- UINT64 Rdi;
- UINT64 Rsi;
- UINT64 Rbp;
- UINT64 Rdx;
- UINT64 Rcx;
- UINT64 Rbx;
- UINT64 Rax;
- UINT64 Cr8;
- UINT64 Cr3;
- UINT64 Cr2;
- UINT64 Cr0;
- UINT64 VmcsExitInstructionInfo;
- UINT64 VmcsExitInstructionLength;
- UINT64 VmcsExitQualification;
- ///
- /// An TXT_SMM_PROTECTION_EXCEPTION_TYPE num value
- ///
- UINT64 ErrorCode;
- UINT64 Rip;
- UINT64 Cs;
- UINT64 Rflags;
- UINT64 Rsp;
- UINT64 Ss;
-} STM_PROTECTION_EXCEPTION_STACK_FRAME_X64;
-
-typedef union {
- STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32 *Ia32StackFrame;
- STM_PROTECTION_EXCEPTION_STACK_FRAME_X64 *X64StackFrame;
-} STM_PROTECTION_EXCEPTION_STACK_FRAME;
-
-/**
- Enum values for the ErrorCode field in
- #STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32 and
- #STM_PROTECTION_EXCEPTION_STACK_FRAME_X64
-**/
-typedef enum {
- TxtSmmPageViolation = 1,
- TxtSmmMsrViolation,
- TxtSmmRegisterViolation,
- TxtSmmIoViolation,
- TxtSmmPciViolation
-} TXT_SMM_PROTECTION_EXCEPTION_TYPE;
-
-/**
- TXT Pocessor SMM Descriptor (PSD) structures
-**/
-
-typedef struct {
- UINT64 SpeRip;
- UINT64 SpeRsp;
- UINT16 SpeSs;
- UINT16 PageViolationException:1;
- UINT16 MsrViolationException:1;
- UINT16 RegisterViolationException:1;
- UINT16 IoViolationException:1;
- UINT16 PciViolationException:1;
- UINT16 Reserved1:11;
- UINT32 Reserved2;
-} STM_PROTECTION_EXCEPTION_HANDLER;
-
-typedef struct {
- UINT8 ExecutionDisableOutsideSmrr:1;
- UINT8 Intel64Mode:1;
- UINT8 Cr4Pae : 1;
- UINT8 Cr4Pse : 1;
- UINT8 Reserved1 : 4;
-} STM_SMM_ENTRY_STATE;
-
-typedef struct {
- UINT8 SmramToVmcsRestoreRequired : 1; ///> BIOS restore hint
- UINT8 ReinitializeVmcsRequired : 1; ///> BIOS request
- UINT8 Reserved2 : 6;
-} STM_SMM_RESUME_STATE;
-
-typedef struct {
- UINT8 DomainType : 4; ///> STM input to BIOS on each SMI
- UINT8 XStatePolicy : 2; ///> STM input to BIOS on each SMI
- UINT8 EptEnabled : 1;
- UINT8 Reserved3 : 1;
-} STM_SMM_STATE;
-
-#define TXT_SMM_PSD_OFFSET 0xfb00
-#define TXT_PROCESSOR_SMM_DESCRIPTOR_SIGNATURE SIGNATURE_64('T', 'X', 'T', 'P', 'S', 'S', 'I', 'G')
-#define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MAJOR 1
-#define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MINOR 0
-
-typedef struct {
- UINT64 Signature;
- UINT16 Size;
- UINT8 SmmDescriptorVerMajor;
- UINT8 SmmDescriptorVerMinor;
- UINT32 LocalApicId;
- STM_SMM_ENTRY_STATE SmmEntryState;
- STM_SMM_RESUME_STATE SmmResumeState;
- STM_SMM_STATE StmSmmState;
- UINT8 Reserved4;
- UINT16 SmmCs;
- UINT16 SmmDs;
- UINT16 SmmSs;
- UINT16 SmmOtherSegment;
- UINT16 SmmTr;
- UINT16 Reserved5;
- UINT64 SmmCr3;
- UINT64 SmmStmSetupRip;
- UINT64 SmmStmTeardownRip;
- UINT64 SmmSmiHandlerRip;
- UINT64 SmmSmiHandlerRsp;
- UINT64 SmmGdtPtr;
- UINT32 SmmGdtSize;
- UINT32 RequiredStmSmmRevId;
- STM_PROTECTION_EXCEPTION_HANDLER StmProtectionExceptionHandler;
- UINT64 Reserved6;
- UINT64 BiosHwResourceRequirementsPtr;
- // extend area
- UINT64 AcpiRsdp;
- UINT8 PhysicalAddressBits;
-} TXT_PROCESSOR_SMM_DESCRIPTOR;
-
-#pragma pack ()
+#include <Register/Intel/StmApi.h>

#endif
--
2.21.0.windows.1

[Patch v6 7/9] MdeModulePkg/DxeIpl: Create 5-level page table for long mode

Dong, Eric
 

From: "Ni, Ray" <ray.ni@...>

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2008

DxeIpl is responsible to create page table for DXE phase running
either in long mode or in 32bit mode with certain protection
mechanism enabled (refer to ToBuildPageTable()).

The patch updates DxeIpl to create 5-level page table for DXE phase
running in long mode when PcdUse5LevelPageTable is TRUE and CPU
supports 5-level page table.

Signed-off-by: Ray Ni <ray.ni@...>
Reviewed-by: Eric Dong <eric.dong@...>
Regression-tested-by: Laszlo Ersek <lersek@...>
Reviewed-by: Hao A Wu <hao.a.wu@...>
---
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 1 +
.../Core/DxeIplPeim/X64/VirtualMemory.c | 229 ++++++++++++------
2 files changed, 153 insertions(+), 77 deletions(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
index abc3217b01..98bc17fc9d 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
@@ -110,6 +110,7 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable ## SOMETIMES_CONSUMES

[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
index edc38e4525..b40b7e0c98 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
@@ -15,13 +15,14 @@
2) IA-32 Intel(R) Architecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel
3) IA-32 Intel(R) Architecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel

-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

+#include <Register/Intel/Cpuid.h>
#include "DxeIpl.h"
#include "VirtualMemory.h"

@@ -626,14 +627,18 @@ CreateIdentityMappingPageTables (
)
{
UINT32 RegEax;
+ CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX EcxFlags;
UINT32 RegEdx;
UINT8 PhysicalAddressBits;
EFI_PHYSICAL_ADDRESS PageAddress;
+ UINTN IndexOfPml5Entries;
UINTN IndexOfPml4Entries;
UINTN IndexOfPdpEntries;
UINTN IndexOfPageDirectoryEntries;
+ UINT32 NumberOfPml5EntriesNeeded;
UINT32 NumberOfPml4EntriesNeeded;
UINT32 NumberOfPdpEntriesNeeded;
+ PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel5Entry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageMap;
PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry;
@@ -641,9 +646,11 @@ CreateIdentityMappingPageTables (
UINTN TotalPagesNum;
UINTN BigPageAddress;
VOID *Hob;
+ BOOLEAN Page5LevelSupport;
BOOLEAN Page1GSupport;
PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;
UINT64 AddressEncMask;
+ IA32_CR4 Cr4;

//
// Make sure AddressEncMask is contained to smallest supported address field
@@ -677,33 +684,68 @@ CreateIdentityMappingPageTables (
}
}

+ Page5LevelSupport = FALSE;
+ if (PcdGetBool (PcdUse5LevelPageTable)) {
+ AsmCpuidEx (
+ CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO, NULL,
+ &EcxFlags.Uint32, NULL, NULL
+ );
+ if (EcxFlags.Bits.FiveLevelPage != 0) {
+ Page5LevelSupport = TRUE;
+ }
+ }
+
+ DEBUG ((DEBUG_INFO, "AddressBits=%u 5LevelPaging=%u 1GPage=%u\n", PhysicalAddressBits, Page5LevelSupport, Page1GSupport));
+
//
- // IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses.
+ // IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses
+ // when 5-Level Paging is disabled,
+ // due to either unsupported by HW, or disabled by PCD.
//
ASSERT (PhysicalAddressBits <= 52);
- if (PhysicalAddressBits > 48) {
+ if (!Page5LevelSupport && PhysicalAddressBits > 48) {
PhysicalAddressBits = 48;
}

//
// Calculate the table entries needed.
//
- if (PhysicalAddressBits <= 39 ) {
- NumberOfPml4EntriesNeeded = 1;
- NumberOfPdpEntriesNeeded = (UINT32)LShiftU64 (1, (PhysicalAddressBits - 30));
- } else {
- NumberOfPml4EntriesNeeded = (UINT32)LShiftU64 (1, (PhysicalAddressBits - 39));
- NumberOfPdpEntriesNeeded = 512;
+ NumberOfPml5EntriesNeeded = 1;
+ if (PhysicalAddressBits > 48) {
+ NumberOfPml5EntriesNeeded = (UINT32) LShiftU64 (1, PhysicalAddressBits - 48);
+ PhysicalAddressBits = 48;
+ }
+
+ NumberOfPml4EntriesNeeded = 1;
+ if (PhysicalAddressBits > 39) {
+ NumberOfPml4EntriesNeeded = (UINT32) LShiftU64 (1, PhysicalAddressBits - 39);
+ PhysicalAddressBits = 39;
}

+ NumberOfPdpEntriesNeeded = 1;
+ ASSERT (PhysicalAddressBits > 30);
+ NumberOfPdpEntriesNeeded = (UINT32) LShiftU64 (1, PhysicalAddressBits - 30);
+
//
// Pre-allocate big pages to avoid later allocations.
//
if (!Page1GSupport) {
- TotalPagesNum = (NumberOfPdpEntriesNeeded + 1) * NumberOfPml4EntriesNeeded + 1;
+ TotalPagesNum = ((NumberOfPdpEntriesNeeded + 1) * NumberOfPml4EntriesNeeded + 1) * NumberOfPml5EntriesNeeded + 1;
} else {
- TotalPagesNum = NumberOfPml4EntriesNeeded + 1;
+ TotalPagesNum = (NumberOfPml4EntriesNeeded + 1) * NumberOfPml5EntriesNeeded + 1;
+ }
+
+ //
+ // Substract the one page occupied by PML5 entries if 5-Level Paging is disabled.
+ //
+ if (!Page5LevelSupport) {
+ TotalPagesNum--;
}
+
+ DEBUG ((DEBUG_INFO, "Pml5=%u Pml4=%u Pdp=%u TotalPage=%Lu\n",
+ NumberOfPml5EntriesNeeded, NumberOfPml4EntriesNeeded,
+ NumberOfPdpEntriesNeeded, (UINT64)TotalPagesNum));
+
BigPageAddress = (UINTN) AllocatePageTableMemory (TotalPagesNum);
ASSERT (BigPageAddress != 0);

@@ -711,92 +753,125 @@ CreateIdentityMappingPageTables (
// By architecture only one PageMapLevel4 exists - so lets allocate storage for it.
//
PageMap = (VOID *) BigPageAddress;
- BigPageAddress += SIZE_4KB;
-
- PageMapLevel4Entry = PageMap;
- PageAddress = 0;
- for (IndexOfPml4Entries = 0; IndexOfPml4Entries < NumberOfPml4EntriesNeeded; IndexOfPml4Entries++, PageMapLevel4Entry++) {
+ if (Page5LevelSupport) {
//
- // Each PML4 entry points to a page of Page Directory Pointer entires.
- // So lets allocate space for them and fill them in in the IndexOfPdpEntries loop.
+ // By architecture only one PageMapLevel5 exists - so lets allocate storage for it.
//
- PageDirectoryPointerEntry = (VOID *) BigPageAddress;
- BigPageAddress += SIZE_4KB;
+ PageMapLevel5Entry = PageMap;
+ BigPageAddress += SIZE_4KB;
+ }
+ PageAddress = 0;

+ for ( IndexOfPml5Entries = 0
+ ; IndexOfPml5Entries < NumberOfPml5EntriesNeeded
+ ; IndexOfPml5Entries++, PageMapLevel5Entry++) {
//
- // Make a PML4 Entry
+ // Each PML5 entry points to a page of PML4 entires.
+ // So lets allocate space for them and fill them in in the IndexOfPml4Entries loop.
+ // When 5-Level Paging is disabled, below allocation happens only once.
//
- PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry | AddressEncMask;
- PageMapLevel4Entry->Bits.ReadWrite = 1;
- PageMapLevel4Entry->Bits.Present = 1;
+ PageMapLevel4Entry = (VOID *) BigPageAddress;
+ BigPageAddress += SIZE_4KB;

- if (Page1GSupport) {
- PageDirectory1GEntry = (VOID *) PageDirectoryPointerEntry;
+ if (Page5LevelSupport) {
+ //
+ // Make a PML5 Entry
+ //
+ PageMapLevel5Entry->Uint64 = (UINT64) (UINTN) PageMapLevel4Entry | AddressEncMask;
+ PageMapLevel5Entry->Bits.ReadWrite = 1;
+ PageMapLevel5Entry->Bits.Present = 1;
+ }

- for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectory1GEntry++, PageAddress += SIZE_1GB) {
- if (ToSplitPageTable (PageAddress, SIZE_1GB, StackBase, StackSize)) {
- Split1GPageTo2M (PageAddress, (UINT64 *) PageDirectory1GEntry, StackBase, StackSize);
- } else {
- //
- // Fill in the Page Directory entries
- //
- PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;
- PageDirectory1GEntry->Bits.ReadWrite = 1;
- PageDirectory1GEntry->Bits.Present = 1;
- PageDirectory1GEntry->Bits.MustBe1 = 1;
- }
- }
- } else {
- for (IndexOfPdpEntries = 0; IndexOfPdpEntries < NumberOfPdpEntriesNeeded; IndexOfPdpEntries++, PageDirectoryPointerEntry++) {
- //
- // Each Directory Pointer entries points to a page of Page Directory entires.
- // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop.
- //
- PageDirectoryEntry = (VOID *) BigPageAddress;
- BigPageAddress += SIZE_4KB;
+ for ( IndexOfPml4Entries = 0
+ ; IndexOfPml4Entries < (NumberOfPml5EntriesNeeded == 1 ? NumberOfPml4EntriesNeeded : 512)
+ ; IndexOfPml4Entries++, PageMapLevel4Entry++) {
+ //
+ // Each PML4 entry points to a page of Page Directory Pointer entires.
+ // So lets allocate space for them and fill them in in the IndexOfPdpEntries loop.
+ //
+ PageDirectoryPointerEntry = (VOID *) BigPageAddress;
+ BigPageAddress += SIZE_4KB;

- //
- // Fill in a Page Directory Pointer Entries
- //
- PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | AddressEncMask;
- PageDirectoryPointerEntry->Bits.ReadWrite = 1;
- PageDirectoryPointerEntry->Bits.Present = 1;
+ //
+ // Make a PML4 Entry
+ //
+ PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry | AddressEncMask;
+ PageMapLevel4Entry->Bits.ReadWrite = 1;
+ PageMapLevel4Entry->Bits.Present = 1;

- for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PageAddress += SIZE_2MB) {
- if (ToSplitPageTable (PageAddress, SIZE_2MB, StackBase, StackSize)) {
- //
- // Need to split this 2M page that covers NULL or stack range.
- //
- Split2MPageTo4K (PageAddress, (UINT64 *) PageDirectoryEntry, StackBase, StackSize);
+ if (Page1GSupport) {
+ PageDirectory1GEntry = (VOID *) PageDirectoryPointerEntry;
+
+ for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectory1GEntry++, PageAddress += SIZE_1GB) {
+ if (ToSplitPageTable (PageAddress, SIZE_1GB, StackBase, StackSize)) {
+ Split1GPageTo2M (PageAddress, (UINT64 *) PageDirectory1GEntry, StackBase, StackSize);
} else {
//
// Fill in the Page Directory entries
//
- PageDirectoryEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;
- PageDirectoryEntry->Bits.ReadWrite = 1;
- PageDirectoryEntry->Bits.Present = 1;
- PageDirectoryEntry->Bits.MustBe1 = 1;
+ PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;
+ PageDirectory1GEntry->Bits.ReadWrite = 1;
+ PageDirectory1GEntry->Bits.Present = 1;
+ PageDirectory1GEntry->Bits.MustBe1 = 1;
}
}
- }
+ } else {
+ for ( IndexOfPdpEntries = 0
+ ; IndexOfPdpEntries < (NumberOfPml4EntriesNeeded == 1 ? NumberOfPdpEntriesNeeded : 512)
+ ; IndexOfPdpEntries++, PageDirectoryPointerEntry++) {
+ //
+ // Each Directory Pointer entries points to a page of Page Directory entires.
+ // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop.
+ //
+ PageDirectoryEntry = (VOID *) BigPageAddress;
+ BigPageAddress += SIZE_4KB;

- for (; IndexOfPdpEntries < 512; IndexOfPdpEntries++, PageDirectoryPointerEntry++) {
- ZeroMem (
- PageDirectoryPointerEntry,
- sizeof(PAGE_MAP_AND_DIRECTORY_POINTER)
- );
+ //
+ // Fill in a Page Directory Pointer Entries
+ //
+ PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | AddressEncMask;
+ PageDirectoryPointerEntry->Bits.ReadWrite = 1;
+ PageDirectoryPointerEntry->Bits.Present = 1;
+
+ for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PageAddress += SIZE_2MB) {
+ if (ToSplitPageTable (PageAddress, SIZE_2MB, StackBase, StackSize)) {
+ //
+ // Need to split this 2M page that covers NULL or stack range.
+ //
+ Split2MPageTo4K (PageAddress, (UINT64 *) PageDirectoryEntry, StackBase, StackSize);
+ } else {
+ //
+ // Fill in the Page Directory entries
+ //
+ PageDirectoryEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;
+ PageDirectoryEntry->Bits.ReadWrite = 1;
+ PageDirectoryEntry->Bits.Present = 1;
+ PageDirectoryEntry->Bits.MustBe1 = 1;
+ }
+ }
+ }
+
+ //
+ // Fill with null entry for unused PDPTE
+ //
+ ZeroMem (PageDirectoryPointerEntry, (512 - IndexOfPdpEntries) * sizeof(PAGE_MAP_AND_DIRECTORY_POINTER));
}
}
+
+ //
+ // For the PML4 entries we are not using fill in a null entry.
+ //
+ ZeroMem (PageMapLevel4Entry, (512 - IndexOfPml4Entries) * sizeof (PAGE_MAP_AND_DIRECTORY_POINTER));
}

- //
- // For the PML4 entries we are not using fill in a null entry.
- //
- for (; IndexOfPml4Entries < 512; IndexOfPml4Entries++, PageMapLevel4Entry++) {
- ZeroMem (
- PageMapLevel4Entry,
- sizeof (PAGE_MAP_AND_DIRECTORY_POINTER)
- );
+ if (Page5LevelSupport) {
+ Cr4.UintN = AsmReadCr4 ();
+ Cr4.Bits.LA57 = 1;
+ AsmWriteCr4 (Cr4.UintN);
+ //
+ // For the PML5 entries we are not using fill in a null entry.
+ //
+ ZeroMem (PageMapLevel5Entry, (512 - IndexOfPml5Entries) * sizeof (PAGE_MAP_AND_DIRECTORY_POINTER));
}

//
--
2.21.0.windows.1