• Michael Ellerman's avatar
    powerpc/64s: Fix restore of NV GPRs after facility unavailable exception · 595d153d
    Michael Ellerman authored
    Commit 702f0980 ("powerpc/64s/exception: Remove lite interrupt
    return") changed the interrupt return path to not restore non-volatile
    registers by default, and explicitly restore them in paths where it is
    required.
    
    But it missed that the facility unavailable exception can sometimes
    modify user registers, ie. when it does emulation of move from DSCR.
    
    This is seen as a failure of the dscr_sysfs_thread_test:
      test: dscr_sysfs_thread_test
      [cpu 0] User DSCR should be 1 but is 0
      failure: dscr_sysfs_thread_test
    
    So restore non-volatile GPRs after facility unavailable exceptions.
    
    Currently the hypervisor facility unavailable exception is also wired
    up to call facility_unavailable_exception().
    
    In practice we should never take a hypervisor facility unavailable
    exception for the DSCR. On older bare metal systems we set HFSCR_DSCR
    unconditionally in __init_HFSCR, or on newer systems it should be
    enabled via the "data-stream-control-register" device tree CPU
    feature.
    
    Even if it's not, since commit f3c99f97 ("KVM: PPC: Book3S HV:
    Don't access HFSCR, LPIDR or LPCR when running nested"), the KVM code
    has unconditionally set HFSCR_DSCR when running guests.
    
    So we should only get a hypervisor facility unavailable for the DSCR
    if skiboot has disabled the "data-stream-control-register" feature,
    and we are somehow in guest context but not via KVM.
    
    Given all that, it should be unnecessary to add a restore of
    non-volatile GPRs after the hypervisor facility exception, because we
    never expect to hit that path. But equally we may as well add the
    restore, because we never expect to hit that path, and if we ever did,
    at least we would correctly restore the registers to their post
    emulation state.
    
    In future we can split the non-HV and HV facility unavailable handling
    so that there is no emulation in the HV handler, and then remove the
    restore for the HV case.
    
    Fixes: 702f0980 ("powerpc/64s/exception: Remove lite interrupt return")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200526061808.2472279-1-mpe@ellerman.id.au
    595d153d
exceptions-64s.S 85.1 KB