[dpdk-dev] [PATCH v5] eal_common_cpuflags: Fix %rbx corruption, and simplify the code

Neil Horman nhorman at tuxdriver.com
Wed Apr 16 12:49:55 CEST 2014


On Wed, Apr 16, 2014 at 08:58:31AM +0000, De Lara Guarch, Pablo wrote:
> Hi Neil,
> 
> 
> 
> >> What was the value of RTE_COMPILE_TIME_CPUFLAGS when you built your library?  If you added defines for flag support that are not tested for yet in the cpu_feature_table, that would be the error you would see I think
> 
> 
> 
> >RTE_COMPILE_TIME_CPUFLAGS= >RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX
> 
> 
> 
> >For gcc_version >=4.6, that value is the same, of course (and all those flags are supported). So it has to be something else...
> 
> 
> 
> Silly me, I just saw what was hapenning. There are two missing brackets in the loop:
> 
> 
> 
> for (i = 0; i < sizeof(compile_time_flags)/sizeof(compile_time_flags[0]); i++) {
> 
> ret = rte_cpu_get_flag_enabled(compile_time_flags[i]);
> 
> 
> 
> if (ret < 0) {
> 
> fprintf(stderr,
> 
>   "ERROR: CPU feature flag lookup failed with error %d\n",
> 
>   ret);
> 
> exit(1);
> 
> }
> 
> if (!ret) {
> 
> fprintf(stderr,
> 
>   "ERROR: This system does not support \"%s\".\n"
> 
>   "Please check that RTE_MACHINE is set correctly.\n",
> 
>   cpu_feature_table[compile_time_flags[i]].name);
> 
> exit(1);
> 
> }
> 
> }
> 
> 
> 
> So, basically, "i" was size of the array +1 after the loop and only the return value was being checked for the last item. Not sure why higher versions of gcc do not catch this.
> 
Oh wow, yes, the if conditionals definately should be checked for each iteration
of the for loop. Good eye.

Still though, seems like a bug in gcc to check the state of the loop index on
exit, when its never used to index the array at that value.  Seems a bit like
this bug:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45180

Thomas I'll send a patch to fix this directly
Neil

> 
> 
> Thanks,
> 
> 
> 
> Pablo de Lara
> 
> DPDK SW Engineer
> 
> 
> 
> --------------------------------------------------------------
> 
> Intel Shannon Limited
> 
> Registered in Ireland
> 
> Registered Office: Collinstown Industrial Park, Leixlip, County Kildare Registered Number: 308263 Business address: Dromore House, East Park, Shannon, Co. Clare
> 
> 
> 
> 
> 
> 
> 


More information about the dev mailing list