|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 01/17] x86/hvm: simplify hvmemul_do_io()
>>> On 11.06.15 at 17:42, <paul.durrant@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -51,41 +51,23 @@ static void hvmtrace_io_assist(int is_mmio, ioreq_t *p)
> }
>
> static int hvmemul_do_io(
> - int is_mmio, paddr_t addr, unsigned long *reps, int size,
> - paddr_t ram_gpa, int dir, int df, void *p_data)
> + int is_mmio, paddr_t addr, unsigned long *reps, unsigned int size,
> + uint8_t dir, bool_t df, bool_t data_is_addr, uint64_t data)
is_mmio surely can become bool_t too?
> {
> struct vcpu *curr = current;
> - struct hvm_vcpu_io *vio;
> + struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
> ioreq_t p = {
> .type = is_mmio ? IOREQ_TYPE_COPY : IOREQ_TYPE_PIO,
> .addr = addr,
> .size = size,
> .dir = dir,
> .df = df,
> - .data = ram_gpa,
> - .data_is_ptr = (p_data == NULL),
> + .data = data,
> + .data_is_ptr = data_is_addr, /* ioreq_t field name is misleading */
> };
> - unsigned long ram_gfn = paddr_to_pfn(ram_gpa);
> - p2m_type_t p2mt;
> - struct page_info *ram_page;
> + void *p_data = (void *)data;
While presumably compiling fine, casting uint64_t to a pointer looks
bogus without an intermediate cast to (unsigned) long or (u)intptr_t.
> @@ -190,7 +141,12 @@ static int hvmemul_do_io(
> p.count = *reps;
>
> if ( dir == IOREQ_WRITE )
> + {
> + if ( !data_is_addr )
> + memcpy(&p.data, p_data, size);
> +
> hvmtrace_io_assist(is_mmio, &p);
> + }
Why would you need to do this _only_ here (i.e. either not at all,
or not just for tracing purposes)? Or is this just to _restore_ the
original value for tracing (in which case the question would be
whether it indeed can get modified)?
> -int hvmemul_do_pio(
> - unsigned long port, unsigned long *reps, int size,
> - paddr_t ram_gpa, int dir, int df, void *p_data)
> +int hvmemul_do_io_buffer(
static?
> + bool_t is_mmio, paddr_t addr, unsigned long *reps, unsigned int size,
> + uint8_t dir, bool_t df, uint8_t *buffer)
> {
> - return hvmemul_do_io(0, port, reps, size, ram_gpa, dir, df, p_data);
> + int rc;
> +
> + BUG_ON(buffer == NULL);
> +
> + rc = hvmemul_do_io(is_mmio, addr, reps, size, dir, df, 0,
> + (uint64_t)buffer);
Same remark regarding a cast between uint64_t and a pointer.
> +static int hvmemul_acquire_page(unsigned long gmfn, struct page_info **page)
> +{
> + struct vcpu *v = current;
> + struct domain *d = v->domain;
curr and currd please (albeit I don't see the need for the former as
a local variable).
> +static void hvmemul_release_page(struct page_info *page)
inline?
> +int hvmemul_do_io_addr(
static?
> + bool_t is_mmio, paddr_t addr, unsigned long *reps,
> + unsigned int size, uint8_t dir, bool_t df, paddr_t ram_gpa)
> +{
> + struct page_info *ram_page;
> + int rc;
> +
> + rc = hvmemul_acquire_page(paddr_to_pfn(ram_gpa), &ram_page);
> + if ( rc != X86EMUL_OKAY )
> + return rc;
> +
> + rc = hvmemul_do_io(is_mmio, addr, reps, size, dir, df, 1,
> + (uint64_t)ram_gpa);
Pointless cast.
> +/*
> + * Perform I/O between <port> and <buffer>. <dir> indicates the
> + * direction: IOREQ_READ means a read from <port> to <buffer> and
> + * IOREQ_WRITE means a write from <buffer> to <port>. Each access has
> + * width <size> and up to *<reps> accesses will be performed. If
> + * X86EMUL_OKAY is returned then <reps> will be updated with the number
> + * of accesses actually performed.
> + *
> + * NOTE: If *<reps> is greater than 1, each access will use the
> + * <buffer> pointer; there is no implicit interation over a
> + * block of memory starting at <buffer>.
> + */
> +int hvmemul_do_pio_buffer(uint16_t port,
> + unsigned long *reps,
Considering the comment - can't you instead drop the reps parameter
here then?
> @@ -1142,7 +1236,8 @@ static int hvmemul_read_io(
> {
> unsigned long reps = 1;
> *val = 0;
> - return hvmemul_do_pio(port, &reps, bytes, 0, IOREQ_READ, 0, val);
> + return hvmemul_do_pio_buffer(port, &reps, bytes, IOREQ_READ,
> + (uint8_t *)val);
> }
>
> static int hvmemul_write_io(
> @@ -1152,7 +1247,8 @@ static int hvmemul_write_io(
> struct x86_emulate_ctxt *ctxt)
> {
> unsigned long reps = 1;
> - return hvmemul_do_pio(port, &reps, bytes, 0, IOREQ_WRITE, 0, &val);
> + return hvmemul_do_pio_buffer(port, &reps, bytes, IOREQ_WRITE,
> + (uint8_t *)&val);
To avoid such bogus casts, please have hvmemul_do_pio_buffer()
take void * instead.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |