lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <21267ef6-6fcf-2eed-a3da-2782d1e7013a@linux.intel.com>
Date: Fri, 6 Sep 2024 13:12:58 +0300 (EEST)
From: Ilpo Järvinen <ilpo.jarvinen@...ux.intel.com>
To: Shuah Khan <skhan@...uxfoundation.org>
cc: shuah@...nel.org, fenghua.yu@...el.com, 
    Reinette Chatre <reinette.chatre@...el.com>, usama.anjum@...labora.com, 
    linux-kselftest@...r.kernel.org, LKML <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH] selftests:resctrl: Fix build failure on archs without
 __cpuid_count()

On Thu, 5 Sep 2024, Shuah Khan wrote:

> When resctrl is built on architectures without __cpuid_count()
> support, build fails. resctrl uses __cpuid_count() defined in
> kselftest.h.
> 
> Even though the problem is seen while building resctrl on aarch64,
> this error can be seen on any platform that doesn't support CPUID.
> 
> CPUID is a x86/x86-64 feature and code paths with CPUID asm commands
> will fail to build on all other architectures.
> 
> All others tests call __cpuid_count() do so from x86/x86_64 code paths
> when _i386__ or __x86_64__ are defined. resctrl is an exception.
> 
> Fix the problem by defining __cpuid_count() only when __i386__ or
> __x86_64__ are defined in kselftest.h and changing resctrl to call
> __cpuid_count() only when __i386__ or __x86_64__ are defined.
> 
> 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:326:6:
> ../kselftest.h:74:9: error: impossible constraint in ‘asm’
>    74 |         __asm__ __volatile__ ("cpuid\n\t"                               \
>       |         ^~~~~~~
> cat_test.c:304:17: note: in expansion of macro ‘__cpuid_count’
>   304 |                 __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:306:17: note: in expansion of macro ‘__cpuid_count’
>   306 |                 __cpuid_count(0x10, 2, eax, ebx, ecx, edx);
> 
> Reported-by: Muhammad Usama Anjum <usama.anjum@...labora.com>
> Reported-by: Ilpo Järvinen <ilpo.jarvinen@...ux.intel.com>
> Signed-off-by: Shuah Khan <skhan@...uxfoundation.org>

When the small things from Muhammad and Reinette addressed, this seems 
okay.

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@...ux.intel.com>

Thanks for the solution.


I'm still left to wonder if the x86 selftest is supposed to clobber 
CFLAGS? It seems that problem is orthogonal to this cpuid/resctrl problem.
I mean this question from the perspective of coherency in the entire 
kselftest framework, lib.mk seems to want to adjust CFLAGS but those
changes will get clobbered in the case of x86 selftest.

-- 
 i.

> ---
>  tools/testing/selftests/kselftest.h        | 2 ++
>  tools/testing/selftests/resctrl/cat_test.c | 6 ++++--
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
> index b8967b6e29d5..e195ec156859 100644
> --- a/tools/testing/selftests/kselftest.h
> +++ b/tools/testing/selftests/kselftest.h
> @@ -61,6 +61,7 @@
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
>  #endif
>  
> +#if defined(__i386__) || defined(__x86_64__) /* arch */
>  /*
>   * gcc cpuid.h provides __cpuid_count() since v4.4.
>   * Clang/LLVM cpuid.h provides  __cpuid_count() since v3.4.0.
> @@ -75,6 +76,7 @@
>  			      : "=a" (a), "=b" (b), "=c" (c), "=d" (d)	\
>  			      : "0" (level), "2" (count))
>  #endif
> +#endif /* end arch */
>  
>  /* define kselftest exit codes */
>  #define KSFT_PASS  0
> diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
> index 742782438ca3..ae3f0fa5390b 100644
> --- a/tools/testing/selftests/resctrl/cat_test.c
> +++ b/tools/testing/selftests/resctrl/cat_test.c
> @@ -290,12 +290,12 @@ static int cat_run_test(const struct resctrl_test *test, const struct user_param
>  
>  static bool arch_supports_noncont_cat(const struct resctrl_test *test)
>  {
> -	unsigned int eax, ebx, ecx, edx;
> -
>  	/* AMD always supports non-contiguous CBM. */
>  	if (get_vendor() == ARCH_AMD)
>  		return true;
>  
> +#if defined(__i386__) || defined(__x86_64__) /* arch */
> +	unsigned int eax, ebx, ecx, edx;
>  	/* Intel support for non-contiguous CBM needs to be discovered. */
>  	if (!strcmp(test->resource, "L3"))
>  		__cpuid_count(0x10, 1, eax, ebx, ecx, edx);
> @@ -305,6 +305,8 @@ static bool arch_supports_noncont_cat(const struct resctrl_test *test)
>  		return false;
>  
>  	return ((ecx >> 3) & 1);
> +#endif /* end arch */
> +	return false;
>  }
>  
>  static int noncont_cat_run_test(const struct resctrl_test *test,
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ