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

[Xen-devel] [PATCH v2] QEMU/helper2.c: Fix multiply issue for int and uint types


  • To: "xen-devel@xxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxx>
  • From: "Xu, Dongxiao" <dongxiao.xu@xxxxxxxxx>
  • Date: Mon, 20 Aug 2012 12:34:59 +0000
  • Accept-language: en-US
  • Delivery-date: Mon, 20 Aug 2012 12:35:24 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac1+0DYuDTlRVN/dQjO7DF9GvQD4JQ==
  • Thread-topic: [PATCH v2] QEMU/helper2.c: Fix multiply issue for int and uint types

Changes from v1: use int64_t to cast the uint32_t type to the signed type.

This is the updated version patch to fix the multiply issue for int and uint 
types operands, which reflects Stefano's comments.

The following patch fixes an issue of (uint * int) multiply in QEMU.
The bug phenomenon is that, it causes the Level 1 (L1) Xen boots more than 30 
minutes on Level 0 (L0) Xen (The nested virtualization case).
Please help to review and pull.

I saw the upstream QEMU also have a similar code piece, I will also send a 
patch there.

Thanks,
Dongxiao

>From d71f9be82ec0079aa88f779dea90e475b177e32f Mon Sep 17 00:00:00 2001
From: Dongxiao Xu <dongxiao.xu@xxxxxxxxx>
Date: Mon, 20 Aug 2012 16:45:04 +0800
Subject: [PATCH] helper2: fix multiply issue for int and uint types

If the two multiply operands are int and uint types separately,
the int type will be transformed to uint firstly, which is not the
intent in our code piece. The fix is to add (int64_t) transform
for the uint type before the multiply.

This helps to fix the Xen hypevisor slow booting issue (boots more
than 30 minutes) on another Xen hypervisor
(the nested virtualization case).

Signed-off-by: Dongxiao Xu <dongxiao.xu@xxxxxxxxx>
---
 i386-dm/helper2.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/i386-dm/helper2.c b/i386-dm/helper2.c
index c6d049c..c093249 100644
--- a/i386-dm/helper2.c
+++ b/i386-dm/helper2.c
@@ -364,7 +364,7 @@ static void cpu_ioreq_pio(CPUState *env, ioreq_t *req)
             for (i = 0; i < req->count; i++) {
                 tmp = do_inp(env, req->addr, req->size);
                 write_physical((target_phys_addr_t) req->data
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
             }
         }
@@ -376,7 +376,7 @@ static void cpu_ioreq_pio(CPUState *env, ioreq_t *req)
                 unsigned long tmp = 0;
 
                 read_physical((target_phys_addr_t) req->data
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
                 do_outp(env, req->addr, req->size, tmp);
             }
@@ -394,13 +394,13 @@ static void cpu_ioreq_move(CPUState *env, ioreq_t *req)
         if (req->dir == IOREQ_READ) {
             for (i = 0; i < req->count; i++) {
                 read_physical(req->addr
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &req->data);
             }
         } else if (req->dir == IOREQ_WRITE) {
             for (i = 0; i < req->count; i++) {
                 write_physical(req->addr
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &req->data);
             }
         }
@@ -410,19 +410,19 @@ static void cpu_ioreq_move(CPUState *env, ioreq_t *req)
         if (req->dir == IOREQ_READ) {
             for (i = 0; i < req->count; i++) {
                 read_physical(req->addr
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
                 write_physical((target_phys_addr_t )req->data
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
             }
         } else if (req->dir == IOREQ_WRITE) {
             for (i = 0; i < req->count; i++) {
                 read_physical((target_phys_addr_t) req->data
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
                 write_physical(req->addr
-                  + (sign * i * req->size),
+                  + (sign * i * (int64_t)req->size),
                   req->size, &tmp);
             }
         }
-- 
1.7.1

Attachment: 0001-helper2-fix-multiply-issue-for-int-and-uint-types.patch
Description: 0001-helper2-fix-multiply-issue-for-int-and-uint-types.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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