[v3] x86: Detect APX_NCI_NDD_NF
Checks
| Context |
Check |
Description |
| redhat-pt-bot/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
| linaro-tcwg-bot/tcwg_glibc_build--master-arm |
success
|
Build passed
|
| linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 |
success
|
Build passed
|
| redhat-pt-bot/TryBot-32bit |
success
|
Build for i686
|
| linaro-tcwg-bot/tcwg_glibc_check--master-arm |
success
|
Test passed
|
| linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 |
success
|
Test passed
|
Commit Message
Changes in v3:
1. Mark APX_NCI_NDD_NF active after marking APX_F active.
Comments
On 04/09/26 19:32, H.J. Lu wrote:
> Changes in v3:
>
> 1. Mark APX_NCI_NDD_NF active after marking APX_F active.
>
> From 2fd41403506eca2fbc67670ef5c2e6ff0bf107ef Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.tools@gmail.com>
> Date: Mon, 31 Aug 2026 07:21:12 +0800
> Subject: [PATCH v3] x86: Detect APX_NCI_NDD_NF
>
> Detect APX_NCI_NDD_NF specified in Intel APX specification published in
> January 2026:
>
> https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
>
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
This version looks ok to me, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> manual/platform.texi | 5 +++++
> sysdeps/x86/bits/platform/x86.h | 9 ++++++++-
> sysdeps/x86/cpu-features.c | 13 +++++++++++++
> sysdeps/x86/include/cpu-features.h | 17 ++++++++++++++++-
> sysdeps/x86/tst-get-cpu-features.c | 2 ++
> 5 files changed, 44 insertions(+), 2 deletions(-)
>
> diff --git a/manual/platform.texi b/manual/platform.texi
> index cb89e4432d..011d3501fb 100644
> --- a/manual/platform.texi
> +++ b/manual/platform.texi
> @@ -217,6 +217,11 @@ The supported processor features are:
> @item
> @code{APX_F} -- The APX instruction extensions.
>
> +@item
> +@code{APX_NCI_NDD_NF} -- The instruction extensions with APX new
> +conditional instructions (NCI), explicit new data destination (NDD)
> +controls, and explicit flags suppression (NF).
> +
> @item
> @code{ARCH_CAPABILITIES} -- IA32_ARCH_CAPABILITIES MSR.
>
> diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
> index c646e36b28..7b81a07465 100644
> --- a/sysdeps/x86/bits/platform/x86.h
> +++ b/sysdeps/x86/bits/platform/x86.h
> @@ -32,7 +32,8 @@ enum
> CPUID_INDEX_19,
> CPUID_INDEX_14_ECX_0,
> CPUID_INDEX_24_ECX_0,
> - CPUID_INDEX_24_ECX_1
> + CPUID_INDEX_24_ECX_1,
> + CPUID_INDEX_29_ECX_0
> };
>
> struct cpuid_feature
> @@ -345,4 +346,10 @@ enum
>
> x86_cpu_AVX10_V1_AUX = x86_cpu_index_24_ecx_1_ecx + 2,
> x86_cpu_AVX10_V2_AUX = x86_cpu_index_24_ecx_1_ecx + 3,
> +
> + x86_cpu_index_29_ecx_0_ebx
> + = (CPUID_INDEX_29_ECX_0 * 8 * 4 * sizeof (unsigned int)
> + + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
> +
> + x86_cpu_APX_NCI_NDD_NF = x86_cpu_index_29_ecx_0_ebx,
> };
> diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
> index 46b42c4057..ffc546e355 100644
> --- a/sysdeps/x86/cpu-features.c
> +++ b/sysdeps/x86/cpu-features.c
> @@ -389,6 +389,19 @@ update_active (struct cpu_features *cpu_features)
> }
> }
> }
> +
> + if (cpu_features->basic.max_cpuid >= 0x29)
> + {
> + __cpuid_count
> + (0x29, 0,
> + cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.eax,
> + cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ebx,
> + cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ecx,
> + cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.edx);
> +
> + if (CPU_FEATURE_ACTIVE_P (cpu_features, APX_F))
> + CPU_FEATURE_SET_ACTIVE (cpu_features, APX_NCI_NDD_NF);
> + }
> }
>
> /* Determine if PKU is usable. */
> diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h
> index ec9076e261..bb632d8ce1 100644
> --- a/sysdeps/x86/include/cpu-features.h
> +++ b/sysdeps/x86/include/cpu-features.h
> @@ -29,7 +29,7 @@
>
> enum
> {
> - CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_1 + 1
> + CPUID_INDEX_MAX = CPUID_INDEX_29_ECX_0 + 1
> };
>
> enum
> @@ -348,6 +348,11 @@ enum
> #define bit_cpu_AVX10_V1_AUX (1u << 2)
> #define bit_cpu_AVX10_V2_AUX (1u << 3)
>
> +/* CPUID_INDEX_29_ECX_0. */
> +
> +/* EBX. */
> +#define bit_cpu_APX_NCI_NDD_NF (1u << 0)
> +
> /* CPUID_INDEX_1. */
>
> /* ECX. */
> @@ -610,6 +615,11 @@ enum
> #define index_AVX10_V1_AUX CPUID_INDEX_24_ECX_1
> #define index_AVX10_V2_AUX CPUID_INDEX_24_ECX_1
>
> +/* CPUID_INDEX_29_ECX_0. */
> +
> +/* EBX. */
> +#define index_cpu_APX_NCI_NDD_NF CPUID_INDEX_29_ECX_0
> +
> /* CPUID_INDEX_1. */
>
> /* ECX. */
> @@ -872,6 +882,11 @@ enum
> #define reg_AVX10_V1_AUX ecx
> #define reg_AVX10_V2_AUX ecx
>
> +/* CPUID_INDEX_29_ECX_0. */
> +
> +/* EBX. */
> +#define reg_APX_NCI_NDD_NF ebx
> +
> /* PREFERRED_FEATURE_INDEX_1. First define the bitindex values
> sequentially, then define the bit_arch* and index_arch_* lookup
> constants. */
> diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
> index c6af1793fe..83c5cbc29e 100644
> --- a/sysdeps/x86/tst-get-cpu-features.c
> +++ b/sysdeps/x86/tst-get-cpu-features.c
> @@ -224,6 +224,7 @@ do_test (void)
> CHECK_CPU_FEATURE_PRESENT (AESKLE);
> CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
> CHECK_CPU_FEATURE_PRESENT (PTWRITE);
> + CHECK_CPU_FEATURE_PRESENT (APX_NCI_NDD_NF);
>
> printf ("Possible CPU features:\n");
> CHECK_CPU_FEATURE_ACTIVE (SSE3);
> @@ -397,6 +398,7 @@ do_test (void)
> CHECK_CPU_FEATURE_ACTIVE (AESKLE);
> CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
> CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
> + CHECK_CPU_FEATURE_ACTIVE (APX_NCI_NDD_NF);
>
> unsigned int version = x86_get_avx10_version ();
> printf ("AVX10 version: %d\n", version);
> --
> 2.55.0
>
From 2fd41403506eca2fbc67670ef5c2e6ff0bf107ef Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Mon, 31 Aug 2026 07:21:12 +0800
Subject: [PATCH v3] x86: Detect APX_NCI_NDD_NF
Detect APX_NCI_NDD_NF specified in Intel APX specification published in
January 2026:
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
manual/platform.texi | 5 +++++
sysdeps/x86/bits/platform/x86.h | 9 ++++++++-
sysdeps/x86/cpu-features.c | 13 +++++++++++++
sysdeps/x86/include/cpu-features.h | 17 ++++++++++++++++-
sysdeps/x86/tst-get-cpu-features.c | 2 ++
5 files changed, 44 insertions(+), 2 deletions(-)
@@ -217,6 +217,11 @@ The supported processor features are:
@item
@code{APX_F} -- The APX instruction extensions.
+@item
+@code{APX_NCI_NDD_NF} -- The instruction extensions with APX new
+conditional instructions (NCI), explicit new data destination (NDD)
+controls, and explicit flags suppression (NF).
+
@item
@code{ARCH_CAPABILITIES} -- IA32_ARCH_CAPABILITIES MSR.
@@ -32,7 +32,8 @@ enum
CPUID_INDEX_19,
CPUID_INDEX_14_ECX_0,
CPUID_INDEX_24_ECX_0,
- CPUID_INDEX_24_ECX_1
+ CPUID_INDEX_24_ECX_1,
+ CPUID_INDEX_29_ECX_0
};
struct cpuid_feature
@@ -345,4 +346,10 @@ enum
x86_cpu_AVX10_V1_AUX = x86_cpu_index_24_ecx_1_ecx + 2,
x86_cpu_AVX10_V2_AUX = x86_cpu_index_24_ecx_1_ecx + 3,
+
+ x86_cpu_index_29_ecx_0_ebx
+ = (CPUID_INDEX_29_ECX_0 * 8 * 4 * sizeof (unsigned int)
+ + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+ x86_cpu_APX_NCI_NDD_NF = x86_cpu_index_29_ecx_0_ebx,
};
@@ -389,6 +389,19 @@ update_active (struct cpu_features *cpu_features)
}
}
}
+
+ if (cpu_features->basic.max_cpuid >= 0x29)
+ {
+ __cpuid_count
+ (0x29, 0,
+ cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.eax,
+ cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ebx,
+ cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ecx,
+ cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.edx);
+
+ if (CPU_FEATURE_ACTIVE_P (cpu_features, APX_F))
+ CPU_FEATURE_SET_ACTIVE (cpu_features, APX_NCI_NDD_NF);
+ }
}
/* Determine if PKU is usable. */
@@ -29,7 +29,7 @@
enum
{
- CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_1 + 1
+ CPUID_INDEX_MAX = CPUID_INDEX_29_ECX_0 + 1
};
enum
@@ -348,6 +348,11 @@ enum
#define bit_cpu_AVX10_V1_AUX (1u << 2)
#define bit_cpu_AVX10_V2_AUX (1u << 3)
+/* CPUID_INDEX_29_ECX_0. */
+
+/* EBX. */
+#define bit_cpu_APX_NCI_NDD_NF (1u << 0)
+
/* CPUID_INDEX_1. */
/* ECX. */
@@ -610,6 +615,11 @@ enum
#define index_AVX10_V1_AUX CPUID_INDEX_24_ECX_1
#define index_AVX10_V2_AUX CPUID_INDEX_24_ECX_1
+/* CPUID_INDEX_29_ECX_0. */
+
+/* EBX. */
+#define index_cpu_APX_NCI_NDD_NF CPUID_INDEX_29_ECX_0
+
/* CPUID_INDEX_1. */
/* ECX. */
@@ -872,6 +882,11 @@ enum
#define reg_AVX10_V1_AUX ecx
#define reg_AVX10_V2_AUX ecx
+/* CPUID_INDEX_29_ECX_0. */
+
+/* EBX. */
+#define reg_APX_NCI_NDD_NF ebx
+
/* PREFERRED_FEATURE_INDEX_1. First define the bitindex values
sequentially, then define the bit_arch* and index_arch_* lookup
constants. */
@@ -224,6 +224,7 @@ do_test (void)
CHECK_CPU_FEATURE_PRESENT (AESKLE);
CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
CHECK_CPU_FEATURE_PRESENT (PTWRITE);
+ CHECK_CPU_FEATURE_PRESENT (APX_NCI_NDD_NF);
printf ("Possible CPU features:\n");
CHECK_CPU_FEATURE_ACTIVE (SSE3);
@@ -397,6 +398,7 @@ do_test (void)
CHECK_CPU_FEATURE_ACTIVE (AESKLE);
CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
+ CHECK_CPU_FEATURE_ACTIVE (APX_NCI_NDD_NF);
unsigned int version = x86_get_avx10_version ();
printf ("AVX10 version: %d\n", version);
--
2.55.0