diff mbox series

x86/features: More AMD features

Message ID 20240318181332.3817631-1-andrew.cooper3@citrix.com (mailing list archive)
State New
Headers show
Series x86/features: More AMD features | expand

Commit Message

Andrew Cooper March 18, 2024, 6:13 p.m. UTC
All of these are informational and require no further logic changes in Xen to
support.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>

I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
name of FAST_REP_SCASB.
---
 tools/misc/xen-cpuid.c                      | 5 +++++
 xen/include/public/arch-x86/cpufeatureset.h | 8 ++++++++
 2 files changed, 13 insertions(+)


base-commit: 62018f08708a5ff6ef8fc8ff2aaaac46e5a60430

Comments

Jan Beulich March 19, 2024, 7:33 a.m. UTC | #1
On 18.03.2024 19:13, Andrew Cooper wrote:
> I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
> name of FAST_REP_SCASB.

With FSRS already used, I guess that's the closest we can get to keep
names for similar features similar.

> --- a/tools/misc/xen-cpuid.c
> +++ b/tools/misc/xen-cpuid.c
> @@ -91,6 +91,7 @@ static const char *const str_e1c[32] =
>      [24] = "perfctr-nb", /* [25] */
>      [26] = "dbx",        [27] = "perftsc",
>      [28] = "pcx-l2i",    [29] = "monitorx",
> +    [30] = "dbext2",
>  };

AMD calls this AddrMaskExt (PM) or AdMskExtn (PPR). I can see where your
different name choice is coming from, yet I still wonder whether we should
try to stay closer where possible.

Jan
Jan Beulich March 19, 2024, 1:11 p.m. UTC | #2
On 19.03.2024 08:33, Jan Beulich wrote:
> On 18.03.2024 19:13, Andrew Cooper wrote:
>> I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
>> name of FAST_REP_SCASB.
> 
> With FSRS already used, I guess that's the closest we can get to keep
> names for similar features similar.
> 
>> --- a/tools/misc/xen-cpuid.c
>> +++ b/tools/misc/xen-cpuid.c
>> @@ -91,6 +91,7 @@ static const char *const str_e1c[32] =
>>      [24] = "perfctr-nb", /* [25] */
>>      [26] = "dbx",        [27] = "perftsc",
>>      [28] = "pcx-l2i",    [29] = "monitorx",
>> +    [30] = "dbext2",
>>  };
> 
> AMD calls this AddrMaskExt (PM) or AdMskExtn (PPR). I can see where your
> different name choice is coming from, yet I still wonder whether we should
> try to stay closer where possible.

Having located the corresponding doc,
Reviewed-by: Jan Beulich <jbeulich@suse.com>
with a slight preference to adjusted names for this one feature.

Jan
Andrew Cooper March 19, 2024, 5:14 p.m. UTC | #3
On 19/03/2024 1:11 pm, Jan Beulich wrote:
> On 19.03.2024 08:33, Jan Beulich wrote:
>> On 18.03.2024 19:13, Andrew Cooper wrote:
>>> I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
>>> name of FAST_REP_SCASB.
>> With FSRS already used, I guess that's the closest we can get to keep
>> names for similar features similar.
>>
>>> --- a/tools/misc/xen-cpuid.c
>>> +++ b/tools/misc/xen-cpuid.c
>>> @@ -91,6 +91,7 @@ static const char *const str_e1c[32] =
>>>      [24] = "perfctr-nb", /* [25] */
>>>      [26] = "dbx",        [27] = "perftsc",
>>>      [28] = "pcx-l2i",    [29] = "monitorx",
>>> +    [30] = "dbext2",
>>>  };
>> AMD calls this AddrMaskExt (PM) or AdMskExtn (PPR). I can see where your
>> different name choice is coming from, yet I still wonder whether we should
>> try to stay closer where possible.
> Having located the corresponding doc,
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
> with a slight preference to adjusted names for this one feature.

Neither are great.  How about "addr-msk-ext" ?

~Andrew
Andrew Cooper March 19, 2024, 5:40 p.m. UTC | #4
On 18/03/2024 6:13 pm, Andrew Cooper wrote:
> All of these are informational and require no further logic changes in Xen to
> support.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Roger Pau Monné <roger.pau@citrix.com>
>
> I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
> name of FAST_REP_SCASB.
> ---
>  tools/misc/xen-cpuid.c                      | 5 +++++
>  xen/include/public/arch-x86/cpufeatureset.h | 8 ++++++++
>  2 files changed, 13 insertions(+)
>
> diff --git a/tools/misc/xen-cpuid.c b/tools/misc/xen-cpuid.c
> index 51efbff579e6..b562ee839d38 100644
> --- a/tools/misc/xen-cpuid.c
> +++ b/tools/misc/xen-cpuid.c
> @@ -91,6 +91,7 @@ static const char *const str_e1c[32] =
>      [24] = "perfctr-nb", /* [25] */
>      [26] = "dbx",        [27] = "perftsc",
>      [28] = "pcx-l2i",    [29] = "monitorx",
> +    [30] = "dbext2",
>  };
>  
>  static const char *const str_7b0[32] =
> @@ -199,11 +200,15 @@ static const char *const str_7a1[32] =
>  
>  static const char *const str_e21a[32] =
>  {
> +    [ 0] = "no-nest-bp",    [ 1] = "fs-gs-ns",
>      [ 2] = "lfence+",
>      [ 6] = "nscb",
>      [ 8] = "auto-ibrs",
> +    [10] = "amd-fsrs",      [11] = "amd-fsrc",
>  
>      /* 16 */                [17] = "cpuid-user-dis",
> +    [18] = "epsf",          [19] = "fsrsc",

It occurs to me that I need this hunk too.

diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
index 25d329ce486f..bf3f9ec01e6e 100755
--- a/xen/tools/gen-cpuid.py
+++ b/xen/tools/gen-cpuid.py
@@ -329,6 +329,10 @@ def crunch_numbers(state):
         # In principle the TSXLDTRK insns could also be considered
independent.
         RTM: [TSXLDTRK],
 
+        # Enhanced Predictive Store-Forwarding is a informational note
on top
+        # of PSF.
+        PSFD: [EPSF],
+
         # The ARCH_CAPS CPUID bit enumerates the availability of the
whole register.
         ARCH_CAPS: list(range(RDCL_NO, RDCL_NO + 64)),
 

To cause EPSF to disappear properly when levelling.

~Andrew
Jan Beulich March 20, 2024, 7:05 a.m. UTC | #5
On 19.03.2024 18:14, Andrew Cooper wrote:
> On 19/03/2024 1:11 pm, Jan Beulich wrote:
>> On 19.03.2024 08:33, Jan Beulich wrote:
>>> On 18.03.2024 19:13, Andrew Cooper wrote:
>>>> I'm not sure about FSRSC as a name, but it definitely beats AMD's longhand
>>>> name of FAST_REP_SCASB.
>>> With FSRS already used, I guess that's the closest we can get to keep
>>> names for similar features similar.
>>>
>>>> --- a/tools/misc/xen-cpuid.c
>>>> +++ b/tools/misc/xen-cpuid.c
>>>> @@ -91,6 +91,7 @@ static const char *const str_e1c[32] =
>>>>      [24] = "perfctr-nb", /* [25] */
>>>>      [26] = "dbx",        [27] = "perftsc",
>>>>      [28] = "pcx-l2i",    [29] = "monitorx",
>>>> +    [30] = "dbext2",
>>>>  };
>>> AMD calls this AddrMaskExt (PM) or AdMskExtn (PPR). I can see where your
>>> different name choice is coming from, yet I still wonder whether we should
>>> try to stay closer where possible.
>> Having located the corresponding doc,
>> Reviewed-by: Jan Beulich <jbeulich@suse.com>
>> with a slight preference to adjusted names for this one feature.
> 
> Neither are great.  How about "addr-msk-ext" ?

I'd be okay with that.

Jan
Jan Beulich March 20, 2024, 8:12 a.m. UTC | #6
On 19.03.2024 18:40, Andrew Cooper wrote:
> It occurs to me that I need this hunk too.
> 
> diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
> index 25d329ce486f..bf3f9ec01e6e 100755
> --- a/xen/tools/gen-cpuid.py
> +++ b/xen/tools/gen-cpuid.py
> @@ -329,6 +329,10 @@ def crunch_numbers(state):
>          # In principle the TSXLDTRK insns could also be considered
> independent.
>          RTM: [TSXLDTRK],
>  
> +        # Enhanced Predictive Store-Forwarding is a informational note
> on top
> +        # of PSF.
> +        PSFD: [EPSF],
> +
>          # The ARCH_CAPS CPUID bit enumerates the availability of the
> whole register.
>          ARCH_CAPS: list(range(RDCL_NO, RDCL_NO + 64)),
>  
> 
> To cause EPSF to disappear properly when levelling.

What exactly is wrong with exposing EPSF when PSFD is not there? (The PPR
I'm looking at has no mention of what exactly the bit means, and hence
whether e.g. it indicates PSFD can be avoided in certain use cases.) When
leveling across a pool, EPSF may need hiding, yes, but that would need to
be a result of admin activity, not by introducing a fake dependency. Just
consider a pool with PSFD supported everywhere, but not EPSF: The admin
would then still need to take action to make sure EPSF is uniformly
invisible to guests.

Jan
Andrew Cooper March 20, 2024, 11:45 a.m. UTC | #7
On 20/03/2024 8:12 am, Jan Beulich wrote:
> On 19.03.2024 18:40, Andrew Cooper wrote:
>> It occurs to me that I need this hunk too.
>>
>> diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
>> index 25d329ce486f..bf3f9ec01e6e 100755
>> --- a/xen/tools/gen-cpuid.py
>> +++ b/xen/tools/gen-cpuid.py
>> @@ -329,6 +329,10 @@ def crunch_numbers(state):
>>          # In principle the TSXLDTRK insns could also be considered
>> independent.
>>          RTM: [TSXLDTRK],
>>  
>> +        # Enhanced Predictive Store-Forwarding is a informational note
>> on top
>> +        # of PSF.
>> +        PSFD: [EPSF],
>> +
>>          # The ARCH_CAPS CPUID bit enumerates the availability of the
>> whole register.
>>          ARCH_CAPS: list(range(RDCL_NO, RDCL_NO + 64)),
>>  
>>
>> To cause EPSF to disappear properly when levelling.
> What exactly is wrong with exposing EPSF when PSFD is not there?

https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/white-papers/security-analysis-of-amd-predictive-store-forwarding.pdf

Final sentence before the conclusion:

"Software can determine the presence of EPSF through CPUID Fn8000_0021
EAX[18]. All processors that support EPSF will also support PSFD."

i.e. you'll never see anything about PSF without having the controls to
turn it off.

~Andrew
Jan Beulich March 20, 2024, 12:51 p.m. UTC | #8
On 20.03.2024 12:45, Andrew Cooper wrote:
> On 20/03/2024 8:12 am, Jan Beulich wrote:
>> On 19.03.2024 18:40, Andrew Cooper wrote:
>>> It occurs to me that I need this hunk too.
>>>
>>> diff --git a/xen/tools/gen-cpuid.py b/xen/tools/gen-cpuid.py
>>> index 25d329ce486f..bf3f9ec01e6e 100755
>>> --- a/xen/tools/gen-cpuid.py
>>> +++ b/xen/tools/gen-cpuid.py
>>> @@ -329,6 +329,10 @@ def crunch_numbers(state):
>>>          # In principle the TSXLDTRK insns could also be considered
>>> independent.
>>>          RTM: [TSXLDTRK],
>>>  
>>> +        # Enhanced Predictive Store-Forwarding is a informational note
>>> on top
>>> +        # of PSF.
>>> +        PSFD: [EPSF],
>>> +
>>>          # The ARCH_CAPS CPUID bit enumerates the availability of the
>>> whole register.
>>>          ARCH_CAPS: list(range(RDCL_NO, RDCL_NO + 64)),
>>>  
>>>
>>> To cause EPSF to disappear properly when levelling.
>> What exactly is wrong with exposing EPSF when PSFD is not there?
> 
> https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/white-papers/security-analysis-of-amd-predictive-store-forwarding.pdf
> 
> Final sentence before the conclusion:
> 
> "Software can determine the presence of EPSF through CPUID Fn8000_0021
> EAX[18]. All processors that support EPSF will also support PSFD."
> 
> i.e. you'll never see anything about PSF without having the controls to
> turn it off.

Ah, I only had an old copy of that. My R-b holds then with that addition.

Jan
diff mbox series

Patch

diff --git a/tools/misc/xen-cpuid.c b/tools/misc/xen-cpuid.c
index 51efbff579e6..b562ee839d38 100644
--- a/tools/misc/xen-cpuid.c
+++ b/tools/misc/xen-cpuid.c
@@ -91,6 +91,7 @@  static const char *const str_e1c[32] =
     [24] = "perfctr-nb", /* [25] */
     [26] = "dbx",        [27] = "perftsc",
     [28] = "pcx-l2i",    [29] = "monitorx",
+    [30] = "dbext2",
 };
 
 static const char *const str_7b0[32] =
@@ -199,11 +200,15 @@  static const char *const str_7a1[32] =
 
 static const char *const str_e21a[32] =
 {
+    [ 0] = "no-nest-bp",    [ 1] = "fs-gs-ns",
     [ 2] = "lfence+",
     [ 6] = "nscb",
     [ 8] = "auto-ibrs",
+    [10] = "amd-fsrs",      [11] = "amd-fsrc",
 
     /* 16 */                [17] = "cpuid-user-dis",
+    [18] = "epsf",          [19] = "fsrsc",
+    [20] = "amd-prefetchi",
 
     /* 26 */                [27] = "sbpb",
     [28] = "ibpb-brtype",   [29] = "srso-no",
diff --git a/xen/include/public/arch-x86/cpufeatureset.h b/xen/include/public/arch-x86/cpufeatureset.h
index eb9f552948be..11287aaabe43 100644
--- a/xen/include/public/arch-x86/cpufeatureset.h
+++ b/xen/include/public/arch-x86/cpufeatureset.h
@@ -168,6 +168,7 @@  XEN_CPUFEATURE(TBM,           3*32+21) /*A  trailing bit manipulations */
 XEN_CPUFEATURE(TOPOEXT,       3*32+22) /*   topology extensions CPUID leafs */
 XEN_CPUFEATURE(DBEXT,         3*32+26) /*A  data breakpoint extension */
 XEN_CPUFEATURE(MONITORX,      3*32+29) /*   MONITOR extension (MONITORX/MWAITX) */
+XEN_CPUFEATURE(DBEXT2,        3*32+30) /*A  Address Mask Extentions */
 
 /* Intel-defined CPU features, CPUID level 0x0000000D:1.eax, word 4 */
 XEN_CPUFEATURE(XSAVEOPT,      4*32+ 0) /*A  XSAVEOPT instruction */
@@ -290,10 +291,17 @@  XEN_CPUFEATURE(WRMSRNS,      10*32+19) /*S  WRMSR Non-Serialising */
 XEN_CPUFEATURE(AVX_IFMA,     10*32+23) /*A  AVX-IFMA Instructions */
 
 /* AMD-defined CPU features, CPUID level 0x80000021.eax, word 11 */
+XEN_CPUFEATURE(NO_NEST_BP,         11*32+ 0) /*A  No Nested Data Breakpoints */
+XEN_CPUFEATURE(FS_GS_NS,           11*32+ 1) /*S  FS/GS base MSRs non-serialising */
 XEN_CPUFEATURE(LFENCE_DISPATCH,    11*32+ 2) /*A  LFENCE always serializing */
 XEN_CPUFEATURE(NSCB,               11*32+ 6) /*A  Null Selector Clears Base (and limit too) */
 XEN_CPUFEATURE(AUTO_IBRS,          11*32+ 8) /*S  Automatic IBRS */
+XEN_CPUFEATURE(AMD_FSRS,           11*32+10) /*A  Fast Short REP STOSB */
+XEN_CPUFEATURE(AMD_FSRC,           11*32+11) /*A  Fast Short REP CMPSB */
 XEN_CPUFEATURE(CPUID_USER_DIS,     11*32+17) /*   CPUID disable for CPL > 0 software */
+XEN_CPUFEATURE(EPSF,               11*32+18) /*A  Enhanced Predictive Store Forwarding */
+XEN_CPUFEATURE(FSRSC,              11*32+19) /*A  Fast Short REP SCASB */
+XEN_CPUFEATURE(AMD_PREFETCHI,      11*32+20) /*A  PREFETCHIT{0,1} Instructions */
 XEN_CPUFEATURE(SBPB,               11*32+27) /*A  Selective Branch Predictor Barrier */
 XEN_CPUFEATURE(IBPB_BRTYPE,        11*32+28) /*A  IBPB flushes Branch Type predictions too */
 XEN_CPUFEATURE(SRSO_NO,            11*32+29) /*A  Hardware not vulenrable to Speculative Return Stack Overflow */