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

[Xen-devel] [PATCH] 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 11:40:56 +0000
  • Accept-language: en-US
  • Delivery-date: Mon, 20 Aug 2012 11:41:31 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac1+yKMvaYimh/KqShCBCOFlig8iDg==
  • Thread-topic: [PATCH] QEMU/helper2.c: Fix multiply issue for int and uint types

Hi, 

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 442297c3f5073b11033e6af2338f571418eff024 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 (int) 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..2a66086 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 * (int)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 * (int)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 * (int)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 * (int)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 * (int)req->size),
                   req->size, &tmp);
                 write_physical((target_phys_addr_t )req->data
-                  + (sign * i * req->size),
+                  + (sign * i * (int)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 * (int)req->size),
                   req->size, &tmp);
                 write_physical(req->addr
-                  + (sign * i * req->size),
+                  + (sign * i * (int)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®.