On 01/12/14 17:15, Andrew Cooper wrote:
> On 01/12/14 14:37, John Haxby wrote:
>> With gcc 4.8.3, compiling xen-detect gives a compilation warning if
>> you're optimising:
>>
>> $ cc -Wall -Os xen-detect.c
>> xen-detect.c: In function ‘check_for_xen’:
>> xen-detect.c:65:9: warning: dereferencing type-punned pointer will break
>> strict-aliasing rules [-Wstrict-aliasing]
>>          *(uint32_t *)(signature + 0) = regs[1];
>>          ^
>>
>> Signed-off-by: John Haxby <john.ha...@oracle.com>
> 
> Why are you compiling without the CFLAGS from the Xen build system?
> 
> We explicitly disable strict alias optimisations, because optimisations
> based upon the aliasing rules in C is mad.  Even when you eliminate all
> the warnings, there are still subtle bugs because the compiler is free
> to assume a lot more than a programmer would typically deem reasonable.

Do you want me to repost the second patch (the actual bug fix one) so
that it doesn't assume the line number changes and whatnot for this one?

jch


> 
> ~Andrew
> 
>> ---
>>  tools/misc/xen-detect.c | 21 ++++++++++-----------
>>  1 file changed, 10 insertions(+), 11 deletions(-)
>>
>> diff --git a/tools/misc/xen-detect.c b/tools/misc/xen-detect.c
>> index 787b5da..19c66d1 100644
>> --- a/tools/misc/xen-detect.c
>> +++ b/tools/misc/xen-detect.c
>> @@ -54,28 +54,27 @@ static void cpuid(uint32_t idx, uint32_t *regs, int 
>> pv_context)
>>  
>>  static int check_for_xen(int pv_context)
>>  {
>> -    uint32_t regs[4];
>> -    char signature[13];
>> +    union
>> +    {
>> +        uint32_t regs[4];
>> +        char signature[17];
>> +    } u;
>>      uint32_t base;
>>  
>>      for ( base = 0x40000000; base < 0x40010000; base += 0x100 )
>>      {
>> -        cpuid(base, regs, pv_context);
>> -
>> -        *(uint32_t *)(signature + 0) = regs[1];
>> -        *(uint32_t *)(signature + 4) = regs[2];
>> -        *(uint32_t *)(signature + 8) = regs[3];
>> -        signature[12] = '\0';
>> +        cpuid(base, u.regs, pv_context);
>> +        u.signature[16] = '\0';
>>  
>> -        if ( !strcmp("XenVMMXenVMM", signature) && (regs[0] >= (base + 2)) )
>> +        if ( !strcmp("XenVMMXenVMM", u.signature+4) && (u.regs[0] >= (base 
>> + 2)) )
>>              goto found;
>>      }
>>  
>>      return 0;
>>  
>>   found:
>> -    cpuid(base + 1, regs, pv_context);
>> -    return regs[0];
>> +    cpuid(base + 1, u.regs, pv_context);
>> +    return u.regs[0];
>>  }
>>  
>>  static jmp_buf sigill_jmp;
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to