2023-04-14 10:14:03

by Tony W Wang-oc

[permalink] [raw]
Subject: [PATCH] x86/cpufeatures: extend CPUID leaf 0xc0000001 support for Zhaoxin

Extend CPUID leaf 0xc0000001 to support SM2, SM3, SM4, PARALLAX, TM3,
RNG2, PHE2, RSA.

CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 0] SM2
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 1] SM2_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 4] SM3 SM4
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 5] SM3_EN SM4_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 16] PARALLAX
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 17] PARALLAX_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 20] TM3
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 21] TM3_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 22] RNG2
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 23] RNG2_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 25] PHE2
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 26] PHE2_EN
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 27] RSA
CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 28] RSA_EN

SM2/SM3/SM4 imply the instructions support for Chinese cipher security
algorithm generations 2/3/4.
PARALLAX is the feature of Zhaoxin CPU that automatically adjusts
processors's voltage as a function of temperature.
TM3 is the abbreviation of Thermal Monitor version 3.
RNG2 is the abbreviation of Random Number Generation version 2.
PHE2 is the abbreviation of Padlock Hash Engine version 2.
RSA implies Zhaoxin hardware support for RSA algorithm.

All these features have two relative CPUID bits, one bit implies the
existence of the feature and the other bit with postfix "EN" implies
the availability of this feature. Eg, SM2 implies Zhaoxin CPU have SM2
algorithm support, SM2_EN implies user can use relative instructions
with SM2 algorithm.

Signed-off-by: Tony W Wang-oc <[email protected]>
---
arch/x86/include/asm/cpufeatures.h | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index d7215c8b7923..98f3ac6ec66d 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -145,9 +145,13 @@
#define X86_FEATURE_RDRAND ( 4*32+30) /* RDRAND instruction */
#define X86_FEATURE_HYPERVISOR ( 4*32+31) /* Running on a hypervisor */

-/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */
+/* VIA/Cyrix/Centaur/Zhaoxin-defined CPU features, CPUID level 0xC0000001, word 5 */
+#define X86_FEATURE_SM2 ( 5*32+ 0) /* Chinese cipher security hardware support of SM2 */
+#define X86_FEATURE_SM2_EN ( 5*32+ 1) /* SM2 enabled */
#define X86_FEATURE_XSTORE ( 5*32+ 2) /* "rng" RNG present (xstore) */
#define X86_FEATURE_XSTORE_EN ( 5*32+ 3) /* "rng_en" RNG enabled */
+#define X86_FEATURE_CCS ( 5*32+ 4) /* "sm3 sm4" Chinese cipher security hardware support*/
+#define X86_FEATURE_CCS_EN ( 5*32+ 5) /* "sm3_en sm4_en" sm3 sm4 enabled */
#define X86_FEATURE_XCRYPT ( 5*32+ 6) /* "ace" on-CPU crypto (xcrypt) */
#define X86_FEATURE_XCRYPT_EN ( 5*32+ 7) /* "ace_en" on-CPU crypto enabled */
#define X86_FEATURE_ACE2 ( 5*32+ 8) /* Advanced Cryptography Engine v2 */
@@ -156,6 +160,16 @@
#define X86_FEATURE_PHE_EN ( 5*32+11) /* PHE enabled */
#define X86_FEATURE_PMM ( 5*32+12) /* PadLock Montgomery Multiplier */
#define X86_FEATURE_PMM_EN ( 5*32+13) /* PMM enabled */
+#define X86_FEATURE_PARALLAX ( 5*32+16) /* Parallax auto adjust processor voltage */
+#define X86_FEATURE_PARALLAX_EN ( 5*32+17) /* Parallax auto adjust processor voltage enabled */
+#define X86_FEATURE_TM3 ( 5*32+20) /* Thermal Monitor v3 support */
+#define X86_FEATURE_TM3_EN ( 5*32+21) /* TM3 enabled */
+#define X86_FEATURE_RNG2 ( 5*32+22) /* RNG v2 present */
+#define X86_FEATURE_RNG2_EN ( 5*32+23) /* RNG v2 enabled */
+#define X86_FEATURE_PHE2 ( 5*32+25) /* PHE v2 present */
+#define X86_FEATURE_PHE2_EN ( 5*32+26) /* PHE v2 enabled */
+#define X86_FEATURE_RSA ( 5*32+27) /* RSA hardware support */
+#define X86_FEATURE_RSA_EN ( 5*32+28) /* RSA enabled */

/* More extended AMD flags: CPUID level 0x80000001, ECX, word 6 */
#define X86_FEATURE_LAHF_LM ( 6*32+ 0) /* LAHF/SAHF in long mode */
--
2.17.1


2023-04-14 10:56:28

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/cpufeatures: extend CPUID leaf 0xc0000001 support for Zhaoxin

On Fri, Apr 14, 2023 at 05:53:34PM +0800, Tony W Wang-oc wrote:
> Extend CPUID leaf 0xc0000001 to support SM2, SM3, SM4, PARALLAX, TM3,
> RNG2, PHE2, RSA.
>
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 0] SM2
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 1] SM2_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 4] SM3 SM4
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 5] SM3_EN SM4_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 16] PARALLAX
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 17] PARALLAX_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 20] TM3
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 21] TM3_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 22] RNG2
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 23] RNG2_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 25] PHE2
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 26] PHE2_EN
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 27] RSA
> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 28] RSA_EN

None of those flags are used in code, why do we need this patch?

If you want to dump them on the hardware to know what's set or not,
there's tools/arch/x86/kcpuid/ for that.

> SM2/SM3/SM4 imply the instructions support for Chinese cipher security
> algorithm generations 2/3/4.
> PARALLAX is the feature of Zhaoxin CPU that automatically adjusts
> processors's voltage as a function of temperature.
> TM3 is the abbreviation of Thermal Monitor version 3.
> RNG2 is the abbreviation of Random Number Generation version 2.
> PHE2 is the abbreviation of Padlock Hash Engine version 2.
> RSA implies Zhaoxin hardware support for RSA algorithm.
>
> All these features have two relative CPUID bits, one bit implies the
> existence of the feature and the other bit with postfix "EN" implies
> the availability of this feature.

That's a lot of waste of CPUID bits but that's your decision.

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2023-04-14 13:35:18

by Tony W Wang-oc

[permalink] [raw]
Subject: Re: [PATCH] x86/cpufeatures: extend CPUID leaf 0xc0000001 support for Zhaoxin



On 4/14/23 18:48, Borislav Petkov wrote:
> On Fri, Apr 14, 2023 at 05:53:34PM +0800, Tony W Wang-oc wrote:
>> Extend CPUID leaf 0xc0000001 to support SM2, SM3, SM4, PARALLAX, TM3,
>> RNG2, PHE2, RSA.
>>
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 0] SM2
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 1] SM2_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 4] SM3 SM4
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 5] SM3_EN SM4_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 16] PARALLAX
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 17] PARALLAX_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 20] TM3
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 21] TM3_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 22] RNG2
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 23] RNG2_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 25] PHE2
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 26] PHE2_EN
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 27] RSA
>> CPUID.(EAX=0xc0000001,ECX=0):EDX[bit 28] RSA_EN
>
> None of those flags are used in code, why do we need this patch?
>
The instructions about these flags can be executed at any privilege
level. I think using these flags in kernel mode is a case. This patch
shows the statement of these flags to the user mode explicitly. So users
can see and use these CPU features conveniently.

> If you want to dump them on the hardware to know what's set or not,
> there's tools/arch/x86/kcpuid/ for that.
>
>> SM2/SM3/SM4 imply the instructions support for Chinese cipher security
>> algorithm generations 2/3/4.
>> PARALLAX is the feature of Zhaoxin CPU that automatically adjusts
>> processors's voltage as a function of temperature.
>> TM3 is the abbreviation of Thermal Monitor version 3.
>> RNG2 is the abbreviation of Random Number Generation version 2.
>> PHE2 is the abbreviation of Padlock Hash Engine version 2.
>> RSA implies Zhaoxin hardware support for RSA algorithm.
>>
>> All these features have two relative CPUID bits, one bit implies the
>> existence of the feature and the other bit with postfix "EN" implies
>> the availability of this feature.
>
> That's a lot of waste of CPUID bits but that's your decision.
>
Sorry about that.
This implementation aimed to control or statement these features
independently.

Sincerely
TonyWWangoc

2023-04-14 13:50:13

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/cpufeatures: extend CPUID leaf 0xc0000001 support for Zhaoxin

On Fri, Apr 14, 2023 at 09:14:17PM +0800, Tony W Wang-oc wrote:
> The instructions about these flags can be executed at any privilege
> level. I think using these flags in kernel mode is a case. This patch
> shows the statement of these flags to the user mode explicitly. So users
> can see and use these CPU features conveniently.
>
> > If you want to dump them on the hardware to know what's set or not,
> > there's tools/arch/x86/kcpuid/ for that.

See this here. We have this tool exactly for users who wanna see CPU
features. All CPU features, as a matter of fact.

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette

2023-04-17 02:52:36

by Tony W Wang-oc

[permalink] [raw]
Subject: Re: [PATCH] x86/cpufeatures: extend CPUID leaf 0xc0000001 support for Zhaoxin



On 4/14/23 21:48, Borislav Petkov wrote:
> On Fri, Apr 14, 2023 at 09:14:17PM +0800, Tony W Wang-oc wrote:
>> The instructions about these flags can be executed at any privilege
>> level. I think using these flags in kernel mode is a case. This patch
>> shows the statement of these flags to the user mode explicitly. So users
>> can see and use these CPU features conveniently.
>>
>>> If you want to dump them on the hardware to know what's set or not,
>>> there's tools/arch/x86/kcpuid/ for that.
>
> See this here. We have this tool exactly for users who wanna see CPU
> features. All CPU features, as a matter of fact.
>

Ok, will patch this tool for Zhaoxin extended CPUID leaf.
Will add Zhaoxin CPU features to kernel when they are used by the kernel.

Sincerely
TonyWWangoc