[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 17/17] x86/hvm: track large memory mapped accesses by buffer offset
>>> On 24.06.15 at 13:24, <paul.durrant@xxxxxxxxxx> wrote: > @@ -621,14 +574,41 @@ static int hvmemul_phys_mmio_access( > > for ( ;; ) > { > - rc = hvmemul_do_mmio_buffer(gpa, &one_rep, chunk, dir, 0, > - *buffer); > - if ( rc != X86EMUL_OKAY ) > - break; > + /* Have we already done this chunk? */ > + if ( (*off + chunk) <= vio->mmio_cache[dir].size ) I can see why you would like to get rid of the address check, but I'm afraid you can't: You have to avoid getting mixed up multiple same kind (reads or writes) memory accesses that a single instruction can do. While generally I would assume that secondary accesses (like the I/O bitmap read associated with an OUTS) wouldn't go to MMIO, CMPS with both operands being in MMIO would break even if neither crosses a page boundary (not to think of when the emulator starts supporting the scatter/gather instructions, albeit supporting them will require further changes, or we could choose to do them one element at a time). > + { > + ASSERT(*off + chunk <= vio->mmio_cache[dir].size); I don't see any difference to the if() expression just above. > + if ( dir == IOREQ_READ ) > + memcpy(&buffer[*off], > + &vio->mmio_cache[IOREQ_READ].buffer[*off], > + chunk); > + else > + { > + if ( memcmp(&buffer[*off], "else if" please. > + &vio->mmio_cache[IOREQ_WRITE].buffer[*off], > + chunk) != 0 ) > + domain_crash(curr->domain); > + } > + } > + else > + { > + ASSERT(*off == vio->mmio_cache[dir].size); > + > + rc = hvmemul_do_mmio_buffer(gpa, &one_rep, chunk, dir, 0, > + &buffer[*off]); > + if ( rc != X86EMUL_OKAY ) > + break; > + > + /* Note that we have now done this chunk */ Missing stop. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |