From patchwork Sun Jul 7 16:00:27 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 2824584 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 7995D9F9CA for ; Sun, 7 Jul 2013 16:00:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4B16520169 for ; Sun, 7 Jul 2013 16:00:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3A1A220166 for ; Sun, 7 Jul 2013 16:00:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752537Ab3GGQAn (ORCPT ); Sun, 7 Jul 2013 12:00:43 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:40946 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752519Ab3GGQAm (ORCPT ); Sun, 7 Jul 2013 12:00:42 -0400 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r67G0afU010602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 7 Jul 2013 16:00:37 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r67G0ZUQ024600 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 7 Jul 2013 16:00:35 GMT Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r67G0ZQt024591; Sun, 7 Jul 2013 16:00:35 GMT Received: from lappy.us.oracle.com (/10.154.177.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 07 Jul 2013 09:00:34 -0700 From: Sasha Levin To: penberg@kernel.org Cc: will.deacon@arm.com, kvm@vger.kernel.org, Sasha Levin Subject: [PATCH v2] kvm tools: fix boot of guests with more than 4gb of ram Date: Sun, 7 Jul 2013 12:00:27 -0400 Message-Id: <1373212827-17409-1-git-send-email-sasha.levin@oracle.com> X-Mailer: git-send-email 1.8.1.2 X-Source-IP: acsinet22.oracle.com [141.146.126.238] Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Commit "kvm tools: virtio: remove hardcoded assumptions about guest page size" has introduced a bug that prevented guests with more than 4gb of ram from booting. The issue is that 'pfn' is a 32bit integer, so when multiplying it by page size to get the actual page will cause an overflow if the pfn referred to a memory area above 4gb. Signed-off-by: Sasha Levin --- tools/kvm/include/kvm/virtio.h | 6 ++++++ tools/kvm/virtio/9p.c | 2 +- tools/kvm/virtio/balloon.c | 2 +- tools/kvm/virtio/blk.c | 2 +- tools/kvm/virtio/console.c | 2 +- tools/kvm/virtio/net.c | 2 +- tools/kvm/virtio/rng.c | 2 +- tools/kvm/virtio/scsi.c | 2 +- 8 files changed, 13 insertions(+), 7 deletions(-) diff --git a/tools/kvm/include/kvm/virtio.h b/tools/kvm/include/kvm/virtio.h index 269ea4a..820b94a 100644 --- a/tools/kvm/include/kvm/virtio.h +++ b/tools/kvm/include/kvm/virtio.h @@ -90,4 +90,10 @@ int virtio_init(struct kvm *kvm, void *dev, struct virtio_device *vdev, struct virtio_ops *ops, enum virtio_trans trans, int device_id, int subsys_id, int class); int virtio_compat_add_message(const char *device, const char *config); + +static inline void *virtio_get_vq(struct kvm *kvm, u32 pfn, u32 page_size) +{ + return guest_flat_to_host(kvm, (u64)pfn * page_size); +} + #endif /* KVM__VIRTIO_H */ diff --git a/tools/kvm/virtio/9p.c b/tools/kvm/virtio/9p.c index b7a5723..127b13a 100644 --- a/tools/kvm/virtio/9p.c +++ b/tools/kvm/virtio/9p.c @@ -1267,7 +1267,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &p9dev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); job = &p9dev->jobs[vq]; vring_init(&queue->vring, VIRTQUEUE_NUM, p, align); diff --git a/tools/kvm/virtio/balloon.c b/tools/kvm/virtio/balloon.c index d1b64fa..4863535 100644 --- a/tools/kvm/virtio/balloon.c +++ b/tools/kvm/virtio/balloon.c @@ -204,7 +204,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &bdev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); thread_pool__init_job(&bdev->jobs[vq], kvm, virtio_bln_do_io, queue); vring_init(&queue->vring, VIRTIO_BLN_QUEUE_SIZE, p, align); diff --git a/tools/kvm/virtio/blk.c b/tools/kvm/virtio/blk.c index 44ac44b..ab18716 100644 --- a/tools/kvm/virtio/blk.c +++ b/tools/kvm/virtio/blk.c @@ -167,7 +167,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &bdev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); vring_init(&queue->vring, VIRTIO_BLK_QUEUE_SIZE, p, align); diff --git a/tools/kvm/virtio/console.c b/tools/kvm/virtio/console.c index 1f88a4b..83c58bf 100644 --- a/tools/kvm/virtio/console.c +++ b/tools/kvm/virtio/console.c @@ -137,7 +137,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &cdev.vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); vring_init(&queue->vring, VIRTIO_CONSOLE_QUEUE_SIZE, p, align); diff --git a/tools/kvm/virtio/net.c b/tools/kvm/virtio/net.c index 7855cfc..298903c 100644 --- a/tools/kvm/virtio/net.c +++ b/tools/kvm/virtio/net.c @@ -410,7 +410,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &ndev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); vring_init(&queue->vring, VIRTIO_NET_QUEUE_SIZE, p, align); diff --git a/tools/kvm/virtio/rng.c b/tools/kvm/virtio/rng.c index 2ce8afd..394de71 100644 --- a/tools/kvm/virtio/rng.c +++ b/tools/kvm/virtio/rng.c @@ -98,7 +98,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &rdev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); job = &rdev->jobs[vq]; diff --git a/tools/kvm/virtio/scsi.c b/tools/kvm/virtio/scsi.c index 05b2dc6..8da2420 100644 --- a/tools/kvm/virtio/scsi.c +++ b/tools/kvm/virtio/scsi.c @@ -63,7 +63,7 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align, queue = &sdev->vqs[vq]; queue->pfn = pfn; - p = guest_flat_to_host(kvm, queue->pfn * page_size); + p = virtio_get_vq(kvm, queue->pfn, page_size); vring_init(&queue->vring, VIRTIO_SCSI_QUEUE_SIZE, p, align);