Sorry, this is of course a critical fix for all branches that have KVM
support.

Jan

Jan Kiszka wrote:
> KVM_GET_MSR_INDEX_LIST returns -E2BIG when the provided space is too
> small for all MSRs. But this is precisely the error we trigger with the
> initial request in order to obtain that size. Do not fail in that case.
> 
> This caused a subtle corruption of the guest state as MSR_STAR was not
> properly saved/restored. The corruption became visible with latest kvm
> optimizing the MSR updates.
> 
> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
> ---
> 
>  target-i386/kvm.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/target-i386/kvm.c b/target-i386/kvm.c
> index 3b61a7f..88b504c 100644
> --- a/target-i386/kvm.c
> +++ b/target-i386/kvm.c
> @@ -244,9 +244,9 @@ static int kvm_has_msr_star(CPUState *env)
>           * save/restore */
>          msr_list.nmsrs = 0;
>          ret = kvm_ioctl(env->kvm_state, KVM_GET_MSR_INDEX_LIST, &msr_list);
> -        if (ret < 0)
> +        if (ret < 0 && ret != -E2BIG) {
>              return 0;
> -
> +        }
>          /* Old kernel modules had a bug and could write beyond the provided
>             memory. Allocate at least a safe amount of 1K. */
>          kvm_msr_list = qemu_mallocz(MAX(1024, sizeof(msr_list) +
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to