• Paolo Bonzini's avatar
    kvm: selftests: do not use bitfields larger than 32-bits for PTEs · f18b4aeb
    Paolo Bonzini authored
    Red Hat's QE team reported test failure on access_tracking_perf_test:
    
    Testing guest mode: PA-bits:ANY, VA-bits:48,  4K pages
    guest physical test memory offset: 0x3fffbffff000
    
    Populating memory             : 0.684014577s
    Writing to populated memory   : 0.006230175s
    Reading from populated memory : 0.004557805s
    ==== Test Assertion Failure ====
      lib/kvm_util.c:1411: false
      pid=125806 tid=125809 errno=4 - Interrupted system call
         1  0x0000000000402f7c: addr_gpa2hva at kvm_util.c:1411
         2   (inlined by) addr_gpa2hva at kvm_util.c:1405
         3  0x0000000000401f52: lookup_pfn at access_tracking_perf_test.c:98
         4   (inlined by) mark_vcpu_memory_idle at access_tracking_perf_test.c:152
         5   (inlined by) vcpu_thread_main at access_tracking_perf_test.c:232
         6  0x00007fefe9ff81ce: ?? ??:0
         7  0x00007fefe9c64d82: ?? ??:0
      No vm physical memory at 0xffbffff000
    
    I can easily reproduce it with a Intel(R) Xeon(R) CPU E5-2630 with 46 bits
    PA.
    
    It turns out that the address translation for clearing idle page tracking
    returned a wrong result; addr_gva2gpa()'s last step, which is based on
    "pte[index[0]].pfn", did the calculation with 40 bits length and the
    high 12 bits got truncated.  In above case the GPA address to be returned
    should be 0x3fffbffff000 for GVA 0xc0000000, but it got truncated into
    0xffbffff000 and the subsequent gpa2hva lookup failed.
    
    The width of operations on bit fields greater than 32-bit is
    implementation defined, and differs between GCC (which uses the bitfield
    precision) and clang (which uses 64-bit arithmetic), so this is a
    potential minefield.  Remove the bit fields and using manual masking
    instead.
    
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2075036Reported-by: default avatarNana Liu <nanliu@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Tested-by: default avatarPeter Xu <peterx@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f18b4aeb
processor.h 11.8 KB