Re: [RFC PATCH 3/3] kselftest: Provide __cpuid_count() stub on non-x86 archs
From: Muhammad Usama Anjum
Date: Thu Aug 22 2024 - 00:50:41 EST
On 8/13/24 3:45 PM, Ilpo Järvinen wrote:
> Building resctrl selftest fails on ARM because it uses __cpuid_count()
> that fails the build with error:
>
> CC resctrl_tests
> In file included from resctrl.h:24,
> from cat_test.c:11:
> In function 'arch_supports_noncont_cat',
> inlined from 'noncont_cat_run_test' at cat_test.c:323:6:
> ../kselftest.h:74:9: error: impossible constraint in 'asm'
> 74 | __asm__ __volatile__ ("cpuid\n\t"
> \
> | ^~~~~~~
> cat_test.c:301:17: note: in expansion of macro '__cpuid_count'
> 301 | __cpuid_count(0x10, 1, eax, ebx, ecx, edx);
> | ^~~~~~~~~~~~~
> ../kselftest.h:74:9: error: impossible constraint in 'asm'
> 74 | __asm__ __volatile__ ("cpuid\n\t"
> \
> | ^~~~~~~
> cat_test.c:303:17: note: in expansion of macro '__cpuid_count'
> 303 | __cpuid_count(0x10, 2, eax, ebx, ecx, edx);
> | ^~~~~~~~~~~~~
>
> The resctrl selftest would run that code only on Intel CPUs but
> as is, the code cannot be build at all.
>
> Provide an empty stub for __cpuid_count() if it is not supported
> to allow build to succeed.
>
> Reported-by: Muhammad Usama Anjum <usama.anjum@xxxxxxxxxxxxx>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
Reviewed-by: Muhammad Usama Anjum <usama.anjum@xxxxxxxxxxxxx>
Tested-by: Muhammad Usama Anjum <usama.anjum@xxxxxxxxxxxxx>
> ---
> tools/testing/selftests/kselftest.h | 6 ++++++
> tools/testing/selftests/lib.mk | 4 ++++
> 2 files changed, 10 insertions(+)
>
> diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
> index b8967b6e29d5..71593add1b39 100644
> --- a/tools/testing/selftests/kselftest.h
> +++ b/tools/testing/selftests/kselftest.h
> @@ -70,10 +70,16 @@
> * have __cpuid_count().
> */
> #ifndef __cpuid_count
> +#ifdef HAVE_CPUID
> #define __cpuid_count(level, count, a, b, c, d) \
> __asm__ __volatile__ ("cpuid\n\t" \
> : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
> : "0" (level), "2" (count))
> +#else
> +#define __cpuid_count(level, count, a, b, c, d) do { \
> + (void)a; (void)b; (void)c; (void)d; \
> +} while (0)
> +#endif
> #endif
>
> /* define kselftest exit codes */
> diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
> index d6edcfcb5be8..236db9b24037 100644
> --- a/tools/testing/selftests/lib.mk
> +++ b/tools/testing/selftests/lib.mk
> @@ -199,6 +199,10 @@ clean: $(if $(TEST_GEN_MODS_DIR),clean_mods_dir)
> # Build with _GNU_SOURCE by default
> CFLAGS += -D_GNU_SOURCE=
>
> +ifeq ($(ARCH),$(filter $(ARCH),x86 x86_64))
> +CFLAGS += -DHAVE_CPUID=
> +endif
> +
> # Enables to extend CFLAGS and LDFLAGS from command line, e.g.
> # make USERCFLAGS=-Werror USERLDFLAGS=-static
> CFLAGS += $(USERCFLAGS)
--
BR,
Muhammad Usama Anjum