On Wed, Feb 07, 2024, Xin Li wrote:
> @@ -725,8 +733,28 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
>               vcpu->arch.exception.injected = false;
>               vcpu->arch.exception.pending = false;
>  
> +             /*
> +              * A #DF is NOT a nested event per its definition, however per
> +              * FRED spec 5.0 Appendix B, its delivery determines the new
> +              * stack level as is done for events occurring when CPL = 0.
> +              */

Similar to my comments about CR2, this is mostly noise.  Unless I'm missing a
patch, KVM is not responsible for emulating the stack level stuff, and so there
is zero reason to mention it, because it's not relevant to the KVM code.  Simply
say that #DF is defined to not be a nested exception.

                /* #DF is NOT a nested event, per its definition. */


> +             vcpu->arch.exception.nested = false;
> +
>               kvm_queue_exception_e(vcpu, DF_VECTOR, 0);
>       } else {
> +             /*
> +              * FRED spec 5.0 Appendix B: delivery of a nested exception
> +              * determines the new stack level as is done for events
> +              * occurring when CPL = 0.
> +              *
> +              * IOW, FRED event delivery of an event encountered in ring 3
> +              * normally uses stack level 0 unconditionally.  However, if
> +              * the event is an exception nested on any earlier event,
> +              * delivery of the nested exception will consult the FRED MSR
> +              * IA32_FRED_STKLVLS to determine which stack level to use.
> +              */

And drop this entirely.  The above does not help the reader understand _why_ KVM
sets nested=true for FRED.  E.g. there's no CPL check here.

IMO, this code is entirely self-explanatory; KVM is quite obviously handling a
back-to-back exceptions, and it doesn't take a big mental leap to grok that FRED
tracks that information by describing the second exception as "nested".

> +             vcpu->arch.exception.nested = kvm_is_fred_enabled(vcpu);
> +
>               /* replace previous exception with a new one in a hope
>                  that instruction re-execution will regenerate lost
>                  exception */

Reply via email to