• Paolo Bonzini's avatar
    KVM: SEV-ES: go over the sev_pio_data buffer in multiple passes if needed · 95e16b47
    Paolo Bonzini authored
    The PIO scratch buffer is larger than a single page, and therefore
    it is not possible to copy it in a single step to vcpu->arch/pio_data.
    Bound each call to emulator_pio_in/out to a single page; keep
    track of how many I/O operations are left in vcpu->arch.sev_pio_count,
    so that the operation can be restarted in the complete_userspace_io
    callback.
    
    For OUT, this means that the previous kvm_sev_es_outs implementation
    becomes an iterator of the loop, and we can consume the sev_pio_data
    buffer before leaving to userspace.
    
    For IN, instead, consuming the buffer and decreasing sev_pio_count
    is always done in the complete_userspace_io callback, because that
    is when the memcpy is done into sev_pio_data.
    
    Cc: stable@vger.kernel.org
    Fixes: 7ed9abfe ("KVM: SVM: Support string IO operations for an SEV-ES guest")
    Reported-by: default avatarFelix Wilhelm <fwilhelm@google.com>
    Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    95e16b47
x86.c 326 KB