Commit aca53be3 authored by Beata Michalska's avatar Beata Michalska Committed by Peter Maydell
Browse files

target/arm: kvm: Inject events at the last stage of sync



KVM_SET_VCPU_EVENTS might actually lead to vcpu registers being modified.
As such this should be the last step of sync to avoid potential overwriting
of whatever changes KVM might have done.

Signed-off-by: default avatarBeata Michalska <beata.michalska@linaro.org>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Message-id: 20200312003401.29017-2-beata.michalska@linaro.org
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent 6785aee0
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -409,17 +409,22 @@ int kvm_arch_put_registers(CPUState *cs, int level)
        return ret;
    }

    ret = kvm_put_vcpu_events(cpu);
    if (ret) {
        return ret;
    }

    write_cpustate_to_list(cpu, true);

    if (!write_list_to_kvmstate(cpu, level)) {
        return EINVAL;
    }

    /*
     * Setting VCPU events should be triggered after syncing the registers
     * to avoid overwriting potential changes made by KVM upon calling
     * KVM_SET_VCPU_EVENTS ioctl
     */
    ret = kvm_put_vcpu_events(cpu);
    if (ret) {
        return ret;
    }

    kvm_arm_sync_mpstate_to_kvm(cpu);

    return ret;
+10 −5
Original line number Diff line number Diff line
@@ -1094,17 +1094,22 @@ int kvm_arch_put_registers(CPUState *cs, int level)
        return ret;
    }

    ret = kvm_put_vcpu_events(cpu);
    if (ret) {
        return ret;
    }

    write_cpustate_to_list(cpu, true);

    if (!write_list_to_kvmstate(cpu, level)) {
        return -EINVAL;
    }

   /*
    * Setting VCPU events should be triggered after syncing the registers
    * to avoid overwriting potential changes made by KVM upon calling
    * KVM_SET_VCPU_EVENTS ioctl
    */
    ret = kvm_put_vcpu_events(cpu);
    if (ret) {
        return ret;
    }

    kvm_arm_sync_mpstate_to_kvm(cpu);

    return ret;