From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55532) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XYY1O-0006Ew-HY for qemu-devel@nongnu.org; Mon, 29 Sep 2014 06:17:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XYY1K-0002cp-27 for qemu-devel@nongnu.org; Mon, 29 Sep 2014 06:17:34 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:39040) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XYY1J-0002Zc-Tp for qemu-devel@nongnu.org; Mon, 29 Sep 2014 06:17:29 -0400 Date: Mon, 29 Sep 2014 11:15:18 +0100 From: Stefano Stabellini In-Reply-To: <1411757235-29128-2-git-send-email-dslutz@verizon.com> Message-ID: References: <1411757235-29128-1-git-send-email-dslutz@verizon.com> <1411757235-29128-2-git-send-email-dslutz@verizon.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Subject: Re: [Qemu-devel] [PATCH 1/1] xen-hvm.c: Add support for Xen access to vmport List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Don Slutz Cc: xen-devel@lists.xensource.com, Marcel Apfelbaum , Markus Armbruster , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Alexander Graf , Anthony Liguori , =?UTF-8?Q?Andreas_F=C3=A4rber?= , Stefano Stabellini On Fri, 26 Sep 2014, Don Slutz wrote: > This adds synchronisation of the vcpu registers > between Xen and QEMU. > > Signed-off-by: Don Slutz [...] > diff --git a/xen-hvm.c b/xen-hvm.c > index 05e522c..e1274bb 100644 > --- a/xen-hvm.c > +++ b/xen-hvm.c > @@ -857,14 +857,48 @@ static void cpu_handle_ioreq(void *opaque) > > handle_buffered_iopage(state); > if (req) { > +#ifdef IOREQ_TYPE_VMWARE_PORT Is there any reason to #ifdef this code? Couldn't we just always build it in QEMU? > + if (req->type == IOREQ_TYPE_VMWARE_PORT) { I think it would make more sense to check for IOREQ_TYPE_VMWARE_PORT from within handle_ioreq. > + CPUX86State *env; > + ioreq_t fake_req = { > + .type = IOREQ_TYPE_PIO, > + .addr = (uint16_t)req->size, > + .size = 4, > + .dir = IOREQ_READ, > + .df = 0, > + .data_is_ptr = 0, > + }; > + if (!xen_opaque_env) { > + xen_opaque_env = g_malloc(sizeof(CPUX86State)); > + } > + env = xen_opaque_env; > + env->regs[R_EAX] = (uint32_t)(req->addr >> 32); > + env->regs[R_EBX] = (uint32_t)(req->addr); > + env->regs[R_ECX] = req->count; > + env->regs[R_EDX] = req->size; > + env->regs[R_ESI] = (uint32_t)(req->data >> 32); > + env->regs[R_EDI] = (uint32_t)(req->data); > + handle_ioreq(&fake_req); > + req->addr = ((uint64_t)fake_req.data << 32) | > + (uint32_t)env->regs[R_EBX]; > + req->count = env->regs[R_ECX]; > + req->size = env->regs[R_EDX]; > + req->data = ((uint64_t)env->regs[R_ESI] << 32) | > + (uint32_t)env->regs[R_EDI]; This code could be moved to a separate helper function called by handle_ioreq. > + } else { > + handle_ioreq(req); > + } > +#else > handle_ioreq(req); > +#endif From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Stabellini Subject: Re: [PATCH 1/1] xen-hvm.c: Add support for Xen access to vmport Date: Mon, 29 Sep 2014 11:15:18 +0100 Message-ID: References: <1411757235-29128-1-git-send-email-dslutz@verizon.com> <1411757235-29128-2-git-send-email-dslutz@verizon.com> Mime-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Return-path: In-Reply-To: <1411757235-29128-2-git-send-email-dslutz@verizon.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org To: Don Slutz Cc: xen-devel@lists.xensource.com, Marcel Apfelbaum , Markus Armbruster , "Michael S. Tsirkin" , qemu-devel@nongnu.org, Alexander Graf , Anthony Liguori , =?UTF-8?Q?Andreas_F=C3=A4rber?= , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org On Fri, 26 Sep 2014, Don Slutz wrote: > This adds synchronisation of the vcpu registers > between Xen and QEMU. > > Signed-off-by: Don Slutz [...] > diff --git a/xen-hvm.c b/xen-hvm.c > index 05e522c..e1274bb 100644 > --- a/xen-hvm.c > +++ b/xen-hvm.c > @@ -857,14 +857,48 @@ static void cpu_handle_ioreq(void *opaque) > > handle_buffered_iopage(state); > if (req) { > +#ifdef IOREQ_TYPE_VMWARE_PORT Is there any reason to #ifdef this code? Couldn't we just always build it in QEMU? > + if (req->type == IOREQ_TYPE_VMWARE_PORT) { I think it would make more sense to check for IOREQ_TYPE_VMWARE_PORT from within handle_ioreq. > + CPUX86State *env; > + ioreq_t fake_req = { > + .type = IOREQ_TYPE_PIO, > + .addr = (uint16_t)req->size, > + .size = 4, > + .dir = IOREQ_READ, > + .df = 0, > + .data_is_ptr = 0, > + }; > + if (!xen_opaque_env) { > + xen_opaque_env = g_malloc(sizeof(CPUX86State)); > + } > + env = xen_opaque_env; > + env->regs[R_EAX] = (uint32_t)(req->addr >> 32); > + env->regs[R_EBX] = (uint32_t)(req->addr); > + env->regs[R_ECX] = req->count; > + env->regs[R_EDX] = req->size; > + env->regs[R_ESI] = (uint32_t)(req->data >> 32); > + env->regs[R_EDI] = (uint32_t)(req->data); > + handle_ioreq(&fake_req); > + req->addr = ((uint64_t)fake_req.data << 32) | > + (uint32_t)env->regs[R_EBX]; > + req->count = env->regs[R_ECX]; > + req->size = env->regs[R_EDX]; > + req->data = ((uint64_t)env->regs[R_ESI] << 32) | > + (uint32_t)env->regs[R_EDI]; This code could be moved to a separate helper function called by handle_ioreq. > + } else { > + handle_ioreq(req); > + } > +#else > handle_ioreq(req); > +#endif