On 23/04/21 17:56, Sean Christopherson wrote:
On Thu, Apr 22, 2021, Krish Sadhukhan wrote:
On 4/22/21 11:01 AM, Sean Christopherson wrote:
offset = svm->nested.ctl.msrpm_base_pa + (p * 4);
if (kvm_vcpu_read_guest(&svm->vcpu, offset, &value, 4)) <- This reads vmcb12
return false;
svm->nested.msrpm[p] = svm->msrpm[p] | value; <- Merge vmcb12's bitmap to KVM's bitmap for L2
...
Getting back to your concern that this patch breaks
nested_svm_vmrun_msrpm(). If L1 passes a valid address in which some bits
in 11:0 are set, the hardware is anyway going to ignore those bits,
irrespective of whether we clear them (before my patch) or pass them as is
(my patch) and therefore what L1 thinks as a valid address will effectively
be an invalid address to the hardware. The only difference my patch makes is
it enables tests to verify hardware behavior. Am missing something ?
See the above snippet where KVM reads the effectively vmcb12->msrpm to merge L1's
desires with KVM's desires. By removing the code that ensures
svm->nested.ctl.msrpm_base_pa is page aligned, the above offset calculation will
be wrong.
In fact the kvm-unit-test you sent was also wrong for this same reason
when it was testing addresses near the end of the physical address space.
Paolo