• Michael Roth's avatar
    KVM: PPC: Book3S HV: Fix H_CEDE return code for nested guests · 1f50cc17
    Michael Roth authored
    The h_cede_tm kvm-unit-test currently fails when run inside an L1 guest
    via the guest/nested hypervisor.
    
      ./run-tests.sh -v
      ...
      TESTNAME=h_cede_tm TIMEOUT=90s ACCEL= ./powerpc/run powerpc/tm.elf -smp 2,threads=2 -machine cap-htm=on -append "h_cede_tm"
      FAIL h_cede_tm (2 tests, 1 unexpected failures)
    
    While the test relates to transactional memory instructions, the actual
    failure is due to the return code of the H_CEDE hypercall, which is
    reported as 224 instead of 0. This happens even when no TM instructions
    are issued.
    
    224 is the value placed in r3 to execute a hypercall for H_CEDE, and r3
    is where the caller expects the return code to be placed upon return.
    
    In the case of guest running under a nested hypervisor, issuing H_CEDE
    causes a return from H_ENTER_NESTED. In this case H_CEDE is
    specially-handled immediately rather than later in
    kvmppc_pseries_do_hcall() as with most other hcalls, but we forget to
    set the return code for the caller, hence why kvm-unit-test sees the
    224 return code and reports an error.
    
    Guest kernels generally don't check the return value of H_CEDE, so
    that likely explains why this hasn't caused issues outside of
    kvm-unit-tests so far.
    
    Fix this by setting r3 to 0 after we finish processing the H_CEDE.
    
    RHBZ: 1778556
    
    Fixes: 4bad7779 ("KVM: PPC: Book3S HV: Handle hypercalls correctly when nested")
    Cc: linuxppc-dev@ozlabs.org
    Cc: David Gibson <david@gibson.dropbear.id.au>
    Cc: Paul Mackerras <paulus@ozlabs.org>
    Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
    Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    1f50cc17
book3s_hv.c 147 KB