[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Ping: [PATCH] x86/HVM: fix hvmemul_rep_outs_set_context()
>>> On 23.11.17 at 16:09, <JBeulich@xxxxxxxx> wrote: > There were two issues with this function: Its use of > hvmemul_do_pio_buffer() was wrong (the function deals only with > individual port accesses, not repeated ones, i.e. passing it > "*reps * bytes_per_rep" does not have the intended effect). And it > could have processed a larger set of operations in one go than was > probably intended (limited just by the size that xmalloc() can hand > back). > > By converting to proper use of hvmemul_do_pio_buffer(), no intermediate > buffer is needed at all. As a result a preemption check is being added. > > Also drop unused parameters from the function. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Ping? > --- a/xen/arch/x86/hvm/emulate.c > +++ b/xen/arch/x86/hvm/emulate.c > @@ -1348,28 +1348,41 @@ static int hvmemul_rep_ins( > } > > static int hvmemul_rep_outs_set_context( > - enum x86_segment src_seg, > - unsigned long src_offset, > uint16_t dst_port, > unsigned int bytes_per_rep, > - unsigned long *reps, > - struct x86_emulate_ctxt *ctxt) > + unsigned long *reps) > { > - unsigned int bytes = *reps * bytes_per_rep; > - char *buf; > - int rc; > - > - buf = xmalloc_array(char, bytes); > + const struct arch_vm_event *ev = current->arch.vm_event; > + const uint8_t *ptr; > + unsigned int avail; > + unsigned long done; > + int rc = X86EMUL_OKAY; > > - if ( buf == NULL ) > + ASSERT(bytes_per_rep <= 4); > + if ( !ev ) > return X86EMUL_UNHANDLEABLE; > > - rc = set_context_data(buf, bytes); > + ptr = ev->emul.read.data; > + avail = ev->emul.read.size; > > - if ( rc == X86EMUL_OKAY ) > - rc = hvmemul_do_pio_buffer(dst_port, bytes, IOREQ_WRITE, buf); > + for ( done = 0; done < *reps; ++done ) > + { > + unsigned int size = min(bytes_per_rep, avail); > + uint32_t data = 0; > + > + if ( done && hypercall_preempt_check() ) > + break; > + > + memcpy(&data, ptr, size); > + avail -= size; > + ptr += size; > + > + rc = hvmemul_do_pio_buffer(dst_port, bytes_per_rep, IOREQ_WRITE, > &data); > + if ( rc != X86EMUL_OKAY ) > + break; > + } > > - xfree(buf); > + *reps = done; > > return rc; > } > @@ -1391,8 +1404,7 @@ static int hvmemul_rep_outs( > int rc; > > if ( unlikely(hvmemul_ctxt->set_context) ) > - return hvmemul_rep_outs_set_context(src_seg, src_offset, dst_port, > - bytes_per_rep, reps, ctxt); > + return hvmemul_rep_outs_set_context(dst_port, bytes_per_rep, reps); > > rc = hvmemul_virtual_to_linear( > src_seg, src_offset, bytes_per_rep, reps, hvm_access_read, > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |