#ifndef __ASM_MSR_INDEX_H
#define __ASM_MSR_INDEX_H

/*
Valid-License-Identifier: GPL-2.0-only
Valid-License-Identifier: GPL-2.0-or-later

SPDX-URL: https://spdx.org/licenses/GPL-2.0-only.html
SPDX-URL: https://spdx.org/licenses/GPL-2.0-or-later.html

Deprecated-Identifier: GPL-2.0
Deprecated-Identifier: GPL-2.0+

Usage-Guide:

  To use this license in source code, put one of the following SPDX
  tag/value pairs into a comment according to the placement
  guidelines in the licensing rules documentation.

  For 'GNU General Public License (GPL) version 2 only' use:
    SPDX-License-Identifier: GPL-2.0-only

  For 'GNU General Public License (GPL) version 2 or any later version' use:
    SPDX-License-Identifier: GPL-2.0-or-later

  The deprecated tags should not be used for any new additions.  Where
  possible, their existing uses should be phased out.

License-Text:

        GNU GENERAL PUBLIC LICENSE
           Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

          Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

        GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

          NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

         END OF TERMS AND CONDITIONS

      How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.
*/

/*
 * CPU model specific register (MSR) numbers
 *
 * Definitions for an MSR should follow this style:
 *
 * #define MSR_$NAME                        0x$INDEX
 * #define  $NAME_$FIELD1                   (_AC($X, ULL) << $POS1)
 * #define  $NAME_$FIELD2                   (_AC($Y, ULL) << $POS2)
 *
 * Blocks of related constants should be sorted by MSR index.  The constant
 * names should be as concise as possible, and the bit names may have an
 * abbreviated name.  Exceptions will be considered on a case-by-case basis.
 */

#define _AC(X, Y) (X##Y)

#define MSR_P5_MC_ADDR 0
#define MSR_P5_MC_TYPE 0x00000001

#define MSR_APIC_BASE       0x0000001b
#define APIC_BASE_BSP       (_AC (1, ULL) << 8)
#define APIC_BASE_EXTD      (_AC (1, ULL) << 10)
#define APIC_BASE_ENABLE    (_AC (1, ULL) << 11)
#define APIC_BASE_ADDR_MASK _AC (0x000ffffffffff000, ULL)

#define MSR_TEST_CTRL               0x00000033
#define TEST_CTRL_SPLITLOCK_DETECT  (_AC (1, ULL) << 29)
#define TEST_CTRL_SPLITLOCK_DISABLE (_AC (1, ULL) << 31)

#define MSR_INTEL_CORE_THREAD_COUNT 0x00000035
#define MSR_CTC_THREAD_MASK         0x0000ffff
#define MSR_CTC_CORE_MASK           _AC (0xffff0000, U)

#define MSR_SPEC_CTRL         0x00000048
#define SPEC_CTRL_IBRS        (_AC (1, ULL) << 0)
#define SPEC_CTRL_STIBP       (_AC (1, ULL) << 1)
#define SPEC_CTRL_SSBD        (_AC (1, ULL) << 2)
#define SPEC_CTRL_IPRED_DIS_U (_AC (1, ULL) << 3)
#define SPEC_CTRL_IPRED_DIS_S (_AC (1, ULL) << 4)
#define SPEC_CTRL_RRSBA_DIS_U (_AC (1, ULL) << 5)
#define SPEC_CTRL_RRSBA_DIS_S (_AC (1, ULL) << 6)
#define SPEC_CTRL_PSFD        (_AC (1, ULL) << 7)
#define SPEC_CTRL_DDP_DIS_U   (_AC (1, ULL) << 8)
#define SPEC_CTRL_BHI_DIS_S   (_AC (1, ULL) << 10)

#define MSR_PRED_CMD  0x00000049
#define PRED_CMD_IBPB (_AC (1, ULL) << 0)
#define PRED_CMD_SBPB (_AC (1, ULL) << 7)

#define MSR_PPIN_CTL 0x0000004e
#define PPIN_LOCKOUT (_AC (1, ULL) << 0)
#define PPIN_ENABLE  (_AC (1, ULL) << 1)
#define MSR_PPIN     0x0000004f

#define MSR_MISC_PACKAGE_CTRL     0x000000bc
#define PGK_CTRL_ENERGY_FILTER_EN (_AC (1, ULL) << 0)

#define MSR_PB_OPT_CTRL 0x000000bf
#define PB_OPT_IBPB_ALT (_AC (1, ULL) << 0)

#define MSR_CORE_CAPABILITIES      0x000000cf
#define CORE_CAPS_SPLITLOCK_DETECT (_AC (1, ULL) << 5)

#define MSR_PKG_CST_CONFIG_CONTROL 0x000000e2
#define NHM_C3_AUTO_DEMOTE         (_AC (1, ULL) << 25)
#define NHM_C1_AUTO_DEMOTE         (_AC (1, ULL) << 26)
#define ATM_LNC_C6_AUTO_DEMOTE     (_AC (1, ULL) << 25)
#define SNB_C3_AUTO_UNDEMOTE       (_AC (1, ULL) << 27)
#define SNB_C1_AUTO_UNDEMOTE       (_AC (1, ULL) << 28)

#define MSR_ARCH_CAPABILITIES       0x0000010a
#define ARCH_CAPS_RDCL_NO           (_AC (1, ULL) << 0)
#define ARCH_CAPS_EIBRS             (_AC (1, ULL) << 1)
#define ARCH_CAPS_RSBA              (_AC (1, ULL) << 2)
#define ARCH_CAPS_SKIP_L1DFL        (_AC (1, ULL) << 3)
#define ARCH_CAPS_SSB_NO            (_AC (1, ULL) << 4)
#define ARCH_CAPS_MDS_NO            (_AC (1, ULL) << 5)
#define ARCH_CAPS_IF_PSCHANGE_MC_NO (_AC (1, ULL) << 6)
#define ARCH_CAPS_TSX_CTRL          (_AC (1, ULL) << 7)
#define ARCH_CAPS_TAA_NO            (_AC (1, ULL) << 8)
#define ARCH_CAPS_MISC_PACKAGE_CTRL (_AC (1, ULL) << 10)
#define ARCH_CAPS_ENERGY_FILTERING  (_AC (1, ULL) << 11)
#define ARCH_CAPS_DOITM             (_AC (1, ULL) << 12)
#define ARCH_CAPS_SBDR_SSDP_NO      (_AC (1, ULL) << 13)
#define ARCH_CAPS_FBSDP_NO          (_AC (1, ULL) << 14)
#define ARCH_CAPS_PSDP_NO           (_AC (1, ULL) << 15)
#define ARCH_CAPS_FB_CLEAR          (_AC (1, ULL) << 17)
#define ARCH_CAPS_FB_CLEAR_CTRL     (_AC (1, ULL) << 18)
#define ARCH_CAPS_RRSBA             (_AC (1, ULL) << 19)
#define ARCH_CAPS_BHI_NO            (_AC (1, ULL) << 20)
#define ARCH_CAPS_PBRSB_NO          (_AC (1, ULL) << 24)
#define ARCH_CAPS_GDS_CTRL          (_AC (1, ULL) << 25)
#define ARCH_CAPS_GDS_NO            (_AC (1, ULL) << 26)
#define ARCH_CAPS_RFDS_NO           (_AC (1, ULL) << 27)
#define ARCH_CAPS_RFDS_CLEAR        (_AC (1, ULL) << 28)

#define MSR_FLUSH_CMD 0x0000010b
#define FLUSH_CMD_L1D (_AC (1, ULL) << 0)

#define MSR_TSX_FORCE_ABORT 0x0000010f
#define TSX_FORCE_ABORT_RTM (_AC (1, ULL) << 0)
#define TSX_CPUID_CLEAR     (_AC (1, ULL) << 1)
#define TSX_ENABLE_RTM      (_AC (1, ULL) << 2)

#define MSR_TSX_CTRL         0x00000122
#define TSX_CTRL_RTM_DISABLE (_AC (1, ULL) << 0)
#define TSX_CTRL_CPUID_CLEAR (_AC (1, ULL) << 1)

#define MSR_MCU_OPT_CTRL            0x00000123
#define MCU_OPT_CTRL_RNGDS_MITG_DIS (_AC (1, ULL) << 0)
#define MCU_OPT_CTRL_RTM_ALLOW      (_AC (1, ULL) << 1)
#define MCU_OPT_CTRL_RTM_LOCKED     (_AC (1, ULL) << 2)
#define MCU_OPT_CTRL_FB_CLEAR_DIS   (_AC (1, ULL) << 3)
#define MCU_OPT_CTRL_GDS_MIT_DIS    (_AC (1, ULL) << 4)
#define MCU_OPT_CTRL_GDS_MIT_LOCK   (_AC (1, ULL) << 5)

#define MSR_FRED_RSP_SL0  0x000001cc
#define MSR_FRED_RSP_SL1  0x000001cd
#define MSR_FRED_RSP_SL2  0x000001ce
#define MSR_FRED_RSP_SL3  0x000001cf
#define MSR_FRED_STK_LVLS 0x000001d0
#define MSR_FRED_SSP_SL0  MSR_PL0_SSP
#define MSR_FRED_SSP_SL1  0x000001d1
#define MSR_FRED_SSP_SL2  0x000001d2
#define MSR_FRED_SSP_SL3  0x000001d3
#define MSR_FRED_CONFIG   0x000001d4

#define MSR_RTIT_OUTPUT_BASE   0x00000560
#define MSR_RTIT_OUTPUT_MASK   0x00000561
#define MSR_RTIT_CTL           0x00000570
#define RTIT_CTL_TRACE_EN      (_AC (1, ULL) << 0)
#define RTIT_CTL_CYC_EN        (_AC (1, ULL) << 1)
#define RTIT_CTL_OS            (_AC (1, ULL) << 2)
#define RTIT_CTL_USR           (_AC (1, ULL) << 3)
#define RTIT_CTL_PWR_EVT_EN    (_AC (1, ULL) << 4)
#define RTIT_CTL_FUP_ON_PTW    (_AC (1, ULL) << 5)
#define RTIT_CTL_FABRIC_EN     (_AC (1, ULL) << 6)
#define RTIT_CTL_CR3_FILTER    (_AC (1, ULL) << 7)
#define RTIT_CTL_TOPA          (_AC (1, ULL) << 8)
#define RTIT_CTL_MTC_EN        (_AC (1, ULL) << 9)
#define RTIT_CTL_TSC_EN        (_AC (1, ULL) << 10)
#define RTIT_CTL_DIS_RETC      (_AC (1, ULL) << 11)
#define RTIT_CTL_PTW_EN        (_AC (1, ULL) << 12)
#define RTIT_CTL_BRANCH_EN     (_AC (1, ULL) << 13)
#define RTIT_CTL_MTC_FREQ      (_AC (0xf, ULL) << 14)
#define RTIT_CTL_CYC_THRESH    (_AC (0xf, ULL) << 19)
#define RTIT_CTL_PSB_FREQ      (_AC (0xf, ULL) << 24)
#define RTIT_CTL_ADDR(n)       (_AC (0xf, ULL) << (32 + 4 * (n)))
#define MSR_RTIT_STATUS        0x00000571
#define RTIT_STATUS_FILTER_EN  (_AC (1, ULL) << 0)
#define RTIT_STATUS_CONTEXT_EN (_AC (1, ULL) << 1)
#define RTIT_STATUS_TRIGGER_EN (_AC (1, ULL) << 2)
#define RTIT_STATUS_ERROR      (_AC (1, ULL) << 4)
#define RTIT_STATUS_STOPPED    (_AC (1, ULL) << 5)
#define RTIT_STATUS_BYTECNT    (_AC (0x1ffff, ULL) << 32)
#define MSR_RTIT_CR3_MATCH     0x00000572
#define MSR_RTIT_ADDR_A(n)     (0x00000580 + (n) * 2)
#define MSR_RTIT_ADDR_B(n)     (0x00000581 + (n) * 2)

#define MSR_U_CET    0x000006a0
#define MSR_S_CET    0x000006a2
#define CET_SHSTK_EN (_AC (1, ULL) << 0)
#define CET_WRSS_EN  (_AC (1, ULL) << 1)
#define CET_ENDBR_EN (_AC (1, ULL) << 2)

#define MSR_PL0_SSP 0x000006a4
#define MSR_PL1_SSP 0x000006a5
#define MSR_PL2_SSP 0x000006a6
#define MSR_PL3_SSP 0x000006a7
#define MSR_ISST    0x000006a8

#define MSR_PKRS 0x000006e1

#define MSR_PM_ENABLE        0x00000770
#define PM_ENABLE_HWP_ENABLE BIT (0, ULL)

#define MSR_HWP_CAPABILITIES 0x00000771
#define MSR_HWP_INTERRUPT    0x00000773
#define MSR_HWP_REQUEST      0x00000774
#define MSR_HWP_STATUS       0x00000777

#define MSR_X2APIC_FIRST 0x00000800
#define MSR_X2APIC_LAST  0x000008ff

#define MSR_X2APIC_TPR   0x00000808
#define MSR_X2APIC_PPR   0x0000080a
#define MSR_X2APIC_EOI   0x0000080b
#define MSR_X2APIC_TMICT 0x00000838
#define MSR_X2APIC_TMCCT 0x00000839
#define MSR_X2APIC_SELF  0x0000083f

#define MSR_PASID        0x00000d93
#define PASID_PASID_MASK 0x000fffff
#define PASID_VALID      (_AC (1, ULL) << 31)

#define MSR_PKG_HDC_CTL            0x00000db0
#define PKG_HDC_CTL_HDC_PKG_ENABLE BIT (0, ULL)
#define MSR_PM_CTL1                0x00000db1
#define PM_CTL1_HDC_ALLOW_BLOCK    BIT (0, ULL)

#define MSR_MCU_CONTROL           0x00001406
#define MCU_CONTROL_LOCK          (_AC (1, ULL) << 0)
#define MCU_CONTROL_DIS_MCU_LOAD  (_AC (1, ULL) << 1)
#define MCU_CONTROL_EN_SMM_BYPASS (_AC (1, ULL) << 2)

#define MSR_UARCH_MISC_CTRL 0x00001b01
#define UARCH_CTRL_DOITM    (_AC (1, ULL) << 0)

#define MSR_EFER    _AC (0xc0000080, U)  /* Extended Feature Enable Register */
#define EFER_SCE    (_AC (1, ULL) << 0)  /* SYSCALL Enable */
#define EFER_LME    (_AC (1, ULL) << 8)  /* Long Mode Enable */
#define EFER_LMA    (_AC (1, ULL) << 10) /* Long Mode Active */
#define EFER_NXE    (_AC (1, ULL) << 11) /* No Execute Enable */
#define EFER_SVME   (_AC (1, ULL) << 12) /* Secure Virtual Machine Enable */
#define EFER_FFXSE  (_AC (1, ULL) << 14) /* Fast FXSAVE/FXRSTOR */
#define EFER_AIBRSE (_AC (1, ULL) << 21) /* Automatic IBRS Enable */

#define EFER_KNOWN_MASK                                                                            \
  (EFER_SCE | EFER_LME | EFER_LMA | EFER_NXE | EFER_SVME | EFER_FFXSE | EFER_AIBRSE)

#define MSR_STAR           _AC (0xc0000081, U) /* legacy mode SYSCALL target */
#define MSR_LSTAR          _AC (0xc0000082, U) /* long mode SYSCALL target */
#define MSR_CSTAR          _AC (0xc0000083, U) /* compat mode SYSCALL target */
#define MSR_SYSCALL_MASK   _AC (0xc0000084, U) /* EFLAGS mask for syscall */
#define MSR_FS_BASE        _AC (0xc0000100, U) /* 64bit FS base */
#define MSR_GS_BASE        _AC (0xc0000101, U) /* 64bit GS base */
#define MSR_SHADOW_GS_BASE _AC (0xc0000102, U) /* SwapGS GS shadow */
#define MSR_TSC_AUX        _AC (0xc0000103, U) /* Auxiliary TSC */

#define MSR_K8_SYSCFG               _AC (0xc0010010, U)
#define SYSCFG_MTRR_FIX_DRAM_EN     (_AC (1, ULL) << 18)
#define SYSCFG_MTRR_FIX_DRAM_MOD_EN (_AC (1, ULL) << 19)
#define SYSCFG_MTRR_VAR_DRAM_EN     (_AC (1, ULL) << 20)
#define SYSCFG_MTRR_TOM2_EN         (_AC (1, ULL) << 21)
#define SYSCFG_TOM2_FORCE_WB        (_AC (1, ULL) << 22)

#define MSR_K8_IORR_BASE0 _AC (0xc0010016, U)
#define MSR_K8_IORR_MASK0 _AC (0xc0010017, U)
#define MSR_K8_IORR_BASE1 _AC (0xc0010018, U)
#define MSR_K8_IORR_MASK1 _AC (0xc0010019, U)

#define MSR_K8_TSEG_BASE _AC (0xc0010112, U) /* AMD doc: SMMAddr */
#define MSR_K8_TSEG_MASK _AC (0xc0010113, U) /* AMD doc: SMMMask */

#define MSR_K8_VM_CR           _AC (0xc0010114, U)
#define VM_CR_INIT_REDIRECTION (_AC (1, ULL) << 1)
#define VM_CR_SVM_DISABLE      (_AC (1, ULL) << 4)

#define MSR_VIRT_SPEC_CTRL _AC (0xc001011f, U) /* Layout matches MSR_SPEC_CTRL */

#define MSR_AMD_CSTATE_CFG 0xc0010296U

#define MSR_AMD_CPPC_CAP1   0xc00102b0U
#define MSR_AMD_CPPC_ENABLE 0xc00102b1U
#define AMD_CPPC_ENABLE     (_AC (1, ULL) << 0)
#define MSR_AMD_CPPC_REQ    0xc00102b3U
#define AMD_CPPC_EPP_MASK   (_AC (0xff, ULL) << 24)

/*
 * Legacy MSR constants in need of cleanup.  No new MSRs below this comment.
 */

/* Intel MSRs. Some also available on other CPUs */
#define MSR_IA32_PERFCTR0   0x000000c1
#define MSR_IA32_A_PERFCTR0 0x000004c1
#define MSR_FSB_FREQ        0x000000cd

#define MSR_MTRRcap  0x000000fe
#define MTRRcap_VCNT 0x000000ff

#define MSR_IA32_BBL_CR_CTL 0x00000119

#define MSR_IA32_SYSENTER_CS  0x00000174
#define MSR_IA32_SYSENTER_ESP 0x00000175
#define MSR_IA32_SYSENTER_EIP 0x00000176

#define MSR_IA32_MCG_CAP     0x00000179
#define MSR_IA32_MCG_STATUS  0x0000017a
#define MSR_IA32_MCG_CTL     0x0000017b
#define MSR_IA32_MCG_EXT_CTL 0x000004d0

#define MSR_IA32_PEBS_ENABLE       0x000003f1
#define MSR_IA32_DS_AREA           0x00000600
#define MSR_IA32_PERF_CAPABILITIES 0x00000345
/* Lower 6 bits define the format of the address in the LBR stack */
#define MSR_IA32_PERF_CAP_LBR_FORMAT 0x3f

#define MSR_IA32_BNDCFGS      0x00000d90
#define IA32_BNDCFGS_ENABLE   0x00000001
#define IA32_BNDCFGS_PRESERVE 0x00000002
#define IA32_BNDCFGS_RESERVED 0x00000ffc

#define MSR_IA32_XSS 0x00000da0

#define MSR_MTRRfix64K_00000 0x00000250
#define MSR_MTRRfix16K_80000 0x00000258
#define MSR_MTRRfix16K_A0000 0x00000259
#define MSR_MTRRfix4K_C0000  0x00000268
#define MSR_MTRRfix4K_C8000  0x00000269
#define MSR_MTRRfix4K_D0000  0x0000026a
#define MSR_MTRRfix4K_D8000  0x0000026b
#define MSR_MTRRfix4K_E0000  0x0000026c
#define MSR_MTRRfix4K_E8000  0x0000026d
#define MSR_MTRRfix4K_F0000  0x0000026e
#define MSR_MTRRfix4K_F8000  0x0000026f
#define MSR_MTRRdefType      0x000002ff
#define MTRRdefType_FE       (1u << 10)
#define MTRRdefType_E        (1u << 11)

#define MSR_IA32_DEBUGCTLMSR         0x000001d9
#define IA32_DEBUGCTLMSR_LBR         (1 << 0)  /* Last Branch Record */
#define IA32_DEBUGCTLMSR_BTF         (1 << 1)  /* Single Step on Branches */
#define IA32_DEBUGCTLMSR_TR          (1 << 6)  /* Trace Message Enable */
#define IA32_DEBUGCTLMSR_BTS         (1 << 7)  /* Branch Trace Store */
#define IA32_DEBUGCTLMSR_BTINT       (1 << 8)  /* Branch Trace Interrupt */
#define IA32_DEBUGCTLMSR_BTS_OFF_OS  (1 << 9)  /* BTS off if CPL 0 */
#define IA32_DEBUGCTLMSR_BTS_OFF_USR (1 << 10) /* BTS off if CPL > 0 */
#define IA32_DEBUGCTLMSR_RTM         (1 << 15) /* RTM debugging enable */

#define MSR_IA32_LASTBRANCHFROMIP 0x000001db
#define MSR_IA32_LASTBRANCHTOIP   0x000001dc
#define MSR_IA32_LASTINTFROMIP    0x000001dd
#define MSR_IA32_LASTINTTOIP      0x000001de

#define MSR_IA32_POWER_CTL 0x000001fc

#define MSR_IA32_MTRR_PHYSBASE(n) (0x00000200 + 2 * (n))
#define MSR_IA32_MTRR_PHYSMASK(n) (0x00000201 + 2 * (n))

#define MSR_IA32_CR_PAT       0x00000277
#define MSR_IA32_CR_PAT_RESET 0x0007040600070406ULL

#define MSR_IA32_MC0_CTL    0x00000400
#define MSR_IA32_MC0_STATUS 0x00000401
#define MSR_IA32_MC0_ADDR   0x00000402
#define MSR_IA32_MC0_MISC   0x00000403
#define MSR_IA32_MC0_CTL2   0x00000280
#define CMCI_EN             (1UL << 30)
#define CMCI_THRESHOLD_MASK 0x7FFF

#define MSR_AMD64_MC0_MASK 0xc0010044U

#define MSR_IA32_MCx_CTL(x)    (MSR_IA32_MC0_CTL + 4 * (x))
#define MSR_IA32_MCx_STATUS(x) (MSR_IA32_MC0_STATUS + 4 * (x))
#define MSR_IA32_MCx_ADDR(x)   (MSR_IA32_MC0_ADDR + 4 * (x))
#define MSR_IA32_MCx_MISC(x)   (MSR_IA32_MC0_MISC + 4 * (x))
#define MSR_IA32_MCx_CTL2(x)   (MSR_IA32_MC0_CTL2 + (x))

#define MSR_AMD64_MCx_MASK(x) (MSR_AMD64_MC0_MASK + (x))

/* MSRs & bits used for VMX enabling */
#define MSR_IA32_VMX_BASIC               0x480
#define MSR_IA32_VMX_PINBASED_CTLS       0x481
#define MSR_IA32_VMX_PROCBASED_CTLS      0x482
#define MSR_IA32_VMX_EXIT_CTLS           0x483
#define MSR_IA32_VMX_ENTRY_CTLS          0x484
#define MSR_IA32_VMX_MISC                0x485
#define MSR_IA32_VMX_CR0_FIXED0          0x486
#define MSR_IA32_VMX_CR0_FIXED1          0x487
#define MSR_IA32_VMX_CR4_FIXED0          0x488
#define MSR_IA32_VMX_CR4_FIXED1          0x489
#define MSR_IA32_VMX_VMCS_ENUM           0x48a
#define MSR_IA32_VMX_PROCBASED_CTLS2     0x48b
#define MSR_IA32_VMX_EPT_VPID_CAP        0x48c
#define MSR_IA32_VMX_TRUE_PINBASED_CTLS  0x48d
#define MSR_IA32_VMX_TRUE_PROCBASED_CTLS 0x48e
#define MSR_IA32_VMX_TRUE_EXIT_CTLS      0x48f
#define MSR_IA32_VMX_TRUE_ENTRY_CTLS     0x490
#define MSR_IA32_VMX_VMFUNC              0x491
#define MSR_IA32_VMX_PROCBASED_CTLS3     0x492

/* K7/K8 MSRs. Not complete. See the architecture manual for a more
   complete list. */
#define MSR_K7_EVNTSEL0 0xc0010000U
#define MSR_K7_PERFCTR0 0xc0010004U
#define MSR_K7_EVNTSEL1 0xc0010001U
#define MSR_K7_PERFCTR1 0xc0010005U
#define MSR_K7_EVNTSEL2 0xc0010002U
#define MSR_K7_PERFCTR2 0xc0010006U
#define MSR_K7_EVNTSEL3 0xc0010003U
#define MSR_K7_PERFCTR3 0xc0010007U
#define MSR_K8_TOP_MEM1 0xc001001aU
#define MSR_K8_TOP_MEM2 0xc001001dU

#define MSR_K8_HWCR            0xc0010015U
#define K8_HWCR_TSC_FREQ_SEL   (1ULL << 24)
#define K8_HWCR_CPUID_USER_DIS (1ULL << 35)

#define MSR_K7_FID_VID_CTL    0xc0010041U
#define MSR_K7_FID_VID_STATUS 0xc0010042U
#define MSR_K8_PSTATE_LIMIT   0xc0010061U
#define MSR_K8_PSTATE_CTRL    0xc0010062U
#define MSR_K8_PSTATE_STATUS  0xc0010063U
#define MSR_K8_PSTATE0        0xc0010064U
#define MSR_K8_PSTATE1        0xc0010065U
#define MSR_K8_PSTATE2        0xc0010066U
#define MSR_K8_PSTATE3        0xc0010067U
#define MSR_K8_PSTATE4        0xc0010068U
#define MSR_K8_PSTATE5        0xc0010069U
#define MSR_K8_PSTATE6        0xc001006AU
#define MSR_K8_PSTATE7        0xc001006BU
#define MSR_K8_ENABLE_C1E     0xc0010055U
#define MSR_K8_VM_HSAVE_PA    0xc0010117U

#define MSR_AMD_FAM15H_EVNTSEL0 0xc0010200U
#define MSR_AMD_FAM15H_PERFCTR0 0xc0010201U
#define MSR_AMD_FAM15H_EVNTSEL1 0xc0010202U
#define MSR_AMD_FAM15H_PERFCTR1 0xc0010203U
#define MSR_AMD_FAM15H_EVNTSEL2 0xc0010204U
#define MSR_AMD_FAM15H_PERFCTR2 0xc0010205U
#define MSR_AMD_FAM15H_EVNTSEL3 0xc0010206U
#define MSR_AMD_FAM15H_PERFCTR3 0xc0010207U
#define MSR_AMD_FAM15H_EVNTSEL4 0xc0010208U
#define MSR_AMD_FAM15H_PERFCTR4 0xc0010209U
#define MSR_AMD_FAM15H_EVNTSEL5 0xc001020aU
#define MSR_AMD_FAM15H_PERFCTR5 0xc001020bU

#define MSR_AMD_L7S0_FEATURE_MASK 0xc0011002U
#define MSR_AMD_THRM_FEATURE_MASK 0xc0011003U
#define MSR_K8_FEATURE_MASK       0xc0011004U
#define MSR_K8_EXT_FEATURE_MASK   0xc0011005U

/* AMD64 MSRs */
#define MSR_AMD64_NB_CFG                0xc001001fU
#define AMD64_NB_CFG_CF8_EXT_ENABLE_BIT 46
#define MSR_AMD64_LS_CFG                0xc0011020U
#define MSR_AMD64_IC_CFG                0xc0011021U
#define MSR_AMD64_DC_CFG                0xc0011022U
#define MSR_AMD64_DE_CFG                0xc0011029U
#define AMD64_DE_CFG_LFENCE_SERIALISE   (_AC (1, ULL) << 1)
#define MSR_AMD64_EX_CFG                0xc001102cU
#define MSR_AMD64_BP_CFG                0xc001102eU
#define BP_CFG_SPEC_REDUCE              (_AC (1, ULL) << 4)
#define MSR_AMD64_DE_CFG2               0xc00110e3U

#define MSR_AMD64_DR0_ADDRESS_MASK 0xc0011027U
#define MSR_AMD64_DR1_ADDRESS_MASK 0xc0011019U
#define MSR_AMD64_DR2_ADDRESS_MASK 0xc001101aU
#define MSR_AMD64_DR3_ADDRESS_MASK 0xc001101bU

/* AMD Family10h machine check MSRs */
#define MSR_F10_MC4_MISC1 0xc0000408U
#define MSR_F10_MC4_MISC2 0xc0000409U
#define MSR_F10_MC4_MISC3 0xc000040AU

/* AMD Family10h Bus Unit MSRs */
#define MSR_F10_BU_CFG  0xc0011023U
#define MSR_F10_BU_CFG2 0xc001102aU

/* Other AMD Fam10h MSRs */
#define MSR_FAM10H_MMIO_CONF_BASE       0xc0010058U
#define FAM10H_MMIO_CONF_ENABLE         (1 << 0)
#define FAM10H_MMIO_CONF_BUSRANGE_MASK  0xf
#define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2
#define FAM10H_MMIO_CONF_BASE_MASK      0xfffffffULL
#define FAM10H_MMIO_CONF_BASE_SHIFT     20

/* AMD Microcode MSRs */
#define MSR_AMD_PATCHLEVEL  0x0000008b
#define MSR_AMD_PATCHLOADER 0xc0010020U

/* AMD TSC RATE MSR */
#define MSR_AMD64_TSC_RATIO 0xc0000104U

/* AMD Lightweight Profiling MSRs */
#define MSR_AMD64_LWP_CFG    0xc0000105U
#define MSR_AMD64_LWP_CBADDR 0xc0000106U

/* AMD OS Visible Workaround MSRs */
#define MSR_AMD_OSVW_ID_LENGTH 0xc0010140U
#define MSR_AMD_OSVW_STATUS    0xc0010141U

/* AMD Protected Processor Inventory Number */
#define MSR_AMD_PPIN_CTL 0xc00102f0U
#define MSR_AMD_PPIN     0xc00102f1U

/* VIA Cyrix defined MSRs*/
#define MSR_VIA_FCR 0x00001107
#define MSR_VIA_RNG 0x0000110b

/* Intel defined MSRs. */
#define MSR_IA32_TSC              0x00000010
#define MSR_IA32_PLATFORM_ID      0x00000017
#define MSR_IA32_EBL_CR_POWERON   0x0000002a
#define MSR_IA32_EBC_FREQUENCY_ID 0x0000002c

#define MSR_IA32_FEATURE_CONTROL                      0x0000003a
#define IA32_FEATURE_CONTROL_LOCK                     0x0001
#define IA32_FEATURE_CONTROL_ENABLE_VMXON_INSIDE_SMX  0x0002
#define IA32_FEATURE_CONTROL_ENABLE_VMXON_OUTSIDE_SMX 0x0004
#define IA32_FEATURE_CONTROL_SENTER_PARAM_CTL         0x7f00
#define IA32_FEATURE_CONTROL_ENABLE_SENTER            0x8000
#define IA32_FEATURE_CONTROL_SGX_ENABLE               0x40000
#define IA32_FEATURE_CONTROL_LMCE_ON                  0x100000

#define MSR_IA32_TSC_ADJUST 0x0000003b

#define MSR_IA32_UCODE_WRITE 0x00000079
#define MSR_IA32_UCODE_REV   0x0000008b

#define MSR_IA32_PERF_STATUS 0x00000198
#define MSR_IA32_PERF_CTL    0x00000199

#define MSR_IA32_MPERF 0x000000e7
#define MSR_IA32_APERF 0x000000e8

#define MSR_IA32_THERM_CONTROL               0x0000019a
#define MSR_IA32_THERM_INTERRUPT             0x0000019b
#define MSR_IA32_THERM_STATUS                0x0000019c
#define MSR_IA32_MISC_ENABLE                 0x000001a0
#define MSR_IA32_MISC_ENABLE_FAST_STRING     (1 << 0)
#define MSR_IA32_MISC_ENABLE_PERF_AVAIL      (1 << 7)
#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL     (1 << 11)
#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL    (1 << 12)
#define MSR_IA32_MISC_ENABLE_MONITOR_ENABLE  (1 << 18)
#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID     (1 << 22)
#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE    (1 << 23)
#define MSR_IA32_MISC_ENABLE_XD_DISABLE      (_AC (1, ULL) << 34)
#define MSR_IA32_MISC_ENABLE_TURBO_DISENGAGE (_AC (1, ULL) << 38)

#define MSR_IA32_TSC_DEADLINE     0x000006E0
#define MSR_IA32_ENERGY_PERF_BIAS 0x000001b0

/* Platform Shared Resource MSRs */
#define MSR_IA32_CMT_EVTSEL          0x00000c8d
#define MSR_IA32_CMT_EVTSEL_UE_MASK  0x0000ffff
#define MSR_IA32_CMT_CTR             0x00000c8e
#define MSR_IA32_PSR_ASSOC           0x00000c8f
#define MSR_IA32_PSR_L3_QOS_CFG      0x00000c81
#define MSR_IA32_PSR_L3_MASK(n)      (0x00000c90 + (n))
#define MSR_IA32_PSR_L3_MASK_CODE(n) (0x00000c90 + (n) * 2 + 1)
#define MSR_IA32_PSR_L3_MASK_DATA(n) (0x00000c90 + (n) * 2)
#define MSR_IA32_PSR_L2_MASK(n)      (0x00000d10 + (n))
#define MSR_IA32_PSR_MBA_MASK(n)     (0x00000d50 + (n))

/* Intel Model 6 */
#define MSR_P6_PERFCTR(n) (0x000000c1 + (n))
#define MSR_P6_EVNTSEL(n) (0x00000186 + (n))

/* P4/Xeon+ specific */
#define MSR_IA32_MCG_EAX    0x00000180
#define MSR_IA32_MCG_EBX    0x00000181
#define MSR_IA32_MCG_ECX    0x00000182
#define MSR_IA32_MCG_EDX    0x00000183
#define MSR_IA32_MCG_ESI    0x00000184
#define MSR_IA32_MCG_EDI    0x00000185
#define MSR_IA32_MCG_EBP    0x00000186
#define MSR_IA32_MCG_ESP    0x00000187
#define MSR_IA32_MCG_EFLAGS 0x00000188
#define MSR_IA32_MCG_EIP    0x00000189
#define MSR_IA32_MCG_MISC   0x0000018a
#define MSR_IA32_MCG_R8     0x00000190
#define MSR_IA32_MCG_R9     0x00000191
#define MSR_IA32_MCG_R10    0x00000192
#define MSR_IA32_MCG_R11    0x00000193
#define MSR_IA32_MCG_R12    0x00000194
#define MSR_IA32_MCG_R13    0x00000195
#define MSR_IA32_MCG_R14    0x00000196
#define MSR_IA32_MCG_R15    0x00000197

/* Pentium IV performance counter MSRs */
#define MSR_P4_BPU_PERFCTR0   0x00000300
#define MSR_P4_BPU_PERFCTR1   0x00000301
#define MSR_P4_BPU_PERFCTR2   0x00000302
#define MSR_P4_BPU_PERFCTR3   0x00000303
#define MSR_P4_MS_PERFCTR0    0x00000304
#define MSR_P4_MS_PERFCTR1    0x00000305
#define MSR_P4_MS_PERFCTR2    0x00000306
#define MSR_P4_MS_PERFCTR3    0x00000307
#define MSR_P4_FLAME_PERFCTR0 0x00000308
#define MSR_P4_FLAME_PERFCTR1 0x00000309
#define MSR_P4_FLAME_PERFCTR2 0x0000030a
#define MSR_P4_FLAME_PERFCTR3 0x0000030b
#define MSR_P4_IQ_PERFCTR0    0x0000030c
#define MSR_P4_IQ_PERFCTR1    0x0000030d
#define MSR_P4_IQ_PERFCTR2    0x0000030e
#define MSR_P4_IQ_PERFCTR3    0x0000030f
#define MSR_P4_IQ_PERFCTR4    0x00000310
#define MSR_P4_IQ_PERFCTR5    0x00000311
#define MSR_P4_BPU_CCCR0      0x00000360
#define MSR_P4_BPU_CCCR1      0x00000361
#define MSR_P4_BPU_CCCR2      0x00000362
#define MSR_P4_BPU_CCCR3      0x00000363
#define MSR_P4_MS_CCCR0       0x00000364
#define MSR_P4_MS_CCCR1       0x00000365
#define MSR_P4_MS_CCCR2       0x00000366
#define MSR_P4_MS_CCCR3       0x00000367
#define MSR_P4_FLAME_CCCR0    0x00000368
#define MSR_P4_FLAME_CCCR1    0x00000369
#define MSR_P4_FLAME_CCCR2    0x0000036a
#define MSR_P4_FLAME_CCCR3    0x0000036b
#define MSR_P4_IQ_CCCR0       0x0000036c
#define MSR_P4_IQ_CCCR1       0x0000036d
#define MSR_P4_IQ_CCCR2       0x0000036e
#define MSR_P4_IQ_CCCR3       0x0000036f
#define MSR_P4_IQ_CCCR4       0x00000370
#define MSR_P4_IQ_CCCR5       0x00000371
#define MSR_P4_ALF_ESCR0      0x000003ca
#define MSR_P4_ALF_ESCR1      0x000003cb
#define MSR_P4_BPU_ESCR0      0x000003b2
#define MSR_P4_BPU_ESCR1      0x000003b3
#define MSR_P4_BSU_ESCR0      0x000003a0
#define MSR_P4_BSU_ESCR1      0x000003a1
#define MSR_P4_CRU_ESCR0      0x000003b8
#define MSR_P4_CRU_ESCR1      0x000003b9
#define MSR_P4_CRU_ESCR2      0x000003cc
#define MSR_P4_CRU_ESCR3      0x000003cd
#define MSR_P4_CRU_ESCR4      0x000003e0
#define MSR_P4_CRU_ESCR5      0x000003e1
#define MSR_P4_DAC_ESCR0      0x000003a8
#define MSR_P4_DAC_ESCR1      0x000003a9
#define MSR_P4_FIRM_ESCR0     0x000003a4
#define MSR_P4_FIRM_ESCR1     0x000003a5
#define MSR_P4_FLAME_ESCR0    0x000003a6
#define MSR_P4_FLAME_ESCR1    0x000003a7
#define MSR_P4_FSB_ESCR0      0x000003a2
#define MSR_P4_FSB_ESCR1      0x000003a3
#define MSR_P4_IQ_ESCR0       0x000003ba
#define MSR_P4_IQ_ESCR1       0x000003bb
#define MSR_P4_IS_ESCR0       0x000003b4
#define MSR_P4_IS_ESCR1       0x000003b5
#define MSR_P4_ITLB_ESCR0     0x000003b6
#define MSR_P4_ITLB_ESCR1     0x000003b7
#define MSR_P4_IX_ESCR0       0x000003c8
#define MSR_P4_IX_ESCR1       0x000003c9
#define MSR_P4_MOB_ESCR0      0x000003aa
#define MSR_P4_MOB_ESCR1      0x000003ab
#define MSR_P4_MS_ESCR0       0x000003c0
#define MSR_P4_MS_ESCR1       0x000003c1
#define MSR_P4_PMH_ESCR0      0x000003ac
#define MSR_P4_PMH_ESCR1      0x000003ad
#define MSR_P4_RAT_ESCR0      0x000003bc
#define MSR_P4_RAT_ESCR1      0x000003bd
#define MSR_P4_SAAT_ESCR0     0x000003ae
#define MSR_P4_SAAT_ESCR1     0x000003af
#define MSR_P4_SSU_ESCR0      0x000003be
#define MSR_P4_SSU_ESCR1      0x000003bf /* guess: not in manual */

#define MSR_P4_TBPU_ESCR0 0x000003c2
#define MSR_P4_TBPU_ESCR1 0x000003c3
#define MSR_P4_TC_ESCR0   0x000003c4
#define MSR_P4_TC_ESCR1   0x000003c5
#define MSR_P4_U2L_ESCR0  0x000003b0
#define MSR_P4_U2L_ESCR1  0x000003b1

/* Netburst (P4) last-branch recording */
#define MSR_P4_LER_FROM_LIP           0x000001d7
#define MSR_P4_LER_TO_LIP             0x000001d8
#define MSR_P4_LASTBRANCH_TOS         0x000001da
#define MSR_P4_LASTBRANCH_0           0x000001db
#define NUM_MSR_P4_LASTBRANCH         4
#define MSR_P4_LASTBRANCH_0_FROM_LIP  0x00000680
#define MSR_P4_LASTBRANCH_0_TO_LIP    0x000006c0
#define NUM_MSR_P4_LASTBRANCH_FROM_TO 16

/* Core 2 and Atom last-branch recording */
#define MSR_C2_LASTBRANCH_TOS           0x000001c9
#define MSR_C2_LASTBRANCH_0_FROM_IP     0x00000040
#define MSR_C2_LASTBRANCH_0_TO_IP       0x00000060
#define NUM_MSR_C2_LASTBRANCH_FROM_TO   4
#define NUM_MSR_ATOM_LASTBRANCH_FROM_TO 8

/* Nehalem (and newer) last-branch recording */
#define MSR_NHL_LBR_SELECT     0x000001c8
#define MSR_NHL_LASTBRANCH_TOS 0x000001c9

/* Skylake (and newer) last-branch recording */
#define MSR_SKL_LASTBRANCH_0_FROM_IP 0x00000680
#define MSR_SKL_LASTBRANCH_0_TO_IP   0x000006c0
#define MSR_SKL_LASTBRANCH_0_INFO    0x00000dc0
#define NUM_MSR_SKL_LASTBRANCH       32

/* Silvermont (and newer) last-branch recording */
#define MSR_SM_LBR_SELECT     0x000001c8
#define MSR_SM_LASTBRANCH_TOS 0x000001c9

/* Goldmont last-branch recording */
#define MSR_GM_LASTBRANCH_0_FROM_IP   0x00000680
#define MSR_GM_LASTBRANCH_0_TO_IP     0x000006c0
#define NUM_MSR_GM_LASTBRANCH_FROM_TO 32

/* Intel Core-based CPU performance counters */
#define MSR_CORE_PERF_FIXED_CTR0      0x00000309
#define MSR_CORE_PERF_FIXED_CTR1      0x0000030a
#define MSR_CORE_PERF_FIXED_CTR2      0x0000030b
#define MSR_CORE_PERF_FIXED_CTR_CTRL  0x0000038d
#define MSR_CORE_PERF_GLOBAL_STATUS   0x0000038e
#define MSR_CORE_PERF_GLOBAL_CTRL     0x0000038f
#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x00000390

/* Intel cpuid spoofing MSRs */
#define MSR_INTEL_MASK_V1_CPUID1 0x00000478

#define MSR_INTEL_MASK_V2_CPUID1        0x00000130
#define MSR_INTEL_MASK_V2_CPUID80000001 0x00000131

#define MSR_INTEL_MASK_V3_CPUID1        0x00000132
#define MSR_INTEL_MASK_V3_CPUID80000001 0x00000133
#define MSR_INTEL_MASK_V3_CPUIDD_01     0x00000134

/* Intel cpuid faulting MSRs */
#define MSR_INTEL_PLATFORM_INFO           0x000000ce
#define _MSR_PLATFORM_INFO_CPUID_FAULTING 31
#define MSR_PLATFORM_INFO_CPUID_FAULTING  (1ULL << _MSR_PLATFORM_INFO_CPUID_FAULTING)

#define MSR_INTEL_MISC_FEATURES_ENABLES   0x00000140
#define _MSR_MISC_FEATURES_CPUID_FAULTING 0
#define MSR_MISC_FEATURES_CPUID_FAULTING  (1ULL << _MSR_MISC_FEATURES_CPUID_FAULTING)

#define MSR_CC6_DEMOTION_POLICY_CONFIG 0x00000668
#define MSR_MC6_DEMOTION_POLICY_CONFIG 0x00000669

/* Interrupt Response Limit */
#define MSR_PKGC3_IRTL  0x0000060a
#define MSR_PKGC6_IRTL  0x0000060b
#define MSR_PKGC7_IRTL  0x0000060c
#define MSR_PKGC8_IRTL  0x00000633
#define MSR_PKGC9_IRTL  0x00000634
#define MSR_PKGC10_IRTL 0x00000635

#endif /* __ASM_MSR_INDEX_H */
