On Wed, Jun 16, 2010, Gleb Natapov wrote about "Re: [PATCH 13/24] Implement
VMREAD and VMWRITE":
> On Mon, Jun 14, 2010 at 12:36:02PM +0300, Avi Kivity wrote:
> > vmread doesn't support 64-bit writes to memory outside long mode, so
> > you'll have to truncate the write.
> >
> > I think you'll be better off returning a 32-bit size in
> > vmcs_field_size() in these cases.
> >
> Actually write should be always 32bit long outside IA-32e mode and
> 64bit long in 64 bit mode. Unused bits should be set to zero.
Thanks, good catch. Fixed.
The code now looks like:
u64 field_value;
if (!vmcs12_read_any(vcpu, field, &field_value))
return 0;
/* It's ok to use *_system, because handle_vmread verifies cpl=0 */
kvm_write_guest_virt_system(gva, &field_value,
(is_long_mode(vcpu) ? 8 : 4), vcpu, NULL);
return 1;
with vmcs12_read_any() reading the whatever-length of field into a 64-bit
integer (zero-padding if the field is shorter), and then the write is either
64 or 32 bits depending only on is_long_mode(), not on the field's length.
A write may end up truncating the field, or zero-padding it, as necessary.
--
Nadav Har'El | Wednesday, Aug 4 2010, 24 Av 5770
[email protected] |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |The message above is just this
http://nadav.harel.org.il |signature's way of propagating itself.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html