Thread (18 messages) 18 messages, 4 authors, 2021-09-29

Re: [RFC PATCH 3/3] nSVM: use svm->nested.save to load vmcb12 registers and avoid TOC/TOU races

From: Maxim Levitsky <hidden>
Date: 2021-09-14 09:35:07
Also in: lkml

On Tue, 2021-09-14 at 11:24 +0200, Emanuele Giuseppe Esposito wrote:
On 14/09/2021 11:12, Maxim Levitsky wrote:
quoted
On Tue, 2021-09-14 at 12:02 +0300, Maxim Levitsky wrote:
quoted
On Tue, 2021-09-14 at 10:20 +0200, Emanuele Giuseppe Esposito wrote:
quoted
On 12/09/2021 12:42, Maxim Levitsky wrote:
quoted
quoted
   
-	if (!nested_vmcb_valid_sregs(vcpu, &vmcb12->save) ||
+	if (!nested_vmcb_valid_sregs(vcpu, &svm->nested.save) ||
   	    !nested_vmcb_check_controls(vcpu, &svm->nested.ctl)) {
If you use a different struct for the copied fields, then it makes
sense IMHO to drop the 'control' parameter from nested_vmcb_check_controls,
and just use the svm->nested.save there directly.
Ok, what you say in patch 2 makes sense to me. I can create a new struct
vmcb_save_area_cached, but I need to keep nested.ctl because 1) it is
used also elsewhere, and different fields from the one checked here are
read/set and 2) using another structure (or the same
Yes, keep nested.ctl, since vast majority of the fields are copied I think.
But actually that you mention it, I'll say why not to create vmcb_control_area_cached
as well indeed and change the type of svm->nested.save to it. (in a separate patch)

I see what you mean that we modify it a bit (but we shoudn't to be honest) and such, but
all of this can be fixed.
So basically you are proposing:

struct svm_nested_state {
	...
	struct vmcb_control_area ctl; // we need this because it is used 
everywhere, I think
	struct vmcb_control_area_cached ctl_cached;
	struct vmcb_save_area_cached save_cached;
	...
}

and then

if (!nested_vmcb_valid_sregs(vcpu, &svm->nested.save_cached) ||
     !nested_vmcb_check_controls(vcpu, &svm->nested.ctl_cached)) {

like that?

Or do you want to delete nested.ctl completely and just keep the fields 
actually used in ctl_cached?

I would do it this way:

struct svm_nested_state {
        ...
	/* cached fields from the vmcb12 */
	struct  vmcb_control_area_cached ctl;
	struct  vmcb_save_area_cached save;
        ...
};


Best regards,
     Maxim Levitsky

Also, note that as I am trying to use vmcb_save_area_cached, it is worth 
noticing that nested_vmcb_valid_sregs() is also used in 
svm_set_nested_state(), so it requires some additional little changes.

Thank you,
Emanuele
quoted
The advantage of having vmcb_control_area_cached is that it becomes impossible to use
by mistake a non copied field from the guest.

It would also emphasize that this stuff came from the guest and should be treated as
a toxic waste.

Note again that this should be done if we agree as a separate patch.
quoted
Best regards,
	Maxim Levitsky

quoted
vmcb_save_area_cached) in its place would just duplicate the same fields
of nested.ctl, creating even more confusion and possible inconsistency.

Let me know if you disagree.

Thank you,
Emanuele
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help