From 919b530b059261b4eeba3af0d1372f618aaba50d Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Fri, 4 Jun 2021 15:50:25 -0700 Subject: [PATCH] cleaned the code and added submodules to dark style and ia32-doc... --- .gitmodules | 6 + dependencies/DarkStyle | 1 + dependencies/ia32-doc | 1 + {src => resources}/icon.ico | Bin {src => resources}/icon.rc | 0 {src => resources}/qvminspector.qrc | 0 {src => resources}/qvminspector.ui | 0 src/DarkStyle/.gitignore | 40 - src/DarkStyle/DarkStyle.cpp | 73 - src/DarkStyle/DarkStyle.h | 39 - src/DarkStyle/README.md | 104 - src/DarkStyle/darkstyle.qrc | 28 - src/DarkStyle/darkstyle/darkstyle.qss | 343 - .../darkstyle/icon_branch_closed.png | Bin 310 -> 0 bytes src/DarkStyle/darkstyle/icon_branch_end.png | Bin 358 -> 0 bytes src/DarkStyle/darkstyle/icon_branch_more.png | Bin 207 -> 0 bytes src/DarkStyle/darkstyle/icon_branch_open.png | Bin 313 -> 0 bytes .../darkstyle/icon_checkbox_checked.png | Bin 176 -> 0 bytes .../icon_checkbox_checked_disabled.png | Bin 373 -> 0 bytes .../icon_checkbox_checked_pressed.png | Bin 373 -> 0 bytes .../darkstyle/icon_checkbox_indeterminate.png | Bin 121 -> 0 bytes .../icon_checkbox_indeterminate_disabled.png | Bin 286 -> 0 bytes .../icon_checkbox_indeterminate_pressed.png | Bin 286 -> 0 bytes .../darkstyle/icon_checkbox_unchecked.png | Bin 119 -> 0 bytes .../icon_checkbox_unchecked_disabled.png | Bin 238 -> 0 bytes .../icon_checkbox_unchecked_pressed.png | Bin 238 -> 0 bytes src/DarkStyle/darkstyle/icon_close.png | Bin 422 -> 0 bytes .../darkstyle/icon_radiobutton_checked.png | Bin 370 -> 0 bytes .../icon_radiobutton_checked_disabled.png | Bin 617 -> 0 bytes .../icon_radiobutton_checked_pressed.png | Bin 616 -> 0 bytes .../darkstyle/icon_radiobutton_unchecked.png | Bin 310 -> 0 bytes .../icon_radiobutton_unchecked_disabled.png | Bin 538 -> 0 bytes .../icon_radiobutton_unchecked_pressed.png | Bin 537 -> 0 bytes src/DarkStyle/darkstyle/icon_restore.png | Bin 404 -> 0 bytes src/DarkStyle/darkstyle/icon_undock.png | Bin 424 -> 0 bytes src/DarkStyle/darkstyle/icon_vline.png | Bin 303 -> 0 bytes src/DarkStyle/frameless_window_dark.pro | 38 - src/DarkStyle/framelesswindow.qrc | 8 - .../framelesswindow/framelesswindow.cpp | 458 - .../framelesswindow/framelesswindow.h | 69 - .../framelesswindow/framelesswindow.ui | 304 - .../framelesswindow/windowdragger.cpp | 56 - src/DarkStyle/framelesswindow/windowdragger.h | 43 - src/DarkStyle/images/icon_window_close.png | Bin 422 -> 0 bytes src/DarkStyle/images/icon_window_maximize.png | Bin 386 -> 0 bytes src/DarkStyle/images/icon_window_minimize.png | Bin 364 -> 0 bytes src/DarkStyle/images/icon_window_restore.png | Bin 404 -> 0 bytes src/DarkStyle/main.cpp | 40 - src/DarkStyle/mainwindow.cpp | 23 - src/DarkStyle/mainwindow.h | 34 - src/DarkStyle/mainwindow.ui | 645 - ...rameless_window_qt_dark_style_disabled.png | Bin 118538 -> 0 bytes ...frameless_window_qt_dark_style_enabled.png | Bin 131322 -> 0 bytes ...frameless_window_qt_dark_style_enabled.png | Bin 22520 -> 0 bytes src/ia32.hpp | 21526 ---------------- src/vmprofiler-qt.vcxproj | 198 - src/vmprofiler-qt.vcxproj.filters | 267 - vmprofiler-qt.sln | 179 +- vmprofiler-qt.vcxproj | 163 + vmprofiler-qt.vcxproj.filters | 102 + 60 files changed, 284 insertions(+), 24504 deletions(-) create mode 160000 dependencies/DarkStyle create mode 160000 dependencies/ia32-doc rename {src => resources}/icon.ico (100%) rename {src => resources}/icon.rc (100%) rename {src => resources}/qvminspector.qrc (100%) rename {src => resources}/qvminspector.ui (100%) delete mode 100644 src/DarkStyle/.gitignore delete mode 100644 src/DarkStyle/DarkStyle.cpp delete mode 100644 src/DarkStyle/DarkStyle.h delete mode 100644 src/DarkStyle/README.md delete mode 100644 src/DarkStyle/darkstyle.qrc delete mode 100644 src/DarkStyle/darkstyle/darkstyle.qss delete mode 100644 src/DarkStyle/darkstyle/icon_branch_closed.png delete mode 100644 src/DarkStyle/darkstyle/icon_branch_end.png delete mode 100644 src/DarkStyle/darkstyle/icon_branch_more.png delete mode 100644 src/DarkStyle/darkstyle/icon_branch_open.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_checked.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_checked_disabled.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_checked_pressed.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_indeterminate.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_indeterminate_disabled.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_indeterminate_pressed.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_unchecked.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_unchecked_disabled.png delete mode 100644 src/DarkStyle/darkstyle/icon_checkbox_unchecked_pressed.png delete mode 100644 src/DarkStyle/darkstyle/icon_close.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_checked.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_checked_disabled.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_checked_pressed.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_unchecked.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_unchecked_disabled.png delete mode 100644 src/DarkStyle/darkstyle/icon_radiobutton_unchecked_pressed.png delete mode 100644 src/DarkStyle/darkstyle/icon_restore.png delete mode 100644 src/DarkStyle/darkstyle/icon_undock.png delete mode 100644 src/DarkStyle/darkstyle/icon_vline.png delete mode 100644 src/DarkStyle/frameless_window_dark.pro delete mode 100644 src/DarkStyle/framelesswindow.qrc delete mode 100644 src/DarkStyle/framelesswindow/framelesswindow.cpp delete mode 100644 src/DarkStyle/framelesswindow/framelesswindow.h delete mode 100644 src/DarkStyle/framelesswindow/framelesswindow.ui delete mode 100644 src/DarkStyle/framelesswindow/windowdragger.cpp delete mode 100644 src/DarkStyle/framelesswindow/windowdragger.h delete mode 100644 src/DarkStyle/images/icon_window_close.png delete mode 100644 src/DarkStyle/images/icon_window_maximize.png delete mode 100644 src/DarkStyle/images/icon_window_minimize.png delete mode 100644 src/DarkStyle/images/icon_window_restore.png delete mode 100644 src/DarkStyle/main.cpp delete mode 100644 src/DarkStyle/mainwindow.cpp delete mode 100644 src/DarkStyle/mainwindow.h delete mode 100644 src/DarkStyle/mainwindow.ui delete mode 100644 src/DarkStyle/screenshot_mac_frameless_window_qt_dark_style_disabled.png delete mode 100644 src/DarkStyle/screenshot_mac_frameless_window_qt_dark_style_enabled.png delete mode 100644 src/DarkStyle/screenshot_win7_frameless_window_qt_dark_style_enabled.png delete mode 100644 src/ia32.hpp delete mode 100644 src/vmprofiler-qt.vcxproj delete mode 100644 src/vmprofiler-qt.vcxproj.filters create mode 100644 vmprofiler-qt.vcxproj create mode 100644 vmprofiler-qt.vcxproj.filters diff --git a/.gitmodules b/.gitmodules index 013d5e9..f20fc3b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,9 @@ [submodule "dependencies/vmprofiler"] path = dependencies/vmprofiler url = https://githacks.org/vmp2/vmprofiler.git +[submodule "dependencies/DarkStyle"] + path = dependencies/DarkStyle + url = https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle.git +[submodule "dependencies/ia32-doc"] + path = dependencies/ia32-doc + url = https://github.com/wbenny/ia32-doc.git diff --git a/dependencies/DarkStyle b/dependencies/DarkStyle new file mode 160000 index 0000000..79425f5 --- /dev/null +++ b/dependencies/DarkStyle @@ -0,0 +1 @@ +Subproject commit 79425f53ef154ea33faf4e2964f5762645b54d91 diff --git a/dependencies/ia32-doc b/dependencies/ia32-doc new file mode 160000 index 0000000..77e021b --- /dev/null +++ b/dependencies/ia32-doc @@ -0,0 +1 @@ +Subproject commit 77e021b690633e6274f4ebfc3734fdbd0be3bdf7 diff --git a/src/icon.ico b/resources/icon.ico similarity index 100% rename from src/icon.ico rename to resources/icon.ico diff --git a/src/icon.rc b/resources/icon.rc similarity index 100% rename from src/icon.rc rename to resources/icon.rc diff --git a/src/qvminspector.qrc b/resources/qvminspector.qrc similarity index 100% rename from src/qvminspector.qrc rename to resources/qvminspector.qrc diff --git a/src/qvminspector.ui b/resources/qvminspector.ui similarity index 100% rename from src/qvminspector.ui rename to resources/qvminspector.ui diff --git a/src/DarkStyle/.gitignore b/src/DarkStyle/.gitignore deleted file mode 100644 index 8e83ba7..0000000 --- a/src/DarkStyle/.gitignore +++ /dev/null @@ -1,40 +0,0 @@ -# C++ objects and libs - -*.slo -*.lo -*.o -*.a -*.la -*.lai -*.so -*.dll -*.dylib - -# Qt-es - -/.qmake.cache -/.qmake.stash -*.pro.user -*.pro.user.* -*.qbs.user -*.qbs.user.* -*.moc -moc_*.cpp -moc_*.h -qrc_*.cpp -ui_*.h -Makefile* -*build-* - -# QtCreator - -*.autosave - -# QtCtreator Qml -*.qmlproject.user -*.qmlproject.user.* - -# QtCtreator CMake -CMakeLists.txt.user* - -.directory diff --git a/src/DarkStyle/DarkStyle.cpp b/src/DarkStyle/DarkStyle.cpp deleted file mode 100644 index 8b31bf7..0000000 --- a/src/DarkStyle/DarkStyle.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#include "DarkStyle.h" - -DarkStyle::DarkStyle() : DarkStyle(styleBase()) {} - -DarkStyle::DarkStyle(QStyle *style) : QProxyStyle(style) {} - -QStyle *DarkStyle::styleBase(QStyle *style) const { - static QStyle *base = - !style ? QStyleFactory::create(QStringLiteral("Fusion")) : style; - return base; -} - -QStyle *DarkStyle::baseStyle() const { return styleBase(); } - -void DarkStyle::polish(QPalette &palette) { - // modify palette to dark - palette.setColor(QPalette::Window, QColor(53, 53, 53)); - palette.setColor(QPalette::WindowText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::WindowText, - QColor(127, 127, 127)); - palette.setColor(QPalette::Base, QColor(42, 42, 42)); - palette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); - palette.setColor(QPalette::ToolTipBase, Qt::white); - palette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); - palette.setColor(QPalette::Text, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); - palette.setColor(QPalette::Dark, QColor(35, 35, 35)); - palette.setColor(QPalette::Shadow, QColor(20, 20, 20)); - palette.setColor(QPalette::Button, QColor(53, 53, 53)); - palette.setColor(QPalette::ButtonText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::ButtonText, - QColor(127, 127, 127)); - palette.setColor(QPalette::BrightText, Qt::red); - palette.setColor(QPalette::Link, QColor(42, 130, 218)); - palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); - palette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); - palette.setColor(QPalette::HighlightedText, Qt::white); - palette.setColor(QPalette::Disabled, QPalette::HighlightedText, - QColor(127, 127, 127)); -} - -void DarkStyle::polish(QApplication *app) { - if (!app) return; - - // increase font size for better reading, - // setPointSize was reduced from +2 because when applied this way in Qt5, the - // font is larger than intended for some reason - QFont defaultFont = QApplication::font(); - defaultFont.setPointSize(defaultFont.pointSize() + 1); - app->setFont(defaultFont); - - // loadstylesheet - QFile qfDarkstyle(QStringLiteral(":/darkstyle/darkstyle.qss")); - if (qfDarkstyle.open(QIODevice::ReadOnly | QIODevice::Text)) { - // set stylesheet - QString qsStylesheet = QString::fromLatin1(qfDarkstyle.readAll()); - app->setStyleSheet(qsStylesheet); - qfDarkstyle.close(); - } -} diff --git a/src/DarkStyle/DarkStyle.h b/src/DarkStyle/DarkStyle.h deleted file mode 100644 index 16187d0..0000000 --- a/src/DarkStyle/DarkStyle.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#ifndef DARKSTYLE_HPP -#define DARKSTYLE_HPP - -#include -#include -#include -#include -#include - -class DarkStyle : public QProxyStyle { - Q_OBJECT - - public: - DarkStyle(); - explicit DarkStyle(QStyle *style); - - QStyle *baseStyle() const; - - void polish(QPalette &palette) override; - void polish(QApplication *app) override; - - private: - QStyle *styleBase(QStyle *style = Q_NULLPTR) const; -}; - -#endif // DARKSTYLE_HPP diff --git a/src/DarkStyle/README.md b/src/DarkStyle/README.md deleted file mode 100644 index 6813e85..0000000 --- a/src/DarkStyle/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# Qt Frameless Window with DarkStyle -simple MainWindow class implementation with frameless window and custom dark style. - -It adds also support for titlebar and buttons (minimize, maximize, close) - -Look is based on the VS2013 application window (flat and frameless window) - - - - - - - - -
Screenshots
mac enabledmac disabled
- - -## Qt and OS -* tested with Qt5.5.0, Qt5.9.0 and Qt5.10.0 -* tested on Windows 7, Windows 10,MacOSX 10.12.5 and MacOS 10.13.2 - -## PyQt5 -Here is an [unofficial Python port](https://github.com/gmarull/qtmodern) of my implementation. - -## How to use -* add additional include plath to **framelesswindow** -* add resources **framelesswindow.qrc** and **darkstyle.qrc** -* add ``#include "framelesswindow.h"`` into **main.cpp**, create window ``FramelessWindow framelessWindow;`` and assign your mainwindow object as content ``framelessWindow.setContent(mainWindow);`` and show it ``framelessWindow.show();`` -* add ``#include "DarkStyle.h"`` into **main.cpp** and call ``a.setStyle(new DarkStyle);`` - - -```qt -#include -#include "DarkStyle.h" -#include "framelesswindow.h" -#include "mainwindow.h" - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - - // style our application with custom dark style - QApplication::setStyle(new DarkStyle); - //QApplication::setPalette(QApplication::style()->standardPalette()); - - // create frameless window (and set windowState or title) - FramelessWindow framelessWindow; - //framelessWindow.setWindowState(Qt::WindowMaximized); - //framelessWindow.setWindowTitle("test title"); - //framelessWindow.setWindowIcon(a.style()->standardIcon(QStyle::SP_DesktopIcon)); - - // create our mainwindow instance - MainWindow *mainWindow = new MainWindow; - - // add the mainwindow to our custom frameless window - framelessWindow.setContent(mainWindow); - framelessWindow.show(); - - return a.exec(); -} -``` - - -## features -* frameless window -* custom dark style (based on **Fusion style** with dark palette and custom stylesheets) -* title bar -* buttons (minimize | restore | maximize | close) -* move window by drag the title bar -* dobule click title bar to toggle between window styte (maximize and normal) -* use of native events, like minimizing or system menu - - -## todo -* [ ] [resize window on each corner [#1]](https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/issues/1) (some work done by [notecola](https://github.com/notecola) :+1:) -* [ ] [snap on screen edges [#3]](https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle/issues/3) - - -## thanks -Many thanks goes to the [Qt Forum](https://forum.qt.io/topic/80654/how-to-create-vs2013-like-frameless-window-with-dark-style) and especially to [Chris Kawa](https://forum.qt.io/user/chris-kawa) for pointing me to some usual issues and hints of great must have features. - - -## Licence -> The MIT License -> -> Copyright (c) 2018, Juergen Skrotzky (https://github.com/Jorgen-VikingGod, JorgenVikingGod@gmail.com) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/src/DarkStyle/darkstyle.qrc b/src/DarkStyle/darkstyle.qrc deleted file mode 100644 index 1bcbdf7..0000000 --- a/src/DarkStyle/darkstyle.qrc +++ /dev/null @@ -1,28 +0,0 @@ - - - darkstyle/darkstyle.qss - darkstyle/icon_close.png - darkstyle/icon_restore.png - darkstyle/icon_undock.png - darkstyle/icon_branch_closed.png - darkstyle/icon_branch_end.png - darkstyle/icon_branch_more.png - darkstyle/icon_branch_open.png - darkstyle/icon_vline.png - darkstyle/icon_checkbox_checked.png - darkstyle/icon_checkbox_indeterminate.png - darkstyle/icon_checkbox_unchecked.png - darkstyle/icon_checkbox_checked_pressed.png - darkstyle/icon_checkbox_indeterminate_pressed.png - darkstyle/icon_checkbox_unchecked_pressed.png - darkstyle/icon_checkbox_checked_disabled.png - darkstyle/icon_checkbox_indeterminate_disabled.png - darkstyle/icon_checkbox_unchecked_disabled.png - darkstyle/icon_radiobutton_checked.png - darkstyle/icon_radiobutton_unchecked.png - darkstyle/icon_radiobutton_checked_pressed.png - darkstyle/icon_radiobutton_unchecked_pressed.png - darkstyle/icon_radiobutton_checked_disabled.png - darkstyle/icon_radiobutton_unchecked_disabled.png - - diff --git a/src/DarkStyle/darkstyle/darkstyle.qss b/src/DarkStyle/darkstyle/darkstyle.qss deleted file mode 100644 index 44e5c68..0000000 --- a/src/DarkStyle/darkstyle/darkstyle.qss +++ /dev/null @@ -1,343 +0,0 @@ -QToolTip{ - color:#ffffff; - background-color:palette(base); - border:1px solid palette(highlight); - border-radius:4px; -} -QStatusBar{ - background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - color:palette(mid); -} -QMenuBar{ - background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-bottom:2px solid rgba(25,25,25,75); -} -QMenuBar::item{ - spacing:2px; - padding:3px 4px; - background:transparent; -} -QMenuBar::item:selected{ - background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(106,106,106,255),stop:1 rgba(106,106,106,75)); - border-left:1px solid rgba(106,106,106,127); - border-right:1px solid rgba(106,106,106,127); -} -QMenuBar::item:pressed{ - background-color:palette(highlight); - border-left:1px solid rgba(25,25,25,127); - border-right:1px solid rgba(25,25,25,127); -} -QMenu{ - background-color:palette(window); - border:1px solid palette(shadow); -} -QMenu::item{ - padding:3px 25px 3px 25px; - border:1px solid transparent; -} -QMenu::item:disabled{ - background-color:rgba(35,35,35,127); - color:palette(disabled); -} -QMenu::item:selected{ - border-color:rgba(147,191,236,127); - background:palette(highlight); -} -QMenu::icon:checked{ - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border:1px solid palette(highlight); - border-radius:2px; -} -QMenu::separator{ - height:1px; - background:palette(alternate-base); - margin-left:5px; - margin-right:5px; -} -QMenu::indicator{ - width:18px; - height:18px; -} -QMenu::indicator:non-exclusive:checked{ - image:url(:/darkstyle/icon_checkbox_checked.png); - padding-left:2px; -} -QMenu::indicator:non-exclusive:unchecked{ - image:url(:/darkstyle/icon_checkbox_unchecked.png); - padding-left:2px; -} -QMenu::indicator:exclusive:checked{ - image:url(:/darkstyle/icon_radiobutton_checked.png); - padding-left:2px; -} -QMenu::indicator:exclusive:unchecked{ - image:url(:/darkstyle/icon_radiobutton_unchecked.png); - padding-left:2px; -} -QToolBar::top{ - background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-bottom:3px solid qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); -} -QToolBar::bottom{ - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-top:3px solid qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); -} -QToolBar::left{ - background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-right:3px solid qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); -} -QToolBar::right{ - background-color:qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-left:3px solid qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); -} -QMainWindow::separator{ - width:6px; - height:5px; - padding:2px; -} -QSplitter::handle:horizontal{ - width:10px; -} -QSplitter::handle:vertical{ - height:10px; -} -QMainWindow::separator:hover,QSplitter::handle:hover{ - background:palette(highlight); -} -QDockWidget::title{ - padding:4px; - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border:1px solid rgba(25,25,25,75); - border-bottom:2px solid rgba(25,25,25,75); -} -QDockWidget{ - titlebar-close-icon:url(:/darkstyle/icon_close.png); - titlebar-normal-icon:url(:/darkstyle/icon_restore.png); -} -QDockWidget::close-button,QDockWidget::float-button{ - subcontrol-position:top right; - subcontrol-origin:margin; - position:absolute; - top:3px; - bottom:0px; - width:20px; - height:20px; -} -QDockWidget::close-button{ - right:3px; -} -QDockWidget::float-button{ - right:25px; -} -QGroupBox{ - background-color:rgba(66,66,66,50%); - margin-top:27px; - border:1px solid rgba(25,25,25,127); - border-radius:4px; -} -QGroupBox::title{ - subcontrol-origin:margin; - subcontrol-position:left top; - padding:4px 6px; - margin-left:3px; - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border:1px solid rgba(25,25,25,75); - border-bottom:2px solid rgb(127,127,127); - border-top-left-radius:4px; - border-top-right-radius:4px; -} -QTabWidget::pane{ - background-color:rgba(66,66,66,50%); - border-top:1px solid rgba(25,25,25,50%); -} -QTabWidget::tab-bar{ - left:3px; - top:1px; -} -QTabBar{ - background-color:transparent; - qproperty-drawBase:0; - border-bottom:1px solid rgba(25,25,25,50%); -} -QTabBar::tab{ - padding:4px 6px; - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border:1px solid rgba(25,25,25,75); - border-top-left-radius:4px; - border-top-right-radius:4px; -} -QTabBar::tab:selected,QTabBar::tab:hover{ - background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(53,53,53,127),stop:1 rgba(66,66,66,50%)); - border-bottom-color:rgba(66,66,66,75%); -} -QTabBar::tab:selected{ - border-bottom:2px solid palette(highlight); -} -QTabBar::tab::selected:disabled{ - border-bottom:2px solid rgb(127,127,127); -} -QTabBar::tab:!selected{ - margin-top:2px; -} -QCheckBox::indicator{ - width:18px; - height:18px; -} -QCheckBox::indicator:checked,QTreeView::indicator:checked,QTableView::indicator:checked,QGroupBox::indicator:checked{ - image:url(:/darkstyle/icon_checkbox_checked.png); -} -QCheckBox::indicator:checked:pressed,QTreeView::indicator:checked:pressed,QTableView::indicator:checked:pressed,QGroupBox::indicator:checked:pressed{ - image:url(:/darkstyle/icon_checkbox_checked_pressed.png); -} -QCheckBox::indicator:checked:disabled,QTreeView::indicator:checked:disabled,QTableView::indicator:checked:disabled,QGroupBox::indicator:checked:disabled{ - image:url(:/darkstyle/icon_checkbox_checked_disabled.png); -} -QCheckBox::indicator:unchecked,QTreeView::indicator:unchecked,QTableView::indicator:unchecked,QGroupBox::indicator:unchecked{ - image:url(:/darkstyle/icon_checkbox_unchecked.png); -} -QCheckBox::indicator:unchecked:pressed,QTreeView::indicator:unchecked:pressed,QTableView::indicator:unchecked:pressed,QGroupBox::indicator:unchecked:pressed{ - image:url(:/darkstyle/icon_checkbox_unchecked_pressed.png); -} -QCheckBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QTableView::indicator:unchecked:disabled,QGroupBox::indicator:unchecked:disabled{ - image:url(:/darkstyle/icon_checkbox_unchecked_disabled.png); -} -QCheckBox::indicator:indeterminate,QTreeView::indicator:indeterminate,QTableView::indicator:indeterminate,QGroupBox::indicator:indeterminate{ - image:url(:/darkstyle/icon_checkbox_indeterminate.png); -} -QCheckBox::indicator:indeterminate:pressed,QTreeView::indicator:indeterminate:pressed,QTableView::indicator:indeterminate:pressed,QGroupBox::indicator:indeterminate:pressed{ - image:url(:/darkstyle/icon_checkbox_indeterminate_pressed.png); -} -QCheckBox::indicator:indeterminate:disabled,QTreeView::indicator:indeterminate:disabled,QTableView::indicator:indeterminate:disabled,QGroupBox::indicator:indeterminate:disabled{ - image:url(:/darkstyle/icon_checkbox_indeterminate_disabled.png); -} -QRadioButton::indicator{ - width:18px; - height:18px; -} -QRadioButton::indicator:checked{ - image:url(:/darkstyle/icon_radiobutton_checked.png); -} -QRadioButton::indicator:checked:pressed{ - image:url(:/darkstyle/icon_radiobutton_checked_pressed.png); -} -QRadioButton::indicator:checked:disabled{ - image:url(:/darkstyle/icon_radiobutton_checked_disabled.png); -} -QRadioButton::indicator:unchecked{ - image:url(:/darkstyle/icon_radiobutton_unchecked.png); -} -QRadioButton::indicator:unchecked:pressed{ - image:url(:/darkstyle/icon_radiobutton_unchecked_pressed.png); -} -QRadioButton::indicator:unchecked:disabled{ - image:url(:/darkstyle/icon_radiobutton_unchecked_disabled.png); -} -QTreeView, QTableView{ - alternate-background-color:palette(window); - background:palette(base); -} -QTreeView QHeaderView::section, QTableView QHeaderView::section{ - background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75)); - border-style:none; - border-bottom:1px solid palette(dark); - padding-left:5px; - padding-right:5px; -} -QTreeView::item:selected:disabled, QTableView::item:selected:disabled{ - background:rgb(80,80,80); -} -QTreeView::branch{ - background-color:palette(base); -} -QTreeView::branch:has-siblings:!adjoins-item{ - border-image:url(:/darkstyle/icon_vline.png) 0; -} -QTreeView::branch:has-siblings:adjoins-item{ - border-image:url(:/darkstyle/icon_branch_more.png) 0; -} -QTreeView::branch:!has-children:!has-siblings:adjoins-item{ - border-image:url(:/darkstyle/icon_branch_end.png) 0; -} -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings{ - border-image:none; - image:url(:/darkstyle/icon_branch_closed.png); -} -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings{ - border-image:none; - image:url(:/darkstyle/icon_branch_open.png); -} -QScrollBar:vertical{ - background:palette(base); - border-top-right-radius:2px; - border-bottom-right-radius:2px; - width:16px; - margin:0px; -} -QScrollBar::handle:vertical{ - background-color:palette(alternate-base); - border-radius:2px; - min-height:20px; - margin:2px 4px 2px 4px; -} -QScrollBar::handle:vertical:hover{ - background-color:palette(highlight); -} -QScrollBar::add-line:vertical{ - background:none; - height:0px; - subcontrol-position:right; - subcontrol-origin:margin; -} -QScrollBar::sub-line:vertical{ - background:none; - height:0px; - subcontrol-position:left; - subcontrol-origin:margin; -} -QScrollBar:horizontal{ - background:palette(base); - height:16px; - margin:0px; -} -QScrollBar::handle:horizontal{ - background-color:palette(alternate-base); - border-radius:2px; - min-width:20px; - margin:4px 2px 4px 2px; -} -QScrollBar::handle:horizontal:hover{ - background-color:palette(highlight); -} -QScrollBar::add-line:horizontal{ - background:none; - width:0px; - subcontrol-position:bottom; - subcontrol-origin:margin; -} -QScrollBar::sub-line:horizontal{ - background:none; - width:0px; - subcontrol-position:top; - subcontrol-origin:margin; -} -QSlider::handle:horizontal{ - border-radius:4px; - border:1px solid rgba(25,25,25,255); - background-color:palette(alternate-base); - min-height:20px; - margin:0 -4px; -} -QSlider::handle:horizontal:hover{ - background:palette(highlight); -} -QSlider::add-page:horizontal{ - background:palette(base); -} -QSlider::sub-page:horizontal{ - background:palette(highlight); -} -QSlider::sub-page:horizontal:disabled{ - background:rgb(80,80,80); -} diff --git a/src/DarkStyle/darkstyle/icon_branch_closed.png b/src/DarkStyle/darkstyle/icon_branch_closed.png deleted file mode 100644 index fa785cc91e6ab6b57b9ff2ab8b17a0a5cc6319a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^96-#&!3HGb=lz)rq*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0Ug6+xJhcmI}fprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf%@$7= z#}JL+(hHtkhYUoHeSGtUuc@N{9ZSA)X=LW)W6T`$7OcCY(GgmBKu~=SpXh(VD6dR$ zd!c*385yVyt-!VXGE|c|w9$Xh1f5+6=PY#m#nNhi z$u+a=lXqQ$_}0s7mrUfXF-+PtF<-4Q?q|64N9H*vo@%>1TlgC2eg;ohKbLh*2~7Y8 CYj9%# diff --git a/src/DarkStyle/darkstyle/icon_branch_end.png b/src/DarkStyle/darkstyle/icon_branch_end.png deleted file mode 100644 index d90a04c33075a3e26db2686fd9a62b21e3d14a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^fk14a~60+ z7BevL9RguSQ4OyKprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf%@a=- z$B>G+w-*-jGC4}PJbc|`Bw)c)Iw9dDqa*9}FPlCURi+*45cRKl6zBKH`nE)}=kI;@ zm%l&Q`!AaDn5ackqp}#8#DR|fmz$Jo4sbmyd@g9e{C(;J<}ic);v@BEAFsRo`+=!# zcng03+hQY$sRvi^xTP9sH3v%eoJt5GQAqXJH|9Hg)*H{(6P*q8FN3G6pUXO@geCxm C^?Y^! diff --git a/src/DarkStyle/darkstyle/icon_branch_more.png b/src/DarkStyle/darkstyle/icon_branch_more.png deleted file mode 100644 index bdbe4ed92af5f6fcdd185c752072d727bc6d350d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^5mw7EWWf>Pm0S#vGboFyt=akR{0R8(u^#A|> diff --git a/src/DarkStyle/darkstyle/icon_branch_open.png b/src/DarkStyle/darkstyle/icon_branch_open.png deleted file mode 100644 index 9dd05d6460df3535a0c8833eef4b617d8cb2e93c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq*&4&eH|GXHuiJ>Nn{1`ISV`@ ziy0Ug6+xJhcmI}fprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf&2~>0 z#}JL+)N`I(ha3c2AKrT@%koiS9ZSA);mt`OnVPc23!l0<`iQX06drmR@HT#uhmg2@ zNci4Yc~2|j?w8&*kE?j(`2L;6x!zx0+~+J7F5Yr2wM((byZokP61Lr_XX8RS-DxvGt3% zkMqH#PZ#?`_iXL#d?+iHSnyRL<=Lon*Ag*cla~T(pPQ6*e2~U<-GP*_hH3&`b%ZkbC+1l*n ZZ6=uTeQ?shqy}^XgQu&X%Q~loCIC{JK~n$# diff --git a/src/DarkStyle/darkstyle/icon_checkbox_checked_disabled.png b/src/DarkStyle/darkstyle/icon_checkbox_checked_disabled.png deleted file mode 100644 index 441d0d9148a8badd5620904b2d18defce32fd7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ6J37bZ;R4rebAc+WAn zhTjOpTkc$S@?y&418U;yWUqK{0tt!pUiVfIW;feeaM3_vPA@ai#*7{8Fp~Yxe0TO| zJEVXv_z|J=Q%zx?Sx(j;^+RVT9y(ii>I+LjgTe~DWM4f^5Bfb diff --git a/src/DarkStyle/darkstyle/icon_checkbox_checked_pressed.png b/src/DarkStyle/darkstyle/icon_checkbox_checked_pressed.png deleted file mode 100644 index 7b508c8d156a3878a701209c7674dc5584fc90d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ@&NsXv6nQvE@b(uy_5N& zAZ%5Cpw;;A{78Sz)a<-x7hmR?v8@%?yECbxm2I|E`wIttGgH2c1;>_FrUyS>;2g=m z*{J$vGLXq`oF$Xq9{)j)FQ@2X$%?0#LT=By}Z;C1rt33 zJ0#LT=By}Z;C1rt33 zJpVX7N4|TXV6yiU3DYu{zQAO6G=?WX`=#=i4;_Bx$?Q@(zG9RUcI0#LT=By}Z;C1rt33 zJBmQ; a&*+s(r7SrAZQf#_RScf4elF{r5}E*y3QTeU diff --git a/src/DarkStyle/darkstyle/icon_checkbox_unchecked_pressed.png b/src/DarkStyle/darkstyle/icon_checkbox_unchecked_pressed.png deleted file mode 100644 index c24130c552f7f9a31e3891082af80749a11ef16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ`@(t+}9+VxKD(vOcw bpV8Yib^U@4%V)Yks~9|8{an^LB{Ts5&cjUT diff --git a/src/DarkStyle/darkstyle/icon_close.png b/src/DarkStyle/darkstyle/icon_close.png deleted file mode 100644 index ece7c28b9cf14f2a10fb7b58fe87e19f19f3a25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3 z1W2#{3nc6{#qKB_n*?NeE3Z~P%Cuv3L8McU)F$19HwtRl0?!u2JoL%=6YxlQ5>NV~ zE^fA5fr}=SGH3Z@&b#;`Fyz9v4brTKxfvMN7xoq(RcyNlv{JRiHKHUXu_Vv=^7b_7#drd7+V>eX&V?=85q3$W9f;aAvZrIGp!Q0h8YVRzXCOAfNUr( zOSei&EKb!eEy`p_%gjl&(%087$t}>&O-#>B&eruwD+sId%}=t++^!GQ!{F)a=d#Wz Gp$PyJ(T2tV diff --git a/src/DarkStyle/darkstyle/icon_radiobutton_checked.png b/src/DarkStyle/darkstyle/icon_radiobutton_checked.png deleted file mode 100644 index f747f4989cfc6113a43f98a53e4aa337bbb00282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7{huFj{)LIEGjV?mc+cQ@K!v;llkV z2Em<+TstBfI=U8V#M!8VP!7zLc3X5n1DWZi)qVqVs1`9uK$}qg7^3dx$HoHU|2GE My85}Sb4q9e03n;5kpKVy diff --git a/src/DarkStyle/darkstyle/icon_radiobutton_checked_disabled.png b/src/DarkStyle/darkstyle/icon_radiobutton_checked_disabled.png deleted file mode 100644 index fa554cbb3ba874b49b41b95927db8f3b92fbf1fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmV-v0+#)WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0oqAKK~zXf-IYN~TtO5?TL-!l#VkT33lLFJ z(iogLP)zm_5QGE*8T1a6xQ15e5?p{1)Fo(QCdoO?t^Td4?oS4pc;P_*`)*ZzUe&Me zylnM)y;<0X6Zj6lg1^7QTbND!-^9Q-a0kCzxP{FOYZu{Z_>#eL0lP20NFcZ5Grl-ZgMXZ5%K8#=EATe{ctL({E>_(U#MT@(!^nCNt32Uq* zZhk-BajZs|o^6YBvGi=q=wvlc6F0vQ?>bf^Og|ut!~XHRY}_R76F2WZ>OID4g!$hW zC@q?grRQlGovcPbar3X@UBzmI>D^*+FP7eFyh$u4ZvK6|qgahFy|^rT)TUzVAH=Wm zAu)3v)64kX*o`plpBI;b;ZapQufQqXhdvD7T=D!49BZrp{?HVK&4k?CrP!?^`x<^` z>{{%)2zV=&MZCy{?RqY2;G37pKczHYguJfHBI2I-h58ZMM)9<`p{3{Y5!$coBElQs z#Z@L4hdrO%mT_XBe=b{a4A<}&uHXo|P~XrOqE6=z20Wq*i~*uf00000NkvXXu0mjf DBpw!u diff --git a/src/DarkStyle/darkstyle/icon_radiobutton_checked_pressed.png b/src/DarkStyle/darkstyle/icon_radiobutton_checked_pressed.png deleted file mode 100644 index 7b4bb1106ab17be557f94cd40956484fe7909e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0oh4JK~zXf-IYyBTtOH`TL-!l#VkT33lK4) zM3hW2P)zm_Xb30>?mGohl5PKaG>A)ZdEW&HKnjWF$>7ngy-QB^!I!3o@jV;H=-;`tLe)>c3N&=iHWgxuVP*sUV_7Jg;y zyV!LR@K!8~c##d-^{=dfZ(b(fOKG$Sd0m%9#69r~^&_&4;%RY1OV4E&+OO*(!mHrL zRVEmPJs;neQDUHfE*o$J*YFsw;1JfKzM-!~oz7p{3_bQImI8wS0000KF1Pf3GwFP5xd6L7An~<5K?75c)&OV+~Pik3(QpMq4JEg6dLbn)58rqb$&R(++nux#}|&W&IEI%b&k?c?cCI>g@qUQ&eZv3-%cDM_^JxOy#N3J07*qo IM6N<$f~R4H-v9sr diff --git a/src/DarkStyle/darkstyle/icon_radiobutton_unchecked_disabled.png b/src/DarkStyle/darkstyle/icon_radiobutton_unchecked_disabled.png deleted file mode 100644 index 87d18463ca3de25b42f8f279a70b28f5cd3d0d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0gFjQK~zXf-IZNRLQxcj)dwAkQiBL-3W1Us zz4V||gDD7la0W^ZMWO*HQB9$;m-<$$%^|wi>j`|Q1s}-TKj*T~kG21;$z;-kW4MI} zcsKfe14qzudY&jeglG7u;0gLJs}{)(xOTCa!wA~YG#wbj9Yo$0G~A|KBt`QVII&$Q z;&ssCukf{qL&YLNV~OT_wkt($7h;i~?e8L>4UL(v{qiDFqmilh5t_D>Fm+m#Ft?Q@ z>NKv{lcDV-OdUl9N4By>?WudrY$ajpY%AEdl`U#_++%4g2~!tH!JqTnP}FK4)njEV z33KZU#E3e!vPJE#dn{}vVd`yBaBM4E)SkP?)K(Iv9xerS)atf3mTKVMJqEUuFf~6t zTuR73s??mhR--Q7M*@8(>DqT~SBl(ycysN6?P8IjS1}gRLsmL2#Xw&k%`Y7)7fE`q zV-cY}(GArl(inwKi#9Z7E-s+@xek%s13g^PpbX7?{aDIGq5fQkFoPwm%mSt`fL~wC czo1&}6PiV{{Bs1%hyVZp07*qoM6N<$g2%GpegFUf diff --git a/src/DarkStyle/darkstyle/icon_radiobutton_unchecked_pressed.png b/src/DarkStyle/darkstyle/icon_radiobutton_unchecked_pressed.png deleted file mode 100644 index 8f4d548b081590f7bd126d98aa00743c0170149e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0g6dPK~zXf-IZNRLQxcj)dwAkQiBL-3W1Us zz4V||gDD7_gJLsLq5&vTO`)=v`c|yXA-dP=33{jnAIRE2=d#a_wg0X8eBOd%xPg0k zGx|M)BWO82PZS=)6TDaO2z{4Ti{u7eyI3q>1Z`-V4vgUzBJT_WQte7PUL>v9gtfsSBjw_xWupYPFB*v9^_j z`RfbBh&r~iMeVM8ENvxW>TOYQY%5#Tp1a4yRuZNjE(LYe>bAF*YT(X22DXzhH9tLE zO2|H{)SS6iqb}Y@0(~dx+IMYNirjs8b?t%eVv(R%F&5E7Ryr=lKwlosFC8iuNqVkh z5urWN4b>&m7==!YHZ*1~E};6k4w2jgJzUYC49$G=Sjt49{#=GIg%zyL5+*Q!A79MB bpjzz%)7KnVvMmjB00000NkvXXu0mjfZmZ&p diff --git a/src/DarkStyle/darkstyle/icon_restore.png b/src/DarkStyle/darkstyle/icon_restore.png deleted file mode 100644 index be29650401564c0bb4d3f1527dbcd1931ca46708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI1gGYY|NsBjPvS{Q zaWS0SdCe|C@p|f!UsL|s9e64f^Qfi9tyrF?mb+k?Qc>{P2Ok+XHcaqm+t1HtBmdwF zv=^7b_7#drd z7+V>cXd4(<85nFjsqqg*LvDUbW?Cg~4Tq;pZ~|)30NGGnmTr}lSe&X`T9nC?hDGs&BmALjAB#;Q<@k=#Mf-#lAw(+U3%24DaN;GYAZ0t^6TvPy9R S9_vZ~0000a~60+ z7BevL9RguSQ4OyKprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoqfu3cKah)Gf&00?v z$B>G+w-*))HW)ClI944Blonm`vcbh=9fz^{wLg1yC7;{5)bQBXUH0d$=ChwJWOrrh u;t&zkPzrEa(BUB1sKi7cf&ZNr{p{Q~c4mFyk(~r|ID@CFpUXO@geCxAGgaIG diff --git a/src/DarkStyle/frameless_window_dark.pro b/src/DarkStyle/frameless_window_dark.pro deleted file mode 100644 index ec30a1c..0000000 --- a/src/DarkStyle/frameless_window_dark.pro +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### - -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -INCLUDEPATH +="framelesswindow" - -TARGET = QtFramelessWindowDarkStyle -TEMPLATE = app - -SOURCES += main.cpp\ - mainwindow.cpp \ - framelesswindow/framelesswindow.cpp \ - framelesswindow/windowdragger.cpp \ - DarkStyle.cpp - - -HEADERS += mainwindow.h \ - framelesswindow/framelesswindow.h \ - framelesswindow/windowdragger.h \ - DarkStyle.h - - -FORMS += mainwindow.ui \ - framelesswindow/framelesswindow.ui - -RESOURCES += darkstyle.qrc \ - framelesswindow.qrc diff --git a/src/DarkStyle/framelesswindow.qrc b/src/DarkStyle/framelesswindow.qrc deleted file mode 100644 index 2ece118..0000000 --- a/src/DarkStyle/framelesswindow.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - images/icon_window_minimize.png - images/icon_window_restore.png - images/icon_window_maximize.png - images/icon_window_close.png - - diff --git a/src/DarkStyle/framelesswindow/framelesswindow.cpp b/src/DarkStyle/framelesswindow/framelesswindow.cpp deleted file mode 100644 index 5f267e6..0000000 --- a/src/DarkStyle/framelesswindow/framelesswindow.cpp +++ /dev/null @@ -1,458 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#include "framelesswindow.h" -#include -#include -#include -#include - -#include "ui_framelesswindow.h" - -FramelessWindow::FramelessWindow(QWidget *parent) - : QWidget(parent), - ui(new Ui::FramelessWindow), - m_bMousePressed(false), - m_bDragTop(false), - m_bDragLeft(false), - m_bDragRight(false), - m_bDragBottom(false) { - setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); - // append minimize button flag in case of windows, - // for correct windows native handling of minimize function -#if defined(Q_OS_WIN) - setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint); -#endif - setAttribute(Qt::WA_NoSystemBackground, true); - setAttribute(Qt::WA_TranslucentBackground); - - ui->setupUi(this); - ui->restoreButton->setVisible(false); - - // shadow under window title text - QGraphicsDropShadowEffect *textShadow = new QGraphicsDropShadowEffect; - textShadow->setBlurRadius(4.0); - textShadow->setColor(QColor(0, 0, 0)); - textShadow->setOffset(0.0); - ui->titleText->setGraphicsEffect(textShadow); - - // window shadow - QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; - windowShadow->setBlurRadius(9.0); - windowShadow->setColor(palette().color(QPalette::Highlight)); - windowShadow->setOffset(0.0); - ui->windowFrame->setGraphicsEffect(windowShadow); - - QObject::connect(qApp, &QGuiApplication::applicationStateChanged, this, - &FramelessWindow::on_applicationStateChanged); - setMouseTracking(true); - - // important to watch mouse move from all child widgets - QApplication::instance()->installEventFilter(this); -} - -FramelessWindow::~FramelessWindow() { delete ui; } - -void FramelessWindow::on_restoreButton_clicked() { - ui->restoreButton->setVisible(false); - - ui->maximizeButton->setVisible(true); - setWindowState(Qt::WindowNoState); - // on MacOS this hack makes sure the - // background window is repaint correctly - hide(); - show(); -} - -void FramelessWindow::on_maximizeButton_clicked() { - ui->restoreButton->setVisible(true); - ui->maximizeButton->setVisible(false); - this->setWindowState(Qt::WindowMaximized); - this->showMaximized(); - styleWindow(true, false); -} - -void FramelessWindow::changeEvent(QEvent *event) { - if (event->type() == QEvent::WindowStateChange) { - if (windowState().testFlag(Qt::WindowNoState)) { - ui->restoreButton->setVisible(false); - ui->maximizeButton->setVisible(true); - styleWindow(true, true); - event->ignore(); - } else if (windowState().testFlag(Qt::WindowMaximized)) { - ui->restoreButton->setVisible(true); - ui->maximizeButton->setVisible(false); - styleWindow(true, false); - event->ignore(); - } - } - event->accept(); -} - -void FramelessWindow::setContent(QWidget *w) { - ui->windowContent->layout()->addWidget(w); -} - -void FramelessWindow::setWindowTitle(const QString &text) { - ui->titleText->setText(text); -} - -void FramelessWindow::setWindowIcon(const QIcon &ico) { - ui->icon->setPixmap(ico.pixmap(16, 16)); -} - -void FramelessWindow::styleWindow(bool bActive, bool bNoState) { - if (bActive) { - if (bNoState) { - layout()->setMargin(15); - ui->windowTitlebar->setStyleSheet(QStringLiteral( - "#windowTitlebar{border: 0px none palette(shadow); " - "border-top-left-radius:5px; border-top-right-radius:5px; " - "background-color:palette(shadow); height:20px;}")); - ui->windowFrame->setStyleSheet(QStringLiteral( - "#windowFrame{border:1px solid palette(highlight); border-radius:5px " - "5px 5px 5px; background-color:palette(Window);}")); - QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); - if (oldShadow) delete oldShadow; - QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; - windowShadow->setBlurRadius(9.0); - windowShadow->setColor(palette().color(QPalette::Highlight)); - windowShadow->setOffset(0.0); - ui->windowFrame->setGraphicsEffect(windowShadow); - } else { - layout()->setMargin(0); - ui->windowTitlebar->setStyleSheet(QStringLiteral( - "#windowTitlebar{border: 0px none palette(shadow); " - "border-top-left-radius:0px; border-top-right-radius:0px; " - "background-color:palette(shadow); height:20px;}")); - ui->windowFrame->setStyleSheet(QStringLiteral( - "#windowFrame{border:1px solid palette(dark); border-radius:0px 0px " - "0px 0px; background-color:palette(Window);}")); - QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); - if (oldShadow) delete oldShadow; - ui->windowFrame->setGraphicsEffect(nullptr); - } // if (bNoState) else maximize - } else { - if (bNoState) { - layout()->setMargin(15); - ui->windowTitlebar->setStyleSheet(QStringLiteral( - "#windowTitlebar{border: 0px none palette(shadow); " - "border-top-left-radius:5px; border-top-right-radius:5px; " - "background-color:palette(dark); height:20px;}")); - ui->windowFrame->setStyleSheet(QStringLiteral( - "#windowFrame{border:1px solid #000000; border-radius:5px 5px 5px " - "5px; background-color:palette(Window);}")); - QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); - if (oldShadow) delete oldShadow; - QGraphicsDropShadowEffect *windowShadow = new QGraphicsDropShadowEffect; - windowShadow->setBlurRadius(9.0); - windowShadow->setColor(palette().color(QPalette::Shadow)); - windowShadow->setOffset(0.0); - ui->windowFrame->setGraphicsEffect(windowShadow); - } else { - layout()->setMargin(0); - ui->windowTitlebar->setStyleSheet(QStringLiteral( - "#titlebarWidget{border: 0px none palette(shadow); " - "border-top-left-radius:0px; border-top-right-radius:0px; " - "background-color:palette(dark); height:20px;}")); - ui->windowFrame->setStyleSheet(QStringLiteral( - "#windowFrame{border:1px solid palette(shadow); border-radius:0px " - "0px 0px 0px; background-color:palette(Window);}")); - QGraphicsEffect *oldShadow = ui->windowFrame->graphicsEffect(); - if (oldShadow) delete oldShadow; - ui->windowFrame->setGraphicsEffect(nullptr); - } // if (bNoState) { else maximize - } // if (bActive) { else no focus -} - -void FramelessWindow::on_applicationStateChanged(Qt::ApplicationState state) { - if (windowState().testFlag(Qt::WindowNoState)) { - if (state == Qt::ApplicationActive) { - styleWindow(true, true); - } else { - styleWindow(false, true); - } - } else if (windowState().testFlag(Qt::WindowFullScreen)) { - if (state == Qt::ApplicationActive) { - styleWindow(true, false); - } else { - styleWindow(false, false); - } - } -} - -void FramelessWindow::on_minimizeButton_clicked() { - setWindowState(Qt::WindowMinimized); -} - -void FramelessWindow::on_closeButton_clicked() { close(); } - -void FramelessWindow::on_windowTitlebar_doubleClicked() { - if (windowState().testFlag(Qt::WindowNoState)) { - on_maximizeButton_clicked(); - } else if (windowState().testFlag(Qt::WindowFullScreen)) { - on_restoreButton_clicked(); - } -} - -void FramelessWindow::mouseDoubleClickEvent(QMouseEvent *event) { - Q_UNUSED(event); -} - -void FramelessWindow::checkBorderDragging(QMouseEvent *event) { - if (isMaximized()) { - return; - } - - QPoint globalMousePos = event->globalPos(); - if (m_bMousePressed) { - QScreen *screen = QGuiApplication::primaryScreen(); - // available geometry excludes taskbar - QRect availGeometry = screen->availableGeometry(); - int h = availGeometry.height(); - int w = availGeometry.width(); - QList screenlist = screen->virtualSiblings(); - if (screenlist.contains(screen)) { - QSize sz = QApplication::desktop()->size(); - h = sz.height(); - w = sz.width(); - } - - // top right corner - if (m_bDragTop && m_bDragRight) { - int diff = - globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width()); - int neww = m_StartGeometry.width() + diff; - diff = globalMousePos.y() - m_StartGeometry.y(); - int newy = m_StartGeometry.y() + diff; - if (neww > 0 && newy > 0 && newy < h - 50) { - QRect newg = m_StartGeometry; - newg.setWidth(neww); - newg.setX(m_StartGeometry.x()); - newg.setY(newy); - setGeometry(newg); - } - } - // top left corner - else if (m_bDragTop && m_bDragLeft) { - int diff = globalMousePos.y() - m_StartGeometry.y(); - int newy = m_StartGeometry.y() + diff; - diff = globalMousePos.x() - m_StartGeometry.x(); - int newx = m_StartGeometry.x() + diff; - if (newy > 0 && newx > 0) { - QRect newg = m_StartGeometry; - newg.setY(newy); - newg.setX(newx); - setGeometry(newg); - } - } - // bottom right corner - else if (m_bDragBottom && m_bDragLeft) { - int diff = - globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height()); - int newh = m_StartGeometry.height() + diff; - diff = globalMousePos.x() - m_StartGeometry.x(); - int newx = m_StartGeometry.x() + diff; - if (newh > 0 && newx > 0) { - QRect newg = m_StartGeometry; - newg.setX(newx); - newg.setHeight(newh); - setGeometry(newg); - } - } else if (m_bDragTop) { - int diff = globalMousePos.y() - m_StartGeometry.y(); - int newy = m_StartGeometry.y() + diff; - if (newy > 0 && newy < h - 50) { - QRect newg = m_StartGeometry; - newg.setY(newy); - setGeometry(newg); - } - } else if (m_bDragLeft) { - int diff = globalMousePos.x() - m_StartGeometry.x(); - int newx = m_StartGeometry.x() + diff; - if (newx > 0 && newx < w - 50) { - QRect newg = m_StartGeometry; - newg.setX(newx); - setGeometry(newg); - } - } else if (m_bDragRight) { - int diff = - globalMousePos.x() - (m_StartGeometry.x() + m_StartGeometry.width()); - int neww = m_StartGeometry.width() + diff; - if (neww > 0) { - QRect newg = m_StartGeometry; - newg.setWidth(neww); - newg.setX(m_StartGeometry.x()); - setGeometry(newg); - } - } else if (m_bDragBottom) { - int diff = - globalMousePos.y() - (m_StartGeometry.y() + m_StartGeometry.height()); - int newh = m_StartGeometry.height() + diff; - if (newh > 0) { - QRect newg = m_StartGeometry; - newg.setHeight(newh); - newg.setY(m_StartGeometry.y()); - setGeometry(newg); - } - } - } else { - // no mouse pressed - if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { - setCursor(Qt::SizeFDiagCursor); - } else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { - setCursor(Qt::SizeBDiagCursor); - } else if (leftBorderHit(globalMousePos) && - bottomBorderHit(globalMousePos)) { - setCursor(Qt::SizeBDiagCursor); - } else { - if (topBorderHit(globalMousePos)) { - setCursor(Qt::SizeVerCursor); - } else if (leftBorderHit(globalMousePos)) { - setCursor(Qt::SizeHorCursor); - } else if (rightBorderHit(globalMousePos)) { - setCursor(Qt::SizeHorCursor); - } else if (bottomBorderHit(globalMousePos)) { - setCursor(Qt::SizeVerCursor); - } else { - m_bDragTop = false; - m_bDragLeft = false; - m_bDragRight = false; - m_bDragBottom = false; - setCursor(Qt::ArrowCursor); - } - } - } -} - -// pos in global virtual desktop coordinates -bool FramelessWindow::leftBorderHit(const QPoint &pos) { - const QRect &rect = this->geometry(); - if (pos.x() >= rect.x() && pos.x() <= rect.x() + CONST_DRAG_BORDER_SIZE) { - return true; - } - return false; -} - -bool FramelessWindow::rightBorderHit(const QPoint &pos) { - const QRect &rect = this->geometry(); - int tmp = rect.x() + rect.width(); - if (pos.x() <= tmp && pos.x() >= (tmp - CONST_DRAG_BORDER_SIZE)) { - return true; - } - return false; -} - -bool FramelessWindow::topBorderHit(const QPoint &pos) { - const QRect &rect = this->geometry(); - if (pos.y() >= rect.y() && pos.y() <= rect.y() + CONST_DRAG_BORDER_SIZE) { - return true; - } - return false; -} - -bool FramelessWindow::bottomBorderHit(const QPoint &pos) { - const QRect &rect = this->geometry(); - int tmp = rect.y() + rect.height(); - if (pos.y() <= tmp && pos.y() >= (tmp - CONST_DRAG_BORDER_SIZE)) { - return true; - } - return false; -} - -void FramelessWindow::mousePressEvent(QMouseEvent *event) { - if (isMaximized()) { - return; - } - - m_bMousePressed = true; - m_StartGeometry = this->geometry(); - - QPoint globalMousePos = mapToGlobal(QPoint(event->x(), event->y())); - - if (leftBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { - m_bDragTop = true; - m_bDragLeft = true; - setCursor(Qt::SizeFDiagCursor); - } else if (rightBorderHit(globalMousePos) && topBorderHit(globalMousePos)) { - m_bDragRight = true; - m_bDragTop = true; - setCursor(Qt::SizeBDiagCursor); - } else if (leftBorderHit(globalMousePos) && bottomBorderHit(globalMousePos)) { - m_bDragLeft = true; - m_bDragBottom = true; - setCursor(Qt::SizeBDiagCursor); - } else { - if (topBorderHit(globalMousePos)) { - m_bDragTop = true; - setCursor(Qt::SizeVerCursor); - } else if (leftBorderHit(globalMousePos)) { - m_bDragLeft = true; - setCursor(Qt::SizeHorCursor); - } else if (rightBorderHit(globalMousePos)) { - m_bDragRight = true; - setCursor(Qt::SizeHorCursor); - } else if (bottomBorderHit(globalMousePos)) { - m_bDragBottom = true; - setCursor(Qt::SizeVerCursor); - } - } -} - -void FramelessWindow::mouseReleaseEvent(QMouseEvent *event) { - Q_UNUSED(event); - if (isMaximized()) { - return; - } - - m_bMousePressed = false; - bool bSwitchBackCursorNeeded = - m_bDragTop || m_bDragLeft || m_bDragRight || m_bDragBottom; - m_bDragTop = false; - m_bDragLeft = false; - m_bDragRight = false; - m_bDragBottom = false; - if (bSwitchBackCursorNeeded) { - setCursor(Qt::ArrowCursor); - } -} - -bool FramelessWindow::eventFilter(QObject *obj, QEvent *event) { - if (isMaximized()) { - return QWidget::eventFilter(obj, event); - } - - // check mouse move event when mouse is moved on any object - if (event->type() == QEvent::MouseMove) { - QMouseEvent *pMouse = dynamic_cast(event); - if (pMouse) { - checkBorderDragging(pMouse); - } - } - // press is triggered only on frame window - else if (event->type() == QEvent::MouseButtonPress && obj == this) { - QMouseEvent *pMouse = dynamic_cast(event); - if (pMouse) { - mousePressEvent(pMouse); - } - } else if (event->type() == QEvent::MouseButtonRelease) { - if (m_bMousePressed) { - QMouseEvent *pMouse = dynamic_cast(event); - if (pMouse) { - mouseReleaseEvent(pMouse); - } - } - } - - return QWidget::eventFilter(obj, event); -} diff --git a/src/DarkStyle/framelesswindow/framelesswindow.h b/src/DarkStyle/framelesswindow/framelesswindow.h deleted file mode 100644 index 62bd08e..0000000 --- a/src/DarkStyle/framelesswindow/framelesswindow.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#ifndef FRAMELESSWINDOW_H -#define FRAMELESSWINDOW_H - -#include - -namespace Ui { -class FramelessWindow; -} - -class FramelessWindow : public QWidget { - Q_OBJECT - - public: - explicit FramelessWindow(QWidget *parent = Q_NULLPTR); - virtual ~FramelessWindow(); - void setContent(QWidget *w); - - private: - bool leftBorderHit(const QPoint &pos); - bool rightBorderHit(const QPoint &pos); - bool topBorderHit(const QPoint &pos); - bool bottomBorderHit(const QPoint &pos); - void styleWindow(bool bActive, bool bNoState); - - public slots: - void setWindowTitle(const QString &text); - void setWindowIcon(const QIcon &ico); - - private slots: - void on_applicationStateChanged(Qt::ApplicationState state); - void on_minimizeButton_clicked(); - void on_restoreButton_clicked(); - void on_maximizeButton_clicked(); - void on_closeButton_clicked(); - void on_windowTitlebar_doubleClicked(); - - protected: - virtual void changeEvent(QEvent *event); - virtual void mouseDoubleClickEvent(QMouseEvent *event); - virtual void checkBorderDragging(QMouseEvent *event); - virtual void mousePressEvent(QMouseEvent *event); - virtual void mouseReleaseEvent(QMouseEvent *event); - virtual bool eventFilter(QObject *obj, QEvent *event); - - private: - Ui::FramelessWindow *ui; - QRect m_StartGeometry; - const quint8 CONST_DRAG_BORDER_SIZE = 15; - bool m_bMousePressed; - bool m_bDragTop; - bool m_bDragLeft; - bool m_bDragRight; - bool m_bDragBottom; -}; - -#endif // FRAMELESSWINDOW_H diff --git a/src/DarkStyle/framelesswindow/framelesswindow.ui b/src/DarkStyle/framelesswindow/framelesswindow.ui deleted file mode 100644 index 7bb5ecd..0000000 --- a/src/DarkStyle/framelesswindow/framelesswindow.ui +++ /dev/null @@ -1,304 +0,0 @@ - - - FramelessWindow - - - - 0 - 0 - 1737 - 1157 - - - - - - - false - - - - 0 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - false - - - #windowFrame{border:1px solid palette(highlight); border-radius:5px 5px 5px 5px; background-color:palette(Window);} - - - - 0 - - - 1 - - - 1 - - - 1 - - - 1 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - false - - - #windowTitlebar{border: 0px none palette(base); border-top-left-radius:5px; border-top-right-radius:5px; background-color:palette(shadow); height:20px;} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 4 - 0 - - - - - 4 - 16777215 - - - - - - - - - 16 - 16 - - - - - 16 - 16 - - - - Qt::NoContextMenu - - - #icon {background-color:palette(shadow);} - - - - - - - - 75 - true - - - - padding-left:5px; - color:rgb(153,153,153); - - - VMProtect 2 - Virtual Instruction Inspector (v1.6 BETA) - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 75 - true - - - - #minimizeButton{ - background-color:none; - border:none; - width:16px; - height:16px; - padding:4px; - image:url(:/images/icon_window_minimize.png); -} -#minimizeButton:hover{ - background-color:palette(alternate-base); -} -#minimizeButton:pressed{ - background-color:palette(highlight); -} - - - - - - - - - - #restoreButton{ - background-color:none; - border:none; - width:16px; - height:16px; - padding:4px; - image:url(:/images/icon_window_restore.png); -} -#restoreButton:hover{ - background-color:palette(alternate-base); -} -#restoreButton:pressed{ - background-color:palette(highlight); -} - - - - - - - - - - #maximizeButton{ - background-color:none; - border:none; - width:16px; - height:16px; - padding:4px; - image:url(:/images/icon_window_maximize.png); -} -#maximizeButton:hover{ - background-color:palette(alternate-base); -} -##maximizeButton:pressed{ - background-color:palette(highlight); -} - - - - - - - - - - - 75 - true - - - - #closeButton{ - background-color:none; - border:none; - width:16px; - height:16px; - padding:4px; - image:url(:/images/icon_window_close.png); - border-top-right-radius: 5px; -} -#closeButton:hover{ - background-color:palette(alternate-base); -} -##closeButton:pressed{ - background-color:palette(highlight); -} - - - - - - - - - - false - - - #windowContent{ - border: 0px none palette(base); - border-radius:0px 0px 5px 5px; -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - WindowDragger - QWidget -
windowdragger.h
- 1 -
-
- - -
diff --git a/src/DarkStyle/framelesswindow/windowdragger.cpp b/src/DarkStyle/framelesswindow/windowdragger.cpp deleted file mode 100644 index 1d8627f..0000000 --- a/src/DarkStyle/framelesswindow/windowdragger.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#include "windowdragger.h" -#include -#include - -WindowDragger::WindowDragger(QWidget *parent) : QWidget(parent) { - mousePressed = false; -} - -void WindowDragger::mousePressEvent(QMouseEvent *event) { - mousePressed = true; - mousePos = event->globalPos(); - - QWidget *parent = parentWidget(); - if (parent) parent = parent->parentWidget(); - - if (parent) wndPos = parent->pos(); -} - -void WindowDragger::mouseMoveEvent(QMouseEvent *event) { - QWidget *parent = parentWidget(); - if (parent) parent = parent->parentWidget(); - - if (parent && mousePressed) - parent->move(wndPos + (event->globalPos() - mousePos)); -} - -void WindowDragger::mouseReleaseEvent(QMouseEvent *event) { - Q_UNUSED(event); - mousePressed = false; -} - -void WindowDragger::paintEvent(QPaintEvent *event) { - Q_UNUSED(event); - QStyleOption styleOption; - styleOption.init(this); - QPainter painter(this); - style()->drawPrimitive(QStyle::PE_Widget, &styleOption, &painter, this); -} - -void WindowDragger::mouseDoubleClickEvent(QMouseEvent *event) { - Q_UNUSED(event); - emit doubleClicked(); -} diff --git a/src/DarkStyle/framelesswindow/windowdragger.h b/src/DarkStyle/framelesswindow/windowdragger.h deleted file mode 100644 index be5b539..0000000 --- a/src/DarkStyle/framelesswindow/windowdragger.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#ifndef WINDOWDRAGGER_H -#define WINDOWDRAGGER_H - -#include -#include - -class WindowDragger : public QWidget { - Q_OBJECT - - public: - explicit WindowDragger(QWidget *parent = Q_NULLPTR); - virtual ~WindowDragger() {} - - signals: - void doubleClicked(); - - protected: - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - void paintEvent(QPaintEvent *event); - - protected: - QPoint mousePos; - QPoint wndPos; - bool mousePressed; -}; - -#endif // WINDOWDRAGGER_H diff --git a/src/DarkStyle/images/icon_window_close.png b/src/DarkStyle/images/icon_window_close.png deleted file mode 100644 index ece7c28b9cf14f2a10fb7b58fe87e19f19f3a25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3 z1W2#{3nc6{#qKB_n*?NeE3Z~P%Cuv3L8McU)F$19HwtRl0?!u2JoL%=6YxlQ5>NV~ zE^fA5fr}=SGH3Z@&b#;`Fyz9v4brTKxfvMN7xoq(RcyNlv{JRiHKHUXu_Vv=^7b_7#drd7+V>eX&V?=85q3$W9f;aAvZrIGp!Q0h8YVRzXCOAfNUr( zOSei&EKb!eEy`p_%gjl&(%087$t}>&O-#>B&eruwD+sId%}=t++^!GQ!{F)a=d#Wz Gp$PyJ(T2tV diff --git a/src/DarkStyle/images/icon_window_maximize.png b/src/DarkStyle/images/icon_window_maximize.png deleted file mode 100644 index 53ae289d010134bbd2218c1d94bb7cf62380a7c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI#6{MB|NsA=uf!}V z8F(gT(N_MpeXKe=R4yEzByd2q+}XavO;=)T0!KuHv3hXSs!M0t7biSmWXLPwQLw2j ziv=2|TH+c}l9E`GYL#4+3Zxi}3=GY64a{_nj6)2KtxSxpOpUY+46FA`FK1~g9gZk;<9wBq{QM>-O{2=hP2F_R4aXb{gT`Q{oKU#%;ap{{K#-q Y=hDOi$%hHwfqED`UHx3vIVCg!04C3CMF0Q* diff --git a/src/DarkStyle/images/icon_window_minimize.png b/src/DarkStyle/images/icon_window_minimize.png deleted file mode 100644 index 29bceed06b98e0268aeaf23477b585859f561a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3+E?Ks8O}VHKHUXu_Vv=^7b_ z7#drd7+V>dXd4(<85r2O>C2*M$jwj5OsmAL!B=|vLZAi>kPXFU=~hXJ#i_cbMVSm~ unK`Le`uh4Mxdr;UiRqci*}5*y1}5d9=3)9;b7g>f7(8A5T-G@yGywpqYG70V diff --git a/src/DarkStyle/images/icon_window_restore.png b/src/DarkStyle/images/icon_window_restore.png deleted file mode 100644 index be29650401564c0bb4d3f1527dbcd1931ca46708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3PI1gGYY|NsBjPvS{Q zaWS0SdCe|C@p|f!UsL|s9e64f^Qfi9tyrF?mb+k?Qc>{P2Ok+XHcaqm+t1HtBmdwF zv=^7b_7#drd z7+V>cXd4(<85nFjsqqg*LvDUbW?Cg~4Tq;pZ~|)30NGGnmTr}lSe&X`T9nC> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#include -#include "DarkStyle.h" -#include "framelesswindow.h" -#include "mainwindow.h" - -int main(int argc, char *argv[]) { - QApplication a(argc, argv); - - // style our application with custom dark style - QApplication::setStyle(new DarkStyle); - QApplication::setPalette(QApplication::style()->standardPalette()); - - // create frameless window (and set windowState or title) - FramelessWindow framelessWindow; - //framelessWindow.setWindowState(Qt::WindowFullScreen); - //framelessWindow.setWindowTitle("test title"); - framelessWindow.setWindowIcon(a.style()->standardIcon(QStyle::SP_DesktopIcon)); - - // create our mainwindow instance - MainWindow *mainWindow = new MainWindow; - - // add the mainwindow to our custom frameless window - framelessWindow.setContent(mainWindow); - framelessWindow.show(); - - return a.exec(); -} diff --git a/src/DarkStyle/mainwindow.cpp b/src/DarkStyle/mainwindow.cpp deleted file mode 100644 index b4bdcc7..0000000 --- a/src/DarkStyle/mainwindow.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#include "mainwindow.h" -#include "ui_mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent /*, Qt::FramelessWindowHint*/), - ui(new Ui::MainWindow) { - ui->setupUi(this); -} - -MainWindow::~MainWindow() { delete ui; } diff --git a/src/DarkStyle/mainwindow.h b/src/DarkStyle/mainwindow.h deleted file mode 100644 index 8ed9b90..0000000 --- a/src/DarkStyle/mainwindow.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -############################################################################### -# # -# The MIT License # -# # -# Copyright (C) 2017 by Juergen Skrotzky (JorgenVikingGod@gmail.com) # -# >> https://github.com/Jorgen-VikingGod # -# # -# Sources: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle # -# # -############################################################################### -*/ - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -namespace Ui { - class MainWindow; -} - -class MainWindow : public QMainWindow { - Q_OBJECT - - public: - explicit MainWindow(QWidget *parent = Q_NULLPTR); - ~MainWindow(); - - private: - Ui::MainWindow *ui; -}; - -#endif // MAINWINDOW_H diff --git a/src/DarkStyle/mainwindow.ui b/src/DarkStyle/mainwindow.ui deleted file mode 100644 index c51e31b..0000000 --- a/src/DarkStyle/mainwindow.ui +++ /dev/null @@ -1,645 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 670 - 559 - - - - MainWindow - - - - - - - - - Label - - - - - - - - New Item - - - - - New Item 2 - - - - - New Item 3 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Disable Widgets - - - false - - - - - - - - - GroupBox - - - - - - -10 - - - RadioButton - - - true - - - - - - - RadioButton - - - - - - - RadioButton - - - - - - - CheckBox - - - true - - - false - - - false - - - true - - - - - - - - - - GroupBox - - - - - - PushButton - - - - - - - PushButton - - - true - - - - - - - PushButton - - - true - - - - - - - PushButton - - - true - - - - - - - - - - 1 - - - - TextEdit - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'.SF NS Text'; font-size:13pt;">test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br /></span></p></body></html> - - - - - - - - Tab Table - - - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 1 - - - - - 2 - - - - - 3 - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - Cell 1/1 - - - - - Cell 2/1 - - - - - Cell 1/2 - - - - - - - - - - - - GroupBox - - - true - - - - - - 30 - - - - - - - - - - 60 - - - Qt::Horizontal - - - - - - - - - - 25 - - - Qt::Horizontal - - - - - - - test - - - QLineEdit::Password - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - 24 - - - - - - - - - 0 - 0 - 670 - 20 - - - - - Test - - - - - - - - - Test2 - - - - Test2 - - - - - - - - - - - - TopToolBarArea - - - false - - - - - - - - - Test - - - - - true - - - true - - - Test - - - - - true - - - Test - - - - - Test3 - - - - - Test3 - - - - - - - - checkBox_4 - toggled(bool) - groupBox_2 - setDisabled(bool) - - - 543 - 70 - - - 376 - 97 - - - - - checkBox_4 - toggled(bool) - groupBox - setDisabled(bool) - - - 617 - 70 - - - 47 - 104 - - - - - checkBox_4 - toggled(bool) - tabWidget - setDisabled(bool) - - - 623 - 74 - - - 234 - 264 - - - - - checkBox_4 - toggled(bool) - groupBox_3 - setDisabled(bool) - - - 503 - 80 - - - 503 - 262 - - - - - checkBox_4 - toggled(bool) - progressBar - setDisabled(bool) - - - 631 - 73 - - - 607 - 517 - - - - - checkBox_4 - toggled(bool) - mainToolBar - setDisabled(bool) - - - 648 - 71 - - - 105 - 33 - - - - - checkBox_4 - toggled(bool) - menuBar - setDisabled(bool) - - - 634 - 73 - - - 64 - 7 - - - - - checkBox_4 - toggled(bool) - statusBar - setDisabled(bool) - - - 650 - 70 - - - 533 - 549 - - - - - checkBox_4 - toggled(bool) - comboBox - setDisabled(bool) - - - 626 - 70 - - - 297 - 65 - - - - - checkBox_4 - toggled(bool) - label - setDisabled(bool) - - - 639 - 78 - - - 28 - 66 - - - - - diff --git a/src/DarkStyle/screenshot_mac_frameless_window_qt_dark_style_disabled.png b/src/DarkStyle/screenshot_mac_frameless_window_qt_dark_style_disabled.png deleted file mode 100644 index df1a7e751315c3b2f67cddc927c5d1f29329046a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118538 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

<(L?SZqP29;t5bUrqmGO`So4 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�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%0DrmtIN5vI_{thTp1q+H-O&s+EIW*t@MqwPC9bt9z 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ⅆ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 diff --git a/src/ia32.hpp b/src/ia32.hpp deleted file mode 100644 index af8cdaa..0000000 --- a/src/ia32.hpp +++ /dev/null @@ -1,21526 +0,0 @@ -/** @file */ -#pragma once -using uint8_t = unsigned char; -using uint16_t = unsigned short; -using uint32_t = unsigned int; -using uint64_t = unsigned long long; - -/** - * @defgroup intel_manual \ - * Intel Manual - * - * @remarks All references are based on Intel(R) 64 and IA-32 architectures software developer's manual combined volumes: - * 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4 (May 2018). - * @{ - */ - /** - * @defgroup control_registers \ - * Control registers - * - * Control registers (CR0, CR1, CR2, CR3, and CR4) determine operating mode of the processor and the characteristics of the - * currently executing task. These registers are 32 bits in all 32-bit modes and compatibility mode. - * In 64-bit mode, control registers are expanded to 64 bits. The MOV CRn instructions are used to manipulate the register - * bits. Operand-size prefixes for these instructions are ignored. The following is also true: - * - The control registers can be read and loaded (or modified) using the move-to-or-from-control-registers forms of the - * MOV instruction. In protected mode, the MOV instructions allow the control registers to be read or loaded (at privilege - * level 0 only). This restriction means that application programs or operating-system procedures (running at privilege - * levels 1, 2, or 3) are prevented from reading or loading the control registers. - * - Bits 63:32 of CR0 and CR4 are reserved and must be written with zeros. Writing a nonzero value to any of the upper 32 - * bits results in a general-protection exception, \#GP(0). - * - All 64 bits of CR2 are writable by software. - * - Bits 51:40 of CR3 are reserved and must be 0. - * - The MOV CRn instructions do not check that addresses written to CR2 and CR3 are within the linear-address or - * physical-address limitations of the implementation. - * - Register CR8 is available in 64-bit mode only. The control registers are summarized below, and each architecturally - * defined control field in these control registers is described individually. - * - CR0 - Contains system control flags that control operating mode and states of the processor. - * - CR1 - Reserved. - * - CR2 - Contains the page-fault linear address (the linear address that caused a page fault). - * - CR3 - Contains the physical address of the base of the paging-structure hierarchy and two flags (PCD and PWT). Only - * the most-significant bits (less the lower 12 bits) of the base address are specified; the lower 12 bits of the address - * are assumed to be 0. The first paging structure must thus be aligned to a page (4-KByte) boundary. The PCD and PWT flags - * control caching of that paging structure in the processor's internal data caches (they do not control TLB caching of - * page-directory information). When using the physical address extension, the CR3 register contains the base address of - * the page-directorypointer table. In IA-32e mode, the CR3 register contains the base address of the PML4 table. - * - CR4 - Contains a group of flags that enable several architectural extensions, and indicate operating system or - * executive support for specific processor capabilities. - * - CR8 - Provides read and write access to the Task Priority Register (TPR). It specifies the priority threshold value - * that operating systems use to control the priority class of external interrupts allowed to interrupt the processor. This - * register is available only in 64-bit mode. However, interrupt filtering continues to apply in compatibility mode. - * - * @see Vol3A[2.5(CONTROL REGISTERS)] (reference) - * @{ - */ -typedef union -{ - struct - { - /** - * @brief Protection Enable - * - * [Bit 0] Enables protected mode when set; enables real-address mode when clear. This flag does not enable paging - * directly. It only enables segment-level protection. To enable paging, both the PE and PG flags must be set. - * - * @see Vol3A[9.9(Mode Switching)] - */ - uint64_t protection_enable : 1; -#define CR0_PROTECTION_ENABLE_BIT 0 -#define CR0_PROTECTION_ENABLE_FLAG 0x01 -#define CR0_PROTECTION_ENABLE_MASK 0x01 -#define CR0_PROTECTION_ENABLE(_) (((_) >> 0) & 0x01) - - /** - * @brief Monitor Coprocessor - * - * [Bit 1] Controls the interaction of the WAIT (or FWAIT) instruction with the TS flag (bit 3 of CR0). If the MP flag is - * set, a WAIT instruction generates a device-not-available exception (\#NM) if the TS flag is also set. If the MP flag is - * clear, the WAIT instruction ignores the setting of the TS flag. - */ - uint64_t monitor_coprocessor : 1; -#define CR0_MONITOR_COPROCESSOR_BIT 1 -#define CR0_MONITOR_COPROCESSOR_FLAG 0x02 -#define CR0_MONITOR_COPROCESSOR_MASK 0x01 -#define CR0_MONITOR_COPROCESSOR(_) (((_) >> 1) & 0x01) - - /** - * @brief FPU Emulation - * - * [Bit 2] Indicates that the processor does not have an internal or external x87 FPU when set; indicates an x87 FPU is - * present when clear. This flag also affects the execution of MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instructions. - * When the EM flag is set, execution of an x87 FPU instruction generates a device-not-available exception (\#NM). This - * flag must be set when the processor does not have an internal x87 FPU or is not connected to an external math - * coprocessor. Setting this flag forces all floating-point instructions to be handled by software emulation. - * Also, when the EM flag is set, execution of an MMX instruction causes an invalid-opcode exception (\#UD) to be - * generated. Thus, if an IA-32 or Intel 64 processor incorporates MMX technology, the EM flag must be set to 0 to enable - * execution of MMX instructions. Similarly for SSE/SSE2/SSE3/SSSE3/SSE4 extensions, when the EM flag is set, execution of - * most SSE/SSE2/SSE3/SSSE3/SSE4 instructions causes an invalid opcode exception (\#UD) to be generated. If an IA-32 or - * Intel 64 processor incorporates the SSE/SSE2/SSE3/SSSE3/SSE4 extensions, the EM flag must be set to 0 to enable - * execution of these extensions. SSE/SSE2/SSE3/SSSE3/SSE4 instructions not affected by the EM flag include: PAUSE, - * PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI, CLFLUSH, CRC32, and POPCNT. - */ - uint64_t emulate_fpu : 1; -#define CR0_EMULATE_FPU_BIT 2 -#define CR0_EMULATE_FPU_FLAG 0x04 -#define CR0_EMULATE_FPU_MASK 0x01 -#define CR0_EMULATE_FPU(_) (((_) >> 2) & 0x01) - - /** - * @brief Task Switched - * - * [Bit 3] Allows the saving of the x87 FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 context on a task switch to be delayed until an - * x87 FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instruction is actually executed by the new task. The processor sets this flag on - * every task switch and tests it when executing x87 FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instructions. - * - If the TS flag is set and the EM flag (bit 2 of CR0) is clear, a device-not-available exception (\#NM) is raised prior - * to the execution of any x87 FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instruction; with the exception of PAUSE, PREFETCHh, - * SFENCE, LFENCE, MFENCE, MOVNTI, CLFLUSH, CRC32, and POPCNT. - * - If the TS flag is set and the MP flag (bit 1 of CR0) and EM flag are clear, an \#NM exception is not raised prior to - * the execution of an x87 FPU WAIT/FWAIT instruction. - * - If the EM flag is set, the setting of the TS flag has no effect on the execution of x87 - * FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instructions. - * The processor does not automatically save the context of the x87 FPU, XMM, and MXCSR registers on a task switch. - * Instead, it sets the TS flag, which causes the processor to raise an \#NM exception whenever it encounters an x87 - * FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instruction in the instruction stream for the new task (with the exception of the - * instructions listed above). - * The fault handler for the \#NM exception can then be used to clear the TS flag (with the CLTS instruction) and save - * the context of the x87 FPU, XMM, and MXCSR registers. If the task never encounters an x87 - * FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 instruction, the x87 FPU/MMX/SSE/SSE2/SSE3/SSSE3/SSE4 context is never saved. - */ - uint64_t task_switched : 1; -#define CR0_TASK_SWITCHED_BIT 3 -#define CR0_TASK_SWITCHED_FLAG 0x08 -#define CR0_TASK_SWITCHED_MASK 0x01 -#define CR0_TASK_SWITCHED(_) (((_) >> 3) & 0x01) - - /** - * @brief Extension Type - * - * [Bit 4] Reserved in the Pentium 4, Intel Xeon, P6 family, and Pentium processors. In the Pentium 4, Intel Xeon, and P6 - * family processors, this flag is hardcoded to 1. In the Intel386 and Intel486 processors, this flag indicates support of - * Intel 387 DX math coprocessor instructions when set. - */ - uint64_t extension_type : 1; -#define CR0_EXTENSION_TYPE_BIT 4 -#define CR0_EXTENSION_TYPE_FLAG 0x10 -#define CR0_EXTENSION_TYPE_MASK 0x01 -#define CR0_EXTENSION_TYPE(_) (((_) >> 4) & 0x01) - - /** - * @brief Numeric Error - * - * [Bit 5] Enables the native (internal) mechanism for reporting x87 FPU errors when set; enables the PC-style x87 FPU - * error reporting mechanism when clear. When the NE flag is clear and the IGNNE\# input is asserted, x87 FPU errors are - * ignored. When the NE flag is clear and the IGNNE\# input is deasserted, an unmasked x87 FPU error causes the processor - * to assert the FERR\# pin to generate an external interrupt and to stop instruction execution immediately before - * executing the next waiting floating-point instruction or WAIT/FWAIT instruction. - * The FERR\# pin is intended to drive an input to an external interrupt controller (the FERR\# pin emulates the ERROR\# - * pin of the Intel 287 and Intel 387 DX math coprocessors). The NE flag, IGNNE\# pin, and FERR\# pin are used with - * external logic to implement PC-style error reporting. Using FERR\# and IGNNE\# to handle floating-point exceptions is - * deprecated by modern operating systems; this non-native approach also limits newer processors to operate with one - * logical processor active. - * - * @see Vol1[8.7(Handling x87 FPU Exceptions in Software)] - * @see Vol1[A.1(APPENDIX A | EFLAGS Cross-Reference)] - */ - uint64_t numeric_error : 1; -#define CR0_NUMERIC_ERROR_BIT 5 -#define CR0_NUMERIC_ERROR_FLAG 0x20 -#define CR0_NUMERIC_ERROR_MASK 0x01 -#define CR0_NUMERIC_ERROR(_) (((_) >> 5) & 0x01) - uint64_t reserved1 : 10; - - /** - * @brief Write Protect - * - * [Bit 16] When set, inhibits supervisor-level procedures from writing into readonly pages; when clear, allows - * supervisor-level procedures to write into read-only pages (regardless of the U/S bit setting). This flag facilitates - * implementation of the copy-onwrite method of creating a new process (forking) used by operating systems such as UNIX. - * - * @see Vol3A[4.1.3(Paging-Mode Modifiers)] - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint64_t write_protect : 1; -#define CR0_WRITE_PROTECT_BIT 16 -#define CR0_WRITE_PROTECT_FLAG 0x10000 -#define CR0_WRITE_PROTECT_MASK 0x01 -#define CR0_WRITE_PROTECT(_) (((_) >> 16) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief Alignment Mask - * - * [Bit 18] Enables automatic alignment checking when set; disables alignment checking when clear. Alignment checking is - * performed only when the AM flag is set, the AC flag in the EFLAGS register is set, CPL is 3, and the processor is - * operating in either protected or virtual-8086 mode. - */ - uint64_t alignment_mask : 1; -#define CR0_ALIGNMENT_MASK_BIT 18 -#define CR0_ALIGNMENT_MASK_FLAG 0x40000 -#define CR0_ALIGNMENT_MASK_MASK 0x01 -#define CR0_ALIGNMENT_MASK(_) (((_) >> 18) & 0x01) - uint64_t reserved3 : 10; - - /** - * @brief Not Write-through - * - * [Bit 29] When the NW and CD flags are clear, write-back (for Pentium 4, Intel Xeon, P6 family, and Pentium processors) - * or write-through (for Intel486 processors) is enabled for writes that hit the cache and invalidation cycles are enabled. - */ - uint64_t not_write_through : 1; -#define CR0_NOT_WRITE_THROUGH_BIT 29 -#define CR0_NOT_WRITE_THROUGH_FLAG 0x20000000 -#define CR0_NOT_WRITE_THROUGH_MASK 0x01 -#define CR0_NOT_WRITE_THROUGH(_) (((_) >> 29) & 0x01) - - /** - * @brief Cache Disable - * - * [Bit 30] When the CD and NW flags are clear, caching of memory locations for the whole of physical memory in the - * processor's internal (and external) caches is enabled. When the CD flag is set, caching is restricted. To prevent the - * processor from accessing and updating its caches, the CD flag must be set and the caches must be invalidated so that no - * cache hits can occur. - * - * @see Vol3A[11.5.3(Preventing Caching)] - * @see Vol3A[11.5(CACHE CONTROL)] - */ - uint64_t cache_disable : 1; -#define CR0_CACHE_DISABLE_BIT 30 -#define CR0_CACHE_DISABLE_FLAG 0x40000000 -#define CR0_CACHE_DISABLE_MASK 0x01 -#define CR0_CACHE_DISABLE(_) (((_) >> 30) & 0x01) - - /** - * @brief Paging Enable - * - * [Bit 31] Enables paging when set; disables paging when clear. When paging is disabled, all linear addresses are treated - * as physical addresses. The PG flag has no effect if the PE flag (bit 0 of register CR0) is not also set; setting the PG - * flag when the PE flag is clear causes a general-protection exception (\#GP). - * On Intel 64 processors, enabling and disabling IA-32e mode operation also requires modifying CR0.PG. - * - * @see Vol3A[4(PAGING)] - */ - uint64_t paging_enable : 1; -#define CR0_PAGING_ENABLE_BIT 31 -#define CR0_PAGING_ENABLE_FLAG 0x80000000 -#define CR0_PAGING_ENABLE_MASK 0x01 -#define CR0_PAGING_ENABLE(_) (((_) >> 31) & 0x01) - uint64_t reserved4 : 32; - }; - - uint64_t flags; -} cr0; - -typedef union -{ - struct - { - uint64_t reserved1 : 3; - - /** - * @brief Page-level Write-Through - * - * [Bit 3] Controls the memory type used to access the first paging structure of the current paging-structure hierarchy. - * This bit is not used if paging is disabled, with PAE paging, or with 4-level paging if CR4.PCIDE=1. - * - * @see Vol3A[4.9(PAGING AND MEMORY TYPING)] - */ - uint64_t page_level_write_through : 1; -#define CR3_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define CR3_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define CR3_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define CR3_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * @brief Page-level Cache Disable - * - * [Bit 4] Controls the memory type used to access the first paging structure of the current paging-structure hierarchy. - * This bit is not used if paging is disabled, with PAE paging, or with 4-level paging2 if CR4.PCIDE=1. - * - * @see Vol3A[4.9(PAGING AND MEMORY TYPING)] - */ - uint64_t page_level_cache_disable : 1; -#define CR3_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define CR3_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define CR3_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define CR3_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - uint64_t reserved2 : 7; - - /** - * @brief Address of page directory - * - * [Bits 47:12] Physical address of the 4-KByte aligned page directory (32-bit paging) or PML4 table (64-bit paging) used - * for linear-address translation. - * - * @see Vol3A[4.3(32-BIT PAGING)] - * @see Vol3A[4.5(4-LEVEL PAGING)] - */ - uint64_t address_of_page_directory : 36; -#define CR3_ADDRESS_OF_PAGE_DIRECTORY_BIT 12 -#define CR3_ADDRESS_OF_PAGE_DIRECTORY_FLAG 0xFFFFFFFFF000 -#define CR3_ADDRESS_OF_PAGE_DIRECTORY_MASK 0xFFFFFFFFF -#define CR3_ADDRESS_OF_PAGE_DIRECTORY(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved3 : 16; - }; - - uint64_t flags; -} cr3; - -typedef union -{ - struct - { - /** - * @brief Virtual-8086 Mode Extensions - * - * [Bit 0] Enables interrupt- and exception-handling extensions in virtual-8086 mode when set; disables the extensions when - * clear. Use of the virtual mode extensions can improve the performance of virtual-8086 applications by eliminating the - * overhead of calling the virtual- 8086 monitor to handle interrupts and exceptions that occur while executing an 8086 - * program and, instead, redirecting the interrupts and exceptions back to the 8086 program's handlers. It also provides - * hardware support for a virtual interrupt flag (VIF) to improve reliability of running 8086 programs in multitasking and - * multiple-processor environments. - * - * @see Vol3B[20.3(INTERRUPT AND EXCEPTION HANDLING IN VIRTUAL-8086 MODE)] - */ - uint64_t virtual_mode_extensions : 1; -#define CR4_VIRTUAL_MODE_EXTENSIONS_BIT 0 -#define CR4_VIRTUAL_MODE_EXTENSIONS_FLAG 0x01 -#define CR4_VIRTUAL_MODE_EXTENSIONS_MASK 0x01 -#define CR4_VIRTUAL_MODE_EXTENSIONS(_) (((_) >> 0) & 0x01) - - /** - * @brief Protected-Mode Virtual Interrupts - * - * [Bit 1] Enables hardware support for a virtual interrupt flag (VIF) in protected mode when set; disables the VIF flag in - * protected mode when clear. - * - * @see Vol3B[20.4(PROTECTED-MODE VIRTUAL INTERRUPTS)] - */ - uint64_t protected_mode_virtual_interrupts : 1; -#define CR4_PROTECTED_MODE_VIRTUAL_INTERRUPTS_BIT 1 -#define CR4_PROTECTED_MODE_VIRTUAL_INTERRUPTS_FLAG 0x02 -#define CR4_PROTECTED_MODE_VIRTUAL_INTERRUPTS_MASK 0x01 -#define CR4_PROTECTED_MODE_VIRTUAL_INTERRUPTS(_) (((_) >> 1) & 0x01) - - /** - * @brief Time Stamp Disable - * - * [Bit 2] Restricts the execution of the RDTSC instruction to procedures running at privilege level 0 when set; allows - * RDTSC instruction to be executed at any privilege level when clear. This bit also applies to the RDTSCP instruction if - * supported (if CPUID.80000001H:EDX[27] = 1). - */ - uint64_t timestamp_disable : 1; -#define CR4_TIMESTAMP_DISABLE_BIT 2 -#define CR4_TIMESTAMP_DISABLE_FLAG 0x04 -#define CR4_TIMESTAMP_DISABLE_MASK 0x01 -#define CR4_TIMESTAMP_DISABLE(_) (((_) >> 2) & 0x01) - - /** - * @brief Debugging Extensions - * - * [Bit 3] References to debug registers DR4 and DR5 cause an undefined opcode (\#UD) exception to be generated when set; - * when clear, processor aliases references to registers DR4 and DR5 for compatibility with software written to run on - * earlier IA-32 processors. - * - * @see Vol3B[17.2.2(Debug Registers DR4 and DR5)] - */ - uint64_t debugging_extensions : 1; -#define CR4_DEBUGGING_EXTENSIONS_BIT 3 -#define CR4_DEBUGGING_EXTENSIONS_FLAG 0x08 -#define CR4_DEBUGGING_EXTENSIONS_MASK 0x01 -#define CR4_DEBUGGING_EXTENSIONS(_) (((_) >> 3) & 0x01) - - /** - * @brief Page Size Extensions - * - * [Bit 4] Enables 4-MByte pages with 32-bit paging when set; restricts 32-bit paging to pages of 4 KBytes when clear. - * - * @see Vol3A[4.3(32-BIT PAGING)] - */ - uint64_t page_size_extensions : 1; -#define CR4_PAGE_SIZE_EXTENSIONS_BIT 4 -#define CR4_PAGE_SIZE_EXTENSIONS_FLAG 0x10 -#define CR4_PAGE_SIZE_EXTENSIONS_MASK 0x01 -#define CR4_PAGE_SIZE_EXTENSIONS(_) (((_) >> 4) & 0x01) - - /** - * @brief Physical Address Extension - * - * [Bit 5] When set, enables paging to produce physical addresses with more than 32 bits. When clear, restricts physical - * addresses to 32 bits. PAE must be set before entering IA-32e mode. - * - * @see Vol3A[4(PAGING)] - */ - uint64_t physical_address_extension : 1; -#define CR4_PHYSICAL_ADDRESS_EXTENSION_BIT 5 -#define CR4_PHYSICAL_ADDRESS_EXTENSION_FLAG 0x20 -#define CR4_PHYSICAL_ADDRESS_EXTENSION_MASK 0x01 -#define CR4_PHYSICAL_ADDRESS_EXTENSION(_) (((_) >> 5) & 0x01) - - /** - * @brief Machine-Check Enable - * - * [Bit 6] Enables the machine-check exception when set; disables the machine-check exception when clear. - * - * @see Vol3B[15(MACHINE-CHECK ARCHITECTURE)] - */ - uint64_t machine_check_enable : 1; -#define CR4_MACHINE_CHECK_ENABLE_BIT 6 -#define CR4_MACHINE_CHECK_ENABLE_FLAG 0x40 -#define CR4_MACHINE_CHECK_ENABLE_MASK 0x01 -#define CR4_MACHINE_CHECK_ENABLE(_) (((_) >> 6) & 0x01) - - /** - * @brief Page Global Enable - * - * [Bit 7] (Introduced in the P6 family processors.) Enables the global page feature when set; disables the global page - * feature when clear. The global page feature allows frequently used or shared pages to be marked as global to all users - * (done with the global flag, bit 8, in a page-directory or page-table entry). Global pages are not flushed from the - * translation-lookaside buffer (TLB) on a task switch or a write to register CR3. When enabling the global page feature, - * paging must be enabled (by setting the PG flag in control register CR0) before the PGE flag is set. Reversing this - * sequence may affect program correctness, and processor performance will be impacted. - * - * @see Vol3A[4.10(CACHING TRANSLATION INFORMATION)] - */ - uint64_t page_global_enable : 1; -#define CR4_PAGE_GLOBAL_ENABLE_BIT 7 -#define CR4_PAGE_GLOBAL_ENABLE_FLAG 0x80 -#define CR4_PAGE_GLOBAL_ENABLE_MASK 0x01 -#define CR4_PAGE_GLOBAL_ENABLE(_) (((_) >> 7) & 0x01) - - /** - * @brief Performance-Monitoring Counter Enable - * - * [Bit 8] Enables execution of the RDPMC instruction for programs or procedures running at any protection level when set; - * RDPMC instruction can be executed only at protection level 0 when clear. - */ - uint64_t performance_monitoring_counter_enable : 1; -#define CR4_PERFORMANCE_MONITORING_COUNTER_ENABLE_BIT 8 -#define CR4_PERFORMANCE_MONITORING_COUNTER_ENABLE_FLAG 0x100 -#define CR4_PERFORMANCE_MONITORING_COUNTER_ENABLE_MASK 0x01 -#define CR4_PERFORMANCE_MONITORING_COUNTER_ENABLE(_) (((_) >> 8) & 0x01) - - /** - * @brief Operating System Support for FXSAVE and FXRSTOR instructions - * - * [Bit 9] When set, this flag: - * -# indicates to software that the operating system supports the use of the FXSAVE and FXRSTOR instructions, - * -# enables the FXSAVE and FXRSTOR instructions to save and restore the contents of the XMM and MXCSR registers along - * with the contents of the x87 FPU and MMX registers, and - * -# enables the processor to execute SSE/SSE2/SSE3/SSSE3/SSE4 instructions, with the exception of the PAUSE, PREFETCHh, - * SFENCE, LFENCE, MFENCE, MOVNTI, CLFLUSH, CRC32, and POPCNT. - * If this flag is clear, the FXSAVE and FXRSTOR instructions will save and restore the contents of the x87 FPU and MMX - * registers, but they may not save and restore the contents of the XMM and MXCSR registers. Also, the processor will - * generate an invalid opcode exception (\#UD) if it attempts to execute any SSE/SSE2/SSE3 instruction, with the exception - * of PAUSE, PREFETCHh, SFENCE, LFENCE, MFENCE, MOVNTI, CLFLUSH, CRC32, and POPCNT. The operating system or executive must - * explicitly set this flag. - * - * @remarks CPUID feature flag FXSR indicates availability of the FXSAVE/FXRSTOR instructions. The OSFXSR bit provides - * operating system software with a means of enabling FXSAVE/FXRSTOR to save/restore the contents of the X87 FPU, XMM and - * MXCSR registers. Consequently OSFXSR bit indicates that the operating system provides context switch support for - * SSE/SSE2/SSE3/SSSE3/SSE4. - */ - uint64_t os_fxsave_fxrstor_support : 1; -#define CR4_OS_FXSAVE_FXRSTOR_SUPPORT_BIT 9 -#define CR4_OS_FXSAVE_FXRSTOR_SUPPORT_FLAG 0x200 -#define CR4_OS_FXSAVE_FXRSTOR_SUPPORT_MASK 0x01 -#define CR4_OS_FXSAVE_FXRSTOR_SUPPORT(_) (((_) >> 9) & 0x01) - - /** - * @brief Operating System Support for Unmasked SIMD Floating-Point Exceptions - * - * [Bit 10] Operating System Support for Unmasked SIMD Floating-Point Exceptions - When set, indicates that the operating - * system supports the handling of unmasked SIMD floating-point exceptions through an exception handler that is invoked - * when a SIMD floating-point exception (\#XM) is generated. SIMD floating-point exceptions are only generated by - * SSE/SSE2/SSE3/SSE4.1 SIMD floatingpoint instructions. - * The operating system or executive must explicitly set this flag. If this flag is not set, the processor will generate an - * invalid opcode exception (\#UD) whenever it detects an unmasked SIMD floating-point exception. - */ - uint64_t os_xmm_exception_support : 1; -#define CR4_OS_XMM_EXCEPTION_SUPPORT_BIT 10 -#define CR4_OS_XMM_EXCEPTION_SUPPORT_FLAG 0x400 -#define CR4_OS_XMM_EXCEPTION_SUPPORT_MASK 0x01 -#define CR4_OS_XMM_EXCEPTION_SUPPORT(_) (((_) >> 10) & 0x01) - - /** - * @brief User-Mode Instruction Prevention - * - * [Bit 11] When set, the following instructions cannot be executed if CPL > 0: SGDT, SIDT, SLDT, SMSW, and STR. An attempt - * at such execution causes a generalprotection exception (\#GP). - */ - uint64_t usermode_instruction_prevention : 1; -#define CR4_USERMODE_INSTRUCTION_PREVENTION_BIT 11 -#define CR4_USERMODE_INSTRUCTION_PREVENTION_FLAG 0x800 -#define CR4_USERMODE_INSTRUCTION_PREVENTION_MASK 0x01 -#define CR4_USERMODE_INSTRUCTION_PREVENTION(_) (((_) >> 11) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief VMX-Enable - * - * [Bit 13] Enables VMX operation when set. - * - * @see Vol3C[23(INTRODUCTION TO VIRTUAL MACHINE EXTENSIONS)] - */ - uint64_t vmx_enable : 1; -#define CR4_VMX_ENABLE_BIT 13 -#define CR4_VMX_ENABLE_FLAG 0x2000 -#define CR4_VMX_ENABLE_MASK 0x01 -#define CR4_VMX_ENABLE(_) (((_) >> 13) & 0x01) - - /** - * @brief SMX-Enable - * - * [Bit 14] Enables SMX operation when set. - * - * @see Vol2[6(SAFER MODE EXTENSIONS REFERENCE)] - */ - uint64_t smx_enable : 1; -#define CR4_SMX_ENABLE_BIT 14 -#define CR4_SMX_ENABLE_FLAG 0x4000 -#define CR4_SMX_ENABLE_MASK 0x01 -#define CR4_SMX_ENABLE(_) (((_) >> 14) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief FSGSBASE-Enable - * - * [Bit 16] Enables the instructions RDFSBASE, RDGSBASE, WRFSBASE, and WRGSBASE. - */ - uint64_t fsgsbase_enable : 1; -#define CR4_FSGSBASE_ENABLE_BIT 16 -#define CR4_FSGSBASE_ENABLE_FLAG 0x10000 -#define CR4_FSGSBASE_ENABLE_MASK 0x01 -#define CR4_FSGSBASE_ENABLE(_) (((_) >> 16) & 0x01) - - /** - * @brief PCID-Enable - * - * [Bit 17] Enables process-context identifiers (PCIDs) when set. Can be set only in IA-32e mode (if IA32_EFER.LMA = 1). - * - * @see Vol3A[4.10.1(Process-Context Identifiers (PCIDs))] - */ - uint64_t pcid_enable : 1; -#define CR4_PCID_ENABLE_BIT 17 -#define CR4_PCID_ENABLE_FLAG 0x20000 -#define CR4_PCID_ENABLE_MASK 0x01 -#define CR4_PCID_ENABLE(_) (((_) >> 17) & 0x01) - - /** - * @brief XSAVE and Processor Extended States-Enable - * - * [Bit 18] When set, this flag: - * -# indicates (via CPUID.01H:ECX.OSXSAVE[bit 27]) that the operating system supports the use of the XGETBV, XSAVE and - * XRSTOR instructions by general software; - * -# enables the XSAVE and XRSTOR instructions to save and restore the x87 FPU state (including MMX registers), the SSE - * state (XMM registers and MXCSR), along with other processor extended states enabled in XCR0; - * -# enables the processor to execute XGETBV and XSETBV instructions in order to read and write XCR0. - * - * @see Vol3A[2.6(EXTENDED CONTROL REGISTERS (INCLUDING XCR0))] - * @see Vol3A[13(SYSTEM PROGRAMMING FOR INSTRUCTION SET EXTENSIONS AND PROCESSOR EXTENDED)] - */ - uint64_t os_xsave : 1; -#define CR4_OS_XSAVE_BIT 18 -#define CR4_OS_XSAVE_FLAG 0x40000 -#define CR4_OS_XSAVE_MASK 0x01 -#define CR4_OS_XSAVE(_) (((_) >> 18) & 0x01) - uint64_t reserved3 : 1; - - /** - * @brief SMEP-Enable - * - * [Bit 20] Enables supervisor-mode execution prevention (SMEP) when set. - * - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint64_t smep_enable : 1; -#define CR4_SMEP_ENABLE_BIT 20 -#define CR4_SMEP_ENABLE_FLAG 0x100000 -#define CR4_SMEP_ENABLE_MASK 0x01 -#define CR4_SMEP_ENABLE(_) (((_) >> 20) & 0x01) - - /** - * @brief SMAP-Enable - * - * [Bit 21] Enables supervisor-mode access prevention (SMAP) when set. - * - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint64_t smap_enable : 1; -#define CR4_SMAP_ENABLE_BIT 21 -#define CR4_SMAP_ENABLE_FLAG 0x200000 -#define CR4_SMAP_ENABLE_MASK 0x01 -#define CR4_SMAP_ENABLE(_) (((_) >> 21) & 0x01) - - /** - * @brief Protection-Key-Enable - * - * [Bit 22] Enables 4-level paging to associate each linear address with a protection key. The PKRU register specifies, for - * each protection key, whether user-mode linear addresses with that protection key can be read or written. This bit also - * enables access to the PKRU register using the RDPKRU and WRPKRU instructions. - */ - uint64_t protection_key_enable : 1; -#define CR4_PROTECTION_KEY_ENABLE_BIT 22 -#define CR4_PROTECTION_KEY_ENABLE_FLAG 0x400000 -#define CR4_PROTECTION_KEY_ENABLE_MASK 0x01 -#define CR4_PROTECTION_KEY_ENABLE(_) (((_) >> 22) & 0x01) - uint64_t reserved4 : 41; - }; - - uint64_t flags; -} cr4; - -typedef union -{ - struct - { - /** - * @brief Task Priority Level - * - * [Bits 3:0] This sets the threshold value corresponding to the highestpriority interrupt to be blocked. A value of 0 - * means all interrupts are enabled. This field is available in 64- bit mode. A value of 15 means all interrupts will be - * disabled. - */ - uint64_t task_priority_level : 4; -#define CR8_TASK_PRIORITY_LEVEL_BIT 0 -#define CR8_TASK_PRIORITY_LEVEL_FLAG 0x0F -#define CR8_TASK_PRIORITY_LEVEL_MASK 0x0F -#define CR8_TASK_PRIORITY_LEVEL(_) (((_) >> 0) & 0x0F) - - /** - * @brief Reserved - * - * [Bits 63:4] Reserved and must be written with zeros. Failure to do this causes a general-protection exception. - */ - uint64_t reserved : 60; -#define CR8_RESERVED_BIT 4 -#define CR8_RESERVED_FLAG 0xFFFFFFFFFFFFFFF0 -#define CR8_RESERVED_MASK 0xFFFFFFFFFFFFFFF -#define CR8_RESERVED(_) (((_) >> 4) & 0xFFFFFFFFFFFFFFF) - }; - - uint64_t flags; -} cr8; - -/** - * @} - */ - - /** - * @defgroup debug_registers \ - * Debug registers - * - * Eight debug registers control the debug operation of the processor. These registers can be written to and read using the - * move to/from debug register form of the MOV instruction. A debug register may be the source or destination operand for - * one of these instructions. - * Debug registers are privileged resources; a MOV instruction that accesses these registers can only be executed in - * real-address mode, in SMM or in protected mode at a CPL of 0. An attempt to read or write the debug registers from any - * other privilege level generates a general-protection exception (\#GP). The primary function of the debug registers is to - * set up and monitor from 1 to 4 breakpoints, numbered 0 though 3. For each breakpoint, the following information can be - * specified: - * - The linear address where the breakpoint is to occur. - * - The length of the breakpoint location: 1, 2, 4, or 8 bytes. - * - The operation that must be performed at the address for a debug exception to be generated. - * - Whether the breakpoint is enabled. - * - Whether the breakpoint condition was present when the debug exception was generated. - * - * @see Vol3B[17.2.4(Debug Control Register (DR7))] - * @see Vol3B[17.2(DEBUG REGISTERS)] (reference) - * @{ - */ -typedef union -{ - struct - { - /** - * @brief B0 through B3 (breakpoint condition detected) flags - * - * [Bits 3:0] Indicates (when set) that its associated breakpoint condition was met when a debug exception was generated. - * These flags are set if the condition described for each breakpoint by the LENn, and R/Wn flags in debug control register - * DR7 is true. They may or may not be set if the breakpoint is not enabled by the Ln or the Gn flags in register DR7. - * Therefore on a \#DB, a debug handler should check only those B0-B3 bits which correspond to an enabled breakpoint. - */ - uint64_t breakpoint_condition : 4; -#define DR6_BREAKPOINT_CONDITION_BIT 0 -#define DR6_BREAKPOINT_CONDITION_FLAG 0x0F -#define DR6_BREAKPOINT_CONDITION_MASK 0x0F -#define DR6_BREAKPOINT_CONDITION(_) (((_) >> 0) & 0x0F) - uint64_t reserved1 : 9; - - /** - * @brief BD (debug register access detected) flag - * - * [Bit 13] Indicates that the next instruction in the instruction stream accesses one of the debug registers (DR0 through - * DR7). This flag is enabled when the GD (general detect) flag in debug control register DR7 is set. - * - * @see Vol3B[17.2.4(Debug Control Register (DR7))] - */ - uint64_t debug_register_access_detected : 1; -#define DR6_DEBUG_REGISTER_ACCESS_DETECTED_BIT 13 -#define DR6_DEBUG_REGISTER_ACCESS_DETECTED_FLAG 0x2000 -#define DR6_DEBUG_REGISTER_ACCESS_DETECTED_MASK 0x01 -#define DR6_DEBUG_REGISTER_ACCESS_DETECTED(_) (((_) >> 13) & 0x01) - - /** - * @brief BS (single step) flag - * - * [Bit 14] Indicates (when set) that the debug exception was triggered by the singlestep execution mode (enabled with the - * TF flag in the EFLAGS register). The single-step mode is the highestpriority debug exception. When the BS flag is set, - * any of the other debug status bits also may be set. - */ - uint64_t single_instruction : 1; -#define DR6_SINGLE_INSTRUCTION_BIT 14 -#define DR6_SINGLE_INSTRUCTION_FLAG 0x4000 -#define DR6_SINGLE_INSTRUCTION_MASK 0x01 -#define DR6_SINGLE_INSTRUCTION(_) (((_) >> 14) & 0x01) - - /** - * @brief BT (task switch) flag - * - * [Bit 15] Indicates (when set) that the debug exception was triggered by the singlestep execution mode (enabled with the - * TF flag in the EFLAGS register). The single-step mode is the highestpriority debug exception. When the BS flag is set, - * any of the other debug status bits also may be set. - */ - uint64_t task_switch : 1; -#define DR6_TASK_SWITCH_BIT 15 -#define DR6_TASK_SWITCH_FLAG 0x8000 -#define DR6_TASK_SWITCH_MASK 0x01 -#define DR6_TASK_SWITCH(_) (((_) >> 15) & 0x01) - - /** - * @brief RTM (restricted transactional memory) flag - * - * [Bit 16] Indicates (when clear) that a debug exception (\#DB) or breakpoint exception (\#BP) occurred inside an RTM - * region while advanced debugging of RTM transactional regions was enabled. This bit is set for any other debug exception - * (including all those that occur when advanced debugging of RTM transactional regions is not enabled). This bit is always - * 1 if the processor does not support RTM. - * - * @see Vol3B[17.3.3(Debug Exceptions, Breakpoint Exceptions, and Restricted Transactional Memory (RTM))] - */ - uint64_t restricted_transactional_memory : 1; -#define DR6_RESTRICTED_TRANSACTIONAL_MEMORY_BIT 16 -#define DR6_RESTRICTED_TRANSACTIONAL_MEMORY_FLAG 0x10000 -#define DR6_RESTRICTED_TRANSACTIONAL_MEMORY_MASK 0x01 -#define DR6_RESTRICTED_TRANSACTIONAL_MEMORY(_) (((_) >> 16) & 0x01) - uint64_t reserved2 : 47; - }; - - uint64_t flags; -} dr6; - -typedef union -{ - struct - { - /** - * @brief L0 through L3 (local breakpoint enable) flags (bits 0, 2, 4, and 6) - * - * [Bit 0] Enables (when set) the breakpoint condition for the associated breakpoint for the current task. When a - * breakpoint condition is detected and its associated Ln flag is set, a debug exception is generated. The processor - * automatically clears these flags on every task switch to avoid unwanted breakpoint conditions in the new task. - */ - uint64_t local_breakpoint_0 : 1; -#define DR7_LOCAL_BREAKPOINT_0_BIT 0 -#define DR7_LOCAL_BREAKPOINT_0_FLAG 0x01 -#define DR7_LOCAL_BREAKPOINT_0_MASK 0x01 -#define DR7_LOCAL_BREAKPOINT_0(_) (((_) >> 0) & 0x01) - - /** - * @brief G0 through G3 (global breakpoint enable) flags (bits 1, 3, 5, and 7) - * - * [Bit 1] Enables (when set) the breakpoint condition for the associated breakpoint for all tasks. When a breakpoint - * condition is detected and its associated Gn flag is set, a debug exception is generated. The processor does not clear - * these flags on a task switch, allowing a breakpoint to be enabled for all tasks. - */ - uint64_t global_breakpoint_0 : 1; -#define DR7_GLOBAL_BREAKPOINT_0_BIT 1 -#define DR7_GLOBAL_BREAKPOINT_0_FLAG 0x02 -#define DR7_GLOBAL_BREAKPOINT_0_MASK 0x01 -#define DR7_GLOBAL_BREAKPOINT_0(_) (((_) >> 1) & 0x01) - uint64_t local_breakpoint_1 : 1; -#define DR7_LOCAL_BREAKPOINT_1_BIT 2 -#define DR7_LOCAL_BREAKPOINT_1_FLAG 0x04 -#define DR7_LOCAL_BREAKPOINT_1_MASK 0x01 -#define DR7_LOCAL_BREAKPOINT_1(_) (((_) >> 2) & 0x01) - uint64_t global_breakpoint_1 : 1; -#define DR7_GLOBAL_BREAKPOINT_1_BIT 3 -#define DR7_GLOBAL_BREAKPOINT_1_FLAG 0x08 -#define DR7_GLOBAL_BREAKPOINT_1_MASK 0x01 -#define DR7_GLOBAL_BREAKPOINT_1(_) (((_) >> 3) & 0x01) - uint64_t local_breakpoint_2 : 1; -#define DR7_LOCAL_BREAKPOINT_2_BIT 4 -#define DR7_LOCAL_BREAKPOINT_2_FLAG 0x10 -#define DR7_LOCAL_BREAKPOINT_2_MASK 0x01 -#define DR7_LOCAL_BREAKPOINT_2(_) (((_) >> 4) & 0x01) - uint64_t global_breakpoint_2 : 1; -#define DR7_GLOBAL_BREAKPOINT_2_BIT 5 -#define DR7_GLOBAL_BREAKPOINT_2_FLAG 0x20 -#define DR7_GLOBAL_BREAKPOINT_2_MASK 0x01 -#define DR7_GLOBAL_BREAKPOINT_2(_) (((_) >> 5) & 0x01) - uint64_t local_breakpoint_3 : 1; -#define DR7_LOCAL_BREAKPOINT_3_BIT 6 -#define DR7_LOCAL_BREAKPOINT_3_FLAG 0x40 -#define DR7_LOCAL_BREAKPOINT_3_MASK 0x01 -#define DR7_LOCAL_BREAKPOINT_3(_) (((_) >> 6) & 0x01) - uint64_t global_breakpoint_3 : 1; -#define DR7_GLOBAL_BREAKPOINT_3_BIT 7 -#define DR7_GLOBAL_BREAKPOINT_3_FLAG 0x80 -#define DR7_GLOBAL_BREAKPOINT_3_MASK 0x01 -#define DR7_GLOBAL_BREAKPOINT_3(_) (((_) >> 7) & 0x01) - - /** - * @brief LE (local exact breakpoint enable) - * - * [Bit 8] This feature is not supported in the P6 family processors, later IA-32 processors, and Intel 64 processors. When - * set, these flags cause the processor to detect the exact instruction that caused a data breakpoint condition. For - * backward and forward compatibility with other Intel processors, we recommend that the LE and GE flags be set to 1 if - * exact breakpoints are required. - */ - uint64_t local_exact_breakpoint : 1; -#define DR7_LOCAL_EXACT_BREAKPOINT_BIT 8 -#define DR7_LOCAL_EXACT_BREAKPOINT_FLAG 0x100 -#define DR7_LOCAL_EXACT_BREAKPOINT_MASK 0x01 -#define DR7_LOCAL_EXACT_BREAKPOINT(_) (((_) >> 8) & 0x01) - uint64_t global_exact_breakpoint : 1; -#define DR7_GLOBAL_EXACT_BREAKPOINT_BIT 9 -#define DR7_GLOBAL_EXACT_BREAKPOINT_FLAG 0x200 -#define DR7_GLOBAL_EXACT_BREAKPOINT_MASK 0x01 -#define DR7_GLOBAL_EXACT_BREAKPOINT(_) (((_) >> 9) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief RTM (restricted transactional memory) flag - * - * [Bit 11] Enables (when set) advanced debugging of RTM transactional regions. This advanced debugging is enabled only if - * IA32_DEBUGCTL.RTM is also set. - * - * @see Vol3B[17.3.3(Debug Exceptions, Breakpoint Exceptions, and Restricted Transactional Memory (RTM))] - */ - uint64_t restricted_transactional_memory : 1; -#define DR7_RESTRICTED_TRANSACTIONAL_MEMORY_BIT 11 -#define DR7_RESTRICTED_TRANSACTIONAL_MEMORY_FLAG 0x800 -#define DR7_RESTRICTED_TRANSACTIONAL_MEMORY_MASK 0x01 -#define DR7_RESTRICTED_TRANSACTIONAL_MEMORY(_) (((_) >> 11) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief GD (general detect enable) flag - * - * [Bit 13] Enables (when set) debug-register protection, which causes a debug exception to be generated prior to any MOV - * instruction that accesses a debug register. When such a condition is detected, the BD flag in debug status register DR6 - * is set prior to generating the exception. This condition is provided to support in-circuit emulators. - * When the emulator needs to access the debug registers, emulator software can set the GD flag to prevent interference - * from the program currently executing on the processor. - * The processor clears the GD flag upon entering to the debug exception handler, to allow the handler access to the debug - * registers. - */ - uint64_t general_detect : 1; -#define DR7_GENERAL_DETECT_BIT 13 -#define DR7_GENERAL_DETECT_FLAG 0x2000 -#define DR7_GENERAL_DETECT_MASK 0x01 -#define DR7_GENERAL_DETECT(_) (((_) >> 13) & 0x01) - uint64_t reserved3 : 2; - - /** - * @brief R/W0 through R/W3 (read/write) fields (bits 16, 17, 20, 21, 24, 25, 28, and 29) - * - * [Bits 17:16] Specifies the breakpoint condition for the corresponding breakpoint. The DE (debug extensions) flag in - * control register CR4 determines how the bits in the R/Wn fields are interpreted. When the DE flag is set, the processor - * interprets bits as follows: - * - 00 - Break on instruction execution only. - * - 01 - Break on data writes only. - * - 10 - Break on I/O reads or writes. - * - 11 - Break on data reads or writes but not instruction fetches. - * When the DE flag is clear, the processor interprets the R/Wn bits the same as for the Intel386(TM) and Intel486(TM) - * processors, which is as follows: - * - 00 - Break on instruction execution only. - * - 01 - Break on data writes only. - * - 10 - Undefined. - * - 11 - Break on data reads or writes but not instruction fetches. - */ - uint64_t read_write_0 : 2; -#define DR7_READ_WRITE_0_BIT 16 -#define DR7_READ_WRITE_0_FLAG 0x30000 -#define DR7_READ_WRITE_0_MASK 0x03 -#define DR7_READ_WRITE_0(_) (((_) >> 16) & 0x03) - - /** - * @brief LEN0 through LEN3 (Length) fields (bits 18, 19, 22, 23, 26, 27, 30, and 31) - * - * [Bits 19:18] Specify the size of the memory location at the address specified in the corresponding breakpoint address - * register (DR0 through DR3). These fields are interpreted as follows: - * - 00 - 1-byte length. - * - 01 - 2-byte length. - * - 10 - Undefined (or 8 byte length, see note below). - * - 11 - 4-byte length. - * If the corresponding RWn field in register DR7 is 00 (instruction execution), then the LENn field should also be 00. The - * effect of using other lengths is undefined. - * - * @see Vol3B[17.2.5(Breakpoint Field Recognition)] - */ - uint64_t length_0 : 2; -#define DR7_LENGTH_0_BIT 18 -#define DR7_LENGTH_0_FLAG 0xC0000 -#define DR7_LENGTH_0_MASK 0x03 -#define DR7_LENGTH_0(_) (((_) >> 18) & 0x03) - uint64_t read_write_1 : 2; -#define DR7_READ_WRITE_1_BIT 20 -#define DR7_READ_WRITE_1_FLAG 0x300000 -#define DR7_READ_WRITE_1_MASK 0x03 -#define DR7_READ_WRITE_1(_) (((_) >> 20) & 0x03) - uint64_t length_1 : 2; -#define DR7_LENGTH_1_BIT 22 -#define DR7_LENGTH_1_FLAG 0xC00000 -#define DR7_LENGTH_1_MASK 0x03 -#define DR7_LENGTH_1(_) (((_) >> 22) & 0x03) - uint64_t read_write_2 : 2; -#define DR7_READ_WRITE_2_BIT 24 -#define DR7_READ_WRITE_2_FLAG 0x3000000 -#define DR7_READ_WRITE_2_MASK 0x03 -#define DR7_READ_WRITE_2(_) (((_) >> 24) & 0x03) - uint64_t length_2 : 2; -#define DR7_LENGTH_2_BIT 26 -#define DR7_LENGTH_2_FLAG 0xC000000 -#define DR7_LENGTH_2_MASK 0x03 -#define DR7_LENGTH_2(_) (((_) >> 26) & 0x03) - uint64_t read_write_3 : 2; -#define DR7_READ_WRITE_3_BIT 28 -#define DR7_READ_WRITE_3_FLAG 0x30000000 -#define DR7_READ_WRITE_3_MASK 0x03 -#define DR7_READ_WRITE_3(_) (((_) >> 28) & 0x03) - uint64_t length_3 : 2; -#define DR7_LENGTH_3_BIT 30 -#define DR7_LENGTH_3_FLAG 0xC0000000 -#define DR7_LENGTH_3_MASK 0x03 -#define DR7_LENGTH_3(_) (((_) >> 30) & 0x03) - uint64_t reserved4 : 32; - }; - - uint64_t flags; -} dr7; - -/** - * @} - */ - - /** - * @defgroup cpuid \ - * CPUID - * - * @see Vol2A[3.2(CPUID)] (reference) - * @{ - */ - /** - * @brief Returns CPUID's Highest Value for Basic Processor Information and the Vendor Identification String - * - * When CPUID executes with EAX set to 0, the processor returns the highest value the CPUID recognizes for returning basic - * processor information. The value is returned in the EAX register and is processor specific. - * A vendor identification string is also returned in EBX, EDX, and ECX. For Intel processors, the string is "GenuineIntel" - * and is expressed: - * - EBX <- 756e6547h (* "Genu", with G in the low eight bits of BL *) - * - EDX <- 49656e69h (* "ineI", with i in the low eight bits of DL *) - * - ECX <- 6c65746eh (* "ntel", with n in the low eight bits of CL *) - */ -#define CPUID_SIGNATURE 0x00000000 -typedef struct -{ - /** - * @brief EAX - * - * Maximum Input Value for Basic CPUID Information. - */ - uint32_t max_cpuid_input_value; - - /** - * @brief EBX - * - * "Genu" - */ - uint32_t ebx_value_genu; - - /** - * @brief ECX - * - * "ntel" - */ - uint32_t ecx_value_ntel; - - /** - * @brief EDX - * - * "ineI" - */ - uint32_t edx_value_inei; -} cpuid_eax_00; - - -/** - * @brief Returns Model, Family, Stepping Information, Additional Information and Feature Information - * - * Returns: - * * Model, Family, Stepping Information in EAX - * * Additional Information in EBX - * * Feature Information in ECX and EDX - */ -#define CPUID_VERSION_INFORMATION 0x00000001 -typedef struct -{ - /** - * @brief When CPUID executes with EAX set to 01H, version information is returned in EAX - */ - union - { - struct - { - uint32_t stepping_id : 4; -#define CPUID_VERSION_INFORMATION_STEPPING_ID_BIT 0 -#define CPUID_VERSION_INFORMATION_STEPPING_ID_FLAG 0x0F -#define CPUID_VERSION_INFORMATION_STEPPING_ID_MASK 0x0F -#define CPUID_VERSION_INFORMATION_STEPPING_ID(_) (((_) >> 0) & 0x0F) - uint32_t model : 4; -#define CPUID_VERSION_INFORMATION_MODEL_BIT 4 -#define CPUID_VERSION_INFORMATION_MODEL_FLAG 0xF0 -#define CPUID_VERSION_INFORMATION_MODEL_MASK 0x0F -#define CPUID_VERSION_INFORMATION_MODEL(_) (((_) >> 4) & 0x0F) - uint32_t family_id : 4; -#define CPUID_VERSION_INFORMATION_FAMILY_ID_BIT 8 -#define CPUID_VERSION_INFORMATION_FAMILY_ID_FLAG 0xF00 -#define CPUID_VERSION_INFORMATION_FAMILY_ID_MASK 0x0F -#define CPUID_VERSION_INFORMATION_FAMILY_ID(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 13:12] - 0 - Original OEM Processor - * - 1 - Intel OverDrive(R) Processor - * - 2 - Dual processor (not applicable to Intel486 processors) - * - 3 - Intel reserved - */ - uint32_t processor_type : 2; -#define CPUID_VERSION_INFORMATION_PROCESSOR_TYPE_BIT 12 -#define CPUID_VERSION_INFORMATION_PROCESSOR_TYPE_FLAG 0x3000 -#define CPUID_VERSION_INFORMATION_PROCESSOR_TYPE_MASK 0x03 -#define CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(_) (((_) >> 12) & 0x03) - uint32_t reserved1 : 2; - - /** - * [Bits 19:16] The Extended Model ID needs to be examined only when the Family ID is 06H or 0FH. - */ - uint32_t extended_model_id : 4; -#define CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID_BIT 16 -#define CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID_FLAG 0xF0000 -#define CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID_MASK 0x0F -#define CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(_) (((_) >> 16) & 0x0F) - - /** - * [Bits 27:20] The Extended Family ID needs to be examined only when the Family ID is 0FH. - */ - uint32_t extended_family_id : 8; -#define CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID_BIT 20 -#define CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID_FLAG 0xFF00000 -#define CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID_MASK 0xFF -#define CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(_) (((_) >> 20) & 0xFF) - uint32_t reserved2 : 4; - }; - - uint32_t flags; - } cpuid_version_information; - - /** - * @brief When CPUID executes with EAX set to 01H, additional information is returned to the EBX register - */ - union - { - struct - { - /** - * [Bits 7:0] This number provides an entry into a brand string table that contains brand strings for IA-32 processors. - * More information about this field is provided later in this section. - */ - uint32_t brand_index : 8; -#define CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX_BIT 0 -#define CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX_FLAG 0xFF -#define CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX_MASK 0xFF -#define CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(_) (((_) >> 0) & 0xFF) - - /** - * @brief Value * 8 = cache line size in bytes; used also by CLFLUSHOPT - * - * [Bits 15:8] This number indicates the size of the cache line flushed by the CLFLUSH and CLFLUSHOPT instructions in - * 8-byte increments. This field was introduced in the Pentium 4 processor. - */ - uint32_t clflush_line_size : 8; -#define CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE_BIT 8 -#define CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE_FLAG 0xFF00 -#define CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE_MASK 0xFF -#define CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(_) (((_) >> 8) & 0xFF) - - /** - * [Bits 23:16] Maximum number of addressable IDs for logical processors in this physical package. - * - * @remarks The nearest power-of-2 integer that is not smaller than EBX[23:16] is the number of unique initial APIC IDs - * reserved for addressing different logical processors in a physical package. This field is only valid if - * CPUID.1.EDX.HTT[bit 28] = 1. - */ - uint32_t max_addressable_ids : 8; -#define CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS_BIT 16 -#define CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS_FLAG 0xFF0000 -#define CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS_MASK 0xFF -#define CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(_) (((_) >> 16) & 0xFF) - - /** - * [Bits 31:24] This number is the 8-bit ID that is assigned to the local APIC on the processor during power up. This field - * was introduced in the Pentium 4 processor. - */ - uint32_t initial_apic_id : 8; -#define CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID_BIT 24 -#define CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID_FLAG 0xFF000000 -#define CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID_MASK 0xFF -#define CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(_) (((_) >> 24) & 0xFF) - }; - - uint32_t flags; - } cpuid_additional_information; - - /** - * @brief When CPUID executes with EAX set to 01H, feature information is returned in ECX and EDX - */ - union - { - struct - { - /** - * @brief Streaming SIMD Extensions 3 (SSE3) - * - * [Bit 0] A value of 1 indicates the processor supports this technology. - */ - uint32_t streaming_simd_extensions_3 : 1; -#define CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3_BIT 0 -#define CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3_FLAG 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(_) (((_) >> 0) & 0x01) - - /** - * @brief PCLMULQDQ instruction - * - * [Bit 1] A value of 1 indicates the processor supports the PCLMULQDQ instruction. - */ - uint32_t pclmulqdq_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION_BIT 1 -#define CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION_FLAG 0x02 -#define CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(_) (((_) >> 1) & 0x01) - - /** - * @brief 64-bit DS Area - * - * [Bit 2] A value of 1 indicates the processor supports DS area using 64-bit layout. - */ - uint32_t ds_area_64bit_layout : 1; -#define CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT_BIT 2 -#define CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT_FLAG 0x04 -#define CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(_) (((_) >> 2) & 0x01) - - /** - * @brief MONITOR/MWAIT instruction - * - * [Bit 3] A value of 1 indicates the processor supports this feature. - */ - uint32_t monitor_mwait_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION_BIT 3 -#define CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION_FLAG 0x08 -#define CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(_) (((_) >> 3) & 0x01) - - /** - * @brief CPL Qualified Debug Store - * - * [Bit 4] A value of 1 indicates the processor supports the extensions to the Debug Store feature to allow for branch - * message storage qualified by CPL. - */ - uint32_t cpl_qualified_debug_store : 1; -#define CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE_BIT 4 -#define CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE_FLAG 0x10 -#define CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(_) (((_) >> 4) & 0x01) - - /** - * @brief Virtual Machine Extensions - * - * [Bit 5] A value of 1 indicates that the processor supports this technology. - */ - uint32_t virtual_machine_extensions : 1; -#define CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS_BIT 5 -#define CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS_FLAG 0x20 -#define CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(_) (((_) >> 5) & 0x01) - - /** - * @brief Safer Mode Extensions - * - * [Bit 6] A value of 1 indicates that the processor supports this technology. - * - * @see Vol2[6(SAFER MODE EXTENSIONS REFERENCE)] - */ - uint32_t safer_mode_extensions : 1; -#define CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS_BIT 6 -#define CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS_FLAG 0x40 -#define CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(_) (((_) >> 6) & 0x01) - - /** - * @brief Enhanced Intel SpeedStep(R) technology - * - * [Bit 7] A value of 1 indicates that the processor supports this technology. - */ - uint32_t enhanced_intel_speedstep_technology : 1; -#define CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_BIT 7 -#define CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_FLAG 0x80 -#define CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(_) (((_) >> 7) & 0x01) - - /** - * @brief Thermal Monitor 2 - * - * [Bit 8] A value of 1 indicates whether the processor supports this technology. - */ - uint32_t thermal_monitor_2 : 1; -#define CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2_BIT 8 -#define CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2_FLAG 0x100 -#define CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(_) (((_) >> 8) & 0x01) - - /** - * @brief Supplemental Streaming SIMD Extensions 3 (SSSE3) - * - * [Bit 9] A value of 1 indicates the presence of the Supplemental Streaming SIMD Extensions 3 (SSSE3). A value of 0 - * indicates the instruction extensions are not present in the processor. - */ - uint32_t supplemental_streaming_simd_extensions_3 : 1; -#define CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3_BIT 9 -#define CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3_FLAG 0x200 -#define CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(_) (((_) >> 9) & 0x01) - - /** - * @brief L1 Context ID - * - * [Bit 10] A value of 1 indicates the L1 data cache mode can be set to either adaptive mode or shared mode. A value of 0 - * indicates this feature is not supported. See definition of the IA32_MISC_ENABLE MSR Bit 24 (L1 Data Cache Context Mode) - * for details. - */ - uint32_t l1_context_id : 1; -#define CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID_BIT 10 -#define CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID_FLAG 0x400 -#define CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(_) (((_) >> 10) & 0x01) - - /** - * @brief IA32_DEBUG_INTERFACE MSR for silicon debug - * - * [Bit 11] A value of 1 indicates the processor supports IA32_DEBUG_INTERFACE MSR for silicon debug. - */ - uint32_t silicon_debug : 1; -#define CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG_BIT 11 -#define CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG_FLAG 0x800 -#define CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(_) (((_) >> 11) & 0x01) - - /** - * @brief FMA extensions using YMM state - * - * [Bit 12] A value of 1 indicates the processor supports FMA (Fused Multiple Add) extensions using YMM state. - */ - uint32_t fma_extensions : 1; -#define CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS_BIT 12 -#define CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS_FLAG 0x1000 -#define CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(_) (((_) >> 12) & 0x01) - - /** - * @brief CMPXCHG16B instruction - * - * [Bit 13] A value of 1 indicates that the feature is available. - */ - uint32_t cmpxchg16b_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION_BIT 13 -#define CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION_FLAG 0x2000 -#define CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(_) (((_) >> 13) & 0x01) - - /** - * @brief xTPR Update Control - * - * [Bit 14] A value of 1 indicates that the processor supports changing IA32_MISC_ENABLE[bit 23]. - */ - uint32_t xtpr_update_control : 1; -#define CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL_BIT 14 -#define CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL_FLAG 0x4000 -#define CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(_) (((_) >> 14) & 0x01) - - /** - * @brief Perfmon and Debug Capability - * - * [Bit 15] A value of 1 indicates the processor supports the performance and debug feature indication MSR - * IA32_PERF_CAPABILITIES. - */ - uint32_t perfmon_and_debug_capability : 1; -#define CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY_BIT 15 -#define CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY_FLAG 0x8000 -#define CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(_) (((_) >> 15) & 0x01) - uint32_t reserved1 : 1; - - /** - * @brief Process-context identifiers - * - * [Bit 17] A value of 1 indicates that the processor supports PCIDs and that software may set CR4.PCIDE to 1. - */ - uint32_t process_context_identifiers : 1; -#define CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS_BIT 17 -#define CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS_FLAG 0x20000 -#define CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(_) (((_) >> 17) & 0x01) - - /** - * @brief Direct Cache Access - * - * [Bit 18] A value of 1 indicates the processor supports the ability to prefetch data from a memory mapped device (Direct - * Cache Access). - */ - uint32_t direct_cache_access : 1; -#define CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS_BIT 18 -#define CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS_FLAG 0x40000 -#define CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(_) (((_) >> 18) & 0x01) - - /** - * @brief SSE4.1 support - * - * [Bit 19] A value of 1 indicates that the processor supports SSE4.1. - */ - uint32_t sse41_support : 1; -#define CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT_BIT 19 -#define CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT_FLAG 0x80000 -#define CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(_) (((_) >> 19) & 0x01) - - /** - * @brief SSE4.2 support - * - * [Bit 20] A value of 1 indicates that the processor supports SSE4.2. - */ - uint32_t sse42_support : 1; -#define CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT_BIT 20 -#define CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT_FLAG 0x100000 -#define CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(_) (((_) >> 20) & 0x01) - - /** - * @brief x2APIC support - * - * [Bit 21] A value of 1 indicates that the processor supports x2APIC feature. - */ - uint32_t x2apic_support : 1; -#define CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT_BIT 21 -#define CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT_FLAG 0x200000 -#define CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(_) (((_) >> 21) & 0x01) - - /** - * @brief MOVBE instruction - * - * [Bit 22] A value of 1 indicates that the processor supports MOVBE instruction. - */ - uint32_t movbe_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION_BIT 22 -#define CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION_FLAG 0x400000 -#define CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(_) (((_) >> 22) & 0x01) - - /** - * @brief POPCNT instruction - * - * [Bit 23] A value of 1 indicates that the processor supports the POPCNT instruction. - */ - uint32_t popcnt_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION_BIT 23 -#define CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION_FLAG 0x800000 -#define CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(_) (((_) >> 23) & 0x01) - - /** - * @brief TSC Deadline - * - * [Bit 24] A value of 1 indicates that the processor's local APIC timer supports one-shot operation using a TSC deadline - * value. - */ - uint32_t tsc_deadline : 1; -#define CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE_BIT 24 -#define CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE_FLAG 0x1000000 -#define CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(_) (((_) >> 24) & 0x01) - - /** - * @brief AESNI instruction extensions - * - * [Bit 25] A value of 1 indicates that the processor supports the AESNI instruction extensions. - */ - uint32_t aesni_instruction_extensions : 1; -#define CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS_BIT 25 -#define CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS_FLAG 0x2000000 -#define CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(_) (((_) >> 25) & 0x01) - - /** - * @brief XSAVE/XRSTOR instruction extensions - * - * [Bit 26] A value of 1 indicates that the processor supports the XSAVE/XRSTOR processor extended states feature, the - * XSETBV/XGETBV instructions, and XCR0. - */ - uint32_t xsave_xrstor_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION_BIT 26 -#define CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION_FLAG 0x4000000 -#define CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(_) (((_) >> 26) & 0x01) - - /** - * @brief CR4.OSXSAVE[bit 18] set - * - * [Bit 27] A value of 1 indicates that the OS has set CR4.OSXSAVE[bit 18] to enable XSETBV/XGETBV instructions to access - * XCR0 and to support processor extended state management using XSAVE/XRSTOR. - */ - uint32_t osx_save : 1; -#define CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE_BIT 27 -#define CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE_FLAG 0x8000000 -#define CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(_) (((_) >> 27) & 0x01) - - /** - * @brief AVX instruction extensions support - * - * [Bit 28] A value of 1 indicates the processor supports the AVX instruction extensions. - */ - uint32_t avx_support : 1; -#define CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT_BIT 28 -#define CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT_FLAG 0x10000000 -#define CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(_) (((_) >> 28) & 0x01) - - /** - * @brief 16-bit floating-point conversion instructions support - * - * [Bit 29] A value of 1 indicates that processor supports 16-bit floating-point conversion instructions. - */ - uint32_t half_precision_conversion_instructions : 1; -#define CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS_BIT 29 -#define CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS_FLAG 0x20000000 -#define CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(_) (((_) >> 29) & 0x01) - - /** - * @brief RDRAND instruction support - * - * [Bit 30] A value of 1 indicates that processor supports RDRAND instruction. - */ - uint32_t rdrand_instruction : 1; -#define CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION_BIT 30 -#define CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION_FLAG 0x40000000 -#define CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(_) (((_) >> 30) & 0x01) - uint32_t reserved2 : 1; - }; - - uint32_t flags; - } cpuid_feature_information_ecx; - - /** - * @brief When CPUID executes with EAX set to 01H, feature information is returned in ECX and EDX - */ - union - { - struct - { - /** - * @brief Floating Point Unit On-Chip - * - * [Bit 0] The processor contains an x87 FPU. - */ - uint32_t floating_point_unit_on_chip : 1; -#define CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP_BIT 0 -#define CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP_FLAG 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(_) (((_) >> 0) & 0x01) - - /** - * @brief Virtual 8086 Mode Enhancements - * - * [Bit 1] Virtual 8086 mode enhancements, including CR4.VME for controlling the feature, CR4.PVI for protected mode - * virtual interrupts, software interrupt indirection, expansion of the TSS with the software indirection bitmap, and - * EFLAGS.VIF and EFLAGS.VIP flags. - */ - uint32_t virtual_8086_mode_enhancements : 1; -#define CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS_BIT 1 -#define CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS_FLAG 0x02 -#define CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(_) (((_) >> 1) & 0x01) - - /** - * @brief Debugging Extensions - * - * [Bit 2] Support for I/O breakpoints, including CR4.DE for controlling the feature, and optional trapping of accesses to - * DR4 and DR5. - */ - uint32_t debugging_extensions : 1; -#define CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS_BIT 2 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS_FLAG 0x04 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(_) (((_) >> 2) & 0x01) - - /** - * @brief Page Size Extension - * - * [Bit 3] Large pages of size 4 MByte are supported, including CR4.PSE for controlling the feature, the defined dirty bit - * in PDE (Page Directory Entries), optional reserved bit trapping in CR3, PDEs, and PTEs. - */ - uint32_t page_size_extension : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_BIT 3 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_FLAG 0x08 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(_) (((_) >> 3) & 0x01) - - /** - * @brief Time Stamp Counter - * - * [Bit 4] The RDTSC instruction is supported, including CR4.TSD for controlling privilege. - */ - uint32_t timestamp_counter : 1; -#define CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER_BIT 4 -#define CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER_FLAG 0x10 -#define CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(_) (((_) >> 4) & 0x01) - - /** - * @brief Model Specific Registers RDMSR and WRMSR Instructions - * - * [Bit 5] The RDMSR and WRMSR instructions are supported. Some of the MSRs are implementation dependent. - */ - uint32_t rdmsr_wrmsr_instructions : 1; -#define CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS_BIT 5 -#define CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS_FLAG 0x20 -#define CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(_) (((_) >> 5) & 0x01) - - /** - * @brief Physical Address Extension - * - * [Bit 6] Physical addresses greater than 32 bits are supported: extended page table entry formats, an extra level in the - * page translation tables is defined, 2-MByte pages are supported instead of 4 Mbyte pages if PAE bit is 1. - */ - uint32_t physical_address_extension : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION_BIT 6 -#define CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION_FLAG 0x40 -#define CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(_) (((_) >> 6) & 0x01) - - /** - * @brief Machine Check Exception - * - * [Bit 7] Exception 18 is defined for Machine Checks, including CR4.MCE for controlling the feature. This feature does not - * define the model-specific implementations of machine-check error logging, reporting, and processor shutdowns. Machine - * Check exception handlers may have to depend on processor version to do model specific processing of the exception, or - * test for the presence of the Machine Check feature. - */ - uint32_t machine_check_exception : 1; -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION_BIT 7 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION_FLAG 0x80 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(_) (((_) >> 7) & 0x01) - - /** - * @brief CMPXCHG8B Instruction - * - * [Bit 8] The compare-and-exchange 8 bytes (64 bits) instruction is supported (implicitly locked and atomic). - */ - uint32_t cmpxchg8b : 1; -#define CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B_BIT 8 -#define CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B_FLAG 0x100 -#define CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(_) (((_) >> 8) & 0x01) - - /** - * @brief APIC On-Chip - * - * [Bit 9] The processor contains an Advanced Programmable Interrupt Controller (APIC), responding to memory mapped - * commands in the physical address range FFFE0000H to FFFE0FFFH (by default - some processors permit the APIC to be - * relocated). - */ - uint32_t apic_on_chip : 1; -#define CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP_BIT 9 -#define CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP_FLAG 0x200 -#define CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(_) (((_) >> 9) & 0x01) - uint32_t reserved1 : 1; - - /** - * @brief SYSENTER and SYSEXIT Instructions - * - * [Bit 11] The SYSENTER and SYSEXIT and associated MSRs are supported. - */ - uint32_t sysenter_sysexit_instructions : 1; -#define CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS_BIT 11 -#define CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS_FLAG 0x800 -#define CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(_) (((_) >> 11) & 0x01) - - /** - * @brief Memory Type Range Registers - * - * [Bit 12] MTRRs are supported. The MTRRcap MSR contains feature bits that describe what memory types are supported, how - * many variable MTRRs are supported, and whether fixed MTRRs are supported. - */ - uint32_t memory_type_range_registers : 1; -#define CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS_BIT 12 -#define CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS_FLAG 0x1000 -#define CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(_) (((_) >> 12) & 0x01) - - /** - * @brief Page Global Bit - * - * [Bit 13] The global bit is supported in paging-structure entries that map a page, indicating TLB entries that are common - * to different processes and need not be flushed. The CR4.PGE bit controls this feature. - */ - uint32_t page_global_bit : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT_BIT 13 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT_FLAG 0x2000 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(_) (((_) >> 13) & 0x01) - - /** - * @brief Machine Check Architecture - * - * [Bit 14] A value of 1 indicates the Machine Check Architecture of reporting machine errors is supported. The MCG_CAP MSR - * contains feature bits describing how many banks of error reporting MSRs are supported. - */ - uint32_t machine_check_architecture : 1; -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE_BIT 14 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE_FLAG 0x4000 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(_) (((_) >> 14) & 0x01) - - /** - * @brief Conditional Move Instructions - * - * [Bit 15] The conditional move instruction CMOV is supported. In addition, if x87 FPU is present as indicated by the - * CPUID.FPU feature bit, then the FCOMI and FCMOV instructions are supported - */ - uint32_t conditional_move_instructions : 1; -#define CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS_BIT 15 -#define CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS_FLAG 0x8000 -#define CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(_) (((_) >> 15) & 0x01) - - /** - * @brief Page Attribute Table - * - * [Bit 16] Page Attribute Table is supported. This feature augments the Memory Type Range Registers (MTRRs), allowing an - * operating system to specify attributes of memory accessed through a linear address on a 4KB granularity. - */ - uint32_t page_attribute_table : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE_BIT 16 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE_FLAG 0x10000 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(_) (((_) >> 16) & 0x01) - - /** - * @brief 36-Bit Page Size Extension - * - * [Bit 17] 4-MByte pages addressing physical memory beyond 4 GBytes are supported with 32-bit paging. This feature - * indicates that upper bits of the physical address of a 4-MByte page are encoded in bits 20:13 of the page-directory - * entry. Such physical addresses are limited by MAXPHYADDR and may be up to 40 bits in size. - */ - uint32_t page_size_extension_36bit : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT_BIT 17 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT_FLAG 0x20000 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(_) (((_) >> 17) & 0x01) - - /** - * @brief Processor Serial Number - * - * [Bit 18] The processor supports the 96-bit processor identification number feature and the feature is enabled. - */ - uint32_t processor_serial_number : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER_BIT 18 -#define CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER_FLAG 0x40000 -#define CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(_) (((_) >> 18) & 0x01) - - /** - * @brief CLFLUSH Instruction - * - * [Bit 19] CLFLUSH Instruction is supported. - */ - uint32_t clflush : 1; -#define CPUID_FEATURE_INFORMATION_EDX_CLFLUSH_BIT 19 -#define CPUID_FEATURE_INFORMATION_EDX_CLFLUSH_FLAG 0x80000 -#define CPUID_FEATURE_INFORMATION_EDX_CLFLUSH_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(_) (((_) >> 19) & 0x01) - uint32_t reserved2 : 1; - - /** - * @brief Debug Store - * - * [Bit 21] The processor supports the ability to write debug information into a memory resident buffer. This feature is - * used by the branch trace store (BTS) and processor event-based sampling (PEBS) facilities. - * - * @see Vol3C[23(INTRODUCTION TO VIRTUAL MACHINE EXTENSIONS)] - */ - uint32_t debug_store : 1; -#define CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE_BIT 21 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE_FLAG 0x200000 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(_) (((_) >> 21) & 0x01) - - /** - * @brief Thermal Monitor and Software Controlled Clock Facilities - * - * [Bit 22] The processor implements internal MSRs that allow processor temperature to be monitored and processor - * performance to be modulated in predefined duty cycles under software control. - */ - uint32_t thermal_control_msrs_for_acpi : 1; -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI_BIT 22 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI_FLAG 0x400000 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(_) (((_) >> 22) & 0x01) - - /** - * @brief Intel MMX Technology - * - * [Bit 23] The processor supports the Intel MMX technology. - */ - uint32_t mmx_support : 1; -#define CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT_BIT 23 -#define CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT_FLAG 0x800000 -#define CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(_) (((_) >> 23) & 0x01) - - /** - * @brief FXSAVE and FXRSTOR Instructions - * - * [Bit 24] The FXSAVE and FXRSTOR instructions are supported for fast save and restore of the floating point context. - * Presence of this bit also indicates that CR4.OSFXSR is available for an operating system to indicate that it supports - * the FXSAVE and FXRSTOR instructions. - */ - uint32_t fxsave_fxrstor_instructions : 1; -#define CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS_BIT 24 -#define CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS_FLAG 0x1000000 -#define CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(_) (((_) >> 24) & 0x01) - - /** - * @brief SSE extensions support - * - * [Bit 25] The processor supports the SSE extensions. - */ - uint32_t sse_support : 1; -#define CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT_BIT 25 -#define CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT_FLAG 0x2000000 -#define CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(_) (((_) >> 25) & 0x01) - - /** - * @brief SSE2 extensions support - * - * [Bit 26] The processor supports the SSE2 extensions. - */ - uint32_t sse2_support : 1; -#define CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT_BIT 26 -#define CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT_FLAG 0x4000000 -#define CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(_) (((_) >> 26) & 0x01) - - /** - * @brief Self Snoop - * - * [Bit 27] The processor supports the management of conflicting memory types by performing a snoop of its own cache - * structure for transactions issued to the bus. - */ - uint32_t self_snoop : 1; -#define CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP_BIT 27 -#define CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP_FLAG 0x8000000 -#define CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(_) (((_) >> 27) & 0x01) - - /** - * @brief Max APIC IDs reserved field is Valid - * - * [Bit 28] A value of 0 for HTT indicates there is only a single logical processor in the package and software should - * assume only a single APIC ID is reserved. A value of 1 for HTT indicates the value in CPUID.1.EBX[23:16] (the Maximum - * number of addressable IDs for logical processors in this package) is valid for the package. - */ - uint32_t hyper_threading_technology : 1; -#define CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY_BIT 28 -#define CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY_FLAG 0x10000000 -#define CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(_) (((_) >> 28) & 0x01) - - /** - * @brief Thermal Monitor - * - * [Bit 29] The processor implements the thermal monitor automatic thermal control circuitry (TCC). - */ - uint32_t thermal_monitor : 1; -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR_BIT 29 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR_FLAG 0x20000000 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(_) (((_) >> 29) & 0x01) - uint32_t reserved3 : 1; - - /** - * @brief Pending Break Enable - * - * [Bit 31] The processor supports the use of the FERR\#/PBE\# pin when the processor is in the stop-clock state (STPCLK\# - * is asserted) to signal the processor that an interrupt is pending and that the processor should return to normal - * operation to handle the interrupt. Bit 10 (PBE enable) in the IA32_MISC_ENABLE MSR enables this capability. - */ - uint32_t pending_break_enable : 1; -#define CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE_BIT 31 -#define CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE_FLAG 0x80000000 -#define CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE_MASK 0x01 -#define CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; - } cpuid_feature_information_edx; - -} cpuid_eax_01; - - -/** - * @brief Deterministic Cache Parameters Leaf - * - * When CPUID executes with EAX set to 04H and ECX contains an index value, the processor returns encoded data that - * describe a set of deterministic cache parameters (for the cache level associated with the input in ECX). Valid index - * values start from 0. - * Software can enumerate the deterministic cache parameters for each level of the cache hierarchy starting with an index - * value of 0, until the parameters report the value associated with the cache type field is 0. The architecturally defined - * fields reported by deterministic cache parameters are documented in Table 3-8. - * This Cache Size in Bytes - * - = (Ways + 1) * (Partitions + 1) * (Line_Size + 1) * (Sets + 1) - * - = (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1) - * The CPUID leaf 04H also reports data that can be used to derive the topology of processor cores in a physical package. - * This information is constant for all valid index values. Software can query the raw data reported by executing CPUID - * with EAX=04H and ECX=0 and use it as part of the topology enumeration algorithm. - * - * @see Vol3A[8(Multiple-Processor Management)] - */ -#define CPUID_CACHE_PARAMETERS 0x00000004 -typedef struct -{ - union - { - struct - { - /** - * [Bits 4:0] - 0 = Null - No more caches. - * - 1 = Data Cache. - * - 2 = Instruction Cache. - * - 3 = Unified Cache. - * - 4-31 = Reserved. - */ - uint32_t cache_type_field : 5; -#define CPUID_EAX_CACHE_TYPE_FIELD_BIT 0 -#define CPUID_EAX_CACHE_TYPE_FIELD_FLAG 0x1F -#define CPUID_EAX_CACHE_TYPE_FIELD_MASK 0x1F -#define CPUID_EAX_CACHE_TYPE_FIELD(_) (((_) >> 0) & 0x1F) - - /** - * [Bits 7:5] Cache Level (starts at 1). - */ - uint32_t cache_level : 3; -#define CPUID_EAX_CACHE_LEVEL_BIT 5 -#define CPUID_EAX_CACHE_LEVEL_FLAG 0xE0 -#define CPUID_EAX_CACHE_LEVEL_MASK 0x07 -#define CPUID_EAX_CACHE_LEVEL(_) (((_) >> 5) & 0x07) - - /** - * [Bit 8] Self Initializing cache level (does not need SW initialization). - */ - uint32_t self_initializing_cache_level : 1; -#define CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL_BIT 8 -#define CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL_FLAG 0x100 -#define CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL_MASK 0x01 -#define CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Fully Associative cache. - */ - uint32_t fully_associative_cache : 1; -#define CPUID_EAX_FULLY_ASSOCIATIVE_CACHE_BIT 9 -#define CPUID_EAX_FULLY_ASSOCIATIVE_CACHE_FLAG 0x200 -#define CPUID_EAX_FULLY_ASSOCIATIVE_CACHE_MASK 0x01 -#define CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(_) (((_) >> 9) & 0x01) - uint32_t reserved1 : 4; - - /** - * [Bits 25:14] Maximum number of addressable IDs for logical processors sharing this cache. - * - * @note Add one to the return value to get the result. - * The nearest power-of-2 integer that is not smaller than (1 + EAX[25:14]) is the number of unique initial APIC IDs - * reserved for addressing different logical processors sharing this cache. - */ - uint32_t max_addressable_ids_for_logical_processors_sharing_this_cache : 12; -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE_BIT 14 -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE_FLAG 0x3FFC000 -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE_MASK 0xFFF -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(_) (((_) >> 14) & 0xFFF) - - /** - * [Bits 31:26] Maximum number of addressable IDs for processor cores in the physical package. - * - * @note Add one to the return value to get the result. - * The nearest power-of-2 integer that is not smaller than (1 + EAX[31:26]) is the number of unique Core_IDs reserved for - * addressing different processor cores in a physical package. Core ID is a subset of bits of the initial APIC ID. - * The returned value is constant for valid initial values in ECX. Valid ECX values start from 0. - */ - uint32_t max_addressable_ids_for_processor_cores_in_physical_package : 6; -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE_BIT 26 -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE_FLAG 0xFC000000 -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE_MASK 0x3F -#define CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(_) (((_) >> 26) & 0x3F) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 11:0] System Coherency Line Size. - * - * @note Add one to the return value to get the result. - */ - uint32_t system_coherency_line_size : 12; -#define CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE_BIT 0 -#define CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE_FLAG 0xFFF -#define CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE_MASK 0xFFF -#define CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(_) (((_) >> 0) & 0xFFF) - - /** - * [Bits 21:12] Physical Line partitions. - * - * @note Add one to the return value to get the result. - */ - uint32_t physical_line_partitions : 10; -#define CPUID_EBX_PHYSICAL_LINE_PARTITIONS_BIT 12 -#define CPUID_EBX_PHYSICAL_LINE_PARTITIONS_FLAG 0x3FF000 -#define CPUID_EBX_PHYSICAL_LINE_PARTITIONS_MASK 0x3FF -#define CPUID_EBX_PHYSICAL_LINE_PARTITIONS(_) (((_) >> 12) & 0x3FF) - - /** - * [Bits 31:22] Ways of associativity. - * - * @note Add one to the return value to get the result. - */ - uint32_t ways_of_associativity : 10; -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_BIT 22 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_FLAG 0xFFC00000 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_MASK 0x3FF -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY(_) (((_) >> 22) & 0x3FF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Number of Sets. - * - * @note Add one to the return value to get the result. - */ - uint32_t number_of_sets : 32; -#define CPUID_ECX_NUMBER_OF_SETS_BIT 0 -#define CPUID_ECX_NUMBER_OF_SETS_FLAG 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS_MASK 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * @brief Write-Back Invalidate/Invalidate - * - * [Bit 0] - 0 = WBINVD/INVD from threads sharing this cache acts upon lower level caches for threads sharing this cache. - * - 1 = WBINVD/INVD is not guaranteed to act upon lower level caches of non-originating threads sharing this cache. - */ - uint32_t write_back_invalidate : 1; -#define CPUID_EDX_WRITE_BACK_INVALIDATE_BIT 0 -#define CPUID_EDX_WRITE_BACK_INVALIDATE_FLAG 0x01 -#define CPUID_EDX_WRITE_BACK_INVALIDATE_MASK 0x01 -#define CPUID_EDX_WRITE_BACK_INVALIDATE(_) (((_) >> 0) & 0x01) - - /** - * @brief Cache Inclusiveness - * - * [Bit 1] - 0 = Cache is not inclusive of lower cache levels. - * - 1 = Cache is inclusive of lower cache levels. - */ - uint32_t cache_inclusiveness : 1; -#define CPUID_EDX_CACHE_INCLUSIVENESS_BIT 1 -#define CPUID_EDX_CACHE_INCLUSIVENESS_FLAG 0x02 -#define CPUID_EDX_CACHE_INCLUSIVENESS_MASK 0x01 -#define CPUID_EDX_CACHE_INCLUSIVENESS(_) (((_) >> 1) & 0x01) - - /** - * @brief Complex Cache Indexing - * - * [Bit 2] - 0 = Direct mapped cache. - * - 1 = A complex function is used to index the cache, potentially using all address bits. - */ - uint32_t complex_cache_indexing : 1; -#define CPUID_EDX_COMPLEX_CACHE_INDEXING_BIT 2 -#define CPUID_EDX_COMPLEX_CACHE_INDEXING_FLAG 0x04 -#define CPUID_EDX_COMPLEX_CACHE_INDEXING_MASK 0x01 -#define CPUID_EDX_COMPLEX_CACHE_INDEXING(_) (((_) >> 2) & 0x01) - uint32_t reserved1 : 29; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_04; - - -/** - * @brief MONITOR/MWAIT Leaf - * - * When CPUID executes with EAX set to 05H, the processor returns information about features available to MONITOR/MWAIT - * instructions. The MONITOR instruction is used for address-range monitoring in conjunction with MWAIT instruction. The - * MWAIT instruction optionally provides additional extensions for advanced power management. - */ -#define CPUID_MONITOR_MWAIT 0x00000005 -typedef struct -{ - union - { - struct - { - /** - * [Bits 15:0] Smallest monitor-line size in bytes (default is processor's monitor granularity). - */ - uint32_t smallest_monitor_line_size : 16; -#define CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE_BIT 0 -#define CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE_FLAG 0xFFFF -#define CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE_MASK 0xFFFF -#define CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 15:0] Largest monitor-line size in bytes (default is processor's monitor granularity). - */ - uint32_t largest_monitor_line_size : 16; -#define CPUID_EBX_LARGEST_MONITOR_LINE_SIZE_BIT 0 -#define CPUID_EBX_LARGEST_MONITOR_LINE_SIZE_FLAG 0xFFFF -#define CPUID_EBX_LARGEST_MONITOR_LINE_SIZE_MASK 0xFFFF -#define CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] Enumeration of Monitor-Mwait extensions (beyond EAX and EBX registers) supported. - */ - uint32_t enumeration_of_monitor_mwait_extensions : 1; -#define CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS_BIT 0 -#define CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS_FLAG 0x01 -#define CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS_MASK 0x01 -#define CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Supports treating interrupts as break-event for MWAIT, even when interrupts disabled. - */ - uint32_t supports_treating_interrupts_as_break_event_for_mwait : 1; -#define CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT_BIT 1 -#define CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT_FLAG 0x02 -#define CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT_MASK 0x01 -#define CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(_) (((_) >> 1) & 0x01) - uint32_t reserved1 : 30; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 3:0] Number of C0 sub C-states supported using MWAIT. - */ - uint32_t number_of_c0_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES_BIT 0 -#define CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES_FLAG 0x0F -#define CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(_) (((_) >> 0) & 0x0F) - - /** - * [Bits 7:4] Number of C1 sub C-states supported using MWAIT. - */ - uint32_t number_of_c1_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES_BIT 4 -#define CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES_FLAG 0xF0 -#define CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(_) (((_) >> 4) & 0x0F) - - /** - * [Bits 11:8] Number of C2 sub C-states supported using MWAIT. - */ - uint32_t number_of_c2_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES_BIT 8 -#define CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES_FLAG 0xF00 -#define CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 15:12] Number of C3 sub C-states supported using MWAIT. - */ - uint32_t number_of_c3_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES_BIT 12 -#define CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES_FLAG 0xF000 -#define CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(_) (((_) >> 12) & 0x0F) - - /** - * [Bits 19:16] Number of C4 sub C-states supported using MWAIT. - */ - uint32_t number_of_c4_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES_BIT 16 -#define CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES_FLAG 0xF0000 -#define CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(_) (((_) >> 16) & 0x0F) - - /** - * [Bits 23:20] Number of C5 sub C-states supported using MWAIT. - */ - uint32_t number_of_c5_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES_BIT 20 -#define CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES_FLAG 0xF00000 -#define CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(_) (((_) >> 20) & 0x0F) - - /** - * [Bits 27:24] Number of C6 sub C-states supported using MWAIT. - */ - uint32_t number_of_c6_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES_BIT 24 -#define CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES_FLAG 0xF000000 -#define CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(_) (((_) >> 24) & 0x0F) - - /** - * [Bits 31:28] Number of C7 sub C-states supported using MWAIT. - */ - uint32_t number_of_c7_sub_c_states : 4; -#define CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES_BIT 28 -#define CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES_FLAG 0xF0000000 -#define CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES_MASK 0x0F -#define CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(_) (((_) >> 28) & 0x0F) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_05; - - -/** - * @brief Thermal and Power Management Leaf - * - * When CPUID executes with EAX set to 06H, the processor returns information about thermal and power management features. - */ -#define CPUID_THERMAL_AND_POWER_MANAGEMENT 0x00000006 -typedef struct -{ - union - { - struct - { - /** - * [Bit 0] Digital temperature sensor is supported if set. - */ - uint32_t temperature_sensor_supported : 1; -#define CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED_BIT 0 -#define CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED_FLAG 0x01 -#define CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED_MASK 0x01 -#define CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Intel Turbo Boost Technology available (see description of IA32_MISC_ENABLE[38]). - */ - uint32_t intel_turbo_boost_technology_available : 1; -#define CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE_BIT 1 -#define CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE_FLAG 0x02 -#define CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE_MASK 0x01 -#define CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] ARAT. APIC-Timer-always-running feature is supported if set. - */ - uint32_t apic_timer_always_running : 1; -#define CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING_BIT 2 -#define CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING_FLAG 0x04 -#define CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING_MASK 0x01 -#define CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(_) (((_) >> 2) & 0x01) - uint32_t reserved1 : 1; - - /** - * [Bit 4] PLN. Power limit notification controls are supported if set. - */ - uint32_t power_limit_notification : 1; -#define CPUID_EAX_POWER_LIMIT_NOTIFICATION_BIT 4 -#define CPUID_EAX_POWER_LIMIT_NOTIFICATION_FLAG 0x10 -#define CPUID_EAX_POWER_LIMIT_NOTIFICATION_MASK 0x01 -#define CPUID_EAX_POWER_LIMIT_NOTIFICATION(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] ECMD. Clock modulation duty cycle extension is supported if set. - */ - uint32_t clock_modulation_duty : 1; -#define CPUID_EAX_CLOCK_MODULATION_DUTY_BIT 5 -#define CPUID_EAX_CLOCK_MODULATION_DUTY_FLAG 0x20 -#define CPUID_EAX_CLOCK_MODULATION_DUTY_MASK 0x01 -#define CPUID_EAX_CLOCK_MODULATION_DUTY(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] PTM. Package thermal management is supported if set. - */ - uint32_t package_thermal_management : 1; -#define CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT_BIT 6 -#define CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT_FLAG 0x40 -#define CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT_MASK 0x01 -#define CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] HWP. HWP base registers (IA32_PM_ENABLE[bit 0], IA32_HWP_CAPABILITIES, IA32_HWP_REQUEST, IA32_HWP_STATUS) are - * supported if set. - */ - uint32_t hwp_base_registers : 1; -#define CPUID_EAX_HWP_BASE_REGISTERS_BIT 7 -#define CPUID_EAX_HWP_BASE_REGISTERS_FLAG 0x80 -#define CPUID_EAX_HWP_BASE_REGISTERS_MASK 0x01 -#define CPUID_EAX_HWP_BASE_REGISTERS(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] HWP_Notification. IA32_HWP_INTERRUPT MSR is supported if set. - */ - uint32_t hwp_notification : 1; -#define CPUID_EAX_HWP_NOTIFICATION_BIT 8 -#define CPUID_EAX_HWP_NOTIFICATION_FLAG 0x100 -#define CPUID_EAX_HWP_NOTIFICATION_MASK 0x01 -#define CPUID_EAX_HWP_NOTIFICATION(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] HWP_Activity_Window. IA32_HWP_REQUEST[bits 41:32] is supported if set. - */ - uint32_t hwp_activity_window : 1; -#define CPUID_EAX_HWP_ACTIVITY_WINDOW_BIT 9 -#define CPUID_EAX_HWP_ACTIVITY_WINDOW_FLAG 0x200 -#define CPUID_EAX_HWP_ACTIVITY_WINDOW_MASK 0x01 -#define CPUID_EAX_HWP_ACTIVITY_WINDOW(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] HWP_Energy_Performance_Preference. IA32_HWP_REQUEST[bits 31:24] is supported if set. - */ - uint32_t hwp_energy_performance_preference : 1; -#define CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE_BIT 10 -#define CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE_FLAG 0x400 -#define CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE_MASK 0x01 -#define CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] HWP_Package_Level_Request. IA32_HWP_REQUEST_PKG MSR is supported if set. - */ - uint32_t hwp_package_level_request : 1; -#define CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST_BIT 11 -#define CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST_FLAG 0x800 -#define CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST_MASK 0x01 -#define CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(_) (((_) >> 11) & 0x01) - uint32_t reserved2 : 1; - - /** - * [Bit 13] HDC. HDC base registers IA32_PKG_HDC_CTL, IA32_PM_CTL1, IA32_THREAD_STALL MSRs are supported if set. - */ - uint32_t hdc : 1; -#define CPUID_EAX_HDC_BIT 13 -#define CPUID_EAX_HDC_FLAG 0x2000 -#define CPUID_EAX_HDC_MASK 0x01 -#define CPUID_EAX_HDC(_) (((_) >> 13) & 0x01) - - /** - * [Bit 14] Intel(R) Turbo Boost Max Technology 3.0 available. - */ - uint32_t intel_turbo_boost_max_technology_3_available : 1; -#define CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE_BIT 14 -#define CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE_FLAG 0x4000 -#define CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE_MASK 0x01 -#define CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(_) (((_) >> 14) & 0x01) - - /** - * [Bit 15] HWP Capabilities. Highest Performance change is supported if set. - */ - uint32_t hwp_capabilities : 1; -#define CPUID_EAX_HWP_CAPABILITIES_BIT 15 -#define CPUID_EAX_HWP_CAPABILITIES_FLAG 0x8000 -#define CPUID_EAX_HWP_CAPABILITIES_MASK 0x01 -#define CPUID_EAX_HWP_CAPABILITIES(_) (((_) >> 15) & 0x01) - - /** - * [Bit 16] HWP PECI override is supported if set. - */ - uint32_t hwp_peci_override : 1; -#define CPUID_EAX_HWP_PECI_OVERRIDE_BIT 16 -#define CPUID_EAX_HWP_PECI_OVERRIDE_FLAG 0x10000 -#define CPUID_EAX_HWP_PECI_OVERRIDE_MASK 0x01 -#define CPUID_EAX_HWP_PECI_OVERRIDE(_) (((_) >> 16) & 0x01) - - /** - * [Bit 17] Flexible HWP is supported if set. - */ - uint32_t flexible_hwp : 1; -#define CPUID_EAX_FLEXIBLE_HWP_BIT 17 -#define CPUID_EAX_FLEXIBLE_HWP_FLAG 0x20000 -#define CPUID_EAX_FLEXIBLE_HWP_MASK 0x01 -#define CPUID_EAX_FLEXIBLE_HWP(_) (((_) >> 17) & 0x01) - - /** - * [Bit 18] Fast access mode for the IA32_HWP_REQUEST MSR is supported if set. - */ - uint32_t fast_access_mode_for_hwp_request_msr : 1; -#define CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR_BIT 18 -#define CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR_FLAG 0x40000 -#define CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR_MASK 0x01 -#define CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(_) (((_) >> 18) & 0x01) - uint32_t reserved3 : 1; - - /** - * [Bit 20] Ignoring Idle Logical Processor HWP request is supported if set. - */ - uint32_t ignoring_idle_logical_processor_hwp_request : 1; -#define CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST_BIT 20 -#define CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST_FLAG 0x100000 -#define CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST_MASK 0x01 -#define CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(_) (((_) >> 20) & 0x01) - uint32_t reserved4 : 11; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 3:0] Number of Interrupt Thresholds in Digital Thermal Sensor. - */ - uint32_t number_of_interrupt_thresholds_in_thermal_sensor : 4; -#define CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR_BIT 0 -#define CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR_FLAG 0x0F -#define CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR_MASK 0x0F -#define CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(_) (((_) >> 0) & 0x0F) - uint32_t reserved1 : 28; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] Hardware Coordination Feedback Capability (Presence of IA32_MPERF and IA32_APERF). The capability to provide a - * measure of delivered processor performance (since last reset of the counters), as a percentage of the expected processor - * performance when running at the TSC frequency. - */ - uint32_t hardware_coordination_feedback_capability : 1; -#define CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY_BIT 0 -#define CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY_FLAG 0x01 -#define CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY_MASK 0x01 -#define CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(_) (((_) >> 0) & 0x01) - uint32_t reserved1 : 2; - - /** - * [Bit 3] The processor supports performance-energy bias preference if CPUID.06H:ECX.SETBH[bit 3] is set and it also - * implies the presence of a new architectural MSR called IA32_ENERGY_PERF_BIAS (1B0H). - */ - uint32_t performance_energy_bias_preference : 1; -#define CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE_BIT 3 -#define CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE_FLAG 0x08 -#define CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE_MASK 0x01 -#define CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(_) (((_) >> 3) & 0x01) - uint32_t reserved2 : 28; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_06; - - -/** - * @brief Structured Extended Feature Flags Enumeration Leaf (Output depends on ECX input value) - * - * When CPUID executes with EAX set to 07H and ECX = 0, the processor returns information about the maximum input value for - * sub-leaves that contain extended feature flags. - * When CPUID executes with EAX set to 07H and the input value of ECX is invalid (see leaf 07H entry in Table 3-8), the - * processor returns 0 in EAX/EBX/ECX/EDX. In subleaf 0, EAX returns the maximum input value of the highest leaf 7 - * sub-leaf, and EBX, ECX & EDX contain information of extended feature flags. - */ -#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS 0x00000007 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reports the maximum input value for supported leaf 7 sub-leaves. - */ - uint32_t number_of_sub_leaves : 32; -#define CPUID_EAX_NUMBER_OF_SUB_LEAVES_BIT 0 -#define CPUID_EAX_NUMBER_OF_SUB_LEAVES_FLAG 0xFFFFFFFF -#define CPUID_EAX_NUMBER_OF_SUB_LEAVES_MASK 0xFFFFFFFF -#define CPUID_EAX_NUMBER_OF_SUB_LEAVES(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bit 0] Supports RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE if 1. - */ - uint32_t fsgsbase : 1; -#define CPUID_EBX_FSGSBASE_BIT 0 -#define CPUID_EBX_FSGSBASE_FLAG 0x01 -#define CPUID_EBX_FSGSBASE_MASK 0x01 -#define CPUID_EBX_FSGSBASE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] IA32_TSC_ADJUST MSR is supported if 1. - */ - uint32_t ia32_tsc_adjust_msr : 1; -#define CPUID_EBX_IA32_TSC_ADJUST_MSR_BIT 1 -#define CPUID_EBX_IA32_TSC_ADJUST_MSR_FLAG 0x02 -#define CPUID_EBX_IA32_TSC_ADJUST_MSR_MASK 0x01 -#define CPUID_EBX_IA32_TSC_ADJUST_MSR(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Supports Intel(R) Software Guard Extensions (Intel(R) SGX Extensions) if 1. - */ - uint32_t sgx : 1; -#define CPUID_EBX_SGX_BIT 2 -#define CPUID_EBX_SGX_FLAG 0x04 -#define CPUID_EBX_SGX_MASK 0x01 -#define CPUID_EBX_SGX(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] BMI1. - */ - uint32_t bmi1 : 1; -#define CPUID_EBX_BMI1_BIT 3 -#define CPUID_EBX_BMI1_FLAG 0x08 -#define CPUID_EBX_BMI1_MASK 0x01 -#define CPUID_EBX_BMI1(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] HLE. - */ - uint32_t hle : 1; -#define CPUID_EBX_HLE_BIT 4 -#define CPUID_EBX_HLE_FLAG 0x10 -#define CPUID_EBX_HLE_MASK 0x01 -#define CPUID_EBX_HLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] AVX2. - */ - uint32_t avx2 : 1; -#define CPUID_EBX_AVX2_BIT 5 -#define CPUID_EBX_AVX2_FLAG 0x20 -#define CPUID_EBX_AVX2_MASK 0x01 -#define CPUID_EBX_AVX2(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] x87 FPU Data Pointer updated only on x87 exceptions if 1. - */ - uint32_t fdp_excptn_only : 1; -#define CPUID_EBX_FDP_EXCPTN_ONLY_BIT 6 -#define CPUID_EBX_FDP_EXCPTN_ONLY_FLAG 0x40 -#define CPUID_EBX_FDP_EXCPTN_ONLY_MASK 0x01 -#define CPUID_EBX_FDP_EXCPTN_ONLY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Supports Supervisor-Mode Execution Prevention if 1. - */ - uint32_t smep : 1; -#define CPUID_EBX_SMEP_BIT 7 -#define CPUID_EBX_SMEP_FLAG 0x80 -#define CPUID_EBX_SMEP_MASK 0x01 -#define CPUID_EBX_SMEP(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] BMI2. - */ - uint32_t bmi2 : 1; -#define CPUID_EBX_BMI2_BIT 8 -#define CPUID_EBX_BMI2_FLAG 0x100 -#define CPUID_EBX_BMI2_MASK 0x01 -#define CPUID_EBX_BMI2(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Supports Enhanced REP MOVSB/STOSB if 1. - */ - uint32_t enhanced_rep_movsb_stosb : 1; -#define CPUID_EBX_ENHANCED_REP_MOVSB_STOSB_BIT 9 -#define CPUID_EBX_ENHANCED_REP_MOVSB_STOSB_FLAG 0x200 -#define CPUID_EBX_ENHANCED_REP_MOVSB_STOSB_MASK 0x01 -#define CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] If 1, supports INVPCID instruction for system software that manages process-context identifiers. - */ - uint32_t invpcid : 1; -#define CPUID_EBX_INVPCID_BIT 10 -#define CPUID_EBX_INVPCID_FLAG 0x400 -#define CPUID_EBX_INVPCID_MASK 0x01 -#define CPUID_EBX_INVPCID(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] RTM. - */ - uint32_t rtm : 1; -#define CPUID_EBX_RTM_BIT 11 -#define CPUID_EBX_RTM_FLAG 0x800 -#define CPUID_EBX_RTM_MASK 0x01 -#define CPUID_EBX_RTM(_) (((_) >> 11) & 0x01) - - /** - * [Bit 12] Supports Intel(R) Resource Director Technology (Intel(R) RDT) Monitoring capability if 1. - */ - uint32_t rdt_m : 1; -#define CPUID_EBX_RDT_M_BIT 12 -#define CPUID_EBX_RDT_M_FLAG 0x1000 -#define CPUID_EBX_RDT_M_MASK 0x01 -#define CPUID_EBX_RDT_M(_) (((_) >> 12) & 0x01) - - /** - * [Bit 13] Deprecates FPU CS and FPU DS values if 1. - */ - uint32_t deprecates : 1; -#define CPUID_EBX_DEPRECATES_BIT 13 -#define CPUID_EBX_DEPRECATES_FLAG 0x2000 -#define CPUID_EBX_DEPRECATES_MASK 0x01 -#define CPUID_EBX_DEPRECATES(_) (((_) >> 13) & 0x01) - - /** - * [Bit 14] Supports Intel(R) Memory Protection Extensions if 1. - */ - uint32_t mpx : 1; -#define CPUID_EBX_MPX_BIT 14 -#define CPUID_EBX_MPX_FLAG 0x4000 -#define CPUID_EBX_MPX_MASK 0x01 -#define CPUID_EBX_MPX(_) (((_) >> 14) & 0x01) - - /** - * [Bit 15] Supports Intel(R) Resource Director Technology (Intel(R) RDT) Allocation capability if 1. - */ - uint32_t rdt : 1; -#define CPUID_EBX_RDT_BIT 15 -#define CPUID_EBX_RDT_FLAG 0x8000 -#define CPUID_EBX_RDT_MASK 0x01 -#define CPUID_EBX_RDT(_) (((_) >> 15) & 0x01) - - /** - * [Bit 16] AVX512F. - */ - uint32_t avx512f : 1; -#define CPUID_EBX_AVX512F_BIT 16 -#define CPUID_EBX_AVX512F_FLAG 0x10000 -#define CPUID_EBX_AVX512F_MASK 0x01 -#define CPUID_EBX_AVX512F(_) (((_) >> 16) & 0x01) - - /** - * [Bit 17] AVX512DQ. - */ - uint32_t avx512dq : 1; -#define CPUID_EBX_AVX512DQ_BIT 17 -#define CPUID_EBX_AVX512DQ_FLAG 0x20000 -#define CPUID_EBX_AVX512DQ_MASK 0x01 -#define CPUID_EBX_AVX512DQ(_) (((_) >> 17) & 0x01) - - /** - * [Bit 18] RDSEED. - */ - uint32_t rdseed : 1; -#define CPUID_EBX_RDSEED_BIT 18 -#define CPUID_EBX_RDSEED_FLAG 0x40000 -#define CPUID_EBX_RDSEED_MASK 0x01 -#define CPUID_EBX_RDSEED(_) (((_) >> 18) & 0x01) - - /** - * [Bit 19] ADX. - */ - uint32_t adx : 1; -#define CPUID_EBX_ADX_BIT 19 -#define CPUID_EBX_ADX_FLAG 0x80000 -#define CPUID_EBX_ADX_MASK 0x01 -#define CPUID_EBX_ADX(_) (((_) >> 19) & 0x01) - - /** - * [Bit 20] Supports Supervisor-Mode Access Prevention (and the CLAC/STAC instructions) if 1. - */ - uint32_t smap : 1; -#define CPUID_EBX_SMAP_BIT 20 -#define CPUID_EBX_SMAP_FLAG 0x100000 -#define CPUID_EBX_SMAP_MASK 0x01 -#define CPUID_EBX_SMAP(_) (((_) >> 20) & 0x01) - - /** - * [Bit 21] AVX512_IFMA. - */ - uint32_t avx512_ifma : 1; -#define CPUID_EBX_AVX512_IFMA_BIT 21 -#define CPUID_EBX_AVX512_IFMA_FLAG 0x200000 -#define CPUID_EBX_AVX512_IFMA_MASK 0x01 -#define CPUID_EBX_AVX512_IFMA(_) (((_) >> 21) & 0x01) - uint32_t reserved1 : 1; - - /** - * [Bit 23] CLFLUSHOPT. - */ - uint32_t clflushopt : 1; -#define CPUID_EBX_CLFLUSHOPT_BIT 23 -#define CPUID_EBX_CLFLUSHOPT_FLAG 0x800000 -#define CPUID_EBX_CLFLUSHOPT_MASK 0x01 -#define CPUID_EBX_CLFLUSHOPT(_) (((_) >> 23) & 0x01) - - /** - * [Bit 24] CLWB. - */ - uint32_t clwb : 1; -#define CPUID_EBX_CLWB_BIT 24 -#define CPUID_EBX_CLWB_FLAG 0x1000000 -#define CPUID_EBX_CLWB_MASK 0x01 -#define CPUID_EBX_CLWB(_) (((_) >> 24) & 0x01) - - /** - * [Bit 25] Intel Processor Trace. - */ - uint32_t intel : 1; -#define CPUID_EBX_INTEL_BIT 25 -#define CPUID_EBX_INTEL_FLAG 0x2000000 -#define CPUID_EBX_INTEL_MASK 0x01 -#define CPUID_EBX_INTEL(_) (((_) >> 25) & 0x01) - - /** - * [Bit 26] (Intel(R) Xeon Phi(TM) only). - */ - uint32_t avx512pf : 1; -#define CPUID_EBX_AVX512PF_BIT 26 -#define CPUID_EBX_AVX512PF_FLAG 0x4000000 -#define CPUID_EBX_AVX512PF_MASK 0x01 -#define CPUID_EBX_AVX512PF(_) (((_) >> 26) & 0x01) - - /** - * [Bit 27] (Intel(R) Xeon Phi(TM) only). - */ - uint32_t avx512er : 1; -#define CPUID_EBX_AVX512ER_BIT 27 -#define CPUID_EBX_AVX512ER_FLAG 0x8000000 -#define CPUID_EBX_AVX512ER_MASK 0x01 -#define CPUID_EBX_AVX512ER(_) (((_) >> 27) & 0x01) - - /** - * [Bit 28] AVX512CD. - */ - uint32_t avx512cd : 1; -#define CPUID_EBX_AVX512CD_BIT 28 -#define CPUID_EBX_AVX512CD_FLAG 0x10000000 -#define CPUID_EBX_AVX512CD_MASK 0x01 -#define CPUID_EBX_AVX512CD(_) (((_) >> 28) & 0x01) - - /** - * [Bit 29] Supports Intel(R) Secure Hash Algorithm Extensions (Intel(R) SHA Extensions) if 1. - */ - uint32_t sha : 1; -#define CPUID_EBX_SHA_BIT 29 -#define CPUID_EBX_SHA_FLAG 0x20000000 -#define CPUID_EBX_SHA_MASK 0x01 -#define CPUID_EBX_SHA(_) (((_) >> 29) & 0x01) - - /** - * [Bit 30] AVX512BW. - */ - uint32_t avx512bw : 1; -#define CPUID_EBX_AVX512BW_BIT 30 -#define CPUID_EBX_AVX512BW_FLAG 0x40000000 -#define CPUID_EBX_AVX512BW_MASK 0x01 -#define CPUID_EBX_AVX512BW(_) (((_) >> 30) & 0x01) - - /** - * [Bit 31] AVX512VL. - */ - uint32_t avx512vl : 1; -#define CPUID_EBX_AVX512VL_BIT 31 -#define CPUID_EBX_AVX512VL_FLAG 0x80000000 -#define CPUID_EBX_AVX512VL_MASK 0x01 -#define CPUID_EBX_AVX512VL(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] (Intel(R) Xeon Phi(TM) only). - */ - uint32_t prefetchwt1 : 1; -#define CPUID_ECX_PREFETCHWT1_BIT 0 -#define CPUID_ECX_PREFETCHWT1_FLAG 0x01 -#define CPUID_ECX_PREFETCHWT1_MASK 0x01 -#define CPUID_ECX_PREFETCHWT1(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] AVX512_VBMI. - */ - uint32_t avx512_vbmi : 1; -#define CPUID_ECX_AVX512_VBMI_BIT 1 -#define CPUID_ECX_AVX512_VBMI_FLAG 0x02 -#define CPUID_ECX_AVX512_VBMI_MASK 0x01 -#define CPUID_ECX_AVX512_VBMI(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Supports user-mode instruction prevention if 1. - */ - uint32_t umip : 1; -#define CPUID_ECX_UMIP_BIT 2 -#define CPUID_ECX_UMIP_FLAG 0x04 -#define CPUID_ECX_UMIP_MASK 0x01 -#define CPUID_ECX_UMIP(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Supports protection keys for user-mode pages if 1. - */ - uint32_t pku : 1; -#define CPUID_ECX_PKU_BIT 3 -#define CPUID_ECX_PKU_FLAG 0x08 -#define CPUID_ECX_PKU_MASK 0x01 -#define CPUID_ECX_PKU(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] If 1, OS has set CR4.PKE to enable protection keys (and the RDPKRU/WRPKRU instructions). - */ - uint32_t ospke : 1; -#define CPUID_ECX_OSPKE_BIT 4 -#define CPUID_ECX_OSPKE_FLAG 0x10 -#define CPUID_ECX_OSPKE_MASK 0x01 -#define CPUID_ECX_OSPKE(_) (((_) >> 4) & 0x01) - uint32_t reserved1 : 12; - - /** - * [Bits 21:17] The value of MAWAU used by the BNDLDX and BNDSTX instructions in 64-bit mode. - */ - uint32_t mawau : 5; -#define CPUID_ECX_MAWAU_BIT 17 -#define CPUID_ECX_MAWAU_FLAG 0x3E0000 -#define CPUID_ECX_MAWAU_MASK 0x1F -#define CPUID_ECX_MAWAU(_) (((_) >> 17) & 0x1F) - - /** - * [Bit 22] RDPID and IA32_TSC_AUX are available if 1. - */ - uint32_t rdpid : 1; -#define CPUID_ECX_RDPID_BIT 22 -#define CPUID_ECX_RDPID_FLAG 0x400000 -#define CPUID_ECX_RDPID_MASK 0x01 -#define CPUID_ECX_RDPID(_) (((_) >> 22) & 0x01) - uint32_t reserved2 : 7; - - /** - * [Bit 30] Supports SGX Launch Configuration if 1. - */ - uint32_t sgx_lc : 1; -#define CPUID_ECX_SGX_LC_BIT 30 -#define CPUID_ECX_SGX_LC_FLAG 0x40000000 -#define CPUID_ECX_SGX_LC_MASK 0x01 -#define CPUID_ECX_SGX_LC(_) (((_) >> 30) & 0x01) - uint32_t reserved3 : 1; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_07; - - -/** - * @brief Direct Cache Access Information Leaf - * - * When CPUID executes with EAX set to 09H, the processor returns information about Direct Cache Access capabilities. - */ -#define CPUID_DIRECT_CACHE_ACCESS_INFORMATION 0x00000009 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Value of bits [31:0] of IA32_PLATFORM_DCA_CAP MSR (address 1F8H). - */ - uint32_t ia32_platform_dca_cap : 32; -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_BIT 0 -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_FLAG 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_MASK 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_09; - - -/** - * @brief Architectural Performance Monitoring Leaf - * - * When CPUID executes with EAX set to 0AH, the processor returns information about support for architectural performance - * monitoring capabilities. Architectural performance monitoring is supported if the version ID is greater than Pn 0. For - * each version of architectural performance monitoring capability, software must enumerate this leaf to discover the - * programming facilities and the architectural performance events available in the processor. - * - * @see Vol3C[23(Introduction to Virtual-Machine Extensions)] - */ -#define CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING 0x0000000A -typedef struct -{ - union - { - struct - { - /** - * [Bits 7:0] Version ID of architectural performance monitoring. - */ - uint32_t version_id_of_architectural_performance_monitoring : 8; -#define CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING_BIT 0 -#define CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING_FLAG 0xFF -#define CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING_MASK 0xFF -#define CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Number of general-purpose performance monitoring counter per logical processor. - */ - uint32_t number_of_performance_monitoring_counter_per_logical_processor : 8; -#define CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR_BIT 8 -#define CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR_FLAG 0xFF00 -#define CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR_MASK 0xFF -#define CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(_) (((_) >> 8) & 0xFF) - - /** - * [Bits 23:16] Bit width of general-purpose, performance monitoring counter. - */ - uint32_t bit_width_of_performance_monitoring_counter : 8; -#define CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER_BIT 16 -#define CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER_FLAG 0xFF0000 -#define CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER_MASK 0xFF -#define CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(_) (((_) >> 16) & 0xFF) - - /** - * [Bits 31:24] Length of EBX bit vector to enumerate architectural performance monitoring events. - */ - uint32_t ebx_bit_vector_length : 8; -#define CPUID_EAX_EBX_BIT_VECTOR_LENGTH_BIT 24 -#define CPUID_EAX_EBX_BIT_VECTOR_LENGTH_FLAG 0xFF000000 -#define CPUID_EAX_EBX_BIT_VECTOR_LENGTH_MASK 0xFF -#define CPUID_EAX_EBX_BIT_VECTOR_LENGTH(_) (((_) >> 24) & 0xFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bit 0] Core cycle event not available if 1. - */ - uint32_t core_cycle_event_not_available : 1; -#define CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE_BIT 0 -#define CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE_FLAG 0x01 -#define CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Instruction retired event not available if 1. - */ - uint32_t instruction_retired_event_not_available : 1; -#define CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_BIT 1 -#define CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_FLAG 0x02 -#define CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Reference cycles event not available if 1. - */ - uint32_t reference_cycles_event_not_available : 1; -#define CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE_BIT 2 -#define CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE_FLAG 0x04 -#define CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Last-level cache reference event not available if 1. - */ - uint32_t last_level_cache_reference_event_not_available : 1; -#define CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE_BIT 3 -#define CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE_FLAG 0x08 -#define CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Last-level cache misses event not available if 1. - */ - uint32_t last_level_cache_misses_event_not_available : 1; -#define CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE_BIT 4 -#define CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE_FLAG 0x10 -#define CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Branch instruction retired event not available if 1. - */ - uint32_t branch_instruction_retired_event_not_available : 1; -#define CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_BIT 5 -#define CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_FLAG 0x20 -#define CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Branch mispredict retired event not available if 1. - */ - uint32_t branch_mispredict_retired_event_not_available : 1; -#define CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE_BIT 6 -#define CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE_FLAG 0x40 -#define CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE_MASK 0x01 -#define CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(_) (((_) >> 6) & 0x01) - uint32_t reserved1 : 25; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 4:0] Number of fixed-function performance counters (if Version ID > 1). - */ - uint32_t number_of_fixed_function_performance_counters : 5; -#define CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_BIT 0 -#define CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_FLAG 0x1F -#define CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_MASK 0x1F -#define CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(_) (((_) >> 0) & 0x1F) - - /** - * [Bits 12:5] Bit width of fixed-function performance counters (if Version ID > 1). - */ - uint32_t bit_width_of_fixed_function_performance_counters : 8; -#define CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_BIT 5 -#define CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_FLAG 0x1FE0 -#define CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS_MASK 0xFF -#define CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(_) (((_) >> 5) & 0xFF) - uint32_t reserved1 : 2; - - /** - * [Bit 15] AnyThread deprecation. - */ - uint32_t any_thread_deprecation : 1; -#define CPUID_EDX_ANY_THREAD_DEPRECATION_BIT 15 -#define CPUID_EDX_ANY_THREAD_DEPRECATION_FLAG 0x8000 -#define CPUID_EDX_ANY_THREAD_DEPRECATION_MASK 0x01 -#define CPUID_EDX_ANY_THREAD_DEPRECATION(_) (((_) >> 15) & 0x01) - uint32_t reserved2 : 16; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0a; - - -/** - * @brief Extended Topology Enumeration Leaf - * - * When CPUID executes with EAX set to 0BH, the processor returns information about extended topology enumeration data. - * Software must detect the presence of CPUID leaf 0BH by verifying - * - the highest leaf index supported by CPUID is >= 0BH, and - * - CPUID.0BH:EBX[15:0] reports a non-zero value. - * - * @note Most of Leaf 0BH output depends on the initial value in ECX. The EDX output of leaf 0BH is always valid and does - * not vary with input value in ECX. Output value in ECX[7:0] always equals input value in ECX[7:0]. Sub-leaf index 0 - * enumerates SMT level. Each subsequent higher sub-leaf index enumerates a higherlevel topological entity in hierarchical - * order. For sub-leaves that return an invalid level-type of 0 in ECX[15:8]; EAX and EBX will return 0. If an input value - * n in ECX returns the invalid level-type of 0 in ECX[15:8], other input values with ECX > n also return 0 in ECX[15:8]. - */ -#define CPUID_EXTENDED_TOPOLOGY 0x0000000B -typedef struct -{ - union - { - struct - { - /** - * [Bits 4:0] Number of bits to shift right on x2APIC ID to get a unique topology ID of the next level type. All logical - * processors with the same next level ID share current level. - * - * @note Software should use this field (EAX[4:0]) to enumerate processor topology of the system. - */ - uint32_t x2apic_id_to_unique_topology_id_shift : 5; -#define CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT_BIT 0 -#define CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT_FLAG 0x1F -#define CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT_MASK 0x1F -#define CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(_) (((_) >> 0) & 0x1F) - uint32_t reserved1 : 27; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 15:0] Number of logical processors at this level type. The number reflects configuration as shipped by Intel. - * - * @note Software must not use EBX[15:0] to enumerate processor topology of the system. This value in this field - * (EBX[15:0]) is only intended for display/diagnostic purposes. The actual number of logical processors available to - * BIOS/OS/Applications may be different from the value of EBX[15:0], depending on software and platform hardware - * configurations. - */ - uint32_t number_of_logical_processors_at_this_level_type : 16; -#define CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE_BIT 0 -#define CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE_FLAG 0xFFFF -#define CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE_MASK 0xFFFF -#define CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 7:0] Level number. Same value in ECX input. - */ - uint32_t level_number : 8; -#define CPUID_ECX_LEVEL_NUMBER_BIT 0 -#define CPUID_ECX_LEVEL_NUMBER_FLAG 0xFF -#define CPUID_ECX_LEVEL_NUMBER_MASK 0xFF -#define CPUID_ECX_LEVEL_NUMBER(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Level type. - * - * @note The value of the "level type" field is not related to level numbers in any way, higher "level type" values do not - * mean higher levels. Level type field has the following encoding: - * - 0: Invalid. - * - 1: SMT. - * - 2: Core. - * - 3-255: Reserved. - */ - uint32_t level_type : 8; -#define CPUID_ECX_LEVEL_TYPE_BIT 8 -#define CPUID_ECX_LEVEL_TYPE_FLAG 0xFF00 -#define CPUID_ECX_LEVEL_TYPE_MASK 0xFF -#define CPUID_ECX_LEVEL_TYPE(_) (((_) >> 8) & 0xFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] x2APIC ID the current logical processor. - */ - uint32_t x2apic_id : 32; -#define CPUID_EDX_X2APIC_ID_BIT 0 -#define CPUID_EDX_X2APIC_ID_FLAG 0xFFFFFFFF -#define CPUID_EDX_X2APIC_ID_MASK 0xFFFFFFFF -#define CPUID_EDX_X2APIC_ID(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0b; - -/** - * @defgroup cpuid_eax_0d \ - * EAX = 0x0D - * - * When CPUID executes with EAX set to 0DH and ECX = 0, the processor returns information about the bit-vector - * representation of all processor state extensions that are supported in the processor and storage size requirements of - * the XSAVE/XRSTOR area. - * When CPUID executes with EAX set to 0DH and ECX = n (n > 1, and is a valid sub-leaf index), the processor returns - * information about the size and offset of each processor extended state save area within the XSAVE/XRSTOR area. Software - * can use the forward-extendable technique depicted below to query the valid sub-leaves and obtain size and offset - * information for each processor extended state save area: - *
 For i = 2 to 62 // sub-leaf 1 is reserved IF (CPUID.(EAX=0DH, ECX=0):VECTOR[i] = 1) // VECTOR is the 64-bit value
- * of EDX:EAX Execute CPUID.(EAX=0DH, ECX = i) to examine size and offset for sub-leaf i; FI; 
- * @{ - */ -#define CPUID_EXTENDED_STATE_INFORMATION 0x0000000D - /** - * @brief Processor Extended State Enumeration Main Leaf (EAX = 0DH, ECX = 0) - */ -typedef struct -{ - /** - * @brief Reports the supported bits of the lower 32 bits of XCR0. XCR0[n] can be set to 1 only if EAX[n] is 1 - */ - union - { - struct - { - /** - * [Bit 0] x87 state. - */ - uint32_t x87_state : 1; -#define CPUID_EAX_X87_STATE_BIT 0 -#define CPUID_EAX_X87_STATE_FLAG 0x01 -#define CPUID_EAX_X87_STATE_MASK 0x01 -#define CPUID_EAX_X87_STATE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] SSE state. - */ - uint32_t sse_state : 1; -#define CPUID_EAX_SSE_STATE_BIT 1 -#define CPUID_EAX_SSE_STATE_FLAG 0x02 -#define CPUID_EAX_SSE_STATE_MASK 0x01 -#define CPUID_EAX_SSE_STATE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] AVX state. - */ - uint32_t avx_state : 1; -#define CPUID_EAX_AVX_STATE_BIT 2 -#define CPUID_EAX_AVX_STATE_FLAG 0x04 -#define CPUID_EAX_AVX_STATE_MASK 0x01 -#define CPUID_EAX_AVX_STATE(_) (((_) >> 2) & 0x01) - - /** - * [Bits 4:3] MPX state. - */ - uint32_t mpx_state : 2; -#define CPUID_EAX_MPX_STATE_BIT 3 -#define CPUID_EAX_MPX_STATE_FLAG 0x18 -#define CPUID_EAX_MPX_STATE_MASK 0x03 -#define CPUID_EAX_MPX_STATE(_) (((_) >> 3) & 0x03) - - /** - * [Bits 7:5] AVX-512 state. - */ - uint32_t avx_512_state : 3; -#define CPUID_EAX_AVX_512_STATE_BIT 5 -#define CPUID_EAX_AVX_512_STATE_FLAG 0xE0 -#define CPUID_EAX_AVX_512_STATE_MASK 0x07 -#define CPUID_EAX_AVX_512_STATE(_) (((_) >> 5) & 0x07) - - /** - * [Bit 8] Used for IA32_XSS. - */ - uint32_t used_for_ia32_xss_1 : 1; -#define CPUID_EAX_USED_FOR_IA32_XSS_1_BIT 8 -#define CPUID_EAX_USED_FOR_IA32_XSS_1_FLAG 0x100 -#define CPUID_EAX_USED_FOR_IA32_XSS_1_MASK 0x01 -#define CPUID_EAX_USED_FOR_IA32_XSS_1(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] PKRU state. - */ - uint32_t pkru_state : 1; -#define CPUID_EAX_PKRU_STATE_BIT 9 -#define CPUID_EAX_PKRU_STATE_FLAG 0x200 -#define CPUID_EAX_PKRU_STATE_MASK 0x01 -#define CPUID_EAX_PKRU_STATE(_) (((_) >> 9) & 0x01) - uint32_t reserved1 : 3; - - /** - * [Bit 13] Used for IA32_XSS. - */ - uint32_t used_for_ia32_xss_2 : 1; -#define CPUID_EAX_USED_FOR_IA32_XSS_2_BIT 13 -#define CPUID_EAX_USED_FOR_IA32_XSS_2_FLAG 0x2000 -#define CPUID_EAX_USED_FOR_IA32_XSS_2_MASK 0x01 -#define CPUID_EAX_USED_FOR_IA32_XSS_2(_) (((_) >> 13) & 0x01) - uint32_t reserved2 : 18; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save area) required by enabled features in XCR0. - * May be different than ECX if some features at the end of the XSAVE save area are not enabled. - */ - uint32_t max_size_required_by_enabled_features_in_xcr0 : 32; -#define CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0_BIT 0 -#define CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0_FLAG 0xFFFFFFFF -#define CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0_MASK 0xFFFFFFFF -#define CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save area) of the XSAVE/XRSTOR save area - * required by all supported features in the processor, i.e., all the valid bit fields in XCR0. - */ - uint32_t max_size_of_xsave_xrstor_save_area : 32; -#define CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA_BIT 0 -#define CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA_FLAG 0xFFFFFFFF -#define CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA_MASK 0xFFFFFFFF -#define CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Reports the supported bits of the upper 32 bits of XCR0. XCR0[n+32] can be set to 1 only if EDX[n] is 1. - */ - uint32_t xcr0_supported_bits : 32; -#define CPUID_EDX_XCR0_SUPPORTED_BITS_BIT 0 -#define CPUID_EDX_XCR0_SUPPORTED_BITS_FLAG 0xFFFFFFFF -#define CPUID_EDX_XCR0_SUPPORTED_BITS_MASK 0xFFFFFFFF -#define CPUID_EDX_XCR0_SUPPORTED_BITS(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0d_ecx_00; - -/** - * @brief Direct Cache Access Information Leaf - */ -typedef struct -{ - union - { - struct - { - uint32_t reserved1 : 1; - - /** - * [Bit 1] Supports XSAVEC and the compacted form of XRSTOR if set. - */ - uint32_t supports_xsavec_and_compacted_xrstor : 1; -#define CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR_BIT 1 -#define CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR_FLAG 0x02 -#define CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR_MASK 0x01 -#define CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Supports XGETBV with ECX = 1 if set. - */ - uint32_t supports_xgetbv_with_ecx_1 : 1; -#define CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1_BIT 2 -#define CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1_FLAG 0x04 -#define CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1_MASK 0x01 -#define CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Supports XSAVES/XRSTORS and IA32_XSS if set. - */ - uint32_t supports_xsave_xrstor_and_ia32_xss : 1; -#define CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS_BIT 3 -#define CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS_FLAG 0x08 -#define CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS_MASK 0x01 -#define CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(_) (((_) >> 3) & 0x01) - uint32_t reserved2 : 28; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] The size in bytes of the XSAVE area containing all states enabled by XCRO | IA32_XSS. - */ - uint32_t size_of_xsave_aread : 32; -#define CPUID_EBX_SIZE_OF_XSAVE_AREAD_BIT 0 -#define CPUID_EBX_SIZE_OF_XSAVE_AREAD_FLAG 0xFFFFFFFF -#define CPUID_EBX_SIZE_OF_XSAVE_AREAD_MASK 0xFFFFFFFF -#define CPUID_EBX_SIZE_OF_XSAVE_AREAD(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 7:0] Used for XCR0. - */ - uint32_t used_for_xcr0_1 : 8; -#define CPUID_ECX_USED_FOR_XCR0_1_BIT 0 -#define CPUID_ECX_USED_FOR_XCR0_1_FLAG 0xFF -#define CPUID_ECX_USED_FOR_XCR0_1_MASK 0xFF -#define CPUID_ECX_USED_FOR_XCR0_1(_) (((_) >> 0) & 0xFF) - - /** - * [Bit 8] PT state. - */ - uint32_t pt_state : 1; -#define CPUID_ECX_PT_STATE_BIT 8 -#define CPUID_ECX_PT_STATE_FLAG 0x100 -#define CPUID_ECX_PT_STATE_MASK 0x01 -#define CPUID_ECX_PT_STATE(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Used for XCR0. - */ - uint32_t used_for_xcr0_2 : 1; -#define CPUID_ECX_USED_FOR_XCR0_2_BIT 9 -#define CPUID_ECX_USED_FOR_XCR0_2_FLAG 0x200 -#define CPUID_ECX_USED_FOR_XCR0_2_MASK 0x01 -#define CPUID_ECX_USED_FOR_XCR0_2(_) (((_) >> 9) & 0x01) - uint32_t reserved1 : 3; - - /** - * [Bit 13] HWP state. - */ - uint32_t hwp_state : 1; -#define CPUID_ECX_HWP_STATE_BIT 13 -#define CPUID_ECX_HWP_STATE_FLAG 0x2000 -#define CPUID_ECX_HWP_STATE_MASK 0x01 -#define CPUID_ECX_HWP_STATE(_) (((_) >> 13) & 0x01) - uint32_t reserved2 : 18; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0d_ecx_01; - -/** - * @brief Processor Extended State Enumeration Sub-leaves (EAX = 0DH, ECX = n, n > 1) - * - * @note Leaf 0DH output depends on the initial value in ECX. Each sub-leaf index (starting at position 2) is supported if - * it corresponds to a supported bit in either the XCR0 register or the IA32_XSS MSR. - * If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf n (0 <= n <= 31) is invalid if sub-leaf 0 - * returns 0 in EAX[n] and sub-leaf 1 returns 0 in ECX[n]. Sub-leaf n (32 <= n <= 63) is invalid if sub-leaf 0 returns 0 in - * EDX[n-32] and sub-leaf 1 returns 0 in EDX[n-32]. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] The size in bytes (from the offset specified in EBX) of the save area for an extended state feature - * associated with a valid sub-leaf index, n. - */ - uint32_t ia32_platform_dca_cap : 32; -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_BIT 0 -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_FLAG 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_MASK 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] The offset in bytes of this extended state component's save area from the beginning of the XSAVE/XRSTOR - * area. - * This field reports 0 if the sub-leaf index, n, does not map to a valid bit in the XCR0 register. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] Is set if the bit n (corresponding to the sub-leaf index) is supported in the IA32_XSS MSR; it is clear if bit n - * is instead supported in XCR0. - */ - uint32_t ecx_2 : 1; -#define CPUID_ECX_ECX_2_BIT 0 -#define CPUID_ECX_ECX_2_FLAG 0x01 -#define CPUID_ECX_ECX_2_MASK 0x01 -#define CPUID_ECX_ECX_2(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Is set if, when the compacted format of an XSAVE area is used, this extended state component located on the next - * 64-byte boundary following the preceding state component (otherwise, it is located immediately following the preceding - * state component). - */ - uint32_t ecx_1 : 1; -#define CPUID_ECX_ECX_1_BIT 1 -#define CPUID_ECX_ECX_1_FLAG 0x02 -#define CPUID_ECX_ECX_1_MASK 0x01 -#define CPUID_ECX_ECX_1(_) (((_) >> 1) & 0x01) - uint32_t reserved1 : 30; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] This field reports 0 if the sub-leaf index, n, is invalid; otherwise it is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0d_ecx_n; - -/** - * @} - */ - - /** - * @defgroup cpuid_eax_0f \ - * EAX = 0x0F - * - * When CPUID executes with EAX set to 0FH and ECX = 0, the processor returns information about the bit-vector - * representation of QoS monitoring resource types that are supported in the processor and maximum range of RMID values the - * processor can use to monitor of any supported resource types. Each bit, starting from bit 1, corresponds to a specific - * resource type if the bit is set. The bit position corresponds to the sub-leaf index (or ResID) that software must use to - * query QoS monitoring capability available for that type. See Table 3-8. - * When CPUID executes with EAX set to 0FH and ECX = n (n >= 1, and is a valid ResID), the processor returns information - * software can use to program IA32_PQR_ASSOC, IA32_QM_EVTSEL MSRs before reading QoS data from the IA32_QM_CTR MSR. - * @{ - */ -#define CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION 0x0000000F - /** - * @brief Intel Resource Director Technology (Intel RDT) Monitoring Enumeration Sub-leaf (EAX = 0FH, ECX = 0) - * - * @note Leaf 0FH output depends on the initial value in ECX. Sub-leaf index 0 reports valid resource type starting at bit - * position 1 of EDX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Maximum range (zero-based) of RMID within this physical processor of all types. - */ - uint32_t rmid_max_range : 32; -#define CPUID_EBX_RMID_MAX_RANGE_BIT 0 -#define CPUID_EBX_RMID_MAX_RANGE_FLAG 0xFFFFFFFF -#define CPUID_EBX_RMID_MAX_RANGE_MASK 0xFFFFFFFF -#define CPUID_EBX_RMID_MAX_RANGE(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - uint32_t reserved1 : 1; - - /** - * [Bit 1] Supports L3 Cache Intel RDT Monitoring if 1. - */ - uint32_t supports_l3_cache_intel_rdt_monitoring : 1; -#define CPUID_EDX_SUPPORTS_L3_CACHE_INTEL_RDT_MONITORING_BIT 1 -#define CPUID_EDX_SUPPORTS_L3_CACHE_INTEL_RDT_MONITORING_FLAG 0x02 -#define CPUID_EDX_SUPPORTS_L3_CACHE_INTEL_RDT_MONITORING_MASK 0x01 -#define CPUID_EDX_SUPPORTS_L3_CACHE_INTEL_RDT_MONITORING(_) (((_) >> 1) & 0x01) - uint32_t reserved2 : 30; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0f_ecx_00; - -/** - * @brief L3 Cache Intel RDT Monitoring Capability Enumeration Sub-leaf (EAX = 0FH, ECX = 1) - * - * @note Leaf 0FH output depends on the initial value in ECX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Conversion factor from reported IA32_QM_CTR value to occupancy metric (bytes). - */ - uint32_t conversion_factor : 32; -#define CPUID_EBX_CONVERSION_FACTOR_BIT 0 -#define CPUID_EBX_CONVERSION_FACTOR_FLAG 0xFFFFFFFF -#define CPUID_EBX_CONVERSION_FACTOR_MASK 0xFFFFFFFF -#define CPUID_EBX_CONVERSION_FACTOR(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Maximum range (zero-based) of RMID within this physical processor of all types. - */ - uint32_t rmid_max_range : 32; -#define CPUID_ECX_RMID_MAX_RANGE_BIT 0 -#define CPUID_ECX_RMID_MAX_RANGE_FLAG 0xFFFFFFFF -#define CPUID_ECX_RMID_MAX_RANGE_MASK 0xFFFFFFFF -#define CPUID_ECX_RMID_MAX_RANGE(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bit 0] Supports L3 occupancy monitoring if 1. - */ - uint32_t supports_l3_occupancy_monitoring : 1; -#define CPUID_EDX_SUPPORTS_L3_OCCUPANCY_MONITORING_BIT 0 -#define CPUID_EDX_SUPPORTS_L3_OCCUPANCY_MONITORING_FLAG 0x01 -#define CPUID_EDX_SUPPORTS_L3_OCCUPANCY_MONITORING_MASK 0x01 -#define CPUID_EDX_SUPPORTS_L3_OCCUPANCY_MONITORING(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Supports L3 Total Bandwidth monitoring if 1. - */ - uint32_t supports_l3_total_bandwidth_monitoring : 1; -#define CPUID_EDX_SUPPORTS_L3_TOTAL_BANDWIDTH_MONITORING_BIT 1 -#define CPUID_EDX_SUPPORTS_L3_TOTAL_BANDWIDTH_MONITORING_FLAG 0x02 -#define CPUID_EDX_SUPPORTS_L3_TOTAL_BANDWIDTH_MONITORING_MASK 0x01 -#define CPUID_EDX_SUPPORTS_L3_TOTAL_BANDWIDTH_MONITORING(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Supports L3 Local Bandwidth monitoring if 1. - */ - uint32_t supports_l3_local_bandwidth_monitoring : 1; -#define CPUID_EDX_SUPPORTS_L3_LOCAL_BANDWIDTH_MONITORING_BIT 2 -#define CPUID_EDX_SUPPORTS_L3_LOCAL_BANDWIDTH_MONITORING_FLAG 0x04 -#define CPUID_EDX_SUPPORTS_L3_LOCAL_BANDWIDTH_MONITORING_MASK 0x01 -#define CPUID_EDX_SUPPORTS_L3_LOCAL_BANDWIDTH_MONITORING(_) (((_) >> 2) & 0x01) - uint32_t reserved1 : 29; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_0f_ecx_01; - -/** - * @} - */ - - /** - * @defgroup cpuid_eax_10 \ - * EAX = 0x10 - * - * When CPUID executes with EAX set to 10H and ECX = 0, the processor returns information about the bit-vector - * representation of QoS Enforcement resource types that are supported in the processor. Each bit, starting from bit 1, - * corresponds to a specific resource type if the bit is set. The bit position corresponds to the sub-leaf index (or ResID) - * that software must use to query QoS enforcement capability available for that type. - * When CPUID executes with EAX set to 10H and ECX = n (n >= 1, and is a valid ResID), the processor returns information - * about available classes of service and range of QoS mask MSRs that software can use to configure each class of services - * using capability bit masks in the QoS Mask registers, IA32_resourceType_Mask_n. - * @{ - */ -#define CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_ALLOCATION_INFORMATION 0x00000010 - /** - * @brief Intel Resource Director Technology (Intel RDT) Allocation Enumeration Sub-leaf (EAX = 10H, ECX = 0) - * - * @note Leaf 10H output depends on the initial value in ECX. Sub-leaf index 0 reports valid resource identification - * (ResID) starting at bit position 1 of EBX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Value of bits [31:0] of IA32_PLATFORM_DCA_CAP MSR (address 1F8H). - */ - uint32_t ia32_platform_dca_cap : 32; -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_BIT 0 -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_FLAG 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP_MASK 0xFFFFFFFF -#define CPUID_EAX_IA32_PLATFORM_DCA_CAP(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - uint32_t reserved1 : 1; - - /** - * [Bit 1] Supports L3 Cache Allocation Technology if 1. - */ - uint32_t supports_l3_cache_allocation_technology : 1; -#define CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY_BIT 1 -#define CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY_FLAG 0x02 -#define CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY_MASK 0x01 -#define CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Supports L2 Cache Allocation Technology if 1. - */ - uint32_t supports_l2_cache_allocation_technology : 1; -#define CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY_BIT 2 -#define CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY_FLAG 0x04 -#define CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY_MASK 0x01 -#define CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Supports Memory Bandwidth Allocation if 1. - */ - uint32_t supports_memory_bandwidth_allocation : 1; -#define CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION_BIT 3 -#define CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION_FLAG 0x08 -#define CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION_MASK 0x01 -#define CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(_) (((_) >> 3) & 0x01) - uint32_t reserved2 : 28; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_10_ecx_00; - -/** - * @brief L3 Cache Allocation Technology Enumeration Sub-leaf (EAX = 10H, ECX = ResID = 1) - * - * @note Leaf 10H output depends on the initial value in ECX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 4:0] Length of the capacity bit mask for the corresponding ResID using minus-one notation. - */ - uint32_t length_of_capacity_bit_mask : 5; -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_BIT 0 -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_FLAG 0x1F -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_MASK 0x1F -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(_) (((_) >> 0) & 0x1F) - uint32_t reserved1 : 27; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Bit-granular map of isolation/contention of allocation units. - */ - uint32_t ebx_0 : 32; -#define CPUID_EBX_EBX_0_BIT 0 -#define CPUID_EBX_EBX_0_FLAG 0xFFFFFFFF -#define CPUID_EBX_EBX_0_MASK 0xFFFFFFFF -#define CPUID_EBX_EBX_0(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - uint32_t reserved1 : 2; - - /** - * [Bit 2] Code and Data Prioritization Technology supported if 1. - */ - uint32_t code_and_data_priorization_technology_supported : 1; -#define CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED_BIT 2 -#define CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED_FLAG 0x04 -#define CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED_MASK 0x01 -#define CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(_) (((_) >> 2) & 0x01) - uint32_t reserved2 : 29; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 15:0] Highest COS number supported for this ResID. - */ - uint32_t highest_cos_number_supported : 16; -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_BIT 0 -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_FLAG 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_MASK 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_10_ecx_01; - -/** - * @brief L2 Cache Allocation Technology Enumeration Sub-leaf (EAX = 10H, ECX = ResID = 2) - * - * @note Leaf 10H output depends on the initial value in ECX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 4:0] Length of the capacity bit mask for the corresponding ResID using minus-one notation. - */ - uint32_t length_of_capacity_bit_mask : 5; -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_BIT 0 -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_FLAG 0x1F -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK_MASK 0x1F -#define CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(_) (((_) >> 0) & 0x1F) - uint32_t reserved1 : 27; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Bit-granular map of isolation/contention of allocation units. - */ - uint32_t ebx_0 : 32; -#define CPUID_EBX_EBX_0_BIT 0 -#define CPUID_EBX_EBX_0_FLAG 0xFFFFFFFF -#define CPUID_EBX_EBX_0_MASK 0xFFFFFFFF -#define CPUID_EBX_EBX_0(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 15:0] Highest COS number supported for this ResID. - */ - uint32_t highest_cos_number_supported : 16; -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_BIT 0 -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_FLAG 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_MASK 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_10_ecx_02; - -/** - * @brief Memory Bandwidth Allocation Enumeration Sub-leaf (EAX = 10H, ECX = ResID = 3) - * - * @note Leaf 10H output depends on the initial value in ECX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 11:0] Reports the maximum MBA throttling value supported for the corresponding ResID using minus-one notation. - */ - uint32_t max_mba_throttling_value : 12; -#define CPUID_EAX_MAX_MBA_THROTTLING_VALUE_BIT 0 -#define CPUID_EAX_MAX_MBA_THROTTLING_VALUE_FLAG 0xFFF -#define CPUID_EAX_MAX_MBA_THROTTLING_VALUE_MASK 0xFFF -#define CPUID_EAX_MAX_MBA_THROTTLING_VALUE(_) (((_) >> 0) & 0xFFF) - uint32_t reserved1 : 20; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - uint32_t reserved1 : 2; - - /** - * [Bit 2] Reports whether the response of the delay values is linear. - */ - uint32_t response_of_delay_is_linear : 1; -#define CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR_BIT 2 -#define CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR_FLAG 0x04 -#define CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR_MASK 0x01 -#define CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(_) (((_) >> 2) & 0x01) - uint32_t reserved2 : 29; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 15:0] Highest COS number supported for this ResID. - */ - uint32_t highest_cos_number_supported : 16; -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_BIT 0 -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_FLAG 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED_MASK 0xFFFF -#define CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_10_ecx_03; - -/** - * @} - */ - - /** - * @defgroup cpuid_eax_12 \ - * EAX = 0x12 - * - * When CPUID executes with EAX set to 12H and ECX = 0H, the processor returns information about Intel SGX capabilities. - * When CPUID executes with EAX set to 12H and ECX = 1H, the processor returns information about Intel SGX attributes. - * When CPUID executes with EAX set to 12H and ECX = n (n > 1), the processor returns information about Intel SGX Enclave - * Page Cache. - * @{ - */ -#define CPUID_INTEL_SGX 0x00000012 - /** - * @brief Intel SGX Capability Enumeration Leaf, sub-leaf 0 (EAX = 12H, ECX = 0) - * - * @note Leaf 12H sub-leaf 0 (ECX = 0) is supported if CPUID.(EAX=07H, ECX=0H):EBX[SGX] = 1. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bit 0] If 1, Indicates Intel SGX supports the collection of SGX1 leaf functions. - */ - uint32_t sgx1 : 1; -#define CPUID_EAX_SGX1_BIT 0 -#define CPUID_EAX_SGX1_FLAG 0x01 -#define CPUID_EAX_SGX1_MASK 0x01 -#define CPUID_EAX_SGX1(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] If 1, Indicates Intel SGX supports the collection of SGX2 leaf functions. - */ - uint32_t sgx2 : 1; -#define CPUID_EAX_SGX2_BIT 1 -#define CPUID_EAX_SGX2_FLAG 0x02 -#define CPUID_EAX_SGX2_MASK 0x01 -#define CPUID_EAX_SGX2(_) (((_) >> 1) & 0x01) - uint32_t reserved1 : 3; - - /** - * [Bit 5] If 1, indicates Intel SGX supports ENCLV instruction leaves EINCVIRTCHILD, EDECVIRTCHILD, and ESETCONTEXT. - */ - uint32_t sgx_enclv_advanced : 1; -#define CPUID_EAX_SGX_ENCLV_ADVANCED_BIT 5 -#define CPUID_EAX_SGX_ENCLV_ADVANCED_FLAG 0x20 -#define CPUID_EAX_SGX_ENCLV_ADVANCED_MASK 0x01 -#define CPUID_EAX_SGX_ENCLV_ADVANCED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] If 1, indicates Intel SGX supports ENCLS instruction leaves ETRACKC, ERDINFO, ELDBC, and ELDUC. - */ - uint32_t sgx_encls_advanced : 1; -#define CPUID_EAX_SGX_ENCLS_ADVANCED_BIT 6 -#define CPUID_EAX_SGX_ENCLS_ADVANCED_FLAG 0x40 -#define CPUID_EAX_SGX_ENCLS_ADVANCED_MASK 0x01 -#define CPUID_EAX_SGX_ENCLS_ADVANCED(_) (((_) >> 6) & 0x01) - uint32_t reserved2 : 25; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Bit vector of supported extended SGX features. - */ - uint32_t miscselect : 32; -#define CPUID_EBX_MISCSELECT_BIT 0 -#define CPUID_EBX_MISCSELECT_FLAG 0xFFFFFFFF -#define CPUID_EBX_MISCSELECT_MASK 0xFFFFFFFF -#define CPUID_EBX_MISCSELECT(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 7:0] The maximum supported enclave size in non-64-bit mode is 2^(EDX[7:0]). - */ - uint32_t max_enclave_size_not64 : 8; -#define CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64_BIT 0 -#define CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64_FLAG 0xFF -#define CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64_MASK 0xFF -#define CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] The maximum supported enclave size in 64-bit mode is 2^(EDX[15:8]). - */ - uint32_t max_enclave_size_64 : 8; -#define CPUID_EDX_MAX_ENCLAVE_SIZE_64_BIT 8 -#define CPUID_EDX_MAX_ENCLAVE_SIZE_64_FLAG 0xFF00 -#define CPUID_EDX_MAX_ENCLAVE_SIZE_64_MASK 0xFF -#define CPUID_EDX_MAX_ENCLAVE_SIZE_64(_) (((_) >> 8) & 0xFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_12_ecx_00; - -/** - * @brief Intel SGX Attributes Enumeration Leaf, sub-leaf 1 (EAX = 12H, ECX = 1) - * - * @note Leaf 12H sub-leaf 1 (ECX = 1) is supported if CPUID.(EAX=07H, ECX=0H):EBX[SGX] = 1. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reports the valid bits of SECS.ATTRIBUTES[31:0] that software can set with ECREATE. - */ - uint32_t valid_secs_attributes_0 : 32; -#define CPUID_EAX_VALID_SECS_ATTRIBUTES_0_BIT 0 -#define CPUID_EAX_VALID_SECS_ATTRIBUTES_0_FLAG 0xFFFFFFFF -#define CPUID_EAX_VALID_SECS_ATTRIBUTES_0_MASK 0xFFFFFFFF -#define CPUID_EAX_VALID_SECS_ATTRIBUTES_0(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Reports the valid bits of SECS.ATTRIBUTES[63:32] that software can set with ECREATE. - */ - uint32_t valid_secs_attributes_1 : 32; -#define CPUID_EBX_VALID_SECS_ATTRIBUTES_1_BIT 0 -#define CPUID_EBX_VALID_SECS_ATTRIBUTES_1_FLAG 0xFFFFFFFF -#define CPUID_EBX_VALID_SECS_ATTRIBUTES_1_MASK 0xFFFFFFFF -#define CPUID_EBX_VALID_SECS_ATTRIBUTES_1(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Reports the valid bits of SECS.ATTRIBUTES[95:64] that software can set with ECREATE. - */ - uint32_t valid_secs_attributes_2 : 32; -#define CPUID_ECX_VALID_SECS_ATTRIBUTES_2_BIT 0 -#define CPUID_ECX_VALID_SECS_ATTRIBUTES_2_FLAG 0xFFFFFFFF -#define CPUID_ECX_VALID_SECS_ATTRIBUTES_2_MASK 0xFFFFFFFF -#define CPUID_ECX_VALID_SECS_ATTRIBUTES_2(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Reports the valid bits of SECS.ATTRIBUTES[127:96] that software can set with ECREATE. - */ - uint32_t valid_secs_attributes_3 : 32; -#define CPUID_EDX_VALID_SECS_ATTRIBUTES_3_BIT 0 -#define CPUID_EDX_VALID_SECS_ATTRIBUTES_3_FLAG 0xFFFFFFFF -#define CPUID_EDX_VALID_SECS_ATTRIBUTES_3_MASK 0xFFFFFFFF -#define CPUID_EDX_VALID_SECS_ATTRIBUTES_3(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_12_ecx_01; - -/** - * @brief Intel SGX EPC Enumeration Leaf, sub-leaves (EAX = 12H, ECX = 2 or higher) - * - * @note Leaf 12H sub-leaf 2 or higher (ECX >= 2) is supported if CPUID.(EAX=07H, ECX=0H):EBX[SGX] = 1. - * This structure describes sub-leaf type 0. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 3:0] Sub-leaf Type 0. Indicates this sub-leaf is invalid. - */ - uint32_t sub_leaf_type : 4; -#define CPUID_EAX_SUB_LEAF_TYPE_BIT 0 -#define CPUID_EAX_SUB_LEAF_TYPE_FLAG 0x0F -#define CPUID_EAX_SUB_LEAF_TYPE_MASK 0x0F -#define CPUID_EAX_SUB_LEAF_TYPE(_) (((_) >> 0) & 0x0F) - uint32_t reserved1 : 28; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is zero. - */ - uint32_t zero : 32; -#define CPUID_EBX_ZERO_BIT 0 -#define CPUID_EBX_ZERO_FLAG 0xFFFFFFFF -#define CPUID_EBX_ZERO_MASK 0xFFFFFFFF -#define CPUID_EBX_ZERO(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is zero. - */ - uint32_t zero : 32; -#define CPUID_ECX_ZERO_BIT 0 -#define CPUID_ECX_ZERO_FLAG 0xFFFFFFFF -#define CPUID_ECX_ZERO_MASK 0xFFFFFFFF -#define CPUID_ECX_ZERO(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is zero. - */ - uint32_t zero : 32; -#define CPUID_EDX_ZERO_BIT 0 -#define CPUID_EDX_ZERO_FLAG 0xFFFFFFFF -#define CPUID_EDX_ZERO_MASK 0xFFFFFFFF -#define CPUID_EDX_ZERO(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_12_ecx_02p_slt_0; - -/** - * @brief Intel SGX EPC Enumeration Leaf, sub-leaves (EAX = 12H, ECX = 2 or higher) - * - * @note Leaf 12H sub-leaf 2 or higher (ECX >= 2) is supported if CPUID.(EAX=07H, ECX=0H):EBX[SGX] = 1. - * This structure describes sub-leaf type 1. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 3:0] Sub-leaf Type 1. This sub-leaf enumerates an EPC section. EBX:EAX and EDX:ECX provide information on the - * Enclave Page Cache (EPC) section. - */ - uint32_t sub_leaf_type : 4; -#define CPUID_EAX_SUB_LEAF_TYPE_BIT 0 -#define CPUID_EAX_SUB_LEAF_TYPE_FLAG 0x0F -#define CPUID_EAX_SUB_LEAF_TYPE_MASK 0x0F -#define CPUID_EAX_SUB_LEAF_TYPE(_) (((_) >> 0) & 0x0F) - uint32_t reserved1 : 8; - - /** - * [Bits 31:12] Bits 31:12 of the physical address of the base of the EPC section. - */ - uint32_t epc_base_physical_address_1 : 20; -#define CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1_BIT 12 -#define CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1_FLAG 0xFFFFF000 -#define CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1_MASK 0xFFFFF -#define CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(_) (((_) >> 12) & 0xFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 19:0] Bits 51:32 of the physical address of the base of the EPC section. - */ - uint32_t epc_base_physical_address_2 : 20; -#define CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2_BIT 0 -#define CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2_FLAG 0xFFFFF -#define CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2_MASK 0xFFFFF -#define CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(_) (((_) >> 0) & 0xFFFFF) - uint32_t reserved1 : 12; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 3:0] EPC section property encoding defined as follows: - * - If EAX[3:0] 0000b, then all bits of the EDX:ECX pair are enumerated as 0. - * - If EAX[3:0] 0001b, then this section has confidentiality and integrity protection. - * All other encodings are reserved. - */ - uint32_t epc_section_property : 4; -#define CPUID_ECX_EPC_SECTION_PROPERTY_BIT 0 -#define CPUID_ECX_EPC_SECTION_PROPERTY_FLAG 0x0F -#define CPUID_ECX_EPC_SECTION_PROPERTY_MASK 0x0F -#define CPUID_ECX_EPC_SECTION_PROPERTY(_) (((_) >> 0) & 0x0F) - uint32_t reserved1 : 8; - - /** - * [Bits 31:12] Bits 31:12 of the size of the corresponding EPC section within the Processor Reserved Memory. - */ - uint32_t epc_size_1 : 20; -#define CPUID_ECX_EPC_SIZE_1_BIT 12 -#define CPUID_ECX_EPC_SIZE_1_FLAG 0xFFFFF000 -#define CPUID_ECX_EPC_SIZE_1_MASK 0xFFFFF -#define CPUID_ECX_EPC_SIZE_1(_) (((_) >> 12) & 0xFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 19:0] Bits 51:32 of the size of the corresponding EPC section within the Processor Reserved Memory. - */ - uint32_t epc_size_2 : 20; -#define CPUID_EDX_EPC_SIZE_2_BIT 0 -#define CPUID_EDX_EPC_SIZE_2_FLAG 0xFFFFF -#define CPUID_EDX_EPC_SIZE_2_MASK 0xFFFFF -#define CPUID_EDX_EPC_SIZE_2(_) (((_) >> 0) & 0xFFFFF) - uint32_t reserved1 : 12; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_12_ecx_02p_slt_1; - -/** - * @} - */ - - /** - * @defgroup cpuid_eax_14 \ - * EAX = 0x14 - * - * When CPUID executes with EAX set to 14H and ECX = 0H, the processor returns information about Intel Processor Trace - * extensions. - * When CPUID executes with EAX set to 14H and ECX = n (n > 0 and less than the number of non-zero bits in CPUID.(EAX=14H, - * ECX= 0H).EAX), the processor returns information about packet generation in Intel Processor Trace. - * @{ - */ -#define CPUID_INTEL_PROCESSOR_TRACE_INFORMATION 0x00000014 - /** - * @brief Intel Processor Trace Enumeration Main Leaf (EAX = 14H, ECX = 0) - * - * @note Leaf 14H main leaf (ECX = 0). - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reports the maximum sub-leaf supported in leaf 14H. - */ - uint32_t max_sub_leaf : 32; -#define CPUID_EAX_MAX_SUB_LEAF_BIT 0 -#define CPUID_EAX_MAX_SUB_LEAF_FLAG 0xFFFFFFFF -#define CPUID_EAX_MAX_SUB_LEAF_MASK 0xFFFFFFFF -#define CPUID_EAX_MAX_SUB_LEAF(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bit 0] If 1, indicates that IA32_RTIT_CTL.CR3Filter can be set to 1, and that IA32_RTIT_CR3_MATCH MSR can be accessed. - */ - uint32_t flag0 : 1; -#define CPUID_EBX_FLAG0_BIT 0 -#define CPUID_EBX_FLAG0_FLAG 0x01 -#define CPUID_EBX_FLAG0_MASK 0x01 -#define CPUID_EBX_FLAG0(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] If 1, indicates support of Configurable PSB and Cycle-Accurate Mode. - */ - uint32_t flag1 : 1; -#define CPUID_EBX_FLAG1_BIT 1 -#define CPUID_EBX_FLAG1_FLAG 0x02 -#define CPUID_EBX_FLAG1_MASK 0x01 -#define CPUID_EBX_FLAG1(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If 1, indicates support of IP Filtering, TraceStop filtering, and preservation of Intel PT MSRs across warm - * reset. - */ - uint32_t flag2 : 1; -#define CPUID_EBX_FLAG2_BIT 2 -#define CPUID_EBX_FLAG2_FLAG 0x04 -#define CPUID_EBX_FLAG2_MASK 0x01 -#define CPUID_EBX_FLAG2(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] If 1, indicates support of MTC timing packet and suppression of COFI-based packets. - */ - uint32_t flag3 : 1; -#define CPUID_EBX_FLAG3_BIT 3 -#define CPUID_EBX_FLAG3_FLAG 0x08 -#define CPUID_EBX_FLAG3_MASK 0x01 -#define CPUID_EBX_FLAG3(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] If 1, indicates support of PTWRITE. Writes can set IA32_RTIT_CTL[12] (PTWEn) and IA32_RTIT_CTL[5] (FUPonPTW), - * and PTWRITE can generate packets. - */ - uint32_t flag4 : 1; -#define CPUID_EBX_FLAG4_BIT 4 -#define CPUID_EBX_FLAG4_FLAG 0x10 -#define CPUID_EBX_FLAG4_MASK 0x01 -#define CPUID_EBX_FLAG4(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] If 1, indicates support of Power Event Trace. Writes can set IA32_RTIT_CTL[4] (PwrEvtEn), enabling Power Event - * Trace packet generation. - */ - uint32_t flag5 : 1; -#define CPUID_EBX_FLAG5_BIT 5 -#define CPUID_EBX_FLAG5_FLAG 0x20 -#define CPUID_EBX_FLAG5_MASK 0x01 -#define CPUID_EBX_FLAG5(_) (((_) >> 5) & 0x01) - uint32_t reserved1 : 26; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] If 1, Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1, hence utilizing the ToPA output scheme; - * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be accessed. - */ - uint32_t flag0 : 1; -#define CPUID_ECX_FLAG0_BIT 0 -#define CPUID_ECX_FLAG0_FLAG 0x01 -#define CPUID_ECX_FLAG0_MASK 0x01 -#define CPUID_ECX_FLAG0(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] If 1, ToPA tables can hold any number of output entries, up to the maximum allowed by the MaskOrTableOffset - * field of IA32_RTIT_OUTPUT_MASK_PTRS. - */ - uint32_t flag1 : 1; -#define CPUID_ECX_FLAG1_BIT 1 -#define CPUID_ECX_FLAG1_FLAG 0x02 -#define CPUID_ECX_FLAG1_MASK 0x01 -#define CPUID_ECX_FLAG1(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If 1, indicates support of Single-Range Output scheme. - */ - uint32_t flag2 : 1; -#define CPUID_ECX_FLAG2_BIT 2 -#define CPUID_ECX_FLAG2_FLAG 0x04 -#define CPUID_ECX_FLAG2_MASK 0x01 -#define CPUID_ECX_FLAG2(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] If 1, indicates support of output to Trace Transport subsystem. - */ - uint32_t flag3 : 1; -#define CPUID_ECX_FLAG3_BIT 3 -#define CPUID_ECX_FLAG3_FLAG 0x08 -#define CPUID_ECX_FLAG3_MASK 0x01 -#define CPUID_ECX_FLAG3(_) (((_) >> 3) & 0x01) - uint32_t reserved1 : 27; - - /** - * [Bit 31] If 1, generated packets which contain IP payloads have LIP values, which include the CS base component. - */ - uint32_t flag31 : 1; -#define CPUID_ECX_FLAG31_BIT 31 -#define CPUID_ECX_FLAG31_FLAG 0x80000000 -#define CPUID_ECX_FLAG31_MASK 0x01 -#define CPUID_ECX_FLAG31(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_14_ecx_00; - -/** - * @brief Intel Processor Trace Enumeration Sub-leaf (EAX = 14H, ECX = 1) - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 2:0] Number of configurable Address Ranges for filtering. - */ - uint32_t number_of_configurable_address_ranges_for_filtering : 3; -#define CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING_BIT 0 -#define CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING_FLAG 0x07 -#define CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING_MASK 0x07 -#define CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(_) (((_) >> 0) & 0x07) - uint32_t reserved1 : 13; - - /** - * [Bits 31:16] Bitmap of supported MTC period encodings. - */ - uint32_t bitmap_of_supported_mtc_period_encodings : 16; -#define CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS_BIT 16 -#define CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS_FLAG 0xFFFF0000 -#define CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS_MASK 0xFFFF -#define CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(_) (((_) >> 16) & 0xFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 15:0] Bitmap of supported Cycle Threshold value encodings. - */ - uint32_t bitmap_of_supported_cycle_threshold_value_encodings : 16; -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS_BIT 0 -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS_FLAG 0xFFFF -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS_MASK 0xFFFF -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(_) (((_) >> 0) & 0xFFFF) - - /** - * [Bits 31:16] Bitmap of supported Configurable PSB frequency encodings. - */ - uint32_t bitmap_of_supported_configurable_psb_frequency_encodings : 16; -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS_BIT 16 -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS_FLAG 0xFFFF0000 -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS_MASK 0xFFFF -#define CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(_) (((_) >> 16) & 0xFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_14_ecx_01; - -/** - * @} - */ - - - /** - * @brief Stamp Counter and Nominal Core Crystal Clock Information Leaf - * - * When CPUID executes with EAX set to 15H and ECX = 0H, the processor returns information about Time Stamp Counter and - * Core Crystal Clock. - * - * @note If EBX[31:0] is 0, the TSC/"core crystal clock" ratio is not enumerated. EBX[31:0]/EAX[31:0] indicates the ratio - * of the TSC frequency and the core crystal clock frequency. - * If ECX is 0, the nominal core crystal clock frequency is not enumerated. "TSC frequency" = "core crystal clock - * frequency" * EBX/EAX. - */ -#define CPUID_TIME_STAMP_COUNTER_INFORMATION 0x00000015 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] An unsigned integer which is the denominator of the TSC/"core crystal clock" ratio. - */ - uint32_t denominator : 32; -#define CPUID_EAX_DENOMINATOR_BIT 0 -#define CPUID_EAX_DENOMINATOR_FLAG 0xFFFFFFFF -#define CPUID_EAX_DENOMINATOR_MASK 0xFFFFFFFF -#define CPUID_EAX_DENOMINATOR(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] An unsigned integer which is the numerator of the TSC/"core crystal clock" ratio. - */ - uint32_t numerator : 32; -#define CPUID_EBX_NUMERATOR_BIT 0 -#define CPUID_EBX_NUMERATOR_FLAG 0xFFFFFFFF -#define CPUID_EBX_NUMERATOR_MASK 0xFFFFFFFF -#define CPUID_EBX_NUMERATOR(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] An unsigned integer which is the nominal frequency of the core crystal clock in Hz. - */ - uint32_t nominal_frequency : 32; -#define CPUID_ECX_NOMINAL_FREQUENCY_BIT 0 -#define CPUID_ECX_NOMINAL_FREQUENCY_FLAG 0xFFFFFFFF -#define CPUID_ECX_NOMINAL_FREQUENCY_MASK 0xFFFFFFFF -#define CPUID_ECX_NOMINAL_FREQUENCY(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_15; - - -/** - * @brief Processor Frequency Information Leaf - * - * When CPUID executes with EAX set to 16H, the processor returns information about Processor Frequency Information. - * - * @note Data is returned from this interface in accordance with the processor's specification and does not reflect actual - * values. Suitable use of this data includes the display of processor information in like manner to the processor brand - * string and for determining the appropriate range to use when displaying processor information e.g. frequency history - * graphs. The returned information should not be used for any other purpose as the returned information does not - * accurately correlate to information / counters returned by other processor interfaces. - * While a processor may support the Processor Frequency Information leaf, fields that return a value of zero are not - * supported. - */ -#define CPUID_PROCESSOR_FREQUENCY_INFORMATION 0x00000016 -typedef struct -{ - union - { - struct - { - /** - * [Bits 15:0] Processor Base Frequency (in MHz). - */ - uint32_t procesor_base_frequency_mhz : 16; -#define CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ_BIT 0 -#define CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ_FLAG 0xFFFF -#define CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ_MASK 0xFFFF -#define CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 15:0] Maximum Frequency (in MHz). - */ - uint32_t processor_maximum_frequency_mhz : 16; -#define CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ_BIT 0 -#define CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ_FLAG 0xFFFF -#define CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ_MASK 0xFFFF -#define CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 15:0] Bus (Reference) Frequency (in MHz). - */ - uint32_t bus_frequency_mhz : 16; -#define CPUID_ECX_BUS_FREQUENCY_MHZ_BIT 0 -#define CPUID_ECX_BUS_FREQUENCY_MHZ_FLAG 0xFFFF -#define CPUID_ECX_BUS_FREQUENCY_MHZ_MASK 0xFFFF -#define CPUID_ECX_BUS_FREQUENCY_MHZ(_) (((_) >> 0) & 0xFFFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_16; - -/** - * @defgroup cpuid_eax_17 \ - * EAX = 0x17 - * - * When CPUID executes with EAX set to 17H, the processor returns information about the System-On-Chip Vendor Attribute - * Enumeration. - * @{ - */ -#define CPUID_SOC_VENDOR_INFORMATION 0x00000017 - /** - * @brief System-On-Chip Vendor Attribute Enumeration Main Leaf (EAX = 17H, ECX = 0) - * - * @note Leaf 17H main leaf (ECX = 0). Leaf 17H output depends on the initial value in ECX. Leaf 17H sub-leaves 1 through 3 - * reports SOC Vendor Brand String. Leaf 17H is valid if MaxSOCID_Index >= 3. Leaf 17H sub-leaves 4 and above are reserved. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reports the maximum input value of supported sub-leaf in leaf 17H. - */ - uint32_t max_soc_id_index : 32; -#define CPUID_EAX_MAX_SOC_ID_INDEX_BIT 0 -#define CPUID_EAX_MAX_SOC_ID_INDEX_FLAG 0xFFFFFFFF -#define CPUID_EAX_MAX_SOC_ID_INDEX_MASK 0xFFFFFFFF -#define CPUID_EAX_MAX_SOC_ID_INDEX(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 15:0] SOC Vendor ID. - */ - uint32_t soc_vendor_id : 16; -#define CPUID_EBX_SOC_VENDOR_ID_BIT 0 -#define CPUID_EBX_SOC_VENDOR_ID_FLAG 0xFFFF -#define CPUID_EBX_SOC_VENDOR_ID_MASK 0xFFFF -#define CPUID_EBX_SOC_VENDOR_ID(_) (((_) >> 0) & 0xFFFF) - - /** - * [Bit 16] If 1, the SOC Vendor ID field is assigned via an industry standard enumeration scheme. Otherwise, the SOC - * Vendor ID field is assigned by Intel. - */ - uint32_t is_vendor_scheme : 1; -#define CPUID_EBX_IS_VENDOR_SCHEME_BIT 16 -#define CPUID_EBX_IS_VENDOR_SCHEME_FLAG 0x10000 -#define CPUID_EBX_IS_VENDOR_SCHEME_MASK 0x01 -#define CPUID_EBX_IS_VENDOR_SCHEME(_) (((_) >> 16) & 0x01) - uint32_t reserved1 : 15; - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] A unique number an SOC vendor assigns to its SOC projects. - */ - uint32_t project_id : 32; -#define CPUID_ECX_PROJECT_ID_BIT 0 -#define CPUID_ECX_PROJECT_ID_FLAG 0xFFFFFFFF -#define CPUID_ECX_PROJECT_ID_MASK 0xFFFFFFFF -#define CPUID_ECX_PROJECT_ID(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] A unique number within an SOC project that an SOC vendor assigns. - */ - uint32_t stepping_id : 32; -#define CPUID_EDX_STEPPING_ID_BIT 0 -#define CPUID_EDX_STEPPING_ID_FLAG 0xFFFFFFFF -#define CPUID_EDX_STEPPING_ID_MASK 0xFFFFFFFF -#define CPUID_EDX_STEPPING_ID(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_17_ecx_00; - -/** - * @brief System-On-Chip Vendor Attribute Enumeration Sub-leaf (EAX = 17H, ECX = 1..3) - * - * @note Leaf 17H output depends on the initial value in ECX. SOC Vendor Brand String is a UTF-8 encoded string padded with - * trailing bytes of 00H. The complete SOC Vendor Brand String is constructed by concatenating in ascending order of - * EAX:EBX:ECX:EDX and from the sub-leaf 1 fragment towards sub-leaf 3. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] SOC Vendor Brand String. UTF-8 encoded string. - */ - uint32_t soc_vendor_brand_string : 32; -#define CPUID_EAX_SOC_VENDOR_BRAND_STRING_BIT 0 -#define CPUID_EAX_SOC_VENDOR_BRAND_STRING_FLAG 0xFFFFFFFF -#define CPUID_EAX_SOC_VENDOR_BRAND_STRING_MASK 0xFFFFFFFF -#define CPUID_EAX_SOC_VENDOR_BRAND_STRING(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] SOC Vendor Brand String. UTF-8 encoded string. - */ - uint32_t soc_vendor_brand_string : 32; -#define CPUID_EBX_SOC_VENDOR_BRAND_STRING_BIT 0 -#define CPUID_EBX_SOC_VENDOR_BRAND_STRING_FLAG 0xFFFFFFFF -#define CPUID_EBX_SOC_VENDOR_BRAND_STRING_MASK 0xFFFFFFFF -#define CPUID_EBX_SOC_VENDOR_BRAND_STRING(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] SOC Vendor Brand String. UTF-8 encoded string. - */ - uint32_t soc_vendor_brand_string : 32; -#define CPUID_ECX_SOC_VENDOR_BRAND_STRING_BIT 0 -#define CPUID_ECX_SOC_VENDOR_BRAND_STRING_FLAG 0xFFFFFFFF -#define CPUID_ECX_SOC_VENDOR_BRAND_STRING_MASK 0xFFFFFFFF -#define CPUID_ECX_SOC_VENDOR_BRAND_STRING(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] SOC Vendor Brand String. UTF-8 encoded string. - */ - uint32_t soc_vendor_brand_string : 32; -#define CPUID_EDX_SOC_VENDOR_BRAND_STRING_BIT 0 -#define CPUID_EDX_SOC_VENDOR_BRAND_STRING_FLAG 0xFFFFFFFF -#define CPUID_EDX_SOC_VENDOR_BRAND_STRING_MASK 0xFFFFFFFF -#define CPUID_EDX_SOC_VENDOR_BRAND_STRING(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_17_ecx_01_03; - -/** - * @brief System-On-Chip Vendor Attribute Enumeration Sub-leaves (EAX = 17H, ECX > MaxSOCID_Index) - * - * @note Leaf 17H output depends on the initial value in ECX. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reserved = 0. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Reserved = 0. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Reserved = 0. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Reserved = 0. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_17_ecx_n; - -/** - * @} - */ - - /** - * @defgroup cpuid_eax_18 \ - * EAX = 0x18 - * - * When CPUID executes with EAX set to 18H, the processor returns information about the Deterministic Address Translation - * Parameters. - * @{ - */ -#define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS 0x00000018 - /** - * @brief Deterministic Address Translation Parameters Main Leaf (EAX = 18H, ECX = 0) - * - * @note Each sub-leaf enumerates a different address translation structure. - * If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf index n is invalid if n exceeds the value - * that sub-leaf 0 returns in EAX. A sub-leaf index is also invalid if EDX[4:0] returns 0. Valid sub-leaves do not need to - * be contiguous or in any particular order. A valid sub-leaf may be in a higher input ECX value than an invalid sub-leaf - * or than a valid sub-leaf of a higher or lower-level structure. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Reports the maximum input value of supported sub-leaf in leaf 18H. - */ - uint32_t max_sub_leaf : 32; -#define CPUID_EAX_MAX_SUB_LEAF_BIT 0 -#define CPUID_EAX_MAX_SUB_LEAF_FLAG 0xFFFFFFFF -#define CPUID_EAX_MAX_SUB_LEAF_MASK 0xFFFFFFFF -#define CPUID_EAX_MAX_SUB_LEAF(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bit 0] 4K page size entries supported by this structure. - */ - uint32_t page_entries_4kb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_BIT 0 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_FLAG 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] 2MB page size entries supported by this structure. - */ - uint32_t page_entries_2mb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_BIT 1 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_FLAG 0x02 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] 4MB page size entries supported by this structure. - */ - uint32_t page_entries_4mb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_BIT 2 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_FLAG 0x04 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] 1 GB page size entries supported by this structure. - */ - uint32_t page_entries_1gb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_BIT 3 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_FLAG 0x08 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(_) (((_) >> 3) & 0x01) - uint32_t reserved1 : 4; - - /** - * [Bits 10:8] Partitioning (0: Soft partitioning between the logical processors sharing this structure). - */ - uint32_t partitioning : 3; -#define CPUID_EBX_PARTITIONING_BIT 8 -#define CPUID_EBX_PARTITIONING_FLAG 0x700 -#define CPUID_EBX_PARTITIONING_MASK 0x07 -#define CPUID_EBX_PARTITIONING(_) (((_) >> 8) & 0x07) - uint32_t reserved2 : 5; - - /** - * [Bits 31:16] W = Ways of associativity. - */ - uint32_t ways_of_associativity_00 : 16; -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00_BIT 16 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00_FLAG 0xFFFF0000 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00_MASK 0xFFFF -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(_) (((_) >> 16) & 0xFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Number of Sets. - */ - uint32_t number_of_sets : 32; -#define CPUID_ECX_NUMBER_OF_SETS_BIT 0 -#define CPUID_ECX_NUMBER_OF_SETS_FLAG 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS_MASK 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 4:0] Translation cache type field. - * - 00000b: Null (indicates this sub-leaf is not valid). - * - 00001b: Data TLB. - * - 00010b: Instruction TLB. - * - 00011b: Unified TLB. - * All other encodings are reserved. - * - * @note Some unified TLBs will allow a single TLB entry to satisfy data read/write and instruction fetches. Others will - * require separate entries (e.g., one loaded on data read/write and another loaded on an instruction fetch) . Please see - * the Intel(R) 64 and IA-32 Architectures Optimization Reference Manual for details of a particular product. - */ - uint32_t translation_cache_type_field : 5; -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_BIT 0 -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_FLAG 0x1F -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_MASK 0x1F -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(_) (((_) >> 0) & 0x1F) - - /** - * [Bits 7:5] Translation cache level (starts at 1). - */ - uint32_t translation_cache_level : 3; -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_BIT 5 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_FLAG 0xE0 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_MASK 0x07 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL(_) (((_) >> 5) & 0x07) - - /** - * [Bit 8] Fully associative structure. - */ - uint32_t fully_associative_structure : 1; -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_BIT 8 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_FLAG 0x100 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_MASK 0x01 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(_) (((_) >> 8) & 0x01) - uint32_t reserved1 : 5; - - /** - * [Bits 25:14] Maximum number of addressable IDs for logical processors sharing this translation cache. - * - * @note Add one to the return value to get the result. - */ - uint32_t max_addressable_ids_for_logical_processors : 12; -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_BIT 14 -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_FLAG 0x3FFC000 -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_MASK 0xFFF -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(_) (((_) >> 14) & 0xFFF) - uint32_t reserved2 : 6; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_18_ecx_00; - -/** - * @brief Deterministic Address Translation Parameters Sub-leaf (EAX = 18H, ECX >= 1) - * - * @note Each sub-leaf enumerates a different address translation structure. - * If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf index n is invalid if n exceeds the value - * that sub-leaf 0 returns in EAX. A sub-leaf index is also invalid if EDX[4:0] returns 0. Valid sub-leaves do not need to - * be contiguous or in any particular order. A valid sub-leaf may be in a higher input ECX value than an invalid sub-leaf - * or than a valid sub-leaf of a higher or lower-level structure. - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bit 0] 4K page size entries supported by this structure. - */ - uint32_t page_entries_4kb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_BIT 0 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_FLAG 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] 2MB page size entries supported by this structure. - */ - uint32_t page_entries_2mb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_BIT 1 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_FLAG 0x02 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] 4MB page size entries supported by this structure. - */ - uint32_t page_entries_4mb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_BIT 2 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_FLAG 0x04 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] 1 GB page size entries supported by this structure. - */ - uint32_t page_entries_1gb_supported : 1; -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_BIT 3 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_FLAG 0x08 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED_MASK 0x01 -#define CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(_) (((_) >> 3) & 0x01) - uint32_t reserved1 : 4; - - /** - * [Bits 10:8] Partitioning (0: Soft partitioning between the logical processors sharing this structure). - */ - uint32_t partitioning : 3; -#define CPUID_EBX_PARTITIONING_BIT 8 -#define CPUID_EBX_PARTITIONING_FLAG 0x700 -#define CPUID_EBX_PARTITIONING_MASK 0x07 -#define CPUID_EBX_PARTITIONING(_) (((_) >> 8) & 0x07) - uint32_t reserved2 : 5; - - /** - * [Bits 31:16] W = Ways of associativity. - */ - uint32_t ways_of_associativity_01 : 16; -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01_BIT 16 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01_FLAG 0xFFFF0000 -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01_MASK 0xFFFF -#define CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(_) (((_) >> 16) & 0xFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Number of Sets. - */ - uint32_t number_of_sets : 32; -#define CPUID_ECX_NUMBER_OF_SETS_BIT 0 -#define CPUID_ECX_NUMBER_OF_SETS_FLAG 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS_MASK 0xFFFFFFFF -#define CPUID_ECX_NUMBER_OF_SETS(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 4:0] Translation cache type field. - * - 00000b: Null (indicates this sub-leaf is not valid). - * - 00001b: Data TLB. - * - 00010b: Instruction TLB. - * - 00011b: Unified TLB. - * All other encodings are reserved. - * - * @note Some unified TLBs will allow a single TLB entry to satisfy data read/write and instruction fetches. Others will - * require separate entries (e.g., one loaded on data read/write and another loaded on an instruction fetch) . Please see - * the Intel(R) 64 and IA-32 Architectures Optimization Reference Manual for details of a particular product. - */ - uint32_t translation_cache_type_field : 5; -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_BIT 0 -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_FLAG 0x1F -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD_MASK 0x1F -#define CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(_) (((_) >> 0) & 0x1F) - - /** - * [Bits 7:5] Translation cache level (starts at 1). - */ - uint32_t translation_cache_level : 3; -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_BIT 5 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_FLAG 0xE0 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL_MASK 0x07 -#define CPUID_EDX_TRANSLATION_CACHE_LEVEL(_) (((_) >> 5) & 0x07) - - /** - * [Bit 8] Fully associative structure. - */ - uint32_t fully_associative_structure : 1; -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_BIT 8 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_FLAG 0x100 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE_MASK 0x01 -#define CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(_) (((_) >> 8) & 0x01) - uint32_t reserved1 : 5; - - /** - * [Bits 25:14] Maximum number of addressable IDs for logical processors sharing this translation cache. - * - * @note Add one to the return value to get the result. - */ - uint32_t max_addressable_ids_for_logical_processors : 12; -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_BIT 14 -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_FLAG 0x3FFC000 -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_MASK 0xFFF -#define CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(_) (((_) >> 14) & 0xFFF) - uint32_t reserved2 : 6; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_18_ecx_01p; - -/** - * @} - */ - - - /** - * @brief Extended Function CPUID Information - * - * When CPUID executes with EAX set to 80000000H, the processor returns the highest value the processor recognizes for - * returning extended processor information. The value is returned in the EAX register and is processor specific. - */ -#define CPUID_EXTENDED_FUNCTION_INFORMATION 0x80000000 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Maximum Input Value for Extended Function CPUID Information. - */ - uint32_t max_extended_functions : 32; -#define CPUID_EAX_MAX_EXTENDED_FUNCTIONS_BIT 0 -#define CPUID_EAX_MAX_EXTENDED_FUNCTIONS_FLAG 0xFFFFFFFF -#define CPUID_EAX_MAX_EXTENDED_FUNCTIONS_MASK 0xFFFFFFFF -#define CPUID_EAX_MAX_EXTENDED_FUNCTIONS(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000000; - - -/** - * Extended Function CPUID Information. - */ -#define CPUID_EXTENDED_CPU_SIGNATURE 0x80000001 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bit 0] LAHF/SAHF available in 64-bit mode. - */ - uint32_t lahf_sahf_available_in_64_bit_mode : 1; -#define CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE_BIT 0 -#define CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE_FLAG 0x01 -#define CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE_MASK 0x01 -#define CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(_) (((_) >> 0) & 0x01) - uint32_t reserved1 : 4; - - /** - * [Bit 5] LZCNT. - */ - uint32_t lzcnt : 1; -#define CPUID_ECX_LZCNT_BIT 5 -#define CPUID_ECX_LZCNT_FLAG 0x20 -#define CPUID_ECX_LZCNT_MASK 0x01 -#define CPUID_ECX_LZCNT(_) (((_) >> 5) & 0x01) - uint32_t reserved2 : 2; - - /** - * [Bit 8] PREFETCHW. - */ - uint32_t prefetchw : 1; -#define CPUID_ECX_PREFETCHW_BIT 8 -#define CPUID_ECX_PREFETCHW_FLAG 0x100 -#define CPUID_ECX_PREFETCHW_MASK 0x01 -#define CPUID_ECX_PREFETCHW(_) (((_) >> 8) & 0x01) - uint32_t reserved3 : 23; - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - uint32_t reserved1 : 11; - - /** - * [Bit 11] SYSCALL/SYSRET available in 64-bit mode. - */ - uint32_t syscall_sysret_available_in_64_bit_mode : 1; -#define CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE_BIT 11 -#define CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE_FLAG 0x800 -#define CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE_MASK 0x01 -#define CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(_) (((_) >> 11) & 0x01) - uint32_t reserved2 : 8; - - /** - * [Bit 20] Execute Disable Bit available. - */ - uint32_t execute_disable_bit_available : 1; -#define CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE_BIT 20 -#define CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE_FLAG 0x100000 -#define CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE_MASK 0x01 -#define CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(_) (((_) >> 20) & 0x01) - uint32_t reserved3 : 5; - - /** - * [Bit 26] 1-GByte pages are available if 1. - */ - uint32_t pages_1gb_available : 1; -#define CPUID_EDX_PAGES_1GB_AVAILABLE_BIT 26 -#define CPUID_EDX_PAGES_1GB_AVAILABLE_FLAG 0x4000000 -#define CPUID_EDX_PAGES_1GB_AVAILABLE_MASK 0x01 -#define CPUID_EDX_PAGES_1GB_AVAILABLE(_) (((_) >> 26) & 0x01) - - /** - * [Bit 27] RDTSCP and IA32_TSC_AUX are available if 1. - */ - uint32_t rdtscp_available : 1; -#define CPUID_EDX_RDTSCP_AVAILABLE_BIT 27 -#define CPUID_EDX_RDTSCP_AVAILABLE_FLAG 0x8000000 -#define CPUID_EDX_RDTSCP_AVAILABLE_MASK 0x01 -#define CPUID_EDX_RDTSCP_AVAILABLE(_) (((_) >> 27) & 0x01) - uint32_t reserved4 : 1; - - /** - * [Bit 29] Intel(R) 64 Architecture available if 1. - */ - uint32_t ia64_available : 1; -#define CPUID_EDX_IA64_AVAILABLE_BIT 29 -#define CPUID_EDX_IA64_AVAILABLE_FLAG 0x20000000 -#define CPUID_EDX_IA64_AVAILABLE_MASK 0x01 -#define CPUID_EDX_IA64_AVAILABLE(_) (((_) >> 29) & 0x01) - uint32_t reserved5 : 2; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000001; - - -/** - * Extended Function CPUID Information. - */ -#define CPUID_BRAND_STRING1 0x80000002 - - /** - * Extended Function CPUID Information. - */ -#define CPUID_BRAND_STRING2 0x80000003 - - /** - * Extended Function CPUID Information. - */ -#define CPUID_BRAND_STRING3 0x80000004 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String. - */ - uint32_t processor_brand_string_1 : 32; -#define CPUID_EAX_PROCESSOR_BRAND_STRING_1_BIT 0 -#define CPUID_EAX_PROCESSOR_BRAND_STRING_1_FLAG 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_1_MASK 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_1(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_2 : 32; -#define CPUID_EBX_PROCESSOR_BRAND_STRING_2_BIT 0 -#define CPUID_EBX_PROCESSOR_BRAND_STRING_2_FLAG 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_2_MASK 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_2(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_3 : 32; -#define CPUID_ECX_PROCESSOR_BRAND_STRING_3_BIT 0 -#define CPUID_ECX_PROCESSOR_BRAND_STRING_3_FLAG 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_3_MASK 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_3(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_4 : 32; -#define CPUID_EDX_PROCESSOR_BRAND_STRING_4_BIT 0 -#define CPUID_EDX_PROCESSOR_BRAND_STRING_4_FLAG 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_4_MASK 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_4(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000002; - -/** - * @brief Extended Function CPUID Information - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_5 : 32; -#define CPUID_EAX_PROCESSOR_BRAND_STRING_5_BIT 0 -#define CPUID_EAX_PROCESSOR_BRAND_STRING_5_FLAG 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_5_MASK 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_5(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_6 : 32; -#define CPUID_EBX_PROCESSOR_BRAND_STRING_6_BIT 0 -#define CPUID_EBX_PROCESSOR_BRAND_STRING_6_FLAG 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_6_MASK 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_6(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_7 : 32; -#define CPUID_ECX_PROCESSOR_BRAND_STRING_7_BIT 0 -#define CPUID_ECX_PROCESSOR_BRAND_STRING_7_FLAG 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_7_MASK 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_7(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_8 : 32; -#define CPUID_EDX_PROCESSOR_BRAND_STRING_8_BIT 0 -#define CPUID_EDX_PROCESSOR_BRAND_STRING_8_FLAG 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_8_MASK 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_8(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000003; - -/** - * @brief Extended Function CPUID Information - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_9 : 32; -#define CPUID_EAX_PROCESSOR_BRAND_STRING_9_BIT 0 -#define CPUID_EAX_PROCESSOR_BRAND_STRING_9_FLAG 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_9_MASK 0xFFFFFFFF -#define CPUID_EAX_PROCESSOR_BRAND_STRING_9(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_10 : 32; -#define CPUID_EBX_PROCESSOR_BRAND_STRING_10_BIT 0 -#define CPUID_EBX_PROCESSOR_BRAND_STRING_10_FLAG 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_10_MASK 0xFFFFFFFF -#define CPUID_EBX_PROCESSOR_BRAND_STRING_10(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_11 : 32; -#define CPUID_ECX_PROCESSOR_BRAND_STRING_11_BIT 0 -#define CPUID_ECX_PROCESSOR_BRAND_STRING_11_FLAG 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_11_MASK 0xFFFFFFFF -#define CPUID_ECX_PROCESSOR_BRAND_STRING_11(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] Processor Brand String Continued. - */ - uint32_t processor_brand_string_12 : 32; -#define CPUID_EDX_PROCESSOR_BRAND_STRING_12_BIT 0 -#define CPUID_EDX_PROCESSOR_BRAND_STRING_12_FLAG 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_12_MASK 0xFFFFFFFF -#define CPUID_EDX_PROCESSOR_BRAND_STRING_12(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000004; - -/** - * @brief Extended Function CPUID Information - */ -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000005; - - -/** - * Extended Function CPUID Information. - */ -#define CPUID_EXTENDED_CACHE_INFO 0x80000006 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 7:0] Cache Line size in bytes. - */ - uint32_t cache_line_size_in_bytes : 8; -#define CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES_BIT 0 -#define CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES_FLAG 0xFF -#define CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES_MASK 0xFF -#define CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(_) (((_) >> 0) & 0xFF) - uint32_t reserved1 : 4; - - /** - * [Bits 15:12] L2 Associativity field. - * L2 associativity field encodings: - * - 00H - Disabled. - * - 01H - Direct mapped. - * - 02H - 2-way. - * - 04H - 4-way. - * - 06H - 8-way. - * - 08H - 16-way. - * - 0FH - Fully associative. - */ - uint32_t l2_associativity_field : 4; -#define CPUID_ECX_L2_ASSOCIATIVITY_FIELD_BIT 12 -#define CPUID_ECX_L2_ASSOCIATIVITY_FIELD_FLAG 0xF000 -#define CPUID_ECX_L2_ASSOCIATIVITY_FIELD_MASK 0x0F -#define CPUID_ECX_L2_ASSOCIATIVITY_FIELD(_) (((_) >> 12) & 0x0F) - - /** - * [Bits 31:16] Cache size in 1K units. - */ - uint32_t cache_size_in_1k_units : 16; -#define CPUID_ECX_CACHE_SIZE_IN_1K_UNITS_BIT 16 -#define CPUID_ECX_CACHE_SIZE_IN_1K_UNITS_FLAG 0xFFFF0000 -#define CPUID_ECX_CACHE_SIZE_IN_1K_UNITS_MASK 0xFFFF -#define CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(_) (((_) >> 16) & 0xFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - /** - * [Bits 31:0] EDX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EDX_RESERVED_BIT 0 -#define CPUID_EDX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EDX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EDX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000006; - - -/** - * Extended Function CPUID Information. - */ -#define CPUID_EXTENDED_TIME_STAMP_COUNTER 0x80000007 -typedef struct -{ - union - { - struct - { - /** - * [Bits 31:0] EAX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EAX_RESERVED_BIT 0 -#define CPUID_EAX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EAX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EAX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } eax; - - union - { - struct - { - /** - * [Bits 31:0] EBX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_EBX_RESERVED_BIT 0 -#define CPUID_EBX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_EBX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_EBX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ebx; - - union - { - struct - { - /** - * [Bits 31:0] ECX is reserved. - */ - uint32_t reserved : 32; -#define CPUID_ECX_RESERVED_BIT 0 -#define CPUID_ECX_RESERVED_FLAG 0xFFFFFFFF -#define CPUID_ECX_RESERVED_MASK 0xFFFFFFFF -#define CPUID_ECX_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - }; - - uint32_t flags; - } ecx; - - union - { - struct - { - uint32_t reserved1 : 8; - - /** - * [Bit 8] Invariant TSC available if 1. - */ - uint32_t invariant_tsc_available : 1; -#define CPUID_EDX_INVARIANT_TSC_AVAILABLE_BIT 8 -#define CPUID_EDX_INVARIANT_TSC_AVAILABLE_FLAG 0x100 -#define CPUID_EDX_INVARIANT_TSC_AVAILABLE_MASK 0x01 -#define CPUID_EDX_INVARIANT_TSC_AVAILABLE(_) (((_) >> 8) & 0x01) - uint32_t reserved2 : 23; - }; - - uint32_t flags; - } edx; - -} cpuid_eax_80000007; - -/** - * @} - */ - - /** - * @defgroup model_specific_registers \ - * Model Specific Registers - * - * @see Vol2A[3.2(CPUID)] (reference) - * @{ - */ - /** - * @defgroup ia32_p5_mc \ - * IA32_P5_MC_(x) - * - * When machine-check exceptions are enabled for the Pentium processor (MCE flag is set in control register CR4), the - * machine-check exception handler uses the RDMSR instruction to read the error type from the P5_MC_TYPE register and the - * machine check address from the P5_MC_ADDR register. The handler then normally reports these register values to the - * system console before aborting execution. - * - * @see Vol3B[15.10.2(Pentium Processor Machine-Check Exception Handling)] (reference) - * @{ - */ - /** - * Machine-check exception address. - * - * @remarks 05_01H - * @see Vol4[2.22(MSRS IN PENTIUM PROCESSORS)] - */ -#define IA32_P5_MC_ADDR 0x00000000 - - /** - * Machine-check exception type. - * - * @remarks 05_01H - * @see Vol4[2.22(MSRS IN PENTIUM PROCESSORS)] - */ -#define IA32_P5_MC_TYPE 0x00000001 - /** - * @} - */ - - /** - * System coherence line size. - * - * @remarks 0F_03H - * @see Vol3A[8.10.5(Monitor/Mwait Address Range Determination)] - * @see Vol3A[8.10.5(Monitor/Mwait Address Range Determination)] (reference) - */ -#define IA32_MONITOR_FILTER_LINE_SIZE 0x00000006 - - /** - * Value as returned by instruction RDTSC. - * - * @remarks 05_01H - * @see Vol3B[17.17(TIME-STAMP COUNTER)] - */ -#define IA32_TIME_STAMP_COUNTER 0x00000010 - - /** - * The operating system can use this MSR to determine "slot" information for the processor and the proper microcode update - * to load. - * - * @remarks 06_01H - */ -#define IA32_PLATFORM_ID 0x00000017 -typedef union -{ - struct - { - uint64_t reserved1 : 50; - - /** - * @brief Platform Id (RO) - * - * [Bits 52:50] 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 - */ - uint64_t platform_id : 3; -#define IA32_PLATFORM_ID_PLATFORM_ID_BIT 50 -#define IA32_PLATFORM_ID_PLATFORM_ID_FLAG 0x1C000000000000 -#define IA32_PLATFORM_ID_PLATFORM_ID_MASK 0x07 -#define IA32_PLATFORM_ID_PLATFORM_ID(_) (((_) >> 50) & 0x07) - uint64_t reserved2 : 11; - }; - - uint64_t flags; -} ia32_platform_id_register; - - -/** - * This register holds the APIC base address, permitting the relocation of the APIC memory map. - * - * @remarks 06_01H - * @see Vol3A[10.4.4(Local APIC Status and Location)] - * @see Vol3A[10.4.5(Relocating the Local APIC Registers)] - */ -#define IA32_APIC_BASE 0x0000001B -typedef union -{ - struct - { - uint64_t reserved1 : 8; - - /** - * [Bit 8] BSP flag. - */ - uint64_t bsp_flag : 1; -#define IA32_APIC_BASE_BSP_FLAG_BIT 8 -#define IA32_APIC_BASE_BSP_FLAG_FLAG 0x100 -#define IA32_APIC_BASE_BSP_FLAG_MASK 0x01 -#define IA32_APIC_BASE_BSP_FLAG(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 10] Enable x2APIC mode. - */ - uint64_t enable_x2apic_mode : 1; -#define IA32_APIC_BASE_ENABLE_X2APIC_MODE_BIT 10 -#define IA32_APIC_BASE_ENABLE_X2APIC_MODE_FLAG 0x400 -#define IA32_APIC_BASE_ENABLE_X2APIC_MODE_MASK 0x01 -#define IA32_APIC_BASE_ENABLE_X2APIC_MODE(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] APIC Global Enable. - */ - uint64_t apic_global_enable : 1; -#define IA32_APIC_BASE_APIC_GLOBAL_ENABLE_BIT 11 -#define IA32_APIC_BASE_APIC_GLOBAL_ENABLE_FLAG 0x800 -#define IA32_APIC_BASE_APIC_GLOBAL_ENABLE_MASK 0x01 -#define IA32_APIC_BASE_APIC_GLOBAL_ENABLE(_) (((_) >> 11) & 0x01) - - /** - * [Bits 47:12] APIC Base. - */ - uint64_t apic_base : 36; -#define IA32_APIC_BASE_APIC_BASE_BIT 12 -#define IA32_APIC_BASE_APIC_BASE_FLAG 0xFFFFFFFFF000 -#define IA32_APIC_BASE_APIC_BASE_MASK 0xFFFFFFFFF -#define IA32_APIC_BASE_APIC_BASE(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved3 : 16; - }; - - uint64_t flags; -} ia32_apic_base_register; - - -/** - * Control Features in Intel 64 Processor. - * - * @remarks If any one enumeration condition for defined bit field holds. - */ -#define IA32_FEATURE_CONTROL 0x0000003A -typedef union -{ - struct - { - /** - * @brief Lock bit (R/WO) - * - * [Bit 0] 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. - * @remarks If any one enumeration condition for defined bit field position greater than bit 0 holds. - */ - uint64_t lock_bit : 1; -#define IA32_FEATURE_CONTROL_LOCK_BIT_BIT 0 -#define IA32_FEATURE_CONTROL_LOCK_BIT_FLAG 0x01 -#define IA32_FEATURE_CONTROL_LOCK_BIT_MASK 0x01 -#define IA32_FEATURE_CONTROL_LOCK_BIT(_) (((_) >> 0) & 0x01) - - /** - * @brief Enable VMX inside SMX operation (R/WL) - * - * [Bit 1] 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). - * - * @remarks If CPUID.01H:ECX[5] = 1 && CPUID.01H:ECX[6] = 1 - */ - uint64_t enable_vmx_inside_smx : 1; -#define IA32_FEATURE_CONTROL_ENABLE_VMX_INSIDE_SMX_BIT 1 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_INSIDE_SMX_FLAG 0x02 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_INSIDE_SMX_MASK 0x01 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_INSIDE_SMX(_) (((_) >> 1) & 0x01) - - /** - * @brief Enable VMX outside SMX operation (R/WL) - * - * [Bit 2] This bit enables VMX for a system executive that does not require SMX. BIOS must set this bit only when the - * CPUID function 1 returns the VMX feature flag set (ECX bit 5). - * - * @remarks If CPUID.01H:ECX[5] = 1 - */ - uint64_t enable_vmx_outside_smx : 1; -#define IA32_FEATURE_CONTROL_ENABLE_VMX_OUTSIDE_SMX_BIT 2 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_OUTSIDE_SMX_FLAG 0x04 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_OUTSIDE_SMX_MASK 0x01 -#define IA32_FEATURE_CONTROL_ENABLE_VMX_OUTSIDE_SMX(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 5; - - /** - * @brief SENTER Local Function Enable (R/WL) - * - * [Bits 14:8] When set, each bit in the field represents an enable control for a corresponding SENTER function. This field - * is supported only if CPUID.1:ECX.[bit 6] is set. - * - * @remarks If CPUID.01H:ECX[6] = 1 - */ - uint64_t senter_local_function_enables : 7; -#define IA32_FEATURE_CONTROL_SENTER_LOCAL_FUNCTION_ENABLES_BIT 8 -#define IA32_FEATURE_CONTROL_SENTER_LOCAL_FUNCTION_ENABLES_FLAG 0x7F00 -#define IA32_FEATURE_CONTROL_SENTER_LOCAL_FUNCTION_ENABLES_MASK 0x7F -#define IA32_FEATURE_CONTROL_SENTER_LOCAL_FUNCTION_ENABLES(_) (((_) >> 8) & 0x7F) - - /** - * @brief SENTER Global Enable (R/WL) - * - * [Bit 15] This bit must be set to enable SENTER leaf functions. This bit is supported only if CPUID.1:ECX.[bit 6] is set. - * - * @remarks If CPUID.01H:ECX[6] = 1 - */ - uint64_t senter_global_enable : 1; -#define IA32_FEATURE_CONTROL_SENTER_GLOBAL_ENABLE_BIT 15 -#define IA32_FEATURE_CONTROL_SENTER_GLOBAL_ENABLE_FLAG 0x8000 -#define IA32_FEATURE_CONTROL_SENTER_GLOBAL_ENABLE_MASK 0x01 -#define IA32_FEATURE_CONTROL_SENTER_GLOBAL_ENABLE(_) (((_) >> 15) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief SGX Launch Control Enable (R/WL) - * - * [Bit 17] This bit must be set to enable runtime reconfiguration of SGX Launch Control via the IA32_SGXLEPUBKEYHASHn MSR. - * - * @remarks If CPUID.(EAX=07H, ECX=0H): ECX[30] = 1 - */ - uint64_t sgx_launch_control_enable : 1; -#define IA32_FEATURE_CONTROL_SGX_LAUNCH_CONTROL_ENABLE_BIT 17 -#define IA32_FEATURE_CONTROL_SGX_LAUNCH_CONTROL_ENABLE_FLAG 0x20000 -#define IA32_FEATURE_CONTROL_SGX_LAUNCH_CONTROL_ENABLE_MASK 0x01 -#define IA32_FEATURE_CONTROL_SGX_LAUNCH_CONTROL_ENABLE(_) (((_) >> 17) & 0x01) - - /** - * @brief SGX Global Enable (R/WL) - * - * [Bit 18] This bit must be set to enable SGX leaf functions. - * - * @remarks If CPUID.(EAX=07H, ECX=0H): EBX[2] = 1 - */ - uint64_t sgx_global_enable : 1; -#define IA32_FEATURE_CONTROL_SGX_GLOBAL_ENABLE_BIT 18 -#define IA32_FEATURE_CONTROL_SGX_GLOBAL_ENABLE_FLAG 0x40000 -#define IA32_FEATURE_CONTROL_SGX_GLOBAL_ENABLE_MASK 0x01 -#define IA32_FEATURE_CONTROL_SGX_GLOBAL_ENABLE(_) (((_) >> 18) & 0x01) - uint64_t reserved3 : 1; - - /** - * @brief LMCE On (R/WL) - * - * [Bit 20] When set, system software can program the MSRs associated with LMCE to configure delivery of some machine check - * exceptions to a single logical processor. - * - * @remarks If IA32_MCG_CAP[27] = 1 - */ - uint64_t lmce_on : 1; -#define IA32_FEATURE_CONTROL_LMCE_ON_BIT 20 -#define IA32_FEATURE_CONTROL_LMCE_ON_FLAG 0x100000 -#define IA32_FEATURE_CONTROL_LMCE_ON_MASK 0x01 -#define IA32_FEATURE_CONTROL_LMCE_ON(_) (((_) >> 20) & 0x01) - uint64_t reserved4 : 43; - }; - - uint64_t flags; -} ia32_feature_control_register; - - -/** - * Per Logical Processor TSC Adjust. - * - * @remarks If CPUID.(EAX=07H, ECX=0H): EBX[1] = 1 - */ -#define IA32_TSC_ADJUST 0x0000003B -typedef struct -{ - /** - * 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. - */ - uint64_t thread_adjust; -} ia32_tsc_adjust_register; - - -/** - * @brief BIOS Update Trigger (W) - * - * Executing a WRMSR instruction to this MSR causes a microcode update to be loaded into the processor. A processor may - * prevent writing to this MSR when loading guest states on VM entries or saving guest states on VM exits. - * - * @remarks 06_01H - * @see Vol3A[9.11.6(Microcode Update Loader)] - */ -#define IA32_BIOS_UPDATE_TRIGGER 0x00000079 - - /** - * @brief 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. - * - * @remarks 06_01H - */ -#define IA32_BIOS_UPDATE_SIGNATURE 0x0000008B -typedef union -{ - struct - { - /** - * [Bits 31:0] Reserved. - */ - uint64_t reserved : 32; -#define IA32_BIOS_UPDATE_SIGNATURE_RESERVED_BIT 0 -#define IA32_BIOS_UPDATE_SIGNATURE_RESERVED_FLAG 0xFFFFFFFF -#define IA32_BIOS_UPDATE_SIGNATURE_RESERVED_MASK 0xFFFFFFFF -#define IA32_BIOS_UPDATE_SIGNATURE_RESERVED(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * @brief Microcode update signature - * - * [Bits 63:32] 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. - * - * @see Vol3A[9.11.7.1(Determining the Signature)] (reference) - */ - uint64_t microcode_update_signature : 32; -#define IA32_BIOS_UPDATE_SIGNATURE_MICROCODE_UPDATE_SIGNATURE_BIT 32 -#define IA32_BIOS_UPDATE_SIGNATURE_MICROCODE_UPDATE_SIGNATURE_FLAG 0xFFFFFFFF00000000 -#define IA32_BIOS_UPDATE_SIGNATURE_MICROCODE_UPDATE_SIGNATURE_MASK 0xFFFFFFFF -#define IA32_BIOS_UPDATE_SIGNATURE_MICROCODE_UPDATE_SIGNATURE(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_bios_update_signature_register; - -/** - * @defgroup ia32_sgxlepubkeyhash \ - * IA32_SGXLEPUBKEYHASH[(64*n+63):(64*n)] - * - * 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. - * - * @remarks Read permitted If CPUID.(EAX=12H,ECX=0H): EAX[0]=1 && CPUID.(EAX=07H,ECX=0H):ECX[30]=1. Write permitted if - * CPUID.(EAX=12H,ECX=0H): EAX[0]=1 && IA32_FEATURE_CONTROL[17] = 1 && IA32_FEATURE_CONTROL[0] = 1. - * @{ - */ -#define IA32_SGXLEPUBKEYHASH0 0x0000008C -#define IA32_SGXLEPUBKEYHASH1 0x0000008D -#define IA32_SGXLEPUBKEYHASH2 0x0000008E -#define IA32_SGXLEPUBKEYHASH3 0x0000008F - /** - * @} - */ - - - /** - * SMM Monitor Configuration. - * - * @remarks If CPUID.01H: ECX[5]=1 || CPUID.01H: ECX[6] = 1 - */ -#define IA32_SMM_MONITOR_CTL 0x0000009B -typedef union -{ - struct - { - /** - * @brief Valid (R/W) - * - * [Bit 0] The STM may be invoked using VMCALL only if this bit is 1. Because VMCALL is used to activate the dual-monitor - * treatment, the dual-monitor treatment cannot be activated if the bit is 0. This bit is cleared when the logical - * processor is reset. - * - * @see Vol3C[34.15.6(Activating the Dual-Monitor Treatment)] - * @see Vol3C[34.15.5(Enabling the Dual-Monitor Treatment)] (reference) - */ - uint64_t valid : 1; -#define IA32_SMM_MONITOR_CTL_VALID_BIT 0 -#define IA32_SMM_MONITOR_CTL_VALID_FLAG 0x01 -#define IA32_SMM_MONITOR_CTL_VALID_MASK 0x01 -#define IA32_SMM_MONITOR_CTL_VALID(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief Controls SMI unblocking by VMXOFF - * - * [Bit 2] Determines whether executions of VMXOFF unblock SMIs under the default treatment of SMIs and SMM. Executions of - * VMXOFF unblock SMIs unless bit 2 is 1 (the value of bit 0 is irrelevant). - * - * @remarks If IA32_VMX_MISC[28] - * @see Vol3C[34.14.4(VMXOFF and SMI Unblocking)] - * @see Vol3C[34.15.5(Enabling the Dual-Monitor Treatment)] (reference) - */ - uint64_t smi_unblocking_by_vmxoff : 1; -#define IA32_SMM_MONITOR_CTL_SMI_UNBLOCKING_BY_VMXOFF_BIT 2 -#define IA32_SMM_MONITOR_CTL_SMI_UNBLOCKING_BY_VMXOFF_FLAG 0x04 -#define IA32_SMM_MONITOR_CTL_SMI_UNBLOCKING_BY_VMXOFF_MASK 0x01 -#define IA32_SMM_MONITOR_CTL_SMI_UNBLOCKING_BY_VMXOFF(_) (((_) >> 2) & 0x01) - uint64_t reserved2 : 9; - - /** - * @brief MSEG Base (R/W) - * - * [Bits 31:12] Value that, when shifted left 12 bits, is the physical address of MSEG (the MSEG base address). - * - * @see Vol3C[34.15.5(Enabling the Dual-Monitor Treatment)] (reference) - */ - uint64_t mseg_base : 20; -#define IA32_SMM_MONITOR_CTL_MSEG_BASE_BIT 12 -#define IA32_SMM_MONITOR_CTL_MSEG_BASE_FLAG 0xFFFFF000 -#define IA32_SMM_MONITOR_CTL_MSEG_BASE_MASK 0xFFFFF -#define IA32_SMM_MONITOR_CTL_MSEG_BASE(_) (((_) >> 12) & 0xFFFFF) - uint64_t reserved3 : 32; - }; - - uint64_t flags; -} ia32_smm_monitor_ctl_register; - -typedef struct -{ - /** - * @brief MSEG revision identifier - * - * 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. - * - * @see Vol3D[A.6(MISCELLANEOUS DATA)] - */ - uint32_t mseg_header_revision; - - /** - * @brief SMM-transfer monitor features field - * - * 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. - * - * @see Vol3C[34.15.6(Activating the Dual-Monitor Treatment)] - */ - uint32_t monitor_features; - - /** - * Define values for the MonitorFeatures field of MSEG_HEADER. - */ -#define IA32_STM_FEATURES_IA32E 0x00000001 - - /** - * Fields that determine how processor state is loaded when the STM is activated. SMM code should establish these fields so - * that activating of the STM invokes the STM's initialization code. - * - * @see Vol3C[34.15.6.5(Loading Host State)] - */ - uint32_t gdtr_limit; - uint32_t gdtr_base_offset; - uint32_t cs_selector; - uint32_t eip_offset; - uint32_t esp_offset; - uint32_t cr3_offset; -} ia32_mseg_header; - - -/** - * Base address of the logical processor's SMRAM image. - * - * @remarks If IA32_VMX_MISC[15] - */ -#define IA32_SMBASE 0x0000009E - /** - * @defgroup ia32_pmc \ - * IA32_PMC(n) - * - * General Performance Counters. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - * @{ - */ -#define IA32_PMC0 0x000000C1 -#define IA32_PMC1 0x000000C2 -#define IA32_PMC2 0x000000C3 -#define IA32_PMC3 0x000000C4 -#define IA32_PMC4 0x000000C5 -#define IA32_PMC5 0x000000C6 -#define IA32_PMC6 0x000000C7 -#define IA32_PMC7 0x000000C8 - /** - * @} - */ - - - /** - * TSC Frequency Clock Counter. - * - * @remarks If CPUID.06H: ECX[0] = 1 - */ -#define IA32_MPERF 0x000000E7 -typedef struct -{ - /** - * @brief 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. - */ - uint64_t c0_mcnt; -} ia32_mperf_register; - - -/** - * Actual Performance Clock Counter - * - * @remarks If CPUID.06H: ECX[0] = 1 - */ -#define IA32_APERF 0x000000E8 -typedef struct -{ - /** - * @brief 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. - */ - uint64_t c0_acnt; -} ia32_aperf_register; - - -/** - * MTRR Capability. - * - * @see Vol3A[11.11.2.1(IA32_MTRR_DEF_TYPE MSR)] - * @see Vol3A[11.11.1(MTRR Feature Identification)] (reference) - */ -#define IA32_MTRR_CAPABILITIES 0x000000FE -typedef union -{ - struct - { - /** - * @brief VCNT (variable range registers count) field - * - * [Bits 7:0] Indicates the number of variable ranges implemented on the processor. - */ - uint64_t variable_range_count : 8; -#define IA32_MTRR_CAPABILITIES_VARIABLE_RANGE_COUNT_BIT 0 -#define IA32_MTRR_CAPABILITIES_VARIABLE_RANGE_COUNT_FLAG 0xFF -#define IA32_MTRR_CAPABILITIES_VARIABLE_RANGE_COUNT_MASK 0xFF -#define IA32_MTRR_CAPABILITIES_VARIABLE_RANGE_COUNT(_) (((_) >> 0) & 0xFF) - - /** - * @brief FIX (fixed range registers supported) flag - * - * [Bit 8] Fixed range MTRRs (IA32_MTRR_FIX64K_00000 through IA32_MTRR_FIX4K_0F8000) are supported when set; no fixed range - * registers are supported when clear. - */ - uint64_t fixed_range_supported : 1; -#define IA32_MTRR_CAPABILITIES_FIXED_RANGE_SUPPORTED_BIT 8 -#define IA32_MTRR_CAPABILITIES_FIXED_RANGE_SUPPORTED_FLAG 0x100 -#define IA32_MTRR_CAPABILITIES_FIXED_RANGE_SUPPORTED_MASK 0x01 -#define IA32_MTRR_CAPABILITIES_FIXED_RANGE_SUPPORTED(_) (((_) >> 8) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief WC (write combining) flag - * - * [Bit 10] The write-combining (WC) memory type is supported when set; the WC type is not supported when clear. - */ - uint64_t wc_supported : 1; -#define IA32_MTRR_CAPABILITIES_WC_SUPPORTED_BIT 10 -#define IA32_MTRR_CAPABILITIES_WC_SUPPORTED_FLAG 0x400 -#define IA32_MTRR_CAPABILITIES_WC_SUPPORTED_MASK 0x01 -#define IA32_MTRR_CAPABILITIES_WC_SUPPORTED(_) (((_) >> 10) & 0x01) - - /** - * @brief SMRR (System-Management Range Register) flag - * - * [Bit 11] The system-management range register (SMRR) interface is supported when bit 11 is set; the SMRR interface is - * not supported when clear. - */ - uint64_t smrr_supported : 1; -#define IA32_MTRR_CAPABILITIES_SMRR_SUPPORTED_BIT 11 -#define IA32_MTRR_CAPABILITIES_SMRR_SUPPORTED_FLAG 0x800 -#define IA32_MTRR_CAPABILITIES_SMRR_SUPPORTED_MASK 0x01 -#define IA32_MTRR_CAPABILITIES_SMRR_SUPPORTED(_) (((_) >> 11) & 0x01) - uint64_t reserved2 : 52; - }; - - uint64_t flags; -} ia32_mtrr_capabilities_register; - - -/** - * @brief SYSENTER_CS_MSR (R/W) - * - * The lower 16 bits of this MSR are the segment selector for the privilege level 0 code segment. This value is also used - * to determine the segment selector of the privilege level 0 stack segment. This value cannot indicate a null selector. - * - * @remarks 06_01H - * @see Vol2B[4.3(Instructions (M-U) | SYSCALL - Fast System Call)] (reference) - */ -#define IA32_SYSENTER_CS 0x00000174 -typedef union -{ - struct - { - /** - * [Bits 15:0] CS Selector. - */ - uint64_t cs_selector : 16; -#define IA32_SYSENTER_CS_CS_SELECTOR_BIT 0 -#define IA32_SYSENTER_CS_CS_SELECTOR_FLAG 0xFFFF -#define IA32_SYSENTER_CS_CS_SELECTOR_MASK 0xFFFF -#define IA32_SYSENTER_CS_CS_SELECTOR(_) (((_) >> 0) & 0xFFFF) - - /** - * [Bits 31:16] Not used. - * - * @remarks Can be read and written. - */ - uint64_t not_used_1 : 16; -#define IA32_SYSENTER_CS_NOT_USED_1_BIT 16 -#define IA32_SYSENTER_CS_NOT_USED_1_FLAG 0xFFFF0000 -#define IA32_SYSENTER_CS_NOT_USED_1_MASK 0xFFFF -#define IA32_SYSENTER_CS_NOT_USED_1(_) (((_) >> 16) & 0xFFFF) - - /** - * [Bits 63:32] Not used. - * - * @remarks Writes ignored; reads return zero. - */ - uint64_t not_used_2 : 32; -#define IA32_SYSENTER_CS_NOT_USED_2_BIT 32 -#define IA32_SYSENTER_CS_NOT_USED_2_FLAG 0xFFFFFFFF00000000 -#define IA32_SYSENTER_CS_NOT_USED_2_MASK 0xFFFFFFFF -#define IA32_SYSENTER_CS_NOT_USED_2(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_sysenter_cs_register; - - -/** - * @brief SYSENTER_ESP_MSR (R/W) - * - * The value of this MSR is loaded into RSP (thus, this value contains the stack pointer for the privilege level 0 stack). - * This value cannot represent a non-canonical address. In protected mode, only bits 31:0 are loaded. - * - * @remarks 06_01H - * @see Vol2B[4.3(Instructions (M-U) | SYSCALL - Fast System Call)] (reference) - */ -#define IA32_SYSENTER_ESP 0x00000175 - - /** - * @brief SYSENTER_EIP_MSR (R/W) - * - * The value of this MSR is loaded into RIP (thus, this value references the first instruction of the selected operating - * procedure or routine). In protected mode, only bits 31:0 are loaded. - * - * @remarks 06_01H - * @see Vol2B[4.3(Instructions (M-U) | SYSCALL - Fast System Call)] (reference) - */ -#define IA32_SYSENTER_EIP 0x00000176 - - /** - * Global Machine Check Capability. - * - * @remarks 06_01H - */ -#define IA32_MCG_CAP 0x00000179 -typedef union -{ - struct - { - /** - * [Bits 7:0] Number of reporting banks. - */ - uint64_t count : 8; -#define IA32_MCG_CAP_COUNT_BIT 0 -#define IA32_MCG_CAP_COUNT_FLAG 0xFF -#define IA32_MCG_CAP_COUNT_MASK 0xFF -#define IA32_MCG_CAP_COUNT(_) (((_) >> 0) & 0xFF) - - /** - * [Bit 8] IA32_MCG_CTL is present if this bit is set. - */ - uint64_t mcg_ctl_p : 1; -#define IA32_MCG_CAP_MCG_CTL_P_BIT 8 -#define IA32_MCG_CAP_MCG_CTL_P_FLAG 0x100 -#define IA32_MCG_CAP_MCG_CTL_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_CTL_P(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Extended machine check state registers are present if this bit is set. - */ - uint64_t mcg_ext_p : 1; -#define IA32_MCG_CAP_MCG_EXT_P_BIT 9 -#define IA32_MCG_CAP_MCG_EXT_P_FLAG 0x200 -#define IA32_MCG_CAP_MCG_EXT_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_EXT_P(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Support for corrected MC error event is present. - * - * @remarks 06_01H - */ - uint64_t mcp_cmci_p : 1; -#define IA32_MCG_CAP_MCP_CMCI_P_BIT 10 -#define IA32_MCG_CAP_MCP_CMCI_P_FLAG 0x400 -#define IA32_MCG_CAP_MCP_CMCI_P_MASK 0x01 -#define IA32_MCG_CAP_MCP_CMCI_P(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] Threshold-based error status register are present if this bit is set. - */ - uint64_t mcg_tes_p : 1; -#define IA32_MCG_CAP_MCG_TES_P_BIT 11 -#define IA32_MCG_CAP_MCG_TES_P_FLAG 0x800 -#define IA32_MCG_CAP_MCG_TES_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_TES_P(_) (((_) >> 11) & 0x01) - uint64_t reserved1 : 4; - - /** - * [Bits 23:16] Number of extended machine check state registers present. - */ - uint64_t mcg_ext_cnt : 8; -#define IA32_MCG_CAP_MCG_EXT_CNT_BIT 16 -#define IA32_MCG_CAP_MCG_EXT_CNT_FLAG 0xFF0000 -#define IA32_MCG_CAP_MCG_EXT_CNT_MASK 0xFF -#define IA32_MCG_CAP_MCG_EXT_CNT(_) (((_) >> 16) & 0xFF) - - /** - * [Bit 24] The processor supports software error recovery if this bit is set. - */ - uint64_t mcg_ser_p : 1; -#define IA32_MCG_CAP_MCG_SER_P_BIT 24 -#define IA32_MCG_CAP_MCG_SER_P_FLAG 0x1000000 -#define IA32_MCG_CAP_MCG_SER_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_SER_P(_) (((_) >> 24) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 26] 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. - * - * @remarks 06_3EH - */ - uint64_t mcg_elog_p : 1; -#define IA32_MCG_CAP_MCG_ELOG_P_BIT 26 -#define IA32_MCG_CAP_MCG_ELOG_P_FLAG 0x4000000 -#define IA32_MCG_CAP_MCG_ELOG_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_ELOG_P(_) (((_) >> 26) & 0x01) - - /** - * [Bit 27] Indicates that the processor supports extended state in IA32_MCG_STATUS and associated MSR necessary to - * configure Local Machine Check Exception (LMCE). - * - * @remarks 06_3EH - */ - uint64_t mcg_lmce_p : 1; -#define IA32_MCG_CAP_MCG_LMCE_P_BIT 27 -#define IA32_MCG_CAP_MCG_LMCE_P_FLAG 0x8000000 -#define IA32_MCG_CAP_MCG_LMCE_P_MASK 0x01 -#define IA32_MCG_CAP_MCG_LMCE_P(_) (((_) >> 27) & 0x01) - uint64_t reserved3 : 36; - }; - - uint64_t flags; -} ia32_mcg_cap_register; - - -/** - * Global Machine Check Status. - * - * @remarks 06_01H - */ -#define IA32_MCG_STATUS 0x0000017A -typedef union -{ - struct - { - /** - * [Bit 0] Restart IP valid. - * - * @remarks 06_01H - */ - uint64_t ripv : 1; -#define IA32_MCG_STATUS_RIPV_BIT 0 -#define IA32_MCG_STATUS_RIPV_FLAG 0x01 -#define IA32_MCG_STATUS_RIPV_MASK 0x01 -#define IA32_MCG_STATUS_RIPV(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Error IP valid. - * - * @remarks 06_01H - */ - uint64_t eipv : 1; -#define IA32_MCG_STATUS_EIPV_BIT 1 -#define IA32_MCG_STATUS_EIPV_FLAG 0x02 -#define IA32_MCG_STATUS_EIPV_MASK 0x01 -#define IA32_MCG_STATUS_EIPV(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Machine check in progress. - * - * @remarks 06_01H - */ - uint64_t mcip : 1; -#define IA32_MCG_STATUS_MCIP_BIT 2 -#define IA32_MCG_STATUS_MCIP_FLAG 0x04 -#define IA32_MCG_STATUS_MCIP_MASK 0x01 -#define IA32_MCG_STATUS_MCIP(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] If IA32_MCG_CAP.LMCE_P[27] = 1. - */ - uint64_t lmce_s : 1; -#define IA32_MCG_STATUS_LMCE_S_BIT 3 -#define IA32_MCG_STATUS_LMCE_S_FLAG 0x08 -#define IA32_MCG_STATUS_LMCE_S_MASK 0x01 -#define IA32_MCG_STATUS_LMCE_S(_) (((_) >> 3) & 0x01) - uint64_t reserved1 : 60; - }; - - uint64_t flags; -} ia32_mcg_status_register; - - -/** - * Global Machine Check Control. - * - * @remarks If IA32_MCG_CAP.CTL_P[8] = 1 - */ -#define IA32_MCG_CTL 0x0000017B - /** - * @defgroup ia32_perfevtsel \ - * IA32_PERFEVTSEL(n) - * - * Performance Event Select Register n. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - * @{ - */ -#define IA32_PERFEVTSEL0 0x00000186 -#define IA32_PERFEVTSEL1 0x00000187 -#define IA32_PERFEVTSEL2 0x00000188 -#define IA32_PERFEVTSEL3 0x00000189 -typedef union -{ - struct - { - /** - * [Bits 7:0] Selects a performance event logic unit. - */ - uint64_t event_select : 8; -#define IA32_PERFEVTSEL_EVENT_SELECT_BIT 0 -#define IA32_PERFEVTSEL_EVENT_SELECT_FLAG 0xFF -#define IA32_PERFEVTSEL_EVENT_SELECT_MASK 0xFF -#define IA32_PERFEVTSEL_EVENT_SELECT(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Qualifies the microarchitectural condition to detect on the selected event logic. - */ - uint64_t u_mask : 8; -#define IA32_PERFEVTSEL_U_MASK_BIT 8 -#define IA32_PERFEVTSEL_U_MASK_FLAG 0xFF00 -#define IA32_PERFEVTSEL_U_MASK_MASK 0xFF -#define IA32_PERFEVTSEL_U_MASK(_) (((_) >> 8) & 0xFF) - - /** - * [Bit 16] Counts while in privilege level is not ring 0. - */ - uint64_t usr : 1; -#define IA32_PERFEVTSEL_USR_BIT 16 -#define IA32_PERFEVTSEL_USR_FLAG 0x10000 -#define IA32_PERFEVTSEL_USR_MASK 0x01 -#define IA32_PERFEVTSEL_USR(_) (((_) >> 16) & 0x01) - - /** - * [Bit 17] Counts while in privilege level is ring 0. - */ - uint64_t os : 1; -#define IA32_PERFEVTSEL_OS_BIT 17 -#define IA32_PERFEVTSEL_OS_FLAG 0x20000 -#define IA32_PERFEVTSEL_OS_MASK 0x01 -#define IA32_PERFEVTSEL_OS(_) (((_) >> 17) & 0x01) - - /** - * [Bit 18] Enables edge detection if set. - */ - uint64_t edge : 1; -#define IA32_PERFEVTSEL_EDGE_BIT 18 -#define IA32_PERFEVTSEL_EDGE_FLAG 0x40000 -#define IA32_PERFEVTSEL_EDGE_MASK 0x01 -#define IA32_PERFEVTSEL_EDGE(_) (((_) >> 18) & 0x01) - - /** - * [Bit 19] Enables pin control. - */ - uint64_t pc : 1; -#define IA32_PERFEVTSEL_PC_BIT 19 -#define IA32_PERFEVTSEL_PC_FLAG 0x80000 -#define IA32_PERFEVTSEL_PC_MASK 0x01 -#define IA32_PERFEVTSEL_PC(_) (((_) >> 19) & 0x01) - - /** - * [Bit 20] Enables interrupt on counter overflow. - */ - uint64_t intr : 1; -#define IA32_PERFEVTSEL_INTR_BIT 20 -#define IA32_PERFEVTSEL_INTR_FLAG 0x100000 -#define IA32_PERFEVTSEL_INTR_MASK 0x01 -#define IA32_PERFEVTSEL_INTR(_) (((_) >> 20) & 0x01) - - /** - * [Bit 21] 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. - */ - uint64_t any_thread : 1; -#define IA32_PERFEVTSEL_ANY_THREAD_BIT 21 -#define IA32_PERFEVTSEL_ANY_THREAD_FLAG 0x200000 -#define IA32_PERFEVTSEL_ANY_THREAD_MASK 0x01 -#define IA32_PERFEVTSEL_ANY_THREAD(_) (((_) >> 21) & 0x01) - - /** - * [Bit 22] Enables the corresponding performance counter to commence counting when this bit is set. - */ - uint64_t en : 1; -#define IA32_PERFEVTSEL_EN_BIT 22 -#define IA32_PERFEVTSEL_EN_FLAG 0x400000 -#define IA32_PERFEVTSEL_EN_MASK 0x01 -#define IA32_PERFEVTSEL_EN(_) (((_) >> 22) & 0x01) - - /** - * [Bit 23] Invert the CMASK. - */ - uint64_t inv : 1; -#define IA32_PERFEVTSEL_INV_BIT 23 -#define IA32_PERFEVTSEL_INV_FLAG 0x800000 -#define IA32_PERFEVTSEL_INV_MASK 0x01 -#define IA32_PERFEVTSEL_INV(_) (((_) >> 23) & 0x01) - - /** - * [Bits 31:24] When CMASK is not zero, the corresponding performance counter increments each cycle if the event count is - * greater than or equal to the CMASK. - */ - uint64_t cmask : 8; -#define IA32_PERFEVTSEL_CMASK_BIT 24 -#define IA32_PERFEVTSEL_CMASK_FLAG 0xFF000000 -#define IA32_PERFEVTSEL_CMASK_MASK 0xFF -#define IA32_PERFEVTSEL_CMASK(_) (((_) >> 24) & 0xFF) - uint64_t reserved1 : 32; - }; - - uint64_t flags; -} ia32_perfevtsel_register; - -/** - * @} - */ - - - /** - * Current Performance Status. - * - * @remarks 0F_03H - * @see Vol3B[14.1.1(Software Interface For Initiating Performance State Transitions)] - */ -#define IA32_PERF_STATUS 0x00000198 -typedef union -{ - struct - { - /** - * [Bits 15:0] Current performance State Value. - */ - uint64_t state_value : 16; -#define IA32_PERF_STATUS_STATE_VALUE_BIT 0 -#define IA32_PERF_STATUS_STATE_VALUE_FLAG 0xFFFF -#define IA32_PERF_STATUS_STATE_VALUE_MASK 0xFFFF -#define IA32_PERF_STATUS_STATE_VALUE(_) (((_) >> 0) & 0xFFFF) - uint64_t reserved1 : 48; - }; - - uint64_t flags; -} ia32_perf_status_register; - - -/** - * @brief Performance Control (R/W) - * - * Performance Control. Software makes a request for a new Performance state (P-State) by writing this MSR. - * - * @remarks 0F_03H - * @see Vol3B[14.1.1(Software Interface For Initiating Performance State Transitions)] - */ -#define IA32_PERF_CTL 0x00000199 -typedef union -{ - struct - { - /** - * [Bits 15:0] Target performance State Value. - */ - uint64_t target_state_value : 16; -#define IA32_PERF_CTL_TARGET_STATE_VALUE_BIT 0 -#define IA32_PERF_CTL_TARGET_STATE_VALUE_FLAG 0xFFFF -#define IA32_PERF_CTL_TARGET_STATE_VALUE_MASK 0xFFFF -#define IA32_PERF_CTL_TARGET_STATE_VALUE(_) (((_) >> 0) & 0xFFFF) - uint64_t reserved1 : 16; - - /** - * [Bit 32] IDA Engage. - * - * @remarks 06_0FH (Mobile only) - */ - uint64_t ida_engage : 1; -#define IA32_PERF_CTL_IDA_ENGAGE_BIT 32 -#define IA32_PERF_CTL_IDA_ENGAGE_FLAG 0x100000000 -#define IA32_PERF_CTL_IDA_ENGAGE_MASK 0x01 -#define IA32_PERF_CTL_IDA_ENGAGE(_) (((_) >> 32) & 0x01) - uint64_t reserved2 : 31; - }; - - uint64_t flags; -} ia32_perf_ctl_register; - - -/** - * Clock Modulation Control. - * - * @remarks If CPUID.01H:EDX[22] = 1 - * @see Vol3B[14.7.3(Software Controlled Clock Modulation)] - */ -#define IA32_CLOCK_MODULATION 0x0000019A -typedef union -{ - struct - { - /** - * [Bit 0] Extended On-Demand Clock Modulation Duty Cycle. - * - * @remarks If CPUID.06H:EAX[5] = 1 - */ - uint64_t extended_on_demand_clock_modulation_duty_cycle : 1; -#define IA32_CLOCK_MODULATION_EXTENDED_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_BIT 0 -#define IA32_CLOCK_MODULATION_EXTENDED_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_FLAG 0x01 -#define IA32_CLOCK_MODULATION_EXTENDED_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_MASK 0x01 -#define IA32_CLOCK_MODULATION_EXTENDED_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE(_) (((_) >> 0) & 0x01) - - /** - * @brief On-Demand Clock Modulation Duty Cycle - * - * [Bits 3:1] On-Demand Clock Modulation Duty Cycle: Specific encoded values for target duty cycle modulation. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t on_demand_clock_modulation_duty_cycle : 3; -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_BIT 1 -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_FLAG 0x0E -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE_MASK 0x07 -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_DUTY_CYCLE(_) (((_) >> 1) & 0x07) - - /** - * @brief On-Demand Clock Modulation Enable - * - * [Bit 4] On-Demand Clock Modulation Enable: Set 1 to enable modulation. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t on_demand_clock_modulation_enable : 1; -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_ENABLE_BIT 4 -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_ENABLE_FLAG 0x10 -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_ENABLE_MASK 0x01 -#define IA32_CLOCK_MODULATION_ON_DEMAND_CLOCK_MODULATION_ENABLE(_) (((_) >> 4) & 0x01) - uint64_t reserved1 : 59; - }; - - uint64_t flags; -} ia32_clock_modulation_register; - - -/** - * @brief Thermal Interrupt Control (R/W) - * - * Thermal Interrupt Control. Enables and disables the generation of an interrupt on temperature transitions detected with - * the processor's thermal sensors and thermal monitor. - * - * @remarks If CPUID.01H:EDX[22] = 1 - * @see Vol3B[14.7.2(Thermal Monitor)] - */ -#define IA32_THERM_INTERRUPT 0x0000019B -typedef union -{ - struct - { - /** - * [Bit 0] High-Temperature Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t high_temperature_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_BIT 0 -#define IA32_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_FLAG 0x01 -#define IA32_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Low-Temperature Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t low_temperature_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_BIT 1 -#define IA32_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_FLAG 0x02 -#define IA32_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] PROCHOT\# Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t prochot_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_BIT 2 -#define IA32_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_FLAG 0x04 -#define IA32_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] FORCEPR\# Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t forcepr_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_FORCEPR_INTERRUPT_ENABLE_BIT 3 -#define IA32_THERM_INTERRUPT_FORCEPR_INTERRUPT_ENABLE_FLAG 0x08 -#define IA32_THERM_INTERRUPT_FORCEPR_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_FORCEPR_INTERRUPT_ENABLE(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Critical Temperature Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t critical_temperature_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_CRITICAL_TEMPERATURE_INTERRUPT_ENABLE_BIT 4 -#define IA32_THERM_INTERRUPT_CRITICAL_TEMPERATURE_INTERRUPT_ENABLE_FLAG 0x10 -#define IA32_THERM_INTERRUPT_CRITICAL_TEMPERATURE_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_CRITICAL_TEMPERATURE_INTERRUPT_ENABLE(_) (((_) >> 4) & 0x01) - uint64_t reserved1 : 3; - - /** - * [Bits 14:8] Threshold \#1 Value - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t threshold1_value : 7; -#define IA32_THERM_INTERRUPT_THRESHOLD1_VALUE_BIT 8 -#define IA32_THERM_INTERRUPT_THRESHOLD1_VALUE_FLAG 0x7F00 -#define IA32_THERM_INTERRUPT_THRESHOLD1_VALUE_MASK 0x7F -#define IA32_THERM_INTERRUPT_THRESHOLD1_VALUE(_) (((_) >> 8) & 0x7F) - - /** - * [Bit 15] Threshold \#1 Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t threshold1_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_BIT 15 -#define IA32_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_FLAG 0x8000 -#define IA32_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE(_) (((_) >> 15) & 0x01) - - /** - * [Bits 22:16] Threshold \#2 Value. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t threshold2_value : 7; -#define IA32_THERM_INTERRUPT_THRESHOLD2_VALUE_BIT 16 -#define IA32_THERM_INTERRUPT_THRESHOLD2_VALUE_FLAG 0x7F0000 -#define IA32_THERM_INTERRUPT_THRESHOLD2_VALUE_MASK 0x7F -#define IA32_THERM_INTERRUPT_THRESHOLD2_VALUE(_) (((_) >> 16) & 0x7F) - - /** - * [Bit 23] Threshold \#2 Interrupt Enable. - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t threshold2_interrupt_enable : 1; -#define IA32_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_BIT 23 -#define IA32_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_FLAG 0x800000 -#define IA32_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE(_) (((_) >> 23) & 0x01) - - /** - * [Bit 24] Power Limit Notification Enable. - * - * @remarks If CPUID.06H:EAX[4] = 1 - */ - uint64_t power_limit_notification_enable : 1; -#define IA32_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_BIT 24 -#define IA32_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_FLAG 0x1000000 -#define IA32_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_MASK 0x01 -#define IA32_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE(_) (((_) >> 24) & 0x01) - uint64_t reserved2 : 39; - }; - - uint64_t flags; -} ia32_therm_interrupt_register; - - -/** - * @brief Thermal Status Information (RO) - * - * Thermal Status Information. Contains status information about the processor's thermal sensor and automatic thermal - * monitoring facilities. - * - * @remarks If CPUID.01H:EDX[22] = 1 - * @see Vol3B[14.7.2(Thermal Monitor)] - */ -#define IA32_THERM_STATUS 0x0000019C -typedef union -{ - struct - { - /** - * [Bit 0] Thermal Status - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t thermal_status : 1; -#define IA32_THERM_STATUS_THERMAL_STATUS_BIT 0 -#define IA32_THERM_STATUS_THERMAL_STATUS_FLAG 0x01 -#define IA32_THERM_STATUS_THERMAL_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_STATUS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Thermal Status Log - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t thermal_status_log : 1; -#define IA32_THERM_STATUS_THERMAL_STATUS_LOG_BIT 1 -#define IA32_THERM_STATUS_THERMAL_STATUS_LOG_FLAG 0x02 -#define IA32_THERM_STATUS_THERMAL_STATUS_LOG_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_STATUS_LOG(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] PROCHOT \# or FORCEPR\# event - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t prochot_forcepr_event : 1; -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_EVENT_BIT 2 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_EVENT_FLAG 0x04 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_EVENT_MASK 0x01 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_EVENT(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] PROCHOT \# or FORCEPR\# log - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t prochot_forcepr_log : 1; -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_LOG_BIT 3 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_LOG_FLAG 0x08 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_LOG_MASK 0x01 -#define IA32_THERM_STATUS_PROCHOT_FORCEPR_LOG(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Critical Temperature Status - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t critical_temperature_status : 1; -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_BIT 4 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_FLAG 0x10 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Critical Temperature Status log - * - * @remarks If CPUID.01H:EDX[22] = 1 - */ - uint64_t critical_temperature_status_log : 1; -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_BIT 5 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_FLAG 0x20 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_MASK 0x01 -#define IA32_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Thermal Threshold \#1 Status - * - * @remarks If CPUID.01H:ECX[8] = 1 - */ - uint64_t thermal_threshold1_status : 1; -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_BIT 6 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_FLAG 0x40 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_STATUS(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Thermal Threshold \#1 log - * - * @remarks If CPUID.01H:ECX[8] = 1 - */ - uint64_t thermal_threshold1_log : 1; -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_LOG_BIT 7 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_LOG_FLAG 0x80 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_LOG_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD1_LOG(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Thermal Threshold \#2 Status - * - * @remarks If CPUID.01H:ECX[8] = 1 - */ - uint64_t thermal_threshold2_status : 1; -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_BIT 8 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_FLAG 0x100 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_STATUS(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Thermal Threshold \#2 log - * - * @remarks If CPUID.01H:ECX[8] = 1 - */ - uint64_t thermal_threshold2_log : 1; -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_LOG_BIT 9 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_LOG_FLAG 0x200 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_LOG_MASK 0x01 -#define IA32_THERM_STATUS_THERMAL_THRESHOLD2_LOG(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Power Limitation Status - * - * @remarks If CPUID.06H:EAX[4] = 1 - */ - uint64_t power_limitation_status : 1; -#define IA32_THERM_STATUS_POWER_LIMITATION_STATUS_BIT 10 -#define IA32_THERM_STATUS_POWER_LIMITATION_STATUS_FLAG 0x400 -#define IA32_THERM_STATUS_POWER_LIMITATION_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_POWER_LIMITATION_STATUS(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] Power Limitation log - * - * @remarks If CPUID.06H:EAX[4] = 1 - */ - uint64_t power_limitation_log : 1; -#define IA32_THERM_STATUS_POWER_LIMITATION_LOG_BIT 11 -#define IA32_THERM_STATUS_POWER_LIMITATION_LOG_FLAG 0x800 -#define IA32_THERM_STATUS_POWER_LIMITATION_LOG_MASK 0x01 -#define IA32_THERM_STATUS_POWER_LIMITATION_LOG(_) (((_) >> 11) & 0x01) - - /** - * [Bit 12] Current Limit Status - * - * @remarks If CPUID.06H:EAX[7] = 1 - */ - uint64_t current_limit_status : 1; -#define IA32_THERM_STATUS_CURRENT_LIMIT_STATUS_BIT 12 -#define IA32_THERM_STATUS_CURRENT_LIMIT_STATUS_FLAG 0x1000 -#define IA32_THERM_STATUS_CURRENT_LIMIT_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_CURRENT_LIMIT_STATUS(_) (((_) >> 12) & 0x01) - - /** - * [Bit 13] Current Limit log - * - * @remarks If CPUID.06H:EAX[7] = 1 - */ - uint64_t current_limit_log : 1; -#define IA32_THERM_STATUS_CURRENT_LIMIT_LOG_BIT 13 -#define IA32_THERM_STATUS_CURRENT_LIMIT_LOG_FLAG 0x2000 -#define IA32_THERM_STATUS_CURRENT_LIMIT_LOG_MASK 0x01 -#define IA32_THERM_STATUS_CURRENT_LIMIT_LOG(_) (((_) >> 13) & 0x01) - - /** - * [Bit 14] Cross Domain Limit Status - * - * @remarks If CPUID.06H:EAX[7] = 1 - */ - uint64_t cross_domain_limit_status : 1; -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_STATUS_BIT 14 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_STATUS_FLAG 0x4000 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_STATUS_MASK 0x01 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_STATUS(_) (((_) >> 14) & 0x01) - - /** - * [Bit 15] Cross Domain Limit log - * - * @remarks If CPUID.06H:EAX[7] = 1 - */ - uint64_t cross_domain_limit_log : 1; -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_LOG_BIT 15 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_LOG_FLAG 0x8000 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_LOG_MASK 0x01 -#define IA32_THERM_STATUS_CROSS_DOMAIN_LIMIT_LOG(_) (((_) >> 15) & 0x01) - - /** - * [Bits 22:16] Digital Readout - * - * @remarks If CPUID.06H:EAX[0] = 1 - */ - uint64_t digital_readout : 7; -#define IA32_THERM_STATUS_DIGITAL_READOUT_BIT 16 -#define IA32_THERM_STATUS_DIGITAL_READOUT_FLAG 0x7F0000 -#define IA32_THERM_STATUS_DIGITAL_READOUT_MASK 0x7F -#define IA32_THERM_STATUS_DIGITAL_READOUT(_) (((_) >> 16) & 0x7F) - uint64_t reserved1 : 4; - - /** - * [Bits 30:27] Resolution in Degrees Celsius - * - * @remarks If CPUID.06H:EAX[0] = 1 - */ - uint64_t resolution_in_degrees_celsius : 4; -#define IA32_THERM_STATUS_RESOLUTION_IN_DEGREES_CELSIUS_BIT 27 -#define IA32_THERM_STATUS_RESOLUTION_IN_DEGREES_CELSIUS_FLAG 0x78000000 -#define IA32_THERM_STATUS_RESOLUTION_IN_DEGREES_CELSIUS_MASK 0x0F -#define IA32_THERM_STATUS_RESOLUTION_IN_DEGREES_CELSIUS(_) (((_) >> 27) & 0x0F) - - /** - * [Bit 31] Reading Valid - * - * @remarks If CPUID.06H:EAX[0] = 1 - */ - uint64_t reading_valid : 1; -#define IA32_THERM_STATUS_READING_VALID_BIT 31 -#define IA32_THERM_STATUS_READING_VALID_FLAG 0x80000000 -#define IA32_THERM_STATUS_READING_VALID_MASK 0x01 -#define IA32_THERM_STATUS_READING_VALID(_) (((_) >> 31) & 0x01) - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} ia32_therm_status_register; - - -/** - * @brief Enable Misc. Processor Features (R/W) - * - * Allows a variety of processor functions to be enabled and disabled. - */ -#define IA32_MISC_ENABLE 0x000001A0 -typedef union -{ - struct - { - /** - * @brief Fast-Strings Enable - * - * [Bit 0] When set, the fast-strings feature (for REP MOVS and REP STORS) is enabled (default). When clear, fast-strings - * are disabled. - * - * @remarks 0F_0H - */ - uint64_t fast_strings_enable : 1; -#define IA32_MISC_ENABLE_FAST_STRINGS_ENABLE_BIT 0 -#define IA32_MISC_ENABLE_FAST_STRINGS_ENABLE_FLAG 0x01 -#define IA32_MISC_ENABLE_FAST_STRINGS_ENABLE_MASK 0x01 -#define IA32_MISC_ENABLE_FAST_STRINGS_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 2; - - /** - * @brief Automatic Thermal Control Circuit Enable (R/W) - * - * [Bit 3] - 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. - * @remarks 0F_0H - */ - uint64_t automatic_thermal_control_circuit_enable : 1; -#define IA32_MISC_ENABLE_AUTOMATIC_THERMAL_CONTROL_CIRCUIT_ENABLE_BIT 3 -#define IA32_MISC_ENABLE_AUTOMATIC_THERMAL_CONTROL_CIRCUIT_ENABLE_FLAG 0x08 -#define IA32_MISC_ENABLE_AUTOMATIC_THERMAL_CONTROL_CIRCUIT_ENABLE_MASK 0x01 -#define IA32_MISC_ENABLE_AUTOMATIC_THERMAL_CONTROL_CIRCUIT_ENABLE(_) (((_) >> 3) & 0x01) - uint64_t reserved2 : 3; - - /** - * @brief Performance Monitoring Available (R) - * - * [Bit 7] - 1 = Performance monitoring enabled. - * - 0 = Performance monitoring disabled. - * - * @remarks 0F_0H - */ - uint64_t performance_monitoring_available : 1; -#define IA32_MISC_ENABLE_PERFORMANCE_MONITORING_AVAILABLE_BIT 7 -#define IA32_MISC_ENABLE_PERFORMANCE_MONITORING_AVAILABLE_FLAG 0x80 -#define IA32_MISC_ENABLE_PERFORMANCE_MONITORING_AVAILABLE_MASK 0x01 -#define IA32_MISC_ENABLE_PERFORMANCE_MONITORING_AVAILABLE(_) (((_) >> 7) & 0x01) - uint64_t reserved3 : 3; - - /** - * @brief Branch Trace Storage Unavailable (RO) - * - * [Bit 11] - 1 = Processor doesn't support branch trace storage (BTS). - * - 0 = BTS is supported. - * - * @remarks 0F_0H - */ - uint64_t branch_trace_storage_unavailable : 1; -#define IA32_MISC_ENABLE_BRANCH_TRACE_STORAGE_UNAVAILABLE_BIT 11 -#define IA32_MISC_ENABLE_BRANCH_TRACE_STORAGE_UNAVAILABLE_FLAG 0x800 -#define IA32_MISC_ENABLE_BRANCH_TRACE_STORAGE_UNAVAILABLE_MASK 0x01 -#define IA32_MISC_ENABLE_BRANCH_TRACE_STORAGE_UNAVAILABLE(_) (((_) >> 11) & 0x01) - - /** - * @brief Processor Event Based Sampling (PEBS) Unavailable (RO) - * - * [Bit 12] - 1 = PEBS is not supported. - * - 0 = PEBS is supported. - * - * @remarks 06_0FH - */ - uint64_t processor_event_based_sampling_unavailable : 1; -#define IA32_MISC_ENABLE_PROCESSOR_EVENT_BASED_SAMPLING_UNAVAILABLE_BIT 12 -#define IA32_MISC_ENABLE_PROCESSOR_EVENT_BASED_SAMPLING_UNAVAILABLE_FLAG 0x1000 -#define IA32_MISC_ENABLE_PROCESSOR_EVENT_BASED_SAMPLING_UNAVAILABLE_MASK 0x01 -#define IA32_MISC_ENABLE_PROCESSOR_EVENT_BASED_SAMPLING_UNAVAILABLE(_) (((_) >> 12) & 0x01) - uint64_t reserved4 : 3; - - /** - * @brief Enhanced Intel SpeedStep Technology Enable (R/W) - * - * [Bit 16] - 0 = Enhanced Intel SpeedStep Technology disabled. - * - 1 = Enhanced Intel SpeedStep Technology enabled. - * - * @remarks If CPUID.01H: ECX[7] = 1 - */ - uint64_t enhanced_intel_speedstep_technology_enable : 1; -#define IA32_MISC_ENABLE_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_ENABLE_BIT 16 -#define IA32_MISC_ENABLE_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_ENABLE_FLAG 0x10000 -#define IA32_MISC_ENABLE_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_ENABLE_MASK 0x01 -#define IA32_MISC_ENABLE_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY_ENABLE(_) (((_) >> 16) & 0x01) - uint64_t reserved5 : 1; - - /** - * @brief ENABLE MONITOR FSM (R/W) - * - * [Bit 18] When this bit is set to 0, the MONITOR feature flag is not set (CPUID.01H:ECX[bit3] = 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. - * - * @remarks 0F_03H - */ - uint64_t enable_monitor_fsm : 1; -#define IA32_MISC_ENABLE_ENABLE_MONITOR_FSM_BIT 18 -#define IA32_MISC_ENABLE_ENABLE_MONITOR_FSM_FLAG 0x40000 -#define IA32_MISC_ENABLE_ENABLE_MONITOR_FSM_MASK 0x01 -#define IA32_MISC_ENABLE_ENABLE_MONITOR_FSM(_) (((_) >> 18) & 0x01) - uint64_t reserved6 : 3; - - /** - * @brief Limit CPUID Maxval (R/W) - * - * [Bit 22] 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. - * - * @remarks 0F_03H - */ - uint64_t limit_cpuid_maxval : 1; -#define IA32_MISC_ENABLE_LIMIT_CPUID_MAXVAL_BIT 22 -#define IA32_MISC_ENABLE_LIMIT_CPUID_MAXVAL_FLAG 0x400000 -#define IA32_MISC_ENABLE_LIMIT_CPUID_MAXVAL_MASK 0x01 -#define IA32_MISC_ENABLE_LIMIT_CPUID_MAXVAL(_) (((_) >> 22) & 0x01) - - /** - * @brief xTPR Message Disable (R/W) - * - * [Bit 23] When set to 1, xTPR messages are disabled. xTPR messages are optional messages that allow the processor to - * inform the chipset of its priority. - * - * @remarks If CPUID.01H:ECX[14] = 1 - */ - uint64_t xtpr_message_disable : 1; -#define IA32_MISC_ENABLE_XTPR_MESSAGE_DISABLE_BIT 23 -#define IA32_MISC_ENABLE_XTPR_MESSAGE_DISABLE_FLAG 0x800000 -#define IA32_MISC_ENABLE_XTPR_MESSAGE_DISABLE_MASK 0x01 -#define IA32_MISC_ENABLE_XTPR_MESSAGE_DISABLE(_) (((_) >> 23) & 0x01) - uint64_t reserved7 : 10; - - /** - * @brief XD Bit Disable (R/W) - * - * [Bit 34] 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. - * - * @remarks If CPUID.80000001H:EDX[20] = 1 - */ - uint64_t xd_bit_disable : 1; -#define IA32_MISC_ENABLE_XD_BIT_DISABLE_BIT 34 -#define IA32_MISC_ENABLE_XD_BIT_DISABLE_FLAG 0x400000000 -#define IA32_MISC_ENABLE_XD_BIT_DISABLE_MASK 0x01 -#define IA32_MISC_ENABLE_XD_BIT_DISABLE(_) (((_) >> 34) & 0x01) - uint64_t reserved8 : 29; - }; - - uint64_t flags; -} ia32_misc_enable_register; - - -/** - * Performance Energy Bias Hint. - * - * @remarks If CPUID.6H:ECX[3] = 1 - */ -#define IA32_ENERGY_PERF_BIAS 0x000001B0 -typedef union -{ - struct - { - /** - * @brief Power Policy Preference - * - * [Bits 3:0] - 0 indicates preference to highest performance. - * - 15 indicates preference to maximize energy saving. - */ - uint64_t power_policy_preference : 4; -#define IA32_ENERGY_PERF_BIAS_POWER_POLICY_PREFERENCE_BIT 0 -#define IA32_ENERGY_PERF_BIAS_POWER_POLICY_PREFERENCE_FLAG 0x0F -#define IA32_ENERGY_PERF_BIAS_POWER_POLICY_PREFERENCE_MASK 0x0F -#define IA32_ENERGY_PERF_BIAS_POWER_POLICY_PREFERENCE(_) (((_) >> 0) & 0x0F) - uint64_t reserved1 : 60; - }; - - uint64_t flags; -} ia32_energy_perf_bias_register; - - -/** - * @brief Package Thermal Status Information (RO) - * - * Package Thermal Status Information. Contains status information about the package's thermal sensor. - * - * @remarks If CPUID.06H: EAX[6] = 1 - * @see Vol3B[14.8(PACKAGE LEVEL THERMAL MANAGEMENT)] - */ -#define IA32_PACKAGE_THERM_STATUS 0x000001B1 -typedef union -{ - struct - { - /** - * [Bit 0] Pkg Thermal Status - */ - uint64_t thermal_status : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_BIT 0 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_FLAG 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Pkg Thermal Status Log - */ - uint64_t thermal_status_log : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_LOG_BIT 1 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_LOG_FLAG 0x02 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_STATUS_LOG(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Pkg PROCHOT \# event - */ - uint64_t prochot_event : 1; -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_EVENT_BIT 2 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_EVENT_FLAG 0x04 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_EVENT_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_EVENT(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Pkg PROCHOT \# log - */ - uint64_t prochot_log : 1; -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_LOG_BIT 3 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_LOG_FLAG 0x08 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_PROCHOT_LOG(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Pkg Critical Temperature Status - */ - uint64_t critical_temperature_status : 1; -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_BIT 4 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_FLAG 0x10 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Pkg Critical Temperature Status Log - */ - uint64_t critical_temperature_status_log : 1; -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_BIT 5 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_FLAG 0x20 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_CRITICAL_TEMPERATURE_STATUS_LOG(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Pkg Thermal Threshold \#1 Status - */ - uint64_t thermal_threshold1_status : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_BIT 6 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_FLAG 0x40 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_STATUS_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_STATUS(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Pkg Thermal Threshold \#1 log - */ - uint64_t thermal_threshold1_log : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_LOG_BIT 7 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_LOG_FLAG 0x80 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD1_LOG(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Pkg Thermal Threshold \#2 Status - */ - uint64_t thermal_threshold2_status : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_BIT 8 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_FLAG 0x100 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_STATUS_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_STATUS(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] Pkg Thermal Threshold \#2 log - */ - uint64_t thermal_threshold2_log : 1; -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_LOG_BIT 9 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_LOG_FLAG 0x200 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_THERMAL_THRESHOLD2_LOG(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Pkg Power Limitation Status - */ - uint64_t power_limitation_status : 1; -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_STATUS_BIT 10 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_STATUS_FLAG 0x400 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_STATUS_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_STATUS(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] Pkg Power Limitation log - */ - uint64_t power_limitation_log : 1; -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_LOG_BIT 11 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_LOG_FLAG 0x800 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_LOG_MASK 0x01 -#define IA32_PACKAGE_THERM_STATUS_POWER_LIMITATION_LOG(_) (((_) >> 11) & 0x01) - uint64_t reserved1 : 4; - - /** - * [Bits 22:16] Pkg Digital Readout - */ - uint64_t digital_readout : 7; -#define IA32_PACKAGE_THERM_STATUS_DIGITAL_READOUT_BIT 16 -#define IA32_PACKAGE_THERM_STATUS_DIGITAL_READOUT_FLAG 0x7F0000 -#define IA32_PACKAGE_THERM_STATUS_DIGITAL_READOUT_MASK 0x7F -#define IA32_PACKAGE_THERM_STATUS_DIGITAL_READOUT(_) (((_) >> 16) & 0x7F) - uint64_t reserved2 : 41; - }; - - uint64_t flags; -} ia32_package_therm_status_register; - - -/** - * @brief Package Thermal Interrupt Control (RO) - * - * Enables and disables the generation of an interrupt on temperature transitions detected with the package's thermal - * sensor. - * - * @remarks If CPUID.06H: EAX[6] = 1 - * @see Vol3B[14.8(PACKAGE LEVEL THERMAL MANAGEMENT)] - */ -#define IA32_PACKAGE_THERM_INTERRUPT 0x000001B2 -typedef union -{ - struct - { - /** - * [Bit 0] Pkg High-Temperature Interrupt Enable. - */ - uint64_t high_temperature_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_BIT 0 -#define IA32_PACKAGE_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_FLAG 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_HIGH_TEMPERATURE_INTERRUPT_ENABLE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Pkg Low-Temperature Interrupt Enable. - */ - uint64_t low_temperature_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_BIT 1 -#define IA32_PACKAGE_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_FLAG 0x02 -#define IA32_PACKAGE_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_LOW_TEMPERATURE_INTERRUPT_ENABLE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Pkg PROCHOT\# Interrupt Enable. - */ - uint64_t prochot_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_BIT 2 -#define IA32_PACKAGE_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_FLAG 0x04 -#define IA32_PACKAGE_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_PROCHOT_INTERRUPT_ENABLE(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 4] Pkg Overheat Interrupt Enable. - */ - uint64_t overheat_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_OVERHEAT_INTERRUPT_ENABLE_BIT 4 -#define IA32_PACKAGE_THERM_INTERRUPT_OVERHEAT_INTERRUPT_ENABLE_FLAG 0x10 -#define IA32_PACKAGE_THERM_INTERRUPT_OVERHEAT_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_OVERHEAT_INTERRUPT_ENABLE(_) (((_) >> 4) & 0x01) - uint64_t reserved2 : 3; - - /** - * [Bits 14:8] Pkg Threshold \#1 Value - */ - uint64_t threshold1_value : 7; -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_VALUE_BIT 8 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_VALUE_FLAG 0x7F00 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_VALUE_MASK 0x7F -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_VALUE(_) (((_) >> 8) & 0x7F) - - /** - * [Bit 15] Pkg Threshold \#1 Interrupt Enable. - */ - uint64_t threshold1_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_BIT 15 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_FLAG 0x8000 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD1_INTERRUPT_ENABLE(_) (((_) >> 15) & 0x01) - - /** - * [Bits 22:16] Pkg Threshold \#2 Value. - */ - uint64_t threshold2_value : 7; -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_VALUE_BIT 16 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_VALUE_FLAG 0x7F0000 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_VALUE_MASK 0x7F -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_VALUE(_) (((_) >> 16) & 0x7F) - - /** - * [Bit 23] Pkg Threshold \#2 Interrupt Enable. - */ - uint64_t threshold2_interrupt_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_BIT 23 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_FLAG 0x800000 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_THRESHOLD2_INTERRUPT_ENABLE(_) (((_) >> 23) & 0x01) - - /** - * [Bit 24] Pkg Power Limit Notification Enable. - */ - uint64_t power_limit_notification_enable : 1; -#define IA32_PACKAGE_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_BIT 24 -#define IA32_PACKAGE_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_FLAG 0x1000000 -#define IA32_PACKAGE_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE_MASK 0x01 -#define IA32_PACKAGE_THERM_INTERRUPT_POWER_LIMIT_NOTIFICATION_ENABLE(_) (((_) >> 24) & 0x01) - uint64_t reserved3 : 39; - }; - - uint64_t flags; -} ia32_package_therm_interrupt_register; - - -/** - * Trace/Profile Resource Control. - * - * @remarks 06_0EH - */ -#define IA32_DEBUGCTL 0x000001D9 -typedef union -{ - struct - { - /** - * [Bit 0] 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. - * - * @remarks 06_01H - */ - uint64_t lbr : 1; -#define IA32_DEBUGCTL_LBR_BIT 0 -#define IA32_DEBUGCTL_LBR_FLAG 0x01 -#define IA32_DEBUGCTL_LBR_MASK 0x01 -#define IA32_DEBUGCTL_LBR(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Setting this bit to 1 enables the processor to treat EFLAGS.TF as single-step on branches instead of single-step - * on instructions. - * - * @remarks 06_01H - */ - uint64_t btf : 1; -#define IA32_DEBUGCTL_BTF_BIT 1 -#define IA32_DEBUGCTL_BTF_FLAG 0x02 -#define IA32_DEBUGCTL_BTF_MASK 0x01 -#define IA32_DEBUGCTL_BTF(_) (((_) >> 1) & 0x01) - uint64_t reserved1 : 4; - - /** - * [Bit 6] Setting this bit to 1 enables branch trace messages to be sent. - * - * @remarks 06_0EH - */ - uint64_t tr : 1; -#define IA32_DEBUGCTL_TR_BIT 6 -#define IA32_DEBUGCTL_TR_FLAG 0x40 -#define IA32_DEBUGCTL_TR_MASK 0x01 -#define IA32_DEBUGCTL_TR(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Setting this bit enables branch trace messages (BTMs) to be logged in a BTS buffer. - * - * @remarks 06_0EH - */ - uint64_t bts : 1; -#define IA32_DEBUGCTL_BTS_BIT 7 -#define IA32_DEBUGCTL_BTS_FLAG 0x80 -#define IA32_DEBUGCTL_BTS_MASK 0x01 -#define IA32_DEBUGCTL_BTS(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] 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. - * - * @remarks 06_0EH - */ - uint64_t btint : 1; -#define IA32_DEBUGCTL_BTINT_BIT 8 -#define IA32_DEBUGCTL_BTINT_FLAG 0x100 -#define IA32_DEBUGCTL_BTINT_MASK 0x01 -#define IA32_DEBUGCTL_BTINT(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] When set, BTS or BTM is skipped if CPL = 0. - * - * @remarks 06_0FH - */ - uint64_t bts_off_os : 1; -#define IA32_DEBUGCTL_BTS_OFF_OS_BIT 9 -#define IA32_DEBUGCTL_BTS_OFF_OS_FLAG 0x200 -#define IA32_DEBUGCTL_BTS_OFF_OS_MASK 0x01 -#define IA32_DEBUGCTL_BTS_OFF_OS(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] When set, BTS or BTM is skipped if CPL > 0. - * - * @remarks 06_0FH - */ - uint64_t bts_off_usr : 1; -#define IA32_DEBUGCTL_BTS_OFF_USR_BIT 10 -#define IA32_DEBUGCTL_BTS_OFF_USR_FLAG 0x400 -#define IA32_DEBUGCTL_BTS_OFF_USR_MASK 0x01 -#define IA32_DEBUGCTL_BTS_OFF_USR(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] When set, the LBR stack is frozen on a PMI request. - * - * @remarks If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1 - */ - uint64_t freeze_lbrs_on_pmi : 1; -#define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_BIT 11 -#define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_FLAG 0x800 -#define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI_MASK 0x01 -#define IA32_DEBUGCTL_FREEZE_LBRS_ON_PMI(_) (((_) >> 11) & 0x01) - - /** - * [Bit 12] When set, each ENABLE bit of the global counter control MSR are frozen (address 38FH) on a PMI request. - * - * @remarks If CPUID.01H: ECX[15] = 1 && CPUID.0AH: EAX[7:0] > 1 - */ - uint64_t freeze_perfmon_on_pmi : 1; -#define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_BIT 12 -#define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_FLAG 0x1000 -#define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI_MASK 0x01 -#define IA32_DEBUGCTL_FREEZE_PERFMON_ON_PMI(_) (((_) >> 12) & 0x01) - - /** - * [Bit 13] When set, enables the logical processor to receive and generate PMI on behalf of the uncore. - * - * @remarks 06_1AH - */ - uint64_t enable_uncore_pmi : 1; -#define IA32_DEBUGCTL_ENABLE_UNCORE_PMI_BIT 13 -#define IA32_DEBUGCTL_ENABLE_UNCORE_PMI_FLAG 0x2000 -#define IA32_DEBUGCTL_ENABLE_UNCORE_PMI_MASK 0x01 -#define IA32_DEBUGCTL_ENABLE_UNCORE_PMI(_) (((_) >> 13) & 0x01) - - /** - * [Bit 14] When set, freezes perfmon and trace messages while in SMM. - * - * @remarks If IA32_PERF_CAPABILITIES[12] = 1 - */ - uint64_t freeze_while_smm : 1; -#define IA32_DEBUGCTL_FREEZE_WHILE_SMM_BIT 14 -#define IA32_DEBUGCTL_FREEZE_WHILE_SMM_FLAG 0x4000 -#define IA32_DEBUGCTL_FREEZE_WHILE_SMM_MASK 0x01 -#define IA32_DEBUGCTL_FREEZE_WHILE_SMM(_) (((_) >> 14) & 0x01) - - /** - * [Bit 15] When set, enables DR7 debug bit on XBEGIN. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[11] = 1) - */ - uint64_t rtm_debug : 1; -#define IA32_DEBUGCTL_RTM_DEBUG_BIT 15 -#define IA32_DEBUGCTL_RTM_DEBUG_FLAG 0x8000 -#define IA32_DEBUGCTL_RTM_DEBUG_MASK 0x01 -#define IA32_DEBUGCTL_RTM_DEBUG(_) (((_) >> 15) & 0x01) - uint64_t reserved2 : 48; - }; - - uint64_t flags; -} ia32_debugctl_register; - - -/** - * @brief SMRR Base Address (Writeable only in SMM) - * - * SMRR Base Address. Base address of SMM memory range. - * - * @remarks If IA32_MTRRCAP.SMRR[11] = 1 - */ -#define IA32_SMRR_PHYSBASE 0x000001F2 -typedef union -{ - struct - { - /** - * @brief Type - * - * [Bits 7:0] Type. Specifies memory type of the range. - */ - uint64_t type : 8; -#define IA32_SMRR_PHYSBASE_TYPE_BIT 0 -#define IA32_SMRR_PHYSBASE_TYPE_FLAG 0xFF -#define IA32_SMRR_PHYSBASE_TYPE_MASK 0xFF -#define IA32_SMRR_PHYSBASE_TYPE(_) (((_) >> 0) & 0xFF) - uint64_t reserved1 : 4; - - /** - * [Bits 31:12] SMRR physical Base Address. - */ - uint64_t smrr_physical_base_address : 20; -#define IA32_SMRR_PHYSBASE_SMRR_PHYSICAL_BASE_ADDRESS_BIT 12 -#define IA32_SMRR_PHYSBASE_SMRR_PHYSICAL_BASE_ADDRESS_FLAG 0xFFFFF000 -#define IA32_SMRR_PHYSBASE_SMRR_PHYSICAL_BASE_ADDRESS_MASK 0xFFFFF -#define IA32_SMRR_PHYSBASE_SMRR_PHYSICAL_BASE_ADDRESS(_) (((_) >> 12) & 0xFFFFF) - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} ia32_smrr_physbase_register; - - -/** - * @brief SMRR Range Mask (Writeable only in SMM) - * - * Range Mask of SMM memory range. - * - * @remarks If IA32_MTRRCAP[SMRR] = 1 - */ -#define IA32_SMRR_PHYSMASK 0x000001F3 -typedef union -{ - struct - { - uint64_t reserved1 : 11; - - /** - * [Bit 11] Enable range mask. - */ - uint64_t enable_range_mask : 1; -#define IA32_SMRR_PHYSMASK_ENABLE_RANGE_MASK_BIT 11 -#define IA32_SMRR_PHYSMASK_ENABLE_RANGE_MASK_FLAG 0x800 -#define IA32_SMRR_PHYSMASK_ENABLE_RANGE_MASK_MASK 0x01 -#define IA32_SMRR_PHYSMASK_ENABLE_RANGE_MASK(_) (((_) >> 11) & 0x01) - - /** - * [Bits 31:12] SMRR address range mask. - */ - uint64_t smrr_address_range_mask : 20; -#define IA32_SMRR_PHYSMASK_SMRR_ADDRESS_RANGE_MASK_BIT 12 -#define IA32_SMRR_PHYSMASK_SMRR_ADDRESS_RANGE_MASK_FLAG 0xFFFFF000 -#define IA32_SMRR_PHYSMASK_SMRR_ADDRESS_RANGE_MASK_MASK 0xFFFFF -#define IA32_SMRR_PHYSMASK_SMRR_ADDRESS_RANGE_MASK(_) (((_) >> 12) & 0xFFFFF) - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} ia32_smrr_physmask_register; - - -/** - * DCA Capability. - * - * @remarks If CPUID.01H: ECX[18] = 1 - */ -#define IA32_PLATFORM_DCA_CAP 0x000001F8 - - /** - * If set, CPU supports Prefetch-Hint type. - * - * @remarks If CPUID.01H: ECX[18] = 1 - */ -#define IA32_CPU_DCA_CAP 0x000001F9 - - /** - * DCA type 0 Status and Control register. - * - * @remarks If CPUID.01H: ECX[18] = 1 - */ -#define IA32_DCA_0_CAP 0x000001FA -typedef union -{ - struct - { - /** - * [Bit 0] Set by HW when DCA is fuseenabled and no defeatures are set. - */ - uint64_t dca_active : 1; -#define IA32_DCA_0_CAP_DCA_ACTIVE_BIT 0 -#define IA32_DCA_0_CAP_DCA_ACTIVE_FLAG 0x01 -#define IA32_DCA_0_CAP_DCA_ACTIVE_MASK 0x01 -#define IA32_DCA_0_CAP_DCA_ACTIVE(_) (((_) >> 0) & 0x01) - - /** - * [Bits 2:1] TRANSACTION. - */ - uint64_t transaction : 2; -#define IA32_DCA_0_CAP_TRANSACTION_BIT 1 -#define IA32_DCA_0_CAP_TRANSACTION_FLAG 0x06 -#define IA32_DCA_0_CAP_TRANSACTION_MASK 0x03 -#define IA32_DCA_0_CAP_TRANSACTION(_) (((_) >> 1) & 0x03) - - /** - * [Bits 6:3] DCA_TYPE. - */ - uint64_t dca_type : 4; -#define IA32_DCA_0_CAP_DCA_TYPE_BIT 3 -#define IA32_DCA_0_CAP_DCA_TYPE_FLAG 0x78 -#define IA32_DCA_0_CAP_DCA_TYPE_MASK 0x0F -#define IA32_DCA_0_CAP_DCA_TYPE(_) (((_) >> 3) & 0x0F) - - /** - * [Bits 10:7] DCA_QUEUE_SIZE. - */ - uint64_t dca_queue_size : 4; -#define IA32_DCA_0_CAP_DCA_QUEUE_SIZE_BIT 7 -#define IA32_DCA_0_CAP_DCA_QUEUE_SIZE_FLAG 0x780 -#define IA32_DCA_0_CAP_DCA_QUEUE_SIZE_MASK 0x0F -#define IA32_DCA_0_CAP_DCA_QUEUE_SIZE(_) (((_) >> 7) & 0x0F) - uint64_t reserved1 : 2; - - /** - * [Bits 16:13] Writes will update the register but have no HW side-effect. - */ - uint64_t dca_delay : 4; -#define IA32_DCA_0_CAP_DCA_DELAY_BIT 13 -#define IA32_DCA_0_CAP_DCA_DELAY_FLAG 0x1E000 -#define IA32_DCA_0_CAP_DCA_DELAY_MASK 0x0F -#define IA32_DCA_0_CAP_DCA_DELAY(_) (((_) >> 13) & 0x0F) - uint64_t reserved2 : 7; - - /** - * [Bit 24] SW can request DCA block by setting this bit. - */ - uint64_t sw_block : 1; -#define IA32_DCA_0_CAP_SW_BLOCK_BIT 24 -#define IA32_DCA_0_CAP_SW_BLOCK_FLAG 0x1000000 -#define IA32_DCA_0_CAP_SW_BLOCK_MASK 0x01 -#define IA32_DCA_0_CAP_SW_BLOCK(_) (((_) >> 24) & 0x01) - uint64_t reserved3 : 1; - - /** - * [Bit 26] Set when DCA is blocked by HW (e.g. CR0.CD = 1). - */ - uint64_t hw_block : 1; -#define IA32_DCA_0_CAP_HW_BLOCK_BIT 26 -#define IA32_DCA_0_CAP_HW_BLOCK_FLAG 0x4000000 -#define IA32_DCA_0_CAP_HW_BLOCK_MASK 0x01 -#define IA32_DCA_0_CAP_HW_BLOCK(_) (((_) >> 26) & 0x01) - uint64_t reserved4 : 37; - }; - - uint64_t flags; -} ia32_dca_0_cap_register; - -/** - * @defgroup ia32_mtrr_physbase \ - * IA32_MTRR_PHYSBASE(n) - * - * IA32_MTRR_PHYSBASE(0-9). - * - * @remarks If CPUID.01H: EDX.MTRR[12] = 1 - * @see Vol3A[11.11.2.3(Variable Range MTRRs)] - * @{ - */ -typedef union -{ - struct - { - /** - * [Bits 7:0] Specifies the memory type for the range. - */ - uint64_t type : 8; -#define IA32_MTRR_PHYSBASE_TYPE_BIT 0 -#define IA32_MTRR_PHYSBASE_TYPE_FLAG 0xFF -#define IA32_MTRR_PHYSBASE_TYPE_MASK 0xFF -#define IA32_MTRR_PHYSBASE_TYPE(_) (((_) >> 0) & 0xFF) - uint64_t reserved1 : 4; - - /** - * [Bits 47:12] Specifies the base address of the address range. This 24-bit value, in the case where MAXPHYADDR is 36 - * bits, is extended by 12 bits at the low end to form the base address (this automatically aligns the address on a 4-KByte - * boundary). - */ - uint64_t page_frame_number : 36; -#define IA32_MTRR_PHYSBASE_PAGE_FRAME_NUMBER_BIT 12 -#define IA32_MTRR_PHYSBASE_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define IA32_MTRR_PHYSBASE_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define IA32_MTRR_PHYSBASE_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 16; - }; - - uint64_t flags; -} ia32_mtrr_physbase_register; - -#define IA32_MTRR_PHYSBASE0 0x00000200 -#define IA32_MTRR_PHYSBASE1 0x00000202 -#define IA32_MTRR_PHYSBASE2 0x00000204 -#define IA32_MTRR_PHYSBASE3 0x00000206 -#define IA32_MTRR_PHYSBASE4 0x00000208 -#define IA32_MTRR_PHYSBASE5 0x0000020A -#define IA32_MTRR_PHYSBASE6 0x0000020C -#define IA32_MTRR_PHYSBASE7 0x0000020E -#define IA32_MTRR_PHYSBASE8 0x00000210 -#define IA32_MTRR_PHYSBASE9 0x00000212 -/** - * @} - */ - - /** - * @defgroup ia32_mtrr_physmask \ - * IA32_MTRR_PHYSMASK(n) - * - * IA32_MTRR_PHYSMASK(0-9). - * - * @remarks If CPUID.01H: EDX.MTRR[12] = 1 - * @see Vol3A[11.11.2.3(Variable Range MTRRs)] - * @{ - */ -typedef union -{ - struct - { - /** - * [Bits 7:0] Specifies the memory type for the range. - */ - uint64_t type : 8; -#define IA32_MTRR_PHYSMASK_TYPE_BIT 0 -#define IA32_MTRR_PHYSMASK_TYPE_FLAG 0xFF -#define IA32_MTRR_PHYSMASK_TYPE_MASK 0xFF -#define IA32_MTRR_PHYSMASK_TYPE(_) (((_) >> 0) & 0xFF) - uint64_t reserved1 : 3; - - /** - * [Bit 11] Enables the register pair when set; disables register pair when clear. - */ - uint64_t valid : 1; -#define IA32_MTRR_PHYSMASK_VALID_BIT 11 -#define IA32_MTRR_PHYSMASK_VALID_FLAG 0x800 -#define IA32_MTRR_PHYSMASK_VALID_MASK 0x01 -#define IA32_MTRR_PHYSMASK_VALID(_) (((_) >> 11) & 0x01) - - /** - * [Bits 47:12] Specifies a mask (24 bits if the maximum physical address size is 36 bits, 28 bits if the maximum physical - * address size is 40 bits). The mask determines the range of the region being mapped, according to the following - * relationships: - * - Address_Within_Range AND PhysMask = PhysBase AND PhysMask - * - This value is extended by 12 bits at the low end to form the mask value. - * - The width of the PhysMask field depends on the maximum physical address size supported by the processor. - * CPUID.80000008H reports the maximum physical address size supported by the processor. If CPUID.80000008H is not - * available, software may assume that the processor supports a 36-bit physical address size. - * - * @see Vol3A[11.11.3(Example Base and Mask Calculations)] - */ - uint64_t page_frame_number : 36; -#define IA32_MTRR_PHYSMASK_PAGE_FRAME_NUMBER_BIT 12 -#define IA32_MTRR_PHYSMASK_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define IA32_MTRR_PHYSMASK_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define IA32_MTRR_PHYSMASK_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 16; - }; - - uint64_t flags; -} ia32_mtrr_physmask_register; - -#define IA32_MTRR_PHYSMASK0 0x00000201 -#define IA32_MTRR_PHYSMASK1 0x00000203 -#define IA32_MTRR_PHYSMASK2 0x00000205 -#define IA32_MTRR_PHYSMASK3 0x00000207 -#define IA32_MTRR_PHYSMASK4 0x00000209 -#define IA32_MTRR_PHYSMASK5 0x0000020B -#define IA32_MTRR_PHYSMASK6 0x0000020D -#define IA32_MTRR_PHYSMASK7 0x0000020F -#define IA32_MTRR_PHYSMASK8 0x00000211 -#define IA32_MTRR_PHYSMASK9 0x00000213 -/** - * @} - */ - - /** - * @defgroup ia32_mtrr_fix \ - * IA32_MTRR_FIX(x) - * - * IA32_MTRR_FIX(x). - * - * @remarks If CPUID.01H: EDX.MTRR[12] = 1 - * @see Vol3A[11.11.2.2(Fixed Range MTRRs)] - * @{ - */ - /** - * @defgroup ia32_mtrr_fix64k \ - * IA32_MTRR_FIX64K(x) - * - * IA32_MTRR_FIX64K(x). - * @{ - */ -#define IA32_MTRR_FIX64K_BASE 0x00000000 -#define IA32_MTRR_FIX64K_SIZE 0x00010000 -#define IA32_MTRR_FIX64K_00000 0x00000250 - /** - * @} - */ - - /** - * @defgroup ia32_mtrr_fix16k \ - * IA32_MTRR_FIX16K(x) - * - * IA32_MTRR_FIX16K(x). - * @{ - */ -#define IA32_MTRR_FIX16K_BASE 0x00080000 -#define IA32_MTRR_FIX16K_SIZE 0x00004000 -#define IA32_MTRR_FIX16K_80000 0x00000258 -#define IA32_MTRR_FIX16K_A0000 0x00000259 - /** - * @} - */ - - /** - * @defgroup ia32_mtrr_fix4k \ - * IA32_MTRR_FIX4K(x) - * - * IA32_MTRR_FIX4K(x). - * @{ - */ -#define IA32_MTRR_FIX4K_BASE 0x000C0000 -#define IA32_MTRR_FIX4K_SIZE 0x00001000 -#define IA32_MTRR_FIX4K_C0000 0x00000268 -#define IA32_MTRR_FIX4K_C8000 0x00000269 -#define IA32_MTRR_FIX4K_D0000 0x0000026A -#define IA32_MTRR_FIX4K_D8000 0x0000026B -#define IA32_MTRR_FIX4K_E0000 0x0000026C -#define IA32_MTRR_FIX4K_E8000 0x0000026D -#define IA32_MTRR_FIX4K_F0000 0x0000026E -#define IA32_MTRR_FIX4K_F8000 0x0000026F - /** - * @} - */ - - /** - * Architecture defined number of fixed range MTRRs (1 for 64k, 2 for 16k, 8 for 4k). - */ -#define IA32_MTRR_FIX_COUNT ((1 + 2 + 8) * 8) - - /** - * Architecture defined number of variable range MTRRs. - */ -#define IA32_MTRR_VARIABLE_COUNT 0x000000FF - - /** - * A size of array to store all possible MTRRs. - */ -#define IA32_MTRR_COUNT (IA32_MTRR_FIX_COUNT + IA32_MTRR_VARIABLE_COUNT) - /** - * @} - */ - - - /** - * IA32_PAT. - * - * @remarks If CPUID.01H: EDX.MTRR[16] = 1 - */ -#define IA32_PAT 0x00000277 -typedef union -{ - struct - { - /** - * [Bits 2:0] PA0. - */ - uint64_t pa0 : 3; -#define IA32_PAT_PA0_BIT 0 -#define IA32_PAT_PA0_FLAG 0x07 -#define IA32_PAT_PA0_MASK 0x07 -#define IA32_PAT_PA0(_) (((_) >> 0) & 0x07) - uint64_t reserved1 : 5; - - /** - * [Bits 10:8] PA1. - */ - uint64_t pa1 : 3; -#define IA32_PAT_PA1_BIT 8 -#define IA32_PAT_PA1_FLAG 0x700 -#define IA32_PAT_PA1_MASK 0x07 -#define IA32_PAT_PA1(_) (((_) >> 8) & 0x07) - uint64_t reserved2 : 5; - - /** - * [Bits 18:16] PA2. - */ - uint64_t pa2 : 3; -#define IA32_PAT_PA2_BIT 16 -#define IA32_PAT_PA2_FLAG 0x70000 -#define IA32_PAT_PA2_MASK 0x07 -#define IA32_PAT_PA2(_) (((_) >> 16) & 0x07) - uint64_t reserved3 : 5; - - /** - * [Bits 26:24] PA3. - */ - uint64_t pa3 : 3; -#define IA32_PAT_PA3_BIT 24 -#define IA32_PAT_PA3_FLAG 0x7000000 -#define IA32_PAT_PA3_MASK 0x07 -#define IA32_PAT_PA3(_) (((_) >> 24) & 0x07) - uint64_t reserved4 : 5; - - /** - * [Bits 34:32] PA4. - */ - uint64_t pa4 : 3; -#define IA32_PAT_PA4_BIT 32 -#define IA32_PAT_PA4_FLAG 0x700000000 -#define IA32_PAT_PA4_MASK 0x07 -#define IA32_PAT_PA4(_) (((_) >> 32) & 0x07) - uint64_t reserved5 : 5; - - /** - * [Bits 42:40] PA5. - */ - uint64_t pa5 : 3; -#define IA32_PAT_PA5_BIT 40 -#define IA32_PAT_PA5_FLAG 0x70000000000 -#define IA32_PAT_PA5_MASK 0x07 -#define IA32_PAT_PA5(_) (((_) >> 40) & 0x07) - uint64_t reserved6 : 5; - - /** - * [Bits 50:48] PA6. - */ - uint64_t pa6 : 3; -#define IA32_PAT_PA6_BIT 48 -#define IA32_PAT_PA6_FLAG 0x7000000000000 -#define IA32_PAT_PA6_MASK 0x07 -#define IA32_PAT_PA6(_) (((_) >> 48) & 0x07) - uint64_t reserved7 : 5; - - /** - * [Bits 58:56] PA7. - */ - uint64_t pa7 : 3; -#define IA32_PAT_PA7_BIT 56 -#define IA32_PAT_PA7_FLAG 0x700000000000000 -#define IA32_PAT_PA7_MASK 0x07 -#define IA32_PAT_PA7(_) (((_) >> 56) & 0x07) - uint64_t reserved8 : 5; - }; - - uint64_t flags; -} ia32_pat_register; - -/** - * @defgroup ia32_mc_ctl2 \ - * IA32_MC(i)_CTL2 - * - * MSR to enable/disable CMCI capability for bank n. - * - * @remarks If IA32_MCG_CAP[10] = 1 && IA32_MCG_CAP[7:0] > n - * @see Vol3B[15.3.2.5(IA32_MCi_CTL2 MSRs)] - * @{ - */ -#define IA32_MC0_CTL2 0x00000280 -#define IA32_MC1_CTL2 0x00000281 -#define IA32_MC2_CTL2 0x00000282 -#define IA32_MC3_CTL2 0x00000283 -#define IA32_MC4_CTL2 0x00000284 -#define IA32_MC5_CTL2 0x00000285 -#define IA32_MC6_CTL2 0x00000286 -#define IA32_MC7_CTL2 0x00000287 -#define IA32_MC8_CTL2 0x00000288 -#define IA32_MC9_CTL2 0x00000289 -#define IA32_MC10_CTL2 0x0000028A -#define IA32_MC11_CTL2 0x0000028B -#define IA32_MC12_CTL2 0x0000028C -#define IA32_MC13_CTL2 0x0000028D -#define IA32_MC14_CTL2 0x0000028E -#define IA32_MC15_CTL2 0x0000028F -#define IA32_MC16_CTL2 0x00000290 -#define IA32_MC17_CTL2 0x00000291 -#define IA32_MC18_CTL2 0x00000292 -#define IA32_MC19_CTL2 0x00000293 -#define IA32_MC20_CTL2 0x00000294 -#define IA32_MC21_CTL2 0x00000295 -#define IA32_MC22_CTL2 0x00000296 -#define IA32_MC23_CTL2 0x00000297 -#define IA32_MC24_CTL2 0x00000298 -#define IA32_MC25_CTL2 0x00000299 -#define IA32_MC26_CTL2 0x0000029A -#define IA32_MC27_CTL2 0x0000029B -#define IA32_MC28_CTL2 0x0000029C -#define IA32_MC29_CTL2 0x0000029D -#define IA32_MC30_CTL2 0x0000029E -#define IA32_MC31_CTL2 0x0000029F -typedef union -{ - struct - { - /** - * [Bits 14:0] Corrected error count threshold. - */ - uint64_t corrected_error_count_threshold : 15; -#define IA32_MC_CTL2_CORRECTED_ERROR_COUNT_THRESHOLD_BIT 0 -#define IA32_MC_CTL2_CORRECTED_ERROR_COUNT_THRESHOLD_FLAG 0x7FFF -#define IA32_MC_CTL2_CORRECTED_ERROR_COUNT_THRESHOLD_MASK 0x7FFF -#define IA32_MC_CTL2_CORRECTED_ERROR_COUNT_THRESHOLD(_) (((_) >> 0) & 0x7FFF) - uint64_t reserved1 : 15; - - /** - * [Bit 30] CMCI_EN. - */ - uint64_t cmci_en : 1; -#define IA32_MC_CTL2_CMCI_EN_BIT 30 -#define IA32_MC_CTL2_CMCI_EN_FLAG 0x40000000 -#define IA32_MC_CTL2_CMCI_EN_MASK 0x01 -#define IA32_MC_CTL2_CMCI_EN(_) (((_) >> 30) & 0x01) - uint64_t reserved2 : 33; - }; - - uint64_t flags; -} ia32_mc_ctl2_register; - -/** - * @} - */ - - - /** - * IA32_MTRR_DEF_TYPE. - * - * @remarks If CPUID.01H: EDX.MTRR[12] = 1 - */ -#define IA32_MTRR_DEF_TYPE 0x000002FF -typedef union -{ - struct - { - /** - * [Bits 2:0] Default Memory Type. - */ - uint64_t default_memory_type : 3; -#define IA32_MTRR_DEF_TYPE_DEFAULT_MEMORY_TYPE_BIT 0 -#define IA32_MTRR_DEF_TYPE_DEFAULT_MEMORY_TYPE_FLAG 0x07 -#define IA32_MTRR_DEF_TYPE_DEFAULT_MEMORY_TYPE_MASK 0x07 -#define IA32_MTRR_DEF_TYPE_DEFAULT_MEMORY_TYPE(_) (((_) >> 0) & 0x07) - uint64_t reserved1 : 7; - - /** - * [Bit 10] Fixed Range MTRR Enable. - */ - uint64_t fixed_range_mtrr_enable : 1; -#define IA32_MTRR_DEF_TYPE_FIXED_RANGE_MTRR_ENABLE_BIT 10 -#define IA32_MTRR_DEF_TYPE_FIXED_RANGE_MTRR_ENABLE_FLAG 0x400 -#define IA32_MTRR_DEF_TYPE_FIXED_RANGE_MTRR_ENABLE_MASK 0x01 -#define IA32_MTRR_DEF_TYPE_FIXED_RANGE_MTRR_ENABLE(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] MTRR Enable. - */ - uint64_t mtrr_enable : 1; -#define IA32_MTRR_DEF_TYPE_MTRR_ENABLE_BIT 11 -#define IA32_MTRR_DEF_TYPE_MTRR_ENABLE_FLAG 0x800 -#define IA32_MTRR_DEF_TYPE_MTRR_ENABLE_MASK 0x01 -#define IA32_MTRR_DEF_TYPE_MTRR_ENABLE(_) (((_) >> 11) & 0x01) - uint64_t reserved2 : 52; - }; - - uint64_t flags; -} ia32_mtrr_def_type_register; - -/** - * @defgroup ia32_fixed_ctr \ - * IA32_FIXED_CTR(n) - * - * Fixed-Function Performance Counter n. - * - * @remarks If CPUID.0AH: EDX[4:0] > n - * @{ - */ - /** - * Counts Instr_Retired.Any. - */ -#define IA32_FIXED_CTR0 0x00000309 - - /** - * Counts CPU_CLK_Unhalted.Core - */ -#define IA32_FIXED_CTR1 0x0000030A - - /** - * Counts CPU_CLK_Unhalted.Ref - */ -#define IA32_FIXED_CTR2 0x0000030B - /** - * @} - */ - - - /** - * Read Only MSR that enumerates the existence of performance monitoring features. - * - * @remarks If CPUID.01H: ECX[15] = 1 - */ -#define IA32_PERF_CAPABILITIES 0x00000345 -typedef union -{ - struct - { - /** - * [Bits 5:0] LBR format. - */ - uint64_t lbr_format : 6; -#define IA32_PERF_CAPABILITIES_LBR_FORMAT_BIT 0 -#define IA32_PERF_CAPABILITIES_LBR_FORMAT_FLAG 0x3F -#define IA32_PERF_CAPABILITIES_LBR_FORMAT_MASK 0x3F -#define IA32_PERF_CAPABILITIES_LBR_FORMAT(_) (((_) >> 0) & 0x3F) - - /** - * [Bit 6] PEBS Trap. - */ - uint64_t pebs_trap : 1; -#define IA32_PERF_CAPABILITIES_PEBS_TRAP_BIT 6 -#define IA32_PERF_CAPABILITIES_PEBS_TRAP_FLAG 0x40 -#define IA32_PERF_CAPABILITIES_PEBS_TRAP_MASK 0x01 -#define IA32_PERF_CAPABILITIES_PEBS_TRAP(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] PEBSSaveArchRegs. - */ - uint64_t pebs_save_arch_regs : 1; -#define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_BIT 7 -#define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_FLAG 0x80 -#define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS_MASK 0x01 -#define IA32_PERF_CAPABILITIES_PEBS_SAVE_ARCH_REGS(_) (((_) >> 7) & 0x01) - - /** - * [Bits 11:8] PEBS Record Format. - */ - uint64_t pebs_record_format : 4; -#define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_BIT 8 -#define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_FLAG 0xF00 -#define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT_MASK 0x0F -#define IA32_PERF_CAPABILITIES_PEBS_RECORD_FORMAT(_) (((_) >> 8) & 0x0F) - - /** - * [Bit 12] Freeze while SMM is supported. - */ - uint64_t freeze_while_smm_is_supported : 1; -#define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_IS_SUPPORTED_BIT 12 -#define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_IS_SUPPORTED_FLAG 0x1000 -#define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_IS_SUPPORTED_MASK 0x01 -#define IA32_PERF_CAPABILITIES_FREEZE_WHILE_SMM_IS_SUPPORTED(_) (((_) >> 12) & 0x01) - - /** - * [Bit 13] Full width of counter writable via IA32_A_PMCx. - */ - uint64_t full_width_counter_write : 1; -#define IA32_PERF_CAPABILITIES_FULL_WIDTH_COUNTER_WRITE_BIT 13 -#define IA32_PERF_CAPABILITIES_FULL_WIDTH_COUNTER_WRITE_FLAG 0x2000 -#define IA32_PERF_CAPABILITIES_FULL_WIDTH_COUNTER_WRITE_MASK 0x01 -#define IA32_PERF_CAPABILITIES_FULL_WIDTH_COUNTER_WRITE(_) (((_) >> 13) & 0x01) - uint64_t reserved1 : 50; - }; - - uint64_t flags; -} ia32_perf_capabilities_register; - - -/** - * @brief Fixed-Function Performance Counter Control (R/W) - * - * Fixed-Function Performance Counter Control. 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. - * - * @remarks If CPUID.0AH: EAX[7:0] > 1 - */ -#define IA32_FIXED_CTR_CTRL 0x0000038D -typedef union -{ - struct - { - /** - * [Bit 0] EN0_OS: Enable Fixed Counter 0 to count while CPL = 0. - */ - uint64_t en0_os : 1; -#define IA32_FIXED_CTR_CTRL_EN0_OS_BIT 0 -#define IA32_FIXED_CTR_CTRL_EN0_OS_FLAG 0x01 -#define IA32_FIXED_CTR_CTRL_EN0_OS_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN0_OS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] EN0_Usr: Enable Fixed Counter 0 to count while CPL > 0. - */ - uint64_t en0_usr : 1; -#define IA32_FIXED_CTR_CTRL_EN0_USR_BIT 1 -#define IA32_FIXED_CTR_CTRL_EN0_USR_FLAG 0x02 -#define IA32_FIXED_CTR_CTRL_EN0_USR_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN0_USR(_) (((_) >> 1) & 0x01) - - /** - * [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. - */ - uint64_t any_thread0 : 1; -#define IA32_FIXED_CTR_CTRL_ANY_THREAD0_BIT 2 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD0_FLAG 0x04 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD0_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD0(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] EN0_PMI: Enable PMI when fixed counter 0 overflows. - */ - uint64_t en0_pmi : 1; -#define IA32_FIXED_CTR_CTRL_EN0_PMI_BIT 3 -#define IA32_FIXED_CTR_CTRL_EN0_PMI_FLAG 0x08 -#define IA32_FIXED_CTR_CTRL_EN0_PMI_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN0_PMI(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] EN1_OS: Enable Fixed Counter 1 to count while CPL = 0. - */ - uint64_t en1_os : 1; -#define IA32_FIXED_CTR_CTRL_EN1_OS_BIT 4 -#define IA32_FIXED_CTR_CTRL_EN1_OS_FLAG 0x10 -#define IA32_FIXED_CTR_CTRL_EN1_OS_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN1_OS(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] EN1_Usr: Enable Fixed Counter 1 to count while CPL > 0. - */ - uint64_t en1_usr : 1; -#define IA32_FIXED_CTR_CTRL_EN1_USR_BIT 5 -#define IA32_FIXED_CTR_CTRL_EN1_USR_FLAG 0x20 -#define IA32_FIXED_CTR_CTRL_EN1_USR_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN1_USR(_) (((_) >> 5) & 0x01) - - /** - * [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. - * - * @remarks If CPUID.0AH: EAX[7:0] > 2 - */ - uint64_t any_thread1 : 1; -#define IA32_FIXED_CTR_CTRL_ANY_THREAD1_BIT 6 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD1_FLAG 0x40 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD1_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD1(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] EN1_PMI: Enable PMI when fixed counter 1 overflows. - */ - uint64_t en1_pmi : 1; -#define IA32_FIXED_CTR_CTRL_EN1_PMI_BIT 7 -#define IA32_FIXED_CTR_CTRL_EN1_PMI_FLAG 0x80 -#define IA32_FIXED_CTR_CTRL_EN1_PMI_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN1_PMI(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] EN2_OS: Enable Fixed Counter 2 to count while CPL = 0. - */ - uint64_t en2_os : 1; -#define IA32_FIXED_CTR_CTRL_EN2_OS_BIT 8 -#define IA32_FIXED_CTR_CTRL_EN2_OS_FLAG 0x100 -#define IA32_FIXED_CTR_CTRL_EN2_OS_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN2_OS(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] EN2_Usr: Enable Fixed Counter 2 to count while CPL > 0. - */ - uint64_t en2_usr : 1; -#define IA32_FIXED_CTR_CTRL_EN2_USR_BIT 9 -#define IA32_FIXED_CTR_CTRL_EN2_USR_FLAG 0x200 -#define IA32_FIXED_CTR_CTRL_EN2_USR_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN2_USR(_) (((_) >> 9) & 0x01) - - /** - * [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. - * - * @remarks If CPUID.0AH: EAX[7:0] > 2 - */ - uint64_t any_thread2 : 1; -#define IA32_FIXED_CTR_CTRL_ANY_THREAD2_BIT 10 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD2_FLAG 0x400 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD2_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_ANY_THREAD2(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] EN2_PMI: Enable PMI when fixed counter 2 overflows. - */ - uint64_t en2_pmi : 1; -#define IA32_FIXED_CTR_CTRL_EN2_PMI_BIT 11 -#define IA32_FIXED_CTR_CTRL_EN2_PMI_FLAG 0x800 -#define IA32_FIXED_CTR_CTRL_EN2_PMI_MASK 0x01 -#define IA32_FIXED_CTR_CTRL_EN2_PMI(_) (((_) >> 11) & 0x01) - uint64_t reserved1 : 52; - }; - - uint64_t flags; -} ia32_fixed_ctr_ctrl_register; - - -/** - * Global Performance Counter Status. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ -#define IA32_PERF_GLOBAL_STATUS 0x0000038E -typedef union -{ - struct - { - /** - * [Bit 0] Ovf_PMC0: Overflow status of IA32_PMC0. - * - * @remarks If CPUID.0AH: EAX[15:8] > 0 - */ - uint64_t ovf_pmc0 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC0_BIT 0 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC0_FLAG 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC0_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC0(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Ovf_PMC1: Overflow status of IA32_PMC1. - * - * @remarks If CPUID.0AH: EAX[15:8] > 1 - */ - uint64_t ovf_pmc1 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC1_BIT 1 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC1_FLAG 0x02 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC1_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC1(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Ovf_PMC2: Overflow status of IA32_PMC2. - * - * @remarks If CPUID.0AH: EAX[15:8] > 2 - */ - uint64_t ovf_pmc2 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC2_BIT 2 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC2_FLAG 0x04 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC2_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC2(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Ovf_PMC3: Overflow status of IA32_PMC3. - * - * @remarks If CPUID.0AH: EAX[15:8] > 3 - */ - uint64_t ovf_pmc3 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC3_BIT 3 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC3_FLAG 0x08 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC3_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_PMC3(_) (((_) >> 3) & 0x01) - uint64_t reserved1 : 28; - - /** - * [Bit 32] Ovf_FixedCtr0: Overflow status of IA32_FIXED_CTR0. - * - * @remarks If CPUID.0AH: EAX[7:0] > 1 - */ - uint64_t ovf_fixedctr0 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR0_BIT 32 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR0_FLAG 0x100000000 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR0_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR0(_) (((_) >> 32) & 0x01) - - /** - * [Bit 33] Ovf_FixedCtr1: Overflow status of IA32_FIXED_CTR1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 1 - */ - uint64_t ovf_fixedctr1 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR1_BIT 33 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR1_FLAG 0x200000000 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR1_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR1(_) (((_) >> 33) & 0x01) - - /** - * [Bit 34] Ovf_FixedCtr2: Overflow status of IA32_FIXED_CTR2. - * - * @remarks If CPUID.0AH: EAX[7:0] > 1 - */ - uint64_t ovf_fixedctr2 : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR2_BIT 34 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR2_FLAG 0x400000000 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR2_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_FIXEDCTR2(_) (((_) >> 34) & 0x01) - uint64_t reserved2 : 20; - - /** - * [Bit 55] Trace_ToPA_PMI: A PMI occurred due to a ToPA entry memory buffer that was completely filled. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA = 1 - */ - uint64_t trace_topa_pmi : 1; -#define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_BIT 55 -#define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_FLAG 0x80000000000000 -#define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_TRACE_TOPA_PMI(_) (((_) >> 55) & 0x01) - uint64_t reserved3 : 2; - - /** - * [Bit 58] LBR_Frz. LBRs are frozen due to: - * * IA32_DEBUGCTL.FREEZE_LBR_ON_PMI=1. - * * The LBR stack overflowed. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t lbr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_BIT 58 -#define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_FLAG 0x400000000000000 -#define IA32_PERF_GLOBAL_STATUS_LBR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_LBR_FRZ(_) (((_) >> 58) & 0x01) - - /** - * [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. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t ctr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_BIT 59 -#define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_FLAG 0x800000000000000 -#define IA32_PERF_GLOBAL_STATUS_CTR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_CTR_FRZ(_) (((_) >> 59) & 0x01) - - /** - * [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. - * - * @remarks If CPUID.(EAX=07H, ECX=0):EBX[2] = 1 - */ - uint64_t asci : 1; -#define IA32_PERF_GLOBAL_STATUS_ASCI_BIT 60 -#define IA32_PERF_GLOBAL_STATUS_ASCI_FLAG 0x1000000000000000 -#define IA32_PERF_GLOBAL_STATUS_ASCI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_ASCI(_) (((_) >> 60) & 0x01) - - /** - * [Bit 61] Uncore counter overflow status. - * - * @remarks If CPUID.0AH: EAX[7:0] > 2 - */ - uint64_t ovf_uncore : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_UNCORE_BIT 61 -#define IA32_PERF_GLOBAL_STATUS_OVF_UNCORE_FLAG 0x2000000000000000 -#define IA32_PERF_GLOBAL_STATUS_OVF_UNCORE_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_UNCORE(_) (((_) >> 61) & 0x01) - - /** - * [Bit 62] OvfBuf: DS SAVE area Buffer overflow status. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ - uint64_t ovf_buf : 1; -#define IA32_PERF_GLOBAL_STATUS_OVF_BUF_BIT 62 -#define IA32_PERF_GLOBAL_STATUS_OVF_BUF_FLAG 0x4000000000000000 -#define IA32_PERF_GLOBAL_STATUS_OVF_BUF_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_OVF_BUF(_) (((_) >> 62) & 0x01) - - /** - * [Bit 63] CondChgd: Status bits of this register have changed. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ - uint64_t cond_chgd : 1; -#define IA32_PERF_GLOBAL_STATUS_COND_CHGD_BIT 63 -#define IA32_PERF_GLOBAL_STATUS_COND_CHGD_FLAG 0x8000000000000000 -#define IA32_PERF_GLOBAL_STATUS_COND_CHGD_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_COND_CHGD(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} ia32_perf_global_status_register; - - -/** - * @brief Global Performance Counter Control (R/W) - * - * Global Performance Counter Control. Counter increments while the result of ANDing the respective enable bit in this MSR - * with the corresponding OS or USR bits in the general-purpose or fixed counter control MSR is true. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ -#define IA32_PERF_GLOBAL_CTRL 0x0000038F -typedef struct -{ - /** - * EN_PMC(n). Enable bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - */ - uint32_t en_pmcn; - - /** - * EN_FIXED_CTR(n). Enable bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - * - * @remarks If CPUID.0AH: EDX[4:0] > n - */ - uint32_t en_fixed_ctrn; -} ia32_perf_global_ctrl_register; - - -/** - * Global Performance Counter Overflow Reset Control. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ -#define IA32_PERF_GLOBAL_STATUS_RESET 0x00000390 -typedef union -{ - struct - { - /** - * [Bits 31:0] Set 1 to clear Ovf_PMC(n) bit. Clear bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - */ - uint64_t clear_ovf_pmcn : 32; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_PMCN_BIT 0 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_PMCN_FLAG 0xFFFFFFFF -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_PMCN_MASK 0xFFFFFFFF -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_PMCN(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * [Bits 34:32] Set 1 to clear Ovf_FIXED_CTR(n) bit. Clear bitmask. Only the first n-1 bits are valid. Bits 31:n are - * reserved. - * - * @remarks If CPUID.0AH: EDX[4:0] > n - */ - uint64_t clear_ovf_fixed_ctrn : 3; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_FIXED_CTRN_BIT 32 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_FIXED_CTRN_FLAG 0x700000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_FIXED_CTRN_MASK 0x07 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_FIXED_CTRN(_) (((_) >> 32) & 0x07) - uint64_t reserved1 : 20; - - /** - * [Bit 55] Set 1 to clear Trace_ToPA_PMI bit. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1) && IA32_RTIT_CTL.ToPA = 1 - */ - uint64_t clear_trace_topa_pmi : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_TRACE_TOPA_PMI_BIT 55 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_TRACE_TOPA_PMI_FLAG 0x80000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_TRACE_TOPA_PMI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_TRACE_TOPA_PMI(_) (((_) >> 55) & 0x01) - uint64_t reserved2 : 2; - - /** - * [Bit 58] Set 1 to clear LBR_Frz bit. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t clear_lbr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_LBR_FRZ_BIT 58 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_LBR_FRZ_FLAG 0x400000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_LBR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_LBR_FRZ(_) (((_) >> 58) & 0x01) - - /** - * [Bit 59] Set 1 to clear CTR_Frz bit. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t clear_ctr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_CTR_FRZ_BIT 59 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_CTR_FRZ_FLAG 0x800000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_CTR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_CTR_FRZ(_) (((_) >> 59) & 0x01) - - /** - * [Bit 60] Set 1 to clear ASCI bit. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t clear_asci : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_ASCI_BIT 60 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_ASCI_FLAG 0x1000000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_ASCI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_ASCI(_) (((_) >> 60) & 0x01) - - /** - * [Bit 61] Set 1 to clear Ovf_Uncore bit. - * - * @remarks 06_2EH - */ - uint64_t clear_ovf_uncore : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_UNCORE_BIT 61 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_UNCORE_FLAG 0x2000000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_UNCORE_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_UNCORE(_) (((_) >> 61) & 0x01) - - /** - * [Bit 62] Set 1 to clear OvfBuf bit. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ - uint64_t clear_ovf_buf : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_BUF_BIT 62 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_BUF_FLAG 0x4000000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_BUF_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_OVF_BUF(_) (((_) >> 62) & 0x01) - - /** - * [Bit 63] Set 1 to clear CondChgd bit. - * - * @remarks If CPUID.0AH: EAX[7:0] > 0 - */ - uint64_t clear_cond_chgd : 1; -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_COND_CHGD_BIT 63 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_COND_CHGD_FLAG 0x8000000000000000 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_COND_CHGD_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_RESET_CLEAR_COND_CHGD(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} ia32_perf_global_status_reset_register; - - -/** - * Global Performance Counter Overflow Set Control. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ -#define IA32_PERF_GLOBAL_STATUS_SET 0x00000391 -typedef union -{ - struct - { - /** - * [Bits 31:0] Set 1 to cause Ovf_PMC(n) = 1. Set bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - */ - uint64_t ovf_pmcn : 32; -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_PMCN_BIT 0 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_PMCN_FLAG 0xFFFFFFFF -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_PMCN_MASK 0xFFFFFFFF -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_PMCN(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * [Bits 34:32] Set 1 to cause Ovf_FIXED_CTR(n) = 1. Set bitmask. Only the first n-1 bits are valid. Bits 31:n are - * reserved. - * - * @remarks If CPUID.0AH: EDX[4:0] > n - */ - uint64_t ovf_fixed_ctrn : 3; -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_FIXED_CTRN_BIT 32 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_FIXED_CTRN_FLAG 0x700000000 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_FIXED_CTRN_MASK 0x07 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_FIXED_CTRN(_) (((_) >> 32) & 0x07) - uint64_t reserved1 : 20; - - /** - * [Bit 55] Set 1 to cause Trace_ToPA_PMI = 1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t trace_topa_pmi : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_TRACE_TOPA_PMI_BIT 55 -#define IA32_PERF_GLOBAL_STATUS_SET_TRACE_TOPA_PMI_FLAG 0x80000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_TRACE_TOPA_PMI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_TRACE_TOPA_PMI(_) (((_) >> 55) & 0x01) - uint64_t reserved2 : 2; - - /** - * [Bit 58] Set 1 to cause LBR_Frz = 1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t lbr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_LBR_FRZ_BIT 58 -#define IA32_PERF_GLOBAL_STATUS_SET_LBR_FRZ_FLAG 0x400000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_LBR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_LBR_FRZ(_) (((_) >> 58) & 0x01) - - /** - * [Bit 59] Set 1 to cause CTR_Frz = 1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t ctr_frz : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_CTR_FRZ_BIT 59 -#define IA32_PERF_GLOBAL_STATUS_SET_CTR_FRZ_FLAG 0x800000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_CTR_FRZ_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_CTR_FRZ(_) (((_) >> 59) & 0x01) - - /** - * [Bit 60] Set 1 to cause ASCI = 1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t asci : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_ASCI_BIT 60 -#define IA32_PERF_GLOBAL_STATUS_SET_ASCI_FLAG 0x1000000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_ASCI_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_ASCI(_) (((_) >> 60) & 0x01) - - /** - * [Bit 61] Set 1 to cause Ovf_Uncore = 1. - * - * @remarks 06_2EH - */ - uint64_t ovf_uncore : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_UNCORE_BIT 61 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_UNCORE_FLAG 0x2000000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_UNCORE_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_UNCORE(_) (((_) >> 61) & 0x01) - - /** - * [Bit 62] Set 1 to cause OvfBuf = 1. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ - uint64_t ovf_buf : 1; -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_BUF_BIT 62 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_BUF_FLAG 0x4000000000000000 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_BUF_MASK 0x01 -#define IA32_PERF_GLOBAL_STATUS_SET_OVF_BUF(_) (((_) >> 62) & 0x01) - uint64_t reserved3 : 1; - }; - - uint64_t flags; -} ia32_perf_global_status_set_register; - - -/** - * Indicator that core perfmon interface is in use. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ -#define IA32_PERF_GLOBAL_INUSE 0x00000392 -typedef union -{ - struct - { - /** - * [Bits 31:0] IA32_PERFEVTSEL(n) in use. Status bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - * - * @remarks If CPUID.0AH: EAX[15:8] > n - */ - uint64_t ia32_perfevtseln_in_use : 32; -#define IA32_PERF_GLOBAL_INUSE_IA32_PERFEVTSELN_IN_USE_BIT 0 -#define IA32_PERF_GLOBAL_INUSE_IA32_PERFEVTSELN_IN_USE_FLAG 0xFFFFFFFF -#define IA32_PERF_GLOBAL_INUSE_IA32_PERFEVTSELN_IN_USE_MASK 0xFFFFFFFF -#define IA32_PERF_GLOBAL_INUSE_IA32_PERFEVTSELN_IN_USE(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * [Bits 34:32] IA32_FIXED_CTR(n) in use. Status bitmask. Only the first n-1 bits are valid. Bits 31:n are reserved. - */ - uint64_t ia32_fixed_ctrn_in_use : 3; -#define IA32_PERF_GLOBAL_INUSE_IA32_FIXED_CTRN_IN_USE_BIT 32 -#define IA32_PERF_GLOBAL_INUSE_IA32_FIXED_CTRN_IN_USE_FLAG 0x700000000 -#define IA32_PERF_GLOBAL_INUSE_IA32_FIXED_CTRN_IN_USE_MASK 0x07 -#define IA32_PERF_GLOBAL_INUSE_IA32_FIXED_CTRN_IN_USE(_) (((_) >> 32) & 0x07) - uint64_t reserved1 : 28; - - /** - * [Bit 63] PMI in use. - */ - uint64_t pmi_in_use : 1; -#define IA32_PERF_GLOBAL_INUSE_PMI_IN_USE_BIT 63 -#define IA32_PERF_GLOBAL_INUSE_PMI_IN_USE_FLAG 0x8000000000000000 -#define IA32_PERF_GLOBAL_INUSE_PMI_IN_USE_MASK 0x01 -#define IA32_PERF_GLOBAL_INUSE_PMI_IN_USE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} ia32_perf_global_inuse_register; - - -/** - * PEBS Control. - * - * @remarks If CPUID.0AH: EAX[7:0] > 3 - */ -#define IA32_PEBS_ENABLE 0x000003F1 -typedef union -{ - struct - { - /** - * [Bit 0] Enable PEBS on IA32_PMC0. - * - * @remarks 06_0FH - */ - uint64_t enable_pebs : 1; -#define IA32_PEBS_ENABLE_ENABLE_PEBS_BIT 0 -#define IA32_PEBS_ENABLE_ENABLE_PEBS_FLAG 0x01 -#define IA32_PEBS_ENABLE_ENABLE_PEBS_MASK 0x01 -#define IA32_PEBS_ENABLE_ENABLE_PEBS(_) (((_) >> 0) & 0x01) - - /** - * [Bits 3:1] Reserved or model specific. - */ - uint64_t reservedormodelspecific1 : 3; -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC1_BIT 1 -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC1_FLAG 0x0E -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC1_MASK 0x07 -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC1(_) (((_) >> 1) & 0x07) - uint64_t reserved1 : 28; - - /** - * [Bits 35:32] Reserved or model specific. - */ - uint64_t reservedormodelspecific2 : 4; -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC2_BIT 32 -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC2_FLAG 0xF00000000 -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC2_MASK 0x0F -#define IA32_PEBS_ENABLE_RESERVEDORMODELSPECIFIC2(_) (((_) >> 32) & 0x0F) - uint64_t reserved2 : 28; - }; - - uint64_t flags; -} ia32_pebs_enable_register; - -/** - * @defgroup ia32_mc_ctl \ - * IA32_MC(i)_CTL - * - * IA32_MC(0-28)_CTL. - * - * @remarks If IA32_MCG_CAP.CNT > n - * @{ - */ -#define IA32_MC0_CTL 0x00000400 -#define IA32_MC1_CTL 0x00000404 -#define IA32_MC2_CTL 0x00000408 -#define IA32_MC3_CTL 0x0000040C -#define IA32_MC4_CTL 0x00000410 -#define IA32_MC5_CTL 0x00000414 -#define IA32_MC6_CTL 0x00000418 -#define IA32_MC7_CTL 0x0000041C -#define IA32_MC8_CTL 0x00000420 -#define IA32_MC9_CTL 0x00000424 -#define IA32_MC10_CTL 0x00000428 -#define IA32_MC11_CTL 0x0000042C -#define IA32_MC12_CTL 0x00000430 -#define IA32_MC13_CTL 0x00000434 -#define IA32_MC14_CTL 0x00000438 -#define IA32_MC15_CTL 0x0000043C -#define IA32_MC16_CTL 0x00000440 -#define IA32_MC17_CTL 0x00000444 -#define IA32_MC18_CTL 0x00000448 -#define IA32_MC19_CTL 0x0000044C -#define IA32_MC20_CTL 0x00000450 -#define IA32_MC21_CTL 0x00000454 -#define IA32_MC22_CTL 0x00000458 -#define IA32_MC23_CTL 0x0000045C -#define IA32_MC24_CTL 0x00000460 -#define IA32_MC25_CTL 0x00000464 -#define IA32_MC26_CTL 0x00000468 -#define IA32_MC27_CTL 0x0000046C -#define IA32_MC28_CTL 0x00000470 - /** - * @} - */ - - /** - * @defgroup ia32_mc_status \ - * IA32_MC(i)_STATUS - * - * IA32_MC(0-28)_STATUS. - * - * @remarks If IA32_MCG_CAP.CNT > n - * @{ - */ -#define IA32_MC0_STATUS 0x00000401 -#define IA32_MC1_STATUS 0x00000405 -#define IA32_MC2_STATUS 0x00000409 -#define IA32_MC3_STATUS 0x0000040D -#define IA32_MC4_STATUS 0x00000411 -#define IA32_MC5_STATUS 0x00000415 -#define IA32_MC6_STATUS 0x00000419 -#define IA32_MC7_STATUS 0x0000041D -#define IA32_MC8_STATUS 0x00000421 -#define IA32_MC9_STATUS 0x00000425 -#define IA32_MC10_STATUS 0x00000429 -#define IA32_MC11_STATUS 0x0000042D -#define IA32_MC12_STATUS 0x00000431 -#define IA32_MC13_STATUS 0x00000435 -#define IA32_MC14_STATUS 0x00000439 -#define IA32_MC15_STATUS 0x0000043D -#define IA32_MC16_STATUS 0x00000441 -#define IA32_MC17_STATUS 0x00000445 -#define IA32_MC18_STATUS 0x00000449 -#define IA32_MC19_STATUS 0x0000044D -#define IA32_MC20_STATUS 0x00000451 -#define IA32_MC21_STATUS 0x00000455 -#define IA32_MC22_STATUS 0x00000459 -#define IA32_MC23_STATUS 0x0000045D -#define IA32_MC24_STATUS 0x00000461 -#define IA32_MC25_STATUS 0x00000465 -#define IA32_MC26_STATUS 0x00000469 -#define IA32_MC27_STATUS 0x0000046D -#define IA32_MC28_STATUS 0x00000471 - /** - * @} - */ - - /** - * @defgroup ia32_mc_addr \ - * IA32_MC(i)_ADDR - * - * IA32_MC(0-28)_ADDR. - * - * @remarks If IA32_MCG_CAP.CNT > n - * @{ - */ -#define IA32_MC0_ADDR 0x00000402 -#define IA32_MC1_ADDR 0x00000406 -#define IA32_MC2_ADDR 0x0000040A -#define IA32_MC3_ADDR 0x0000040E -#define IA32_MC4_ADDR 0x00000412 -#define IA32_MC5_ADDR 0x00000416 -#define IA32_MC6_ADDR 0x0000041A -#define IA32_MC7_ADDR 0x0000041E -#define IA32_MC8_ADDR 0x00000422 -#define IA32_MC9_ADDR 0x00000426 -#define IA32_MC10_ADDR 0x0000042A -#define IA32_MC11_ADDR 0x0000042E -#define IA32_MC12_ADDR 0x00000432 -#define IA32_MC13_ADDR 0x00000436 -#define IA32_MC14_ADDR 0x0000043A -#define IA32_MC15_ADDR 0x0000043E -#define IA32_MC16_ADDR 0x00000442 -#define IA32_MC17_ADDR 0x00000446 -#define IA32_MC18_ADDR 0x0000044A -#define IA32_MC19_ADDR 0x0000044E -#define IA32_MC20_ADDR 0x00000452 -#define IA32_MC21_ADDR 0x00000456 -#define IA32_MC22_ADDR 0x0000045A -#define IA32_MC23_ADDR 0x0000045E -#define IA32_MC24_ADDR 0x00000462 -#define IA32_MC25_ADDR 0x00000466 -#define IA32_MC26_ADDR 0x0000046A -#define IA32_MC27_ADDR 0x0000046E -#define IA32_MC28_ADDR 0x00000472 - /** - * @} - */ - - /** - * @defgroup ia32_mc_misc \ - * IA32_MC(i)_MISC - * - * IA32_MC(0-28)_MISC. - * - * @remarks If IA32_MCG_CAP.CNT > n - * @{ - */ -#define IA32_MC0_MISC 0x00000403 -#define IA32_MC1_MISC 0x00000407 -#define IA32_MC2_MISC 0x0000040B -#define IA32_MC3_MISC 0x0000040F -#define IA32_MC4_MISC 0x00000413 -#define IA32_MC5_MISC 0x00000417 -#define IA32_MC6_MISC 0x0000041B -#define IA32_MC7_MISC 0x0000041F -#define IA32_MC8_MISC 0x00000423 -#define IA32_MC9_MISC 0x00000427 -#define IA32_MC10_MISC 0x0000042B -#define IA32_MC11_MISC 0x0000042F -#define IA32_MC12_MISC 0x00000433 -#define IA32_MC13_MISC 0x00000437 -#define IA32_MC14_MISC 0x0000043B -#define IA32_MC15_MISC 0x0000043F -#define IA32_MC16_MISC 0x00000443 -#define IA32_MC17_MISC 0x00000447 -#define IA32_MC18_MISC 0x0000044B -#define IA32_MC19_MISC 0x0000044F -#define IA32_MC20_MISC 0x00000453 -#define IA32_MC21_MISC 0x00000457 -#define IA32_MC22_MISC 0x0000045B -#define IA32_MC23_MISC 0x0000045F -#define IA32_MC24_MISC 0x00000463 -#define IA32_MC25_MISC 0x00000467 -#define IA32_MC26_MISC 0x0000046B -#define IA32_MC27_MISC 0x0000046F -#define IA32_MC28_MISC 0x00000473 - /** - * @} - */ - - - /** - * Reporting Register of Basic VMX Capabilities. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.1(BASIC VMX INFORMATION)] - * @see Vol3D[A.1(Basic VMX Information)] (reference) - */ -#define IA32_VMX_BASIC 0x00000480 -typedef union -{ - struct - { - /** - * @brief VMCS revision identifier used by the processor - * - * [Bits 30:0] 31-bit VMCS revision identifier used by the processor. Processors that use the same VMCS revision identifier - * use the same size for VMCS regions. - */ - uint64_t vmcs_revision_id : 31; -#define IA32_VMX_BASIC_VMCS_REVISION_ID_BIT 0 -#define IA32_VMX_BASIC_VMCS_REVISION_ID_FLAG 0x7FFFFFFF -#define IA32_VMX_BASIC_VMCS_REVISION_ID_MASK 0x7FFFFFFF -#define IA32_VMX_BASIC_VMCS_REVISION_ID(_) (((_) >> 0) & 0x7FFFFFFF) - - /** - * [Bit 31] Bit 31 is always 0. - */ - uint64_t must_be_zero : 1; -#define IA32_VMX_BASIC_MUST_BE_ZERO_BIT 31 -#define IA32_VMX_BASIC_MUST_BE_ZERO_FLAG 0x80000000 -#define IA32_VMX_BASIC_MUST_BE_ZERO_MASK 0x01 -#define IA32_VMX_BASIC_MUST_BE_ZERO(_) (((_) >> 31) & 0x01) - - /** - * @brief Size of the VMCS - * - * [Bits 44:32] Report 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). - */ - uint64_t vmcs_size_in_bytes : 13; -#define IA32_VMX_BASIC_VMCS_SIZE_IN_BYTES_BIT 32 -#define IA32_VMX_BASIC_VMCS_SIZE_IN_BYTES_FLAG 0x1FFF00000000 -#define IA32_VMX_BASIC_VMCS_SIZE_IN_BYTES_MASK 0x1FFF -#define IA32_VMX_BASIC_VMCS_SIZE_IN_BYTES(_) (((_) >> 32) & 0x1FFF) - uint64_t reserved1 : 3; - - /** - * @brief Width of physical address used for the VMCS - * - 0 -> limited to the available amount of physical RAM - * - 1 -> within the first 4 GB - * - * [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.2 If the bit is 1, these addresses are - * limited to 32 bits. This bit is always 0 for processors that support Intel 64 architecture. - */ - uint64_t vmcs_physical_address_width : 1; -#define IA32_VMX_BASIC_VMCS_PHYSICAL_ADDRESS_WIDTH_BIT 48 -#define IA32_VMX_BASIC_VMCS_PHYSICAL_ADDRESS_WIDTH_FLAG 0x1000000000000 -#define IA32_VMX_BASIC_VMCS_PHYSICAL_ADDRESS_WIDTH_MASK 0x01 -#define IA32_VMX_BASIC_VMCS_PHYSICAL_ADDRESS_WIDTH(_) (((_) >> 48) & 0x01) - - /** - * @brief Whether the processor supports the dual-monitor treatment of system-management interrupts and system-management - * code (always 1) - * - * [Bit 49] Read as 1, the logical processor supports the dual-monitor treatment of system-management interrupts and - * system-management mode. - * - * @see Vol3C[34.15(DUAL-MONITOR TREATMENT OF SMIs AND SMM)] - */ - uint64_t dual_monitor_support : 1; -#define IA32_VMX_BASIC_DUAL_MONITOR_SUPPORT_BIT 49 -#define IA32_VMX_BASIC_DUAL_MONITOR_SUPPORT_FLAG 0x2000000000000 -#define IA32_VMX_BASIC_DUAL_MONITOR_SUPPORT_MASK 0x01 -#define IA32_VMX_BASIC_DUAL_MONITOR_SUPPORT(_) (((_) >> 49) & 0x01) - - /** - * @brief Memory type that must be used for the VMCS - * - * [Bits 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. - */ - uint64_t memory_type : 4; -#define IA32_VMX_BASIC_MEMORY_TYPE_BIT 50 -#define IA32_VMX_BASIC_MEMORY_TYPE_FLAG 0x3C000000000000 -#define IA32_VMX_BASIC_MEMORY_TYPE_MASK 0x0F -#define IA32_VMX_BASIC_MEMORY_TYPE(_) (((_) >> 50) & 0x0F) - - /** - * @brief Whether the processor provides additional information for exits due to INS/OUTS - * - * [Bit 54] When set to 1, the processor reports information in the VM-exit instruction-information field on VM exits due - * to execution of the INS and OUTS instructions. This reporting is done only if this bit is read as 1. - * - * @see Vol3C[27.2.4(Information for VM Exits Due to Instruction Execution)] - */ - uint64_t ins_outs_reporting : 1; -#define IA32_VMX_BASIC_INS_OUTS_REPORTING_BIT 54 -#define IA32_VMX_BASIC_INS_OUTS_REPORTING_FLAG 0x40000000000000 -#define IA32_VMX_BASIC_INS_OUTS_REPORTING_MASK 0x01 -#define IA32_VMX_BASIC_INS_OUTS_REPORTING(_) (((_) >> 54) & 0x01) - - /** - * @brief Whether default 1 bits in control MSRs (pin/proc/exit/entry) may be cleared to 0 and that 'true' control MSRs are - * supported - * - * [Bit 55] Is read as 1 if any VMX controls that default to 1 may be cleared to 0. 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 Vol3D[A.2(RESERVED CONTROLS AND DEFAULT SETTINGS)] - * @see Vol3D[A.3.1(Pin-Based VM-Execution Controls)] - * @see Vol3D[A.3.2(Primary Processor-Based VM-Execution Controls)] - * @see Vol3D[A.4(VM-EXIT CONTROLS)] - * @see Vol3D[A.5(VM-ENTRY CONTROLS)] - */ - uint64_t vmx_controls : 1; -#define IA32_VMX_BASIC_VMX_CONTROLS_BIT 55 -#define IA32_VMX_BASIC_VMX_CONTROLS_FLAG 0x80000000000000 -#define IA32_VMX_BASIC_VMX_CONTROLS_MASK 0x01 -#define IA32_VMX_BASIC_VMX_CONTROLS(_) (((_) >> 55) & 0x01) - uint64_t reserved2 : 8; - }; - - uint64_t flags; -} ia32_vmx_basic_register; - - -/** - * Capability Reporting Register of Pin-Based VM-Execution Controls. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.3.1(Pin-Based VM-Execution Controls)] - * @see Vol3C[24.6.1(Pin-Based VM-Execution Controls)] (reference) - */ -#define IA32_VMX_PINBASED_CTLS 0x00000481 -typedef union -{ - struct - { - /** - * @brief External interrupts cause VM-exits if set; otherwise dispatched through the guest's IDT - * - * [Bit 0] If this control is 1, external interrupts cause VM exits. Otherwise, they are delivered normally through the - * guest interrupt-descriptor table (IDT). If this control is 1, the value of RFLAGS.IF does not affect interrupt blocking. - */ - uint64_t external_interrupt_exiting : 1; -#define IA32_VMX_PINBASED_CTLS_EXTERNAL_INTERRUPT_EXITING_BIT 0 -#define IA32_VMX_PINBASED_CTLS_EXTERNAL_INTERRUPT_EXITING_FLAG 0x01 -#define IA32_VMX_PINBASED_CTLS_EXTERNAL_INTERRUPT_EXITING_MASK 0x01 -#define IA32_VMX_PINBASED_CTLS_EXTERNAL_INTERRUPT_EXITING(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 2; - - /** - * @brief Non-maskable interrupts cause VM-exits if set; otherwise dispatched through the guest's IDT - * - * [Bit 3] If this control is 1, non-maskable interrupts (NMIs) cause VM exits. Otherwise, they are delivered normally - * using descriptor 2 of the IDT. This control also determines interactions between IRET and blocking by NMI. - * - * @see Vol3C[25.3(CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION)] - */ - uint64_t nmi_exiting : 1; -#define IA32_VMX_PINBASED_CTLS_NMI_EXITING_BIT 3 -#define IA32_VMX_PINBASED_CTLS_NMI_EXITING_FLAG 0x08 -#define IA32_VMX_PINBASED_CTLS_NMI_EXITING_MASK 0x01 -#define IA32_VMX_PINBASED_CTLS_NMI_EXITING(_) (((_) >> 3) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief Virtual NMIs - * - * [Bit 5] If this control is 1, NMIs are never blocked and the "blocking by NMI" bit (bit 3) in the interruptibility-state - * field indicates "virtual-NMI blocking". This control also interacts with the "NMI-window exiting" VM-execution control. - * - * @see Vol3C[24.6.2(Processor-Based VM-Execution Controls)] - */ - uint64_t virtual_nmi : 1; -#define IA32_VMX_PINBASED_CTLS_VIRTUAL_NMI_BIT 5 -#define IA32_VMX_PINBASED_CTLS_VIRTUAL_NMI_FLAG 0x20 -#define IA32_VMX_PINBASED_CTLS_VIRTUAL_NMI_MASK 0x01 -#define IA32_VMX_PINBASED_CTLS_VIRTUAL_NMI(_) (((_) >> 5) & 0x01) - - /** - * @brief Activate VMX preemption timer - * - * [Bit 6] If this control is 1, the VMX-preemption timer counts down in VMX non-root operation. A VM exit occurs when the - * timer counts down to zero. - * - * @see Vol3C[25.5.1(VMX-Preemption Timer)] - * @see Vol3C[25.2(OTHER CAUSES OF VM EXITS)] - */ - uint64_t activate_vmx_preemption_timer : 1; -#define IA32_VMX_PINBASED_CTLS_ACTIVATE_VMX_PREEMPTION_TIMER_BIT 6 -#define IA32_VMX_PINBASED_CTLS_ACTIVATE_VMX_PREEMPTION_TIMER_FLAG 0x40 -#define IA32_VMX_PINBASED_CTLS_ACTIVATE_VMX_PREEMPTION_TIMER_MASK 0x01 -#define IA32_VMX_PINBASED_CTLS_ACTIVATE_VMX_PREEMPTION_TIMER(_) (((_) >> 6) & 0x01) - - /** - * @brief Process interrupts with the posted-interrupt notification vector - * - * [Bit 7] If this control is 1, the processor treats interrupts with the posted-interrupt notification vector specially, - * updating the virtual-APIC page with posted-interrupt requests. - * - * @see Vol3C[24.6.8(Controls for APIC Virtualization)] - * @see Vol3C[29.6(POSTED-INTERRUPT PROCESSING)] - */ - uint64_t process_posted_interrupts : 1; -#define IA32_VMX_PINBASED_CTLS_PROCESS_POSTED_INTERRUPTS_BIT 7 -#define IA32_VMX_PINBASED_CTLS_PROCESS_POSTED_INTERRUPTS_FLAG 0x80 -#define IA32_VMX_PINBASED_CTLS_PROCESS_POSTED_INTERRUPTS_MASK 0x01 -#define IA32_VMX_PINBASED_CTLS_PROCESS_POSTED_INTERRUPTS(_) (((_) >> 7) & 0x01) - uint64_t reserved3 : 56; - }; - - uint64_t flags; -} ia32_vmx_pinbased_ctls_register; - - -/** - * Capability Reporting Register of Primary Processor-Based VM-Execution Controls. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.3.2(Primary Processor-Based VM-Execution Controls)] - * @see Vol3C[24.6.2(Processor-Based VM-Execution Controls)] (reference) - */ -#define IA32_VMX_PROCBASED_CTLS 0x00000482 -typedef union -{ - struct - { - uint64_t reserved1 : 2; - - /** - * @brief VM-exit as soon as RFLAGS.IF=1 and no blocking is active - * - * [Bit 2] If this control is 1, a VM exit occurs at the beginning of any instruction if RFLAGS.IF = 1 and there are no - * other blocking of interrupts. - * - * @see Vol3C[24.4.2(Guest Non-Register State)] - */ - uint64_t interrupt_window_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_INTERRUPT_WINDOW_EXITING_BIT 2 -#define IA32_VMX_PROCBASED_CTLS_INTERRUPT_WINDOW_EXITING_FLAG 0x04 -#define IA32_VMX_PROCBASED_CTLS_INTERRUPT_WINDOW_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_INTERRUPT_WINDOW_EXITING(_) (((_) >> 2) & 0x01) - - /** - * @brief Use timestamp counter offset - * - * [Bit 3] This control determines whether executions of RDTSC, executions of RDTSCP, and executions of RDMSR that read - * from the IA32_TIME_STAMP_COUNTER MSR return a value modified by the TSC offset field. - * - * @see Vol3C[24.6.5(Time-Stamp Counter Offset and Multiplier)] - * @see Vol3C[25.3(CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION)] - */ - uint64_t use_tsc_offsetting : 1; -#define IA32_VMX_PROCBASED_CTLS_USE_TSC_OFFSETTING_BIT 3 -#define IA32_VMX_PROCBASED_CTLS_USE_TSC_OFFSETTING_FLAG 0x08 -#define IA32_VMX_PROCBASED_CTLS_USE_TSC_OFFSETTING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_USE_TSC_OFFSETTING(_) (((_) >> 3) & 0x01) - uint64_t reserved2 : 3; - - /** - * @brief VM-exit when executing the HLT instruction - * - * [Bit 7] This control determines whether executions of HLT cause VM exits. - */ - uint64_t hlt_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_HLT_EXITING_BIT 7 -#define IA32_VMX_PROCBASED_CTLS_HLT_EXITING_FLAG 0x80 -#define IA32_VMX_PROCBASED_CTLS_HLT_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_HLT_EXITING(_) (((_) >> 7) & 0x01) - uint64_t reserved3 : 1; - - /** - * @brief VM-exit when executing the INVLPG instruction - * - * [Bit 9] This control determines whether executions of INVLPG cause VM exits. - */ - uint64_t invlpg_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_INVLPG_EXITING_BIT 9 -#define IA32_VMX_PROCBASED_CTLS_INVLPG_EXITING_FLAG 0x200 -#define IA32_VMX_PROCBASED_CTLS_INVLPG_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_INVLPG_EXITING(_) (((_) >> 9) & 0x01) - - /** - * @brief VM-exit when executing the MWAIT instruction - * - * [Bit 10] This control determines whether executions of MWAIT cause VM exits. - */ - uint64_t mwait_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_MWAIT_EXITING_BIT 10 -#define IA32_VMX_PROCBASED_CTLS_MWAIT_EXITING_FLAG 0x400 -#define IA32_VMX_PROCBASED_CTLS_MWAIT_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_MWAIT_EXITING(_) (((_) >> 10) & 0x01) - - /** - * @brief VM-exit when executing the RDPMC instruction - * - * [Bit 11] This control determines whether executions of RDPMC cause VM exits. - */ - uint64_t rdpmc_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_RDPMC_EXITING_BIT 11 -#define IA32_VMX_PROCBASED_CTLS_RDPMC_EXITING_FLAG 0x800 -#define IA32_VMX_PROCBASED_CTLS_RDPMC_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_RDPMC_EXITING(_) (((_) >> 11) & 0x01) - - /** - * @brief VM-exit when executing the RDTSC/RDTSCP instruction - * - * [Bit 12] This control determines whether executions of RDTSC and RDTSCP cause VM exits. - */ - uint64_t rdtsc_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_RDTSC_EXITING_BIT 12 -#define IA32_VMX_PROCBASED_CTLS_RDTSC_EXITING_FLAG 0x1000 -#define IA32_VMX_PROCBASED_CTLS_RDTSC_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_RDTSC_EXITING(_) (((_) >> 12) & 0x01) - uint64_t reserved4 : 2; - - /** - * @brief VM-exit when executing the MOV to CR3 instruction (forced to 1 on the 'first' VT-x capable CPUs; this actually - * includes the newest Nehalem CPUs) - * - * [Bit 15] In conjunction with the CR3-target controls, this control determines whether executions of MOV to CR3 cause VM - * exits. The first processors to support the virtual-machine extensions supported only the 1-setting of this control. - * - * @see Vol3C[24.6.7(CR3-Target Controls)] - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ - uint64_t cr3_load_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_CR3_LOAD_EXITING_BIT 15 -#define IA32_VMX_PROCBASED_CTLS_CR3_LOAD_EXITING_FLAG 0x8000 -#define IA32_VMX_PROCBASED_CTLS_CR3_LOAD_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_CR3_LOAD_EXITING(_) (((_) >> 15) & 0x01) - - /** - * @brief VM-exit when executing the MOV from CR3 instruction (forced to 1 on the 'first' VT-x capable CPUs; this actually - * includes the newest Nehalem CPUs) - * - * [Bit 16] This control determines whether executions of MOV from CR3 cause VM exits. The first processors to support the - * virtual-machine extensions supported only the 1-setting of this control. - */ - uint64_t cr3_store_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_CR3_STORE_EXITING_BIT 16 -#define IA32_VMX_PROCBASED_CTLS_CR3_STORE_EXITING_FLAG 0x10000 -#define IA32_VMX_PROCBASED_CTLS_CR3_STORE_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_CR3_STORE_EXITING(_) (((_) >> 16) & 0x01) - uint64_t reserved5 : 2; - - /** - * @brief VM-exit on CR8 loads - * - * [Bit 19] This control determines whether executions of MOV to CR8 cause VM exits. - */ - uint64_t cr8_load_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_CR8_LOAD_EXITING_BIT 19 -#define IA32_VMX_PROCBASED_CTLS_CR8_LOAD_EXITING_FLAG 0x80000 -#define IA32_VMX_PROCBASED_CTLS_CR8_LOAD_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_CR8_LOAD_EXITING(_) (((_) >> 19) & 0x01) - - /** - * @brief VM-exit on CR8 stores - * - * [Bit 20] This control determines whether executions of MOV from CR8 cause VM exits. - */ - uint64_t cr8_store_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_CR8_STORE_EXITING_BIT 20 -#define IA32_VMX_PROCBASED_CTLS_CR8_STORE_EXITING_FLAG 0x100000 -#define IA32_VMX_PROCBASED_CTLS_CR8_STORE_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_CR8_STORE_EXITING(_) (((_) >> 20) & 0x01) - - /** - * @brief Use TPR shadow - * - * [Bit 21] Setting this control to 1 enables TPR virtualization and other APIC-virtualization features. - * - * @see Vol3C[29(APIC VIRTUALIZATION AND VIRTUAL INTERRUPTS)] - */ - uint64_t use_tpr_shadow : 1; -#define IA32_VMX_PROCBASED_CTLS_USE_TPR_SHADOW_BIT 21 -#define IA32_VMX_PROCBASED_CTLS_USE_TPR_SHADOW_FLAG 0x200000 -#define IA32_VMX_PROCBASED_CTLS_USE_TPR_SHADOW_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_USE_TPR_SHADOW(_) (((_) >> 21) & 0x01) - - /** - * @brief VM-exit when virtual NMI blocking is disabled - * - * [Bit 22] If this control is 1, a VM exit occurs at the beginning of any instruction if there is no virtual-NMI blocking. - * - * @see Vol3C[24.4.2(Guest Non-Register State)] - */ - uint64_t nmi_window_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_NMI_WINDOW_EXITING_BIT 22 -#define IA32_VMX_PROCBASED_CTLS_NMI_WINDOW_EXITING_FLAG 0x400000 -#define IA32_VMX_PROCBASED_CTLS_NMI_WINDOW_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_NMI_WINDOW_EXITING(_) (((_) >> 22) & 0x01) - - /** - * @brief VM-exit when executing a MOV DRx instruction - * - * [Bit 23] This control determines whether executions of MOV DR cause VM exits. - */ - uint64_t mov_dr_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_MOV_DR_EXITING_BIT 23 -#define IA32_VMX_PROCBASED_CTLS_MOV_DR_EXITING_FLAG 0x800000 -#define IA32_VMX_PROCBASED_CTLS_MOV_DR_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_MOV_DR_EXITING(_) (((_) >> 23) & 0x01) - - /** - * @brief VM-exit when executing IO instructions - * - * [Bit 24] This control determines whether executions of I/O instructions (IN, INS/INSB/INSW/INSD, OUT, and - * OUTS/OUTSB/OUTSW/OUTSD) cause VM exits. - */ - uint64_t unconditional_io_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_UNCONDITIONAL_IO_EXITING_BIT 24 -#define IA32_VMX_PROCBASED_CTLS_UNCONDITIONAL_IO_EXITING_FLAG 0x1000000 -#define IA32_VMX_PROCBASED_CTLS_UNCONDITIONAL_IO_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_UNCONDITIONAL_IO_EXITING(_) (((_) >> 24) & 0x01) - - /** - * @brief Use IO bitmaps - * - * [Bit 25] This control determines whether I/O bitmaps are used to restrict executions of I/O instructions For this - * control, "0" means "do not use I/O bitmaps" and "1" means "use I/O bitmaps." If the I/O bitmaps are used, the setting of - * the "unconditional I/O exiting" control is ignored. - * - * @see Vol3C[24.6.4(I/O-Bitmap Addresses)] - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ - uint64_t use_io_bitmaps : 1; -#define IA32_VMX_PROCBASED_CTLS_USE_IO_BITMAPS_BIT 25 -#define IA32_VMX_PROCBASED_CTLS_USE_IO_BITMAPS_FLAG 0x2000000 -#define IA32_VMX_PROCBASED_CTLS_USE_IO_BITMAPS_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_USE_IO_BITMAPS(_) (((_) >> 25) & 0x01) - uint64_t reserved6 : 1; - - /** - * @brief Monitor trap flag - * - * [Bit 27] If this control is 1, the monitor trap flag debugging feature is enabled. - * - * @see Vol3C[25.5.2(Monitor Trap Flag)] - */ - uint64_t monitor_trap_flag : 1; -#define IA32_VMX_PROCBASED_CTLS_MONITOR_TRAP_FLAG_BIT 27 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_TRAP_FLAG_FLAG 0x8000000 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_TRAP_FLAG_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_TRAP_FLAG(_) (((_) >> 27) & 0x01) - - /** - * @brief Use MSR bitmaps - * - * [Bit 28] This control determines whether MSR bitmaps are used to control execution of the RDMSR and WRMSR instructions. - * For this control, "0" means "do not use MSR bitmaps" and "1" means "use MSR bitmaps." If the MSR bitmaps are not used, - * all executions of the RDMSR and WRMSR instructions cause VM exits. - * - * @see Vol3C[24.6.9(MSR-Bitmap Address)] - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ - uint64_t use_msr_bitmaps : 1; -#define IA32_VMX_PROCBASED_CTLS_USE_MSR_BITMAPS_BIT 28 -#define IA32_VMX_PROCBASED_CTLS_USE_MSR_BITMAPS_FLAG 0x10000000 -#define IA32_VMX_PROCBASED_CTLS_USE_MSR_BITMAPS_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_USE_MSR_BITMAPS(_) (((_) >> 28) & 0x01) - - /** - * @brief VM-exit when executing the MONITOR instruction - * - * [Bit 29] This control determines whether executions of MONITOR cause VM exits. - */ - uint64_t monitor_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_MONITOR_EXITING_BIT 29 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_EXITING_FLAG 0x20000000 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_MONITOR_EXITING(_) (((_) >> 29) & 0x01) - - /** - * @brief VM-exit when executing the PAUSE instruction - * - * [Bit 30] This control determines whether executions of PAUSE cause VM exits. - */ - uint64_t pause_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS_PAUSE_EXITING_BIT 30 -#define IA32_VMX_PROCBASED_CTLS_PAUSE_EXITING_FLAG 0x40000000 -#define IA32_VMX_PROCBASED_CTLS_PAUSE_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_PAUSE_EXITING(_) (((_) >> 30) & 0x01) - - /** - * @brief Determines whether the secondary processor based VM-execution controls are used - * - * [Bit 31] This control determines whether the secondary processor-based VM-execution controls are used. If this control - * is 0, the logical processor operates as if all the secondary processor-based VM-execution controls were also 0. - */ - uint64_t activate_secondary_controls : 1; -#define IA32_VMX_PROCBASED_CTLS_ACTIVATE_SECONDARY_CONTROLS_BIT 31 -#define IA32_VMX_PROCBASED_CTLS_ACTIVATE_SECONDARY_CONTROLS_FLAG 0x80000000 -#define IA32_VMX_PROCBASED_CTLS_ACTIVATE_SECONDARY_CONTROLS_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS_ACTIVATE_SECONDARY_CONTROLS(_) (((_) >> 31) & 0x01) - uint64_t reserved7 : 32; - }; - - uint64_t flags; -} ia32_vmx_procbased_ctls_register; - - -/** - * Capability Reporting Register of VM-Exit Controls. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.4(VM-EXIT CONTROLS)] - * @see Vol3C[24.7.1(VM-Exit Controls)] (reference) - */ -#define IA32_VMX_EXIT_CTLS 0x00000483 -typedef union -{ - struct - { - uint64_t reserved1 : 2; - - /** - * @brief Save guest debug controls (dr7 & IA32_DEBUGCTL_MSR) (forced to 1 on the 'first' VT-x capable CPUs; this actually - * includes the newest Nehalem CPUs) - * - * [Bit 2] This control determines whether DR7 and the IA32_DEBUGCTL MSR are saved on VM exit. The first processors to - * support the virtual-machine extensions supported only the 1-setting of this control. - */ - uint64_t save_debug_controls : 1; -#define IA32_VMX_EXIT_CTLS_SAVE_DEBUG_CONTROLS_BIT 2 -#define IA32_VMX_EXIT_CTLS_SAVE_DEBUG_CONTROLS_FLAG 0x04 -#define IA32_VMX_EXIT_CTLS_SAVE_DEBUG_CONTROLS_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_SAVE_DEBUG_CONTROLS(_) (((_) >> 2) & 0x01) - uint64_t reserved2 : 6; - - /** - * @brief Return to long mode after a VM-exit - * - * [Bit 9] On processors that support Intel 64 architecture, this control determines whether a logical processor is in - * 64-bit mode after the next VM exit. Its value is loaded into CS.L, IA32_EFER.LME, and IA32_EFER.LMA on every VM exit.1 - * This control must be 0 on processors that do not support Intel 64 architecture. - */ - uint64_t host_address_space_size : 1; -#define IA32_VMX_EXIT_CTLS_HOST_ADDRESS_SPACE_SIZE_BIT 9 -#define IA32_VMX_EXIT_CTLS_HOST_ADDRESS_SPACE_SIZE_FLAG 0x200 -#define IA32_VMX_EXIT_CTLS_HOST_ADDRESS_SPACE_SIZE_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_HOST_ADDRESS_SPACE_SIZE(_) (((_) >> 9) & 0x01) - uint64_t reserved3 : 2; - - /** - * @brief Whether the IA32_PERF_GLOBAL_CTRL MSR is loaded on VM-exit - * - * [Bit 12] This control determines whether the IA32_PERF_GLOBAL_CTRL MSR is loaded on VM exit. - */ - uint64_t load_ia32_perf_global_ctrl : 1; -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_BIT 12 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_FLAG 0x1000 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL(_) (((_) >> 12) & 0x01) - uint64_t reserved4 : 2; - - /** - * @brief Acknowledge external interrupts with the irq controller if one caused a VM-exit - * - * [Bit 15] This control affects VM exits due to external interrupts: - * - If such a VM exit occurs and this control is 1, the logical processor acknowledges the interrupt controller, acquiring - * the interrupt's vector. The vector is stored in the VM-exit interruption-information field, which is marked valid. - * - If such a VM exit occurs and this control is 0, the interrupt is not acknowledged and the VM-exit - * interruption-information field is marked invalid. - */ - uint64_t acknowledge_interrupt_on_exit : 1; -#define IA32_VMX_EXIT_CTLS_ACKNOWLEDGE_INTERRUPT_ON_EXIT_BIT 15 -#define IA32_VMX_EXIT_CTLS_ACKNOWLEDGE_INTERRUPT_ON_EXIT_FLAG 0x8000 -#define IA32_VMX_EXIT_CTLS_ACKNOWLEDGE_INTERRUPT_ON_EXIT_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_ACKNOWLEDGE_INTERRUPT_ON_EXIT(_) (((_) >> 15) & 0x01) - uint64_t reserved5 : 2; - - /** - * @brief Whether the guest IA32_PAT MSR is saved on VM-exit - * - * [Bit 18] This control determines whether the IA32_PAT MSR is saved on VM exit. - */ - uint64_t save_ia32_pat : 1; -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_PAT_BIT 18 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_PAT_FLAG 0x40000 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_PAT_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_PAT(_) (((_) >> 18) & 0x01) - - /** - * @brief Whether the host IA32_PAT MSR is loaded on VM-exit - * - * [Bit 19] This control determines whether the IA32_PAT MSR is loaded on VM exit. - */ - uint64_t load_ia32_pat : 1; -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PAT_BIT 19 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PAT_FLAG 0x80000 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PAT_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_PAT(_) (((_) >> 19) & 0x01) - - /** - * @brief Whether the guest IA32_EFER MSR is saved on VM-exit - * - * [Bit 20] This control determines whether the IA32_EFER MSR is saved on VM exit. - */ - uint64_t save_ia32_efer : 1; -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_EFER_BIT 20 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_EFER_FLAG 0x100000 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_EFER_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_SAVE_IA32_EFER(_) (((_) >> 20) & 0x01) - - /** - * @brief Whether the host IA32_EFER MSR is loaded on VM-exit - * - * [Bit 21] This control determines whether the IA32_EFER MSR is loaded on VM exit. - */ - uint64_t load_ia32_efer : 1; -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_EFER_BIT 21 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_EFER_FLAG 0x200000 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_EFER_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_LOAD_IA32_EFER(_) (((_) >> 21) & 0x01) - - /** - * @brief Whether the value of the VMX preemption timer is saved on every VM-exit - * - * [Bit 22] This control determines whether the value of the VMX-preemption timer is saved on VM exit. - */ - uint64_t save_vmx_preemption_timer_value : 1; -#define IA32_VMX_EXIT_CTLS_SAVE_VMX_PREEMPTION_TIMER_VALUE_BIT 22 -#define IA32_VMX_EXIT_CTLS_SAVE_VMX_PREEMPTION_TIMER_VALUE_FLAG 0x400000 -#define IA32_VMX_EXIT_CTLS_SAVE_VMX_PREEMPTION_TIMER_VALUE_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_SAVE_VMX_PREEMPTION_TIMER_VALUE(_) (((_) >> 22) & 0x01) - - /** - * [Bit 23] This control determines whether the IA32_BNDCFGS MSR is cleared on VM exit. - */ - uint64_t clear_ia32_bndcfgs : 1; -#define IA32_VMX_EXIT_CTLS_CLEAR_IA32_BNDCFGS_BIT 23 -#define IA32_VMX_EXIT_CTLS_CLEAR_IA32_BNDCFGS_FLAG 0x800000 -#define IA32_VMX_EXIT_CTLS_CLEAR_IA32_BNDCFGS_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_CLEAR_IA32_BNDCFGS(_) (((_) >> 23) & 0x01) - - /** - * [Bit 24] If this control is 1, Intel Processor Trace does not produce a paging information packet (PIP) on a VM exit or - * a VMCS packet on an SMM VM exit. - * - * @see Vol3C[35(INTEL(R) PROCESSOR TRACE)] - */ - uint64_t conceal_vmx_from_pt : 1; -#define IA32_VMX_EXIT_CTLS_CONCEAL_VMX_FROM_PT_BIT 24 -#define IA32_VMX_EXIT_CTLS_CONCEAL_VMX_FROM_PT_FLAG 0x1000000 -#define IA32_VMX_EXIT_CTLS_CONCEAL_VMX_FROM_PT_MASK 0x01 -#define IA32_VMX_EXIT_CTLS_CONCEAL_VMX_FROM_PT(_) (((_) >> 24) & 0x01) - uint64_t reserved6 : 39; - }; - - uint64_t flags; -} ia32_vmx_exit_ctls_register; - - -/** - * Capability Reporting Register of VM-Entry Controls. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.5(VM-ENTRY CONTROLS)] - * @see Vol3D[24.8.1(VM-Entry Controls)] (reference) - */ -#define IA32_VMX_ENTRY_CTLS 0x00000484 -typedef union -{ - struct - { - uint64_t reserved1 : 2; - - /** - * @brief Load guest debug controls (dr7 & IA32_DEBUGCTL_MSR) (forced to 1 on the 'first' VT-x capable CPUs; this actually - * includes the newest Nehalem CPUs) - * - * [Bit 2] This control determines whether DR7 and the IA32_DEBUGCTL MSR are loaded on VM entry. The first processors to - * support the virtual-machine extensions supported only the 1-setting of this control. - */ - uint64_t load_debug_controls : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_DEBUG_CONTROLS_BIT 2 -#define IA32_VMX_ENTRY_CTLS_LOAD_DEBUG_CONTROLS_FLAG 0x04 -#define IA32_VMX_ENTRY_CTLS_LOAD_DEBUG_CONTROLS_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_DEBUG_CONTROLS(_) (((_) >> 2) & 0x01) - uint64_t reserved2 : 6; - - /** - * @brief 64 bits guest mode. Must be 0 for CPUs that don't support AMD64 - * - * [Bit 9] On processors that support Intel 64 architecture, this control determines whether the logical processor is in - * IA-32e mode after VM entry. Its value is loaded into IA32_EFER.LMA as part of VM entry. This control must be 0 on - * processors that do not support Intel 64 architecture. - */ - uint64_t ia32e_mode_guest : 1; -#define IA32_VMX_ENTRY_CTLS_IA32E_MODE_GUEST_BIT 9 -#define IA32_VMX_ENTRY_CTLS_IA32E_MODE_GUEST_FLAG 0x200 -#define IA32_VMX_ENTRY_CTLS_IA32E_MODE_GUEST_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_IA32E_MODE_GUEST(_) (((_) >> 9) & 0x01) - - /** - * @brief In SMM mode after VM-entry - * - * [Bit 10] This control determines whether the logical processor is in system-management mode (SMM) after VM entry. This - * control must be 0 for any VM entry from outside SMM. - */ - uint64_t entry_to_smm : 1; -#define IA32_VMX_ENTRY_CTLS_ENTRY_TO_SMM_BIT 10 -#define IA32_VMX_ENTRY_CTLS_ENTRY_TO_SMM_FLAG 0x400 -#define IA32_VMX_ENTRY_CTLS_ENTRY_TO_SMM_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_ENTRY_TO_SMM(_) (((_) >> 10) & 0x01) - - /** - * @brief Disable dual treatment of SMI and SMM; must be zero for VM-entry outside of SMM - * - * [Bit 11] If set to 1, the default treatment of SMIs and SMM is in effect after the VM entry. This control must be 0 for - * any VM entry from outside SMM - * - * @see Vol3C[34.15.7(Deactivating the Dual-Monitor Treatment)] - */ - uint64_t deactivate_dual_monitor_treatment : 1; -#define IA32_VMX_ENTRY_CTLS_DEACTIVATE_DUAL_MONITOR_TREATMENT_BIT 11 -#define IA32_VMX_ENTRY_CTLS_DEACTIVATE_DUAL_MONITOR_TREATMENT_FLAG 0x800 -#define IA32_VMX_ENTRY_CTLS_DEACTIVATE_DUAL_MONITOR_TREATMENT_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_DEACTIVATE_DUAL_MONITOR_TREATMENT(_) (((_) >> 11) & 0x01) - uint64_t reserved3 : 1; - - /** - * @brief Whether the guest IA32_PERF_GLOBAL_CTRL MSR is loaded on VM-entry - * - * [Bit 13] This control determines whether the IA32_PERF_GLOBAL_CTRL MSR is loaded on VM entry. - */ - uint64_t load_ia32_perf_global_ctrl : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_BIT 13 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_FLAG 0x2000 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PERF_GLOBAL_CTRL(_) (((_) >> 13) & 0x01) - - /** - * @brief Whether the guest IA32_PAT MSR is loaded on VM-entry - * - * [Bit 14] This control determines whether the IA32_PAT MSR is loaded on VM entry. - */ - uint64_t load_ia32_pat : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PAT_BIT 14 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PAT_FLAG 0x4000 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PAT_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_PAT(_) (((_) >> 14) & 0x01) - - /** - * @brief Whether the guest IA32_EFER MSR is loaded on VM-entry - * - * [Bit 15] This control determines whether the IA32_EFER MSR is loaded on VM entry. - */ - uint64_t load_ia32_efer : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_EFER_BIT 15 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_EFER_FLAG 0x8000 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_EFER_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_EFER(_) (((_) >> 15) & 0x01) - - /** - * [Bit 16] This control determines whether the IA32_BNDCFGS MSR is loaded on VM entry. - */ - uint64_t load_ia32_bndcfgs : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_BNDCFGS_BIT 16 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_BNDCFGS_FLAG 0x10000 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_BNDCFGS_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_BNDCFGS(_) (((_) >> 16) & 0x01) - - /** - * [Bit 17] If this control is 1, Intel Processor Trace does not produce a paging information packet (PIP) on a VM entry or - * a VMCS packet on a VM entry that returns from SMM. - * - * @see Vol3C[35(INTEL(R) PROCESSOR TRACE)] - */ - uint64_t conceal_vmx_from_pt : 1; -#define IA32_VMX_ENTRY_CTLS_CONCEAL_VMX_FROM_PT_BIT 17 -#define IA32_VMX_ENTRY_CTLS_CONCEAL_VMX_FROM_PT_FLAG 0x20000 -#define IA32_VMX_ENTRY_CTLS_CONCEAL_VMX_FROM_PT_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_CONCEAL_VMX_FROM_PT(_) (((_) >> 17) & 0x01) - - /** - * [Bit 18] This control determines whether the IA32_RTIT_CTL MSR is loaded on VM entry. - */ - uint64_t load_ia32_rtit_ctl : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_RTIT_CTL_BIT 18 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_RTIT_CTL_FLAG 0x40000 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_RTIT_CTL_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_IA32_RTIT_CTL(_) (((_) >> 18) & 0x01) - uint64_t reserved4 : 1; - - /** - * [Bit 20] This control determines whether CET-related MSRs and SPP are loaded on VM entry. - */ - uint64_t load_cet_state : 1; -#define IA32_VMX_ENTRY_CTLS_LOAD_CET_STATE_BIT 20 -#define IA32_VMX_ENTRY_CTLS_LOAD_CET_STATE_FLAG 0x100000 -#define IA32_VMX_ENTRY_CTLS_LOAD_CET_STATE_MASK 0x01 -#define IA32_VMX_ENTRY_CTLS_LOAD_CET_STATE(_) (((_) >> 20) & 0x01) - uint64_t reserved5 : 43; - }; - - uint64_t flags; -} ia32_vmx_entry_ctls_register; - - -/** - * Reporting Register of Miscellaneous VMX Capabilities. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.6(MISCELLANEOUS DATA)] - * @see Vol3D[A.6(Miscellaneous Data)] (reference) - */ -#define IA32_VMX_MISC 0x00000485 -typedef union -{ - struct - { - /** - * @brief Relationship between the preemption timer and tsc; count down every time bit x of the tsc changes - * - * [Bits 4:0] Report 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. - */ - uint64_t preemption_timer_tsc_relationship : 5; -#define IA32_VMX_MISC_PREEMPTION_TIMER_TSC_RELATIONSHIP_BIT 0 -#define IA32_VMX_MISC_PREEMPTION_TIMER_TSC_RELATIONSHIP_FLAG 0x1F -#define IA32_VMX_MISC_PREEMPTION_TIMER_TSC_RELATIONSHIP_MASK 0x1F -#define IA32_VMX_MISC_PREEMPTION_TIMER_TSC_RELATIONSHIP(_) (((_) >> 0) & 0x1F) - - /** - * @brief Whether VM-exit stores EFER.LMA into the "IA32e mode guest" field - * - * [Bit 5] When set to 1, VM exits store the value of IA32_EFER.LMA into the "IA-32e mode guest" VM-entry control. This bit - * is read as 1 on any logical processor that supports the 1-setting of the "unrestricted guest" VM-execution control. - * - * @see Vol3C[27.2(RECORDING VM-EXIT INFORMATION AND UPDATING VM-ENTRY CONTROL FIELDS)] - */ - uint64_t store_efer_lma_on_vmexit : 1; -#define IA32_VMX_MISC_STORE_EFER_LMA_ON_VMEXIT_BIT 5 -#define IA32_VMX_MISC_STORE_EFER_LMA_ON_VMEXIT_FLAG 0x20 -#define IA32_VMX_MISC_STORE_EFER_LMA_ON_VMEXIT_MASK 0x01 -#define IA32_VMX_MISC_STORE_EFER_LMA_ON_VMEXIT(_) (((_) >> 5) & 0x01) - - /** - * @brief Activity states supported by the implementation - * - * [Bits 8:6] Report, as a bitmap, the activity states supported by the implementation: - * - Bit 6 reports (if set) the support for activity state 1 (HLT). - * - Bit 7 reports (if set) the support for activity state 2 (shutdown). - * - Bit 8 reports (if set) the support for activity state 3 (wait-for-SIPI). - * If an activity state is not supported, the implementation causes a VM entry to fail if it attempts to establish that - * activity state. All implementations support VM entry to activity state 0 (active). - */ - uint64_t activity_states : 3; -#define IA32_VMX_MISC_ACTIVITY_STATES_BIT 6 -#define IA32_VMX_MISC_ACTIVITY_STATES_FLAG 0x1C0 -#define IA32_VMX_MISC_ACTIVITY_STATES_MASK 0x07 -#define IA32_VMX_MISC_ACTIVITY_STATES(_) (((_) >> 6) & 0x07) - uint64_t reserved1 : 5; - - /** - * @brief Intel Processor Trace (Intel PT) can be used in VMX operation - * - * [Bit 14] When set to 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; any attempt to - * write IA32_RTIT_CTL while in VMX operation (including VMX root operation) causes a general-protection exception. - * - * @see Vol3C[30.3(VMX INSTRUCTIONS | VMXON-Enter VMX Operation)] - */ - uint64_t intel_pt_available_in_vmx : 1; -#define IA32_VMX_MISC_INTEL_PT_AVAILABLE_IN_VMX_BIT 14 -#define IA32_VMX_MISC_INTEL_PT_AVAILABLE_IN_VMX_FLAG 0x4000 -#define IA32_VMX_MISC_INTEL_PT_AVAILABLE_IN_VMX_MASK 0x01 -#define IA32_VMX_MISC_INTEL_PT_AVAILABLE_IN_VMX(_) (((_) >> 14) & 0x01) - - /** - * @brief Whether RDMSR can be used to read IA32_SMBASE_MSR in SMM - * - * [Bit 15] When set to 1, the RDMSR instruction can be used in system-management mode (SMM) to read the IA32_SMBASE MSR - * (MSR address 9EH). - * - * @see Vol3C[34.15.6.3(Saving Guest State)] - */ - uint64_t rdmsr_can_read_ia32_smbase_msr_in_smm : 1; -#define IA32_VMX_MISC_RDMSR_CAN_READ_IA32_SMBASE_MSR_IN_SMM_BIT 15 -#define IA32_VMX_MISC_RDMSR_CAN_READ_IA32_SMBASE_MSR_IN_SMM_FLAG 0x8000 -#define IA32_VMX_MISC_RDMSR_CAN_READ_IA32_SMBASE_MSR_IN_SMM_MASK 0x01 -#define IA32_VMX_MISC_RDMSR_CAN_READ_IA32_SMBASE_MSR_IN_SMM(_) (((_) >> 15) & 0x01) - - /** - * @brief Number of CR3 target values supported by the processor (0-256) - * - * [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). - */ - uint64_t cr3_target_count : 9; -#define IA32_VMX_MISC_CR3_TARGET_COUNT_BIT 16 -#define IA32_VMX_MISC_CR3_TARGET_COUNT_FLAG 0x1FF0000 -#define IA32_VMX_MISC_CR3_TARGET_COUNT_MASK 0x1FF -#define IA32_VMX_MISC_CR3_TARGET_COUNT(_) (((_) >> 16) & 0x1FF) - - /** - * @brief Maximum number of MSRs in the VMCS. (N+1)*512 - * - * [Bits 27:25] 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). - */ - uint64_t max_number_of_msr : 3; -#define IA32_VMX_MISC_MAX_NUMBER_OF_MSR_BIT 25 -#define IA32_VMX_MISC_MAX_NUMBER_OF_MSR_FLAG 0xE000000 -#define IA32_VMX_MISC_MAX_NUMBER_OF_MSR_MASK 0x07 -#define IA32_VMX_MISC_MAX_NUMBER_OF_MSR(_) (((_) >> 25) & 0x07) - - /** - * @brief Whether bit 2 of IA32_SMM_MONITOR_CTL can be set to 1 - * - * [Bit 28] When set to 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 Vol3C[34.14.4(VMXOFF and SMI Unblocking)] - */ - uint64_t smm_monitor_ctl_b2 : 1; -#define IA32_VMX_MISC_SMM_MONITOR_CTL_B2_BIT 28 -#define IA32_VMX_MISC_SMM_MONITOR_CTL_B2_FLAG 0x10000000 -#define IA32_VMX_MISC_SMM_MONITOR_CTL_B2_MASK 0x01 -#define IA32_VMX_MISC_SMM_MONITOR_CTL_B2(_) (((_) >> 28) & 0x01) - - /** - * @brief Whether VMWRITE can be used to write VM-exit information fields - * - * [Bit 29] When set to 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. - */ - uint64_t vmwrite_vmexit_info : 1; -#define IA32_VMX_MISC_VMWRITE_VMEXIT_INFO_BIT 29 -#define IA32_VMX_MISC_VMWRITE_VMEXIT_INFO_FLAG 0x20000000 -#define IA32_VMX_MISC_VMWRITE_VMEXIT_INFO_MASK 0x01 -#define IA32_VMX_MISC_VMWRITE_VMEXIT_INFO(_) (((_) >> 29) & 0x01) - - /** - * [Bit 30] When set to 1, VM entry allows injection of a software interrupt, software exception, or privileged software - * exception with an instruction length of 0. - */ - uint64_t zero_length_instruction_vmentry_injection : 1; -#define IA32_VMX_MISC_ZERO_LENGTH_INSTRUCTION_VMENTRY_INJECTION_BIT 30 -#define IA32_VMX_MISC_ZERO_LENGTH_INSTRUCTION_VMENTRY_INJECTION_FLAG 0x40000000 -#define IA32_VMX_MISC_ZERO_LENGTH_INSTRUCTION_VMENTRY_INJECTION_MASK 0x01 -#define IA32_VMX_MISC_ZERO_LENGTH_INSTRUCTION_VMENTRY_INJECTION(_) (((_) >> 30) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief MSEG revision identifier used by the processor - * - * [Bits 63:32] Report the 32-bit MSEG revision identifier used by the processor. - */ - uint64_t mseg_id : 32; -#define IA32_VMX_MISC_MSEG_ID_BIT 32 -#define IA32_VMX_MISC_MSEG_ID_FLAG 0xFFFFFFFF00000000 -#define IA32_VMX_MISC_MSEG_ID_MASK 0xFFFFFFFF -#define IA32_VMX_MISC_MSEG_ID(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_vmx_misc_register; - - -/** - * Capability Reporting Register of CR0 Bits Fixed to 0. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.7(VMX-FIXED BITS IN CR0)] - * @see Vol3D[A.7(VMX-Fixed Bits in CR0)] (reference) - */ -#define IA32_VMX_CR0_FIXED0 0x00000486 - - /** - * Capability Reporting Register of CR0 Bits Fixed to 1. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.7(VMX-FIXED BITS IN CR0)] - * @see Vol3D[A.7(VMX-Fixed Bits in CR0)] (reference) - */ -#define IA32_VMX_CR0_FIXED1 0x00000487 - - /** - * Capability Reporting Register of CR4 Bits Fixed to 0. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.8(VMX-FIXED BITS IN CR4)] - * @see Vol3D[A.8(VMX-Fixed Bits in CR4)] (reference) - */ -#define IA32_VMX_CR4_FIXED0 0x00000488 - - /** - * Capability Reporting Register of CR4 Bits Fixed to 1. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.8(VMX-FIXED BITS IN CR4)] - * @see Vol3D[A.8(VMX-Fixed Bits in CR4)] (reference) - */ -#define IA32_VMX_CR4_FIXED1 0x00000489 - - /** - * Capability Reporting Register of VMCS Field Enumeration. - * - * @remarks If CPUID.01H:ECX.[5] = 1 - * @see Vol3D[A.9(VMCS ENUMERATION)] - * @see Vol3D[A.9(VMCS Enumeration)] (reference) - */ -#define IA32_VMX_VMCS_ENUM 0x0000048A -typedef union -{ - struct - { - /** - * [Bit 0] Indicates access type. - */ - uint64_t access_type : 1; -#define IA32_VMX_VMCS_ENUM_ACCESS_TYPE_BIT 0 -#define IA32_VMX_VMCS_ENUM_ACCESS_TYPE_FLAG 0x01 -#define IA32_VMX_VMCS_ENUM_ACCESS_TYPE_MASK 0x01 -#define IA32_VMX_VMCS_ENUM_ACCESS_TYPE(_) (((_) >> 0) & 0x01) - - /** - * [Bits 9:1] Highest index value used for any VMCS encoding. - */ - uint64_t highest_index_value : 9; -#define IA32_VMX_VMCS_ENUM_HIGHEST_INDEX_VALUE_BIT 1 -#define IA32_VMX_VMCS_ENUM_HIGHEST_INDEX_VALUE_FLAG 0x3FE -#define IA32_VMX_VMCS_ENUM_HIGHEST_INDEX_VALUE_MASK 0x1FF -#define IA32_VMX_VMCS_ENUM_HIGHEST_INDEX_VALUE(_) (((_) >> 1) & 0x1FF) - - /** - * [Bits 11:10] Indicate the field's type. - */ - uint64_t field_type : 2; -#define IA32_VMX_VMCS_ENUM_FIELD_TYPE_BIT 10 -#define IA32_VMX_VMCS_ENUM_FIELD_TYPE_FLAG 0xC00 -#define IA32_VMX_VMCS_ENUM_FIELD_TYPE_MASK 0x03 -#define IA32_VMX_VMCS_ENUM_FIELD_TYPE(_) (((_) >> 10) & 0x03) - uint64_t reserved1 : 1; - - /** - * [Bits 14:13] Indicate the field's width. - */ - uint64_t field_width : 2; -#define IA32_VMX_VMCS_ENUM_FIELD_WIDTH_BIT 13 -#define IA32_VMX_VMCS_ENUM_FIELD_WIDTH_FLAG 0x6000 -#define IA32_VMX_VMCS_ENUM_FIELD_WIDTH_MASK 0x03 -#define IA32_VMX_VMCS_ENUM_FIELD_WIDTH(_) (((_) >> 13) & 0x03) - uint64_t reserved2 : 49; - }; - - uint64_t flags; -} ia32_vmx_vmcs_enum_register; - - -/** - * Capability Reporting Register of Secondary Processor-Based VM-Execution Controls. - * - * @remarks If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_CTLS[63] ) - * @see Vol3D[A.3.3(Secondary Processor-Based VM-Execution Controls)] - * @see Vol3D[24.6.2(Processor-Based VM-Execution Controls)] (reference) - */ -#define IA32_VMX_PROCBASED_CTLS2 0x0000048B -typedef union -{ - struct - { - /** - * @brief Virtualize APIC access - * - * [Bit 0] If this control is 1, the logical processor treats specially accesses to the page with the APICaccess address. - * - * @see Vol3C[29.4(VIRTUALIZING MEMORY-MAPPED APIC ACCESSES)] - */ - uint64_t virtualize_apic_accesses : 1; -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_APIC_ACCESSES_BIT 0 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_APIC_ACCESSES_FLAG 0x01 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_APIC_ACCESSES_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_APIC_ACCESSES(_) (((_) >> 0) & 0x01) - - /** - * @brief EPT supported/enabled - * - * [Bit 1] If this control is 1, extended page tables (EPT) are enabled. - * - * @see Vol3C[28.2(THE EXTENDED PAGE TABLE MECHANISM (EPT))] - */ - uint64_t enable_ept : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_EPT_BIT 1 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_EPT_FLAG 0x02 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_EPT_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_EPT(_) (((_) >> 1) & 0x01) - - /** - * @brief Descriptor table instructions cause VM-exits - * - * [Bit 2] This control determines whether executions of LGDT, LIDT, LLDT, LTR, SGDT, SIDT, SLDT, and STR cause VM exits. - */ - uint64_t descriptor_table_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_DESCRIPTOR_TABLE_EXITING_BIT 2 -#define IA32_VMX_PROCBASED_CTLS2_DESCRIPTOR_TABLE_EXITING_FLAG 0x04 -#define IA32_VMX_PROCBASED_CTLS2_DESCRIPTOR_TABLE_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_DESCRIPTOR_TABLE_EXITING(_) (((_) >> 2) & 0x01) - - /** - * @brief RDTSCP supported/enabled - * - * [Bit 3] If this control is 0, any execution of RDTSCP causes an invalid-opcode exception (\#UD). - */ - uint64_t enable_rdtscp : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_RDTSCP_BIT 3 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_RDTSCP_FLAG 0x08 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_RDTSCP_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_RDTSCP(_) (((_) >> 3) & 0x01) - - /** - * @brief Virtualize x2APIC mode - * - * [Bit 4] If this control is 1, the logical processor treats specially RDMSR and WRMSR to APIC MSRs (in the range - * 800H-8FFH). - * - * @see Vol3C[29.5(VIRTUALIZING MSR-BASED APIC ACCESSES)] - */ - uint64_t virtualize_x2apic_mode : 1; -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_X2APIC_MODE_BIT 4 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_X2APIC_MODE_FLAG 0x10 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_X2APIC_MODE_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUALIZE_X2APIC_MODE(_) (((_) >> 4) & 0x01) - - /** - * @brief VPID supported/enabled - * - * [Bit 5] If this control is 1, cached translations of linear addresses are associated with a virtualprocessor identifier - * (VPID). - * - * @see Vol3C[28.1(VIRTUAL PROCESSOR IDENTIFIERS (VPIDS))] - */ - uint64_t enable_vpid : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VPID_BIT 5 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VPID_FLAG 0x20 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VPID_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VPID(_) (((_) >> 5) & 0x01) - - /** - * @brief VM-exit when executing the WBINVD instruction - * - * [Bit 6] This control determines whether executions of WBINVD cause VM exits. - */ - uint64_t wbinvd_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_WBINVD_EXITING_BIT 6 -#define IA32_VMX_PROCBASED_CTLS2_WBINVD_EXITING_FLAG 0x40 -#define IA32_VMX_PROCBASED_CTLS2_WBINVD_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_WBINVD_EXITING(_) (((_) >> 6) & 0x01) - - /** - * @brief Unrestricted guest execution - * - * [Bit 7] This control determines whether guest software may run in unpaged protected mode or in realaddress mode. - */ - uint64_t unrestricted_guest : 1; -#define IA32_VMX_PROCBASED_CTLS2_UNRESTRICTED_GUEST_BIT 7 -#define IA32_VMX_PROCBASED_CTLS2_UNRESTRICTED_GUEST_FLAG 0x80 -#define IA32_VMX_PROCBASED_CTLS2_UNRESTRICTED_GUEST_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_UNRESTRICTED_GUEST(_) (((_) >> 7) & 0x01) - - /** - * @brief APIC register virtualization - * - * [Bit 8] If this control is 1, the logical processor virtualizes certain APIC accesses. - * - * @see Vol3C[29.4(VIRTUALIZING MEMORY-MAPPED APIC ACCESSES)] - * @see Vol3C[29.5(VIRTUALIZING MSR-BASED APIC ACCESSES)] - */ - uint64_t apic_register_virtualization : 1; -#define IA32_VMX_PROCBASED_CTLS2_APIC_REGISTER_VIRTUALIZATION_BIT 8 -#define IA32_VMX_PROCBASED_CTLS2_APIC_REGISTER_VIRTUALIZATION_FLAG 0x100 -#define IA32_VMX_PROCBASED_CTLS2_APIC_REGISTER_VIRTUALIZATION_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_APIC_REGISTER_VIRTUALIZATION(_) (((_) >> 8) & 0x01) - - /** - * @brief Virtual-interrupt delivery - * - * [Bit 9] This controls enables the evaluation and delivery of pending virtual interrupts as well as the emulation of - * writes to the APIC registers that control interrupt prioritization. - */ - uint64_t virtual_interrupt_delivery : 1; -#define IA32_VMX_PROCBASED_CTLS2_VIRTUAL_INTERRUPT_DELIVERY_BIT 9 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUAL_INTERRUPT_DELIVERY_FLAG 0x200 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUAL_INTERRUPT_DELIVERY_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_VIRTUAL_INTERRUPT_DELIVERY(_) (((_) >> 9) & 0x01) - - /** - * @brief A specified number of pause loops cause a VM-exit - * - * [Bit 10] This control determines whether a series of executions of PAUSE can cause a VM exit. - * - * @see Vol3C[24.6.13(Controls for PAUSE-Loop Exiting)] - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ - uint64_t pause_loop_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_PAUSE_LOOP_EXITING_BIT 10 -#define IA32_VMX_PROCBASED_CTLS2_PAUSE_LOOP_EXITING_FLAG 0x400 -#define IA32_VMX_PROCBASED_CTLS2_PAUSE_LOOP_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_PAUSE_LOOP_EXITING(_) (((_) >> 10) & 0x01) - - /** - * @brief VM-exit when executing RDRAND instructions - * - * [Bit 11] This control determines whether executions of RDRAND cause VM exits. - */ - uint64_t rdrand_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_RDRAND_EXITING_BIT 11 -#define IA32_VMX_PROCBASED_CTLS2_RDRAND_EXITING_FLAG 0x800 -#define IA32_VMX_PROCBASED_CTLS2_RDRAND_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_RDRAND_EXITING(_) (((_) >> 11) & 0x01) - - /** - * @brief Enables INVPCID instructions - * - * [Bit 12] If this control is 0, any execution of INVPCID causes a \#UD. - */ - uint64_t enable_invpcid : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_INVPCID_BIT 12 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_INVPCID_FLAG 0x1000 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_INVPCID_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_INVPCID(_) (((_) >> 12) & 0x01) - - /** - * @brief Enables VMFUNC instructions - * - * [Bit 13] Setting this control to 1 enables use of the VMFUNC instruction in VMX non-root operation. - * - * @see Vol3C[25.5.5(VM Functions)] - */ - uint64_t enable_vm_functions : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VM_FUNCTIONS_BIT 13 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VM_FUNCTIONS_FLAG 0x2000 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VM_FUNCTIONS_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_VM_FUNCTIONS(_) (((_) >> 13) & 0x01) - - /** - * @brief Enables VMCS shadowing - * - * [Bit 14] If this control is 1, executions of VMREAD and VMWRITE in VMX non-root operation may access a shadow VMCS - * (instead of causing VM exits). - * - * @see {'Vol3C[24.10(VMCS TYPES': 'ORDINARY AND SHADOW)]'} - * @see Vol3C[30.3(VMX INSTRUCTIONS)] - */ - uint64_t vmcs_shadowing : 1; -#define IA32_VMX_PROCBASED_CTLS2_VMCS_SHADOWING_BIT 14 -#define IA32_VMX_PROCBASED_CTLS2_VMCS_SHADOWING_FLAG 0x4000 -#define IA32_VMX_PROCBASED_CTLS2_VMCS_SHADOWING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_VMCS_SHADOWING(_) (((_) >> 14) & 0x01) - - /** - * @brief Enables ENCLS VM-exits - * - * [Bit 15] If this control is 1, executions of ENCLS consult the ENCLS-exiting bitmap to determine whether the instruction - * causes a VM exit. - * - * @see Vol3C[24.6.16(ENCLS-Exiting Bitmap)] - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ - uint64_t enable_encls_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_ENCLS_EXITING_BIT 15 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_ENCLS_EXITING_FLAG 0x8000 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_ENCLS_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_ENCLS_EXITING(_) (((_) >> 15) & 0x01) - - /** - * @brief VM-exit when executing RDSEED - * - * [Bit 16] This control determines whether executions of RDSEED cause VM exits. - */ - uint64_t rdseed_exiting : 1; -#define IA32_VMX_PROCBASED_CTLS2_RDSEED_EXITING_BIT 16 -#define IA32_VMX_PROCBASED_CTLS2_RDSEED_EXITING_FLAG 0x10000 -#define IA32_VMX_PROCBASED_CTLS2_RDSEED_EXITING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_RDSEED_EXITING(_) (((_) >> 16) & 0x01) - - /** - * @brief Enables page-modification logging - * - * [Bit 17] If this control is 1, an access to a guest-physical address that sets an EPT dirty bit first adds an entry to - * the page-modification log. - * - * @see Vol3C[28.2.5(Page-Modification Logging)] - */ - uint64_t enable_pml : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_PML_BIT 17 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_PML_FLAG 0x20000 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_PML_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_PML(_) (((_) >> 17) & 0x01) - - /** - * @brief Controls whether EPT-violations may cause - * - * [Bit 18] If this control is 1, EPT violations may cause virtualization exceptions (\#VE) instead of VM exits. - * - * @see Vol3C[25.5.6(Virtualization Exceptions)] - */ - uint64_t ept_violation : 1; -#define IA32_VMX_PROCBASED_CTLS2_EPT_VIOLATION_BIT 18 -#define IA32_VMX_PROCBASED_CTLS2_EPT_VIOLATION_FLAG 0x40000 -#define IA32_VMX_PROCBASED_CTLS2_EPT_VIOLATION_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_EPT_VIOLATION(_) (((_) >> 18) & 0x01) - - /** - * @brief Conceal VMX non-root operation from Intel processor trace (PT) - * - * [Bit 19] If this control is 1, Intel Processor Trace suppresses from PIPs an indication that the processor was in VMX - * non-root operation and omits a VMCS packet from any PSB+ produced in VMX nonroot operation. - * - * @see Vol3C[35(INTEL(R) PROCESSOR TRACE)] - */ - uint64_t conceal_vmx_from_pt : 1; -#define IA32_VMX_PROCBASED_CTLS2_CONCEAL_VMX_FROM_PT_BIT 19 -#define IA32_VMX_PROCBASED_CTLS2_CONCEAL_VMX_FROM_PT_FLAG 0x80000 -#define IA32_VMX_PROCBASED_CTLS2_CONCEAL_VMX_FROM_PT_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_CONCEAL_VMX_FROM_PT(_) (((_) >> 19) & 0x01) - - /** - * @brief Enables XSAVES/XRSTORS instructions - * - * [Bit 20] If this control is 0, any execution of XSAVES or XRSTORS causes a \#UD. - */ - uint64_t enable_xsaves : 1; -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_XSAVES_BIT 20 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_XSAVES_FLAG 0x100000 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_XSAVES_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_ENABLE_XSAVES(_) (((_) >> 20) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 22] If this control is 1, EPT execute permissions are based on whether the linear address being accessed is - * supervisor mode or user mode. - * - * @see Vol3C[28(VMX SUPPORT FOR ADDRESS TRANSLATION)] - */ - uint64_t mode_based_execute_control_for_ept : 1; -#define IA32_VMX_PROCBASED_CTLS2_MODE_BASED_EXECUTE_CONTROL_FOR_EPT_BIT 22 -#define IA32_VMX_PROCBASED_CTLS2_MODE_BASED_EXECUTE_CONTROL_FOR_EPT_FLAG 0x400000 -#define IA32_VMX_PROCBASED_CTLS2_MODE_BASED_EXECUTE_CONTROL_FOR_EPT_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_MODE_BASED_EXECUTE_CONTROL_FOR_EPT(_) (((_) >> 22) & 0x01) - uint64_t reserved2 : 2; - - /** - * @brief Use TSC scaling - * - * [Bit 25] This control determines whether executions of RDTSC, executions of RDTSCP, and executions of RDMSR that read - * from the IA32_TIME_STAMP_COUNTER MSR return a value modified by the TSC multiplier field. - * - * @see Vol3C[24.6.5(Time-Stamp Counter Offset and Multiplier)] - * @see Vol3C[25.3(CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION)] - */ - uint64_t use_tsc_scaling : 1; -#define IA32_VMX_PROCBASED_CTLS2_USE_TSC_SCALING_BIT 25 -#define IA32_VMX_PROCBASED_CTLS2_USE_TSC_SCALING_FLAG 0x2000000 -#define IA32_VMX_PROCBASED_CTLS2_USE_TSC_SCALING_MASK 0x01 -#define IA32_VMX_PROCBASED_CTLS2_USE_TSC_SCALING(_) (((_) >> 25) & 0x01) - uint64_t reserved3 : 38; - }; - - uint64_t flags; -} ia32_vmx_procbased_ctls2_register; - - -/** - * Capability Reporting Register of EPT and VPID. - * - * @remarks If ( CPUID.01H:ECX.[5] && IA32_VMX_PROCBASED_CTLS[63] && (IA32_VMX_PROCBASED_CTLS2[33] || - * IA32_VMX_PROCBASED_CTLS2[37]) ) - * @see Vol3D[A.10(VPID AND EPT CAPABILITIES)] - * @see Vol3D[A.10(VPID and EPT Capabilities)] (reference) - */ -#define IA32_VMX_EPT_VPID_CAP 0x0000048C -typedef union -{ - struct - { - /** - * [Bit 0] When set to 1, the processor supports execute-only translations by EPT. This support allows software to - * configure EPT paging-structure entries in which bits 1:0 are clear (indicating that data accesses are not allowed) and - * bit 2 is set (indicating that instruction fetches are allowed). - */ - uint64_t execute_only_pages : 1; -#define IA32_VMX_EPT_VPID_CAP_EXECUTE_ONLY_PAGES_BIT 0 -#define IA32_VMX_EPT_VPID_CAP_EXECUTE_ONLY_PAGES_FLAG 0x01 -#define IA32_VMX_EPT_VPID_CAP_EXECUTE_ONLY_PAGES_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_EXECUTE_ONLY_PAGES(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 5; - - /** - * [Bit 6] Indicates support for a page-walk length of 4. - */ - uint64_t page_walk_length_4 : 1; -#define IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4_BIT 6 -#define IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4_FLAG 0x40 -#define IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_PAGE_WALK_LENGTH_4(_) (((_) >> 6) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 8] When set to 1, the logical processor allows software to configure the EPT paging-structure memory type to be - * uncacheable (UC). - * - * @see Vol3C[24.6.11(Extended-Page-Table Pointer (EPTP))] - */ - uint64_t memory_type_uncacheable : 1; -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_UNCACHEABLE_BIT 8 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_UNCACHEABLE_FLAG 0x100 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_UNCACHEABLE_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_UNCACHEABLE(_) (((_) >> 8) & 0x01) - uint64_t reserved3 : 5; - - /** - * [Bit 14] When set to 1, the logical processor allows software to configure the EPT paging-structure memory type to be - * write-back (WB). - */ - uint64_t memory_type_write_back : 1; -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_WRITE_BACK_BIT 14 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_WRITE_BACK_FLAG 0x4000 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_WRITE_BACK_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_MEMORY_TYPE_WRITE_BACK(_) (((_) >> 14) & 0x01) - uint64_t reserved4 : 1; - - /** - * [Bit 16] When set to 1, the logical processor allows software to configure a EPT PDE to map a 2-Mbyte page (by setting - * bit 7 in the EPT PDE). - */ - uint64_t pde_2mb_pages : 1; -#define IA32_VMX_EPT_VPID_CAP_PDE_2MB_PAGES_BIT 16 -#define IA32_VMX_EPT_VPID_CAP_PDE_2MB_PAGES_FLAG 0x10000 -#define IA32_VMX_EPT_VPID_CAP_PDE_2MB_PAGES_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_PDE_2MB_PAGES(_) (((_) >> 16) & 0x01) - - /** - * [Bit 17] When set to 1, the logical processor allows software to configure a EPT PDPTE to map a 1-Gbyte page (by setting - * bit 7 in the EPT PDPTE). - */ - uint64_t pdpte_1gb_pages : 1; -#define IA32_VMX_EPT_VPID_CAP_PDPTE_1GB_PAGES_BIT 17 -#define IA32_VMX_EPT_VPID_CAP_PDPTE_1GB_PAGES_FLAG 0x20000 -#define IA32_VMX_EPT_VPID_CAP_PDPTE_1GB_PAGES_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_PDPTE_1GB_PAGES(_) (((_) >> 17) & 0x01) - uint64_t reserved5 : 2; - - /** - * [Bit 20] If bit 20 is read as 1, the INVEPT instruction is supported. - * - * @see Vol3C[30(VMX INSTRUCTION REFERENCE)] - * @see Vol3C[28.3.3.1(Operations that Invalidate Cached Mappings)] - */ - uint64_t invept : 1; -#define IA32_VMX_EPT_VPID_CAP_INVEPT_BIT 20 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_FLAG 0x100000 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVEPT(_) (((_) >> 20) & 0x01) - - /** - * [Bit 21] When set to 1, accessed and dirty flags for EPT are supported. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t ept_accessed_and_dirty_flags : 1; -#define IA32_VMX_EPT_VPID_CAP_EPT_ACCESSED_AND_DIRTY_FLAGS_BIT 21 -#define IA32_VMX_EPT_VPID_CAP_EPT_ACCESSED_AND_DIRTY_FLAGS_FLAG 0x200000 -#define IA32_VMX_EPT_VPID_CAP_EPT_ACCESSED_AND_DIRTY_FLAGS_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_EPT_ACCESSED_AND_DIRTY_FLAGS(_) (((_) >> 21) & 0x01) - - /** - * [Bit 22] When set to 1, the processor reports advanced VM-exit information for EPT violations. This reporting is done - * only if this bit is read as 1. - * - * @see Vol3C[27.2.1(Basic VM-Exit Information)] - */ - uint64_t advanced_vmexit_ept_violations_information : 1; -#define IA32_VMX_EPT_VPID_CAP_ADVANCED_VMEXIT_EPT_VIOLATIONS_INFORMATION_BIT 22 -#define IA32_VMX_EPT_VPID_CAP_ADVANCED_VMEXIT_EPT_VIOLATIONS_INFORMATION_FLAG 0x400000 -#define IA32_VMX_EPT_VPID_CAP_ADVANCED_VMEXIT_EPT_VIOLATIONS_INFORMATION_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_ADVANCED_VMEXIT_EPT_VIOLATIONS_INFORMATION(_) (((_) >> 22) & 0x01) - uint64_t reserved6 : 2; - - /** - * [Bit 25] When set to 1, the single-context INVEPT type is supported. - * - * @see Vol3C[30(VMX INSTRUCTION REFERENCE)] - * @see Vol3C[28.3.3.1(Operations that Invalidate Cached Mappings)] - */ - uint64_t invept_single_context : 1; -#define IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT_BIT 25 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT_FLAG 0x2000000 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_SINGLE_CONTEXT(_) (((_) >> 25) & 0x01) - - /** - * [Bit 26] When set to 1, the all-context INVEPT type is supported. - * - * @see Vol3C[30(VMX INSTRUCTION REFERENCE)] - * @see Vol3C[28.3.3.1(Operations that Invalidate Cached Mappings)] - */ - uint64_t invept_all_contexts : 1; -#define IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS_BIT 26 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS_FLAG 0x4000000 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVEPT_ALL_CONTEXTS(_) (((_) >> 26) & 0x01) - uint64_t reserved7 : 5; - - /** - * [Bit 32] When set to 1, the INVVPID instruction is supported. - */ - uint64_t invvpid : 1; -#define IA32_VMX_EPT_VPID_CAP_INVVPID_BIT 32 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_FLAG 0x100000000 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVVPID(_) (((_) >> 32) & 0x01) - uint64_t reserved8 : 7; - - /** - * [Bit 40] When set to 1, the individual-address INVVPID type is supported. - */ - uint64_t invvpid_individual_address : 1; -#define IA32_VMX_EPT_VPID_CAP_INVVPID_INDIVIDUAL_ADDRESS_BIT 40 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_INDIVIDUAL_ADDRESS_FLAG 0x10000000000 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_INDIVIDUAL_ADDRESS_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_INDIVIDUAL_ADDRESS(_) (((_) >> 40) & 0x01) - - /** - * [Bit 41] When set to 1, the single-context INVVPID type is supported. - */ - uint64_t invvpid_single_context : 1; -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_BIT 41 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_FLAG 0x20000000000 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT(_) (((_) >> 41) & 0x01) - - /** - * [Bit 42] When set to 1, the all-context INVVPID type is supported. - */ - uint64_t invvpid_all_contexts : 1; -#define IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS_BIT 42 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS_FLAG 0x40000000000 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_ALL_CONTEXTS(_) (((_) >> 42) & 0x01) - - /** - * [Bit 43] When set to 1, the single-context-retaining-globals INVVPID type is supported. - */ - uint64_t invvpid_single_context_retain_globals : 1; -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS_BIT 43 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS_FLAG 0x80000000000 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS_MASK 0x01 -#define IA32_VMX_EPT_VPID_CAP_INVVPID_SINGLE_CONTEXT_RETAIN_GLOBALS(_) (((_) >> 43) & 0x01) - uint64_t reserved9 : 20; - }; - - uint64_t flags; -} ia32_vmx_ept_vpid_cap_register; - -/** - * @defgroup ia32_vmx_true_ctls \ - * IA32_VMX_TRUE_(x)_CTLS - * - * Capability Reporting Register of Pin-Based VM-Execution Flex Controls, Primary Processor-Based VM-Execution Flex - * Controls, VM-Exit Flex Controls and VM-Entry Flex Controls. - * - * @remarks If ( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ) - * @see Vol3D[A.3.1(Pin-Based VM-Execution Controls)] - * @see Vol3D[A.3.2(Primary Processor-Based VM-Execution Controls)] - * @see Vol3D[A.4(VM-EXIT CONTROLS)] - * @see Vol3D[A.5(VM-ENTRY CONTROLS)] - * @see Vol3D[A.3.1(Pin-Based VMExecution Controls)] (reference) - * @see Vol3D[A.3.2(Primary Processor-Based VM-Execution Controls)] (reference) - * @see Vol3D[A.4(VM-Exit Controls)] (reference) - * @see Vol3D[A.5(VM-Entry Controls)] (reference) - * @{ - */ -#define IA32_VMX_TRUE_PINBASED_CTLS 0x0000048D -#define IA32_VMX_TRUE_PROCBASED_CTLS 0x0000048E -#define IA32_VMX_TRUE_EXIT_CTLS 0x0000048F -#define IA32_VMX_TRUE_ENTRY_CTLS 0x00000490 -typedef union -{ - struct - { - /** - * [Bits 31:0] Indicate the allowed 0-settings of these controls. VM entry allows control X to be 0 if bit X in the MSR is - * cleared to 0; if bit X in the MSR is set to 1, VM entry fails if control X is 0. - */ - uint64_t allowed_0_settings : 32; -#define IA32_VMX_TRUE_CTLS_ALLOWED_0_SETTINGS_BIT 0 -#define IA32_VMX_TRUE_CTLS_ALLOWED_0_SETTINGS_FLAG 0xFFFFFFFF -#define IA32_VMX_TRUE_CTLS_ALLOWED_0_SETTINGS_MASK 0xFFFFFFFF -#define IA32_VMX_TRUE_CTLS_ALLOWED_0_SETTINGS(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * [Bits 63:32] Indicate the allowed 1-settings of these controls. VM entry allows control X to be 1 if bit 32+X in the MSR - * is set to 1; if bit 32+X in the MSR is cleared to 0, VM entry fails if control X is 1. - */ - uint64_t allowed_1_settings : 32; -#define IA32_VMX_TRUE_CTLS_ALLOWED_1_SETTINGS_BIT 32 -#define IA32_VMX_TRUE_CTLS_ALLOWED_1_SETTINGS_FLAG 0xFFFFFFFF00000000 -#define IA32_VMX_TRUE_CTLS_ALLOWED_1_SETTINGS_MASK 0xFFFFFFFF -#define IA32_VMX_TRUE_CTLS_ALLOWED_1_SETTINGS(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_vmx_true_ctls_register; - -/** - * @} - */ - - - /** - * Capability Reporting Register of VMFunction Controls. - * - * @remarks If ( CPUID.01H:ECX.[5] = 1 && IA32_VMX_BASIC[55] ) - * @see Vol3D[A.11(VM FUNCTIONS)] - * @see Vol3D[24.6.14(VM-Function Controls)] (reference) - */ -#define IA32_VMX_VMFUNC 0x00000491 -typedef union -{ - struct - { - /** - * [Bit 0] The EPTP-switching VM function changes the EPT pointer to a value chosen from the EPTP list. - * - * @see Vol3C[25.5.5.3(EPTP Switching)] - */ - uint64_t eptp_switching : 1; -#define IA32_VMX_VMFUNC_EPTP_SWITCHING_BIT 0 -#define IA32_VMX_VMFUNC_EPTP_SWITCHING_FLAG 0x01 -#define IA32_VMX_VMFUNC_EPTP_SWITCHING_MASK 0x01 -#define IA32_VMX_VMFUNC_EPTP_SWITCHING(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_vmx_vmfunc_register; - -/** - * @defgroup ia32_a_pmc \ - * IA32_A_PMC(n) - * - * Full Width Writable IA32_PMC(n) Alias. - * - * @remarks (If CPUID.0AH: EAX[15:8] > 0) && IA32_PERF_CAPABILITIES[13] = 1 - * @{ - */ -#define IA32_A_PMC0 0x000004C1 -#define IA32_A_PMC1 0x000004C2 -#define IA32_A_PMC2 0x000004C3 -#define IA32_A_PMC3 0x000004C4 -#define IA32_A_PMC4 0x000004C5 -#define IA32_A_PMC5 0x000004C6 -#define IA32_A_PMC6 0x000004C7 -#define IA32_A_PMC7 0x000004C8 - /** - * @} - */ - - - /** - * Allows software to signal some MCEs to only a single logical processor in the system. - * - * @remarks If IA32_MCG_CAP.LMCE_P = 1 - * @see Vol3B[15.3.1.4(IA32_MCG_EXT_CTL MSR)] - */ -#define IA32_MCG_EXT_CTL 0x000004D0 -typedef union -{ - struct - { - uint64_t lmce_en : 1; -#define IA32_MCG_EXT_CTL_LMCE_EN_BIT 0 -#define IA32_MCG_EXT_CTL_LMCE_EN_FLAG 0x01 -#define IA32_MCG_EXT_CTL_LMCE_EN_MASK 0x01 -#define IA32_MCG_EXT_CTL_LMCE_EN(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_mcg_ext_ctl_register; - - -/** - * @brief Status and SVN Threshold of SGX Support for ACM (RO) - * - * Intel SGX only allows launching ACMs with an Intel SGX SVN that is at the same level or higher than the expected Intel - * SGX SVN. The expected Intel SGX SVN is specified by BIOS and locked down by the processor on the first successful - * execution of an Intel SGX instruction that doesn't return an error code. Intel SGX provides interfaces for system - * software to discover whether a non faulting Intel SGX instruction has been executed, and evaluate the suitability of the - * Intel SGX SVN value of any ACM that is expected to be launched by the OS or the VMM. - * - * @remarks If CPUID.(EAX=07H, ECX=0H): EBX[2] = 1 - * @see Vol3D[41.11.3(Interactions with Authenticated Code Modules (ACMs))] (reference) - */ -#define IA32_SGX_SVN_STATUS 0x00000500 -typedef union -{ - struct - { - /** - * [Bit 0] - If 1, indicates that a non-faulting Intel SGX instruction has been executed, consequently, launching a - * properly signed ACM but with Intel SGX SVN value less than the BIOS specified Intel SGX SVN threshold would lead to an - * TXT shutdown. - * - If 0, indicates that the processor will allow a properly signed ACM to launch irrespective of the Intel SGX SVN value - * of the ACM. - * - * @see Vol3D[41.11.3(Interactions with Authenticated Code Modules (ACMs))] - */ - uint64_t lock : 1; -#define IA32_SGX_SVN_STATUS_LOCK_BIT 0 -#define IA32_SGX_SVN_STATUS_LOCK_FLAG 0x01 -#define IA32_SGX_SVN_STATUS_LOCK_MASK 0x01 -#define IA32_SGX_SVN_STATUS_LOCK(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 15; - - /** - * @brief Reflects the expected threshold of Intel SGX SVN for the SINIT ACM - * - * [Bits 23:16] - If CPUID.01H:ECX.SMX = 1, this field reflects the expected threshold of Intel SGX SVN for the SINIT ACM. - * - If CPUID.01H:ECX.SMX = 0, this field is reserved (0). - * - * @see Vol3D[41.11.3(Interactions with Authenticated Code Modules (ACMs))] - */ - uint64_t sgx_svn_sinit : 8; -#define IA32_SGX_SVN_STATUS_SGX_SVN_SINIT_BIT 16 -#define IA32_SGX_SVN_STATUS_SGX_SVN_SINIT_FLAG 0xFF0000 -#define IA32_SGX_SVN_STATUS_SGX_SVN_SINIT_MASK 0xFF -#define IA32_SGX_SVN_STATUS_SGX_SVN_SINIT(_) (((_) >> 16) & 0xFF) - uint64_t reserved2 : 40; - }; - - uint64_t flags; -} ia32_sgx_svn_status_register; - - -/** - * Trace Output Base Register. - * - * @remarks 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) ) ) - * @see Vol3C[35.2.7.7(IA32_RTIT_OUTPUT_BASE MSR)] (reference) - */ -#define IA32_RTIT_OUTPUT_BASE 0x00000560 -typedef union -{ - struct - { - uint64_t reserved1 : 7; - - /** - * @brief Base physical address - * - * [Bits 47:7] The base physical address. How this address is used depends on the value of IA32_RTIT_CTL.ToPA: - * - 0: This is the base physical address of a single, contiguous physical output region. This could be mapped to DRAM or - * to MMIO, depending on the value. The base address should be aligned with the size of the region, such that none of the - * 1s in the mask value overlap with 1s in the base address. If the base is not aligned, an operational error will result. - * - 1: The base physical address of the current ToPA table. The address must be 4K aligned. Writing an address in which - * bits 11:7 are non-zero will not cause a \#GP, but an operational error will be signaled once TraceEn is set. - * - * @see Vol3C[35.2.7.8(IA32_RTIT_OUTPUT_MASK_PTRS MSR)] - * @see Vol3C[35.3.9(Operational Errors)] - * @see Vol3C[35.2.6.2(Table of Physical Addresses (ToPA))] - */ - uint64_t base_physical_address : 41; -#define IA32_RTIT_OUTPUT_BASE_BASE_PHYSICAL_ADDRESS_BIT 7 -#define IA32_RTIT_OUTPUT_BASE_BASE_PHYSICAL_ADDRESS_FLAG 0xFFFFFFFFFF80 -#define IA32_RTIT_OUTPUT_BASE_BASE_PHYSICAL_ADDRESS_MASK 0x1FFFFFFFFFF -#define IA32_RTIT_OUTPUT_BASE_BASE_PHYSICAL_ADDRESS(_) (((_) >> 7) & 0x1FFFFFFFFFF) - uint64_t reserved2 : 16; - }; - - uint64_t flags; -} ia32_rtit_output_base_register; - - -/** - * Trace Output Mask Pointers Register. - * - * @remarks 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) ) ) - * @see Vol3C[35.2.7.8(IA32_RTIT_OUTPUT_MASK_PTRS MSR)] (reference) - */ -#define IA32_RTIT_OUTPUT_MASK_PTRS 0x00000561 -typedef union -{ - struct - { - /** - * [Bits 6:0] Forced to 1, writes are ignored. - */ - uint64_t lower_mask : 7; -#define IA32_RTIT_OUTPUT_MASK_PTRS_LOWER_MASK_BIT 0 -#define IA32_RTIT_OUTPUT_MASK_PTRS_LOWER_MASK_FLAG 0x7F -#define IA32_RTIT_OUTPUT_MASK_PTRS_LOWER_MASK_MASK 0x7F -#define IA32_RTIT_OUTPUT_MASK_PTRS_LOWER_MASK(_) (((_) >> 0) & 0x7F) - - /** - * @brief MaskOrTableOffset - * - * [Bits 31:7] The use of this field depends on the value of IA32_RTIT_CTL.ToPA: - * - 0: This field holds bits 31:7 of the mask value for the single, contiguous physical output region. The size of this - * field indicates that regions can be of size 128B up to 4GB. This value (combined with the lower 7 bits, which are - * reserved to 1) will be ANDed with the OutputOffset field to determine the next write address. All 1s in this field - * should be consecutive and starting at bit 7, otherwise the region will not be contiguous, and an operational error will - * be signaled when TraceEn is set. - * - 1: This field holds bits 27:3 of the offset pointer into the current ToPA table. This value can be added to the - * IA32_RTIT_OUTPUT_BASE value to produce a pointer to the current ToPA table entry, which itself is a pointer to the - * current output region. In this scenario, the lower 7 reserved bits are ignored. This field supports tables up to 256 - * MBytes in size. - * - * @see Vol3C[35.3.9(Operational Errors)] - */ - uint64_t mask_or_table_offset : 25; -#define IA32_RTIT_OUTPUT_MASK_PTRS_MASK_OR_TABLE_OFFSET_BIT 7 -#define IA32_RTIT_OUTPUT_MASK_PTRS_MASK_OR_TABLE_OFFSET_FLAG 0xFFFFFF80 -#define IA32_RTIT_OUTPUT_MASK_PTRS_MASK_OR_TABLE_OFFSET_MASK 0x1FFFFFF -#define IA32_RTIT_OUTPUT_MASK_PTRS_MASK_OR_TABLE_OFFSET(_) (((_) >> 7) & 0x1FFFFFF) - - /** - * @brief Output Offset - * - * [Bits 63:32] The use of this field depends on the value of IA32_RTIT_CTL.ToPA: - * - 0: This is bits 31:0 of the offset pointer into the single, contiguous physical output region. This value will be - * added to the IA32_RTIT_OUTPUT_BASE value to form the physical address at which the next byte of packet output data will - * be written. This value must be less than or equal to the MaskOrTableOffset field, otherwise an operational error will be - * signaled when TraceEn is set. - * - 1: This field holds bits 31:0 of the offset pointer into the current ToPA output region. This value will be added to - * the output region base field, found in the current ToPA table entry, to form the physical address at which the next byte - * of trace output data will be written. This value must be less than the ToPA entry size, otherwise an operational error - * will be signaled when TraceEn is set. - * - * @see Vol3C[35.3.9(Operational Errors)] - */ - uint64_t output_offset : 32; -#define IA32_RTIT_OUTPUT_MASK_PTRS_OUTPUT_OFFSET_BIT 32 -#define IA32_RTIT_OUTPUT_MASK_PTRS_OUTPUT_OFFSET_FLAG 0xFFFFFFFF00000000 -#define IA32_RTIT_OUTPUT_MASK_PTRS_OUTPUT_OFFSET_MASK 0xFFFFFFFF -#define IA32_RTIT_OUTPUT_MASK_PTRS_OUTPUT_OFFSET(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_rtit_output_mask_ptrs_register; - - -/** - * Trace Control Register. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1) - * @see Vol3C[35.2.7.2(IA32_RTIT_CTL MSR)] (reference) - */ -#define IA32_RTIT_CTL 0x00000570 -typedef union -{ - struct - { - /** - * @brief TraceEn - * - * [Bit 0] If 1, enables tracing; else tracing is disabled. - * When this bit transitions from 1 to 0, all buffered packets are flushed out of internal buffers. A further store, fence, - * or architecturally serializing instruction may be required to ensure that packet data can be observed at the trace - * endpoint. - * Note that the processor will clear this bit on \#SMI (Section) and warm reset. Other MSR bits of IA32_RTIT_CTL (and - * other trace configuration MSRs) are not impacted by these events. - * - * @see Vol3C[35.2.7.3(Enabling and Disabling Packet Generation with TraceEn)] - */ - uint64_t trace_enabled : 1; -#define IA32_RTIT_CTL_TRACE_ENABLED_BIT 0 -#define IA32_RTIT_CTL_TRACE_ENABLED_FLAG 0x01 -#define IA32_RTIT_CTL_TRACE_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_TRACE_ENABLED(_) (((_) >> 0) & 0x01) - - /** - * @brief CYCEn - * - * [Bit 1] - 0: Disables CYC Packet. - * - 1: Enables CYC Packet. - * - * @remarks If CPUID.(EAX=14H, ECX=0):EBX.CPSB_CAM[bit 1] = 0 - * @see Vol3C[35.4.2.14(Cycle Count (CYC) Packet)] - */ - uint64_t cyc_enabled : 1; -#define IA32_RTIT_CTL_CYC_ENABLED_BIT 1 -#define IA32_RTIT_CTL_CYC_ENABLED_FLAG 0x02 -#define IA32_RTIT_CTL_CYC_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_CYC_ENABLED(_) (((_) >> 1) & 0x01) - - /** - * @brief OS - * - * [Bit 2] - 0: Packet generation is disabled when CPL = 0. - * - 1: Packet generation may be enabled when CPL = 0. - */ - uint64_t os : 1; -#define IA32_RTIT_CTL_OS_BIT 2 -#define IA32_RTIT_CTL_OS_FLAG 0x04 -#define IA32_RTIT_CTL_OS_MASK 0x01 -#define IA32_RTIT_CTL_OS(_) (((_) >> 2) & 0x01) - - /** - * @brief User - * - * [Bit 3] - 0: Packet generation is disabled when CPL > 0. - * - 1: Packet generation may be enabled when CPL > 0. - */ - uint64_t user : 1; -#define IA32_RTIT_CTL_USER_BIT 3 -#define IA32_RTIT_CTL_USER_FLAG 0x08 -#define IA32_RTIT_CTL_USER_MASK 0x01 -#define IA32_RTIT_CTL_USER(_) (((_) >> 3) & 0x01) - - /** - * @brief PwrEvtEn - * - * [Bit 4] - 0: Power Event Trace packets are disabled. - * - 1: Power Event Trace packets are enabled. - * - * @see Vol3C[35.2.3(Power Event Tracing)] - */ - uint64_t power_event_trace_enabled : 1; -#define IA32_RTIT_CTL_POWER_EVENT_TRACE_ENABLED_BIT 4 -#define IA32_RTIT_CTL_POWER_EVENT_TRACE_ENABLED_FLAG 0x10 -#define IA32_RTIT_CTL_POWER_EVENT_TRACE_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_POWER_EVENT_TRACE_ENABLED(_) (((_) >> 4) & 0x01) - - /** - * @brief FUPonPTW - * - * [Bit 5] - 0: PTW packets are not followed by FUPs. - * - 1: PTW packets are followed by FUPs. - */ - uint64_t fup_on_ptw : 1; -#define IA32_RTIT_CTL_FUP_ON_PTW_BIT 5 -#define IA32_RTIT_CTL_FUP_ON_PTW_FLAG 0x20 -#define IA32_RTIT_CTL_FUP_ON_PTW_MASK 0x01 -#define IA32_RTIT_CTL_FUP_ON_PTW(_) (((_) >> 5) & 0x01) - - /** - * @brief FabricEn - * - * [Bit 6] - 0: Trace output is directed to the memory subsystem, mechanism depends on IA32_RTIT_CTL.ToPA. - * - 1: Trace output is directed to the trace transport subsystem, IA32_RTIT_CTL.ToPA is ignored. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):ECX[3] = 1) Reserved if CPUID.(EAX=14H, ECX=0):ECX[bit 3] = 0 - */ - uint64_t fabric_enabled : 1; -#define IA32_RTIT_CTL_FABRIC_ENABLED_BIT 6 -#define IA32_RTIT_CTL_FABRIC_ENABLED_FLAG 0x40 -#define IA32_RTIT_CTL_FABRIC_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_FABRIC_ENABLED(_) (((_) >> 6) & 0x01) - - /** - * @brief CR3 filter - * - * [Bit 7] - 0: Disables CR3 filtering. - * - 1: Enables CR3 filtering. - */ - uint64_t cr3_filter : 1; -#define IA32_RTIT_CTL_CR3_FILTER_BIT 7 -#define IA32_RTIT_CTL_CR3_FILTER_FLAG 0x80 -#define IA32_RTIT_CTL_CR3_FILTER_MASK 0x01 -#define IA32_RTIT_CTL_CR3_FILTER(_) (((_) >> 7) & 0x01) - - /** - * @brief ToPA - * - * [Bit 8] - 0: Single-range output scheme enabled. - * - 1: ToPA output scheme enabled. - * - * @remarks 0: If CPUID.(EAX=14H, ECX=0):ECX.SNGLRGNOUT[bit 2] = 1 and IA32_RTIT_CTL.FabricEn=0 1: If CPUID.(EAX=14H, - * ECX=0):ECX.TOPA[bit 0] = 1, and IA32_RTIT_CTL.FabricEn=0 - * WRMSR to IA32_RTIT_CTL that sets TraceEn but clears this bit and FabricEn would cause \#GP: If CPUID.(EAX=14H, - * ECX=0):ECX.SNGLRGNOUT[bit 2] = 0 WRMSR to IA32_RTIT_CTL that sets this bit causes \#GP: If CPUID.(EAX=14H, - * ECX=0):ECX.TOPA[bit 0] = 0 - * @see Vol3C[35.2.6.2(Table of Physical Addresses (ToPA))] - */ - uint64_t topa : 1; -#define IA32_RTIT_CTL_TOPA_BIT 8 -#define IA32_RTIT_CTL_TOPA_FLAG 0x100 -#define IA32_RTIT_CTL_TOPA_MASK 0x01 -#define IA32_RTIT_CTL_TOPA(_) (((_) >> 8) & 0x01) - - /** - * @brief MTCEn - * - * [Bit 9] - 0: Disables MTC Packet. - * - 1: Enables MTC Packet. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1) Reserved if CPUID.(EAX=14H, ECX=0):EBX.MTC[bit 3] = 0 - * @see Vol3C[35.4.2.16(Overflow (OVF) Packet)] - */ - uint64_t mtc_enabled : 1; -#define IA32_RTIT_CTL_MTC_ENABLED_BIT 9 -#define IA32_RTIT_CTL_MTC_ENABLED_FLAG 0x200 -#define IA32_RTIT_CTL_MTC_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_MTC_ENABLED(_) (((_) >> 9) & 0x01) - - /** - * @brief TSCEn - * - * [Bit 10] - 0: Disable TSC packets. - * - 1: Enable TSC packets. - * - * @see Vol3C[35.4.2.11(Timestamp Counter (TSC) Packet)] - */ - uint64_t tsc_enabled : 1; -#define IA32_RTIT_CTL_TSC_ENABLED_BIT 10 -#define IA32_RTIT_CTL_TSC_ENABLED_FLAG 0x400 -#define IA32_RTIT_CTL_TSC_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_TSC_ENABLED(_) (((_) >> 10) & 0x01) - - /** - * @brief DisRETC - * - * [Bit 11] - 0: Enable RET compression. - * - 1: Disable RET compression. - * - * @see Vol3C[35.2.1.2(Indirect Transfer COFI)] - */ - uint64_t ret_compression_disabled : 1; -#define IA32_RTIT_CTL_RET_COMPRESSION_DISABLED_BIT 11 -#define IA32_RTIT_CTL_RET_COMPRESSION_DISABLED_FLAG 0x800 -#define IA32_RTIT_CTL_RET_COMPRESSION_DISABLED_MASK 0x01 -#define IA32_RTIT_CTL_RET_COMPRESSION_DISABLED(_) (((_) >> 11) & 0x01) - - /** - * @brief PTWEn - * - * [Bit 12] - 0: PTWRITE packet generation disabled. - * - 1: PTWRITE packet generation enabled. - */ - uint64_t ptw_enabled : 1; -#define IA32_RTIT_CTL_PTW_ENABLED_BIT 12 -#define IA32_RTIT_CTL_PTW_ENABLED_FLAG 0x1000 -#define IA32_RTIT_CTL_PTW_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_PTW_ENABLED(_) (((_) >> 12) & 0x01) - - /** - * @brief BranchEn - * - * [Bit 13] - 0: Disable COFI-based packets. - * - 1: Enable COFI-based packets: FUP, TIP, TIP.PGE, TIP.PGD, TNT, MODE.Exec, MODE.TSX. - * - * @see Vol3C[35.2.5.4(Branch Enable (BranchEn))] - */ - uint64_t branch_enabled : 1; -#define IA32_RTIT_CTL_BRANCH_ENABLED_BIT 13 -#define IA32_RTIT_CTL_BRANCH_ENABLED_FLAG 0x2000 -#define IA32_RTIT_CTL_BRANCH_ENABLED_MASK 0x01 -#define IA32_RTIT_CTL_BRANCH_ENABLED(_) (((_) >> 13) & 0x01) - - /** - * @brief MTCFreq - * - * [Bits 17:14] Defines MTC packet Frequency, which is based on the core crystal clock, or Always Running Timer (ART). MTC - * will be sent each time the selected ART bit toggles. The following Encodings are defined: - * 0: ART(0), 1: ART(1), 2: ART(2), 3: ART(3), 4: ART(4), 5: ART(5), 6: ART(6), 7: ART(7), 8: ART(8), 9: ART(9), 10: - * ART(10), 11: ART(11), 12: ART(12), 13: ART(13), 14: ART(14), 15: ART(15) - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[3] = 1) Reserved if CPUID.(EAX=14H, ECX=0):EBX.MTC[bit 3] = 0 - * @see Vol3C[35.3.1(Detection of Intel Processor Trace and Capability Enumeration)] - */ - uint64_t mtc_frequency : 4; -#define IA32_RTIT_CTL_MTC_FREQUENCY_BIT 14 -#define IA32_RTIT_CTL_MTC_FREQUENCY_FLAG 0x3C000 -#define IA32_RTIT_CTL_MTC_FREQUENCY_MASK 0x0F -#define IA32_RTIT_CTL_MTC_FREQUENCY(_) (((_) >> 14) & 0x0F) - uint64_t reserved1 : 1; - - /** - * @brief CYCThresh - * - * [Bits 22:19] CYC packet threshold. CYC packets will be sent with the first eligible packet after N cycles have passed - * since the last CYC packet. If CycThresh is 0 then N=0, otherwise N is defined as 2(CycThresh-1). The following Encodings - * are defined: - * 0: 0, 1: 1, 2: 2, 3: 4, 4: 8, 5: 16, 6: 32, 7: 64, 8: 128, 9: 256, 10: 512, 11: 1024, 12: 2048, 13: 4096, 14: 8192, 15: - * 16384 - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1) Reserved if CPUID.(EAX=14H, ECX=0):EBX.CPSB_CAM[bit 1] = 0 - * @see Vol3C[35.3.6(Cycle-Accurate Mode)] - * @see Vol3C[35.3.1(Detection of Intel Processor Trace and Capability Enumeration)] - */ - uint64_t cyc_threshold : 4; -#define IA32_RTIT_CTL_CYC_THRESHOLD_BIT 19 -#define IA32_RTIT_CTL_CYC_THRESHOLD_FLAG 0x780000 -#define IA32_RTIT_CTL_CYC_THRESHOLD_MASK 0x0F -#define IA32_RTIT_CTL_CYC_THRESHOLD(_) (((_) >> 19) & 0x0F) - uint64_t reserved2 : 1; - - /** - * @brief PSBFreq - * - * [Bits 27:24] Indicates the frequency of PSB packets. PSB packet frequency is based on the number of Intel PT packet - * bytes output, so this field allows the user to determine the increment of IA32_IA32_RTIT_STATUS.PacketByteCnt that - * should cause a PSB to be generated. Note that PSB insertion is not precise, but the average output bytes per PSB should - * approximate the SW selected period. The following Encodings are defined: - * 0: 2K, 1: 4K, 2: 8K, 3: 16K, 4: 32K, 5: 64K, 6: 128K, 7: 256K, 8: 512K, 9: 1M, 10: 2M, 11: 4M, 12: 8M, 13: 16M, 14: 32M, - * 15: 64M - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[1] = 1) Reserved if CPUID.(EAX=14H, ECX=0):EBX.CPSB_CAM[bit 1] = 0 - * @see Vol3C[35.3.1(Detection of Intel Processor Trace and Capability Enumeration)] - */ - uint64_t psb_frequency : 4; -#define IA32_RTIT_CTL_PSB_FREQUENCY_BIT 24 -#define IA32_RTIT_CTL_PSB_FREQUENCY_FLAG 0xF000000 -#define IA32_RTIT_CTL_PSB_FREQUENCY_MASK 0x0F -#define IA32_RTIT_CTL_PSB_FREQUENCY(_) (((_) >> 24) & 0x0F) - uint64_t reserved3 : 4; - - /** - * @brief ADDR0_CFG - * - * [Bits 35:32] Configures the base/limit register pair IA32_RTIT_ADDR0_A/B based on the following encodings: - * - 0: ADDR0 range unused. - * - 1: The [IA32_RTIT_ADDR0_A..IA32_RTIT_ADDR0_B] range defines a FilterEn range. FilterEn will only be set when the IP is - * within this range, though other FilterEn ranges can additionally be used. - * - 2: The [IA32_RTIT_ADDR0_A..IA32_RTIT_ADDR0_B] range defines a TraceStop range. TraceStop will be asserted if code - * branches into this range. - * - 3..15: Reserved (\#GP). - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 0) Reserved if CPUID.(EAX=14H, ECX=1):EBX.RANGECNT[2:0] >= 0 - * @see Vol3C[35.2.4.3(Filtering by IP)] - * @see Vol3C[35.4.2.10(Core:Bus Ratio (CBR) Packet)] - */ - uint64_t addr0_cfg : 4; -#define IA32_RTIT_CTL_ADDR0_CFG_BIT 32 -#define IA32_RTIT_CTL_ADDR0_CFG_FLAG 0xF00000000 -#define IA32_RTIT_CTL_ADDR0_CFG_MASK 0x0F -#define IA32_RTIT_CTL_ADDR0_CFG(_) (((_) >> 32) & 0x0F) - - /** - * @brief ADDR1_CFG - * - * [Bits 39:36] Configures the base/limit register pair IA32_RTIT_ADDR1_A/B based on the following encodings: - * - 0: ADDR1 range unused. - * - 1: The [IA32_RTIT_ADDR1_A..IA32_RTIT_ADDR1_B] range defines a FilterEn range. FilterEn will only be set when the IP is - * within this range, though other FilterEn ranges can additionally be used. - * - 2: The [IA32_RTIT_ADDR1_A..IA32_RTIT_ADDR1_B] range defines a TraceStop range. TraceStop will be asserted if code - * branches into this range. - * - 3..15: Reserved (\#GP). - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 1) Reserved if CPUID.(EAX=14H, ECX=1):EBX.RANGECNT[2:0] < 2 - * @see Vol3C[35.2.4.3(Filtering by IP)] - * @see Vol3C[35.4.2.10(Core:Bus Ratio (CBR) Packet)] - */ - uint64_t addr1_cfg : 4; -#define IA32_RTIT_CTL_ADDR1_CFG_BIT 36 -#define IA32_RTIT_CTL_ADDR1_CFG_FLAG 0xF000000000 -#define IA32_RTIT_CTL_ADDR1_CFG_MASK 0x0F -#define IA32_RTIT_CTL_ADDR1_CFG(_) (((_) >> 36) & 0x0F) - - /** - * @brief ADDR2_CFG - * - * [Bits 43:40] Configures the base/limit register pair IA32_RTIT_ADDR2_A/B based on the following encodings: - * - 0: ADDR2 range unused. - * - 1: The [IA32_RTIT_ADDR2_A..IA32_RTIT_ADDR2_B] range defines a FilterEn range. FilterEn will only be set when the IP is - * within this range, though other FilterEn ranges can additionally be used. - * - 2: The [IA32_RTIT_ADDR2_A..IA32_RTIT_ADDR2_B] range defines a TraceStop range. TraceStop will be asserted if code - * branches into this range. - * - 3..15: Reserved (\#GP). - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 2) Reserved if CPUID.(EAX=14H, ECX=1):EBX.RANGECNT[2:0] < 3 - * @see Vol3C[35.2.4.3(Filtering by IP)] - * @see Vol3C[35.4.2.10(Core:Bus Ratio (CBR) Packet)] - */ - uint64_t addr2_cfg : 4; -#define IA32_RTIT_CTL_ADDR2_CFG_BIT 40 -#define IA32_RTIT_CTL_ADDR2_CFG_FLAG 0xF0000000000 -#define IA32_RTIT_CTL_ADDR2_CFG_MASK 0x0F -#define IA32_RTIT_CTL_ADDR2_CFG(_) (((_) >> 40) & 0x0F) - - /** - * @brief ADDR3_CFG - * - * [Bits 47:44] Configures the base/limit register pair IA32_RTIT_ADDR3_A/B based on the following encodings: - * - 0: ADDR3 range unused. - * - 1: The [IA32_RTIT_ADDR3_A..IA32_RTIT_ADDR3_B] range defines a FilterEn range. FilterEn will only be set when the IP is - * within this range, though other FilterEn ranges can additionally be used. - * - 2: The [IA32_RTIT_ADDR3_A..IA32_RTIT_ADDR3_B] range defines a TraceStop range. TraceStop will be asserted if code - * branches into this range. - * - 3..15: Reserved (\#GP). - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > 3) Reserved if CPUID.(EAX=14H, ECX=1):EBX.RANGECNT[2:0] < 4 - * @see Vol3C[35.2.4.3(Filtering by IP)] - * @see Vol3C[35.4.2.10(Core:Bus Ratio (CBR) Packet)] - */ - uint64_t addr3_cfg : 4; -#define IA32_RTIT_CTL_ADDR3_CFG_BIT 44 -#define IA32_RTIT_CTL_ADDR3_CFG_FLAG 0xF00000000000 -#define IA32_RTIT_CTL_ADDR3_CFG_MASK 0x0F -#define IA32_RTIT_CTL_ADDR3_CFG(_) (((_) >> 44) & 0x0F) - uint64_t reserved4 : 8; - - /** - * @brief InjectPsbPmiOnEnable - * - * [Bit 56] - 1: Enables use of IA32_RTIT_STATUS bits PendPSB[6] and PendTopaPMI[7]. - * - 0: IA32_RTIT_STATUS bits 6 and 7 are ignored. - * - * @remarks Reserved if CPUID.(EAX=14H, ECX=0):EBX.INJECTPSBPMI[6] = 0 - * @see Vol3C[35.2.7.4(IA32_RTIT_STATUS MSR)] - */ - uint64_t inject_psb_pmi_on_enable : 1; -#define IA32_RTIT_CTL_INJECT_PSB_PMI_ON_ENABLE_BIT 56 -#define IA32_RTIT_CTL_INJECT_PSB_PMI_ON_ENABLE_FLAG 0x100000000000000 -#define IA32_RTIT_CTL_INJECT_PSB_PMI_ON_ENABLE_MASK 0x01 -#define IA32_RTIT_CTL_INJECT_PSB_PMI_ON_ENABLE(_) (((_) >> 56) & 0x01) - uint64_t reserved5 : 7; - }; - - uint64_t flags; -} ia32_rtit_ctl_register; - - -/** - * Tracing Status Register. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1) - */ -#define IA32_RTIT_STATUS 0x00000571 -typedef union -{ - struct - { - /** - * @brief FilterEn (writes ignored) - * - * [Bit 0] This bit is written by the processor, and indicates that tracing is allowed for the current IP. Writes are - * ignored. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[2] = 1) - * @see Vol3C[35.2.5.5(Filter Enable (FilterEn))] - */ - uint64_t filter_enabled : 1; -#define IA32_RTIT_STATUS_FILTER_ENABLED_BIT 0 -#define IA32_RTIT_STATUS_FILTER_ENABLED_FLAG 0x01 -#define IA32_RTIT_STATUS_FILTER_ENABLED_MASK 0x01 -#define IA32_RTIT_STATUS_FILTER_ENABLED(_) (((_) >> 0) & 0x01) - - /** - * @brief ContexEn (writes ignored) - * - * [Bit 1] The processor sets this bit to indicate that tracing is allowed for the current context. Writes are ignored. - * - * @see Vol3C[35.2.5.3(Context Enable (ContextEn))] - */ - uint64_t context_enabled : 1; -#define IA32_RTIT_STATUS_CONTEXT_ENABLED_BIT 1 -#define IA32_RTIT_STATUS_CONTEXT_ENABLED_FLAG 0x02 -#define IA32_RTIT_STATUS_CONTEXT_ENABLED_MASK 0x01 -#define IA32_RTIT_STATUS_CONTEXT_ENABLED(_) (((_) >> 1) & 0x01) - - /** - * @brief TriggerEn (writes ignored) - * - * [Bit 2] The processor sets this bit to indicate that tracing is enabled. Writes are ignored. - * - * @see Vol3C[35.2.5.2(Trigger Enable (TriggerEn))] - */ - uint64_t trigger_enabled : 1; -#define IA32_RTIT_STATUS_TRIGGER_ENABLED_BIT 2 -#define IA32_RTIT_STATUS_TRIGGER_ENABLED_FLAG 0x04 -#define IA32_RTIT_STATUS_TRIGGER_ENABLED_MASK 0x01 -#define IA32_RTIT_STATUS_TRIGGER_ENABLED(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief Error - * - * [Bit 4] The processor sets this bit to indicate that an operational error has been encountered. When this bit is set, - * TriggerEn is cleared to 0 and packet generation is disabled. - * When TraceEn is cleared, software can write this bit. Once it is set, only software can clear it. It is not recommended - * that software ever set this bit, except in cases where it is restoring a prior saved state. - * - * @see Vol3C[35.2.6.2(Table of Physical Addresses (ToPA) | ToPA Errors)] - */ - uint64_t error : 1; -#define IA32_RTIT_STATUS_ERROR_BIT 4 -#define IA32_RTIT_STATUS_ERROR_FLAG 0x10 -#define IA32_RTIT_STATUS_ERROR_MASK 0x01 -#define IA32_RTIT_STATUS_ERROR(_) (((_) >> 4) & 0x01) - - /** - * @brief Stopped - * - * [Bit 5] The processor sets this bit to indicate that a ToPA Stop condition has been encountered. When this bit is set, - * TriggerEn is cleared to 0 and packet generation is disabled. - * When TraceEn is cleared, software can write this bit. Once it is set, only software can clear it. It is not recommended - * that software ever set this bit, except in cases where it is restoring a prior saved state. - * - * @see Vol3C[35.2.6.2(Table of Physical Addresses (ToPA) | ToPA STOP)] - */ - uint64_t stopped : 1; -#define IA32_RTIT_STATUS_STOPPED_BIT 5 -#define IA32_RTIT_STATUS_STOPPED_FLAG 0x20 -#define IA32_RTIT_STATUS_STOPPED_MASK 0x01 -#define IA32_RTIT_STATUS_STOPPED(_) (((_) >> 5) & 0x01) - - /** - * @brief Pend PSB - * - * [Bit 6] If IA32_RTIT_CTL.InjectPsbPmiOnEnable[56] = 1, the processor sets this bit when the threshold for a PSB+ to be - * inserted has been reached. The processor will clear this bit when the PSB+ has been inserted into the trace. If PendPSB - * = 1 and InjectPsbPmiOnEnable = 1 when IA32_RTIT_CTL.TraceEn[0] transitions from 0 to 1, a PSB+ will be inserted into the - * trace. - * - * @remarks If CPUID.(EAX=14H, ECX=0):EBX.INJECTPSBPMI[6] = 1 - */ - uint64_t pend_psb : 1; -#define IA32_RTIT_STATUS_PEND_PSB_BIT 6 -#define IA32_RTIT_STATUS_PEND_PSB_FLAG 0x40 -#define IA32_RTIT_STATUS_PEND_PSB_MASK 0x01 -#define IA32_RTIT_STATUS_PEND_PSB(_) (((_) >> 6) & 0x01) - - /** - * @brief Pend ToPA PMI - * - * [Bit 7] If IA32_RTIT_CTL.InjectPsbPmiOnEnable[56] = 1, the processor sets this bit when the threshold for a ToPA PMI to - * be inserted has been reached. Software should clear this bit once the ToPA PMI has been handled. If PendTopaPMI = 1 and - * InjectPsbPmiOnEnable = 1 when IA32_RTIT_CTL.TraceEn[0] transitions from 0 to 1, a PMI will be pended. - * - * @remarks If CPUID.(EAX=14H, ECX=0):EBX.INJECTPSBPMI[6] = 1 - * @see Vol3C[35.2.6.2(Table of Physical Addresses (ToPA) | ToPA PMI)] - */ - uint64_t pend_topa_pmi : 1; -#define IA32_RTIT_STATUS_PEND_TOPA_PMI_BIT 7 -#define IA32_RTIT_STATUS_PEND_TOPA_PMI_FLAG 0x80 -#define IA32_RTIT_STATUS_PEND_TOPA_PMI_MASK 0x01 -#define IA32_RTIT_STATUS_PEND_TOPA_PMI(_) (((_) >> 7) & 0x01) - uint64_t reserved2 : 24; - - /** - * @brief PacketByteCnt - * - * [Bits 48:32] This field is written by the processor, and holds a count of packet bytes that have been sent out. The - * processor also uses this field to determine when the next PSB packet should be inserted. Note that the processor may - * clear or modify this field at any time while IA32_RTIT_CTL.TraceEn=1. It will have a stable value when - * IA32_RTIT_CTL.TraceEn=0. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[1] > 3) - * @see Vol3C[35.4.2.17(Packet Stream Boundary (PSB) Packet)] - */ - uint64_t packet_byte_count : 17; -#define IA32_RTIT_STATUS_PACKET_BYTE_COUNT_BIT 32 -#define IA32_RTIT_STATUS_PACKET_BYTE_COUNT_FLAG 0x1FFFF00000000 -#define IA32_RTIT_STATUS_PACKET_BYTE_COUNT_MASK 0x1FFFF -#define IA32_RTIT_STATUS_PACKET_BYTE_COUNT(_) (((_) >> 32) & 0x1FFFF) - uint64_t reserved3 : 15; - }; - - uint64_t flags; -} ia32_rtit_status_register; - - -/** - * @brief Trace Filter CR3 Match Register (R/W) - * - * The IA32_RTIT_CR3_MATCH register is compared against CR3 when IA32_RTIT_CTL.CR3Filter is 1. Bits 63:5 hold the CR3 - * address value to match, bits 4:0 are reserved to 0. - * - * @remarks If (CPUID.(EAX=07H, ECX=0):EBX[25] = 1) - * @see Vol3C[35.2.4.2(Filtering by CR3)] - * @see Vol3C[35.2.7.6(IA32_RTIT_CR3_MATCH MSR)] (reference) - */ -#define IA32_RTIT_CR3_MATCH 0x00000572 -typedef union -{ - struct - { - uint64_t reserved1 : 5; - - /** - * [Bits 63:5] CR3[63:5] value to match. - */ - uint64_t cr3_value_to_match : 59; -#define IA32_RTIT_CR3_MATCH_CR3_VALUE_TO_MATCH_BIT 5 -#define IA32_RTIT_CR3_MATCH_CR3_VALUE_TO_MATCH_FLAG 0xFFFFFFFFFFFFFFE0 -#define IA32_RTIT_CR3_MATCH_CR3_VALUE_TO_MATCH_MASK 0x7FFFFFFFFFFFFFF -#define IA32_RTIT_CR3_MATCH_CR3_VALUE_TO_MATCH(_) (((_) >> 5) & 0x7FFFFFFFFFFFFFF) - }; - - uint64_t flags; -} ia32_rtit_cr3_match_register; - -/** - * @defgroup ia32_rtit_addr \ - * IA32_RTIT_ADDR(x) - * - * The role of the IA32_RTIT_ADDRn_A/B register pairs, for each n, is determined by the corresponding ADDRn_CFG fields in - * IA32_RTIT_CTL. The number of these register pairs is enumerated by CPUID.(EAX=14H, ECX=1):EAX.RANGECNT[2:0]. - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n) - * @see Vol3C[35.2.7.2(IA32_RTIT_CTL MSR)] - * @see Vol3C[35.2.7.5(IA32_RTIT_ADDRn_A and IA32_RTIT_ADDRn_B MSRs)] (reference) - * @{ - */ - /** - * @defgroup ia32_rtit_addr_a \ - * IA32_RTIT_ADDR(n)_A - * - * Region n Start Address. - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n) - * @{ - */ -#define IA32_RTIT_ADDR0_A 0x00000580 -#define IA32_RTIT_ADDR1_A 0x00000582 -#define IA32_RTIT_ADDR2_A 0x00000584 -#define IA32_RTIT_ADDR3_A 0x00000586 - /** - * @} - */ - - /** - * @defgroup ia32_rtit_addr_b \ - * IA32_RTIT_ADDR(n)_B - * - * Region n End Address. - * - * @remarks If (CPUID.(EAX=07H, ECX=1):EAX[2:0] > n) - * @{ - */ -#define IA32_RTIT_ADDR0_B 0x00000581 -#define IA32_RTIT_ADDR1_B 0x00000583 -#define IA32_RTIT_ADDR2_B 0x00000585 -#define IA32_RTIT_ADDR3_B 0x00000587 - /** - * @} - */ - -typedef union -{ - struct - { - /** - * [Bits 47:0] Virtual Address. - */ - uint64_t virtual_address : 48; -#define IA32_RTIT_ADDR_VIRTUAL_ADDRESS_BIT 0 -#define IA32_RTIT_ADDR_VIRTUAL_ADDRESS_FLAG 0xFFFFFFFFFFFF -#define IA32_RTIT_ADDR_VIRTUAL_ADDRESS_MASK 0xFFFFFFFFFFFF -#define IA32_RTIT_ADDR_VIRTUAL_ADDRESS(_) (((_) >> 0) & 0xFFFFFFFFFFFF) - - /** - * [Bits 63:48] SignExt_VA. - */ - uint64_t sign_ext_va : 16; -#define IA32_RTIT_ADDR_SIGN_EXT_VA_BIT 48 -#define IA32_RTIT_ADDR_SIGN_EXT_VA_FLAG 0xFFFF000000000000 -#define IA32_RTIT_ADDR_SIGN_EXT_VA_MASK 0xFFFF -#define IA32_RTIT_ADDR_SIGN_EXT_VA(_) (((_) >> 48) & 0xFFFF) - }; - - uint64_t flags; -} ia32_rtit_addr_register; - -/** - * @} - */ - - - /** - * DS Save Area. 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. - * Returns: - * - [63:0] The linear address of the first byte of the DS buffer management area, if IA-32e mode is active. - * - [31:0] The linear address of the first byte of the DS buffer management area, if not in IA-32e mode. - * - [63:32] Reserved if not in IA-32e mode. - * - * @remarks If CPUID.01H:EDX.DS[21] = 1 - * @see Vol3B[18.6.3.4(Debug Store (DS) Mechanism)] - */ -#define IA32_DS_AREA 0x00000600 - - /** - * TSC Target of Local APIC's TSC Deadline Mode. - * - * @remarks If CPUID.01H:ECX.[24] = 1 - */ -#define IA32_TSC_DEADLINE 0x000006E0 - - /** - * Enable/disable HWP. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - */ -#define IA32_PM_ENABLE 0x00000770 -typedef union -{ - struct - { - /** - * [Bit 0] HWP_ENABLE. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.2(Enabling HWP)] - */ - uint64_t hwp_enable : 1; -#define IA32_PM_ENABLE_HWP_ENABLE_BIT 0 -#define IA32_PM_ENABLE_HWP_ENABLE_FLAG 0x01 -#define IA32_PM_ENABLE_HWP_ENABLE_MASK 0x01 -#define IA32_PM_ENABLE_HWP_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_pm_enable_register; - - -/** - * HWP Performance Range Enumeration. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - */ -#define IA32_HWP_CAPABILITIES 0x00000771 -typedef union -{ - struct - { - /** - * [Bits 7:0] Highest_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.3(HWP Performance Range and Dynamic Capabilities)] - */ - uint64_t highest_performance : 8; -#define IA32_HWP_CAPABILITIES_HIGHEST_PERFORMANCE_BIT 0 -#define IA32_HWP_CAPABILITIES_HIGHEST_PERFORMANCE_FLAG 0xFF -#define IA32_HWP_CAPABILITIES_HIGHEST_PERFORMANCE_MASK 0xFF -#define IA32_HWP_CAPABILITIES_HIGHEST_PERFORMANCE(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Guaranteed_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.3(HWP Performance Range and Dynamic Capabilities)] - */ - uint64_t guaranteed_performance : 8; -#define IA32_HWP_CAPABILITIES_GUARANTEED_PERFORMANCE_BIT 8 -#define IA32_HWP_CAPABILITIES_GUARANTEED_PERFORMANCE_FLAG 0xFF00 -#define IA32_HWP_CAPABILITIES_GUARANTEED_PERFORMANCE_MASK 0xFF -#define IA32_HWP_CAPABILITIES_GUARANTEED_PERFORMANCE(_) (((_) >> 8) & 0xFF) - - /** - * [Bits 23:16] Most_Efficient_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.3(HWP Performance Range and Dynamic Capabilities)] - */ - uint64_t most_efficient_performance : 8; -#define IA32_HWP_CAPABILITIES_MOST_EFFICIENT_PERFORMANCE_BIT 16 -#define IA32_HWP_CAPABILITIES_MOST_EFFICIENT_PERFORMANCE_FLAG 0xFF0000 -#define IA32_HWP_CAPABILITIES_MOST_EFFICIENT_PERFORMANCE_MASK 0xFF -#define IA32_HWP_CAPABILITIES_MOST_EFFICIENT_PERFORMANCE(_) (((_) >> 16) & 0xFF) - - /** - * [Bits 31:24] Lowest_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.3(HWP Performance Range and Dynamic Capabilities)] - */ - uint64_t lowest_performance : 8; -#define IA32_HWP_CAPABILITIES_LOWEST_PERFORMANCE_BIT 24 -#define IA32_HWP_CAPABILITIES_LOWEST_PERFORMANCE_FLAG 0xFF000000 -#define IA32_HWP_CAPABILITIES_LOWEST_PERFORMANCE_MASK 0xFF -#define IA32_HWP_CAPABILITIES_LOWEST_PERFORMANCE(_) (((_) >> 24) & 0xFF) - uint64_t reserved1 : 32; - }; - - uint64_t flags; -} ia32_hwp_capabilities_register; - - -/** - * Power Management Control Hints for All Logical Processors in a Package. - * - * @remarks If CPUID.06H:EAX.[11] = 1 - */ -#define IA32_HWP_REQUEST_PKG 0x00000772 -typedef union -{ - struct - { - /** - * [Bits 7:0] Minimum_Performance. - * - * @remarks If CPUID.06H:EAX.[11] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t minimum_performance : 8; -#define IA32_HWP_REQUEST_PKG_MINIMUM_PERFORMANCE_BIT 0 -#define IA32_HWP_REQUEST_PKG_MINIMUM_PERFORMANCE_FLAG 0xFF -#define IA32_HWP_REQUEST_PKG_MINIMUM_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_PKG_MINIMUM_PERFORMANCE(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Maximum_Performance. - * - * @remarks If CPUID.06H:EAX.[11] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t maximum_performance : 8; -#define IA32_HWP_REQUEST_PKG_MAXIMUM_PERFORMANCE_BIT 8 -#define IA32_HWP_REQUEST_PKG_MAXIMUM_PERFORMANCE_FLAG 0xFF00 -#define IA32_HWP_REQUEST_PKG_MAXIMUM_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_PKG_MAXIMUM_PERFORMANCE(_) (((_) >> 8) & 0xFF) - - /** - * [Bits 23:16] Desired_Performance. - * - * @remarks If CPUID.06H:EAX.[11] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t desired_performance : 8; -#define IA32_HWP_REQUEST_PKG_DESIRED_PERFORMANCE_BIT 16 -#define IA32_HWP_REQUEST_PKG_DESIRED_PERFORMANCE_FLAG 0xFF0000 -#define IA32_HWP_REQUEST_PKG_DESIRED_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_PKG_DESIRED_PERFORMANCE(_) (((_) >> 16) & 0xFF) - - /** - * [Bits 31:24] Energy_Performance_Preference. - * - * @remarks If CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[10] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t energy_performance_preference : 8; -#define IA32_HWP_REQUEST_PKG_ENERGY_PERFORMANCE_PREFERENCE_BIT 24 -#define IA32_HWP_REQUEST_PKG_ENERGY_PERFORMANCE_PREFERENCE_FLAG 0xFF000000 -#define IA32_HWP_REQUEST_PKG_ENERGY_PERFORMANCE_PREFERENCE_MASK 0xFF -#define IA32_HWP_REQUEST_PKG_ENERGY_PERFORMANCE_PREFERENCE(_) (((_) >> 24) & 0xFF) - - /** - * [Bits 41:32] Activity_Window. - * - * @remarks If CPUID.06H:EAX.[11] = 1 && CPUID.06H:EAX.[9] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t activity_window : 10; -#define IA32_HWP_REQUEST_PKG_ACTIVITY_WINDOW_BIT 32 -#define IA32_HWP_REQUEST_PKG_ACTIVITY_WINDOW_FLAG 0x3FF00000000 -#define IA32_HWP_REQUEST_PKG_ACTIVITY_WINDOW_MASK 0x3FF -#define IA32_HWP_REQUEST_PKG_ACTIVITY_WINDOW(_) (((_) >> 32) & 0x3FF) - uint64_t reserved1 : 22; - }; - - uint64_t flags; -} ia32_hwp_request_pkg_register; - - -/** - * Control HWP Native Interrupts. - * - * @remarks If CPUID.06H:EAX.[8] = 1 - */ -#define IA32_HWP_INTERRUPT 0x00000773 -typedef union -{ - struct - { - /** - * [Bit 0] EN_Guaranteed_Performance_Change. - * - * @remarks If CPUID.06H:EAX.[8] = 1 - * @see Vol3B[14.4.6(HWP Notifications)] - */ - uint64_t en_guaranteed_performance_change : 1; -#define IA32_HWP_INTERRUPT_EN_GUARANTEED_PERFORMANCE_CHANGE_BIT 0 -#define IA32_HWP_INTERRUPT_EN_GUARANTEED_PERFORMANCE_CHANGE_FLAG 0x01 -#define IA32_HWP_INTERRUPT_EN_GUARANTEED_PERFORMANCE_CHANGE_MASK 0x01 -#define IA32_HWP_INTERRUPT_EN_GUARANTEED_PERFORMANCE_CHANGE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] EN_Excursion_Minimum. - * - * @remarks If CPUID.06H:EAX.[8] = 1 - * @see Vol3B[14.4.6(HWP Notifications)] - */ - uint64_t en_excursion_minimum : 1; -#define IA32_HWP_INTERRUPT_EN_EXCURSION_MINIMUM_BIT 1 -#define IA32_HWP_INTERRUPT_EN_EXCURSION_MINIMUM_FLAG 0x02 -#define IA32_HWP_INTERRUPT_EN_EXCURSION_MINIMUM_MASK 0x01 -#define IA32_HWP_INTERRUPT_EN_EXCURSION_MINIMUM(_) (((_) >> 1) & 0x01) - uint64_t reserved1 : 62; - }; - - uint64_t flags; -} ia32_hwp_interrupt_register; - - -/** - * Power Management Control Hints to a Logical Processor. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - */ -#define IA32_HWP_REQUEST 0x00000774 -typedef union -{ - struct - { - /** - * [Bits 7:0] Minimum_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t minimum_performance : 8; -#define IA32_HWP_REQUEST_MINIMUM_PERFORMANCE_BIT 0 -#define IA32_HWP_REQUEST_MINIMUM_PERFORMANCE_FLAG 0xFF -#define IA32_HWP_REQUEST_MINIMUM_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_MINIMUM_PERFORMANCE(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 15:8] Maximum_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t maximum_performance : 8; -#define IA32_HWP_REQUEST_MAXIMUM_PERFORMANCE_BIT 8 -#define IA32_HWP_REQUEST_MAXIMUM_PERFORMANCE_FLAG 0xFF00 -#define IA32_HWP_REQUEST_MAXIMUM_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_MAXIMUM_PERFORMANCE(_) (((_) >> 8) & 0xFF) - - /** - * [Bits 23:16] Desired_Performance. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t desired_performance : 8; -#define IA32_HWP_REQUEST_DESIRED_PERFORMANCE_BIT 16 -#define IA32_HWP_REQUEST_DESIRED_PERFORMANCE_FLAG 0xFF0000 -#define IA32_HWP_REQUEST_DESIRED_PERFORMANCE_MASK 0xFF -#define IA32_HWP_REQUEST_DESIRED_PERFORMANCE(_) (((_) >> 16) & 0xFF) - - /** - * [Bits 31:24] Energy_Performance_Preference. - * - * @remarks If CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[10] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t energy_performance_preference : 8; -#define IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE_BIT 24 -#define IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE_FLAG 0xFF000000 -#define IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE_MASK 0xFF -#define IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE(_) (((_) >> 24) & 0xFF) - - /** - * [Bits 41:32] Activity_Window. - * - * @remarks If CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[9] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t activity_window : 10; -#define IA32_HWP_REQUEST_ACTIVITY_WINDOW_BIT 32 -#define IA32_HWP_REQUEST_ACTIVITY_WINDOW_FLAG 0x3FF00000000 -#define IA32_HWP_REQUEST_ACTIVITY_WINDOW_MASK 0x3FF -#define IA32_HWP_REQUEST_ACTIVITY_WINDOW(_) (((_) >> 32) & 0x3FF) - - /** - * [Bit 42] Package_Control. - * - * @remarks If CPUID.06H:EAX.[7] = 1 && CPUID.06H:EAX.[11] = 1 - * @see Vol3B[14.4.4(Managing HWP)] - */ - uint64_t package_control : 1; -#define IA32_HWP_REQUEST_PACKAGE_CONTROL_BIT 42 -#define IA32_HWP_REQUEST_PACKAGE_CONTROL_FLAG 0x40000000000 -#define IA32_HWP_REQUEST_PACKAGE_CONTROL_MASK 0x01 -#define IA32_HWP_REQUEST_PACKAGE_CONTROL(_) (((_) >> 42) & 0x01) - uint64_t reserved1 : 21; - }; - - uint64_t flags; -} ia32_hwp_request_register; - - -/** - * Log bits indicating changes to Guaranteed & excursions to Minimum. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - */ -#define IA32_HWP_STATUS 0x00000777 -typedef union -{ - struct - { - /** - * [Bit 0] Guaranteed_Performance_Change. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.5(HWP Feedback)] - */ - uint64_t guaranteed_performance_change : 1; -#define IA32_HWP_STATUS_GUARANTEED_PERFORMANCE_CHANGE_BIT 0 -#define IA32_HWP_STATUS_GUARANTEED_PERFORMANCE_CHANGE_FLAG 0x01 -#define IA32_HWP_STATUS_GUARANTEED_PERFORMANCE_CHANGE_MASK 0x01 -#define IA32_HWP_STATUS_GUARANTEED_PERFORMANCE_CHANGE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 2] Excursion_To_Minimum. - * - * @remarks If CPUID.06H:EAX.[7] = 1 - * @see Vol3B[14.4.5(HWP Feedback)] - */ - uint64_t excursion_to_minimum : 1; -#define IA32_HWP_STATUS_EXCURSION_TO_MINIMUM_BIT 2 -#define IA32_HWP_STATUS_EXCURSION_TO_MINIMUM_FLAG 0x04 -#define IA32_HWP_STATUS_EXCURSION_TO_MINIMUM_MASK 0x01 -#define IA32_HWP_STATUS_EXCURSION_TO_MINIMUM(_) (((_) >> 2) & 0x01) - uint64_t reserved2 : 61; - }; - - uint64_t flags; -} ia32_hwp_status_register; - - -/** - * x2APIC ID Register. - * - * @remarks If CPUID.01H:ECX[21] = 1 && IA32_APIC_BASE.[10] = 1 - * @see Vol3A[10.12(EXTENDED XAPIC (X2APIC))] - */ -#define IA32_X2APIC_APICID 0x00000802 - - /** - * x2APIC Version Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_VERSION 0x00000803 - - /** - * x2APIC Task Priority Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_TPR 0x00000808 - - /** - * x2APIC Processor Priority Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_PPR 0x0000080A - - /** - * x2APIC EOI Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_EOI 0x0000080B - - /** - * x2APIC Logical Destination Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LDR 0x0000080D - - /** - * x2APIC Spurious Interrupt Vector Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_SIVR 0x0000080F - /** - * @defgroup ia32_x2apic_isr \ - * IA32_X2APIC_ISR(n) - * - * x2APIC In-Service Register Bits (n * 32 + 31):(n * 32). - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - * @{ - */ -#define IA32_X2APIC_ISR0 0x00000810 -#define IA32_X2APIC_ISR1 0x00000811 -#define IA32_X2APIC_ISR2 0x00000812 -#define IA32_X2APIC_ISR3 0x00000813 -#define IA32_X2APIC_ISR4 0x00000814 -#define IA32_X2APIC_ISR5 0x00000815 -#define IA32_X2APIC_ISR6 0x00000816 -#define IA32_X2APIC_ISR7 0x00000817 - /** - * @} - */ - - /** - * @defgroup ia32_x2apic_tmr \ - * IA32_X2APIC_TMR(n) - * - * x2APIC Trigger Mode Register Bits (n * 32 + 31):(n * 32). - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - * @{ - */ -#define IA32_X2APIC_TMR0 0x00000818 -#define IA32_X2APIC_TMR1 0x00000819 -#define IA32_X2APIC_TMR2 0x0000081A -#define IA32_X2APIC_TMR3 0x0000081B -#define IA32_X2APIC_TMR4 0x0000081C -#define IA32_X2APIC_TMR5 0x0000081D -#define IA32_X2APIC_TMR6 0x0000081E -#define IA32_X2APIC_TMR7 0x0000081F - /** - * @} - */ - - /** - * @defgroup ia32_x2apic_irr \ - * IA32_X2APIC_IRR(n) - * - * x2APIC Interrupt Request Register Bits (n * 32 + 31):(n * 32). - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - * @{ - */ -#define IA32_X2APIC_IRR0 0x00000820 -#define IA32_X2APIC_IRR1 0x00000821 -#define IA32_X2APIC_IRR2 0x00000822 -#define IA32_X2APIC_IRR3 0x00000823 -#define IA32_X2APIC_IRR4 0x00000824 -#define IA32_X2APIC_IRR5 0x00000825 -#define IA32_X2APIC_IRR6 0x00000826 -#define IA32_X2APIC_IRR7 0x00000827 - /** - * @} - */ - - - /** - * x2APIC Error Status Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_ESR 0x00000828 - - /** - * x2APIC LVT Corrected Machine Check Interrupt Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_CMCI 0x0000082F - - /** - * x2APIC Interrupt Command Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_ICR 0x00000830 - - /** - * x2APIC LVT Timer Interrupt Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_TIMER 0x00000832 - - /** - * x2APIC LVT Thermal Sensor Interrupt Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_THERMAL 0x00000833 - - /** - * x2APIC LVT Performance Monitor Interrupt Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_PMI 0x00000834 - - /** - * x2APIC LVT LINT0 Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_LINT0 0x00000835 - - /** - * x2APIC LVT LINT1 Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_LINT1 0x00000836 - - /** - * x2APIC LVT Error Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_LVT_ERROR 0x00000837 - - /** - * x2APIC Initial Count Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_INIT_COUNT 0x00000838 - - /** - * x2APIC Current Count Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_CUR_COUNT 0x00000839 - - /** - * x2APIC Divide Configuration Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_DIV_CONF 0x0000083E - - /** - * x2APIC Self IPI Register. - * - * @remarks If CPUID.01H:ECX.[21] = 1 && IA32_APIC_BASE.[10] = 1 - */ -#define IA32_X2APIC_SELF_IPI 0x0000083F - - /** - * Silicon Debug Feature Control. - * - * @remarks If CPUID.01H:ECX.[11] = 1 - */ -#define IA32_DEBUG_INTERFACE 0x00000C80 -typedef union -{ - struct - { - /** - * @brief Enable (R/W) - * - * [Bit 0] BIOS set 1 to enable Silicon debug features. Default is 0. - * - * @remarks If CPUID.01H:ECX.[11] = 1 - */ - uint64_t enable : 1; -#define IA32_DEBUG_INTERFACE_ENABLE_BIT 0 -#define IA32_DEBUG_INTERFACE_ENABLE_FLAG 0x01 -#define IA32_DEBUG_INTERFACE_ENABLE_MASK 0x01 -#define IA32_DEBUG_INTERFACE_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 29; - - /** - * @brief Lock (R/W) - * - * [Bit 30] 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. - * - * @remarks If CPUID.01H:ECX.[11] = 1 - */ - uint64_t lock : 1; -#define IA32_DEBUG_INTERFACE_LOCK_BIT 30 -#define IA32_DEBUG_INTERFACE_LOCK_FLAG 0x40000000 -#define IA32_DEBUG_INTERFACE_LOCK_MASK 0x01 -#define IA32_DEBUG_INTERFACE_LOCK(_) (((_) >> 30) & 0x01) - - /** - * @brief Debug Occurred (R/O) - * - * [Bit 31] This "sticky bit" is set by hardware to indicate the status of bit 0. Default is 0. - * - * @remarks If CPUID.01H:ECX.[11] = 1 - */ - uint64_t debug_occurred : 1; -#define IA32_DEBUG_INTERFACE_DEBUG_OCCURRED_BIT 31 -#define IA32_DEBUG_INTERFACE_DEBUG_OCCURRED_FLAG 0x80000000 -#define IA32_DEBUG_INTERFACE_DEBUG_OCCURRED_MASK 0x01 -#define IA32_DEBUG_INTERFACE_DEBUG_OCCURRED(_) (((_) >> 31) & 0x01) - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} ia32_debug_interface_register; - - -/** - * L3 QOS Configuration. - * - * @remarks If ( CPUID.(EAX=10H, ECX=1):ECX.[2] = 1 ) - */ -#define IA32_L3_QOS_CFG 0x00000C81 -typedef union -{ - struct - { - /** - * @brief Enable (R/W) - * - * [Bit 0] Set 1 to enable L3 CAT masks and COS to operate in Code and Data Prioritization (CDP) mode. - */ - uint64_t enable : 1; -#define IA32_L3_QOS_CFG_ENABLE_BIT 0 -#define IA32_L3_QOS_CFG_ENABLE_FLAG 0x01 -#define IA32_L3_QOS_CFG_ENABLE_MASK 0x01 -#define IA32_L3_QOS_CFG_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_l3_qos_cfg_register; - - -/** - * L2 QOS Configuration. - * - * @remarks If ( CPUID.(EAX=10H, ECX=2):ECX.[2] = 1 ) - */ -#define IA32_L2_QOS_CFG 0x00000C82 -typedef union -{ - struct - { - /** - * @brief Enable (R/W) - * - * [Bit 0] Set 1 to enable L2 CAT masks and COS to operate in Code and Data Prioritization (CDP) mode. - */ - uint64_t enable : 1; -#define IA32_L2_QOS_CFG_ENABLE_BIT 0 -#define IA32_L2_QOS_CFG_ENABLE_FLAG 0x01 -#define IA32_L2_QOS_CFG_ENABLE_MASK 0x01 -#define IA32_L2_QOS_CFG_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_l2_qos_cfg_register; - - -/** - * Monitoring Event Select Register. - * - * @remarks If ( CPUID.(EAX=07H, ECX=0):EBX.[12] = 1 ) - */ -#define IA32_QM_EVTSEL 0x00000C8D -typedef union -{ - struct - { - /** - * @brief Event ID - * - * [Bits 7:0] ID of a supported monitoring event to report via IA32_QM_CTR. - */ - uint64_t event_id : 8; -#define IA32_QM_EVTSEL_EVENT_ID_BIT 0 -#define IA32_QM_EVTSEL_EVENT_ID_FLAG 0xFF -#define IA32_QM_EVTSEL_EVENT_ID_MASK 0xFF -#define IA32_QM_EVTSEL_EVENT_ID(_) (((_) >> 0) & 0xFF) - uint64_t reserved1 : 24; - - /** - * @brief Resource Monitoring ID - * - * [Bits 63:32] ID for monitoring hardware to report monitored data via IA32_QM_CTR. - * - * @remarks Bits [N+31:32] N = Ceil (Log2 (CPUID.(EAX= 0FH,ECX=0H).EBX[31:0] + 1)) - */ - uint64_t resource_monitoring_id : 32; -#define IA32_QM_EVTSEL_RESOURCE_MONITORING_ID_BIT 32 -#define IA32_QM_EVTSEL_RESOURCE_MONITORING_ID_FLAG 0xFFFFFFFF00000000 -#define IA32_QM_EVTSEL_RESOURCE_MONITORING_ID_MASK 0xFFFFFFFF -#define IA32_QM_EVTSEL_RESOURCE_MONITORING_ID(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_qm_evtsel_register; - - -/** - * Monitoring Counter Register. - * - * @remarks If ( CPUID.(EAX=07H, ECX=0):EBX.[12] = 1 ) - */ -#define IA32_QM_CTR 0x00000C8E -typedef union -{ - struct - { - /** - * [Bits 61:0] Resource Monitored Data. - */ - uint64_t resource_monitored_data : 62; -#define IA32_QM_CTR_RESOURCE_MONITORED_DATA_BIT 0 -#define IA32_QM_CTR_RESOURCE_MONITORED_DATA_FLAG 0x3FFFFFFFFFFFFFFF -#define IA32_QM_CTR_RESOURCE_MONITORED_DATA_MASK 0x3FFFFFFFFFFFFFFF -#define IA32_QM_CTR_RESOURCE_MONITORED_DATA(_) (((_) >> 0) & 0x3FFFFFFFFFFFFFFF) - - /** - * @brief Unavailable - * - * [Bit 62] If 1, indicates data for this RMID is not available or not monitored for this resource or RMID. - */ - uint64_t unavailable : 1; -#define IA32_QM_CTR_UNAVAILABLE_BIT 62 -#define IA32_QM_CTR_UNAVAILABLE_FLAG 0x4000000000000000 -#define IA32_QM_CTR_UNAVAILABLE_MASK 0x01 -#define IA32_QM_CTR_UNAVAILABLE(_) (((_) >> 62) & 0x01) - - /** - * @brief Error - * - * [Bit 63] If 1, indicates an unsupported RMID or event type was written to IA32_PQR_QM_EVTSEL. - */ - uint64_t error : 1; -#define IA32_QM_CTR_ERROR_BIT 63 -#define IA32_QM_CTR_ERROR_FLAG 0x8000000000000000 -#define IA32_QM_CTR_ERROR_MASK 0x01 -#define IA32_QM_CTR_ERROR(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} ia32_qm_ctr_register; - - -/** - * Resource Association Register. - * - * @remarks If ( (CPUID.(EAX=07H, ECX=0):EBX[12] = 1) or (CPUID.(EAX=07H, ECX=0):EBX[15] = 1 ) ) - */ -#define IA32_PQR_ASSOC 0x00000C8F -typedef union -{ - struct - { - /** - * @brief Resource Monitoring ID (R/W) - * - * [Bits 31:0] ID for monitoring hardware to track internal operation, e.g., memory access. - * - * @remarks Bits [N-1:0] N = Ceil (Log2 (CPUID.(EAX= 0FH, ECX=0H).EBX[31:0] +1)) 31:N Reserved - */ - uint64_t resource_monitoring_id : 32; -#define IA32_PQR_ASSOC_RESOURCE_MONITORING_ID_BIT 0 -#define IA32_PQR_ASSOC_RESOURCE_MONITORING_ID_FLAG 0xFFFFFFFF -#define IA32_PQR_ASSOC_RESOURCE_MONITORING_ID_MASK 0xFFFFFFFF -#define IA32_PQR_ASSOC_RESOURCE_MONITORING_ID(_) (((_) >> 0) & 0xFFFFFFFF) - - /** - * @brief COS (R/W) - * - * [Bits 63:32] The class of service (COS) to enforce (on writes); returns the current COS when read. - * - * @remarks If ( CPUID.(EAX=07H, ECX=0):EBX.[15] = 1 ) - */ - uint64_t cos : 32; -#define IA32_PQR_ASSOC_COS_BIT 32 -#define IA32_PQR_ASSOC_COS_FLAG 0xFFFFFFFF00000000 -#define IA32_PQR_ASSOC_COS_MASK 0xFFFFFFFF -#define IA32_PQR_ASSOC_COS(_) (((_) >> 32) & 0xFFFFFFFF) - }; - - uint64_t flags; -} ia32_pqr_assoc_register; - - -/** - * Supervisor State of MPX Configuration. - * - * @remarks If (CPUID.(EAX=07H, ECX=0H):EBX[14] = 1) - */ -#define IA32_BNDCFGS 0x00000D90 -typedef union -{ - struct - { - /** - * [Bit 0] Enable Intel MPX in supervisor mode. - */ - uint64_t enable : 1; -#define IA32_BNDCFGS_ENABLE_BIT 0 -#define IA32_BNDCFGS_ENABLE_FLAG 0x01 -#define IA32_BNDCFGS_ENABLE_MASK 0x01 -#define IA32_BNDCFGS_ENABLE(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Preserve the bounds registers for near branch instructions in the absence of the BND prefix. - */ - uint64_t bnd_preserve : 1; -#define IA32_BNDCFGS_BND_PRESERVE_BIT 1 -#define IA32_BNDCFGS_BND_PRESERVE_FLAG 0x02 -#define IA32_BNDCFGS_BND_PRESERVE_MASK 0x01 -#define IA32_BNDCFGS_BND_PRESERVE(_) (((_) >> 1) & 0x01) - uint64_t reserved1 : 10; - - /** - * [Bits 63:12] Base Address of Bound Directory. - */ - uint64_t bound_directory_base_address : 52; -#define IA32_BNDCFGS_BOUND_DIRECTORY_BASE_ADDRESS_BIT 12 -#define IA32_BNDCFGS_BOUND_DIRECTORY_BASE_ADDRESS_FLAG 0xFFFFFFFFFFFFF000 -#define IA32_BNDCFGS_BOUND_DIRECTORY_BASE_ADDRESS_MASK 0xFFFFFFFFFFFFF -#define IA32_BNDCFGS_BOUND_DIRECTORY_BASE_ADDRESS(_) (((_) >> 12) & 0xFFFFFFFFFFFFF) - }; - - uint64_t flags; -} ia32_bndcfgs_register; - - -/** - * Extended Supervisor State Mask. - * - * @remarks If ( CPUID.(0DH, 1):EAX.[3] = 1 - */ -#define IA32_XSS 0x00000DA0 -typedef union -{ - struct - { - uint64_t reserved1 : 8; - - /** - * [Bit 8] Trace Packet Configuration State. - */ - uint64_t trace_packet_configuration_state : 1; -#define IA32_XSS_TRACE_PACKET_CONFIGURATION_STATE_BIT 8 -#define IA32_XSS_TRACE_PACKET_CONFIGURATION_STATE_FLAG 0x100 -#define IA32_XSS_TRACE_PACKET_CONFIGURATION_STATE_MASK 0x01 -#define IA32_XSS_TRACE_PACKET_CONFIGURATION_STATE(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 55; - }; - - uint64_t flags; -} ia32_xss_register; - - -/** - * Package Level Enable/disable HDC. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - */ -#define IA32_PKG_HDC_CTL 0x00000DB0 -typedef union -{ - struct - { - /** - * @brief HDC_Pkg_Enable (R/W) - * - * [Bit 0] Force HDC idling or wake up HDC-idled logical processors in the package. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - * @see Vol3B[14.5.2(Package level Enabling HDC)] - */ - uint64_t hdc_pkg_enable : 1; -#define IA32_PKG_HDC_CTL_HDC_PKG_ENABLE_BIT 0 -#define IA32_PKG_HDC_CTL_HDC_PKG_ENABLE_FLAG 0x01 -#define IA32_PKG_HDC_CTL_HDC_PKG_ENABLE_MASK 0x01 -#define IA32_PKG_HDC_CTL_HDC_PKG_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_pkg_hdc_ctl_register; - - -/** - * Enable/disable HWP. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - */ -#define IA32_PM_CTL1 0x00000DB1 -typedef union -{ - struct - { - /** - * @brief HDC_Allow_Block (R/W) - * - * [Bit 0] Allow/Block this logical processor for package level HDC control. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - * @see Vol3B[14.5.3(Logical-Processor Level HDC Control)] - */ - uint64_t hdc_allow_block : 1; -#define IA32_PM_CTL1_HDC_ALLOW_BLOCK_BIT 0 -#define IA32_PM_CTL1_HDC_ALLOW_BLOCK_FLAG 0x01 -#define IA32_PM_CTL1_HDC_ALLOW_BLOCK_MASK 0x01 -#define IA32_PM_CTL1_HDC_ALLOW_BLOCK(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 63; - }; - - uint64_t flags; -} ia32_pm_ctl1_register; - - -/** - * Per-Logical_Processor HDC Idle Residency. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - */ -#define IA32_THREAD_STALL 0x00000DB2 -typedef struct -{ - /** - * @brief Stall_Cycle_Cnt (R/W) - * - * Stalled cycles due to HDC forced idle on this logical processor. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - * @see Vol3B[14.5.4.1(IA32_THREAD_STALL)] - */ - uint64_t stall_cycle_count; -} ia32_thread_stall_register; - - -/** - * Extended Feature Enables. - * - * @remarks If CPUID.06H:EAX.[13] = 1 - */ -#define IA32_EFER 0xC0000080 -typedef union -{ - struct - { - /** - * @brief SYSCALL Enable (R/W) - * - * [Bit 0] Enables SYSCALL/SYSRET instructions in 64-bit mode. - */ - uint64_t syscall_enable : 1; -#define IA32_EFER_SYSCALL_ENABLE_BIT 0 -#define IA32_EFER_SYSCALL_ENABLE_FLAG 0x01 -#define IA32_EFER_SYSCALL_ENABLE_MASK 0x01 -#define IA32_EFER_SYSCALL_ENABLE(_) (((_) >> 0) & 0x01) - uint64_t reserved1 : 7; - - /** - * @brief IA-32e Mode Enable (R/W) - * - * [Bit 8] Enables IA-32e mode operation. - */ - uint64_t ia32e_mode_enable : 1; -#define IA32_EFER_IA32E_MODE_ENABLE_BIT 8 -#define IA32_EFER_IA32E_MODE_ENABLE_FLAG 0x100 -#define IA32_EFER_IA32E_MODE_ENABLE_MASK 0x01 -#define IA32_EFER_IA32E_MODE_ENABLE(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief IA-32e Mode Active (R) - * - * [Bit 10] Indicates IA-32e mode is active when set. - */ - uint64_t ia32e_mode_active : 1; -#define IA32_EFER_IA32E_MODE_ACTIVE_BIT 10 -#define IA32_EFER_IA32E_MODE_ACTIVE_FLAG 0x400 -#define IA32_EFER_IA32E_MODE_ACTIVE_MASK 0x01 -#define IA32_EFER_IA32E_MODE_ACTIVE(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] Execute Disable Bit Enable. - */ - uint64_t execute_disable_bit_enable : 1; -#define IA32_EFER_EXECUTE_DISABLE_BIT_ENABLE_BIT 11 -#define IA32_EFER_EXECUTE_DISABLE_BIT_ENABLE_FLAG 0x800 -#define IA32_EFER_EXECUTE_DISABLE_BIT_ENABLE_MASK 0x01 -#define IA32_EFER_EXECUTE_DISABLE_BIT_ENABLE(_) (((_) >> 11) & 0x01) - uint64_t reserved3 : 52; - }; - - uint64_t flags; -} ia32_efer_register; - - -/** - * System Call Target Address. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_STAR 0xC0000081 - - /** - * @brief IA-32e Mode System Call Target Address (R/W) - * - * Target RIP for the called procedure when SYSCALL is executed in 64-bit mode. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_LSTAR 0xC0000082 - - /** - * @brief IA-32e Mode System Call Target Address (R/W) - * - * Not used, as the SYSCALL instruction is not recognized in compatibility mode. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_CSTAR 0xC0000083 - - /** - * System Call Flag Mask. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_FMASK 0xC0000084 - - /** - * Map of BASE Address of FS. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_FS_BASE 0xC0000100 - - /** - * Map of BASE Address of GS. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_GS_BASE 0xC0000101 - - /** - * Swap Target of BASE Address of GS. - * - * @remarks If CPUID.80000001:EDX.[29] = 1 - */ -#define IA32_KERNEL_GS_BASE 0xC0000102 - - /** - * Auxiliary TSC. - * - * @remarks If CPUID.80000001H: EDX[27] = 1 or CPUID.(EAX=7,ECX=0):ECX[bit 22] = 1 - */ -#define IA32_TSC_AUX 0xC0000103 -typedef union -{ - struct - { - /** - * [Bits 31:0] AUX. Auxiliary signature of TSC. - */ - uint64_t tsc_auxiliary_signature : 32; -#define IA32_TSC_AUX_TSC_AUXILIARY_SIGNATURE_BIT 0 -#define IA32_TSC_AUX_TSC_AUXILIARY_SIGNATURE_FLAG 0xFFFFFFFF -#define IA32_TSC_AUX_TSC_AUXILIARY_SIGNATURE_MASK 0xFFFFFFFF -#define IA32_TSC_AUX_TSC_AUXILIARY_SIGNATURE(_) (((_) >> 0) & 0xFFFFFFFF) - uint64_t reserved1 : 32; - }; - - uint64_t flags; -} ia32_tsc_aux_register; - -/** - * @} - */ - - /** - * @defgroup paging \ - * Paging - * @{ - */ - /** - * @defgroup paging_32 \ - * 32-Bit Paging - * - * A logical processor uses 32-bit paging if CR0.PG = 1 and CR4.PAE = 0. 32-bit paging translates 32-bit linear addresses - * to 40-bit physical addresses. Although 40 bits corresponds to 1 TByte, linear addresses are limited to 32 bits; at most - * 4 GBytes of linear-address space may be accessed at any given time. - * 32-bit paging uses a hierarchy of paging structures to produce a translation for a linear address. CR3 is used to locate - * the first paging-structure, the page directory. 32-bit paging may map linear addresses to either 4-KByte pages or - * 4-MByte pages. - * - * @see Vol3A[4.5(4-LEVEL PAGING)] (reference) - * @{ - */ - /** - * @brief Format of a 32-Bit Page-Directory Entry that Maps a 4-MByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to map a 4-MByte page. - */ - uint32_t present : 1; -#define PDE_4MB_32_PRESENT_BIT 0 -#define PDE_4MB_32_PRESENT_FLAG 0x01 -#define PDE_4MB_32_PRESENT_MASK 0x01 -#define PDE_4MB_32_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 4-MByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t write : 1; -#define PDE_4MB_32_WRITE_BIT 1 -#define PDE_4MB_32_WRITE_FLAG 0x02 -#define PDE_4MB_32_WRITE_MASK 0x01 -#define PDE_4MB_32_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 4-MByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t supervisor : 1; -#define PDE_4MB_32_SUPERVISOR_BIT 2 -#define PDE_4MB_32_SUPERVISOR_FLAG 0x04 -#define PDE_4MB_32_SUPERVISOR_MASK 0x01 -#define PDE_4MB_32_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the 4-MByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_write_through : 1; -#define PDE_4MB_32_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDE_4MB_32_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDE_4MB_32_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDE_4MB_32_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the 4-MByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_cache_disable : 1; -#define PDE_4MB_32_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDE_4MB_32_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDE_4MB_32_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDE_4MB_32_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether software has accessed the 4-MByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint32_t accessed : 1; -#define PDE_4MB_32_ACCESSED_BIT 5 -#define PDE_4MB_32_ACCESSED_FLAG 0x20 -#define PDE_4MB_32_ACCESSED_MASK 0x01 -#define PDE_4MB_32_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Dirty; indicates whether software has written to the 4-MByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint32_t dirty : 1; -#define PDE_4MB_32_DIRTY_BIT 6 -#define PDE_4MB_32_DIRTY_FLAG 0x40 -#define PDE_4MB_32_DIRTY_MASK 0x01 -#define PDE_4MB_32_DIRTY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Page size; must be 1 (otherwise, this entry references a page table). - */ - uint32_t large_page : 1; -#define PDE_4MB_32_LARGE_PAGE_BIT 7 -#define PDE_4MB_32_LARGE_PAGE_FLAG 0x80 -#define PDE_4MB_32_LARGE_PAGE_MASK 0x01 -#define PDE_4MB_32_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Global; if CR4.PGE = 1, determines whether the translation is global; ignored otherwise. - * - * @see Vol3A[4.10(Caching Translation Information)] - */ - uint32_t global : 1; -#define PDE_4MB_32_GLOBAL_BIT 8 -#define PDE_4MB_32_GLOBAL_FLAG 0x100 -#define PDE_4MB_32_GLOBAL_MASK 0x01 -#define PDE_4MB_32_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint32_t ignored_1 : 3; -#define PDE_4MB_32_IGNORED_1_BIT 9 -#define PDE_4MB_32_IGNORED_1_FLAG 0xE00 -#define PDE_4MB_32_IGNORED_1_MASK 0x07 -#define PDE_4MB_32_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bit 12] Indirectly determines the memory type used to access the 4-MByte page referenced by this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t pat : 1; -#define PDE_4MB_32_PAT_BIT 12 -#define PDE_4MB_32_PAT_FLAG 0x1000 -#define PDE_4MB_32_PAT_MASK 0x01 -#define PDE_4MB_32_PAT(_) (((_) >> 12) & 0x01) - - /** - * [Bits 20:13] Bits (M-1):32 of physical address of the 4-MByte page referenced by this entry. - */ - uint32_t page_frame_number_low : 8; -#define PDE_4MB_32_PAGE_FRAME_NUMBER_LOW_BIT 13 -#define PDE_4MB_32_PAGE_FRAME_NUMBER_LOW_FLAG 0x1FE000 -#define PDE_4MB_32_PAGE_FRAME_NUMBER_LOW_MASK 0xFF -#define PDE_4MB_32_PAGE_FRAME_NUMBER_LOW(_) (((_) >> 13) & 0xFF) - uint32_t reserved1 : 1; - - /** - * [Bits 31:22] Bits 31:22 of physical address of the 4-MByte page referenced by this entry. - */ - uint32_t page_frame_number_high : 10; -#define PDE_4MB_32_PAGE_FRAME_NUMBER_HIGH_BIT 22 -#define PDE_4MB_32_PAGE_FRAME_NUMBER_HIGH_FLAG 0xFFC00000 -#define PDE_4MB_32_PAGE_FRAME_NUMBER_HIGH_MASK 0x3FF -#define PDE_4MB_32_PAGE_FRAME_NUMBER_HIGH(_) (((_) >> 22) & 0x3FF) - }; - - uint32_t flags; -} pde_4mb_32; - -/** - * @brief Format of a 32-Bit Page-Directory Entry that References a Page Table - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to reference a page table. - */ - uint32_t present : 1; -#define PDE_32_PRESENT_BIT 0 -#define PDE_32_PRESENT_FLAG 0x01 -#define PDE_32_PRESENT_MASK 0x01 -#define PDE_32_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 4-MByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t write : 1; -#define PDE_32_WRITE_BIT 1 -#define PDE_32_WRITE_FLAG 0x02 -#define PDE_32_WRITE_MASK 0x01 -#define PDE_32_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 4-MByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t supervisor : 1; -#define PDE_32_SUPERVISOR_BIT 2 -#define PDE_32_SUPERVISOR_FLAG 0x04 -#define PDE_32_SUPERVISOR_MASK 0x01 -#define PDE_32_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the page table referenced by this - * entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_write_through : 1; -#define PDE_32_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDE_32_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDE_32_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDE_32_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the page table referenced by this - * entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_cache_disable : 1; -#define PDE_32_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDE_32_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDE_32_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDE_32_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether this entry has been used for linear-address translation. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint32_t accessed : 1; -#define PDE_32_ACCESSED_BIT 5 -#define PDE_32_ACCESSED_FLAG 0x20 -#define PDE_32_ACCESSED_MASK 0x01 -#define PDE_32_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Ignored. - */ - uint32_t ignored_1 : 1; -#define PDE_32_IGNORED_1_BIT 6 -#define PDE_32_IGNORED_1_FLAG 0x40 -#define PDE_32_IGNORED_1_MASK 0x01 -#define PDE_32_IGNORED_1(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] If CR4.PSE = 1, must be 0 (otherwise, this entry maps a 4-MByte page); otherwise, ignored. - */ - uint32_t large_page : 1; -#define PDE_32_LARGE_PAGE_BIT 7 -#define PDE_32_LARGE_PAGE_FLAG 0x80 -#define PDE_32_LARGE_PAGE_MASK 0x01 -#define PDE_32_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bits 11:8] Ignored. - */ - uint32_t ignored_2 : 4; -#define PDE_32_IGNORED_2_BIT 8 -#define PDE_32_IGNORED_2_FLAG 0xF00 -#define PDE_32_IGNORED_2_MASK 0x0F -#define PDE_32_IGNORED_2(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 31:12] Physical address of 4-KByte aligned page table referenced by this entry. - */ - uint32_t page_frame_number : 20; -#define PDE_32_PAGE_FRAME_NUMBER_BIT 12 -#define PDE_32_PAGE_FRAME_NUMBER_FLAG 0xFFFFF000 -#define PDE_32_PAGE_FRAME_NUMBER_MASK 0xFFFFF -#define PDE_32_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFF) - }; - - uint32_t flags; -} pde_32; - -/** - * @brief Format of a 32-Bit Page-Table Entry that Maps a 4-KByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to map a 4-KByte page. - */ - uint32_t present : 1; -#define PTE_32_PRESENT_BIT 0 -#define PTE_32_PRESENT_FLAG 0x01 -#define PTE_32_PRESENT_MASK 0x01 -#define PTE_32_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t write : 1; -#define PTE_32_WRITE_BIT 1 -#define PTE_32_WRITE_FLAG 0x02 -#define PTE_32_WRITE_MASK 0x01 -#define PTE_32_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint32_t supervisor : 1; -#define PTE_32_SUPERVISOR_BIT 2 -#define PTE_32_SUPERVISOR_FLAG 0x04 -#define PTE_32_SUPERVISOR_MASK 0x01 -#define PTE_32_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the 4-KByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_write_through : 1; -#define PTE_32_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PTE_32_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PTE_32_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PTE_32_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the 4-KByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t page_level_cache_disable : 1; -#define PTE_32_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PTE_32_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PTE_32_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PTE_32_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether software has accessed the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint32_t accessed : 1; -#define PTE_32_ACCESSED_BIT 5 -#define PTE_32_ACCESSED_FLAG 0x20 -#define PTE_32_ACCESSED_MASK 0x01 -#define PTE_32_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Dirty; indicates whether software has written to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint32_t dirty : 1; -#define PTE_32_DIRTY_BIT 6 -#define PTE_32_DIRTY_FLAG 0x40 -#define PTE_32_DIRTY_MASK 0x01 -#define PTE_32_DIRTY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Indirectly determines the memory type used to access the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint32_t pat : 1; -#define PTE_32_PAT_BIT 7 -#define PTE_32_PAT_FLAG 0x80 -#define PTE_32_PAT_MASK 0x01 -#define PTE_32_PAT(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Global; if CR4.PGE = 1, determines whether the translation is global; ignored otherwise. - * - * @see Vol3A[4.10(Caching Translation Information)] - */ - uint32_t global : 1; -#define PTE_32_GLOBAL_BIT 8 -#define PTE_32_GLOBAL_FLAG 0x100 -#define PTE_32_GLOBAL_MASK 0x01 -#define PTE_32_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint32_t ignored_1 : 3; -#define PTE_32_IGNORED_1_BIT 9 -#define PTE_32_IGNORED_1_FLAG 0xE00 -#define PTE_32_IGNORED_1_MASK 0x07 -#define PTE_32_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bits 31:12] Physical address of 4-KByte aligned page table referenced by this entry. - */ - uint32_t page_frame_number : 20; -#define PTE_32_PAGE_FRAME_NUMBER_BIT 12 -#define PTE_32_PAGE_FRAME_NUMBER_FLAG 0xFFFFF000 -#define PTE_32_PAGE_FRAME_NUMBER_MASK 0xFFFFF -#define PTE_32_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFF) - }; - - uint32_t flags; -} pte_32; - -/** - * @brief Format of a common Page-Table Entry - */ -typedef union -{ - struct - { - uint32_t present : 1; -#define PT_ENTRY_32_PRESENT_BIT 0 -#define PT_ENTRY_32_PRESENT_FLAG 0x01 -#define PT_ENTRY_32_PRESENT_MASK 0x01 -#define PT_ENTRY_32_PRESENT(_) (((_) >> 0) & 0x01) - uint32_t write : 1; -#define PT_ENTRY_32_WRITE_BIT 1 -#define PT_ENTRY_32_WRITE_FLAG 0x02 -#define PT_ENTRY_32_WRITE_MASK 0x01 -#define PT_ENTRY_32_WRITE(_) (((_) >> 1) & 0x01) - uint32_t supervisor : 1; -#define PT_ENTRY_32_SUPERVISOR_BIT 2 -#define PT_ENTRY_32_SUPERVISOR_FLAG 0x04 -#define PT_ENTRY_32_SUPERVISOR_MASK 0x01 -#define PT_ENTRY_32_SUPERVISOR(_) (((_) >> 2) & 0x01) - uint32_t page_level_write_through : 1; -#define PT_ENTRY_32_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PT_ENTRY_32_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PT_ENTRY_32_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PT_ENTRY_32_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - uint32_t page_level_cache_disable : 1; -#define PT_ENTRY_32_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PT_ENTRY_32_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PT_ENTRY_32_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PT_ENTRY_32_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - uint32_t accessed : 1; -#define PT_ENTRY_32_ACCESSED_BIT 5 -#define PT_ENTRY_32_ACCESSED_FLAG 0x20 -#define PT_ENTRY_32_ACCESSED_MASK 0x01 -#define PT_ENTRY_32_ACCESSED(_) (((_) >> 5) & 0x01) - uint32_t dirty : 1; -#define PT_ENTRY_32_DIRTY_BIT 6 -#define PT_ENTRY_32_DIRTY_FLAG 0x40 -#define PT_ENTRY_32_DIRTY_MASK 0x01 -#define PT_ENTRY_32_DIRTY(_) (((_) >> 6) & 0x01) - uint32_t large_page : 1; -#define PT_ENTRY_32_LARGE_PAGE_BIT 7 -#define PT_ENTRY_32_LARGE_PAGE_FLAG 0x80 -#define PT_ENTRY_32_LARGE_PAGE_MASK 0x01 -#define PT_ENTRY_32_LARGE_PAGE(_) (((_) >> 7) & 0x01) - uint32_t global : 1; -#define PT_ENTRY_32_GLOBAL_BIT 8 -#define PT_ENTRY_32_GLOBAL_FLAG 0x100 -#define PT_ENTRY_32_GLOBAL_MASK 0x01 -#define PT_ENTRY_32_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint32_t ignored_1 : 3; -#define PT_ENTRY_32_IGNORED_1_BIT 9 -#define PT_ENTRY_32_IGNORED_1_FLAG 0xE00 -#define PT_ENTRY_32_IGNORED_1_MASK 0x07 -#define PT_ENTRY_32_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bits 31:12] Physical address of the 4-KByte page referenced by this entry. - */ - uint32_t page_frame_number : 20; -#define PT_ENTRY_32_PAGE_FRAME_NUMBER_BIT 12 -#define PT_ENTRY_32_PAGE_FRAME_NUMBER_FLAG 0xFFFFF000 -#define PT_ENTRY_32_PAGE_FRAME_NUMBER_MASK 0xFFFFF -#define PT_ENTRY_32_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFF) - }; - - uint32_t flags; -} pt_entry_32; - -/** - * @defgroup paging_structures_entry_count_32 \ - * Paging structures entry counts - * - * Paging structures entry counts. - * @{ - */ -#define PDE_ENTRY_COUNT_32 0x00000400 -#define PTE_ENTRY_COUNT_32 0x00000400 - /** - * @} - */ - - /** - * @} - */ - - /** - * @defgroup paging_64 \ - * 64-Bit (4-Level) Paging - * - * A logical processor uses 4-level paging if CR0.PG = 1, CR4.PAE = 1, and IA32_EFER.LME = 1. With 4-level paging, linear - * address are translated using a hierarchy of in-memory paging structures located using the contents of CR3. 4-level - * paging translates 48-bit linear addresses to 52-bit physical addresses. Although 52 bits corresponds to 4 PBytes, linear - * addresses are limited to 48 bits; at most 256 TBytes of linear-address space may be accessed at any given time. - * 4-level paging uses a hierarchy of paging structures to produce a translation for a linear address. CR3 is used to - * locate the first paging-structure, the PML4 table. Use of CR3 with 4-level paging depends on whether processcontext - * identifiers (PCIDs) have been enabled by setting CR4.PCIDE. - * - * @see Vol3A[4.5(4-LEVEL PAGING)] (reference) - * @{ - */ - /** - * @brief Format of a 4-Level PML4 Entry (PML4E) that References a Page-Directory-Pointer Table - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to reference a page-directory-pointer table. - */ - uint64_t present : 1; -#define PML4E_64_PRESENT_BIT 0 -#define PML4E_64_PRESENT_FLAG 0x01 -#define PML4E_64_PRESENT_MASK 0x01 -#define PML4E_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 512-GByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PML4E_64_WRITE_BIT 1 -#define PML4E_64_WRITE_FLAG 0x02 -#define PML4E_64_WRITE_MASK 0x01 -#define PML4E_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 512-GByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PML4E_64_SUPERVISOR_BIT 2 -#define PML4E_64_SUPERVISOR_FLAG 0x04 -#define PML4E_64_SUPERVISOR_MASK 0x01 -#define PML4E_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the page-directory-pointer table - * referenced by this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PML4E_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PML4E_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PML4E_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PML4E_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the page-directory-pointer table - * referenced by this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PML4E_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PML4E_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PML4E_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PML4E_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether this entry has been used for linear-address translation. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PML4E_64_ACCESSED_BIT 5 -#define PML4E_64_ACCESSED_FLAG 0x20 -#define PML4E_64_ACCESSED_MASK 0x01 -#define PML4E_64_ACCESSED(_) (((_) >> 5) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 7] Reserved (must be 0). - */ - uint64_t must_be_zero : 1; -#define PML4E_64_MUST_BE_ZERO_BIT 7 -#define PML4E_64_MUST_BE_ZERO_FLAG 0x80 -#define PML4E_64_MUST_BE_ZERO_MASK 0x01 -#define PML4E_64_MUST_BE_ZERO(_) (((_) >> 7) & 0x01) - - /** - * [Bits 11:8] Ignored. - */ - uint64_t ignored_1 : 4; -#define PML4E_64_IGNORED_1_BIT 8 -#define PML4E_64_IGNORED_1_FLAG 0xF00 -#define PML4E_64_IGNORED_1_MASK 0x0F -#define PML4E_64_IGNORED_1(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 47:12] Physical address of 4-KByte aligned page-directory-pointer table referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define PML4E_64_PAGE_FRAME_NUMBER_BIT 12 -#define PML4E_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define PML4E_64_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define PML4E_64_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 4; - - /** - * [Bits 62:52] Ignored. - */ - uint64_t ignored_2 : 11; -#define PML4E_64_IGNORED_2_BIT 52 -#define PML4E_64_IGNORED_2_FLAG 0x7FF0000000000000 -#define PML4E_64_IGNORED_2_MASK 0x7FF -#define PML4E_64_IGNORED_2(_) (((_) >> 52) & 0x7FF) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 512-GByte region - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PML4E_64_EXECUTE_DISABLE_BIT 63 -#define PML4E_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PML4E_64_EXECUTE_DISABLE_MASK 0x01 -#define PML4E_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pml4e_64; - -/** - * @brief Format of a 4-Level Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to map a 1-GByte page. - */ - uint64_t present : 1; -#define PDPTE_1GB_64_PRESENT_BIT 0 -#define PDPTE_1GB_64_PRESENT_FLAG 0x01 -#define PDPTE_1GB_64_PRESENT_MASK 0x01 -#define PDPTE_1GB_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 1-GByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PDPTE_1GB_64_WRITE_BIT 1 -#define PDPTE_1GB_64_WRITE_FLAG 0x02 -#define PDPTE_1GB_64_WRITE_MASK 0x01 -#define PDPTE_1GB_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 1-GByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PDPTE_1GB_64_SUPERVISOR_BIT 2 -#define PDPTE_1GB_64_SUPERVISOR_FLAG 0x04 -#define PDPTE_1GB_64_SUPERVISOR_MASK 0x01 -#define PDPTE_1GB_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the 1-GByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PDPTE_1GB_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDPTE_1GB_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDPTE_1GB_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDPTE_1GB_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the 1-GByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PDPTE_1GB_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDPTE_1GB_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDPTE_1GB_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDPTE_1GB_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether software has accessed the 1-GByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PDPTE_1GB_64_ACCESSED_BIT 5 -#define PDPTE_1GB_64_ACCESSED_FLAG 0x20 -#define PDPTE_1GB_64_ACCESSED_MASK 0x01 -#define PDPTE_1GB_64_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Dirty; indicates whether software has written to the 1-GByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t dirty : 1; -#define PDPTE_1GB_64_DIRTY_BIT 6 -#define PDPTE_1GB_64_DIRTY_FLAG 0x40 -#define PDPTE_1GB_64_DIRTY_MASK 0x01 -#define PDPTE_1GB_64_DIRTY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Page size; must be 1 (otherwise, this entry references a page directory). - */ - uint64_t large_page : 1; -#define PDPTE_1GB_64_LARGE_PAGE_BIT 7 -#define PDPTE_1GB_64_LARGE_PAGE_FLAG 0x80 -#define PDPTE_1GB_64_LARGE_PAGE_MASK 0x01 -#define PDPTE_1GB_64_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Global; if CR4.PGE = 1, determines whether the translation is global; ignored otherwise. - * - * @see Vol3A[4.10(Caching Translation Information)] - */ - uint64_t global : 1; -#define PDPTE_1GB_64_GLOBAL_BIT 8 -#define PDPTE_1GB_64_GLOBAL_FLAG 0x100 -#define PDPTE_1GB_64_GLOBAL_MASK 0x01 -#define PDPTE_1GB_64_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint64_t ignored_1 : 3; -#define PDPTE_1GB_64_IGNORED_1_BIT 9 -#define PDPTE_1GB_64_IGNORED_1_FLAG 0xE00 -#define PDPTE_1GB_64_IGNORED_1_MASK 0x07 -#define PDPTE_1GB_64_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bit 12] Indirectly determines the memory type used to access the 1-GByte page referenced by this entry. - * - * @note The PAT is supported on all processors that support 4-level paging. - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t pat : 1; -#define PDPTE_1GB_64_PAT_BIT 12 -#define PDPTE_1GB_64_PAT_FLAG 0x1000 -#define PDPTE_1GB_64_PAT_MASK 0x01 -#define PDPTE_1GB_64_PAT(_) (((_) >> 12) & 0x01) - uint64_t reserved1 : 17; - - /** - * [Bits 47:30] Physical address of the 1-GByte page referenced by this entry. - */ - uint64_t page_frame_number : 18; -#define PDPTE_1GB_64_PAGE_FRAME_NUMBER_BIT 30 -#define PDPTE_1GB_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFC0000000 -#define PDPTE_1GB_64_PAGE_FRAME_NUMBER_MASK 0x3FFFF -#define PDPTE_1GB_64_PAGE_FRAME_NUMBER(_) (((_) >> 30) & 0x3FFFF) - uint64_t reserved2 : 4; - - /** - * [Bits 58:52] Ignored. - */ - uint64_t ignored_2 : 7; -#define PDPTE_1GB_64_IGNORED_2_BIT 52 -#define PDPTE_1GB_64_IGNORED_2_FLAG 0x7F0000000000000 -#define PDPTE_1GB_64_IGNORED_2_MASK 0x7F -#define PDPTE_1GB_64_IGNORED_2(_) (((_) >> 52) & 0x7F) - - /** - * [Bits 62:59] Protection key; if CR4.PKE = 1, determines the protection key of the page; ignored otherwise. - * - * @see Vol3A[4.6.2(Protection Keys)] - */ - uint64_t protection_key : 4; -#define PDPTE_1GB_64_PROTECTION_KEY_BIT 59 -#define PDPTE_1GB_64_PROTECTION_KEY_FLAG 0x7800000000000000 -#define PDPTE_1GB_64_PROTECTION_KEY_MASK 0x0F -#define PDPTE_1GB_64_PROTECTION_KEY(_) (((_) >> 59) & 0x0F) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 1-GByte page - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PDPTE_1GB_64_EXECUTE_DISABLE_BIT 63 -#define PDPTE_1GB_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PDPTE_1GB_64_EXECUTE_DISABLE_MASK 0x01 -#define PDPTE_1GB_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pdpte_1gb_64; - -/** - * @brief Format of a 4-Level Page-Directory-Pointer-Table Entry (PDPTE) that References a Page Directory - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to reference a page directory. - */ - uint64_t present : 1; -#define PDPTE_64_PRESENT_BIT 0 -#define PDPTE_64_PRESENT_FLAG 0x01 -#define PDPTE_64_PRESENT_MASK 0x01 -#define PDPTE_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 1-GByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PDPTE_64_WRITE_BIT 1 -#define PDPTE_64_WRITE_FLAG 0x02 -#define PDPTE_64_WRITE_MASK 0x01 -#define PDPTE_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 1-GByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PDPTE_64_SUPERVISOR_BIT 2 -#define PDPTE_64_SUPERVISOR_FLAG 0x04 -#define PDPTE_64_SUPERVISOR_MASK 0x01 -#define PDPTE_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the page directory referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PDPTE_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDPTE_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDPTE_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDPTE_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the page directory referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PDPTE_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDPTE_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDPTE_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDPTE_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether this entry has been used for linear-address translation. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PDPTE_64_ACCESSED_BIT 5 -#define PDPTE_64_ACCESSED_FLAG 0x20 -#define PDPTE_64_ACCESSED_MASK 0x01 -#define PDPTE_64_ACCESSED(_) (((_) >> 5) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 7] Page size; must be 0 (otherwise, this entry maps a 1-GByte page). - */ - uint64_t large_page : 1; -#define PDPTE_64_LARGE_PAGE_BIT 7 -#define PDPTE_64_LARGE_PAGE_FLAG 0x80 -#define PDPTE_64_LARGE_PAGE_MASK 0x01 -#define PDPTE_64_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bits 11:8] Ignored. - */ - uint64_t ignored_1 : 4; -#define PDPTE_64_IGNORED_1_BIT 8 -#define PDPTE_64_IGNORED_1_FLAG 0xF00 -#define PDPTE_64_IGNORED_1_MASK 0x0F -#define PDPTE_64_IGNORED_1(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 47:12] Physical address of 4-KByte aligned page directory referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define PDPTE_64_PAGE_FRAME_NUMBER_BIT 12 -#define PDPTE_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define PDPTE_64_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define PDPTE_64_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 4; - - /** - * [Bits 62:52] Ignored. - */ - uint64_t ignored_2 : 11; -#define PDPTE_64_IGNORED_2_BIT 52 -#define PDPTE_64_IGNORED_2_FLAG 0x7FF0000000000000 -#define PDPTE_64_IGNORED_2_MASK 0x7FF -#define PDPTE_64_IGNORED_2(_) (((_) >> 52) & 0x7FF) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 1-GByte region - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PDPTE_64_EXECUTE_DISABLE_BIT 63 -#define PDPTE_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PDPTE_64_EXECUTE_DISABLE_MASK 0x01 -#define PDPTE_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pdpte_64; - -/** - * @brief Format of a 4-Level Page-Directory Entry that Maps a 2-MByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to map a 2-MByte page. - */ - uint64_t present : 1; -#define PDE_2MB_64_PRESENT_BIT 0 -#define PDE_2MB_64_PRESENT_FLAG 0x01 -#define PDE_2MB_64_PRESENT_MASK 0x01 -#define PDE_2MB_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 2-MByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PDE_2MB_64_WRITE_BIT 1 -#define PDE_2MB_64_WRITE_FLAG 0x02 -#define PDE_2MB_64_WRITE_MASK 0x01 -#define PDE_2MB_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 2-MByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PDE_2MB_64_SUPERVISOR_BIT 2 -#define PDE_2MB_64_SUPERVISOR_FLAG 0x04 -#define PDE_2MB_64_SUPERVISOR_MASK 0x01 -#define PDE_2MB_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the 2-MByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PDE_2MB_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDE_2MB_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDE_2MB_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDE_2MB_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the 2-MByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PDE_2MB_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDE_2MB_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDE_2MB_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDE_2MB_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether software has accessed the 2-MByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PDE_2MB_64_ACCESSED_BIT 5 -#define PDE_2MB_64_ACCESSED_FLAG 0x20 -#define PDE_2MB_64_ACCESSED_MASK 0x01 -#define PDE_2MB_64_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Dirty; indicates whether software has written to the 2-MByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t dirty : 1; -#define PDE_2MB_64_DIRTY_BIT 6 -#define PDE_2MB_64_DIRTY_FLAG 0x40 -#define PDE_2MB_64_DIRTY_MASK 0x01 -#define PDE_2MB_64_DIRTY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Page size; must be 1 (otherwise, this entry references a page directory). - */ - uint64_t large_page : 1; -#define PDE_2MB_64_LARGE_PAGE_BIT 7 -#define PDE_2MB_64_LARGE_PAGE_FLAG 0x80 -#define PDE_2MB_64_LARGE_PAGE_MASK 0x01 -#define PDE_2MB_64_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Global; if CR4.PGE = 1, determines whether the translation is global; ignored otherwise. - * - * @see Vol3A[4.10(Caching Translation Information)] - */ - uint64_t global : 1; -#define PDE_2MB_64_GLOBAL_BIT 8 -#define PDE_2MB_64_GLOBAL_FLAG 0x100 -#define PDE_2MB_64_GLOBAL_MASK 0x01 -#define PDE_2MB_64_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint64_t ignored_1 : 3; -#define PDE_2MB_64_IGNORED_1_BIT 9 -#define PDE_2MB_64_IGNORED_1_FLAG 0xE00 -#define PDE_2MB_64_IGNORED_1_MASK 0x07 -#define PDE_2MB_64_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bit 12] Indirectly determines the memory type used to access the 2-MByte page referenced by this entry. - * - * @note The PAT is supported on all processors that support 4-level paging. - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t pat : 1; -#define PDE_2MB_64_PAT_BIT 12 -#define PDE_2MB_64_PAT_FLAG 0x1000 -#define PDE_2MB_64_PAT_MASK 0x01 -#define PDE_2MB_64_PAT(_) (((_) >> 12) & 0x01) - uint64_t reserved1 : 8; - - /** - * [Bits 47:21] Physical address of the 2-MByte page referenced by this entry. - */ - uint64_t page_frame_number : 27; -#define PDE_2MB_64_PAGE_FRAME_NUMBER_BIT 21 -#define PDE_2MB_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFE00000 -#define PDE_2MB_64_PAGE_FRAME_NUMBER_MASK 0x7FFFFFF -#define PDE_2MB_64_PAGE_FRAME_NUMBER(_) (((_) >> 21) & 0x7FFFFFF) - uint64_t reserved2 : 4; - - /** - * [Bits 58:52] Ignored. - */ - uint64_t ignored_2 : 7; -#define PDE_2MB_64_IGNORED_2_BIT 52 -#define PDE_2MB_64_IGNORED_2_FLAG 0x7F0000000000000 -#define PDE_2MB_64_IGNORED_2_MASK 0x7F -#define PDE_2MB_64_IGNORED_2(_) (((_) >> 52) & 0x7F) - - /** - * [Bits 62:59] Protection key; if CR4.PKE = 1, determines the protection key of the page; ignored otherwise. - * - * @see Vol3A[4.6.2(Protection Keys)] - */ - uint64_t protection_key : 4; -#define PDE_2MB_64_PROTECTION_KEY_BIT 59 -#define PDE_2MB_64_PROTECTION_KEY_FLAG 0x7800000000000000 -#define PDE_2MB_64_PROTECTION_KEY_MASK 0x0F -#define PDE_2MB_64_PROTECTION_KEY(_) (((_) >> 59) & 0x0F) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 2-MByte page - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PDE_2MB_64_EXECUTE_DISABLE_BIT 63 -#define PDE_2MB_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PDE_2MB_64_EXECUTE_DISABLE_MASK 0x01 -#define PDE_2MB_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pde_2mb_64; - -/** - * @brief Format of a 4-Level Page-Directory Entry that References a Page Table - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to reference a page table. - */ - uint64_t present : 1; -#define PDE_64_PRESENT_BIT 0 -#define PDE_64_PRESENT_FLAG 0x01 -#define PDE_64_PRESENT_MASK 0x01 -#define PDE_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 2-MByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PDE_64_WRITE_BIT 1 -#define PDE_64_WRITE_FLAG 0x02 -#define PDE_64_WRITE_MASK 0x01 -#define PDE_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 2-MByte region controlled by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PDE_64_SUPERVISOR_BIT 2 -#define PDE_64_SUPERVISOR_FLAG 0x04 -#define PDE_64_SUPERVISOR_MASK 0x01 -#define PDE_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the page table referenced by this - * entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PDE_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PDE_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PDE_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PDE_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the page table referenced by this - * entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PDE_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PDE_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PDE_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PDE_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether this entry has been used for linear-address translation. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PDE_64_ACCESSED_BIT 5 -#define PDE_64_ACCESSED_FLAG 0x20 -#define PDE_64_ACCESSED_MASK 0x01 -#define PDE_64_ACCESSED(_) (((_) >> 5) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 7] Page size; must be 0 (otherwise, this entry maps a 2-MByte page). - */ - uint64_t large_page : 1; -#define PDE_64_LARGE_PAGE_BIT 7 -#define PDE_64_LARGE_PAGE_FLAG 0x80 -#define PDE_64_LARGE_PAGE_MASK 0x01 -#define PDE_64_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bits 11:8] Ignored. - */ - uint64_t ignored_1 : 4; -#define PDE_64_IGNORED_1_BIT 8 -#define PDE_64_IGNORED_1_FLAG 0xF00 -#define PDE_64_IGNORED_1_MASK 0x0F -#define PDE_64_IGNORED_1(_) (((_) >> 8) & 0x0F) - - /** - * [Bits 47:12] Physical address of 4-KByte aligned page table referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define PDE_64_PAGE_FRAME_NUMBER_BIT 12 -#define PDE_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define PDE_64_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define PDE_64_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 4; - - /** - * [Bits 62:52] Ignored. - */ - uint64_t ignored_2 : 11; -#define PDE_64_IGNORED_2_BIT 52 -#define PDE_64_IGNORED_2_FLAG 0x7FF0000000000000 -#define PDE_64_IGNORED_2_MASK 0x7FF -#define PDE_64_IGNORED_2(_) (((_) >> 52) & 0x7FF) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 2-MByte region - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PDE_64_EXECUTE_DISABLE_BIT 63 -#define PDE_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PDE_64_EXECUTE_DISABLE_MASK 0x01 -#define PDE_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pde_64; - -/** - * @brief Format of a 4-Level Page-Table Entry that Maps a 4-KByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Present; must be 1 to map a 4-KByte page. - */ - uint64_t present : 1; -#define PTE_64_PRESENT_BIT 0 -#define PTE_64_PRESENT_FLAG 0x01 -#define PTE_64_PRESENT_MASK 0x01 -#define PTE_64_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Read/write; if 0, writes may not be allowed to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t write : 1; -#define PTE_64_WRITE_BIT 1 -#define PTE_64_WRITE_FLAG 0x02 -#define PTE_64_WRITE_MASK 0x01 -#define PTE_64_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] User/supervisor; if 0, user-mode accesses are not allowed to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t supervisor : 1; -#define PTE_64_SUPERVISOR_BIT 2 -#define PTE_64_SUPERVISOR_FLAG 0x04 -#define PTE_64_SUPERVISOR_MASK 0x01 -#define PTE_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Page-level write-through; indirectly determines the memory type used to access the 4-KByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_write_through : 1; -#define PTE_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PTE_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PTE_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PTE_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] Page-level cache disable; indirectly determines the memory type used to access the 4-KByte page referenced by - * this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t page_level_cache_disable : 1; -#define PTE_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PTE_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PTE_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PTE_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] Accessed; indicates whether software has accessed the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t accessed : 1; -#define PTE_64_ACCESSED_BIT 5 -#define PTE_64_ACCESSED_FLAG 0x20 -#define PTE_64_ACCESSED_MASK 0x01 -#define PTE_64_ACCESSED(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] Dirty; indicates whether software has written to the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.8(Accessed and Dirty Flags)] - */ - uint64_t dirty : 1; -#define PTE_64_DIRTY_BIT 6 -#define PTE_64_DIRTY_FLAG 0x40 -#define PTE_64_DIRTY_MASK 0x01 -#define PTE_64_DIRTY(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Indirectly determines the memory type used to access the 4-KByte page referenced by this entry. - * - * @see Vol3A[4.9.2(Paging and Memory Typing When the PAT is Supported (Pentium III and More Recent Processor Families))] - */ - uint64_t pat : 1; -#define PTE_64_PAT_BIT 7 -#define PTE_64_PAT_FLAG 0x80 -#define PTE_64_PAT_MASK 0x01 -#define PTE_64_PAT(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] Global; if CR4.PGE = 1, determines whether the translation is global; ignored otherwise. - * - * @see Vol3A[4.10(Caching Translation Information)] - */ - uint64_t global : 1; -#define PTE_64_GLOBAL_BIT 8 -#define PTE_64_GLOBAL_FLAG 0x100 -#define PTE_64_GLOBAL_MASK 0x01 -#define PTE_64_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint64_t ignored_1 : 3; -#define PTE_64_IGNORED_1_BIT 9 -#define PTE_64_IGNORED_1_FLAG 0xE00 -#define PTE_64_IGNORED_1_MASK 0x07 -#define PTE_64_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bits 47:12] Physical address of the 4-KByte page referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define PTE_64_PAGE_FRAME_NUMBER_BIT 12 -#define PTE_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define PTE_64_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define PTE_64_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved1 : 4; - - /** - * [Bits 58:52] Ignored. - */ - uint64_t ignored_2 : 7; -#define PTE_64_IGNORED_2_BIT 52 -#define PTE_64_IGNORED_2_FLAG 0x7F0000000000000 -#define PTE_64_IGNORED_2_MASK 0x7F -#define PTE_64_IGNORED_2(_) (((_) >> 52) & 0x7F) - - /** - * [Bits 62:59] Protection key; if CR4.PKE = 1, determines the protection key of the page; ignored otherwise. - * - * @see Vol3A[4.6.2(Protection Keys)] - */ - uint64_t protection_key : 4; -#define PTE_64_PROTECTION_KEY_BIT 59 -#define PTE_64_PROTECTION_KEY_FLAG 0x7800000000000000 -#define PTE_64_PROTECTION_KEY_MASK 0x0F -#define PTE_64_PROTECTION_KEY(_) (((_) >> 59) & 0x0F) - - /** - * [Bit 63] If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 1-GByte page - * controlled by this entry); otherwise, reserved (must be 0). - * - * @see Vol3A[4.6(Access Rights)] - */ - uint64_t execute_disable : 1; -#define PTE_64_EXECUTE_DISABLE_BIT 63 -#define PTE_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PTE_64_EXECUTE_DISABLE_MASK 0x01 -#define PTE_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pte_64; - -/** - * @brief Format of a common Page-Table Entry - */ -typedef union -{ - struct - { - uint64_t present : 1; -#define PT_ENTRY_64_PRESENT_BIT 0 -#define PT_ENTRY_64_PRESENT_FLAG 0x01 -#define PT_ENTRY_64_PRESENT_MASK 0x01 -#define PT_ENTRY_64_PRESENT(_) (((_) >> 0) & 0x01) - uint64_t write : 1; -#define PT_ENTRY_64_WRITE_BIT 1 -#define PT_ENTRY_64_WRITE_FLAG 0x02 -#define PT_ENTRY_64_WRITE_MASK 0x01 -#define PT_ENTRY_64_WRITE(_) (((_) >> 1) & 0x01) - uint64_t supervisor : 1; -#define PT_ENTRY_64_SUPERVISOR_BIT 2 -#define PT_ENTRY_64_SUPERVISOR_FLAG 0x04 -#define PT_ENTRY_64_SUPERVISOR_MASK 0x01 -#define PT_ENTRY_64_SUPERVISOR(_) (((_) >> 2) & 0x01) - uint64_t page_level_write_through : 1; -#define PT_ENTRY_64_PAGE_LEVEL_WRITE_THROUGH_BIT 3 -#define PT_ENTRY_64_PAGE_LEVEL_WRITE_THROUGH_FLAG 0x08 -#define PT_ENTRY_64_PAGE_LEVEL_WRITE_THROUGH_MASK 0x01 -#define PT_ENTRY_64_PAGE_LEVEL_WRITE_THROUGH(_) (((_) >> 3) & 0x01) - uint64_t page_level_cache_disable : 1; -#define PT_ENTRY_64_PAGE_LEVEL_CACHE_DISABLE_BIT 4 -#define PT_ENTRY_64_PAGE_LEVEL_CACHE_DISABLE_FLAG 0x10 -#define PT_ENTRY_64_PAGE_LEVEL_CACHE_DISABLE_MASK 0x01 -#define PT_ENTRY_64_PAGE_LEVEL_CACHE_DISABLE(_) (((_) >> 4) & 0x01) - uint64_t accessed : 1; -#define PT_ENTRY_64_ACCESSED_BIT 5 -#define PT_ENTRY_64_ACCESSED_FLAG 0x20 -#define PT_ENTRY_64_ACCESSED_MASK 0x01 -#define PT_ENTRY_64_ACCESSED(_) (((_) >> 5) & 0x01) - uint64_t dirty : 1; -#define PT_ENTRY_64_DIRTY_BIT 6 -#define PT_ENTRY_64_DIRTY_FLAG 0x40 -#define PT_ENTRY_64_DIRTY_MASK 0x01 -#define PT_ENTRY_64_DIRTY(_) (((_) >> 6) & 0x01) - uint64_t large_page : 1; -#define PT_ENTRY_64_LARGE_PAGE_BIT 7 -#define PT_ENTRY_64_LARGE_PAGE_FLAG 0x80 -#define PT_ENTRY_64_LARGE_PAGE_MASK 0x01 -#define PT_ENTRY_64_LARGE_PAGE(_) (((_) >> 7) & 0x01) - uint64_t global : 1; -#define PT_ENTRY_64_GLOBAL_BIT 8 -#define PT_ENTRY_64_GLOBAL_FLAG 0x100 -#define PT_ENTRY_64_GLOBAL_MASK 0x01 -#define PT_ENTRY_64_GLOBAL(_) (((_) >> 8) & 0x01) - - /** - * [Bits 11:9] Ignored. - */ - uint64_t ignored_1 : 3; -#define PT_ENTRY_64_IGNORED_1_BIT 9 -#define PT_ENTRY_64_IGNORED_1_FLAG 0xE00 -#define PT_ENTRY_64_IGNORED_1_MASK 0x07 -#define PT_ENTRY_64_IGNORED_1(_) (((_) >> 9) & 0x07) - - /** - * [Bits 47:12] Physical address of the 4-KByte page referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define PT_ENTRY_64_PAGE_FRAME_NUMBER_BIT 12 -#define PT_ENTRY_64_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define PT_ENTRY_64_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define PT_ENTRY_64_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved1 : 4; - - /** - * [Bits 58:52] Ignored. - */ - uint64_t ignored_2 : 7; -#define PT_ENTRY_64_IGNORED_2_BIT 52 -#define PT_ENTRY_64_IGNORED_2_FLAG 0x7F0000000000000 -#define PT_ENTRY_64_IGNORED_2_MASK 0x7F -#define PT_ENTRY_64_IGNORED_2(_) (((_) >> 52) & 0x7F) - uint64_t protection_key : 4; -#define PT_ENTRY_64_PROTECTION_KEY_BIT 59 -#define PT_ENTRY_64_PROTECTION_KEY_FLAG 0x7800000000000000 -#define PT_ENTRY_64_PROTECTION_KEY_MASK 0x0F -#define PT_ENTRY_64_PROTECTION_KEY(_) (((_) >> 59) & 0x0F) - uint64_t execute_disable : 1; -#define PT_ENTRY_64_EXECUTE_DISABLE_BIT 63 -#define PT_ENTRY_64_EXECUTE_DISABLE_FLAG 0x8000000000000000 -#define PT_ENTRY_64_EXECUTE_DISABLE_MASK 0x01 -#define PT_ENTRY_64_EXECUTE_DISABLE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} pt_entry_64; - -/** - * @defgroup paging_structures_entry_count_64 \ - * Paging structures entry counts - * - * Paging structures entry counts. - * @{ - */ -#define PML4E_ENTRY_COUNT_64 0x00000200 -#define PDPTE_ENTRY_COUNT_64 0x00000200 -#define PDE_ENTRY_COUNT_64 0x00000200 -#define PTE_ENTRY_COUNT_64 0x00000200 - /** - * @} - */ - - /** - * @} - */ - - /** - * @} - */ - - /** - * @defgroup segment_descriptors \ - * Segment descriptors - * @{ - */ - /** - * @brief Pseudo-Descriptor Format (32-bit) - * - * @see Vol3A[3.5.1(Segment Descriptor Tables)] (reference) - */ -#pragma pack(push, 1) -typedef struct -{ - /** - * Limit. - */ - uint16_t limit; - - /** - * Base Address. - */ - uint32_t base_address; -} segment_descriptor_register_32; -#pragma pack(pop) - -/** - * @brief Pseudo-Descriptor Format (64-bit) - * - * @see Vol3A[3.5.1(Segment Descriptor Tables)] (reference) - */ -#pragma pack(push, 1) -typedef struct -{ - /** - * Limit. - */ - uint16_t limit; - - /** - * Base Address. - */ - uint64_t base_address; -} segment_descriptor_register_64; -#pragma pack(pop) - -/** - * @brief Segment access rights - * - * @see Vol2A[3.2(Instructions (A-L) | LAR-Load Access Rights Byte)] (reference) - */ -typedef union -{ - struct - { - uint32_t reserved1 : 8; - - /** - * @brief Type field - * - * [Bits 11:8] Indicates the segment or gate type and specifies the kinds of access that can be made to the segment and the - * direction of growth. The interpretation of this field depends on whether the descriptor type flag specifies an - * application (code or data) descriptor or a system descriptor. The encoding of the type field is different for code, - * data, and system descriptors. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] - */ - uint32_t type : 4; -#define SEGMENT_ACCESS_RIGHTS_TYPE_BIT 8 -#define SEGMENT_ACCESS_RIGHTS_TYPE_FLAG 0xF00 -#define SEGMENT_ACCESS_RIGHTS_TYPE_MASK 0x0F -#define SEGMENT_ACCESS_RIGHTS_TYPE(_) (((_) >> 8) & 0x0F) - - /** - * @brief S (descriptor type) flag - * - * [Bit 12] Specifies whether the segment descriptor is for a system segment (S flag is clear) or a code or data segment (S - * flag is set). - */ - uint32_t descriptor_type : 1; -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_BIT 12 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_FLAG 0x1000 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE(_) (((_) >> 12) & 0x01) - - /** - * @brief DPL (descriptor privilege level) field - * - * [Bits 14:13] Specifies the privilege level of the segment. The privilege level can range from 0 to 3, with 0 being the - * most privileged level. The DPL is used to control access to the segment. See Section 5.5, "Privilege Levels", for a - * description of the relationship of the DPL to the CPL of the executing code segment and the RPL of a segment selector. - */ - uint32_t descriptor_privilege_level : 2; -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_BIT 13 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_FLAG 0x6000 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_MASK 0x03 -#define SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL(_) (((_) >> 13) & 0x03) - - /** - * @brief P (segment-present) flag - * - * [Bit 15] Indicates whether the segment is present in memory (set) or not present (clear). If this flag is clear, the - * processor generates a segment-not-present exception (\#NP) when a segment selector that points to the segment descriptor - * is loaded into a segment register. Memory management software can use this flag to control which segments are actually - * loaded into physical memory at a given time. It offers a control in addition to paging for managing virtual memory. - */ - uint32_t present : 1; -#define SEGMENT_ACCESS_RIGHTS_PRESENT_BIT 15 -#define SEGMENT_ACCESS_RIGHTS_PRESENT_FLAG 0x8000 -#define SEGMENT_ACCESS_RIGHTS_PRESENT_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_PRESENT(_) (((_) >> 15) & 0x01) - uint32_t reserved2 : 4; - - /** - * @brief Available bit - * - * [Bit 20] Bit 20 of the second doubleword of the segment descriptor is available for use by system software. - */ - uint32_t system : 1; -#define SEGMENT_ACCESS_RIGHTS_SYSTEM_BIT 20 -#define SEGMENT_ACCESS_RIGHTS_SYSTEM_FLAG 0x100000 -#define SEGMENT_ACCESS_RIGHTS_SYSTEM_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_SYSTEM(_) (((_) >> 20) & 0x01) - - /** - * @brief L (64-bit code segment) flag - * - * [Bit 21] In IA-32e mode, bit 21 of the second doubleword of the segment descriptor indicates whether a code segment - * contains native 64-bit code. A value of 1 indicates instructions in this code segment are executed in 64-bit mode. A - * value of 0 indicates the instructions in this code segment are executed in compatibility mode. If L-bit is set, then - * D-bit must be cleared. When not in IA-32e mode or for non-code segments, bit 21 is reserved and should always be set to - * 0. - */ - uint32_t long_mode : 1; -#define SEGMENT_ACCESS_RIGHTS_LONG_MODE_BIT 21 -#define SEGMENT_ACCESS_RIGHTS_LONG_MODE_FLAG 0x200000 -#define SEGMENT_ACCESS_RIGHTS_LONG_MODE_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_LONG_MODE(_) (((_) >> 21) & 0x01) - - /** - * @brief D/B (default operation size/default stack pointer size and/or upper bound) flag - * - * [Bit 22] Performs different functions depending on whether the segment descriptor is an executable code segment, an - * expand-down data segment, or a stack segment. (This flag should always be set to 1 for 32-bit code and data segments and - * to 0 for 16-bit code and data segments.) - * - Executable code segment. The flag is called the D flag and it indicates the default length for effective addresses and - * operands referenced by instructions in the segment. If the flag is set, 32-bit addresses and 32-bit or 8-bit operands - * are assumed; if it is clear, 16-bit addresses and 16-bit or 8-bit operands are assumed. The instruction prefix 66H can - * be used to select an operand size other than the default, and the prefix 67H can be used select an address size other - * than the default. - * - Stack segment (data segment pointed to by the SS register). The flag is called the B (big) flag and it specifies the - * size of the stack pointer used for implicit stack operations (such as pushes, pops, and calls). If the flag is set, a - * 32-bit stack pointer is used, which is stored in the 32-bit ESP register; if the flag is clear, a 16-bit stack pointer - * is used, which is stored in the 16- bit SP register. If the stack segment is set up to be an expand-down data segment - * (described in the next paragraph), the B flag also specifies the upper bound of the stack segment. - * - Expand-down data segment. The flag is called the B flag and it specifies the upper bound of the segment. If the flag - * is set, the upper bound is FFFFFFFFH (4 GBytes); if the flag is clear, the upper bound is FFFFH (64 KBytes). - */ - uint32_t default_big : 1; -#define SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_BIT 22 -#define SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_FLAG 0x400000 -#define SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG(_) (((_) >> 22) & 0x01) - - /** - * @brief G (granularity) flag - * - * [Bit 23] Determines the scaling of the segment limit field. When the granularity flag is clear, the segment limit is - * interpreted in byte units; when flag is set, the segment limit is interpreted in 4-KByte units. (This flag does not - * affect the granularity of the base address; it is always byte granular.) When the granularity flag is set, the twelve - * least significant bits of an offset are not tested when checking the offset against the segment limit. For example, when - * the granularity flag is set, a limit of 0 results in valid offsets from 0 to 4095. - */ - uint32_t granularity : 1; -#define SEGMENT_ACCESS_RIGHTS_GRANULARITY_BIT 23 -#define SEGMENT_ACCESS_RIGHTS_GRANULARITY_FLAG 0x800000 -#define SEGMENT_ACCESS_RIGHTS_GRANULARITY_MASK 0x01 -#define SEGMENT_ACCESS_RIGHTS_GRANULARITY(_) (((_) >> 23) & 0x01) - uint32_t reserved3 : 8; - }; - - uint32_t flags; -} segment_access_rights; - -/** - * @brief General Segment Descriptor (32-bit) - * - * A segment descriptor is a data structure in a GDT or LDT that provides the processor with the size and location of a - * segment, as well as access control and status information. Segment descriptors are typically created by compilers, - * linkers, loaders, or the operating system or executive, but not application programs. - * - * @see Vol3A[5.2(FIELDS AND FLAGS USED FOR SEGMENT-LEVEL AND PAGE-LEVEL PROTECTION)] - * @see Vol3A[5.2.1(Code-Segment Descriptor in 64-bit Mode)] - * @see Vol3A[5.8.3(Call Gates)] - * @see Vol3A[6.11(IDT DESCRIPTORS)] - * @see Vol3A[6.14.1(64-Bit Mode IDT)] - * @see Vol3A[7.2.2(TSS Descriptor)] - * @see Vol3A[7.2.3(TSS Descriptor in 64-bit mode)] - * @see Vol3A[7.2.5(Task-Gate Descriptor)] - * @see Vol3A[3.4.5(Segment Descriptors)] (reference) - */ -typedef struct -{ - /** - * @brief Segment limit field (15:00) - * - * Specifies the size of the segment. The processor puts together the two segment limit fields to form a 20-bit value. The - * processor interprets the segment limit in one of two ways, depending on the setting of the G (granularity) flag: - * - If the granularity flag is clear, the segment size can range from 1 byte to 1 MByte, in byte increments. - * - If the granularity flag is set, the segment size can range from 4 KBytes to 4 GBytes, in 4-KByte increments. - * The processor uses the segment limit in two different ways, depending on whether the segment is an expand-up or an - * expand-down segment. For expand-up segments, the offset in a logical address can range from 0 to the segment limit. - * Offsets greater than the segment limit generate general-protection exceptions (\#GP, for all segments other than SS) or - * stack-fault exceptions (\#SS for the SS segment). For expand-down segments, the segment limit has the reverse function; - * the offset can range from the segment limit plus 1 to FFFFFFFFH or FFFFH, depending on the setting of the B flag. - * Offsets less than or equal to the segment limit generate general-protection exceptions or stack-fault exceptions. - * Decreasing the value in the segment limit field for an expanddown segment allocates new memory at the bottom of the - * segment's address space, rather than at the top. IA-32 architecture stacks always grow downwards, making this mechanism - * convenient for expandable stacks. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] - */ - uint16_t segment_limit_low; - - /** - * @brief Base address field (15:00) - * - * Defines the location of byte 0 of the segment within the 4-GByte linear address space. The processor puts together the - * three base address fields to form a single 32-bit value. Segment base addresses should be aligned to 16-byte boundaries. - * Although 16-byte alignment is not required, this alignment allows programs to maximize performance by aligning code and - * data on 16-byte boundaries. - */ - uint16_t base_address_low; - /** - * @brief Segment descriptor fields - */ - union - { - struct - { - /** - * [Bits 7:0] Base address field (23:16); see description of $BASE_LOW for more details. - */ - uint32_t base_address_middle : 8; -#define SEGMENT__BASE_ADDRESS_MIDDLE_BIT 0 -#define SEGMENT__BASE_ADDRESS_MIDDLE_FLAG 0xFF -#define SEGMENT__BASE_ADDRESS_MIDDLE_MASK 0xFF -#define SEGMENT__BASE_ADDRESS_MIDDLE(_) (((_) >> 0) & 0xFF) - - /** - * @brief Type field - * - * [Bits 11:8] Indicates the segment or gate type and specifies the kinds of access that can be made to the segment and the - * direction of growth. The interpretation of this field depends on whether the descriptor type flag specifies an - * application (code or data) descriptor or a system descriptor. The encoding of the type field is different for code, - * data, and system descriptors. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] - */ - uint32_t type : 4; -#define SEGMENT__TYPE_BIT 8 -#define SEGMENT__TYPE_FLAG 0xF00 -#define SEGMENT__TYPE_MASK 0x0F -#define SEGMENT__TYPE(_) (((_) >> 8) & 0x0F) - - /** - * @brief S (descriptor type) flag - * - * [Bit 12] Specifies whether the segment descriptor is for a system segment (S flag is clear) or a code or data segment (S - * flag is set). - */ - uint32_t descriptor_type : 1; -#define SEGMENT__DESCRIPTOR_TYPE_BIT 12 -#define SEGMENT__DESCRIPTOR_TYPE_FLAG 0x1000 -#define SEGMENT__DESCRIPTOR_TYPE_MASK 0x01 -#define SEGMENT__DESCRIPTOR_TYPE(_) (((_) >> 12) & 0x01) - - /** - * @brief DPL (descriptor privilege level) field - * - * [Bits 14:13] Specifies the privilege level of the segment. The privilege level can range from 0 to 3, with 0 being the - * most privileged level. The DPL is used to control access to the segment. See Section 5.5, "Privilege Levels", for a - * description of the relationship of the DPL to the CPL of the executing code segment and the RPL of a segment selector. - */ - uint32_t descriptor_privilege_level : 2; -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_BIT 13 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_FLAG 0x6000 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_MASK 0x03 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL(_) (((_) >> 13) & 0x03) - - /** - * @brief P (segment-present) flag - * - * [Bit 15] Indicates whether the segment is present in memory (set) or not present (clear). If this flag is clear, the - * processor generates a segment-not-present exception (\#NP) when a segment selector that points to the segment descriptor - * is loaded into a segment register. Memory management software can use this flag to control which segments are actually - * loaded into physical memory at a given time. It offers a control in addition to paging for managing virtual memory. - */ - uint32_t present : 1; -#define SEGMENT__PRESENT_BIT 15 -#define SEGMENT__PRESENT_FLAG 0x8000 -#define SEGMENT__PRESENT_MASK 0x01 -#define SEGMENT__PRESENT(_) (((_) >> 15) & 0x01) - - /** - * [Bits 19:16] Segment limit field (19:16); see description of $LIMIT_LOW for more details. - */ - uint32_t segment_limit_high : 4; -#define SEGMENT__SEGMENT_LIMIT_HIGH_BIT 16 -#define SEGMENT__SEGMENT_LIMIT_HIGH_FLAG 0xF0000 -#define SEGMENT__SEGMENT_LIMIT_HIGH_MASK 0x0F -#define SEGMENT__SEGMENT_LIMIT_HIGH(_) (((_) >> 16) & 0x0F) - - /** - * @brief Available bit - * - * [Bit 20] Bit 20 of the second doubleword of the segment descriptor is available for use by system software. - */ - uint32_t system : 1; -#define SEGMENT__SYSTEM_BIT 20 -#define SEGMENT__SYSTEM_FLAG 0x100000 -#define SEGMENT__SYSTEM_MASK 0x01 -#define SEGMENT__SYSTEM(_) (((_) >> 20) & 0x01) - - /** - * @brief L (64-bit code segment) flag - * - * [Bit 21] In IA-32e mode, bit 21 of the second doubleword of the segment descriptor indicates whether a code segment - * contains native 64-bit code. A value of 1 indicates instructions in this code segment are executed in 64-bit mode. A - * value of 0 indicates the instructions in this code segment are executed in compatibility mode. If L-bit is set, then - * D-bit must be cleared. When not in IA-32e mode or for non-code segments, bit 21 is reserved and should always be set to - * 0. - */ - uint32_t long_mode : 1; -#define SEGMENT__LONG_MODE_BIT 21 -#define SEGMENT__LONG_MODE_FLAG 0x200000 -#define SEGMENT__LONG_MODE_MASK 0x01 -#define SEGMENT__LONG_MODE(_) (((_) >> 21) & 0x01) - - /** - * @brief D/B (default operation size/default stack pointer size and/or upper bound) flag - * - * [Bit 22] Performs different functions depending on whether the segment descriptor is an executable code segment, an - * expand-down data segment, or a stack segment. (This flag should always be set to 1 for 32-bit code and data segments and - * to 0 for 16-bit code and data segments.) - * - Executable code segment. The flag is called the D flag and it indicates the default length for effective addresses and - * operands referenced by instructions in the segment. If the flag is set, 32-bit addresses and 32-bit or 8-bit operands - * are assumed; if it is clear, 16-bit addresses and 16-bit or 8-bit operands are assumed. The instruction prefix 66H can - * be used to select an operand size other than the default, and the prefix 67H can be used select an address size other - * than the default. - * - Stack segment (data segment pointed to by the SS register). The flag is called the B (big) flag and it specifies the - * size of the stack pointer used for implicit stack operations (such as pushes, pops, and calls). If the flag is set, a - * 32-bit stack pointer is used, which is stored in the 32-bit ESP register; if the flag is clear, a 16-bit stack pointer - * is used, which is stored in the 16- bit SP register. If the stack segment is set up to be an expand-down data segment - * (described in the next paragraph), the B flag also specifies the upper bound of the stack segment. - * - Expand-down data segment. The flag is called the B flag and it specifies the upper bound of the segment. If the flag - * is set, the upper bound is FFFFFFFFH (4 GBytes); if the flag is clear, the upper bound is FFFFH (64 KBytes). - */ - uint32_t default_big : 1; -#define SEGMENT__DEFAULT_BIG_BIT 22 -#define SEGMENT__DEFAULT_BIG_FLAG 0x400000 -#define SEGMENT__DEFAULT_BIG_MASK 0x01 -#define SEGMENT__DEFAULT_BIG(_) (((_) >> 22) & 0x01) - - /** - * @brief G (granularity) flag - * - * [Bit 23] Determines the scaling of the segment limit field. When the granularity flag is clear, the segment limit is - * interpreted in byte units; when flag is set, the segment limit is interpreted in 4-KByte units. (This flag does not - * affect the granularity of the base address; it is always byte granular.) When the granularity flag is set, the twelve - * least significant bits of an offset are not tested when checking the offset against the segment limit. For example, when - * the granularity flag is set, a limit of 0 results in valid offsets from 0 to 4095. - */ - uint32_t granularity : 1; -#define SEGMENT__GRANULARITY_BIT 23 -#define SEGMENT__GRANULARITY_FLAG 0x800000 -#define SEGMENT__GRANULARITY_MASK 0x01 -#define SEGMENT__GRANULARITY(_) (((_) >> 23) & 0x01) - - /** - * [Bits 31:24] Base address field (31:24); see description of $BASE_LOW for more details. - */ - uint32_t base_address_high : 8; -#define SEGMENT__BASE_ADDRESS_HIGH_BIT 24 -#define SEGMENT__BASE_ADDRESS_HIGH_FLAG 0xFF000000 -#define SEGMENT__BASE_ADDRESS_HIGH_MASK 0xFF -#define SEGMENT__BASE_ADDRESS_HIGH(_) (((_) >> 24) & 0xFF) - }; - - uint32_t flags; - }; - -} segment_descriptor_32; - -/** - * @brief General Segment Descriptor (64-bit) - * - * A segment descriptor is a data structure in a GDT or LDT that provides the processor with the size and location of a - * segment, as well as access control and status information. Segment descriptors are typically created by compilers, - * linkers, loaders, or the operating system or executive, but not application programs. - * - * @see Vol3A[3.4.5(Segment Descriptors)] (reference) - */ -typedef struct -{ - /** - * @brief Segment limit field (15:00) - * - * Specifies the size of the segment. The processor puts together the two segment limit fields to form a 20-bit value. The - * processor interprets the segment limit in one of two ways, depending on the setting of the G (granularity) flag: - * - If the granularity flag is clear, the segment size can range from 1 byte to 1 MByte, in byte increments. - * - If the granularity flag is set, the segment size can range from 4 KBytes to 4 GBytes, in 4-KByte increments. - * The processor uses the segment limit in two different ways, depending on whether the segment is an expand-up or an - * expand-down segment. For expand-up segments, the offset in a logical address can range from 0 to the segment limit. - * Offsets greater than the segment limit generate general-protection exceptions (\#GP, for all segments other than SS) or - * stack-fault exceptions (\#SS for the SS segment). For expand-down segments, the segment limit has the reverse function; - * the offset can range from the segment limit plus 1 to FFFFFFFFH or FFFFH, depending on the setting of the B flag. - * Offsets less than or equal to the segment limit generate general-protection exceptions or stack-fault exceptions. - * Decreasing the value in the segment limit field for an expanddown segment allocates new memory at the bottom of the - * segment's address space, rather than at the top. IA-32 architecture stacks always grow downwards, making this mechanism - * convenient for expandable stacks. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] - */ - uint16_t segment_limit_low; - - /** - * @brief Base address field (15:00) - * - * Defines the location of byte 0 of the segment within the 4-GByte linear address space. The processor puts together the - * three base address fields to form a single 32-bit value. Segment base addresses should be aligned to 16-byte boundaries. - * Although 16-byte alignment is not required, this alignment allows programs to maximize performance by aligning code and - * data on 16-byte boundaries. - */ - uint16_t base_address_low; - /** - * @brief Segment descriptor fields - */ - union - { - struct - { - /** - * [Bits 7:0] Base address field (23:16); see description of $BASE_LOW for more details. - */ - uint32_t base_address_middle : 8; -#define SEGMENT__BASE_ADDRESS_MIDDLE_BIT 0 -#define SEGMENT__BASE_ADDRESS_MIDDLE_FLAG 0xFF -#define SEGMENT__BASE_ADDRESS_MIDDLE_MASK 0xFF -#define SEGMENT__BASE_ADDRESS_MIDDLE(_) (((_) >> 0) & 0xFF) - - /** - * @brief Type field - * - * [Bits 11:8] Indicates the segment or gate type and specifies the kinds of access that can be made to the segment and the - * direction of growth. The interpretation of this field depends on whether the descriptor type flag specifies an - * application (code or data) descriptor or a system descriptor. The encoding of the type field is different for code, - * data, and system descriptors. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] - */ - uint32_t type : 4; -#define SEGMENT__TYPE_BIT 8 -#define SEGMENT__TYPE_FLAG 0xF00 -#define SEGMENT__TYPE_MASK 0x0F -#define SEGMENT__TYPE(_) (((_) >> 8) & 0x0F) - - /** - * @brief S (descriptor type) flag - * - * [Bit 12] Specifies whether the segment descriptor is for a system segment (S flag is clear) or a code or data segment (S - * flag is set). - */ - uint32_t descriptor_type : 1; -#define SEGMENT__DESCRIPTOR_TYPE_BIT 12 -#define SEGMENT__DESCRIPTOR_TYPE_FLAG 0x1000 -#define SEGMENT__DESCRIPTOR_TYPE_MASK 0x01 -#define SEGMENT__DESCRIPTOR_TYPE(_) (((_) >> 12) & 0x01) - - /** - * @brief DPL (descriptor privilege level) field - * - * [Bits 14:13] Specifies the privilege level of the segment. The privilege level can range from 0 to 3, with 0 being the - * most privileged level. The DPL is used to control access to the segment. See Section 5.5, "Privilege Levels", for a - * description of the relationship of the DPL to the CPL of the executing code segment and the RPL of a segment selector. - */ - uint32_t descriptor_privilege_level : 2; -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_BIT 13 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_FLAG 0x6000 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL_MASK 0x03 -#define SEGMENT__DESCRIPTOR_PRIVILEGE_LEVEL(_) (((_) >> 13) & 0x03) - - /** - * @brief P (segment-present) flag - * - * [Bit 15] Indicates whether the segment is present in memory (set) or not present (clear). If this flag is clear, the - * processor generates a segment-not-present exception (\#NP) when a segment selector that points to the segment descriptor - * is loaded into a segment register. Memory management software can use this flag to control which segments are actually - * loaded into physical memory at a given time. It offers a control in addition to paging for managing virtual memory. - */ - uint32_t present : 1; -#define SEGMENT__PRESENT_BIT 15 -#define SEGMENT__PRESENT_FLAG 0x8000 -#define SEGMENT__PRESENT_MASK 0x01 -#define SEGMENT__PRESENT(_) (((_) >> 15) & 0x01) - - /** - * [Bits 19:16] Segment limit field (19:16); see description of $LIMIT_LOW for more details. - */ - uint32_t segment_limit_high : 4; -#define SEGMENT__SEGMENT_LIMIT_HIGH_BIT 16 -#define SEGMENT__SEGMENT_LIMIT_HIGH_FLAG 0xF0000 -#define SEGMENT__SEGMENT_LIMIT_HIGH_MASK 0x0F -#define SEGMENT__SEGMENT_LIMIT_HIGH(_) (((_) >> 16) & 0x0F) - - /** - * @brief Available bit - * - * [Bit 20] Bit 20 of the second doubleword of the segment descriptor is available for use by system software. - */ - uint32_t system : 1; -#define SEGMENT__SYSTEM_BIT 20 -#define SEGMENT__SYSTEM_FLAG 0x100000 -#define SEGMENT__SYSTEM_MASK 0x01 -#define SEGMENT__SYSTEM(_) (((_) >> 20) & 0x01) - - /** - * @brief L (64-bit code segment) flag - * - * [Bit 21] In IA-32e mode, bit 21 of the second doubleword of the segment descriptor indicates whether a code segment - * contains native 64-bit code. A value of 1 indicates instructions in this code segment are executed in 64-bit mode. A - * value of 0 indicates the instructions in this code segment are executed in compatibility mode. If L-bit is set, then - * D-bit must be cleared. When not in IA-32e mode or for non-code segments, bit 21 is reserved and should always be set to - * 0. - */ - uint32_t long_mode : 1; -#define SEGMENT__LONG_MODE_BIT 21 -#define SEGMENT__LONG_MODE_FLAG 0x200000 -#define SEGMENT__LONG_MODE_MASK 0x01 -#define SEGMENT__LONG_MODE(_) (((_) >> 21) & 0x01) - - /** - * @brief D/B (default operation size/default stack pointer size and/or upper bound) flag - * - * [Bit 22] Performs different functions depending on whether the segment descriptor is an executable code segment, an - * expand-down data segment, or a stack segment. (This flag should always be set to 1 for 32-bit code and data segments and - * to 0 for 16-bit code and data segments.) - * - Executable code segment. The flag is called the D flag and it indicates the default length for effective addresses and - * operands referenced by instructions in the segment. If the flag is set, 32-bit addresses and 32-bit or 8-bit operands - * are assumed; if it is clear, 16-bit addresses and 16-bit or 8-bit operands are assumed. The instruction prefix 66H can - * be used to select an operand size other than the default, and the prefix 67H can be used select an address size other - * than the default. - * - Stack segment (data segment pointed to by the SS register). The flag is called the B (big) flag and it specifies the - * size of the stack pointer used for implicit stack operations (such as pushes, pops, and calls). If the flag is set, a - * 32-bit stack pointer is used, which is stored in the 32-bit ESP register; if the flag is clear, a 16-bit stack pointer - * is used, which is stored in the 16- bit SP register. If the stack segment is set up to be an expand-down data segment - * (described in the next paragraph), the B flag also specifies the upper bound of the stack segment. - * - Expand-down data segment. The flag is called the B flag and it specifies the upper bound of the segment. If the flag - * is set, the upper bound is FFFFFFFFH (4 GBytes); if the flag is clear, the upper bound is FFFFH (64 KBytes). - */ - uint32_t default_big : 1; -#define SEGMENT__DEFAULT_BIG_BIT 22 -#define SEGMENT__DEFAULT_BIG_FLAG 0x400000 -#define SEGMENT__DEFAULT_BIG_MASK 0x01 -#define SEGMENT__DEFAULT_BIG(_) (((_) >> 22) & 0x01) - - /** - * @brief G (granularity) flag - * - * [Bit 23] Determines the scaling of the segment limit field. When the granularity flag is clear, the segment limit is - * interpreted in byte units; when flag is set, the segment limit is interpreted in 4-KByte units. (This flag does not - * affect the granularity of the base address; it is always byte granular.) When the granularity flag is set, the twelve - * least significant bits of an offset are not tested when checking the offset against the segment limit. For example, when - * the granularity flag is set, a limit of 0 results in valid offsets from 0 to 4095. - */ - uint32_t granularity : 1; -#define SEGMENT__GRANULARITY_BIT 23 -#define SEGMENT__GRANULARITY_FLAG 0x800000 -#define SEGMENT__GRANULARITY_MASK 0x01 -#define SEGMENT__GRANULARITY(_) (((_) >> 23) & 0x01) - - /** - * [Bits 31:24] Base address field (31:24); see description of $BASE_LOW for more details. - */ - uint32_t base_address_high : 8; -#define SEGMENT__BASE_ADDRESS_HIGH_BIT 24 -#define SEGMENT__BASE_ADDRESS_HIGH_FLAG 0xFF000000 -#define SEGMENT__BASE_ADDRESS_HIGH_MASK 0xFF -#define SEGMENT__BASE_ADDRESS_HIGH(_) (((_) >> 24) & 0xFF) - }; - - uint32_t flags; - }; - - - /** - * Base address field (32:63); see description of $BASE_LOW for more details. - */ - uint32_t base_address_upper; - - /** - * Base address field (32:63); see description of $BASE_LOW for more details. - */ - uint32_t must_be_zero; -} segment_descriptor_64; - -#define SEGMENT_DESCRIPTOR_TYPE_SYSTEM 0x00000000 -#define SEGMENT_DESCRIPTOR_TYPE_CODE_OR_DATA 0x00000001 -/** - * @defgroup segment_descriptor_code_and_data_type \ - * Code- and Data-Segment Descriptor Types - * - * When the S (descriptor type) flag in a segment descriptor is set, the descriptor is for either a code or a data segment. - * The highest order bit of the type field (bit 11 of the second double word of the segment descriptor) then determines - * whether the descriptor is for a data segment (clear) or a code segment (set). For data segments, the three low-order - * bits of the type field (bits 8, 9, and 10) are interpreted as accessed (A), write-enable (W), and expansion-direction - * (E). See Table 3-1 for a description of the encoding of the bits in the type field for code and data segments. Data - * segments can be read-only or read/write segments, depending on the setting of the write-enable bit. - * - * @see Vol3A[3.4.5.1(Code- and Data-Segment Descriptor Types)] (reference) - * @{ - */ - /** - * Read-Only. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_ONLY 0x00000000 - - /** - * Data Read-Only, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_ONLY_ACCESSED 0x00000001 - - /** - * Data Read/Write. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_WRITE 0x00000002 - - /** - * Data Read/Write, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_WRITE_ACCESSED 0x00000003 - - /** - * Data Read-Only, expand-down. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_ONLY_EXPAND_DOWN 0x00000004 - - /** - * Data Read-Only, expand-down, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_ONLY_EXPAND_DOWN_ACCESSED 0x00000005 - - /** - * Data Read/Write, expand-down. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_WRITE_EXPAND_DOWN 0x00000006 - - /** - * Data Read/Write, expand-down, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_DATA_READ_WRITE_EXPAND_DOWN_ACCESSED 0x00000007 - - /** - * Code Execute-Only. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_ONLY 0x00000008 - - /** - * Code Execute-Only, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_ONLY_ACCESSED 0x00000009 - - /** - * Code Execute/Read. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_READ 0x0000000A - - /** - * Code Execute/Read, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_READ_ACCESSED 0x0000000B - - /** - * Code Execute-Only, conforming. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_ONLY_CONFORMING 0x0000000C - - /** - * Code Execute-Only, conforming, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_ONLY_CONFORMING_ACCESSED 0x0000000D - - /** - * Code Execute/Read, conforming. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_READ_CONFORMING 0x0000000E - - /** - * Code Execute/Read, conforming, accessed. - */ -#define SEGMENT_DESCRIPTOR_TYPE_CODE_EXECUTE_READ_CONFORMING_ACCESSED 0x0000000F - /** - * @} - */ - - /** - * @defgroup segment_descriptor_system_type \ - * System Descriptor Types - * - * When the S (descriptor type) flag in a segment descriptor is clear, the descriptor type is a system descriptor. The - * processor recognizes the following types of system descriptors: - * - Local descriptor-table (LDT) segment descriptor. - * - Task-state segment (TSS) descriptor. - * - Call-gate descriptor. - * - Interrupt-gate descriptor. - * - Trap-gate descriptor. - * - Task-gate descriptor. - * These descriptor types fall into two categories: system-segment descriptors and gate descriptors. Systemsegment - * descriptors point to system segments (LDT and TSS segments). Gate descriptors are in themselves "gates," which hold - * pointers to procedure entry points in code segments (call, interrupt, and trap gates) or which hold segment selectors - * for TSS's (task gates). - * - * @see Vol3A[3.5(SYSTEM DESCRIPTOR TYPES)] (reference) - * @{ - */ - /** - * - 32-Bit Mode: Reserved - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_RESERVED_1 0x00000000 - - /** - * - 32-Bit Mode: 16-bit TSS (Available) - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_TSS_16_AVAILABLE 0x00000001 - - /** - * - 32-Bit Mode: LDT - * - IA-32e Mode: LDT - */ -#define SEGMENT_DESCRIPTOR_TYPE_LDT 0x00000002 - - /** - * - 32-Bit Mode: 16-bit TSS (Busy) - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_TSS_16_BUSY 0x00000003 - - /** - * - 32-Bit Mode: 16-bit Call Gate - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_CALL_GATE_16 0x00000004 - - /** - * - 32-Bit Mode: Task Gate - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_TASK_GATE 0x00000005 - - /** - * - 32-Bit Mode: 16-bit Interrupt Gate - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_INTERRUPT_GATE_16 0x00000006 - - /** - * - 32-Bit Mode: 16-bit Trap Gate - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_TRAP_GATE_16 0x00000007 - - /** - * - 32-Bit Mode: Reserved - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_RESERVED_2 0x00000008 - - /** - * - 32-Bit Mode: 32-bit TSS (Available) - * - IA-32e Mode: 64-bit TSS (Available) - */ -#define SEGMENT_DESCRIPTOR_TYPE_TSS_AVAILABLE 0x00000009 - - /** - * - 32-Bit Mode: Reserved - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_RESERVED_3 0x0000000A - - /** - * - 32-Bit Mode: 32-bit TSS (Busy) - * - IA-32e Mode: 64-bit TSS (Busy) - */ -#define SEGMENT_DESCRIPTOR_TYPE_TSS_BUSY 0x0000000B - - /** - * - 32-Bit Mode: 32-bit Call Gate - * - IA-32e Mode: 64-bit Call Gate - */ -#define SEGMENT_DESCRIPTOR_TYPE_CALL_GATE 0x0000000C - - /** - * - 32-Bit Mode: Reserved - * - IA-32e Mode: Reserved - */ -#define SEGMENT_DESCRIPTOR_TYPE_RESERVED_4 0x0000000D - - /** - * - 32-Bit Mode: 32-bit Interrupt Gate - * - IA-32e Mode: 64-bit Interrupt Gate - */ -#define SEGMENT_DESCRIPTOR_TYPE_INTERRUPT_GATE 0x0000000E - - /** - * - 32-Bit Mode: 32-bit Trap Gate - * - IA-32e Mode: 64-bit Trap Gate - */ -#define SEGMENT_DESCRIPTOR_TYPE_TRAP_GATE 0x0000000F - /** - * @} - */ - - /** - * @brief A segment selector is a 16-bit identifier for a segment. It does not point directly to the segment, but instead - * points to the segment descriptor that defines the segment - * - * @see Vol3A[3.4.2(Segment Selectors)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bits 1:0] Specifies the privilege level of the selector. The privilege level can range from 0 to 3, with 0 being the - * most privileged level. - * - * @see Vol3A[5.5(Privilege Levels)] - */ - uint16_t request_privilege_level : 2; -#define SEGMENT_SELECTOR_REQUEST_PRIVILEGE_LEVEL_BIT 0 -#define SEGMENT_SELECTOR_REQUEST_PRIVILEGE_LEVEL_FLAG 0x03 -#define SEGMENT_SELECTOR_REQUEST_PRIVILEGE_LEVEL_MASK 0x03 -#define SEGMENT_SELECTOR_REQUEST_PRIVILEGE_LEVEL(_) (((_) >> 0) & 0x03) - - /** - * [Bit 2] Specifies the descriptor table to use: clearing this flag selects the GDT; setting this flag selects the current - * LDT. - */ - uint16_t table : 1; -#define SEGMENT_SELECTOR_TABLE_BIT 2 -#define SEGMENT_SELECTOR_TABLE_FLAG 0x04 -#define SEGMENT_SELECTOR_TABLE_MASK 0x01 -#define SEGMENT_SELECTOR_TABLE(_) (((_) >> 2) & 0x01) - - /** - * [Bits 15:3] Selects one of 8192 descriptors in the GDT or LDT. The processor multiplies the index value by 8 (the number - * of bytes in a segment descriptor) and adds the result to the base address of the GDT or LDT (from the GDTR or LDTR - * register, respectively). - */ - uint16_t index : 13; -#define SEGMENT_SELECTOR_INDEX_BIT 3 -#define SEGMENT_SELECTOR_INDEX_FLAG 0xFFF8 -#define SEGMENT_SELECTOR_INDEX_MASK 0x1FFF -#define SEGMENT_SELECTOR_INDEX(_) (((_) >> 3) & 0x1FFF) - }; - - uint16_t flags; -} segment_selector; - -/** - * @} - */ - - /** - * @defgroup vmx \ - * VMX - * @{ - */ - /** - * @{ - */ - /** - * @defgroup vmx_basic_exit_reasons \ - * VMX Basic Exit Reasons - * - * VMX Basic Exit Reasons. - * - * @see Vol3D[C(VMX BASIC EXIT REASONS)] (reference) - * @{ - */ - /** - * @brief Exception or non-maskable interrupt (NMI) - * - * Either: - * -# Guest software caused an exception and the bit in the exception bitmap associated with exception's vector was 1. This - * case includes executions of BOUND that cause \#BR, executions of INT1 (they cause \#DB), executions of INT3 (they cause - * \#BP), executions of INTO that cause \#OF, and executions of UD0, UD1, and UD2 (they cause \#UD). - * -# An NMI was delivered to the logical processor and the "NMI exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXCEPTION_OR_NMI 0x00000000 - - /** - * @brief External interrupt - * - * An external interrupt arrived and the "external-interrupt exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXTERNAL_INTERRUPT 0x00000001 - - /** - * @brief Triple fault - * - * The logical processor encountered an exception while attempting to call the double-fault handler and that exception did - * not itself cause a VM exit due to the exception bitmap. - */ -#define VMX_EXIT_REASON_TRIPLE_FAULT 0x00000002 - - /** - * @brief INIT signal - * - * An INIT signal arrived. - */ -#define VMX_EXIT_REASON_INIT_SIGNAL 0x00000003 - - /** - * @brief Start-up IPI (SIPI) - * - * A SIPI arrived while the logical processor was in the "wait-for-SIPI" state. - */ -#define VMX_EXIT_REASON_STARTUP_IPI 0x00000004 - - /** - * @brief I/O system-management interrupt (SMI) - * - * An SMI arrived immediately after retirement of an I/O instruction and caused an SMM VM exit. - * - * @see Vol3C[34.15.2(SMM VM Exits)] - */ -#define VMX_EXIT_REASON_IO_SMI 0x00000005 - - /** - * @brief Other SMI - * - * An SMI arrived and caused an SMM VM exit but not immediately after retirement of an I/O instruction. - * - * @see Vol3C[34.15.2(SMM VM Exits)] - */ -#define VMX_EXIT_REASON_SMI 0x00000006 - - /** - * @brief Interrupt window exiting - * - * At the beginning of an instruction, RFLAGS.IF was 1; events were not blocked by STI or by MOV SS; and the - * "interrupt-window exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_INTERRUPT_WINDOW 0x00000007 - - /** - * @brief NMI window exiting - * - * At the beginning of an instruction, there was no virtual-NMI blocking; events were not blocked by MOV SS; and the - * "NMI-window exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_NMI_WINDOW 0x00000008 - - /** - * @brief Task switch - * - * Guest software attempted a task switch. - */ -#define VMX_EXIT_REASON_TASK_SWITCH 0x00000009 - - /** - * @brief CPUID - * - * Guest software attempted to execute CPUID. - */ -#define VMX_EXIT_REASON_EXECUTE_CPUID 0x0000000A - - /** - * @brief GETSEC - * - * Guest software attempted to execute GETSEC. - */ -#define VMX_EXIT_REASON_EXECUTE_GETSEC 0x0000000B - - /** - * @brief HLT - * - * Guest software attempted to execute HLT and the "HLT exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_HLT 0x0000000C - - /** - * @brief INVD - * - * Guest software attempted to execute INVD. - */ -#define VMX_EXIT_REASON_EXECUTE_INVD 0x0000000D - - /** - * @brief INVLPG - * - * Guest software attempted to execute INVLPG and the "INVLPG exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_INVLPG 0x0000000E - - /** - * @brief RDPMC - * - * Guest software attempted to execute RDPMC and the "RDPMC exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_RDPMC 0x0000000F - - /** - * @brief RDTSC - * - * Guest software attempted to execute RDTSC and the "RDTSC exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_RDTSC 0x00000010 - - /** - * @brief RSM in SMM - * - * Guest software attempted to execute RSM in SMM. - */ -#define VMX_EXIT_REASON_EXECUTE_RSM_IN_SMM 0x00000011 - - /** - * @brief VMCALL - * - * VMCALL was executed either by guest software (causing an ordinary VM exit) or by the executive monitor (causing an SMM - * VM exit). - * - * @see Vol3C[34.15.2(SMM VM Exits)] - */ -#define VMX_EXIT_REASON_EXECUTE_VMCALL 0x00000012 - - /** - * @brief VMCLEAR - * - * Guest software attempted to execute VMCLEAR. - */ -#define VMX_EXIT_REASON_EXECUTE_VMCLEAR 0x00000013 - - /** - * @brief VMLAUNCH - * - * Guest software attempted to execute VMLAUNCH. - */ -#define VMX_EXIT_REASON_EXECUTE_VMLAUNCH 0x00000014 - - /** - * @brief VMPTRLD - * - * Guest software attempted to execute VMPTRLD. - */ -#define VMX_EXIT_REASON_EXECUTE_VMPTRLD 0x00000015 - - /** - * @brief VMPTRST - * - * Guest software attempted to execute VMPTRST. - */ -#define VMX_EXIT_REASON_EXECUTE_VMPTRST 0x00000016 - - /** - * @brief VMREAD - * - * Guest software attempted to execute VMREAD. - */ -#define VMX_EXIT_REASON_EXECUTE_VMREAD 0x00000017 - - /** - * @brief VMRESUME - * - * Guest software attempted to execute VMRESUME. - */ -#define VMX_EXIT_REASON_EXECUTE_VMRESUME 0x00000018 - - /** - * @brief VMWRITE - * - * Guest software attempted to execute VMWRITE. - */ -#define VMX_EXIT_REASON_EXECUTE_VMWRITE 0x00000019 - - /** - * @brief VMXOFF - * - * Guest software attempted to execute VMXOFF. - */ -#define VMX_EXIT_REASON_EXECUTE_VMXOFF 0x0000001A - - /** - * @brief VMXON - * - * Guest software attempted to execute VMXON. - */ -#define VMX_EXIT_REASON_EXECUTE_VMXON 0x0000001B - - /** - * @brief Control-register accesses - * - * Guest software attempted to access CR0, CR3, CR4, or CR8 using CLTS, LMSW, or MOV CR and the VM-execution control fields - * indicate that a VM exit should occur. This basic exit reason is not used for trap-like VM exits following executions of - * the MOV to CR8 instruction when the "use TPR shadow" VM-execution control is 1. Such VM exits instead use basic exit - * reason 43. - * - * @see Vol3C[25.1(INSTRUCTIONS THAT CAUSE VM EXITS)] - */ -#define VMX_EXIT_REASON_MOV_CR 0x0000001C - - /** - * @brief Debug-register accesses - * - * Guest software attempted a MOV to or from a debug register and the "MOV-DR exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_MOV_DR 0x0000001D - - /** - * @brief I/O instruction - * - * Guest software attempted to execute an I/O instruction and either: - * -# The "use I/O bitmaps" VM-execution control was 0 and the "unconditional I/O exiting" VM-execution control was 1. - * -# The "use I/O bitmaps" VM-execution control was 1 and a bit in the I/O bitmap associated with one of the ports - * accessed by the I/O instruction was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_IO_INSTRUCTION 0x0000001E - - /** - * @brief RDMSR - * - * Guest software attempted to execute RDMSR and either: - * -# The "use MSR bitmaps" VM-execution control was 0. - * -# The value of RCX is neither in the range 00000000H - 00001FFFH nor in the range C0000000H - C0001FFFH. - * -# The value of RCX was in the range 00000000H - 00001FFFH and the nth bit in read bitmap for low MSRs is 1, where n was - * the value of RCX. - * -# The value of RCX is in the range C0000000H - C0001FFFH and the nth bit in read bitmap for high MSRs is 1, where n is - * the value of RCX & 00001FFFH. - */ -#define VMX_EXIT_REASON_EXECUTE_RDMSR 0x0000001F - - /** - * @brief WRMSR - * - * Guest software attempted to execute WRMSR and either: - * -# The "use MSR bitmaps" VM-execution control was 0. - * -# The value of RCX is neither in the range 00000000H - 00001FFFH nor in the range C0000000H - C0001FFFH. - * -# The value of RCX was in the range 00000000H - 00001FFFH and the nth bit in write bitmap for low MSRs is 1, where n - * was the value of RCX. - * -# The value of RCX is in the range C0000000H - C0001FFFH and the nth bit in write bitmap for high MSRs is 1, where n is - * the value of RCX & 00001FFFH. - */ -#define VMX_EXIT_REASON_EXECUTE_WRMSR 0x00000020 - - /** - * @brief VM-entry failure due to invalid guest state - * - * A VM entry failed one of the checks identified in Section 26.3.1. - */ -#define VMX_EXIT_REASON_ERROR_INVALID_GUEST_STATE 0x00000021 - - /** - * @brief VM-entry failure due to MSR loading - * - * A VM entry failed in an attempt to load MSRs. See Section 26.4. - */ -#define VMX_EXIT_REASON_ERROR_MSR_LOAD 0x00000022 - - /** - * @brief Guest software executed MWAIT - * - * Guest software attempted to execute MWAIT and the "MWAIT exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_MWAIT 0x00000024 - - /** - * @brief VM-exit due to monitor trap flag - * - * A VM entry occurred due to the 1-setting of the "monitor trap flag" VM-execution control and injection of an MTF VM exit - * as part of VM entry. - * - * @see Vol3C[25.5.2(Monitor Trap Flag)] - */ -#define VMX_EXIT_REASON_MONITOR_TRAP_FLAG 0x00000025 - - /** - * @brief Guest software attempted to execute MONITOR - * - * Guest software attempted to execute MONITOR and the "MONITOR exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_MONITOR 0x00000027 - - /** - * @brief Guest software attempted to execute PAUSE - * - * Either guest software attempted to execute PAUSE and the "PAUSE exiting" VM-execution control was 1 or the "PAUSE-loop - * exiting" VM-execution control was 1 and guest software executed a PAUSE loop with execution time exceeding PLE_Window. - * - * @see Vol3C[25.1.3(Instructions That Cause VM Exits Conditionally)] - */ -#define VMX_EXIT_REASON_EXECUTE_PAUSE 0x00000028 - - /** - * @brief VM-entry failure due to machine-check - * - * A machine-check event occurred during VM entry. - * - * @see Vol3C[26.8(MACHINE-CHECK EVENTS DURING VM ENTRY)] - */ -#define VMX_EXIT_REASON_ERROR_MACHINE_CHECK 0x00000029 - - /** - * @brief TPR below threshold - * - * The logical processor determined that the value of bits 7:4 of the byte at offset 080H on the virtual-APIC page was - * below that of the TPR threshold VM-execution control field while the "use TPR shadow" VMexecution control was 1 either - * as part of TPR virtualization or VM entry. - * - * @see Vol3C[29.1.2(TPR Virtualization)] - * @see Vol3C[26.6.7(VM Exits Induced by the TPR Threshold)] - */ -#define VMX_EXIT_REASON_TPR_BELOW_THRESHOLD 0x0000002B - - /** - * @brief APIC access - * - * Guest software attempted to access memory at a physical address on the APIC-access page and the "virtualize APIC - * accesses" VM-execution control was 1. - * - * @see Vol3C[29.4(VIRTUALIZING MEMORY-MAPPED APIC ACCESSES)] - */ -#define VMX_EXIT_REASON_APIC_ACCESS 0x0000002C - - /** - * @brief Virtualized EOI - * - * EOI virtualization was performed for a virtual interrupt whose vector indexed a bit set in the EOIexit bitmap. - */ -#define VMX_EXIT_REASON_VIRTUALIZED_EOI 0x0000002D - - /** - * @brief Access to GDTR or IDTR - * - * Guest software attempted to execute LGDT, LIDT, SGDT, or SIDT and the "descriptor-table exiting" VM-execution control - * was 1. - */ -#define VMX_EXIT_REASON_GDTR_IDTR_ACCESS 0x0000002E - - /** - * @brief Access to LDTR or TR - * - * Guest software attempted to execute LLDT, LTR, SLDT, or STR and the "descriptor-table exiting" VM-execution control was - * 1. - */ -#define VMX_EXIT_REASON_LDTR_TR_ACCESS 0x0000002F - - /** - * @brief EPT violation - * - * An attempt to access memory with a guest-physical address was disallowed by the configuration of the EPT paging - * structures. - */ -#define VMX_EXIT_REASON_EPT_VIOLATION 0x00000030 - - /** - * @brief EPT misconfiguration - * - * An attempt to access memory with a guest-physical address encountered a misconfigured EPT paging-structure entry. - */ -#define VMX_EXIT_REASON_EPT_MISCONFIGURATION 0x00000031 - - /** - * @brief INVEPT - * - * Guest software attempted to execute INVEPT. - */ -#define VMX_EXIT_REASON_EXECUTE_INVEPT 0x00000032 - - /** - * @brief RDTSCP - * - * Guest software attempted to execute RDTSCP and the "enable RDTSCP" and "RDTSC exiting" VM-execution controls were both - * 1. - */ -#define VMX_EXIT_REASON_EXECUTE_RDTSCP 0x00000033 - - /** - * @brief VMX-preemption timer expired - * - * The preemption timer counted down to zero. - */ -#define VMX_EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED 0x00000034 - - /** - * @brief INVVPID - * - * Guest software attempted to execute INVVPID. - */ -#define VMX_EXIT_REASON_EXECUTE_INVVPID 0x00000035 - - /** - * @brief WBINVD - * - * Guest software attempted to execute WBINVD and the "WBINVD exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_WBINVD 0x00000036 - - /** - * @brief XSETBV - Guest software attempted to execute XSETBV - * - * Guest software attempted to execute XSETBV. - */ -#define VMX_EXIT_REASON_EXECUTE_XSETBV 0x00000037 - - /** - * @brief APIC write - * - * Guest software completed a write to the virtual-APIC page that must be virtualized by VMM software. - * - * @see Vol3C[29.4.3.3(APIC-Write VM Exits)] - */ -#define VMX_EXIT_REASON_APIC_WRITE 0x00000038 - - /** - * @brief RDRAND - * - * Guest software attempted to execute RDRAND and the "RDRAND exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_RDRAND 0x00000039 - - /** - * @brief INVPCID - * - * Guest software attempted to execute INVPCID and the "enable INVPCID" and "INVLPG exiting" VM-execution controls were - * both 1. - */ -#define VMX_EXIT_REASON_EXECUTE_INVPCID 0x0000003A - - /** - * @brief VMFUNC - * - * Guest software invoked a VM function with the VMFUNC instruction and the VM function either was not enabled or generated - * a function-specific condition causing a VM exit. - */ -#define VMX_EXIT_REASON_EXECUTE_VMFUNC 0x0000003B - - /** - * @brief ENCLS - * - * Guest software attempted to execute ENCLS and "enable ENCLS exiting" VM-execution control was 1 and either: - * -# EAX < 63 and the corresponding bit in the ENCLS-exiting bitmap is 1; or - * -# EAX >= 63 and bit 63 in the ENCLS-exiting bitmap is 1. - */ -#define VMX_EXIT_REASON_EXECUTE_ENCLS 0x0000003C - - /** - * @brief RDSEED - * - * Guest software attempted to execute RDSEED and the "RDSEED exiting" VM-execution control was 1. - */ -#define VMX_EXIT_REASON_EXECUTE_RDSEED 0x0000003D - - /** - * @brief Page-modification log full - * - * The processor attempted to create a page-modification log entry and the value of the PML index was not in the range - * 0-511. - */ -#define VMX_EXIT_REASON_PAGE_MODIFICATION_LOG_FULL 0x0000003E - - /** - * @brief XSAVES - * - * Guest software attempted to execute XSAVES, the "enable XSAVES/XRSTORS" was 1, and a bit was set in the logical-AND of - * the following three values: EDX:EAX, the IA32_XSS MSR, and the XSS-exiting bitmap. - */ -#define VMX_EXIT_REASON_EXECUTE_XSAVES 0x0000003F - - /** - * @brief XRSTORS - * - * Guest software attempted to execute XRSTORS, the "enable XSAVES/XRSTORS" was 1, and a bit was set in the logical-AND of - * the following three values: EDX:EAX, the IA32_XSS MSR, and the XSS-exiting bitmap. - */ -#define VMX_EXIT_REASON_EXECUTE_XRSTORS 0x00000040 - /** - * @} - */ - - /** - * @defgroup vmx_instruction_error_numbers \ - * VM-Instruction Error Numbers - * - * VM-Instruction Error Numbers. - * - * @see Vol3C[30.4(VM INSTRUCTION ERROR NUMBERS)] (reference) - * @{ - */ - /** - * VMCALL executed in VMX root operation. - */ -#define VMX_ERROR_VMCALL_IN_VMX_ROOT_OPERATION 0x00000001 - - /** - * VMCLEAR with invalid physical address. - */ -#define VMX_ERROR_VMCLEAR_INVALID_PHYSICAL_ADDRESS 0x00000002 - - /** - * VMCLEAR with VMXON pointer. - */ -#define VMX_ERROR_VMCLEAR_INVALID_VMXON_POINTER 0x00000003 - - /** - * VMLAUNCH with non-clear VMCS. - */ -#define VMX_ERROR_VMLAUCH_NON_CLEAR_VMCS 0x00000004 - - /** - * VMRESUME with non-launched VMCS. - */ -#define VMX_ERROR_VMRESUME_NON_LAUNCHED_VMCS 0x00000005 - - /** - * VMRESUME after VMXOFF (VMXOFF and VMXON between VMLAUNCH and VMRESUME). - */ -#define VMX_ERROR_VMRESUME_AFTER_VMXOFF 0x00000006 - - /** - * VM entry with invalid control field(s). - */ -#define VMX_ERROR_VMENTRY_INVALID_CONTROL_FIELDS 0x00000007 - - /** - * VM entry with invalid host-state field(s). - */ -#define VMX_ERROR_VMENTRY_INVALID_HOST_STATE 0x00000008 - - /** - * VMPTRLD with invalid physical address. - */ -#define VMX_ERROR_VMPTRLD_INVALID_PHYSICAL_ADDRESS 0x00000009 - - /** - * VMPTRLD with VMXON pointer. - */ -#define VMX_ERROR_VMPTRLD_VMXON_POINTER 0x0000000A - - /** - * VMPTRLD with incorrect VMCS revision identifier. - */ -#define VMX_ERROR_VMPTRLD_INCORRECT_VMCS_REVISION_ID 0x0000000B - - /** - * VMREAD/VMWRITE from/to unsupported VMCS component. - */ -#define VMX_ERROR_VMREAD_VMWRITE_INVALID_COMPONENT 0x0000000C - - /** - * VMWRITE to read-only VMCS component. - */ -#define VMX_ERROR_VMWRITE_READONLY_COMPONENT 0x0000000D - - /** - * VMXON executed in VMX root operation. - */ -#define VMX_ERROR_VMXON_IN_VMX_ROOT_OP 0x0000000F - - /** - * VM entry with invalid executive-VMCS pointer. - */ -#define VMX_ERROR_VMENTRY_INVALID_VMCS_EXECUTIVE_POINTER 0x00000010 - - /** - * VM entry with non-launched executive VMCS. - */ -#define VMX_ERROR_VMENTRY_NON_LAUNCHED_EXECUTIVE_VMCS 0x00000011 - - /** - * VM entry with executive-VMCS pointer not VMXON pointer (when attempting to deactivate the dual-monitor treatment of SMIs - * and SMM). - */ -#define VMX_ERROR_VMENTRY_EXECUTIVE_VMCS_PTR 0x00000012 - - /** - * VMCALL with non-clear VMCS (when attempting to activate the dual-monitor treatment of SMIs and SMM). - */ -#define VMX_ERROR_VMCALL_NON_CLEAR_VMCS 0x00000013 - - /** - * VMCALL with invalid VM-exit control fields. - */ -#define VMX_ERROR_VMCALL_INVALID_VMEXIT_FIELDS 0x00000014 - - /** - * VMCALL with incorrect MSEG revision identifier (when attempting to activate the dual-monitor treatment of SMIs and SMM). - */ -#define VMX_ERROR_VMCALL_INVALID_MSEG_REVISION_ID 0x00000016 - - /** - * VMXOFF under dual-monitor treatment of SMIs and SMM. - */ -#define VMX_ERROR_VMXOFF_DUAL_MONITOR 0x00000017 - - /** - * VMCALL with invalid SMM-monitor features (when attempting to activate the dual-monitor treatment of SMIs and SMM). - */ -#define VMX_ERROR_VMCALL_INVALID_SMM_MONITOR 0x00000018 - - /** - * VM entry with invalid VM-execution control fields in executive VMCS (when attempting to return from SMM). - */ -#define VMX_ERROR_VMENTRY_INVALID_VM_EXECUTION_CONTROL 0x00000019 - - /** - * VM entry with events blocked by MOV SS. - */ -#define VMX_ERROR_VMENTRY_MOV_SS 0x0000001A - - /** - * Invalid operand to INVEPT/INVVPID. - */ -#define VMX_ERROR_INVEPT_INVVPID_INVALID_OPERAND 0x0000001C - /** - * @} - */ - - /** - * @defgroup vmx_exceptions \ - * Virtualization Exceptions - * - * Virtualization Exceptions. - * - * @see Vol3C[25.5.6(Virtualization Exceptions)] (reference) - * @{ - */ -typedef struct -{ - /** - * The 32-bit value that would have been saved into the VMCS as an exit reason had a VM exit occurred instead of the - * virtualization exception. For EPT violations, this value is 48 (00000030H). - */ - uint32_t reason; - - /** - * FFFFFFFFH - */ - uint32_t exception_mask; - - /** - * The 64-bit value that would have been saved into the VMCS as an exit qualification had a VM exit occurred instead of the - * virtualization exception. - */ - uint64_t exit; - - /** - * The 64-bit value that would have been saved into the VMCS as a guest-linear address had a VM exit occurred instead of - * the virtualization exception. - */ - uint64_t guest_linear_address; - - /** - * The 64-bit value that would have been saved into the VMCS as a guest-physical address had a VM exit occurred instead of - * the virtualization exception. - */ - uint64_t guest_physical_address; - - /** - * The current 16-bit value of the EPTP index VM-execution control. - * - * @see Vol3C[24.6.18(Controls for Virtualization Exceptions)] - * @see Vol3C[25.5.5.3(EPTP Switching)] - */ - uint16_t current_eptp_index; -} vmx_virtualization_exception_information; - -/** - * @} - */ - - /** - * @defgroup vmx_basic_exit_information \ - * Basic VM-Exit Information - * - * Basic VM-Exit Information. - * - * @see Vol3C[27.2.1(Basic VM-Exit Information)] (reference) - * @{ - */ - /** - * @brief Exit Qualification for Debug Exceptions - */ -typedef union -{ - struct - { - /** - * @brief B0 - B3 - * - * [Bits 3:0] When set, each of these bits indicates that the corresponding breakpoint condition was met. Any of these bits - * may be set even if its corresponding enabling bit in DR7 is not set. - */ - uint64_t breakpoint_condition : 4; -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_BREAKPOINT_CONDITION_BIT 0 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_BREAKPOINT_CONDITION_FLAG 0x0F -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_BREAKPOINT_CONDITION_MASK 0x0F -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_BREAKPOINT_CONDITION(_) (((_) >> 0) & 0x0F) - uint64_t reserved1 : 9; - - /** - * @brief BD - * - * [Bit 13] When set, this bit indicates that the cause of the debug exception is "debug register access detected." - */ - uint64_t debug_register_access_detected : 1; -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_DEBUG_REGISTER_ACCESS_DETECTED_BIT 13 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_DEBUG_REGISTER_ACCESS_DETECTED_FLAG 0x2000 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_DEBUG_REGISTER_ACCESS_DETECTED_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_DEBUG_REGISTER_ACCESS_DETECTED(_) (((_) >> 13) & 0x01) - - /** - * @brief BS - * - * [Bit 14] When set, this bit indicates that the cause of the debug exception is either the execution of a single - * instruction (if RFLAGS.TF = 1 and IA32_DEBUGCTL.BTF = 0) or a taken branch (if RFLAGS.TF = DEBUGCTL.BTF = 1). - */ - uint64_t single_instruction : 1; -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_SINGLE_INSTRUCTION_BIT 14 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_SINGLE_INSTRUCTION_FLAG 0x4000 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_SINGLE_INSTRUCTION_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_DEBUG_EXCEPTION_SINGLE_INSTRUCTION(_) (((_) >> 14) & 0x01) - uint64_t reserved2 : 49; - }; - - uint64_t flags; -} vmx_exit_qualification_debug_exception; - -/** - * @brief Exit Qualification for Task Switch - */ -typedef union -{ - struct - { - /** - * [Bits 15:0] Selector of task-state segment (TSS) to which the guest attempted to switch. - */ - uint64_t selector : 16; -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SELECTOR_BIT 0 -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SELECTOR_FLAG 0xFFFF -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SELECTOR_MASK 0xFFFF -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SELECTOR(_) (((_) >> 0) & 0xFFFF) - uint64_t reserved1 : 14; - - /** - * [Bits 31:30] Source of task switch initiation. - */ - uint64_t source : 2; -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SOURCE_BIT 30 -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SOURCE_FLAG 0xC0000000 -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SOURCE_MASK 0x03 -#define VMX_EXIT_QUALIFICATION_TASK_SWITCH_SOURCE(_) (((_) >> 30) & 0x03) -#define VMX_EXIT_QUALIFICATION_TYPE_CALL_INSTRUCTION 0x00000000 -#define VMX_EXIT_QUALIFICATION_TYPE_IRET_INSTRUCTION 0x00000001 -#define VMX_EXIT_QUALIFICATION_TYPE_JMP_INSTRUCTION 0x00000002 -#define VMX_EXIT_QUALIFICATION_TYPE_TASK_GATE_IN_IDT 0x00000003 - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} vmx_exit_qualification_task_switch; - -/** - * @brief Exit Qualification for Control-Register Accesses - */ -typedef union -{ - struct - { - /** - * [Bits 3:0] Number of control register (0 for CLTS and LMSW). Bit 3 is always 0 on processors that do not support Intel - * 64 architecture as they do not support CR8. - */ - uint64_t control_register : 4; -#define VMX_EXIT_QUALIFICATION_MOV_CR_CONTROL_REGISTER_BIT 0 -#define VMX_EXIT_QUALIFICATION_MOV_CR_CONTROL_REGISTER_FLAG 0x0F -#define VMX_EXIT_QUALIFICATION_MOV_CR_CONTROL_REGISTER_MASK 0x0F -#define VMX_EXIT_QUALIFICATION_MOV_CR_CONTROL_REGISTER(_) (((_) >> 0) & 0x0F) -#define VMX_EXIT_QUALIFICATION_REGISTER_CR0 0x00000000 -#define VMX_EXIT_QUALIFICATION_REGISTER_CR2 0x00000002 -#define VMX_EXIT_QUALIFICATION_REGISTER_CR3 0x00000003 -#define VMX_EXIT_QUALIFICATION_REGISTER_CR4 0x00000004 -#define VMX_EXIT_QUALIFICATION_REGISTER_CR8 0x00000008 - - /** - * [Bits 5:4] Access type. - */ - uint64_t access_type : 2; -#define VMX_EXIT_QUALIFICATION_MOV_CR_ACCESS_TYPE_BIT 4 -#define VMX_EXIT_QUALIFICATION_MOV_CR_ACCESS_TYPE_FLAG 0x30 -#define VMX_EXIT_QUALIFICATION_MOV_CR_ACCESS_TYPE_MASK 0x03 -#define VMX_EXIT_QUALIFICATION_MOV_CR_ACCESS_TYPE(_) (((_) >> 4) & 0x03) -#define VMX_EXIT_QUALIFICATION_ACCESS_MOV_TO_CR 0x00000000 -#define VMX_EXIT_QUALIFICATION_ACCESS_MOV_FROM_CR 0x00000001 -#define VMX_EXIT_QUALIFICATION_ACCESS_CLTS 0x00000002 -#define VMX_EXIT_QUALIFICATION_ACCESS_LMSW 0x00000003 - - /** - * [Bit 6] LMSW operand type. For CLTS and MOV CR, cleared to 0. - */ - uint64_t lmsw_operand_type : 1; -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_OPERAND_TYPE_BIT 6 -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_OPERAND_TYPE_FLAG 0x40 -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_OPERAND_TYPE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_OPERAND_TYPE(_) (((_) >> 6) & 0x01) -#define VMX_EXIT_QUALIFICATION_LMSW_OP_REGISTER 0x00000000 -#define VMX_EXIT_QUALIFICATION_LMSW_OP_MEMORY 0x00000001 - uint64_t reserved1 : 1; - - /** - * [Bits 11:8] For MOV CR, the general-purpose register. - */ - uint64_t general_purpose_register : 4; -#define VMX_EXIT_QUALIFICATION_MOV_CR_GENERAL_PURPOSE_REGISTER_BIT 8 -#define VMX_EXIT_QUALIFICATION_MOV_CR_GENERAL_PURPOSE_REGISTER_FLAG 0xF00 -#define VMX_EXIT_QUALIFICATION_MOV_CR_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_EXIT_QUALIFICATION_MOV_CR_GENERAL_PURPOSE_REGISTER(_) (((_) >> 8) & 0x0F) -#define VMX_EXIT_QUALIFICATION_GENREG_RAX 0x00000000 -#define VMX_EXIT_QUALIFICATION_GENREG_RCX 0x00000001 -#define VMX_EXIT_QUALIFICATION_GENREG_RDX 0x00000002 -#define VMX_EXIT_QUALIFICATION_GENREG_RBX 0x00000003 -#define VMX_EXIT_QUALIFICATION_GENREG_RSP 0x00000004 -#define VMX_EXIT_QUALIFICATION_GENREG_RBP 0x00000005 -#define VMX_EXIT_QUALIFICATION_GENREG_RSI 0x00000006 -#define VMX_EXIT_QUALIFICATION_GENREG_RDI 0x00000007 -#define VMX_EXIT_QUALIFICATION_GENREG_R8 0x00000008 -#define VMX_EXIT_QUALIFICATION_GENREG_R9 0x00000009 -#define VMX_EXIT_QUALIFICATION_GENREG_R10 0x0000000A -#define VMX_EXIT_QUALIFICATION_GENREG_R11 0x0000000B -#define VMX_EXIT_QUALIFICATION_GENREG_R12 0x0000000C -#define VMX_EXIT_QUALIFICATION_GENREG_R13 0x0000000D -#define VMX_EXIT_QUALIFICATION_GENREG_R14 0x0000000E -#define VMX_EXIT_QUALIFICATION_GENREG_R15 0x0000000F - uint64_t reserved2 : 4; - - /** - * [Bits 31:16] For LMSW, the LMSW source data. For CLTS and MOV CR, cleared to 0. - */ - uint64_t lmsw_source_data : 16; -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_SOURCE_DATA_BIT 16 -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_SOURCE_DATA_FLAG 0xFFFF0000 -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_SOURCE_DATA_MASK 0xFFFF -#define VMX_EXIT_QUALIFICATION_MOV_CR_LMSW_SOURCE_DATA(_) (((_) >> 16) & 0xFFFF) - uint64_t reserved3 : 32; - }; - - uint64_t flags; -} vmx_exit_qualification_mov_cr; - -/** - * @brief Exit Qualification for MOV DR - */ -typedef union -{ - struct - { - /** - * [Bits 2:0] Number of debug register. - */ - uint64_t debug_register : 3; -#define VMX_EXIT_QUALIFICATION_MOV_DR_DEBUG_REGISTER_BIT 0 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DEBUG_REGISTER_FLAG 0x07 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DEBUG_REGISTER_MASK 0x07 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DEBUG_REGISTER(_) (((_) >> 0) & 0x07) -#define VMX_EXIT_QUALIFICATION_REGISTER_DR0 0x00000000 -#define VMX_EXIT_QUALIFICATION_REGISTER_DR1 0x00000001 -#define VMX_EXIT_QUALIFICATION_REGISTER_DR2 0x00000002 -#define VMX_EXIT_QUALIFICATION_REGISTER_DR3 0x00000003 -#define VMX_EXIT_QUALIFICATION_REGISTER_DR6 0x00000006 -#define VMX_EXIT_QUALIFICATION_REGISTER_DR7 0x00000007 - uint64_t reserved1 : 1; - - /** - * [Bit 4] Direction of access (0 = MOV to DR; 1 = MOV from DR). - */ - uint64_t direction_of_access : 1; -#define VMX_EXIT_QUALIFICATION_MOV_DR_DIRECTION_OF_ACCESS_BIT 4 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DIRECTION_OF_ACCESS_FLAG 0x10 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DIRECTION_OF_ACCESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_MOV_DR_DIRECTION_OF_ACCESS(_) (((_) >> 4) & 0x01) -#define VMX_EXIT_QUALIFICATION_DIRECTION_MOV_TO_DR 0x00000000 -#define VMX_EXIT_QUALIFICATION_DIRECTION_MOV_FROM_DR 0x00000001 - uint64_t reserved2 : 3; - - /** - * [Bits 11:8] General-purpose register. - */ - uint64_t general_purpose_register : 4; -#define VMX_EXIT_QUALIFICATION_MOV_DR_GENERAL_PURPOSE_REGISTER_BIT 8 -#define VMX_EXIT_QUALIFICATION_MOV_DR_GENERAL_PURPOSE_REGISTER_FLAG 0xF00 -#define VMX_EXIT_QUALIFICATION_MOV_DR_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_EXIT_QUALIFICATION_MOV_DR_GENERAL_PURPOSE_REGISTER(_) (((_) >> 8) & 0x0F) - uint64_t reserved3 : 52; - }; - - uint64_t flags; -} vmx_exit_qualification_mov_dr; - -/** - * @brief Exit Qualification for I/O Instructions - */ -typedef union -{ - struct - { - /** - * [Bits 2:0] Size of access. - */ - uint64_t size_of_access : 3; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_SIZE_OF_ACCESS_BIT 0 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_SIZE_OF_ACCESS_FLAG 0x07 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_SIZE_OF_ACCESS_MASK 0x07 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_SIZE_OF_ACCESS(_) (((_) >> 0) & 0x07) -#define VMX_EXIT_QUALIFICATION_WIDTH_1_BYTE 0x00000000 -#define VMX_EXIT_QUALIFICATION_WIDTH_2_BYTE 0x00000001 -#define VMX_EXIT_QUALIFICATION_WIDTH_4_BYTE 0x00000003 - - /** - * [Bit 3] Direction of the attempted access (0 = OUT, 1 = IN). - */ - uint64_t direction_of_access : 1; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_DIRECTION_OF_ACCESS_BIT 3 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_DIRECTION_OF_ACCESS_FLAG 0x08 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_DIRECTION_OF_ACCESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_DIRECTION_OF_ACCESS(_) (((_) >> 3) & 0x01) -#define VMX_EXIT_QUALIFICATION_DIRECTION_OUT 0x00000000 -#define VMX_EXIT_QUALIFICATION_DIRECTION_IN 0x00000001 - - /** - * [Bit 4] String instruction (0 = not string; 1 = string). - */ - uint64_t string_instruction : 1; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_STRING_INSTRUCTION_BIT 4 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_STRING_INSTRUCTION_FLAG 0x10 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_STRING_INSTRUCTION_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_STRING_INSTRUCTION(_) (((_) >> 4) & 0x01) -#define VMX_EXIT_QUALIFICATION_IS_STRING_NOT_STRING 0x00000000 -#define VMX_EXIT_QUALIFICATION_IS_STRING_STRING 0x00000001 - - /** - * [Bit 5] REP prefixed (0 = not REP; 1 = REP). - */ - uint64_t rep_prefixed : 1; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_REP_PREFIXED_BIT 5 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_REP_PREFIXED_FLAG 0x20 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_REP_PREFIXED_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_REP_PREFIXED(_) (((_) >> 5) & 0x01) -#define VMX_EXIT_QUALIFICATION_IS_REP_NOT_REP 0x00000000 -#define VMX_EXIT_QUALIFICATION_IS_REP_REP 0x00000001 - - /** - * [Bit 6] Operand encoding (0 = DX, 1 = immediate). - */ - uint64_t operand_encoding : 1; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_OPERAND_ENCODING_BIT 6 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_OPERAND_ENCODING_FLAG 0x40 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_OPERAND_ENCODING_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_OPERAND_ENCODING(_) (((_) >> 6) & 0x01) -#define VMX_EXIT_QUALIFICATION_ENCODING_DX 0x00000000 -#define VMX_EXIT_QUALIFICATION_ENCODING_IMMEDIATE 0x00000001 - uint64_t reserved1 : 9; - - /** - * [Bits 31:16] Port number (as specified in DX or in an immediate operand). - */ - uint64_t port_number : 16; -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_PORT_NUMBER_BIT 16 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_PORT_NUMBER_FLAG 0xFFFF0000 -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_PORT_NUMBER_MASK 0xFFFF -#define VMX_EXIT_QUALIFICATION_IO_INSTRUCTION_PORT_NUMBER(_) (((_) >> 16) & 0xFFFF) - uint64_t reserved2 : 32; - }; - - uint64_t flags; -} vmx_exit_qualification_io_instruction; - -/** - * @brief Exit Qualification for APIC-Access VM Exits from Linear Accesses and Guest-Physical Accesses - */ -typedef union -{ - struct - { - /** - * [Bits 11:0] - If the APIC-access VM exit is due to a linear access, the offset of access within the APIC page. - * - Undefined if the APIC-access VM exit is due a guest-physical access. - */ - uint64_t page_offset : 12; -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_PAGE_OFFSET_BIT 0 -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_PAGE_OFFSET_FLAG 0xFFF -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_PAGE_OFFSET_MASK 0xFFF -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_PAGE_OFFSET(_) (((_) >> 0) & 0xFFF) - - /** - * [Bits 15:12] Access type. - */ - uint64_t access_type : 4; -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_ACCESS_TYPE_BIT 12 -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_ACCESS_TYPE_FLAG 0xF000 -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_ACCESS_TYPE_MASK 0x0F -#define VMX_EXIT_QUALIFICATION_APIC_ACCESS_ACCESS_TYPE(_) (((_) >> 12) & 0x0F) - /** - * Linear access for a data read during instruction execution. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_LINEAR_READ 0x00000000 - - /** - * Linear access for a data write during instruction execution. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_LINEAR_WRITE 0x00000001 - - /** - * Linear access for an instruction fetch. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_LINEAR_INSTRUCTION_FETCH 0x00000002 - - /** - * Linear access (read or write) during event delivery. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_LINEAR_EVENT_DELIVERY 0x00000003 - - /** - * Guest-physical access during event delivery. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_PHYSICAL_EVENT_DELIVERY 0x0000000A - - /** - * Guest-physical access for an instruction fetch or during instruction execution. - */ -#define VMX_EXIT_QUALIFICATION_TYPE_PHYSICAL_INSTRUCTION_FETCH 0x0000000F - uint64_t reserved1 : 48; - }; - - uint64_t flags; -} vmx_exit_qualification_apic_access; - -/** - * @brief Exit Qualification for EPT Violations - */ -typedef union -{ - struct - { - /** - * [Bit 0] Set if the access causing the EPT violation was a data read. - */ - uint64_t read_access : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READ_ACCESS_BIT 0 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READ_ACCESS_FLAG 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READ_ACCESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Set if the access causing the EPT violation was a data write. - */ - uint64_t write_access : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_WRITE_ACCESS_BIT 1 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_WRITE_ACCESS_FLAG 0x02 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_WRITE_ACCESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Set if the access causing the EPT violation was an instruction fetch. - */ - uint64_t execute_access : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_ACCESS_BIT 2 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_ACCESS_FLAG 0x04 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_ACCESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] The logical-AND of bit 0 in the EPT paging-structure entries used to translate the guest-physical address of the - * access causing the EPT violation (indicates whether the guest-physical address was readable). - */ - uint64_t ept_readable : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_READABLE_BIT 3 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_READABLE_FLAG 0x08 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_READABLE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_READABLE(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] The logical-AND of bit 1 in the EPT paging-structure entries used to translate the guest-physical address of the - * access causing the EPT violation (indicates whether the guest-physical address was writeable). - */ - uint64_t ept_writeable : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_WRITEABLE_BIT 4 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_WRITEABLE_FLAG 0x10 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_WRITEABLE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_WRITEABLE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] The logical-AND of bit 2 in the EPT paging-structure entries used to translate the guest-physical address of the - * access causing the EPT violation. - * If the "mode-based execute control for EPT" VM-execution control is 0, this indicates whether the guest-physical address - * was executable. If that control is 1, this indicates whether the guest-physical address was executable for - * supervisor-mode linear addresses. - */ - uint64_t ept_executable : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_BIT 5 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_FLAG 0x20 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE(_) (((_) >> 5) & 0x01) - - /** - * [Bit 6] If the "mode-based execute control" VM-execution control is 0, the value of this bit is undefined. If that - * control is 1, this bit is the logical-AND of bit 10 in the EPT paging-structures entries used to translate the - * guest-physical address of the access causing the EPT violation. In this case, it indicates whether the guest-physical - * address was executable for user-mode linear addresses. - */ - uint64_t ept_executable_for_user_mode : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_FOR_USER_MODE_BIT 6 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_FOR_USER_MODE_FLAG 0x40 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_FOR_USER_MODE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EPT_EXECUTABLE_FOR_USER_MODE(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Set if the guest linear-address field is valid. The guest linear-address field is valid for all EPT violations - * except those resulting from an attempt to load the guest PDPTEs as part of the execution of the MOV CR instruction. - */ - uint64_t valid_guest_linear_address : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_VALID_GUEST_LINEAR_ADDRESS_BIT 7 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_VALID_GUEST_LINEAR_ADDRESS_FLAG 0x80 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_VALID_GUEST_LINEAR_ADDRESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_VALID_GUEST_LINEAR_ADDRESS(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] If bit 7 is 1: - * - Set if the access causing the EPT violation is to a guest-physical address that is the translation of a linear - * address. - * - Clear if the access causing the EPT violation is to a paging-structure entry as part of a page walk or the update of - * an accessed or dirty bit. - * Reserved if bit 7 is 0 (cleared to 0). - */ - uint64_t caused_by_translation : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_CAUSED_BY_TRANSLATION_BIT 8 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_CAUSED_BY_TRANSLATION_FLAG 0x100 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_CAUSED_BY_TRANSLATION_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_CAUSED_BY_TRANSLATION(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] This bit is 0 if the linear address is a supervisor-mode linear address and 1 if it is a user-mode linear - * address. Otherwise, this bit is undefined. - * - * @remarks If bit 7 is 1, bit 8 is 1, and the processor supports advanced VM-exit information for EPT violations. (If - * CR0.PG = 0, the translation of every linear address is a user-mode linear address and thus this bit will be 1.) - */ - uint64_t user_mode_linear_address : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_USER_MODE_LINEAR_ADDRESS_BIT 9 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_USER_MODE_LINEAR_ADDRESS_FLAG 0x200 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_USER_MODE_LINEAR_ADDRESS_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_USER_MODE_LINEAR_ADDRESS(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] This bit is 0 if paging translates the linear address to a read-only page and 1 if it translates to a - * read/write page. Otherwise, this bit is undefined - * - * @remarks If bit 7 is 1, bit 8 is 1, and the processor supports advanced VM-exit information for EPT violations. (If - * CR0.PG = 0, every linear address is read/write and thus this bit will be 1.) - */ - uint64_t readable_writable_page : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READABLE_WRITABLE_PAGE_BIT 10 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READABLE_WRITABLE_PAGE_FLAG 0x400 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READABLE_WRITABLE_PAGE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_READABLE_WRITABLE_PAGE(_) (((_) >> 10) & 0x01) - - /** - * [Bit 11] This bit is 0 if paging translates the linear address to an executable page and 1 if it translates to an - * execute-disable page. Otherwise, this bit is undefined. - * - * @remarks If bit 7 is 1, bit 8 is 1, and the processor supports advanced VM-exit information for EPT violations. (If - * CR0.PG = 0, CR4.PAE = 0, or IA32_EFER.NXE = 0, every linear address is executable and thus this bit will be 0.) - */ - uint64_t execute_disable_page : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_DISABLE_PAGE_BIT 11 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_DISABLE_PAGE_FLAG 0x800 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_DISABLE_PAGE_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_EXECUTE_DISABLE_PAGE(_) (((_) >> 11) & 0x01) - - /** - * [Bit 12] NMI unblocking due to IRET. - */ - uint64_t nmi_unblocking : 1; -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_NMI_UNBLOCKING_BIT 12 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_NMI_UNBLOCKING_FLAG 0x1000 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_NMI_UNBLOCKING_MASK 0x01 -#define VMX_EXIT_QUALIFICATION_EPT_VIOLATION_NMI_UNBLOCKING(_) (((_) >> 12) & 0x01) - uint64_t reserved1 : 51; - }; - - uint64_t flags; -} vmx_exit_qualification_ept_violation; - -/** - * @} - */ - - /** - * @defgroup vmx_vmexit_instruction_information \ - * Information for VM Exits Due to Instruction Execution - * - * Information for VM Exits Due to Instruction Execution. - * - * @see Vol3C[27.2.4(Information for VM Exits Due to Instruction Execution)] (reference) - * @{ - */ - /** - * @brief VM-Exit Instruction-Information Field as Used for INS and OUTS - */ -typedef union -{ - struct - { - uint64_t reserved1 : 7; - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - uint64_t reserved2 : 5; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. Undefined for VM exits due to execution of INS. - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_INS_OUTS_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - uint64_t reserved3 : 46; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_ins_outs; - -/** - * @brief VM-Exit Instruction-Information Field as Used for INVEPT, INVPCID, and INVVPID - */ -typedef union -{ - struct - { - /** - * @brief Scaling - * - * [Bits 1:0] 0: no scaling - * 1: scale by 2 - * 2: scale by 4 - * 3: scale by 8 (used only on processors that support Intel 64 architecture) - * Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t scaling : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SCALING_BIT 0 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SCALING_FLAG 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SCALING_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SCALING(_) (((_) >> 0) & 0x03) - uint64_t reserved1 : 5; - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - uint64_t reserved2 : 5; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. Undefined for VM exits due to execution of INS. - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - - /** - * [Bits 21:18] General-purpose register. Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t general_purpose_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_BIT 18 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_FLAG 0x3C0000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER(_) (((_) >> 18) & 0x0F) - - /** - * [Bit 22] IndexReg invalid (0 = valid; 1 = invalid). - */ - uint64_t general_purpose_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_INVALID_BIT 22 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_INVALID_FLAG 0x400000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_GENERAL_PURPOSE_REGISTER_INVALID(_) (((_) >> 22) & 0x01) - - /** - * [Bits 26:23] BaseReg (encoded as IndexReg above). Undefined for memory instructions with no base register (bit 27 is - * set). - */ - uint64_t base_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_BIT 23 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_FLAG 0x7800000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER(_) (((_) >> 23) & 0x0F) - - /** - * [Bit 27] BaseReg invalid (0 = valid; 1 = invalid). - */ - uint64_t base_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_INVALID_BIT 27 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_INVALID_FLAG 0x8000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_BASE_REGISTER_INVALID(_) (((_) >> 27) & 0x01) - - /** - * [Bits 31:28] Reg2 (same encoding as IndexReg above). - */ - uint64_t register_2 : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_REGISTER_2_BIT 28 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_REGISTER_2_FLAG 0xF0000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_REGISTER_2_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_INVALIDATE_REGISTER_2(_) (((_) >> 28) & 0x0F) - uint64_t reserved3 : 32; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_invalidate; - -/** - * @brief VM-Exit Instruction-Information Field as Used for LIDT, LGDT, SIDT, or SGDT - */ -typedef union -{ - struct - { - /** - * @brief Scaling - * - * [Bits 1:0] 0: no scaling - * 1: scale by 2 - * 2: scale by 4 - * 3: scale by 8 (used only on processors that support Intel 64 architecture) - * Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t scaling : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SCALING_BIT 0 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SCALING_FLAG 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SCALING_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SCALING(_) (((_) >> 0) & 0x03) - uint64_t reserved1 : 5; - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - uint64_t reserved2 : 1; - - /** - * @brief Operand size - * - * [Bit 11] 0: 16-bit - * 1: 32-bit - * Undefined for VM exits from 64-bit mode. - */ - uint64_t operand_size : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_OPERAND_SIZE_BIT 11 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_OPERAND_SIZE_FLAG 0x800 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_OPERAND_SIZE_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_OPERAND_SIZE(_) (((_) >> 11) & 0x01) - uint64_t reserved3 : 3; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - - /** - * [Bits 21:18] General-purpose register. Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t general_purpose_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_BIT 18 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_FLAG 0x3C0000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER(_) (((_) >> 18) & 0x0F) - - /** - * [Bit 22] IndexReg invalid (0 = valid; 1 = invalid). - */ - uint64_t general_purpose_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_BIT 22 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_FLAG 0x400000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID(_) (((_) >> 22) & 0x01) - - /** - * [Bits 26:23] BaseReg (encoded as IndexReg above). Undefined for memory instructions with no base register (bit 27 is - * set). - */ - uint64_t base_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_BIT 23 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_FLAG 0x7800000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER(_) (((_) >> 23) & 0x0F) - - /** - * [Bit 27] BaseReg invalid (0 = valid; 1 = invalid). - */ - uint64_t base_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_INVALID_BIT 27 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_INVALID_FLAG 0x8000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_BASE_REGISTER_INVALID(_) (((_) >> 27) & 0x01) - - /** - * @brief Instruction identity - * - * [Bits 29:28] 0: SGDT - * 1: SIDT - * 2: LGDT - * 3: LIDT - */ - uint64_t instruction : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_INSTRUCTION_BIT 28 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_INSTRUCTION_FLAG 0x30000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_INSTRUCTION_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_GDTR_IDTR_ACCESS_INSTRUCTION(_) (((_) >> 28) & 0x03) - uint64_t reserved4 : 34; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_gdtr_idtr_access; - -/** - * @brief VM-Exit Instruction-Information Field as Used for LLDT, LTR, SLDT, and STR - */ -typedef union -{ - struct - { - /** - * @brief Scaling - * - * [Bits 1:0] 0: no scaling - * 1: scale by 2 - * 2: scale by 4 - * 3: scale by 8 (used only on processors that support Intel 64 architecture) - * Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t scaling : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SCALING_BIT 0 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SCALING_FLAG 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SCALING_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SCALING(_) (((_) >> 0) & 0x03) - uint64_t reserved1 : 1; - - /** - * [Bits 6:3] Reg1. Undefined for memory instructions (bit 10 is clear). - */ - uint64_t reg_1 : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_REG_1_BIT 3 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_REG_1_FLAG 0x78 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_REG_1_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_REG_1(_) (((_) >> 3) & 0x0F) - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. Undefined for register instructions (bit 10 is set). - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - - /** - * [Bit 10] Mem/Reg (0 = memory; 1 = register). - */ - uint64_t memory_register : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_MEMORY_REGISTER_BIT 10 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_MEMORY_REGISTER_FLAG 0x400 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_MEMORY_REGISTER_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_MEMORY_REGISTER(_) (((_) >> 10) & 0x01) - uint64_t reserved2 : 4; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. Undefined for register instructions (bit 10 is set). - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - - /** - * [Bits 21:18] General-purpose register. Undefined for register instructions (bit 10 is set) and for memory instructions - * with no index register (bit 10 is clear and bit 22 is set). - */ - uint64_t general_purpose_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_BIT 18 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_FLAG 0x3C0000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER(_) (((_) >> 18) & 0x0F) - - /** - * [Bit 22] IndexReg invalid (0 = valid; 1 = invalid). Undefined for register instructions (bit 10 is set). - */ - uint64_t general_purpose_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_BIT 22 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_FLAG 0x400000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_GENERAL_PURPOSE_REGISTER_INVALID(_) (((_) >> 22) & 0x01) - - /** - * [Bits 26:23] BaseReg (encoded as IndexReg above). Undefined for register instructions (bit 10 is set) and for memory - * instructions with no base register (bit 10 is clear and bit 27 is set). - */ - uint64_t base_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_BIT 23 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_FLAG 0x7800000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER(_) (((_) >> 23) & 0x0F) - - /** - * [Bit 27] BaseReg invalid (0 = valid; 1 = invalid). Undefined for register instructions (bit 10 is set). - */ - uint64_t base_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_INVALID_BIT 27 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_INVALID_FLAG 0x8000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_BASE_REGISTER_INVALID(_) (((_) >> 27) & 0x01) - - /** - * @brief Instruction identity - * - * [Bits 29:28] 0: SLDT - * 1: STR - * 2: LLDT - * 3: LTR - */ - uint64_t instruction : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_INSTRUCTION_BIT 28 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_INSTRUCTION_FLAG 0x30000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_INSTRUCTION_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_LDTR_TR_ACCESS_INSTRUCTION(_) (((_) >> 28) & 0x03) - uint64_t reserved3 : 34; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_ldtr_tr_access; - -/** - * @brief VM-Exit Instruction-Information Field as Used for RDRAND and RDSEED - */ -typedef union -{ - struct - { - uint64_t reserved1 : 3; - - /** - * [Bits 6:3] Destination register. - */ - uint64_t destination_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_DESTINATION_REGISTER_BIT 3 -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_DESTINATION_REGISTER_FLAG 0x78 -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_DESTINATION_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_DESTINATION_REGISTER(_) (((_) >> 3) & 0x0F) - uint64_t reserved2 : 4; - - /** - * @brief Operand size - * - * [Bits 12:11] 0: 16-bit - * 1: 32-bit - * 2: 64-bit - * The value 3 is not used. - */ - uint64_t operand_size : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_OPERAND_SIZE_BIT 11 -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_OPERAND_SIZE_FLAG 0x1800 -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_OPERAND_SIZE_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_RDRAND_RDSEED_OPERAND_SIZE(_) (((_) >> 11) & 0x03) - uint64_t reserved3 : 51; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_rdrand_rdseed; - -/** - * @brief VM-Exit Instruction-Information Field as Used for VMCLEAR, VMPTRLD, VMPTRST, VMXON, XRSTORS, and XSAVES - */ -typedef union -{ - struct - { - /** - * @brief Scaling - * - * [Bits 1:0] 0: no scaling - * 1: scale by 2 - * 2: scale by 4 - * 3: scale by 8 (used only on processors that support Intel 64 architecture) - * Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t scaling : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SCALING_BIT 0 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SCALING_FLAG 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SCALING_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SCALING(_) (((_) >> 0) & 0x03) - uint64_t reserved1 : 5; - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - uint64_t reserved2 : 5; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - - /** - * [Bits 21:18] General-purpose register. Undefined for instructions with no index register (bit 22 is set). - */ - uint64_t general_purpose_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_BIT 18 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_FLAG 0x3C0000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER(_) (((_) >> 18) & 0x0F) - - /** - * [Bit 22] IndexReg invalid (0 = valid; 1 = invalid). - */ - uint64_t general_purpose_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_INVALID_BIT 22 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_INVALID_FLAG 0x400000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_GENERAL_PURPOSE_REGISTER_INVALID(_) (((_) >> 22) & 0x01) - - /** - * [Bits 26:23] BaseReg (encoded as IndexReg above). Undefined for memory instructions with no base register (bit 27 is - * set). - */ - uint64_t base_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_BIT 23 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_FLAG 0x7800000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER(_) (((_) >> 23) & 0x0F) - - /** - * [Bit 27] BaseReg invalid (0 = valid; 1 = invalid). - */ - uint64_t base_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_INVALID_BIT 27 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_INVALID_FLAG 0x8000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMX_AND_XSAVES_BASE_REGISTER_INVALID(_) (((_) >> 27) & 0x01) - uint64_t reserved3 : 36; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_vmx_and_xsaves; - -/** - * @brief VM-Exit Instruction-Information Field as Used for VMREAD and VMWRITE - */ -typedef union -{ - struct - { - /** - * @brief Scaling - * - * [Bits 1:0] 0: no scaling - * 1: scale by 2 - * 2: scale by 4 - * 3: scale by 8 (used only on processors that support Intel 64 architecture) - * Undefined for register instructions (bit 10 is set) and for memory instructions with no index register (bit 10 is clear - * and bit 22 is set). - */ - uint64_t scaling : 2; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SCALING_BIT 0 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SCALING_FLAG 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SCALING_MASK 0x03 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SCALING(_) (((_) >> 0) & 0x03) - uint64_t reserved1 : 1; - - /** - * [Bits 6:3] Reg1. Undefined for memory instructions (bit 10 is clear). - */ - uint64_t register_1 : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_1_BIT 3 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_1_FLAG 0x78 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_1_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_1(_) (((_) >> 3) & 0x0F) - - /** - * @brief Address size - * - * [Bits 9:7] 0: 16-bit - * 1: 32-bit - * 2: 64-bit (used only on processors that support Intel 64 architecture) - * Other values not used. Undefined for register instructions (bit 10 is set). - */ - uint64_t address_size : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_ADDRESS_SIZE_BIT 7 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_ADDRESS_SIZE_FLAG 0x380 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_ADDRESS_SIZE_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_ADDRESS_SIZE(_) (((_) >> 7) & 0x07) - - /** - * [Bit 10] Mem/Reg (0 = memory; 1 = register). - */ - uint64_t memory_register : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_MEMORY_REGISTER_BIT 10 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_MEMORY_REGISTER_FLAG 0x400 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_MEMORY_REGISTER_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_MEMORY_REGISTER(_) (((_) >> 10) & 0x01) - uint64_t reserved2 : 4; - - /** - * @brief Segment register - * - * [Bits 17:15] 0: ES - * 1: CS - * 2: SS - * 3: DS - * 4: FS - * 5: GS - * Other values not used. Undefined for register instructions (bit 10 is set). - */ - uint64_t segment_register : 3; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SEGMENT_REGISTER_BIT 15 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SEGMENT_REGISTER_FLAG 0x38000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SEGMENT_REGISTER_MASK 0x07 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_SEGMENT_REGISTER(_) (((_) >> 15) & 0x07) - - /** - * [Bits 21:18] General-purpose register. Undefined for register instructions (bit 10 is set) and for memory instructions - * with no index register (bit 10 is clear and bit 22 is set). - */ - uint64_t general_purpose_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_BIT 18 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_FLAG 0x3C0000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER(_) (((_) >> 18) & 0x0F) - - /** - * [Bit 22] IndexReg invalid (0 = valid; 1 = invalid). Undefined for register instructions (bit 10 is set). - */ - uint64_t general_purpose_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_INVALID_BIT 22 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_INVALID_FLAG 0x400000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_GENERAL_PURPOSE_REGISTER_INVALID(_) (((_) >> 22) & 0x01) - - /** - * [Bits 26:23] BaseReg (encoded as Reg1 above). Undefined for register instructions (bit 10 is set) and for memory - * instructions with no base register (bit 10 is clear and bit 27 is set). - */ - uint64_t base_register : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_BIT 23 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_FLAG 0x7800000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER(_) (((_) >> 23) & 0x0F) - - /** - * [Bit 27] BaseReg invalid (0 = valid; 1 = invalid). - */ - uint64_t base_register_invalid : 1; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_INVALID_BIT 27 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_INVALID_FLAG 0x8000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_INVALID_MASK 0x01 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_BASE_REGISTER_INVALID(_) (((_) >> 27) & 0x01) - - /** - * [Bits 31:28] Reg2 (same encoding as IndexReg above). - */ - uint64_t register_2 : 4; -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_2_BIT 28 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_2_FLAG 0xF0000000 -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_2_MASK 0x0F -#define VMX_VMEXIT_INSTRUCTION_INFO_VMREAD_VMWRITE_REGISTER_2(_) (((_) >> 28) & 0x0F) - uint64_t reserved3 : 32; - }; - - uint64_t flags; -} vmx_vmexit_instruction_info_vmread_vmwrite; - -/** - * @} - */ - - /** - * @brief - The low 16 bits correspond to bits 23:8 of the upper 32 bits of a 64-bit segment descriptor. While bits 19:16 - * of code-segment and data-segment descriptors correspond to the upper 4 bits of the segment limit, the corresponding bits - * (bits 11:8) are reserved in this VMCS field. - * - Bit 16 indicates an unusable segment. Attempts to use such a segment fault except in 64-bit mode. In general, a - * segment register is unusable if it has been loaded with a null selector. - * - Bits 31:17 are reserved - * - * @note There are a few exceptions to this statement. For example, a segment with a non-null selector may be unusable - * following a task switch that fails after its commit point. In contrast, the TR register is usable after processor reset - * despite having a null selector - * @see SEGMENT_DESCRIPTOR_32 - * @see SEGMENT_DESCRIPTOR_64 - * @see XXX_ACCESS_RIGHTS fields of 32_BIT_GUEST_STATE_FIELDS - * @see Vol3C[24.4.2(Guest Non-Register State)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bits 3:0] Segment type. - */ - uint32_t type : 4; -#define VMX_SEGMENT_ACCESS_RIGHTS_TYPE_BIT 0 -#define VMX_SEGMENT_ACCESS_RIGHTS_TYPE_FLAG 0x0F -#define VMX_SEGMENT_ACCESS_RIGHTS_TYPE_MASK 0x0F -#define VMX_SEGMENT_ACCESS_RIGHTS_TYPE(_) (((_) >> 0) & 0x0F) - - /** - * [Bit 4] S - Descriptor type (0 = system; 1 = code or data). - */ - uint32_t descriptor_type : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_BIT 4 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_FLAG 0x10 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_TYPE(_) (((_) >> 4) & 0x01) - - /** - * [Bits 6:5] DPL - Descriptor privilege level. - */ - uint32_t descriptor_privilege_level : 2; -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_BIT 5 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_FLAG 0x60 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL_MASK 0x03 -#define VMX_SEGMENT_ACCESS_RIGHTS_DESCRIPTOR_PRIVILEGE_LEVEL(_) (((_) >> 5) & 0x03) - - /** - * [Bit 7] P - Segment present. - */ - uint32_t present : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_PRESENT_BIT 7 -#define VMX_SEGMENT_ACCESS_RIGHTS_PRESENT_FLAG 0x80 -#define VMX_SEGMENT_ACCESS_RIGHTS_PRESENT_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_PRESENT(_) (((_) >> 7) & 0x01) - uint32_t reserved1 : 4; - - /** - * [Bit 12] AVL - Available for use by system software. - */ - uint32_t available_bit : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_AVAILABLE_BIT_BIT 12 -#define VMX_SEGMENT_ACCESS_RIGHTS_AVAILABLE_BIT_FLAG 0x1000 -#define VMX_SEGMENT_ACCESS_RIGHTS_AVAILABLE_BIT_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_AVAILABLE_BIT(_) (((_) >> 12) & 0x01) - - /** - * [Bit 13] Reserved (except for CS). L - 64-bit mode active (for CS only). - */ - uint32_t long_mode : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_LONG_MODE_BIT 13 -#define VMX_SEGMENT_ACCESS_RIGHTS_LONG_MODE_FLAG 0x2000 -#define VMX_SEGMENT_ACCESS_RIGHTS_LONG_MODE_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_LONG_MODE(_) (((_) >> 13) & 0x01) - - /** - * [Bit 14] D/B - Default operation size (0 = 16-bit segment; 1 = 32-bit segment). - */ - uint32_t default_big : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_BIT 14 -#define VMX_SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_FLAG 0x4000 -#define VMX_SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_DEFAULT_BIG(_) (((_) >> 14) & 0x01) - - /** - * [Bit 15] G - Granularity. - */ - uint32_t granularity : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_GRANULARITY_BIT 15 -#define VMX_SEGMENT_ACCESS_RIGHTS_GRANULARITY_FLAG 0x8000 -#define VMX_SEGMENT_ACCESS_RIGHTS_GRANULARITY_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_GRANULARITY(_) (((_) >> 15) & 0x01) - - /** - * [Bit 16] Segment unusable (0 = usable; 1 = unusable). - */ - uint32_t unusable : 1; -#define VMX_SEGMENT_ACCESS_RIGHTS_UNUSABLE_BIT 16 -#define VMX_SEGMENT_ACCESS_RIGHTS_UNUSABLE_FLAG 0x10000 -#define VMX_SEGMENT_ACCESS_RIGHTS_UNUSABLE_MASK 0x01 -#define VMX_SEGMENT_ACCESS_RIGHTS_UNUSABLE(_) (((_) >> 16) & 0x01) - uint32_t reserved2 : 15; - }; - - uint32_t flags; -} vmx_segment_access_rights; - -/** - * @brief The IA-32 architecture includes features that permit certain events to be blocked for a period of time. This - * field contains information about such blocking - * - * @see INTERRUPTIBILITY_STATE of 32_BIT_GUEST_STATE_FIELDS - * @see Vol3C[24.4.2(Guest Non-Register State)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bit 0] Execution of STI with RFLAGS.IF = 0 blocks maskable interrupts on the instruction boundary following its - * execution.1 Setting this bit indicates that this blocking is in effect. - * - * @see Vol2B[4(STI-Set Interrupt Flag)] - */ - uint32_t blocking_by_sti : 1; -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_STI_BIT 0 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_STI_FLAG 0x01 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_STI_MASK 0x01 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_STI(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Execution of a MOV to SS or a POP to SS blocks or suppresses certain debug exceptions as well as interrupts - * (maskable and nonmaskable) on the instruction boundary following its execution. Setting this bit indicates that this - * blocking is in effect. This document uses the term "blocking by MOV SS," but it applies equally to POP SS. - * - * @see Vol3A[6.8.3(Masking Exceptions and Interrupts When Switching Stacks)] - */ - uint32_t blocking_by_mov_ss : 1; -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_MOV_SS_BIT 1 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_MOV_SS_FLAG 0x02 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_MOV_SS_MASK 0x01 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_MOV_SS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] System-management interrupts (SMIs) are disabled while the processor is in system-management mode (SMM). Setting - * this bit indicates that blocking of SMIs is in effect. - * - * @see Vol3C[34.2(System Management Interrupt (SMI))] - */ - uint32_t blocking_by_smi : 1; -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_SMI_BIT 2 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_SMI_FLAG 0x04 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_SMI_MASK 0x01 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_SMI(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] Delivery of a non-maskable interrupt (NMI) or a system-management interrupt (SMI) blocks subsequent NMIs until - * the next execution of IRET. Setting this bit indicates that blocking of NMIs is in effect. Clearing this bit does not - * imply that NMIs are not (temporarily) blocked for other reasons. If the "virtual NMIs" VM-execution control is 1, this - * bit does not control the blocking of NMIs. Instead, it refers to "virtual-NMI blocking" (the fact that guest software is - * not ready for an NMI). - * - * @see Vol3C[6.7.1(Handling Multiple NMIs)] - * @see Vol3C[25.3(CHANGES TO INSTRUCTION BEHAVIOR IN VMX NON-ROOT OPERATION)] - * @see Vol3C[24.6.1(Pin-Based VM-Execution Controls)] - */ - uint32_t blocking_by_nmi : 1; -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_NMI_BIT 3 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_NMI_FLAG 0x08 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_NMI_MASK 0x01 -#define VMX_INTERRUPTIBILITY_STATE_BLOCKING_BY_NMI(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] A VM exit saves this bit as 1 to indicate that the VM exit was incident to enclave mode. - */ - uint32_t enclave_interruption : 1; -#define VMX_INTERRUPTIBILITY_STATE_ENCLAVE_INTERRUPTION_BIT 4 -#define VMX_INTERRUPTIBILITY_STATE_ENCLAVE_INTERRUPTION_FLAG 0x10 -#define VMX_INTERRUPTIBILITY_STATE_ENCLAVE_INTERRUPTION_MASK 0x01 -#define VMX_INTERRUPTIBILITY_STATE_ENCLAVE_INTERRUPTION(_) (((_) >> 4) & 0x01) - uint32_t reserved1 : 27; - }; - - uint32_t flags; -} vmx_interruptibility_state; - -typedef enum -{ - /** - * The logical processor is executing instructions normally. - */ - vmx_active = 0x00000000, - - /** - * The logical processor is inactive because it executed the HLT instruction. - */ - vmx_hlt = 0x00000001, - - /** - * The logical processor is inactive because it incurred a triple fault1 or some other serious error. - */ - vmx_shutdown = 0x00000002, - - /** - * The logical processor is inactive because it is waiting for a startup-IPI (SIPI). - */ - vmx_wait_for_sipi = 0x00000003, -} vmx_guest_activity_state; - -/** - * @} - */ - - /** - * @brief Format of Exit Reason - * - * Exit reason (32 bits). This field encodes the reason for the VM exit and has the structure. - * - * @see Vol3C[24.9.1(Basic VM-Exit Information)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bits 15:0] Provides basic information about the cause of the VM exit (if bit 31 is clear) or of the VM-entry failure - * (if bit 31 is set). - */ - uint32_t basic_exit_reason : 16; -#define VMX_VMEXIT_REASON_BASIC_EXIT_REASON_BIT 0 -#define VMX_VMEXIT_REASON_BASIC_EXIT_REASON_FLAG 0xFFFF -#define VMX_VMEXIT_REASON_BASIC_EXIT_REASON_MASK 0xFFFF -#define VMX_VMEXIT_REASON_BASIC_EXIT_REASON(_) (((_) >> 0) & 0xFFFF) - - /** - * [Bit 16] Always cleared to 0. - */ - uint32_t always0 : 1; -#define VMX_VMEXIT_REASON_ALWAYS0_BIT 16 -#define VMX_VMEXIT_REASON_ALWAYS0_FLAG 0x10000 -#define VMX_VMEXIT_REASON_ALWAYS0_MASK 0x01 -#define VMX_VMEXIT_REASON_ALWAYS0(_) (((_) >> 16) & 0x01) - uint32_t reserved1 : 10; -#define VMX_VMEXIT_REASON_RESERVED1_BIT 17 -#define VMX_VMEXIT_REASON_RESERVED1_FLAG 0x7FE0000 -#define VMX_VMEXIT_REASON_RESERVED1_MASK 0x3FF -#define VMX_VMEXIT_REASON_RESERVED1(_) (((_) >> 17) & 0x3FF) - - /** - * [Bit 27] A VM exit saves this bit as 1 to indicate that the VM exit was incident to enclave mode. - */ - uint32_t enclave_mode : 1; -#define VMX_VMEXIT_REASON_ENCLAVE_MODE_BIT 27 -#define VMX_VMEXIT_REASON_ENCLAVE_MODE_FLAG 0x8000000 -#define VMX_VMEXIT_REASON_ENCLAVE_MODE_MASK 0x01 -#define VMX_VMEXIT_REASON_ENCLAVE_MODE(_) (((_) >> 27) & 0x01) - - /** - * [Bit 28] Pending MTF VM exit. - */ - uint32_t pending_mtf_vm_exit : 1; -#define VMX_VMEXIT_REASON_PENDING_MTF_VM_EXIT_BIT 28 -#define VMX_VMEXIT_REASON_PENDING_MTF_VM_EXIT_FLAG 0x10000000 -#define VMX_VMEXIT_REASON_PENDING_MTF_VM_EXIT_MASK 0x01 -#define VMX_VMEXIT_REASON_PENDING_MTF_VM_EXIT(_) (((_) >> 28) & 0x01) - - /** - * [Bit 29] VM exit from VMX root operation. - */ - uint32_t vm_exit_from_vmx_roor : 1; -#define VMX_VMEXIT_REASON_VM_EXIT_FROM_VMX_ROOR_BIT 29 -#define VMX_VMEXIT_REASON_VM_EXIT_FROM_VMX_ROOR_FLAG 0x20000000 -#define VMX_VMEXIT_REASON_VM_EXIT_FROM_VMX_ROOR_MASK 0x01 -#define VMX_VMEXIT_REASON_VM_EXIT_FROM_VMX_ROOR(_) (((_) >> 29) & 0x01) - uint32_t reserved2 : 1; -#define VMX_VMEXIT_REASON_RESERVED2_BIT 30 -#define VMX_VMEXIT_REASON_RESERVED2_FLAG 0x40000000 -#define VMX_VMEXIT_REASON_RESERVED2_MASK 0x01 -#define VMX_VMEXIT_REASON_RESERVED2(_) (((_) >> 30) & 0x01) - - /** - * [Bit 31] VM-entry failure: - * - 0 = true VM exit - * - 1 = VM-entry failure - */ - uint32_t vm_entry_failure : 1; -#define VMX_VMEXIT_REASON_VM_ENTRY_FAILURE_BIT 31 -#define VMX_VMEXIT_REASON_VM_ENTRY_FAILURE_FLAG 0x80000000 -#define VMX_VMEXIT_REASON_VM_ENTRY_FAILURE_MASK 0x01 -#define VMX_VMEXIT_REASON_VM_ENTRY_FAILURE(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; -} vmx_vmexit_reason; - -typedef struct -{ -#define IO_BITMAP_A_MIN 0x00000000 -#define IO_BITMAP_A_MAX 0x00007FFF -#define IO_BITMAP_B_MIN 0x00008000 -#define IO_BITMAP_B_MAX 0x0000FFFF - uint8_t io_a[4096]; - uint8_t io_b[4096]; -} vmx_io_bitmap; - -typedef struct -{ -#define MSR_ID_LOW_MIN 0x00000000 -#define MSR_ID_LOW_MAX 0x00001FFF -#define MSR_ID_HIGH_MIN 0xC0000000 -#define MSR_ID_HIGH_MAX 0xC0001FFF - uint8_t rdmsr_low[1024]; - uint8_t rdmsr_high[1024]; - uint8_t wrmsr_low[1024]; - uint8_t wrmsr_high[1024]; -} vmx_msr_bitmap; - -/** - * @defgroup ept \ - * The extended page-table mechanism - * - * The extended page-table mechanism (EPT) is a feature that can be used to support the virtualization of physical memory. - * When EPT is in use, certain addresses that would normally be treated as physical addresses (and used to access memory) - * are instead treated as guest-physical addresses. Guest-physical addresses are translated by traversing a set of EPT - * paging structures to produce physical addresses that are used to access memory. - * - * @see Vol3C[28.2(THE EXTENDED PAGE TABLE MECHANISM (EPT))] (reference) - * @{ - */ - /** - * @brief Extended-Page-Table Pointer (EPTP) - * - * The extended-page-table pointer (EPTP) contains the address of the base of EPT PML4 table, as well as other EPT - * configuration information. - * - * @see Vol3C[28.2.2(EPT Translation Mechanism] - * @see Vol3C[24.6.11(Extended-Page-Table Pointer (EPTP)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bits 2:0] EPT paging-structure memory type: - * - 0 = Uncacheable (UC) - * - 6 = Write-back (WB) - * Other values are reserved. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t memory_type : 3; -#define EPT_POINTER_MEMORY_TYPE_BIT 0 -#define EPT_POINTER_MEMORY_TYPE_FLAG 0x07 -#define EPT_POINTER_MEMORY_TYPE_MASK 0x07 -#define EPT_POINTER_MEMORY_TYPE(_) (((_) >> 0) & 0x07) - - /** - * [Bits 5:3] This value is 1 less than the EPT page-walk length. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t page_walk_length : 3; -#define EPT_POINTER_PAGE_WALK_LENGTH_BIT 3 -#define EPT_POINTER_PAGE_WALK_LENGTH_FLAG 0x38 -#define EPT_POINTER_PAGE_WALK_LENGTH_MASK 0x07 -#define EPT_POINTER_PAGE_WALK_LENGTH(_) (((_) >> 3) & 0x07) -#define EPT_PAGE_WALK_LENGTH_4 0x00000003 - - /** - * [Bit 6] Setting this control to 1 enables accessed and dirty flags for EPT. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t enable_access_and_dirty_flags : 1; -#define EPT_POINTER_ENABLE_ACCESS_AND_DIRTY_FLAGS_BIT 6 -#define EPT_POINTER_ENABLE_ACCESS_AND_DIRTY_FLAGS_FLAG 0x40 -#define EPT_POINTER_ENABLE_ACCESS_AND_DIRTY_FLAGS_MASK 0x01 -#define EPT_POINTER_ENABLE_ACCESS_AND_DIRTY_FLAGS(_) (((_) >> 6) & 0x01) - uint64_t reserved1 : 5; - - /** - * [Bits 47:12] Bits N-1:12 of the physical address of the 4-KByte aligned EPT PML4 table. - */ - uint64_t page_frame_number : 36; -#define EPT_POINTER_PAGE_FRAME_NUMBER_BIT 12 -#define EPT_POINTER_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPT_POINTER_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPT_POINTER_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 16; - }; - - uint64_t flags; -} ept_pointer; - -/** - * @brief Format of an EPT PML4 Entry (PML4E) that References an EPT Page-Directory-Pointer Table - * - * A 4-KByte naturally aligned EPT PML4 table is located at the physical address specified in bits 51:12 of the - * extended-page-table pointer (EPTP), a VM-execution control field. An EPT PML4 table comprises 512 64-bit entries (EPT - * PML4Es). An EPT PML4E is selected using the physical address defined as follows: - * - Bits 63:52 are all 0. - * - Bits 51:12 are from the EPTP. - * - Bits 11:3 are bits 47:39 of the guest-physical address. - * - Bits 2:0 are all 0. - * Because an EPT PML4E is identified using bits 47:39 of the guest-physical address, it controls access to a 512- GByte - * region of the guest-physical-address space. - * - * @see Vol3C[24.6.11(Extended-Page-Table Pointer (EPTP)] - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 512-GByte region controlled by this entry. - */ - uint64_t read_access : 1; -#define EPT_PML4_READ_ACCESS_BIT 0 -#define EPT_PML4_READ_ACCESS_FLAG 0x01 -#define EPT_PML4_READ_ACCESS_MASK 0x01 -#define EPT_PML4_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 512-GByte region controlled by this entry. - */ - uint64_t write_access : 1; -#define EPT_PML4_WRITE_ACCESS_BIT 1 -#define EPT_PML4_WRITE_ACCESS_FLAG 0x02 -#define EPT_PML4_WRITE_ACCESS_MASK 0x01 -#define EPT_PML4_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 512-GByte region controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 512-GByte region controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPT_PML4_EXECUTE_ACCESS_BIT 2 -#define EPT_PML4_EXECUTE_ACCESS_FLAG 0x04 -#define EPT_PML4_EXECUTE_ACCESS_MASK 0x01 -#define EPT_PML4_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 5; - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 512-GByte region - * controlled by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPT_PML4_ACCESSED_BIT 8 -#define EPT_PML4_ACCESSED_FLAG 0x100 -#define EPT_PML4_ACCESSED_MASK 0x01 -#define EPT_PML4_ACCESSED(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 512-GByte region - * controlled by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPT_PML4_USER_MODE_EXECUTE_BIT 10 -#define EPT_PML4_USER_MODE_EXECUTE_FLAG 0x400 -#define EPT_PML4_USER_MODE_EXECUTE_MASK 0x01 -#define EPT_PML4_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved3 : 1; - - /** - * [Bits 47:12] Physical address of 4-KByte aligned EPT page-directory-pointer table referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define EPT_PML4_PAGE_FRAME_NUMBER_BIT 12 -#define EPT_PML4_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPT_PML4_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPT_PML4_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved4 : 16; - }; - - uint64_t flags; -} ept_pml4; - -/** - * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that Maps a 1-GByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 1-GByte page referenced by this entry. - */ - uint64_t read_access : 1; -#define EPDPTE_1GB_READ_ACCESS_BIT 0 -#define EPDPTE_1GB_READ_ACCESS_FLAG 0x01 -#define EPDPTE_1GB_READ_ACCESS_MASK 0x01 -#define EPDPTE_1GB_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 1-GByte page referenced by this entry. - */ - uint64_t write_access : 1; -#define EPDPTE_1GB_WRITE_ACCESS_BIT 1 -#define EPDPTE_1GB_WRITE_ACCESS_FLAG 0x02 -#define EPDPTE_1GB_WRITE_ACCESS_MASK 0x01 -#define EPDPTE_1GB_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 1-GByte page controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 1-GByte page controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPDPTE_1GB_EXECUTE_ACCESS_BIT 2 -#define EPDPTE_1GB_EXECUTE_ACCESS_FLAG 0x04 -#define EPDPTE_1GB_EXECUTE_ACCESS_MASK 0x01 -#define EPDPTE_1GB_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - - /** - * [Bits 5:3] EPT memory type for this 1-GByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t memory_type : 3; -#define EPDPTE_1GB_MEMORY_TYPE_BIT 3 -#define EPDPTE_1GB_MEMORY_TYPE_FLAG 0x38 -#define EPDPTE_1GB_MEMORY_TYPE_MASK 0x07 -#define EPDPTE_1GB_MEMORY_TYPE(_) (((_) >> 3) & 0x07) - - /** - * [Bit 6] Ignore PAT memory type for this 1-GByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t ignore_pat : 1; -#define EPDPTE_1GB_IGNORE_PAT_BIT 6 -#define EPDPTE_1GB_IGNORE_PAT_FLAG 0x40 -#define EPDPTE_1GB_IGNORE_PAT_MASK 0x01 -#define EPDPTE_1GB_IGNORE_PAT(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Must be 1 (otherwise, this entry references an EPT page directory). - */ - uint64_t large_page : 1; -#define EPDPTE_1GB_LARGE_PAGE_BIT 7 -#define EPDPTE_1GB_LARGE_PAGE_FLAG 0x80 -#define EPDPTE_1GB_LARGE_PAGE_MASK 0x01 -#define EPDPTE_1GB_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 1-GByte page - * referenced by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPDPTE_1GB_ACCESSED_BIT 8 -#define EPDPTE_1GB_ACCESSED_FLAG 0x100 -#define EPDPTE_1GB_ACCESSED_MASK 0x01 -#define EPDPTE_1GB_ACCESSED(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] If bit 6 of EPTP is 1, dirty flag for EPT; indicates whether software has written to the 1-GByte page referenced - * by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t dirty : 1; -#define EPDPTE_1GB_DIRTY_BIT 9 -#define EPDPTE_1GB_DIRTY_FLAG 0x200 -#define EPDPTE_1GB_DIRTY_MASK 0x01 -#define EPDPTE_1GB_DIRTY(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 1-GByte page controlled - * by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPDPTE_1GB_USER_MODE_EXECUTE_BIT 10 -#define EPDPTE_1GB_USER_MODE_EXECUTE_FLAG 0x400 -#define EPDPTE_1GB_USER_MODE_EXECUTE_MASK 0x01 -#define EPDPTE_1GB_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved1 : 19; - - /** - * [Bits 47:30] Physical address of 4-KByte aligned EPT page-directory-pointer table referenced by this entry. - */ - uint64_t page_frame_number : 18; -#define EPDPTE_1GB_PAGE_FRAME_NUMBER_BIT 30 -#define EPDPTE_1GB_PAGE_FRAME_NUMBER_FLAG 0xFFFFC0000000 -#define EPDPTE_1GB_PAGE_FRAME_NUMBER_MASK 0x3FFFF -#define EPDPTE_1GB_PAGE_FRAME_NUMBER(_) (((_) >> 30) & 0x3FFFF) - uint64_t reserved2 : 15; - - /** - * [Bit 63] Suppress \#VE. If the "EPT-violation \#VE" VM-execution control is 1, EPT violations caused by accesses to this - * page are convertible to virtualization exceptions only if this bit is 0. If "EPT-violation \#VE" VMexecution control is - * 0, this bit is ignored. - * - * @see Vol3C[25.5.6.1(Convertible EPT Violations)] - */ - uint64_t suppress_ve : 1; -#define EPDPTE_1GB_SUPPRESS_VE_BIT 63 -#define EPDPTE_1GB_SUPPRESS_VE_FLAG 0x8000000000000000 -#define EPDPTE_1GB_SUPPRESS_VE_MASK 0x01 -#define EPDPTE_1GB_SUPPRESS_VE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} epdpte_1gb; - -/** - * @brief Format of an EPT Page-Directory-Pointer-Table Entry (PDPTE) that References an EPT Page Directory - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 1-GByte region controlled by this entry. - */ - uint64_t read_access : 1; -#define EPDPTE_READ_ACCESS_BIT 0 -#define EPDPTE_READ_ACCESS_FLAG 0x01 -#define EPDPTE_READ_ACCESS_MASK 0x01 -#define EPDPTE_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 1-GByte region controlled by this entry. - */ - uint64_t write_access : 1; -#define EPDPTE_WRITE_ACCESS_BIT 1 -#define EPDPTE_WRITE_ACCESS_FLAG 0x02 -#define EPDPTE_WRITE_ACCESS_MASK 0x01 -#define EPDPTE_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 1-GByte region controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 1-GByte region controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPDPTE_EXECUTE_ACCESS_BIT 2 -#define EPDPTE_EXECUTE_ACCESS_FLAG 0x04 -#define EPDPTE_EXECUTE_ACCESS_MASK 0x01 -#define EPDPTE_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 5; - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 1-GByte region - * controlled by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPDPTE_ACCESSED_BIT 8 -#define EPDPTE_ACCESSED_FLAG 0x100 -#define EPDPTE_ACCESSED_MASK 0x01 -#define EPDPTE_ACCESSED(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 1-GByte region controlled - * by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPDPTE_USER_MODE_EXECUTE_BIT 10 -#define EPDPTE_USER_MODE_EXECUTE_FLAG 0x400 -#define EPDPTE_USER_MODE_EXECUTE_MASK 0x01 -#define EPDPTE_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved3 : 1; - - /** - * [Bits 47:12] Physical address of 4-KByte aligned EPT page-directory-pointer table referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define EPDPTE_PAGE_FRAME_NUMBER_BIT 12 -#define EPDPTE_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPDPTE_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPDPTE_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved4 : 16; - }; - - uint64_t flags; -} epdpte; - -/** - * @brief Format of an EPT Page-Directory Entry (PDE) that Maps a 2-MByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 2-MByte page referenced by this entry. - */ - uint64_t read_access : 1; -#define EPDE_2MB_READ_ACCESS_BIT 0 -#define EPDE_2MB_READ_ACCESS_FLAG 0x01 -#define EPDE_2MB_READ_ACCESS_MASK 0x01 -#define EPDE_2MB_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 2-MByte page referenced by this entry. - */ - uint64_t write_access : 1; -#define EPDE_2MB_WRITE_ACCESS_BIT 1 -#define EPDE_2MB_WRITE_ACCESS_FLAG 0x02 -#define EPDE_2MB_WRITE_ACCESS_MASK 0x01 -#define EPDE_2MB_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 2-MByte page controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 2-MByte page controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPDE_2MB_EXECUTE_ACCESS_BIT 2 -#define EPDE_2MB_EXECUTE_ACCESS_FLAG 0x04 -#define EPDE_2MB_EXECUTE_ACCESS_MASK 0x01 -#define EPDE_2MB_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - - /** - * [Bits 5:3] EPT memory type for this 2-MByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t memory_type : 3; -#define EPDE_2MB_MEMORY_TYPE_BIT 3 -#define EPDE_2MB_MEMORY_TYPE_FLAG 0x38 -#define EPDE_2MB_MEMORY_TYPE_MASK 0x07 -#define EPDE_2MB_MEMORY_TYPE(_) (((_) >> 3) & 0x07) - - /** - * [Bit 6] Ignore PAT memory type for this 2-MByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t ignore_pat : 1; -#define EPDE_2MB_IGNORE_PAT_BIT 6 -#define EPDE_2MB_IGNORE_PAT_FLAG 0x40 -#define EPDE_2MB_IGNORE_PAT_MASK 0x01 -#define EPDE_2MB_IGNORE_PAT(_) (((_) >> 6) & 0x01) - - /** - * [Bit 7] Must be 1 (otherwise, this entry references an EPT page table). - */ - uint64_t large_page : 1; -#define EPDE_2MB_LARGE_PAGE_BIT 7 -#define EPDE_2MB_LARGE_PAGE_FLAG 0x80 -#define EPDE_2MB_LARGE_PAGE_MASK 0x01 -#define EPDE_2MB_LARGE_PAGE(_) (((_) >> 7) & 0x01) - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 2-MByte page - * referenced by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPDE_2MB_ACCESSED_BIT 8 -#define EPDE_2MB_ACCESSED_FLAG 0x100 -#define EPDE_2MB_ACCESSED_MASK 0x01 -#define EPDE_2MB_ACCESSED(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] If bit 6 of EPTP is 1, dirty flag for EPT; indicates whether software has written to the 2-MByte page referenced - * by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t dirty : 1; -#define EPDE_2MB_DIRTY_BIT 9 -#define EPDE_2MB_DIRTY_FLAG 0x200 -#define EPDE_2MB_DIRTY_MASK 0x01 -#define EPDE_2MB_DIRTY(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 2-MByte page controlled - * by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPDE_2MB_USER_MODE_EXECUTE_BIT 10 -#define EPDE_2MB_USER_MODE_EXECUTE_FLAG 0x400 -#define EPDE_2MB_USER_MODE_EXECUTE_MASK 0x01 -#define EPDE_2MB_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved1 : 10; - - /** - * [Bits 47:21] Physical address of 4-KByte aligned EPT page-directory-pointer table referenced by this entry. - */ - uint64_t page_frame_number : 27; -#define EPDE_2MB_PAGE_FRAME_NUMBER_BIT 21 -#define EPDE_2MB_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFE00000 -#define EPDE_2MB_PAGE_FRAME_NUMBER_MASK 0x7FFFFFF -#define EPDE_2MB_PAGE_FRAME_NUMBER(_) (((_) >> 21) & 0x7FFFFFF) - uint64_t reserved2 : 15; - - /** - * [Bit 63] Suppress \#VE. If the "EPT-violation \#VE" VM-execution control is 1, EPT violations caused by accesses to this - * page are convertible to virtualization exceptions only if this bit is 0. If "EPT-violation \#VE" VMexecution control is - * 0, this bit is ignored. - * - * @see Vol3C[25.5.6.1(Convertible EPT Violations)] - */ - uint64_t suppress_ve : 1; -#define EPDE_2MB_SUPPRESS_VE_BIT 63 -#define EPDE_2MB_SUPPRESS_VE_FLAG 0x8000000000000000 -#define EPDE_2MB_SUPPRESS_VE_MASK 0x01 -#define EPDE_2MB_SUPPRESS_VE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} epde_2mb; - -/** - * @brief Format of an EPT Page-Directory Entry (PDE) that References an EPT Page Table - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 2-MByte region controlled by this entry. - */ - uint64_t read_access : 1; -#define EPDE_READ_ACCESS_BIT 0 -#define EPDE_READ_ACCESS_FLAG 0x01 -#define EPDE_READ_ACCESS_MASK 0x01 -#define EPDE_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 2-MByte region controlled by this entry. - */ - uint64_t write_access : 1; -#define EPDE_WRITE_ACCESS_BIT 1 -#define EPDE_WRITE_ACCESS_FLAG 0x02 -#define EPDE_WRITE_ACCESS_MASK 0x01 -#define EPDE_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 2-MByte region controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 2-MByte region controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPDE_EXECUTE_ACCESS_BIT 2 -#define EPDE_EXECUTE_ACCESS_FLAG 0x04 -#define EPDE_EXECUTE_ACCESS_MASK 0x01 -#define EPDE_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 5; - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 2-MByte region - * controlled by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPDE_ACCESSED_BIT 8 -#define EPDE_ACCESSED_FLAG 0x100 -#define EPDE_ACCESSED_MASK 0x01 -#define EPDE_ACCESSED(_) (((_) >> 8) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 2-MByte region controlled - * by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPDE_USER_MODE_EXECUTE_BIT 10 -#define EPDE_USER_MODE_EXECUTE_FLAG 0x400 -#define EPDE_USER_MODE_EXECUTE_MASK 0x01 -#define EPDE_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved3 : 1; - - /** - * [Bits 47:12] Physical address of 4-KByte aligned EPT page table referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define EPDE_PAGE_FRAME_NUMBER_BIT 12 -#define EPDE_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPDE_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPDE_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved4 : 16; - }; - - uint64_t flags; -} epde; - -/** - * @brief Format of an EPT Page-Table Entry that Maps a 4-KByte Page - */ -typedef union -{ - struct - { - /** - * [Bit 0] Read access; indicates whether reads are allowed from the 4-KByte page referenced by this entry. - */ - uint64_t read_access : 1; -#define EPTE_READ_ACCESS_BIT 0 -#define EPTE_READ_ACCESS_FLAG 0x01 -#define EPTE_READ_ACCESS_MASK 0x01 -#define EPTE_READ_ACCESS(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Write access; indicates whether writes are allowed from the 4-KByte page referenced by this entry. - */ - uint64_t write_access : 1; -#define EPTE_WRITE_ACCESS_BIT 1 -#define EPTE_WRITE_ACCESS_FLAG 0x02 -#define EPTE_WRITE_ACCESS_MASK 0x01 -#define EPTE_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If the "mode-based execute control for EPT" VM-execution control is 0, execute access; indicates whether - * instruction fetches are allowed from the 4-KByte page controlled by this entry. - * If that control is 1, execute access for supervisor-mode linear addresses; indicates whether instruction fetches are - * allowed from supervisor-mode linear addresses in the 4-KByte page controlled by this entry. - */ - uint64_t execute_access : 1; -#define EPTE_EXECUTE_ACCESS_BIT 2 -#define EPTE_EXECUTE_ACCESS_FLAG 0x04 -#define EPTE_EXECUTE_ACCESS_MASK 0x01 -#define EPTE_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - - /** - * [Bits 5:3] EPT memory type for this 4-KByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t memory_type : 3; -#define EPTE_MEMORY_TYPE_BIT 3 -#define EPTE_MEMORY_TYPE_FLAG 0x38 -#define EPTE_MEMORY_TYPE_MASK 0x07 -#define EPTE_MEMORY_TYPE(_) (((_) >> 3) & 0x07) - - /** - * [Bit 6] Ignore PAT memory type for this 4-KByte page. - * - * @see Vol3C[28.2.6(EPT and memory Typing)] - */ - uint64_t ignore_pat : 1; -#define EPTE_IGNORE_PAT_BIT 6 -#define EPTE_IGNORE_PAT_FLAG 0x40 -#define EPTE_IGNORE_PAT_MASK 0x01 -#define EPTE_IGNORE_PAT(_) (((_) >> 6) & 0x01) - uint64_t reserved1 : 1; - - /** - * [Bit 8] If bit 6 of EPTP is 1, accessed flag for EPT; indicates whether software has accessed the 4-KByte page - * referenced by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t accessed : 1; -#define EPTE_ACCESSED_BIT 8 -#define EPTE_ACCESSED_FLAG 0x100 -#define EPTE_ACCESSED_MASK 0x01 -#define EPTE_ACCESSED(_) (((_) >> 8) & 0x01) - - /** - * [Bit 9] If bit 6 of EPTP is 1, dirty flag for EPT; indicates whether software has written to the 4-KByte page referenced - * by this entry. Ignored if bit 6 of EPTP is 0. - * - * @see Vol3C[28.2.4(Accessed and Dirty Flags for EPT)] - */ - uint64_t dirty : 1; -#define EPTE_DIRTY_BIT 9 -#define EPTE_DIRTY_FLAG 0x200 -#define EPTE_DIRTY_MASK 0x01 -#define EPTE_DIRTY(_) (((_) >> 9) & 0x01) - - /** - * [Bit 10] Execute access for user-mode linear addresses. If the "mode-based execute control for EPT" VM-execution control - * is 1, indicates whether instruction fetches are allowed from user-mode linear addresses in the 4-KByte page controlled - * by this entry. If that control is 0, this bit is ignored. - */ - uint64_t user_mode_execute : 1; -#define EPTE_USER_MODE_EXECUTE_BIT 10 -#define EPTE_USER_MODE_EXECUTE_FLAG 0x400 -#define EPTE_USER_MODE_EXECUTE_MASK 0x01 -#define EPTE_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved2 : 1; - - /** - * [Bits 47:12] Physical address of the 4-KByte page referenced by this entry. - */ - uint64_t page_frame_number : 36; -#define EPTE_PAGE_FRAME_NUMBER_BIT 12 -#define EPTE_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPTE_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPTE_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved3 : 15; - - /** - * [Bit 63] Suppress \#VE. If the "EPT-violation \#VE" VM-execution control is 1, EPT violations caused by accesses to this - * page are convertible to virtualization exceptions only if this bit is 0. If "EPT-violation \#VE" VMexecution control is - * 0, this bit is ignored. - * - * @see Vol3C[25.5.6.1(Convertible EPT Violations)] - */ - uint64_t suppress_ve : 1; -#define EPTE_SUPPRESS_VE_BIT 63 -#define EPTE_SUPPRESS_VE_FLAG 0x8000000000000000 -#define EPTE_SUPPRESS_VE_MASK 0x01 -#define EPTE_SUPPRESS_VE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} epte; - -/** - * @brief Format of a common EPT Entry - */ -typedef union -{ - struct - { - uint64_t read_access : 1; -#define EPT_ENTRY_READ_ACCESS_BIT 0 -#define EPT_ENTRY_READ_ACCESS_FLAG 0x01 -#define EPT_ENTRY_READ_ACCESS_MASK 0x01 -#define EPT_ENTRY_READ_ACCESS(_) (((_) >> 0) & 0x01) - uint64_t write_access : 1; -#define EPT_ENTRY_WRITE_ACCESS_BIT 1 -#define EPT_ENTRY_WRITE_ACCESS_FLAG 0x02 -#define EPT_ENTRY_WRITE_ACCESS_MASK 0x01 -#define EPT_ENTRY_WRITE_ACCESS(_) (((_) >> 1) & 0x01) - uint64_t execute_access : 1; -#define EPT_ENTRY_EXECUTE_ACCESS_BIT 2 -#define EPT_ENTRY_EXECUTE_ACCESS_FLAG 0x04 -#define EPT_ENTRY_EXECUTE_ACCESS_MASK 0x01 -#define EPT_ENTRY_EXECUTE_ACCESS(_) (((_) >> 2) & 0x01) - uint64_t memory_type : 3; -#define EPT_ENTRY_MEMORY_TYPE_BIT 3 -#define EPT_ENTRY_MEMORY_TYPE_FLAG 0x38 -#define EPT_ENTRY_MEMORY_TYPE_MASK 0x07 -#define EPT_ENTRY_MEMORY_TYPE(_) (((_) >> 3) & 0x07) - uint64_t ignore_pat : 1; -#define EPT_ENTRY_IGNORE_PAT_BIT 6 -#define EPT_ENTRY_IGNORE_PAT_FLAG 0x40 -#define EPT_ENTRY_IGNORE_PAT_MASK 0x01 -#define EPT_ENTRY_IGNORE_PAT(_) (((_) >> 6) & 0x01) - uint64_t large_page : 1; -#define EPT_ENTRY_LARGE_PAGE_BIT 7 -#define EPT_ENTRY_LARGE_PAGE_FLAG 0x80 -#define EPT_ENTRY_LARGE_PAGE_MASK 0x01 -#define EPT_ENTRY_LARGE_PAGE(_) (((_) >> 7) & 0x01) - uint64_t accessed : 1; -#define EPT_ENTRY_ACCESSED_BIT 8 -#define EPT_ENTRY_ACCESSED_FLAG 0x100 -#define EPT_ENTRY_ACCESSED_MASK 0x01 -#define EPT_ENTRY_ACCESSED(_) (((_) >> 8) & 0x01) - uint64_t dirty : 1; -#define EPT_ENTRY_DIRTY_BIT 9 -#define EPT_ENTRY_DIRTY_FLAG 0x200 -#define EPT_ENTRY_DIRTY_MASK 0x01 -#define EPT_ENTRY_DIRTY(_) (((_) >> 9) & 0x01) - uint64_t user_mode_execute : 1; -#define EPT_ENTRY_USER_MODE_EXECUTE_BIT 10 -#define EPT_ENTRY_USER_MODE_EXECUTE_FLAG 0x400 -#define EPT_ENTRY_USER_MODE_EXECUTE_MASK 0x01 -#define EPT_ENTRY_USER_MODE_EXECUTE(_) (((_) >> 10) & 0x01) - uint64_t reserved1 : 1; - uint64_t page_frame_number : 36; -#define EPT_ENTRY_PAGE_FRAME_NUMBER_BIT 12 -#define EPT_ENTRY_PAGE_FRAME_NUMBER_FLAG 0xFFFFFFFFF000 -#define EPT_ENTRY_PAGE_FRAME_NUMBER_MASK 0xFFFFFFFFF -#define EPT_ENTRY_PAGE_FRAME_NUMBER(_) (((_) >> 12) & 0xFFFFFFFFF) - uint64_t reserved2 : 15; - uint64_t suppress_ve : 1; -#define EPT_ENTRY_SUPPRESS_VE_BIT 63 -#define EPT_ENTRY_SUPPRESS_VE_FLAG 0x8000000000000000 -#define EPT_ENTRY_SUPPRESS_VE_MASK 0x01 -#define EPT_ENTRY_SUPPRESS_VE(_) (((_) >> 63) & 0x01) - }; - - uint64_t flags; -} ept_entry; - -/** - * @defgroup ept_table_level \ - * EPT Table level numbers - * - * EPT Table level numbers. - * @{ - */ -#define EPT_LEVEL_PML4E 0x00000003 -#define EPT_LEVEL_PDPTE 0x00000002 -#define EPT_LEVEL_PDE 0x00000001 -#define EPT_LEVEL_PTE 0x00000000 - /** - * @} - */ - - /** - * @defgroup ept_entry_count \ - * EPT Entry counts - * - * EPT Entry counts. - * @{ - */ -#define EPT_PML4E_ENTRY_COUNT 0x00000200 -#define EPT_PDPTE_ENTRY_COUNT 0x00000200 -#define EPT_PDE_ENTRY_COUNT 0x00000200 -#define EPT_PTE_ENTRY_COUNT 0x00000200 - /** - * @} - */ - - /** - * @} - */ - -typedef enum -{ - /** - * If the INVEPT type is 1, the logical processor invalidates all guest-physical mappings and combined mappings associated - * with the EP4TA specified in the INVEPT descriptor. Combined mappings for that EP4TA are invalidated for all VPIDs and - * all PCIDs. (The instruction may invalidate mappings associated with other EP4TAs.) - */ - invept_single_context = 0x00000001, - - /** - * If the INVEPT type is 2, the logical processor invalidates guest-physical mappings and combined mappings associated with - * all EP4TAs (and, for combined mappings, for all VPIDs and PCIDs). - */ - invept_all_context = 0x00000002, -} invept_type; - -typedef enum -{ - /** - * If the INVVPID type is 0, the logical processor invalidates linear mappings and combined mappings associated with the - * VPID specified in the INVVPID descriptor and that would be used to translate the linear address specified in of the - * INVVPID descriptor. Linear mappings and combined mappings for that VPID and linear address are invalidated for all PCIDs - * and, for combined mappings, all EP4TAs. (The instruction may also invalidate mappings associated with other VPIDs and - * for other linear addresses). - */ - invvpid_individual_address = 0x00000000, - - /** - * If the INVVPID type is 1, the logical processor invalidates all linear mappings and combined mappings associated with - * the VPID specified in the INVVPID descriptor. Linear mappings and combined mappings for that VPID are invalidated for - * all PCIDs and, for combined mappings, all EP4TAs. (The instruction may also invalidate mappings associated with other - * VPIDs). - */ - invvpid_single_context = 0x00000001, - - /** - * If the INVVPID type is 2, the logical processor invalidates linear mappings and combined mappings associated with all - * VPIDs except VPID 0000H and with all PCIDs. (The instruction may also invalidate linear mappings with VPID 0000H.) - * Combined mappings are invalidated for all EP4TAs. - */ - invvpid_all_context = 0x00000002, - - /** - * If the INVVPID type is 3, the logical processor invalidates linear mappings and combined mappings associated with the - * VPID specified in the INVVPID descriptor. Linear mappings and combined mappings for that VPID are invalidated for all - * PCIDs and, for combined mappings, all EP4TAs. The logical processor is not required to invalidate information that was - * used for global translations (although it may do so). (The instruction may also invalidate mappings associated with - * other VPIDs). - * - * @see Vol3C[4.10(Caching Translation Information)] - */ - invvpid_single_context_retaining_globals = 0x00000003, -} invvpid_type; - -typedef struct -{ - uint64_t ept_pointer; - - /** - * Must be zero. - */ - uint64_t reserved; -} invept_descriptor; - -typedef struct -{ - uint16_t vpid; - - /** - * Must be zero. - */ - uint16_t reserved1; - - /** - * Must be zero. - */ - uint32_t reserved2; - uint64_t linear_address; -} invvpid_descriptor; - -/** - * @brief Format of the VMCS Region - * - * A logical processor uses virtual-machine control data structures (VMCSs) while it is in VMX operation. These manage - * transitions into and out of VMX non-root operation (VM entries and VM exits) as well as processor behavior in VMX - * non-root operation. This structure is manipulated by the new instructions VMCLEAR, VMPTRLD, VMREAD, and VMWRITE. - * A VMCS region comprises up to 4-KBytes. The exact size is implementation specific and can be determined by consulting - * the VMX capability MSR IA32_VMX_BASIC. - * - * @see Vol3C[24.2(FORMAT OF THE VMCS REGION)] (reference) - */ -typedef struct -{ - struct - { - /** - * @brief VMCS revision identifier - * - * [Bits 30:0] Processors that maintain VMCS data in different formats (see below) use different VMCS revision identifiers. - * These identifiers enable software to avoid using a VMCS region formatted for one processor on a processor that uses a - * different format. - * Software should write the VMCS revision identifier to the VMCS region before using that region for a VMCS. The VMCS - * revision identifier is never written by the processor; VMPTRLD fails if its operand references a VMCS region whose VMCS - * revision identifier differs from that used by the processor. - * Software can discover the VMCS revision identifier that a processor uses by reading the VMX capability MSR - * IA32_VMX_BASIC. - * - * @see Vol3C[24.6.2(Processor-Based VM-Execution Controls)] - * @see Vol3D[A.1(BASIC VMX INFORMATION)] - */ - uint32_t revision_id : 31; - - /** - * @brief Shadow-VMCS indicator - * - * [Bit 31] Software should clear or set the shadow-VMCS indicator depending on whether the VMCS is to be an ordinary VMCS - * or a shadow VMCS. VMPTRLD fails if the shadow-VMCS indicator is set and the processor does not support the 1-setting of - * the "VMCS shadowing" VM-execution control. Software can discover support for this setting by reading the VMX capability - * MSR IA32_VMX_PROCBASED_CTLS2. - * - * @see Vol3C[24.10(VMCS TYPES ORDINARY AND SHADOW)] - */ - uint32_t shadow_vmcs_indicator : 1; - }; - - - /** - * @brief VMX-abort indicator - * - * The contents of these bits do not control processor operation in any way. A logical processor writes a non-zero value - * into these bits if a VMX abort occurs. Software may also write into this field. - * - * @see Vol3D[27.7(VMX Aborts)] - */ - uint32_t abort_indicator; - - /** - * @brief VMCS data (implementation-specific format) - * - * These parts of the VMCS control VMX non-root operation and the VMX transitions. - * The format of these data is implementation-specific. To ensure proper behavior in VMX operation, software should - * maintain the VMCS region and related structures in writeback cacheable memory. Future implementations may allow or - * require a different memory type. Software should consult the VMX capability MSR IA32_VMX_BASIC. - * - * @see Vol3C[24.11.4(Software Access to Related Structures)] - * @see Vol3D[A.1(BASIC VMX INFORMATION)] - */ - uint8_t data[4088]; -} vmcs; - -/** - * @brief Format of the VMXON Region - * - * Before executing VMXON, software allocates a region of memory that the logical processor uses to support VMX operation. - * This region is called the VMXON region. - * A VMXON region comprises up to 4-KBytes. The exact size is implementation specific and can be determined by consulting - * the VMX capability MSR IA32_VMX_BASIC. - * - * @see Vol3C[24.11.5(VMXON Region)] (reference) - */ -typedef struct -{ - struct - { - /** - * @brief VMCS revision identifier - * - * [Bits 30:0] Before executing VMXON, software should write the VMCS revision identifier to the VMXON region. - * (Specifically, it should write the 31-bit VMCS revision identifier to bits 30:0 of the first 4 bytes of the VMXON - * region; bit 31 should be cleared to 0.) - * - * @see VMCS - * @see Vol3C[24.2(FORMAT OF THE VMCS REGION)] - * @see Vol3C[24.11.5(VMXON Region)] - */ - uint32_t revision_id : 31; - - /** - * [Bit 31] Bit 31 is always 0. - */ - uint32_t must_be_zero : 1; - }; - - - /** - * @brief VMXON data (implementation-specific format) - * - * The format of these data is implementation-specific. To ensure proper behavior in VMX operation, software should not - * access or modify the VMXON region of a logical processor between execution of VMXON and VMXOFF on that logical - * processor. Doing otherwise may lead to unpredictable behavior. - * - * @see Vol3C[24.11.4(Software Access to Related Structures)] - * @see Vol3D[A.1(BASIC VMX INFORMATION)] - */ - uint8_t data[4092]; -} vmxon; - -/** - * @defgroup vmcs_fields \ - * VMCS (VM Control Structure) - * - * Every component of the VMCS is encoded by a 32-bit field that can be used by VMREAD and VMWRITE. This enumerates all - * fields in the VMCS and their encodings. Fields are grouped by width (16-bit, 32-bit, etc.) and type (guest-state, - * host-state, etc.). - * - * @see Vol3D[B(APPENDIX B FIELD ENCODING IN VMCS)] (reference) - * @{ - */ -typedef union -{ - struct - { - /** - * [Bit 0] Access type (0 = full; 1 = high); must be full for 16-bit, 32-bit, and natural-width fields. - */ - uint16_t access_type : 1; -#define VMCS_COMPONENT_ENCODING_ACCESS_TYPE_BIT 0 -#define VMCS_COMPONENT_ENCODING_ACCESS_TYPE_FLAG 0x01 -#define VMCS_COMPONENT_ENCODING_ACCESS_TYPE_MASK 0x01 -#define VMCS_COMPONENT_ENCODING_ACCESS_TYPE(_) (((_) >> 0) & 0x01) - - /** - * [Bits 9:1] Index. - */ - uint16_t index : 9; -#define VMCS_COMPONENT_ENCODING_INDEX_BIT 1 -#define VMCS_COMPONENT_ENCODING_INDEX_FLAG 0x3FE -#define VMCS_COMPONENT_ENCODING_INDEX_MASK 0x1FF -#define VMCS_COMPONENT_ENCODING_INDEX(_) (((_) >> 1) & 0x1FF) - - /** - * [Bits 11:10] Type: - * 0: control - * 1: VM-exit information - * 2: guest state - * 3: host state - */ - uint16_t type : 2; -#define VMCS_COMPONENT_ENCODING_TYPE_BIT 10 -#define VMCS_COMPONENT_ENCODING_TYPE_FLAG 0xC00 -#define VMCS_COMPONENT_ENCODING_TYPE_MASK 0x03 -#define VMCS_COMPONENT_ENCODING_TYPE(_) (((_) >> 10) & 0x03) - - /** - * [Bit 12] Reserved (must be 0). - */ - uint16_t must_be_zero : 1; -#define VMCS_COMPONENT_ENCODING_MUST_BE_ZERO_BIT 12 -#define VMCS_COMPONENT_ENCODING_MUST_BE_ZERO_FLAG 0x1000 -#define VMCS_COMPONENT_ENCODING_MUST_BE_ZERO_MASK 0x01 -#define VMCS_COMPONENT_ENCODING_MUST_BE_ZERO(_) (((_) >> 12) & 0x01) - - /** - * [Bits 14:13] Width: - * 0: 16-bit - * 1: 64-bit - * 2: 32-bit - * 3: natural-width - */ - uint16_t width : 2; -#define VMCS_COMPONENT_ENCODING_WIDTH_BIT 13 -#define VMCS_COMPONENT_ENCODING_WIDTH_FLAG 0x6000 -#define VMCS_COMPONENT_ENCODING_WIDTH_MASK 0x03 -#define VMCS_COMPONENT_ENCODING_WIDTH(_) (((_) >> 13) & 0x03) - uint16_t reserved1 : 1; - }; - - uint16_t flags; -} vmcs_component_encoding; - -/** - * @defgroup vmcs_16_bit \ - * 16-Bit Fields - * - * 16-Bit Fields. - * - * @see Vol3D[B.1(16-BIT FIELDS)] (reference) - * @{ - */ - /** - * @defgroup vmcs_16_bit_control_fields \ - * 16-Bit Control Fields - * - * 16-Bit Control Fields. - * @{ - */ - /** - * Virtual-processor identifier (VPID). - * - * @remarks This field exists only on processors that support the 1-setting of the "enable VPID" VM-execution control. - */ -#define VMCS_CTRL_VIRTUAL_PROCESSOR_IDENTIFIER 0x00000000 - - /** - * Posted-interrupt notification vector. - * - * @remarks This field exists only on processors that support the 1-setting of the "process posted interrupts" VM-execution - * control. - */ -#define VMCS_CTRL_POSTED_INTERRUPT_NOTIFICATION_VECTOR 0x00000002 - - /** - * EPTP index. - * - * @remarks This field exists only on processors that support the 1-setting of the "EPT-violation \#VE" VM-execution - * control. - */ -#define VMCS_CTRL_EPTP_INDEX 0x00000004 - /** - * @} - */ - - /** - * @defgroup vmcs_16_bit_guest_state_fields \ - * 16-Bit Guest-State Fields - * - * 16-Bit Guest-State Fields. - * @{ - */ - /** - * Guest ES selector. - */ -#define VMCS_GUEST_ES_SELECTOR 0x00000800 - - /** - * Guest CS selector. - */ -#define VMCS_GUEST_CS_SELECTOR 0x00000802 - - /** - * Guest SS selector. - */ -#define VMCS_GUEST_SS_SELECTOR 0x00000804 - - /** - * Guest DS selector. - */ -#define VMCS_GUEST_DS_SELECTOR 0x00000806 - - /** - * Guest FS selector. - */ -#define VMCS_GUEST_FS_SELECTOR 0x00000808 - - /** - * Guest GS selector. - */ -#define VMCS_GUEST_GS_SELECTOR 0x0000080A - - /** - * Guest LDTR selector. - */ -#define VMCS_GUEST_LDTR_SELECTOR 0x0000080C - - /** - * Guest TR selector. - */ -#define VMCS_GUEST_TR_SELECTOR 0x0000080E - - /** - * Guest interrupt status. - * - * @remarks This field exists only on processors that support the 1-setting of the "virtual-interrupt delivery" - * VM-execution control. - */ -#define VMCS_GUEST_INTERRUPT_STATUS 0x00000810 - - /** - * PML index. - * - * @remarks This field exists only on processors that support the 1-setting of the "enable PML" VM-execution control. - */ -#define VMCS_GUEST_PML_INDEX 0x00000812 - /** - * @} - */ - - /** - * @defgroup vmcs_16_bit_host_state_fields \ - * 16-Bit Host-State Fields - * - * 16-Bit Host-State Fields. - * @{ - */ - /** - * Host ES selector. - */ -#define VMCS_HOST_ES_SELECTOR 0x00000C00 - - /** - * Host CS selector. - */ -#define VMCS_HOST_CS_SELECTOR 0x00000C02 - - /** - * Host SS selector. - */ -#define VMCS_HOST_SS_SELECTOR 0x00000C04 - - /** - * Host DS selector. - */ -#define VMCS_HOST_DS_SELECTOR 0x00000C06 - - /** - * Host FS selector. - */ -#define VMCS_HOST_FS_SELECTOR 0x00000C08 - - /** - * Host GS selector. - */ -#define VMCS_HOST_GS_SELECTOR 0x00000C0A - - /** - * Host TR selector. - */ -#define VMCS_HOST_TR_SELECTOR 0x00000C0C - /** - * @} - */ - - /** - * @} - */ - - /** - * @defgroup vmcs_64_bit \ - * 64-Bit Fields - * - * 64-Bit Fields. - * - * @see Vol3D[B.2(64-BIT FIELDS)] (reference) - * @{ - */ - /** - * @defgroup vmcs_64_bit_control_fields \ - * 64-Bit Control Fields - * - * 64-Bit Control Fields. - * @{ - */ - /** - * Address of I/O bitmap A. - */ -#define VMCS_CTRL_IO_BITMAP_A_ADDRESS 0x00002000 - - /** - * Address of I/O bitmap B. - */ -#define VMCS_CTRL_IO_BITMAP_B_ADDRESS 0x00002002 - - /** - * Address of MSR bitmaps. - */ -#define VMCS_CTRL_MSR_BITMAP_ADDRESS 0x00002004 - - /** - * VM-exit MSR-store address. - */ -#define VMCS_CTRL_VMEXIT_MSR_STORE_ADDRESS 0x00002006 - - /** - * VM-exit MSR-load address. - */ -#define VMCS_CTRL_VMEXIT_MSR_LOAD_ADDRESS 0x00002008 - - /** - * VM-entry MSR-load address. - */ -#define VMCS_CTRL_VMENTRY_MSR_LOAD_ADDRESS 0x0000200A - - /** - * Executive-VMCS pointer. - */ -#define VMCS_CTRL_EXECUTIVE_VMCS_POINTER 0x0000200C - - /** - * PML address. - */ -#define VMCS_CTRL_PML_ADDRESS 0x0000200E - - /** - * TSC offset. - */ -#define VMCS_CTRL_TSC_OFFSET 0x00002010 - - /** - * Virtual-APIC address. - */ -#define VMCS_CTRL_VIRTUAL_APIC_ADDRESS 0x00002012 - - /** - * APIC-access address. - */ -#define VMCS_CTRL_APIC_ACCESS_ADDRESS 0x00002014 - - /** - * Posted-interrupt descriptor address - */ -#define VMCS_CTRL_POSTED_INTERRUPT_DESCRIPTOR_ADDRESS 0x00002016 - - /** - * VM-function controls. - */ -#define VMCS_CTRL_VMFUNC_CONTROLS 0x00002018 - - /** - * EPT pointer. - */ -#define VMCS_CTRL_EPT_POINTER 0x0000201A - - /** - * EOI-exit bitmap 0. - */ -#define VMCS_CTRL_EOI_EXIT_BITMAP_0 0x0000201C - - /** - * EOI-exit bitmap 1. - */ -#define VMCS_CTRL_EOI_EXIT_BITMAP_1 0x0000201E - - /** - * EOI-exit bitmap 2. - */ -#define VMCS_CTRL_EOI_EXIT_BITMAP_2 0x00002020 - - /** - * EOI-exit bitmap 3. - */ -#define VMCS_CTRL_EOI_EXIT_BITMAP_3 0x00002022 - - /** - * EPTP-list address. - */ -#define VMCS_CTRL_EPT_POINTER_LIST_ADDRESS 0x00002024 - - /** - * VMREAD-bitmap address. - */ -#define VMCS_CTRL_VMREAD_BITMAP_ADDRESS 0x00002026 - - /** - * VMWRITE-bitmap address. - */ -#define VMCS_CTRL_VMWRITE_BITMAP_ADDRESS 0x00002028 - - /** - * Virtualization-exception information address. - */ -#define VMCS_CTRL_VIRTUALIZATION_EXCEPTION_INFORMATION_ADDRESS 0x0000202A - - /** - * XSS-exiting bitmap. - */ -#define VMCS_CTRL_XSS_EXITING_BITMAP 0x0000202C - - /** - * ENCLS-exiting bitmap. - */ -#define VMCS_CTRL_ENCLS_EXITING_BITMAP 0x0000202E - - /** - * TSC multiplier. - */ -#define VMCS_CTRL_TSC_MULTIPLIER 0x00002032 - /** - * @} - */ - - /** - * @defgroup vmcs_64_bit_read_only_data_fields \ - * 64-Bit Read-Only Data Field - * - * 64-Bit Read-Only Data Field. - * @{ - */ - /** - * Guest-physical address. - */ -#define VMCS_GUEST_PHYSICAL_ADDRESS 0x00002400 - /** - * @} - */ - - /** - * @defgroup vmcs_64_bit_guest_state_fields \ - * 64-Bit Guest-State Fields - * - * 64-Bit Guest-State Fields. - * @{ - */ - /** - * VMCS link pointer. - */ -#define VMCS_GUEST_VMCS_LINK_POINTER 0x00002800 - - /** - * Guest IA32_DEBUGCTL. - */ -#define VMCS_GUEST_DEBUGCTL 0x00002802 - - /** - * Guest IA32_PAT. - */ -#define VMCS_GUEST_PAT 0x00002804 - - /** - * Guest IA32_EFER. - */ -#define VMCS_GUEST_EFER 0x00002806 - - /** - * Guest IA32_PERF_GLOBAL_CTRL. - */ -#define VMCS_GUEST_PERF_GLOBAL_CTRL 0x00002808 - - /** - * Guest PDPTE0. - */ -#define VMCS_GUEST_PDPTE0 0x0000280A - - /** - * Guest PDPTE1. - */ -#define VMCS_GUEST_PDPTE1 0x0000280C - - /** - * Guest PDPTE2. - */ -#define VMCS_GUEST_PDPTE2 0x0000280E - - /** - * Guest PDPTE3. - */ -#define VMCS_GUEST_PDPTE3 0x00002810 - - /** - * Guest IA32_BNDCFGS. - */ -#define VMCS_GUEST_BNDCFGS 0x00002812 - - /** - * Guest IA32_RTIT_CTL. - */ -#define VMCS_GUEST_RTIT_CTL 0x00002814 - /** - * @} - */ - - /** - * @defgroup vmcs_64_bit_host_state_fields \ - * 64-Bit Host-State Fields - * - * 64-Bit Host-State Fields. - * @{ - */ - /** - * Host IA32_PAT. - */ -#define VMCS_HOST_PAT 0x00002C00 - - /** - * Host IA32_EFER. - */ -#define VMCS_HOST_EFER 0x00002C02 - - /** - * Host IA32_PERF_GLOBAL_CTRL. - */ -#define VMCS_HOST_PERF_GLOBAL_CTRL 0x00002C04 - /** - * @} - */ - - /** - * @} - */ - - /** - * @defgroup vmcs_32_bit \ - * 32-Bit Fields - * - * 32-Bit Fields. - * - * @see Vol3D[B.3(32-BIT FIELDS)] (reference) - * @{ - */ - /** - * @defgroup vmcs_32_bit_control_fields \ - * 32-Bit Control Fields - * - * 32-Bit Control Fields. - * @{ - */ - /** - * Pin-based VM-execution controls. - */ -#define VMCS_CTRL_PIN_BASED_VM_EXECUTION_CONTROLS 0x00004000 - - /** - * Primary processor-based VM-execution controls. - */ -#define VMCS_CTRL_PROCESSOR_BASED_VM_EXECUTION_CONTROLS 0x00004002 - - /** - * Exception bitmap. - */ -#define VMCS_CTRL_EXCEPTION_BITMAP 0x00004004 - - /** - * Page-fault error-code mask. - */ -#define VMCS_CTRL_PAGEFAULT_ERROR_CODE_MASK 0x00004006 - - /** - * Page-fault error-code match. - */ -#define VMCS_CTRL_PAGEFAULT_ERROR_CODE_MATCH 0x00004008 - - /** - * CR3-target count. - */ -#define VMCS_CTRL_CR3_TARGET_COUNT 0x0000400A - - /** - * VM-exit controls. - */ -#define VMCS_CTRL_VMEXIT_CONTROLS 0x0000400C - - /** - * VM-exit MSR-store count. - */ -#define VMCS_CTRL_VMEXIT_MSR_STORE_COUNT 0x0000400E - - /** - * VM-exit MSR-load count. - */ -#define VMCS_CTRL_VMEXIT_MSR_LOAD_COUNT 0x00004010 - - /** - * VM-entry controls. - */ -#define VMCS_CTRL_VMENTRY_CONTROLS 0x00004012 - - /** - * VM-entry MSR-load count. - */ -#define VMCS_CTRL_VMENTRY_MSR_LOAD_COUNT 0x00004014 - - /** - * VM-entry interruption-information field. - */ -#define VMCS_CTRL_VMENTRY_INTERRUPTION_INFORMATION_FIELD 0x00004016 - - /** - * VM-entry exception error code. - */ -#define VMCS_CTRL_VMENTRY_EXCEPTION_ERROR_CODE 0x00004018 - - /** - * VM-entry instruction length. - */ -#define VMCS_CTRL_VMENTRY_INSTRUCTION_LENGTH 0x0000401A - - /** - * TPR threshold. - */ -#define VMCS_CTRL_TPR_THRESHOLD 0x0000401C - - /** - * Secondary processor-based VM-execution controls. - */ -#define VMCS_CTRL_SECONDARY_PROCESSOR_BASED_VM_EXECUTION_CONTROLS 0x0000401E - - /** - * PLE_Gap. - */ -#define VMCS_CTRL_PLE_GAP 0x00004020 - - /** - * PLE_Window. - */ -#define VMCS_CTRL_PLE_WINDOW 0x00004022 - /** - * @} - */ - - /** - * @defgroup vmcs_32_bit_read_only_data_fields \ - * 32-Bit Read-Only Data Fields - * - * 32-Bit Read-Only Data Fields. - * @{ - */ - /** - * VM-instruction error. - */ -#define VMCS_VM_INSTRUCTION_ERROR 0x00004400 - - /** - * Exit reason. - */ -#define VMCS_EXIT_REASON 0x00004402 - - /** - * VM-exit interruption information. - */ -#define VMCS_VMEXIT_INTERRUPTION_INFORMATION 0x00004404 - - /** - * VM-exit interruption error code. - */ -#define VMCS_VMEXIT_INTERRUPTION_ERROR_CODE 0x00004406 - - /** - * IDT-vectoring information field. - */ -#define VMCS_IDT_VECTORING_INFORMATION 0x00004408 - - /** - * IDT-vectoring error code. - */ -#define VMCS_IDT_VECTORING_ERROR_CODE 0x0000440A - - /** - * VM-exit instruction length. - */ -#define VMCS_VMEXIT_INSTRUCTION_LENGTH 0x0000440C - - /** - * VM-exit instruction information. - */ -#define VMCS_VMEXIT_INSTRUCTION_INFO 0x0000440E - /** - * @} - */ - - /** - * @defgroup vmcs_32_bit_guest_state_fields \ - * 32-Bit Guest-State Fields - * - * 32-Bit Guest-State Fields. - * @{ - */ - /** - * Guest ES limit. - */ -#define VMCS_GUEST_ES_LIMIT 0x00004800 - - /** - * Guest CS limit. - */ -#define VMCS_GUEST_CS_LIMIT 0x00004802 - - /** - * Guest SS limit. - */ -#define VMCS_GUEST_SS_LIMIT 0x00004804 - - /** - * Guest DS limit. - */ -#define VMCS_GUEST_DS_LIMIT 0x00004806 - - /** - * Guest FS limit. - */ -#define VMCS_GUEST_FS_LIMIT 0x00004808 - - /** - * Guest GS limit. - */ -#define VMCS_GUEST_GS_LIMIT 0x0000480A - - /** - * Guest LDTR limit. - */ -#define VMCS_GUEST_LDTR_LIMIT 0x0000480C - - /** - * Guest TR limit. - */ -#define VMCS_GUEST_TR_LIMIT 0x0000480E - - /** - * Guest GDTR limit. - */ -#define VMCS_GUEST_GDTR_LIMIT 0x00004810 - - /** - * Guest IDTR limit. - */ -#define VMCS_GUEST_IDTR_LIMIT 0x00004812 - - /** - * Guest ES access rights. - */ -#define VMCS_GUEST_ES_ACCESS_RIGHTS 0x00004814 - - /** - * Guest CS access rights. - */ -#define VMCS_GUEST_CS_ACCESS_RIGHTS 0x00004816 - - /** - * Guest SS access rights. - */ -#define VMCS_GUEST_SS_ACCESS_RIGHTS 0x00004818 - - /** - * Guest DS access rights. - */ -#define VMCS_GUEST_DS_ACCESS_RIGHTS 0x0000481A - - /** - * Guest FS access rights. - */ -#define VMCS_GUEST_FS_ACCESS_RIGHTS 0x0000481C - - /** - * Guest GS access rights. - */ -#define VMCS_GUEST_GS_ACCESS_RIGHTS 0x0000481E - - /** - * Guest LDTR access rights. - */ -#define VMCS_GUEST_LDTR_ACCESS_RIGHTS 0x00004820 - - /** - * Guest TR access rights. - */ -#define VMCS_GUEST_TR_ACCESS_RIGHTS 0x00004822 - - /** - * Guest interruptibility state. - */ -#define VMCS_GUEST_INTERRUPTIBILITY_STATE 0x00004824 - - /** - * Guest activity state. - */ -#define VMCS_GUEST_ACTIVITY_STATE 0x00004826 - - /** - * Guest SMBASE. - */ -#define VMCS_GUEST_SMBASE 0x00004828 - - /** - * Guest IA32_SYSENTER_CS. - */ -#define VMCS_GUEST_SYSENTER_CS 0x0000482A - - /** - * VMX-preemption timer value. - */ -#define VMCS_GUEST_VMX_PREEMPTION_TIMER_VALUE 0x0000482E - /** - * @} - */ - - /** - * @defgroup vmcs_32_bit_host_state_fields \ - * 32-Bit Host-State Field - * - * 32-Bit Host-State Field. - * @{ - */ - /** - * Host IA32_SYSENTER_CS. - */ -#define VMCS_HOST_SYSENTER_CS 0x00004C00 - /** - * @} - */ - - /** - * @} - */ - - /** - * @defgroup vmcs_natural_width \ - * Natural-Width Fields - * - * Natural-Width Fields. - * - * @see Vol3D[B.4(NATURAL-WIDTH FIELDS)] (reference) - * @{ - */ - /** - * @defgroup vmcs_natural_width_control_fields \ - * Natural-Width Control Fields - * - * Natural-Width Control Fields - * @{ - */ - /** - * CR0 guest/host mask. - */ -#define VMCS_CTRL_CR0_GUEST_HOST_MASK 0x00006000 - - /** - * CR4 guest/host mask. - */ -#define VMCS_CTRL_CR4_GUEST_HOST_MASK 0x00006002 - - /** - * CR0 read shadow. - */ -#define VMCS_CTRL_CR0_READ_SHADOW 0x00006004 - - /** - * CR4 read shadow. - */ -#define VMCS_CTRL_CR4_READ_SHADOW 0x00006006 - - /** - * CR3-target value 0. - */ -#define VMCS_CTRL_CR3_TARGET_VALUE_0 0x00006008 - - /** - * CR3-target value 1. - */ -#define VMCS_CTRL_CR3_TARGET_VALUE_1 0x0000600A - - /** - * CR3-target value 2. - */ -#define VMCS_CTRL_CR3_TARGET_VALUE_2 0x0000600C - - /** - * CR3-target value 3. - */ -#define VMCS_CTRL_CR3_TARGET_VALUE_3 0x0000600E - /** - * @} - */ - - /** - * @defgroup vmcs_natural_width_read_only_data_fields \ - * Natural-Width Read-Only Data Fields - * - * Natural-Width Read-Only Data Fields. - * @{ - */ - /** - * Exit qualification. - */ -#define VMCS_EXIT_QUALIFICATION 0x00006400 - - /** - * I/O RCX. - */ -#define VMCS_IO_RCX 0x00006402 - - /** - * I/O RSI. - */ -#define VMCS_IO_RSX 0x00006404 - - /** - * I/O RDI. - */ -#define VMCS_IO_RDI 0x00006406 - - /** - * I/O RIP. - */ -#define VMCS_IO_RIP 0x00006408 - - /** - * Guest-linear address. - */ -#define VMCS_EXIT_GUEST_LINEAR_ADDRESS 0x0000640A - /** - * @} - */ - - /** - * @defgroup vmcs_natural_width_guest_state_fields \ - * Natural-Width Guest-State Fields - * - * Natural-Width Guest-State Fields. - * @{ - */ - /** - * Guest CR0. - */ -#define VMCS_GUEST_CR0 0x00006800 - - /** - * Guest CR3. - */ -#define VMCS_GUEST_CR3 0x00006802 - - /** - * Guest CR4. - */ -#define VMCS_GUEST_CR4 0x00006804 - - /** - * Guest ES base. - */ -#define VMCS_GUEST_ES_BASE 0x00006806 - - /** - * Guest CS base. - */ -#define VMCS_GUEST_CS_BASE 0x00006808 - - /** - * Guest SS base. - */ -#define VMCS_GUEST_SS_BASE 0x0000680A - - /** - * Guest DS base. - */ -#define VMCS_GUEST_DS_BASE 0x0000680C - - /** - * Guest FS base. - */ -#define VMCS_GUEST_FS_BASE 0x0000680E - - /** - * Guest GS base. - */ -#define VMCS_GUEST_GS_BASE 0x00006810 - - /** - * Guest LDTR base. - */ -#define VMCS_GUEST_LDTR_BASE 0x00006812 - - /** - * Guest TR base. - */ -#define VMCS_GUEST_TR_BASE 0x00006814 - - /** - * Guest GDTR base. - */ -#define VMCS_GUEST_GDTR_BASE 0x00006816 - - /** - * Guest IDTR base. - */ -#define VMCS_GUEST_IDTR_BASE 0x00006818 - - /** - * Guest DR7. - */ -#define VMCS_GUEST_DR7 0x0000681A - - /** - * Guest RSP. - */ -#define VMCS_GUEST_RSP 0x0000681C - - /** - * Guest RIP. - */ -#define VMCS_GUEST_RIP 0x0000681E - - /** - * Guest RFLAGS. - */ -#define VMCS_GUEST_RFLAGS 0x00006820 - - /** - * Guest pending debug exceptions. - */ -#define VMCS_GUEST_PENDING_DEBUG_EXCEPTIONS 0x00006822 - - /** - * Guest IA32_SYSENTER_ESP. - */ -#define VMCS_GUEST_SYSENTER_ESP 0x00006824 - - /** - * Guest IA32_SYSENTER_EIP. - */ -#define VMCS_GUEST_SYSENTER_EIP 0x00006826 - - /** - * Guest IA32_S_CET. - */ -#define VMCS_GUEST_S_CET 0x00006C28 - - /** - * Guest SSP. - */ -#define VMCS_GUEST_SSP 0x00006C2A - - /** - * Guest IA32_INTERRUPT_SSP_TABLE_ADDR. - */ -#define VMCS_GUEST_INTERRUPT_SSP_TABLE_ADDR 0x00006C2C - /** - * @} - */ - - /** - * @defgroup vmcs_natural_width_host_state_fields \ - * Natural-Width Host-State Fields - * - * Natural-Width Host-State Fields. - * @{ - */ - /** - * Host CR0. - */ -#define VMCS_HOST_CR0 0x00006C00 - - /** - * Host CR3. - */ -#define VMCS_HOST_CR3 0x00006C02 - - /** - * Host CR4. - */ -#define VMCS_HOST_CR4 0x00006C04 - - /** - * Host FS base. - */ -#define VMCS_HOST_FS_BASE 0x00006C06 - - /** - * Host GS base. - */ -#define VMCS_HOST_GS_BASE 0x00006C08 - - /** - * Host TR base. - */ -#define VMCS_HOST_TR_BASE 0x00006C0A - - /** - * Host GDTR base. - */ -#define VMCS_HOST_GDTR_BASE 0x00006C0C - - /** - * Host IDTR base. - */ -#define VMCS_HOST_IDTR_BASE 0x00006C0E - - /** - * Host IA32_SYSENTER_ESP. - */ -#define VMCS_HOST_SYSENTER_ESP 0x00006C10 - - /** - * Host IA32_SYSENTER_EIP. - */ -#define VMCS_HOST_SYSENTER_EIP 0x00006C12 - - /** - * Host RSP. - */ -#define VMCS_HOST_RSP 0x00006C14 - - /** - * Host RIP. - */ -#define VMCS_HOST_RIP 0x00006C16 - - /** - * Host IA32_S_CET. - */ -#define VMCS_HOST_S_CET 0x00006C18 - - /** - * Host SSP. - */ -#define VMCS_HOST_SSP 0x00006C1A - - /** - * Host IA32_INTERRUPT_SSP_TABLE_ADDR. - */ -#define VMCS_HOST_INTERRUPT_SSP_TABLE_ADDR 0x00006C1C - /** - * @} - */ - - /** - * @} - */ - - /** - * @} - */ - - /** - * @brief Valid interruption types - */ -typedef enum -{ - /** - * External interrupt. - */ - external_interrupt = 0x00000000, - - /** - * Non-maskable interrupt (NMI). - */ - non_maskable_interrupt = 0x00000002, - - /** - * Hardware exception (e.g,. \#PF). - */ - hardware_exception = 0x00000003, - - /** - * Software interrupt (INT n). - */ - software_interrupt = 0x00000004, - - /** - * Privileged software exception (INT1). - */ - privileged_software_exception = 0x00000005, - - /** - * Software exception (INT3 or INTO). - */ - software_exception = 0x00000006, - - /** - * Other event. This type is used for injection of events that are not delivered through the IDT. - */ - other_event = 0x00000007, -} interruption_type; - -/** - * @brief VM entry can be configured to conclude by delivering an event through the IDT (after all guest state and MSRs - * have been loaded). This process is called event injection and is controlled by these VM-entry control fields - * - * @see Vol3A[24.8.3(VM-Entry Controls for Event Injection)] (reference) - */ -typedef union -{ - struct - { - /** - * @brief Vector of interrupt or exception - * - * [Bits 7:0] Determines which entry in the IDT is used or which other event is injected. - */ - uint32_t vector : 8; -#define VMENTRY_INTERRUPT_INFORMATION_VECTOR_BIT 0 -#define VMENTRY_INTERRUPT_INFORMATION_VECTOR_FLAG 0xFF -#define VMENTRY_INTERRUPT_INFORMATION_VECTOR_MASK 0xFF -#define VMENTRY_INTERRUPT_INFORMATION_VECTOR(_) (((_) >> 0) & 0xFF) - - /** - * @brief Interruption type - * - * [Bits 10:8] Determines details of how the injection is performed. - */ - uint32_t interruption_type : 3; -#define VMENTRY_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_BIT 8 -#define VMENTRY_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_FLAG 0x700 -#define VMENTRY_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_MASK 0x07 -#define VMENTRY_INTERRUPT_INFORMATION_INTERRUPTION_TYPE(_) (((_) >> 8) & 0x07) - - /** - * @brief Deliver error code (0 = do not deliver; 1 = deliver) - * - * [Bit 11] Determines whether delivery pushes an error code on the guest stack. - */ - uint32_t deliver_error_code : 1; -#define VMENTRY_INTERRUPT_INFORMATION_DELIVER_ERROR_CODE_BIT 11 -#define VMENTRY_INTERRUPT_INFORMATION_DELIVER_ERROR_CODE_FLAG 0x800 -#define VMENTRY_INTERRUPT_INFORMATION_DELIVER_ERROR_CODE_MASK 0x01 -#define VMENTRY_INTERRUPT_INFORMATION_DELIVER_ERROR_CODE(_) (((_) >> 11) & 0x01) - uint32_t reserved1 : 19; - - /** - * @brief Valid - * - * [Bit 31] VM entry injects an event if and only if the valid bit is 1. The valid bit in this field is cleared on every VM - * exit. - */ - uint32_t valid : 1; -#define VMENTRY_INTERRUPT_INFORMATION_VALID_BIT 31 -#define VMENTRY_INTERRUPT_INFORMATION_VALID_FLAG 0x80000000 -#define VMENTRY_INTERRUPT_INFORMATION_VALID_MASK 0x01 -#define VMENTRY_INTERRUPT_INFORMATION_VALID(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; -} vmentry_interrupt_information; - -/** - * @brief VM entry can be configured to conclude by delivering an event through the IDT (after all guest state and MSRs - * have been loaded). This process is called event injection and is controlled by these VM-entry control fields - * - * @see Vol3A[24.9.2(Information for VM Exits Due to Vectored Events)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bits 7:0] Vector of interrupt or exception. - */ - uint32_t vector : 8; -#define VMEXIT_INTERRUPT_INFORMATION_VECTOR_BIT 0 -#define VMEXIT_INTERRUPT_INFORMATION_VECTOR_FLAG 0xFF -#define VMEXIT_INTERRUPT_INFORMATION_VECTOR_MASK 0xFF -#define VMEXIT_INTERRUPT_INFORMATION_VECTOR(_) (((_) >> 0) & 0xFF) - - /** - * [Bits 10:8] Interruption type. - */ - uint32_t interruption_type : 3; -#define VMEXIT_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_BIT 8 -#define VMEXIT_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_FLAG 0x700 -#define VMEXIT_INTERRUPT_INFORMATION_INTERRUPTION_TYPE_MASK 0x07 -#define VMEXIT_INTERRUPT_INFORMATION_INTERRUPTION_TYPE(_) (((_) >> 8) & 0x07) - - /** - * [Bit 11] Deliver error code (0 = do not deliver; 1 = deliver). - */ - uint32_t error_code_valid : 1; -#define VMEXIT_INTERRUPT_INFORMATION_ERROR_CODE_VALID_BIT 11 -#define VMEXIT_INTERRUPT_INFORMATION_ERROR_CODE_VALID_FLAG 0x800 -#define VMEXIT_INTERRUPT_INFORMATION_ERROR_CODE_VALID_MASK 0x01 -#define VMEXIT_INTERRUPT_INFORMATION_ERROR_CODE_VALID(_) (((_) >> 11) & 0x01) - - /** - * [Bit 12] NMI unblocking due to IRET. - */ - uint32_t nmi_unblocking : 1; -#define VMEXIT_INTERRUPT_INFORMATION_NMI_UNBLOCKING_BIT 12 -#define VMEXIT_INTERRUPT_INFORMATION_NMI_UNBLOCKING_FLAG 0x1000 -#define VMEXIT_INTERRUPT_INFORMATION_NMI_UNBLOCKING_MASK 0x01 -#define VMEXIT_INTERRUPT_INFORMATION_NMI_UNBLOCKING(_) (((_) >> 12) & 0x01) - uint32_t reserved1 : 18; - - /** - * [Bit 31] Valid. - */ - uint32_t valid : 1; -#define VMEXIT_INTERRUPT_INFORMATION_VALID_BIT 31 -#define VMEXIT_INTERRUPT_INFORMATION_VALID_FLAG 0x80000000 -#define VMEXIT_INTERRUPT_INFORMATION_VALID_MASK 0x01 -#define VMEXIT_INTERRUPT_INFORMATION_VALID(_) (((_) >> 31) & 0x01) - }; - - uint32_t flags; -} vmexit_interrupt_information; - -/** - * @} - */ - - /** - * @defgroup apic \ - * Advanced Programmable Interrupt Controller (APIC) - * - * Software interacts with the local APIC by reading and writing its registers. APIC registers are memory-mapped to a - * 4-KByte region of the processor's physical address space with an initial starting address of FEE00000H. For correct APIC - * operation, this address space must be mapped to an area of memory that has been designated as strong uncacheable (UC). - * - * @remarks Registers are 32 bits, 64 bits, or 256 bits in width; all are aligned on 128-bit boundaries. All 32-bit - * registers should be accessed using 128-bit aligned 32-bit loads or stores. Some processors may support loads and stores - * of less than 32 bits to some of the APIC registers. This is model specific behavior and is not guaranteed to work on all - * processors. Any FP/MMX/SSE access to an APIC register, or any access that touches bytes 4 through 15 of an APIC register - * may cause undefined behavior and must not be executed. This undefined behavior could include hangs, incorrect results or - * unexpected exceptions, including machine checks, and may vary between implementations. Wider registers (64-bit or - * 256-bit) must be accessed using multiple 32-bit loads or stores, with all accesses being 128-bit aligned. - * @see Vol3A[10.4.1(The Local APIC Block Diagram)] (reference) - * @{ - */ - /** - * Local APIC Base Address. - * - * @remarks Reserved. - */ -#define APIC_BASE_ADDRESS 0xFEE00000 - - /** - * Local APIC ID Register. - */ -#define APIC_ID 0x00000020 - - /** - * Local APIC Version Register. - */ -#define APIC_VERSION 0x00000030 - - /** - * Task Priority Register (TPR). - */ -#define APIC_TASK_PRIORITY 0x00000080 - - /** - * Arbitration Priority Register (APR). - */ -#define APIC_ARBITRATION_PRIORITY 0x00000090 - - /** - * Processor Priority Register (PPR). - */ -#define APIC_PROCESSOR_PRIORITY 0x000000A0 - - /** - * EOI Register. - */ -#define APIC_EOI 0x000000B0 - - /** - * Remote Read Register (RRD). - */ -#define APIC_REMOTE_READ 0x000000C0 - - /** - * Logical Destination Register. - */ -#define APIC_LOGICAL_DESTINATION 0x000000D0 - - /** - * Destination Format Register. - * - * @see Vol3A[10.6.2.2(Logical Destination Mode)] - */ -#define APIC_DESTINATION_FORMAT 0x000000E0 - - /** - * Spurious Interrupt Vector Register. - * - * @see Vol3A[10.9(SPURIOUS INTERRUPT)] - */ -#define APIC_SPURIOUS_INTERRUPT_VECTOR 0x000000F0 - - /** - * In-Service Register (ISR); bits 31:0. - */ -#define APIC_IN_SERVICE_BITS_31_0 0x00000100 - - /** - * In-Service Register (ISR); bits 63:32. - */ -#define APIC_IN_SERVICE_BITS_63_32 0x00000110 - - /** - * In-Service Register (ISR); bits 95:64. - */ -#define APIC_IN_SERVICE_BITS_95_64 0x00000120 - - /** - * In-Service Register (ISR); bits 127:96. - */ -#define APIC_IN_SERVICE_BITS_127_96 0x00000130 - - /** - * In-Service Register (ISR); bits 159:128. - */ -#define APIC_IN_SERVICE_BITS_159_128 0x00000140 - - /** - * In-Service Register (ISR); bits 191:160. - */ -#define APIC_IN_SERVICE_BITS_191_160 0x00000150 - - /** - * In-Service Register (ISR); bits 223:192. - */ -#define APIC_IN_SERVICE_BITS_223_192 0x00000160 - - /** - * In-Service Register (ISR); bits 255:224. - */ -#define APIC_IN_SERVICE_BITS_255_224 0x00000170 - - /** - * Trigger Mode Register (TMR); bits 31:0. - */ -#define APIC_TRIGGER_MODE_BITS_31_0 0x00000180 - - /** - * Trigger Mode Register (TMR); bits 63:32. - */ -#define APIC_TRIGGER_MODE_BITS_63_32 0x00000190 - - /** - * Trigger Mode Register (TMR); bits 95:64. - */ -#define APIC_TRIGGER_MODE_BITS_95_64 0x000001A0 - - /** - * Trigger Mode Register (TMR); bits 127:96. - */ -#define APIC_TRIGGER_MODE_BITS_127_96 0x000001B0 - - /** - * Trigger Mode Register (TMR); bits 159:128. - */ -#define APIC_TRIGGER_MODE_BITS_159_128 0x000001C0 - - /** - * Trigger Mode Register (TMR); bits 191:160. - */ -#define APIC_TRIGGER_MODE_BITS_191_160 0x000001D0 - - /** - * Trigger Mode Register (TMR); bits 223:192. - */ -#define APIC_TRIGGER_MODE_BITS_223_192 0x000001E0 - - /** - * Trigger Mode Register (TMR); bits 255:224. - */ -#define APIC_TRIGGER_MODE_BITS_255_224 0x000001F0 - - /** - * Interrupt Request Register (IRR); bits 31:0. - */ -#define APIC_INTERRUPT_REQUEST_BITS_31_0 0x00000200 - - /** - * Interrupt Request Register (IRR); bits 63:32. - */ -#define APIC_INTERRUPT_REQUEST_BITS_63_32 0x00000210 - - /** - * Interrupt Request Register (IRR); bits 95:64. - */ -#define APIC_INTERRUPT_REQUEST_BITS_95_64 0x00000220 - - /** - * Interrupt Request Register (IRR); bits 127:96. - */ -#define APIC_INTERRUPT_REQUEST_BITS_127_96 0x00000230 - - /** - * Interrupt Request Register (IRR); bits 159:128. - */ -#define APIC_INTERRUPT_REQUEST_BITS_159_128 0x00000240 - - /** - * Interrupt Request Register (IRR); bits 191:160. - */ -#define APIC_INTERRUPT_REQUEST_BITS_191_160 0x00000250 - - /** - * Interrupt Request Register (IRR); bits 223:192. - */ -#define APIC_INTERRUPT_REQUEST_BITS_223_192 0x00000260 - - /** - * Interrupt Request Register (IRR); bits 255:224. - */ -#define APIC_INTERRUPT_REQUEST_BITS_255_224 0x00000270 - - /** - * Error Status Register. - */ -#define APIC_ERROR_STATUS 0x00000280 - - /** - * LVT Corrected Machine Check Interrupt (CMCI) Register. - */ -#define APIC_LVT_CORRECTED_MACHINE_CHECK_INTERRUPT 0x000002F0 - - /** - * Interrupt Command Register (ICR); bits 0-31. - */ -#define APIC_INTERRUPT_COMMAND_BITS_0_31 0x00000300 - - /** - * Interrupt Command Register (ICR); bits 32-63. - */ -#define APIC_INTERRUPT_COMMAND_BITS_32_63 0x00000310 - - /** - * LVT Timer Register. - */ -#define APIC_LVT_TIMER 0x00000320 - - /** - * LVT Thermal Sensor Register. - */ -#define APIC_LVT_THERMAL_SENSOR 0x00000330 - - /** - * LVT Performance Monitoring Counters Register. - */ -#define APIC_LVT_PERFORMANCE_MONITORING_COUNTERS 0x00000340 - - /** - * LVT LINT0 Register. - */ -#define APIC_LVT_LINT0 0x00000350 - - /** - * LVT LINT1 Register. - */ -#define APIC_LVT_LINT1 0x00000360 - - /** - * LVT Error Register. - */ -#define APIC_LVT_ERROR 0x00000370 - - /** - * Initial Count Register (for Timer). - */ -#define APIC_INITIAL_COUNT 0x00000380 - - /** - * Current Count Register (for Timer). - */ -#define APIC_CURRENT_COUNT 0x00000390 - - /** - * Divide Configuration Register (for Timer). - */ -#define APIC_DIVIDE_CONFIGURATION 0x000003E0 - /** - * @} - */ - - /** - * The 32-bit EFLAGS register contains a group of status flags, a control flag, and a group of system flags. The status - * flags (bits 0, 2, 4, 6, 7, and 11) of the EFLAGS register indicate the results of arithmetic instructions, such as the - * ADD, SUB, MUL, and DIV instructions. - * The system flags and IOPL field in the EFLAGS register control operating-system or executive operations. - * - * @see Vol1[3.4.3(EFLAGS)] (reference) - */ -typedef union -{ - struct - { - /** - * @brief Carry flag - * - * [Bit 0] Set if an arithmetic operation generates a carry or a borrow out of the mostsignificant bit of the result; - * cleared otherwise. This flag indicates an overflow condition for unsigned-integer arithmetic. It is also used in - * multiple-precision arithmetic. - */ - uint32_t carry_flag : 1; -#define EFLAGS_CARRY_FLAG_BIT 0 -#define EFLAGS_CARRY_FLAG_FLAG 0x01 -#define EFLAGS_CARRY_FLAG_MASK 0x01 -#define EFLAGS_CARRY_FLAG(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Reserved - always 1 - */ - uint32_t read_as_1 : 1; -#define EFLAGS_READ_AS_1_BIT 1 -#define EFLAGS_READ_AS_1_FLAG 0x02 -#define EFLAGS_READ_AS_1_MASK 0x01 -#define EFLAGS_READ_AS_1(_) (((_) >> 1) & 0x01) - - /** - * @brief Parity flag - * - * [Bit 2] Set if the least-significant byte of the result contains an even number of 1 bits; cleared otherwise. - */ - uint32_t parity_flag : 1; -#define EFLAGS_PARITY_FLAG_BIT 2 -#define EFLAGS_PARITY_FLAG_FLAG 0x04 -#define EFLAGS_PARITY_FLAG_MASK 0x01 -#define EFLAGS_PARITY_FLAG(_) (((_) >> 2) & 0x01) - uint32_t reserved1 : 1; - - /** - * @brief Auxiliary Carry flag - * - * [Bit 4] Set if an arithmetic operation generates a carry or a borrow out of bit 3 of the result; cleared otherwise. This - * flag is used in binary-coded decimal (BCD) arithmetic. - */ - uint32_t auxiliary_carry_flag : 1; -#define EFLAGS_AUXILIARY_CARRY_FLAG_BIT 4 -#define EFLAGS_AUXILIARY_CARRY_FLAG_FLAG 0x10 -#define EFLAGS_AUXILIARY_CARRY_FLAG_MASK 0x01 -#define EFLAGS_AUXILIARY_CARRY_FLAG(_) (((_) >> 4) & 0x01) - uint32_t reserved2 : 1; - - /** - * @brief Zero flag - * - * [Bit 6] Set if the result is zero; cleared otherwise. - */ - uint32_t zero_flag : 1; -#define EFLAGS_ZERO_FLAG_BIT 6 -#define EFLAGS_ZERO_FLAG_FLAG 0x40 -#define EFLAGS_ZERO_FLAG_MASK 0x01 -#define EFLAGS_ZERO_FLAG(_) (((_) >> 6) & 0x01) - - /** - * @brief Sign flag - * - * [Bit 7] Set equal to the most-significant bit of the result, which is the sign bit of a signed integer. (0 indicates a - * positive value and 1 indicates a negative value.) - */ - uint32_t sign_flag : 1; -#define EFLAGS_SIGN_FLAG_BIT 7 -#define EFLAGS_SIGN_FLAG_FLAG 0x80 -#define EFLAGS_SIGN_FLAG_MASK 0x01 -#define EFLAGS_SIGN_FLAG(_) (((_) >> 7) & 0x01) - - /** - * @brief Trap flag - * - * [Bit 8] Set to enable single-step mode for debugging; clear to disable single-step mode. - */ - uint32_t trap_flag : 1; -#define EFLAGS_TRAP_FLAG_BIT 8 -#define EFLAGS_TRAP_FLAG_FLAG 0x100 -#define EFLAGS_TRAP_FLAG_MASK 0x01 -#define EFLAGS_TRAP_FLAG(_) (((_) >> 8) & 0x01) - - /** - * @brief Interrupt enable flag - * - * [Bit 9] Controls the response of the processor to maskable interrupt requests. Set to respond to maskable interrupts; - * cleared to inhibit maskable interrupts. - */ - uint32_t interrupt_enable_flag : 1; -#define EFLAGS_INTERRUPT_ENABLE_FLAG_BIT 9 -#define EFLAGS_INTERRUPT_ENABLE_FLAG_FLAG 0x200 -#define EFLAGS_INTERRUPT_ENABLE_FLAG_MASK 0x01 -#define EFLAGS_INTERRUPT_ENABLE_FLAG(_) (((_) >> 9) & 0x01) - - /** - * @brief Direction flag - * - * [Bit 10] Controls string instructions (MOVS, CMPS, SCAS, LODS, and STOS). Setting the DF flag causes the string - * instructions to auto-decrement (to process strings from high addresses to low addresses). Clearing the DF flag causes - * the string instructions to auto-increment (process strings from low addresses to high addresses). - */ - uint32_t direction_flag : 1; -#define EFLAGS_DIRECTION_FLAG_BIT 10 -#define EFLAGS_DIRECTION_FLAG_FLAG 0x400 -#define EFLAGS_DIRECTION_FLAG_MASK 0x01 -#define EFLAGS_DIRECTION_FLAG(_) (((_) >> 10) & 0x01) - - /** - * @brief Overflow flag - * - * [Bit 11] Set if the integer result is too large a positive number or too small a negative number (excluding the - * sign-bit) to fit in the destination operand; cleared otherwise. This flag indicates an overflow condition for - * signed-integer (two's complement) arithmetic. - */ - uint32_t overflow_flag : 1; -#define EFLAGS_OVERFLOW_FLAG_BIT 11 -#define EFLAGS_OVERFLOW_FLAG_FLAG 0x800 -#define EFLAGS_OVERFLOW_FLAG_MASK 0x01 -#define EFLAGS_OVERFLOW_FLAG(_) (((_) >> 11) & 0x01) - - /** - * @brief I/O privilege level field - * - * [Bits 13:12] Indicates the I/O privilege level of the currently running program or task. The current privilege level - * (CPL) of the currently running program or task must be less than or equal to the I/O privilege level to access the I/O - * address space. The POPF and IRET instructions can modify this field only when operating at a CPL of 0. - */ - uint32_t io_privilege_level : 2; -#define EFLAGS_IO_PRIVILEGE_LEVEL_BIT 12 -#define EFLAGS_IO_PRIVILEGE_LEVEL_FLAG 0x3000 -#define EFLAGS_IO_PRIVILEGE_LEVEL_MASK 0x03 -#define EFLAGS_IO_PRIVILEGE_LEVEL(_) (((_) >> 12) & 0x03) - - /** - * @brief Nested task flag - * - * [Bit 14] Controls the chaining of interrupted and called tasks. Set when the current task is linked to the previously - * executed task; cleared when the current task is not linked to another task. - */ - uint32_t nested_task_flag : 1; -#define EFLAGS_NESTED_TASK_FLAG_BIT 14 -#define EFLAGS_NESTED_TASK_FLAG_FLAG 0x4000 -#define EFLAGS_NESTED_TASK_FLAG_MASK 0x01 -#define EFLAGS_NESTED_TASK_FLAG(_) (((_) >> 14) & 0x01) - uint32_t reserved3 : 1; - - /** - * @brief Resume flag - * - * [Bit 16] Controls the processor's response to debug exceptions. - */ - uint32_t resume_flag : 1; -#define EFLAGS_RESUME_FLAG_BIT 16 -#define EFLAGS_RESUME_FLAG_FLAG 0x10000 -#define EFLAGS_RESUME_FLAG_MASK 0x01 -#define EFLAGS_RESUME_FLAG(_) (((_) >> 16) & 0x01) - - /** - * @brief Virtual-8086 mode flag - * - * [Bit 17] Set to enable virtual-8086 mode; clear to return to protected mode without virtual-8086 mode semantics. - */ - uint32_t virtual_8086_mode_flag : 1; -#define EFLAGS_VIRTUAL_8086_MODE_FLAG_BIT 17 -#define EFLAGS_VIRTUAL_8086_MODE_FLAG_FLAG 0x20000 -#define EFLAGS_VIRTUAL_8086_MODE_FLAG_MASK 0x01 -#define EFLAGS_VIRTUAL_8086_MODE_FLAG(_) (((_) >> 17) & 0x01) - - /** - * @brief Alignment check (or access control) flag - * - * [Bit 18] If the AM bit is set in the CR0 register, alignment checking of user-mode data accesses is enabled if and only - * if this flag is 1. If the SMAP bit is set in the CR4 register, explicit supervisor-mode data accesses to user-mode pages - * are allowed if and only if this bit is 1. - * - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint32_t alignment_check_flag : 1; -#define EFLAGS_ALIGNMENT_CHECK_FLAG_BIT 18 -#define EFLAGS_ALIGNMENT_CHECK_FLAG_FLAG 0x40000 -#define EFLAGS_ALIGNMENT_CHECK_FLAG_MASK 0x01 -#define EFLAGS_ALIGNMENT_CHECK_FLAG(_) (((_) >> 18) & 0x01) - - /** - * @brief Virtual interrupt flag - * - * [Bit 19] Virtual image of the IF flag. Used in conjunction with the VIP flag. (To use this flag and the VIP flag the - * virtual mode extensions are enabled by setting the VME flag in control register CR4.) - */ - uint32_t virtual_interrupt_flag : 1; -#define EFLAGS_VIRTUAL_INTERRUPT_FLAG_BIT 19 -#define EFLAGS_VIRTUAL_INTERRUPT_FLAG_FLAG 0x80000 -#define EFLAGS_VIRTUAL_INTERRUPT_FLAG_MASK 0x01 -#define EFLAGS_VIRTUAL_INTERRUPT_FLAG(_) (((_) >> 19) & 0x01) - - /** - * @brief Virtual interrupt pending flag - * - * [Bit 20] Set to indicate that an interrupt is pending; clear when no interrupt is pending. (Software sets and clears - * this flag; the processor only reads it.) Used in conjunction with the VIF flag. - */ - uint32_t virtual_interrupt_pending_flag : 1; -#define EFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_BIT 20 -#define EFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_FLAG 0x100000 -#define EFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_MASK 0x01 -#define EFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG(_) (((_) >> 20) & 0x01) - - /** - * @brief Identification flag - * - * [Bit 21] The ability of a program to set or clear this flag indicates support for the CPUID instruction. - */ - uint32_t identification_flag : 1; -#define EFLAGS_IDENTIFICATION_FLAG_BIT 21 -#define EFLAGS_IDENTIFICATION_FLAG_FLAG 0x200000 -#define EFLAGS_IDENTIFICATION_FLAG_MASK 0x01 -#define EFLAGS_IDENTIFICATION_FLAG(_) (((_) >> 21) & 0x01) - uint32_t reserved4 : 10; - }; - - uint32_t flags; -} eflags; - -/** - * The 64-bit RFLAGS register contains a group of status flags, a control flag, and a group of system flags in 64-bit mode. - * The upper 32 bits of RFLAGS register is reserved. The lower 32 bits of RFLAGS is the same as EFLAGS. - * - * @see EFLAGS - * @see Vol1[3.4.3.4(RFLAGS Register in 64-Bit Mode)] (reference) - */ -typedef union -{ - struct - { - /** - * @brief Carry flag - * - * [Bit 0] See the description in EFLAGS. - */ - uint64_t carry_flag : 1; -#define RFLAGS_CARRY_FLAG_BIT 0 -#define RFLAGS_CARRY_FLAG_FLAG 0x01 -#define RFLAGS_CARRY_FLAG_MASK 0x01 -#define RFLAGS_CARRY_FLAG(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] Reserved - always 1 - */ - uint64_t read_as_1 : 1; -#define RFLAGS_READ_AS_1_BIT 1 -#define RFLAGS_READ_AS_1_FLAG 0x02 -#define RFLAGS_READ_AS_1_MASK 0x01 -#define RFLAGS_READ_AS_1(_) (((_) >> 1) & 0x01) - - /** - * @brief Parity flag - * - * [Bit 2] See the description in EFLAGS. - */ - uint64_t parity_flag : 1; -#define RFLAGS_PARITY_FLAG_BIT 2 -#define RFLAGS_PARITY_FLAG_FLAG 0x04 -#define RFLAGS_PARITY_FLAG_MASK 0x01 -#define RFLAGS_PARITY_FLAG(_) (((_) >> 2) & 0x01) - uint64_t reserved1 : 1; - - /** - * @brief Auxiliary Carry flag - * - * [Bit 4] See the description in EFLAGS. - */ - uint64_t auxiliary_carry_flag : 1; -#define RFLAGS_AUXILIARY_CARRY_FLAG_BIT 4 -#define RFLAGS_AUXILIARY_CARRY_FLAG_FLAG 0x10 -#define RFLAGS_AUXILIARY_CARRY_FLAG_MASK 0x01 -#define RFLAGS_AUXILIARY_CARRY_FLAG(_) (((_) >> 4) & 0x01) - uint64_t reserved2 : 1; - - /** - * @brief Zero flag - * - * [Bit 6] See the description in EFLAGS. - */ - uint64_t zero_flag : 1; -#define RFLAGS_ZERO_FLAG_BIT 6 -#define RFLAGS_ZERO_FLAG_FLAG 0x40 -#define RFLAGS_ZERO_FLAG_MASK 0x01 -#define RFLAGS_ZERO_FLAG(_) (((_) >> 6) & 0x01) - - /** - * @brief Sign flag - * - * [Bit 7] See the description in EFLAGS. - */ - uint64_t sign_flag : 1; -#define RFLAGS_SIGN_FLAG_BIT 7 -#define RFLAGS_SIGN_FLAG_FLAG 0x80 -#define RFLAGS_SIGN_FLAG_MASK 0x01 -#define RFLAGS_SIGN_FLAG(_) (((_) >> 7) & 0x01) - - /** - * @brief Trap flag - * - * [Bit 8] See the description in EFLAGS. - */ - uint64_t trap_flag : 1; -#define RFLAGS_TRAP_FLAG_BIT 8 -#define RFLAGS_TRAP_FLAG_FLAG 0x100 -#define RFLAGS_TRAP_FLAG_MASK 0x01 -#define RFLAGS_TRAP_FLAG(_) (((_) >> 8) & 0x01) - - /** - * @brief Interrupt enable flag - * - * [Bit 9] See the description in EFLAGS. - */ - uint64_t interrupt_enable_flag : 1; -#define RFLAGS_INTERRUPT_ENABLE_FLAG_BIT 9 -#define RFLAGS_INTERRUPT_ENABLE_FLAG_FLAG 0x200 -#define RFLAGS_INTERRUPT_ENABLE_FLAG_MASK 0x01 -#define RFLAGS_INTERRUPT_ENABLE_FLAG(_) (((_) >> 9) & 0x01) - - /** - * @brief Direction flag - * - * [Bit 10] See the description in EFLAGS. - */ - uint64_t direction_flag : 1; -#define RFLAGS_DIRECTION_FLAG_BIT 10 -#define RFLAGS_DIRECTION_FLAG_FLAG 0x400 -#define RFLAGS_DIRECTION_FLAG_MASK 0x01 -#define RFLAGS_DIRECTION_FLAG(_) (((_) >> 10) & 0x01) - - /** - * @brief Overflow flag - * - * [Bit 11] See the description in EFLAGS. - */ - uint64_t overflow_flag : 1; -#define RFLAGS_OVERFLOW_FLAG_BIT 11 -#define RFLAGS_OVERFLOW_FLAG_FLAG 0x800 -#define RFLAGS_OVERFLOW_FLAG_MASK 0x01 -#define RFLAGS_OVERFLOW_FLAG(_) (((_) >> 11) & 0x01) - - /** - * @brief I/O privilege level field - * - * [Bits 13:12] See the description in EFLAGS. - */ - uint64_t io_privilege_level : 2; -#define RFLAGS_IO_PRIVILEGE_LEVEL_BIT 12 -#define RFLAGS_IO_PRIVILEGE_LEVEL_FLAG 0x3000 -#define RFLAGS_IO_PRIVILEGE_LEVEL_MASK 0x03 -#define RFLAGS_IO_PRIVILEGE_LEVEL(_) (((_) >> 12) & 0x03) - - /** - * @brief Nested task flag - * - * [Bit 14] See the description in EFLAGS. - */ - uint64_t nested_task_flag : 1; -#define RFLAGS_NESTED_TASK_FLAG_BIT 14 -#define RFLAGS_NESTED_TASK_FLAG_FLAG 0x4000 -#define RFLAGS_NESTED_TASK_FLAG_MASK 0x01 -#define RFLAGS_NESTED_TASK_FLAG(_) (((_) >> 14) & 0x01) - uint64_t reserved3 : 1; - - /** - * @brief Resume flag - * - * [Bit 16] See the description in EFLAGS. - */ - uint64_t resume_flag : 1; -#define RFLAGS_RESUME_FLAG_BIT 16 -#define RFLAGS_RESUME_FLAG_FLAG 0x10000 -#define RFLAGS_RESUME_FLAG_MASK 0x01 -#define RFLAGS_RESUME_FLAG(_) (((_) >> 16) & 0x01) - - /** - * @brief Virtual-8086 mode flag - * - * [Bit 17] See the description in EFLAGS. - */ - uint64_t virtual_8086_mode_flag : 1; -#define RFLAGS_VIRTUAL_8086_MODE_FLAG_BIT 17 -#define RFLAGS_VIRTUAL_8086_MODE_FLAG_FLAG 0x20000 -#define RFLAGS_VIRTUAL_8086_MODE_FLAG_MASK 0x01 -#define RFLAGS_VIRTUAL_8086_MODE_FLAG(_) (((_) >> 17) & 0x01) - - /** - * @brief Alignment check (or access control) flag - * - * [Bit 18] See the description in EFLAGS. - * - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint64_t alignment_check_flag : 1; -#define RFLAGS_ALIGNMENT_CHECK_FLAG_BIT 18 -#define RFLAGS_ALIGNMENT_CHECK_FLAG_FLAG 0x40000 -#define RFLAGS_ALIGNMENT_CHECK_FLAG_MASK 0x01 -#define RFLAGS_ALIGNMENT_CHECK_FLAG(_) (((_) >> 18) & 0x01) - - /** - * @brief Virtual interrupt flag - * - * [Bit 19] See the description in EFLAGS. - */ - uint64_t virtual_interrupt_flag : 1; -#define RFLAGS_VIRTUAL_INTERRUPT_FLAG_BIT 19 -#define RFLAGS_VIRTUAL_INTERRUPT_FLAG_FLAG 0x80000 -#define RFLAGS_VIRTUAL_INTERRUPT_FLAG_MASK 0x01 -#define RFLAGS_VIRTUAL_INTERRUPT_FLAG(_) (((_) >> 19) & 0x01) - - /** - * @brief Virtual interrupt pending flag - * - * [Bit 20] See the description in EFLAGS. - */ - uint64_t virtual_interrupt_pending_flag : 1; -#define RFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_BIT 20 -#define RFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_FLAG 0x100000 -#define RFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG_MASK 0x01 -#define RFLAGS_VIRTUAL_INTERRUPT_PENDING_FLAG(_) (((_) >> 20) & 0x01) - - /** - * @brief Identification flag - * - * [Bit 21] See the description in EFLAGS. - */ - uint64_t identification_flag : 1; -#define RFLAGS_IDENTIFICATION_FLAG_BIT 21 -#define RFLAGS_IDENTIFICATION_FLAG_FLAG 0x200000 -#define RFLAGS_IDENTIFICATION_FLAG_MASK 0x01 -#define RFLAGS_IDENTIFICATION_FLAG(_) (((_) >> 21) & 0x01) - uint64_t reserved4 : 42; - }; - - uint64_t flags; -} rflags; - -/** - * @defgroup exceptions \ - * Exceptions - * @{ - */ - /** - * @brief Exceptions that can occur when the instruction is executed in protected mode. - * Each exception is given a mnemonic that consists of a pound sign (\#) followed by two letters and an optional error code - * in parentheses. For example, \#GP(0) denotes a general protection exception with an error code of 0 - * - * @see Vol2A[3.1.1.13(Protected Mode Exceptions Section)] (reference) - * @see Vol3A[6.3.1(External Interrupts)] (reference) - */ -typedef enum -{ - /** - * #DE - Divide Error. - * Source: DIV and IDIV instructions. - * Error Code: No. - */ - divide_error = 0x00000000, - - /** - * #DB - Debug. - * Source: Any code or data reference. - * Error Code: No. - */ - debug = 0x00000001, - - /** - * Nonmaskable Interrupt. - * Source: Generated externally by asserting the processor's NMI pin or - * through an NMI request set by the I/O APIC to the local APIC. - * Error Code: No. - */ - nmi = 0x00000002, - - /** - * #BP - Breakpoint. - * Source: INT3 instruction. - * Error Code: No. - */ - breakpoint = 0x00000003, - - /** - * #OF - Overflow. - * Source: INTO instruction. - * Error Code: No. - */ - overflow = 0x00000004, - - /** - * #BR - BOUND Range Exceeded. - * Source: BOUND instruction. - * Error Code: No. - */ - bound_range_exceeded = 0x00000005, - - /** - * #UD - Invalid Opcode (Undefined Opcode). - * Source: UD instruction or reserved opcode. - * Error Code: No. - */ - invalid_opcode = 0x00000006, - - /** - * #NM - Device Not Available (No Math Coprocessor). - * Source: Floating-point or WAIT/FWAIT instruction. - * Error Code: No. - */ - device_not_available = 0x00000007, - - /** - * #DF - Double Fault. - * Source: Any instruction that can generate an exception, an NMI, or an INTR. - * Error Code: Yes (zero). - */ - double_fault = 0x00000008, - - /** - * #\## - Coprocessor Segment Overrun (reserved). - * Source: Floating-point instruction. - * Error Code: No. - * - * @note Processors after the Intel386 processor do not generate this exception. - */ - coprocessor_segment_overrun = 0x00000009, - - /** - * #TS - Invalid TSS. - * Source: Task switch or TSS access. - * Error Code: Yes. - */ - invalid_tss = 0x0000000A, - - /** - * #NP - Segment Not Present. - * Source: Loading segment registers or accessing system segments. - * Error Code: Yes. - */ - segment_not_present = 0x0000000B, - - /** - * #SS - Stack Segment Fault. - * Source: Stack operations and SS register loads. - * Error Code: Yes. - */ - stack_segment_fault = 0x0000000C, - - /** - * #GP - General Protection. - * Source: Any memory reference and other protection checks. - * Error Code: Yes. - */ - general_protection = 0x0000000D, - - /** - * #PF - Page Fault. - * Source: Any memory reference. - * Error Code: Yes. - */ - page_fault = 0x0000000E, - - /** - * #MF - Floating-Point Error (Math Fault). - * Source: Floating-point or WAIT/FWAIT instruction. - * Error Code: No. - */ - x87_floating_point_error = 0x00000010, - - /** - * #AC - Alignment Check. - * Source: Any data reference in memory. - * Error Code: Yes. - */ - alignment_check = 0x00000011, - - /** - * #MC - Machine Check. - * Source: Model dependent machine check errors. - * Error Code: No. - */ - machine_check = 0x00000012, - - /** - * #XM - SIMD Floating-Point Numeric Error. - * Source: SSE/SSE2/SSE3 floating-point instructions. - * Error Code: No. - */ - simd_floating_point_error = 0x00000013, - - /** - * #VE - Virtualization Exception. - * Source: EPT violations. - * Error Code: No. - */ - virtualization_exception = 0x00000014, -} exception_vector; - -/** - * @brief When an exception condition is related to a specific segment selector or IDT vector, the processor pushes an - * error code onto the stack of the exception handler (whether it is a procedure or task). The error code resembles a - * segment selector; however, instead of a TI flag and RPL field, the error code contains 3 different flags - * - * @see Vol3A[6.13(ERROR CODE)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bit 0] When set, indicates that the exception occurred during delivery of an event external to the program, such as an - * interrupt or an earlier exception. The bit is cleared if the exception occurred during delivery of a software interrupt - * (INT n, INT3, or INTO). - */ - uint32_t external_event : 1; -#define EXCEPTION_ERROR_CODE_EXTERNAL_EVENT_BIT 0 -#define EXCEPTION_ERROR_CODE_EXTERNAL_EVENT_FLAG 0x01 -#define EXCEPTION_ERROR_CODE_EXTERNAL_EVENT_MASK 0x01 -#define EXCEPTION_ERROR_CODE_EXTERNAL_EVENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] When set, indicates that the index portion of the error code refers to a gate descriptor in the IDT; when clear, - * indicates that the index refers to a descriptor in the GDT or the current LDT. - */ - uint32_t descriptor_location : 1; -#define EXCEPTION_ERROR_CODE_DESCRIPTOR_LOCATION_BIT 1 -#define EXCEPTION_ERROR_CODE_DESCRIPTOR_LOCATION_FLAG 0x02 -#define EXCEPTION_ERROR_CODE_DESCRIPTOR_LOCATION_MASK 0x01 -#define EXCEPTION_ERROR_CODE_DESCRIPTOR_LOCATION(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] Only used when the IDT flag is clear. When set, the TI flag indicates that the index portion of the error code - * refers to a segment or gate descriptor in the LDT; when clear, it indicates that the index refers to a descriptor in the - * current GDT. - */ - uint32_t gdt_ldt : 1; -#define EXCEPTION_ERROR_CODE_GDT_LDT_BIT 2 -#define EXCEPTION_ERROR_CODE_GDT_LDT_FLAG 0x04 -#define EXCEPTION_ERROR_CODE_GDT_LDT_MASK 0x01 -#define EXCEPTION_ERROR_CODE_GDT_LDT(_) (((_) >> 2) & 0x01) - - /** - * [Bits 15:3] The segment selector index field provides an index into the IDT, GDT, or current LDT to the segment or gate - * selector being referenced by the error code. In some cases the error code is null (all bits are clear except possibly - * EXT). A null error code indicates that the error was not caused by a reference to a specific segment or that a null - * segment selector was referenced in an operation. - * - * @note The format of the error code is different for page-fault exceptions (#PF). - */ - uint32_t index : 13; -#define EXCEPTION_ERROR_CODE_INDEX_BIT 3 -#define EXCEPTION_ERROR_CODE_INDEX_FLAG 0xFFF8 -#define EXCEPTION_ERROR_CODE_INDEX_MASK 0x1FFF -#define EXCEPTION_ERROR_CODE_INDEX(_) (((_) >> 3) & 0x1FFF) - uint32_t reserved1 : 16; - }; - - uint32_t flags; -} exception_error_code; - -/** - * @brief Page fault exception - * - * @see Vol3A[4.7(PAGE-FAULT EXCEPTIONS)] (reference) - */ -typedef union -{ - struct - { - /** - * [Bit 0] This flag is 0 if there is no translation for the linear address because the P flag was 0 in one of the - * pagingstructure entries used to translate that address. - */ - uint32_t present : 1; -#define PAGE_FAULT_EXCEPTION_PRESENT_BIT 0 -#define PAGE_FAULT_EXCEPTION_PRESENT_FLAG 0x01 -#define PAGE_FAULT_EXCEPTION_PRESENT_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_PRESENT(_) (((_) >> 0) & 0x01) - - /** - * [Bit 1] If the access causing the page-fault exception was a write, this flag is 1; otherwise, it is 0. This flag - * describes the access causing the page-fault exception, not the access rights specified by paging. - */ - uint32_t write : 1; -#define PAGE_FAULT_EXCEPTION_WRITE_BIT 1 -#define PAGE_FAULT_EXCEPTION_WRITE_FLAG 0x02 -#define PAGE_FAULT_EXCEPTION_WRITE_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_WRITE(_) (((_) >> 1) & 0x01) - - /** - * [Bit 2] If a user-mode access caused the page-fault exception, this flag is 1; it is 0 if a supervisor-mode access did - * so. This flag describes the access causing the page-fault exception, not the access rights specified by paging. - * - * @see Vol3A[4.6(ACCESS RIGHTS)] - */ - uint32_t user_mode_access : 1; -#define PAGE_FAULT_EXCEPTION_USER_MODE_ACCESS_BIT 2 -#define PAGE_FAULT_EXCEPTION_USER_MODE_ACCESS_FLAG 0x04 -#define PAGE_FAULT_EXCEPTION_USER_MODE_ACCESS_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_USER_MODE_ACCESS(_) (((_) >> 2) & 0x01) - - /** - * [Bit 3] This flag is 1 if there is no translation for the linear address because a reserved bit was set in one of the - * pagingstructure entries used to translate that address. (Because reserved bits are not checked in a paging-structure - * entry whose P flag is 0, bit 3 of the error code can be set only if bit 0 is also set). Bits reserved in the - * paging-structure entries are reserved for future functionality. Software developers should be aware that such bits may - * be used in the future and that a paging-structure entry that causes a page-fault exception on one processor might not do - * so in the future. - */ - uint32_t reserved_bit_violation : 1; -#define PAGE_FAULT_EXCEPTION_RESERVED_BIT_VIOLATION_BIT 3 -#define PAGE_FAULT_EXCEPTION_RESERVED_BIT_VIOLATION_FLAG 0x08 -#define PAGE_FAULT_EXCEPTION_RESERVED_BIT_VIOLATION_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_RESERVED_BIT_VIOLATION(_) (((_) >> 3) & 0x01) - - /** - * [Bit 4] This flag is 1 if (1) the access causing the page-fault exception was an instruction fetch; and (2) either (a) - * CR4.SMEP = 1; or (b) both (i) CR4.PAE = 1 (either PAE paging or 4-level paging is in use); and (ii) IA32_EFER.NXE = 1. - * Otherwise, the flag is 0. This flag describes the access causing the page-fault exception, not the access rights - * specified by paging. - */ - uint32_t execute : 1; -#define PAGE_FAULT_EXCEPTION_EXECUTE_BIT 4 -#define PAGE_FAULT_EXCEPTION_EXECUTE_FLAG 0x10 -#define PAGE_FAULT_EXCEPTION_EXECUTE_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_EXECUTE(_) (((_) >> 4) & 0x01) - - /** - * [Bit 5] This flag is 1 if (1) IA32_EFER.LMA = CR4.PKE = 1; (2) the access causing the page-fault exception was a data - * access; (3) the linear address was a user-mode address with protection key i; and (5) the PKRU register is such that - * either (a) ADi = 1; or (b) the following all hold: (i) WDi = 1; (ii) the access is a write access; and (iii) either - * CR0.WP = 1 or the access causing the page-fault exception was a user-mode access. - * - * @see Vol3A[4.6.2(Protection Keys)] - */ - uint32_t protection_key_violation : 1; -#define PAGE_FAULT_EXCEPTION_PROTECTION_KEY_VIOLATION_BIT 5 -#define PAGE_FAULT_EXCEPTION_PROTECTION_KEY_VIOLATION_FLAG 0x20 -#define PAGE_FAULT_EXCEPTION_PROTECTION_KEY_VIOLATION_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_PROTECTION_KEY_VIOLATION(_) (((_) >> 5) & 0x01) - uint32_t reserved1 : 9; - - /** - * [Bit 15] This flag is 1 if the exception is unrelated to paging and resulted from violation of SGX-specific - * access-control requirements. Because such a violation can occur only if there is no ordinary page fault, this flag is - * set only if the P flag (bit 0) is 1 and the RSVD flag (bit 3) and the PK flag (bit 5) are both 0. - */ - uint32_t sgx : 1; -#define PAGE_FAULT_EXCEPTION_SGX_BIT 15 -#define PAGE_FAULT_EXCEPTION_SGX_FLAG 0x8000 -#define PAGE_FAULT_EXCEPTION_SGX_MASK 0x01 -#define PAGE_FAULT_EXCEPTION_SGX(_) (((_) >> 15) & 0x01) - uint32_t reserved2 : 16; - }; - - uint32_t flags; -} page_fault_exception; - -/** - * @} - */ - - /** - * @defgroup memory_type \ - * Memory caching type - * - * The processor allows any area of system memory to be cached in the L1, L2, and L3 caches. In individual pages or regions - * of system memory, it allows the type of caching (also called memory type) to be specified. - * - * @see Vol3A[11.11(MEMORY TYPE RANGE REGISTERS (MTRRS))] - * @see Vol3A[11.5(CACHE CONTROL)] - * @see Vol3A[11.3(METHODS OF CACHING AVAILABLE)] (reference) - * @{ - */ - /** - * @brief Strong Uncacheable (UC) - * - * System memory locations are not cached. All reads and writes appear on the system bus and are executed in program order - * without reordering. No speculative memory accesses, pagetable walks, or prefetches of speculated branch targets are - * made. This type of cache-control is useful for memory-mapped I/O devices. When used with normal RAM, it greatly reduces - * processor performance. - */ -#define MEMORY_TYPE_UNCACHEABLE 0x00000000 - - /** - * @brief Write Combining (WC) - * - * System memory locations are not cached (as with uncacheable memory) and coherency is not enforced by the processor's bus - * coherency protocol. Speculative reads are allowed. Writes may be delayed and combined in the write combining buffer (WC - * buffer) to reduce memory accesses. If the WC buffer is partially filled, the writes may be delayed until the next - * occurrence of a serializing event; such as, an SFENCE or MFENCE instruction, CPUID execution, a read or write to - * uncached memory, an interrupt occurrence, or a LOCK instruction execution. This type of cache-control is appropriate for - * video frame buffers, where the order of writes is unimportant as long as the writes update memory so they can be seen on - * the graphics display. This memory type is available in the Pentium Pro and Pentium II processors by programming the - * MTRRs; or in processor families starting from the Pentium III processors by programming the MTRRs or by selecting it - * through the PAT. - * - * @see Vol3A[11.3.1(Buffering of Write Combining Memory Locations)] - */ -#define MEMORY_TYPE_WRITE_COMBINING 0x00000001 - - /** - * @brief Write-through (WT) - * - * Writes and reads to and from system memory are cached. Reads come from cache lines on cache hits; read misses cause - * cache fills. Speculative reads are allowed. All writes are written to a cache line (when possible) and through to system - * memory. When writing through to memory, invalid cache lines are never filled, and valid cache lines are either filled or - * invalidated. Write combining is allowed. This type of cache-control is appropriate for frame buffers or when there are - * devices on the system bus that access system memory, but do not perform snooping of memory accesses. It enforces - * coherency between caches in the processors and system memory. - */ -#define MEMORY_TYPE_WRITE_THROUGH 0x00000004 - - /** - * @brief Write protected (WP) - * - * Reads come from cache lines when possible, and read misses cause cache fills. Writes are propagated to the system bus - * and cause corresponding cache lines on all processors on the bus to be invalidated. Speculative reads are allowed. This - * memory type is available in processor families starting from the P6 family processors by programming the MTRRs. - */ -#define MEMORY_TYPE_WRITE_PROTECTED 0x00000005 - - /** - * @brief Write-back (WB) - * - * Writes and reads to and from system memory are cached. Reads come from cache lines on cache hits; read misses cause - * cache fills. Speculative reads are allowed. Write misses cause cache line fills (in processor families starting with the - * P6 family processors), and writes are performed entirely in the cache, when possible. Write combining is allowed. The - * write-back memory type reduces bus traffic by eliminating many unnecessary writes to system memory. Writes to a cache - * line are not immediately forwarded to system memory; instead, they are accumulated in the cache. The modified cache - * lines are written to system memory later, when a write-back operation is performed. Write-back operations are triggered - * when cache lines need to be deallocated, such as when new cache lines are being allocated in a cache that is already - * full. They also are triggered by the mechanisms used to maintain cache consistency. This type of cache-control provides - * the best performance, but it requires that all devices that access system memory on the system bus be able to snoop - * memory accesses to insure system memory and cache coherency. - */ -#define MEMORY_TYPE_WRITE_BACK 0x00000006 - - /** - * @brief Uncacheable (UC-) - * - * Has same characteristics as the strong uncacheable (UC) memory type, except that this memory type can be overridden by - * programming the MTRRs for the WC memory type. This memory type is available in processor families starting from the - * Pentium III processors and can only be selected through the PAT. - */ -#define MEMORY_TYPE_UNCACHEABLE_MINUS 0x00000007 -#define MEMORY_TYPE_INVALID 0x000000FF - /** - * @} - */ - - /** - * @} - */ \ No newline at end of file diff --git a/src/vmprofiler-qt.vcxproj b/src/vmprofiler-qt.vcxproj deleted file mode 100644 index 13a199e..0000000 --- a/src/vmprofiler-qt.vcxproj +++ /dev/null @@ -1,198 +0,0 @@ - - - - - Debug - x64 - - - Release - x64 - - - - {A0485AE3-1965-4BE3-A2C4-A8257337C271} - QtVS_v304 - 10.0.19041.0 - 10.0.19041.0 - $(MSBuildProjectDirectory)\QtMsBuild - - - - Application - v142 - - - Application - v142 - - - - - - - 5.15.1 - core;gui;widgets - debug - - - 5.15.1 - core;gui;widgets - release - - - - - - - - - - - - - - - - - G:\Qt\5.15.1\msvc2019_64\include;$(ProjectDir);$(ProjectDir)DarkStyle\framelesswindow\;$(ProjectDir)DarkStyle;$(IncludePath);$(ProjectDir)..\dependencies\vmprofiler\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\dependencies\zycore\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\msvc - - - G:\Qt\5.15.1\msvc2019_64\include;$(ProjectDir);$(ProjectDir)DarkStyle\framelesswindow\;$(ProjectDir)DarkStyle;$(IncludePath);$(ProjectDir)..\dependencies\vmprofiler\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\dependencies\zycore\include;$(ProjectDir)..\dependencies\vmprofiler\dependencies\zydis\msvc - - - - stdcpp17 - ZYDIS_STATIC_DEFINE;%(PreprocessorDefinitions) - - - $(ProjectDir)..\libs\*;%(AdditionalDependencies) - true - - - - - stdcpp17 - %(PreprocessorDefinitions) - - - - - true - true - ProgramDatabase - Disabled - MultiThreadedDebugDLL - - - Console - true - - - - - true - true - None - Disabled - MultiThreadedDLL - - - Windows - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {88a23124-5640-35a0-b890-311d7a67a7d2} - - - {d0b6092a-9944-4f24-9486-4b7dae372619} - - - - - - - - - - - - \ No newline at end of file diff --git a/src/vmprofiler-qt.vcxproj.filters b/src/vmprofiler-qt.vcxproj.filters deleted file mode 100644 index fd82560..0000000 --- a/src/vmprofiler-qt.vcxproj.filters +++ /dev/null @@ -1,267 +0,0 @@ - - - - - Source Files - - - Source Files\DarkStyle\framelesswindow - - - Source Files\DarkStyle\framelesswindow - - - Source Files\DarkStyle - - - Source Files - - - Source Files - - - - - {841656a6-8f18-40f6-88cc-63394509aec2} - - - {b94916d4-6db7-4a7c-bfe5-f2ae9acd3b54} - - - {8c45819e-3375-4fa3-81c3-ef06ca9b22f8} - - - {412fa996-96ab-4202-88d8-4f5d8c303483} - - - {8e5d2814-ebf7-49a1-b226-71e5efcc79aa} - - - {ab85244a-db4d-4aef-a6e5-cb51b205206f} - - - {ab0c8bb3-a7db-47a7-ad9f-da0b8569eea1} - - - {5f579aad-1e93-4542-9e34-7f59aaee46da} - - - {da03ed08-340b-423c-875d-1167c5575937} - - - {372a780d-f944-4786-acbf-e6741e5caf7a} - - - {fa365433-05db-4072-b63d-493cca4f1ca7} - - - {b4f5c8c6-4ab4-4034-96e6-c011a1eeb0cf} - - - {6a0de737-6e61-4611-a035-82c1aff09648} - - - - - Resource Files - - - Resource Files - - - Resource Files - - - - - Resource Files - - - Resource Files - - - - - Header Files\DarkStyle\framelesswindow - - - Header Files\DarkStyle\framelesswindow - - - Header Files\DarkStyle - - - Header Files - - - Header Files - - - - - Header Files - - - Header Files\vmprofiler - - - Header Files\vmprofiler - - - Header Files\vmprofiler - - - Header Files\vmprofiler - - - Header Files\vmprofiler - - - Header Files\vmprofiler - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Internal - - - Header Files\Zydis\Generated - - - Header Files\Zydis\Generated - - - Header Files\Zydis\Generated - - - Header Files\Zydis\Generated - - - Header Files\Zydis\Generated - - - Header Files\Zycore\API - - - Header Files\Zycore\API - - - Header Files\Zycore\API - - - Header Files\Zycore\API - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files\Zycore - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/vmprofiler-qt.sln b/vmprofiler-qt.sln index d93b0fd..eb7b63a 100644 --- a/vmprofiler-qt.sln +++ b/vmprofiler-qt.sln @@ -3,198 +3,41 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30907.101 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmprofiler-qt", "src\vmprofiler-qt.vcxproj", "{A0485AE3-1965-4BE3-A2C4-A8257337C271}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Zydis", "dependencies\vmprofiler\dependencies\zydis\msvc\zydis\Zydis.vcxproj", "{88A23124-5640-35A0-B890-311D7A67A7D2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmprofiler", "dependencies\vmprofiler\vmprofiler.vcxproj", "{D0B6092A-9944-4F24-9486-4B7DAE372619}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmprofiler-qt", "vmprofiler-qt.vcxproj", "{A0485AE3-1965-4BE3-A2C4-A8257337C271}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution DBG|x64 = DBG|x64 DBG|x86 = DBG|x86 - Debug Kernel|x64 = Debug Kernel|x64 - Debug Kernel|x86 = Debug Kernel|x86 - Debug MD DLL|x64 = Debug MD DLL|x64 - Debug MD DLL|x86 = Debug MD DLL|x86 - Debug MD|x64 = Debug MD|x64 - Debug MD|x86 = Debug MD|x86 - Debug MT DLL|x64 = Debug MT DLL|x64 - Debug MT DLL|x86 = Debug MT DLL|x86 - Debug MT|x64 = Debug MT|x64 - Debug MT|x86 = Debug MT|x86 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release Kernel|x64 = Release Kernel|x64 - Release Kernel|x86 = Release Kernel|x86 - Release MD DLL|x64 = Release MD DLL|x64 - Release MD DLL|x86 = Release MD DLL|x86 - Release MD|x64 = Release MD|x64 - Release MD|x86 = Release MD|x86 - Release MT DLL|x64 = Release MT DLL|x64 - Release MT DLL|x86 = Release MT DLL|x86 - Release MT|x64 = Release MT|x64 - Release MT|x86 = Release MT|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug Kernel|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug Kernel|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug Kernel|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug Kernel|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD DLL|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD DLL|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD DLL|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD DLL|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MD|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT DLL|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT DLL|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT DLL|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT DLL|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug MT|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug|x64.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug|x64.Build.0 = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Debug|x86.ActiveCfg = Debug|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release Kernel|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release Kernel|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release Kernel|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release Kernel|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD DLL|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD DLL|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD DLL|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD DLL|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MD|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT DLL|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT DLL|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT DLL|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT DLL|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT|x86.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release MT|x86.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x64.ActiveCfg = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x64.Build.0 = Release|x64 - {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x86.ActiveCfg = Release|x64 {88A23124-5640-35A0-B890-311D7A67A7D2}.DBG|x64.ActiveCfg = Debug MT DLL|x64 {88A23124-5640-35A0-B890-311D7A67A7D2}.DBG|x64.Build.0 = Debug MT DLL|x64 {88A23124-5640-35A0-B890-311D7A67A7D2}.DBG|x86.ActiveCfg = Debug MT|Win32 {88A23124-5640-35A0-B890-311D7A67A7D2}.DBG|x86.Build.0 = Debug MT|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x64.ActiveCfg = Debug Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x64.Build.0 = Debug Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x64.Deploy.0 = Debug Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x86.ActiveCfg = Debug Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x86.Build.0 = Debug Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug Kernel|x86.Deploy.0 = Debug Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD DLL|x64.ActiveCfg = Debug MD DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD DLL|x64.Build.0 = Debug MD DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD DLL|x86.ActiveCfg = Debug MD DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD DLL|x86.Build.0 = Debug MD DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD|x64.ActiveCfg = Debug MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD|x64.Build.0 = Debug MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD|x86.ActiveCfg = Debug MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MD|x86.Build.0 = Debug MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT DLL|x64.ActiveCfg = Debug MT DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT DLL|x64.Build.0 = Debug MT DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT DLL|x86.ActiveCfg = Debug MT DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT DLL|x86.Build.0 = Debug MT DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT|x64.ActiveCfg = Debug MT|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT|x64.Build.0 = Debug MT|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT|x86.ActiveCfg = Debug MT|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug MT|x86.Build.0 = Debug MT|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug|x64.ActiveCfg = Debug MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug|x64.Build.0 = Debug MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug|x86.ActiveCfg = Debug MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Debug|x86.Build.0 = Debug MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x64.ActiveCfg = Release Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x64.Build.0 = Release Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x64.Deploy.0 = Release Kernel|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x86.ActiveCfg = Release Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x86.Build.0 = Release Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release Kernel|x86.Deploy.0 = Release Kernel|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD DLL|x64.ActiveCfg = Release MD DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD DLL|x64.Build.0 = Release MD DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD DLL|x86.ActiveCfg = Release MD DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD DLL|x86.Build.0 = Release MD DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD|x64.ActiveCfg = Release MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD|x64.Build.0 = Release MD|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD|x86.ActiveCfg = Release MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MD|x86.Build.0 = Release MD|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT DLL|x64.ActiveCfg = Release MT DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT DLL|x64.Build.0 = Release MT DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT DLL|x86.ActiveCfg = Release MT DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT DLL|x86.Build.0 = Release MT DLL|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT|x64.ActiveCfg = Release MT|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT|x64.Build.0 = Release MT|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT|x86.ActiveCfg = Release MT|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release MT|x86.Build.0 = Release MT|Win32 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x64.ActiveCfg = Release MD DLL|x64 - {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x64.Build.0 = Release MD DLL|x64 + {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x64.ActiveCfg = Release MT|x64 + {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x64.Build.0 = Release MT|x64 {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x86.ActiveCfg = Release MT DLL|Win32 {88A23124-5640-35A0-B890-311D7A67A7D2}.Release|x86.Build.0 = Release MT DLL|Win32 {D0B6092A-9944-4F24-9486-4B7DAE372619}.DBG|x64.ActiveCfg = DBG|x64 {D0B6092A-9944-4F24-9486-4B7DAE372619}.DBG|x64.Build.0 = DBG|x64 {D0B6092A-9944-4F24-9486-4B7DAE372619}.DBG|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug Kernel|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug Kernel|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug Kernel|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug Kernel|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD DLL|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD DLL|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD DLL|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD DLL|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MD|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT DLL|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT DLL|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT DLL|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT DLL|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug MT|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug|x64.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug|x64.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Debug|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release Kernel|x64.ActiveCfg = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release Kernel|x64.Build.0 = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release Kernel|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release Kernel|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD DLL|x64.ActiveCfg = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD DLL|x64.Build.0 = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD DLL|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD DLL|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD|x64.ActiveCfg = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD|x64.Build.0 = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MD|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT DLL|x64.ActiveCfg = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT DLL|x64.Build.0 = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT DLL|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT DLL|x86.Build.0 = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT|x64.ActiveCfg = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT|x64.Build.0 = Release|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT|x86.ActiveCfg = DBG|x64 - {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release MT|x86.Build.0 = DBG|x64 {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release|x64.ActiveCfg = Release|x64 {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release|x64.Build.0 = Release|x64 {D0B6092A-9944-4F24-9486-4B7DAE372619}.Release|x86.ActiveCfg = Release|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x64.ActiveCfg = Debug|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x64.Build.0 = Debug|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x86.ActiveCfg = Debug|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.DBG|x86.Build.0 = Debug|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x64.ActiveCfg = Release|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x64.Build.0 = Release|x64 + {A0485AE3-1965-4BE3-A2C4-A8257337C271}.Release|x86.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/vmprofiler-qt.vcxproj b/vmprofiler-qt.vcxproj new file mode 100644 index 0000000..c0fe076 --- /dev/null +++ b/vmprofiler-qt.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + {88a23124-5640-35a0-b890-311d7a67a7d2} + + + {d0b6092a-9944-4f24-9486-4b7dae372619} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {A0485AE3-1965-4BE3-A2C4-A8257337C271} + QtVS_v304 + 10.0.19041.0 + 10.0.19041.0 + $(MSBuildProjectDirectory)\QtMsBuild + + + + Application + v142 + + + Application + v142 + + + + + + + 5.15.1 + core;gui;widgets + debug + + + 5.15.1 + core;gui;widgets + release + + + + + + + + + + + + + + + + + G:\Qt\5.15.1\msvc2019_64\include;$(ProjectDir);$(ProjectDir)dependencies\DarkStyle\framelesswindow\;$(ProjectDir)dependencies\DarkStyle;$(IncludePath);$(ProjectDir)dependencies\vmprofiler\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\dependencies\zycore\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\msvc;$(ProjectDir)dependencies\ia32-doc\out\ + + + G:\Qt\5.15.1\msvc2019_64\include;$(ProjectDir);$(ProjectDir)dependencies\DarkStyle\framelesswindow\;$(ProjectDir)dependencies\DarkStyle;$(IncludePath);$(ProjectDir)dependencies\vmprofiler\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\dependencies\zycore\include;$(ProjectDir)dependencies\vmprofiler\dependencies\zydis\msvc;$(ProjectDir)dependencies\ia32-doc\out\ + + + + stdcpp17 + ZYDIS_STATIC_DEFINE;%(PreprocessorDefinitions) + + + $(ProjectDir)..\libs\*;%(AdditionalDependencies) + true + + + + + stdcpp17 + %(PreprocessorDefinitions) + + + + + true + true + ProgramDatabase + Disabled + MultiThreadedDebugDLL + + + Console + true + + + + + true + true + None + Disabled + MultiThreadedDLL + + + Windows + true + + + + + + + + + \ No newline at end of file diff --git a/vmprofiler-qt.vcxproj.filters b/vmprofiler-qt.vcxproj.filters new file mode 100644 index 0000000..fdb8756 --- /dev/null +++ b/vmprofiler-qt.vcxproj.filters @@ -0,0 +1,102 @@ + + + + + {841656a6-8f18-40f6-88cc-63394509aec2} + + + {b94916d4-6db7-4a7c-bfe5-f2ae9acd3b54} + + + {8c45819e-3375-4fa3-81c3-ef06ca9b22f8} + + + {3be16123-7e90-4e97-86f4-92801c3f4ede} + + + {5a2542d9-b470-4c74-9c19-80a1e210d6ab} + + + {fdddc2b4-b9cf-403b-96b3-604807a6d797} + + + {12186088-c49f-41bf-b3c9-b41a8d847495} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files\darkstyle\framelesswindow + + + Source Files\darkstyle\framelesswindow + + + Source Files\darkstyle + + + + + Header Files + + + Header Files + + + Header Files\darkstyle + + + Header Files\darkstyle\framelesswindow + + + Header Files\darkstyle\framelesswindow + + + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Resource Files + + + Resource Files + + + + + Resource Files + + + + + Resource Files + + + + + Resource Files + + + + + Header Files + + + \ No newline at end of file