On 23/06/2018 01:35, Liran Alon wrote: > + for_each_clear_bit(bit, vmcs12_bitmap + offset, > + nested_vmcs_fields_per_group(vmx)) { You cannot be sure that nested_vmcs_fields_per_group(vmx) <= 64; the index spans bits 1 to 9, so it can be at most 1024. In fact, even hough it is currently the case that it is less than 64, this code already breaks on 32-bit machines since guest interruptibility state is 00004824H for example. Here I think it's much better if we already do the optimization you mention in the cover letter, of computing vmcs_field_to_offset(field) >= 0 && cpu_has_vmcs_field(field) at startup. Then this loop becomes just a word-by-word AND of vmcs12_bitmap with the bitmap you computed at startup; really just a single AND on 64-bit machines and two for 32-bits. Thanks, Paolo > + unsigned long field = base + bit; > + > + if (vmcs_field_to_offset(field) >= 0 && > + cpu_has_vmcs_field(field)) > + val &= ~(1ul << bit); > + } > + > + vmcs02_bitmap[offset] = val;