[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] HVM patch to add pio IOREQ_WRITE OVERLAP/REPZ support in hvm io.c



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 8d08ad8256dff689e04e8b0169c01b669bfa4a12
# Parent  887ff2d1e382e7b0c321b2b4ce8c32dd87a8cfa3
HVM patch to add pio IOREQ_WRITE OVERLAP/REPZ support in hvm io.c
hvm_pio_assist().  Also, cleaned up a bit of duplicate code in the
functions.  Simple guest tests (ide pio) pass now for overlapped/rep
write operations.

Signed-off-by: Tom Woller <thomas.woller@xxxxxxx>
Signed-off-by: Mats Petersson <mats.petersson@xxxxxxx>

diff -r 887ff2d1e382 -r 8d08ad8256df xen/arch/x86/hvm/io.c
--- a/xen/arch/x86/hvm/io.c     Tue Apr  4 14:00:41 2006
+++ b/xen/arch/x86/hvm/io.c     Tue Apr  4 14:05:17 2006
@@ -365,29 +365,42 @@
     unsigned long old_eax;
     int sign = p->df ? -1 : 1;
 
-    if (p->dir == IOREQ_WRITE) {
-        if (p->pdata_valid) {
+    if (p->pdata_valid || (mmio_opp->flags & OVERLAP)) {
+        if (mmio_opp->flags & REPZ)
+            regs->ecx -= p->count;
+        if (p->dir == IOREQ_READ) {
+            regs->edi += sign * p->count * p->size;
+
+            if (mmio_opp->flags & OVERLAP) {
+                /* 
+                 * If we are doing in IN and it's overlapping a page boundary, 
+                 * we need to copy the data back to user's page with hvm_copy. 
+                 * Note that overlap * can only be set with paging enabled, so 
+                 * we don't need to worry about * real-mode stuff.  
+                 */
+                unsigned long addr;
+                {
+                    /* 
+                    * We completely ignore segment registers here - 
+                     * it's not a good idea. We also may use upper bits
+                     * in edi when in 16-bit real/protected mode.
+                     * We really need to get the actual address back from
+                     * the arch-dependant HVM portion.
+                     */
+                    struct vcpu *v = current;
+                    if (hvm_realmode(v))
+                        __hvm_bug(regs);
+                }
+                addr = regs->edi;
+                if (sign > 0)
+                    addr -= p->size;
+                hvm_copy(&p->u.data, addr, p->size, HVM_COPY_OUT);
+            }
+        } else
             regs->esi += sign * p->count * p->size;
-            if (mmio_opp->flags & REPZ)
-                regs->ecx -= p->count;
-        }
+
     } else {
-        if (mmio_opp->flags & OVERLAP) {
-            unsigned long addr;
-
-            regs->edi += sign * p->count * p->size;
-            if (mmio_opp->flags & REPZ)
-                regs->ecx -= p->count;
-
-            addr = regs->edi;
-            if (sign > 0)
-                addr -= p->size;
-            hvm_copy(&p->u.data, addr, p->size, HVM_COPY_OUT);
-        } else if (p->pdata_valid) {
-            regs->edi += sign * p->count * p->size;
-            if (mmio_opp->flags & REPZ)
-                regs->ecx -= p->count;
-        } else {
+        if (p->dir == IOREQ_READ) {
             old_eax = regs->eax;
             switch (p->size) {
             case 1:

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.