Messages in this thread | | | Date | Wed, 29 Jun 2011 11:21:28 +0300 | From | Avi Kivity <> | Subject | Re: [PATCH v2 03/22] KVM: x86: fix broken read emulation spans a page boundary |
| |
On 06/22/2011 05:29 PM, Xiao Guangrong wrote: > If the range spans a boundary, the mmio access can be broke, fix it as > write emulation. > > And we already get the guest physical address, so use it to read guest data > directly to avoid walking guest page table again > > Signed-off-by: Xiao Guangrong<xiaoguangrong@cn.fujitsu.com> > --- > arch/x86/kvm/x86.c | 41 ++++++++++++++++++++++++++++++++--------- > 1 files changed, 32 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 0b803f0..eb27be4 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3944,14 +3944,13 @@ out: > } > EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system); > > -static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt, > - unsigned long addr, > - void *val, > - unsigned int bytes, > - struct x86_exception *exception) > +static int emulator_read_emulated_onepage(unsigned long addr, > + void *val, > + unsigned int bytes, > + struct x86_exception *exception, > + struct kvm_vcpu *vcpu) > { > - struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt); > - gpa_t gpa; > + gpa_t gpa; > int handled; > > if (vcpu->mmio_read_completed) { > @@ -3971,8 +3970,7 @@ static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt, > if ((gpa& PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) > goto mmio; > > - if (kvm_read_guest_virt(ctxt, addr, val, bytes, exception) > - == X86EMUL_CONTINUE) > + if (!kvm_read_guest(vcpu->kvm, gpa, val, bytes)) > return X86EMUL_CONTINUE;
This doesn't perform the cpl check.
I suggest dropping this part for now and doing it later.
-- error compiling committee.c: too many arguments to function
| |