WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] 64-bit hvm on 32-bit dom0 - ioemu adjustments

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] 64-bit hvm on 32-bit dom0 - ioemu adjustments
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Mon, 14 May 2007 17:07:09 +0200
Delivery-date: Mon, 14 May 2007 08:04:45 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Don't mask off data bits when running 64-bit hvm guests on 32-bit dom0.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2007-04-27/tools/ioemu/target-i386-dm/helper2.c
===================================================================
--- 2007-04-27.orig/tools/ioemu/target-i386-dm/helper2.c        2007-04-23 
12:41:32.000000000 +0200
+++ 2007-04-27/tools/ioemu/target-i386-dm/helper2.c     2007-05-09 
17:58:07.000000000 +0200
@@ -322,7 +322,7 @@ void cpu_ioreq_pio(CPUState *env, ioreq_
             do_outp(env, req->addr, req->size, req->data);
         } else {
             for (i = 0; i < req->count; i++) {
-                unsigned long tmp;
+                unsigned long tmp = 0;
 
                 read_physical((target_phys_addr_t) req->data
                   + (sign * i * req->size),
@@ -354,7 +354,7 @@ void cpu_ioreq_move(CPUState *env, ioreq
             }
         }
     } else {
-        unsigned long tmp;
+        target_ulong tmp;
 
         if (req->dir == IOREQ_READ) {
             for (i = 0; i < req->count; i++) {
@@ -380,14 +380,14 @@ void cpu_ioreq_move(CPUState *env, ioreq
 
 void cpu_ioreq_and(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 & (unsigned long) req->data;
+        tmp2 = tmp1 & (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -395,14 +395,14 @@ void cpu_ioreq_and(CPUState *env, ioreq_
 
 void cpu_ioreq_add(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 + (unsigned long) req->data;
+        tmp2 = tmp1 + (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -410,14 +410,14 @@ void cpu_ioreq_add(CPUState *env, ioreq_
 
 void cpu_ioreq_sub(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 - (unsigned long) req->data;
+        tmp2 = tmp1 - (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -425,14 +425,14 @@ void cpu_ioreq_sub(CPUState *env, ioreq_
 
 void cpu_ioreq_or(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 | (unsigned long) req->data;
+        tmp2 = tmp1 | (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -440,14 +440,14 @@ void cpu_ioreq_or(CPUState *env, ioreq_t
 
 void cpu_ioreq_xor(CPUState *env, ioreq_t *req)
 {
-    unsigned long tmp1, tmp2;
+    target_ulong tmp1, tmp2;
 
     if (req->data_is_ptr != 0)
         hw_error("expected scalar value");
 
     read_physical(req->addr, req->size, &tmp1);
     if (req->dir == IOREQ_WRITE) {
-        tmp2 = tmp1 ^ (unsigned long) req->data;
+        tmp2 = tmp1 ^ (target_ulong) req->data;
         write_physical(req->addr, req->size, &tmp2);
     }
     req->data = tmp1;
@@ -495,8 +495,9 @@ void cpu_ioreq_xchg(CPUState *env, ioreq
 
 void __handle_ioreq(CPUState *env, ioreq_t *req)
 {
-    if (!req->data_is_ptr && req->dir == IOREQ_WRITE && req->size != 4)
-       req->data &= (1UL << (8 * req->size)) - 1;
+    if (!req->data_is_ptr && req->dir == IOREQ_WRITE &&
+        req->size < sizeof(target_ulong))
+       req->data &= ((target_ulong)1 << (8 * req->size)) - 1;
 
     switch (req->type) {
     case IOREQ_TYPE_PIO:



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

<Prev in Thread] Current Thread [Next in Thread>