From patchwork Thu Jan 28 14:02:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 8150631 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id EAFD5BEEE5 for ; Thu, 28 Jan 2016 14:03:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 411542010C for ; Thu, 28 Jan 2016 14:03:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CFD2520373 for ; Thu, 28 Jan 2016 14:03:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934376AbcA1ODH (ORCPT ); Thu, 28 Jan 2016 09:03:07 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36602 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932657AbcA1ODE (ORCPT ); Thu, 28 Jan 2016 09:03:04 -0500 Received: by mail-wm0-f68.google.com with SMTP id 128so1756178wmz.3; Thu, 28 Jan 2016 06:03:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=I7WYZyA64T9R2J9BqCIVfHeUSjeVU8nSZmg7cyrjI2c=; b=V/1u6qQY7rlBwHEwUeoQwLmHY7Zkj7DKfDfHE67TNZs7tX/OWP8ETTMcfj9IATTXm7 1ZfL4xC8AIooZku2IyF4aYWDDuiAr01ORTA7K2hPIocCDB7yEyj30J+BiGQ6sc0KxBM8 c2kcd3grIh4KjKyoa4MkKHQXWMAGV4y2IBSGI5RAgdYjAW7AmSxTRfgYVoiMX7a0Nh12 CYtGSdUFoJ8PqlH/SkeLyMpjBJTCZ4znTFc5S9cs4W53tRU60NQB5Ps46N+fLdN3RXuM aNXTq5PKrZpcsCpj32qd6C5qj2pwt6RsiUFXHnQ0ZoihrwFJosDekEjueVxJk00KlR7R 3uFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=I7WYZyA64T9R2J9BqCIVfHeUSjeVU8nSZmg7cyrjI2c=; b=T6nRO49dOYa0tpkR4O8w0LgASKeRD/kiZbqp7QD9AW8YJS4AIIiDPBxvbrMUDbFgqC zbBazZ0RcNelcz/CT91CYwk5g2zw9R0dlxobRkkc4+NRHov85cxhRpzMz+HujIG8yoRJ +6qaOeAuAUI1rle+F6kqQOZaEdA+cFDCDZwnOIYgrCTnp+pXVi9NB0dVvU242jsJ6hDc zIb6Xo86exvRLFolWyNUqaGW7rooZQhiSBvVPYu7iOW6oncAxk1yKdYXM96jZMOqFGaV doU4P+Am84LyjYV4a7yKTfyU5szvUHytY9vLt3k7qizK7Lm5MAEjgYbgSOCmilAqv5zK ATHQ== X-Gm-Message-State: AG10YORBBS//jDshEPxm7ydOrYy4UhouHCfIIXDvWMnljXxswG5T38cpoLdogL0RcFSLHw== X-Received: by 10.28.1.23 with SMTP id 23mr3204605wmb.37.1453989782834; Thu, 28 Jan 2016 06:03:02 -0800 (PST) Received: from 640k.lan (94-39-161-9.adsl-ull.clienti.tiscali.it. [94.39.161.9]) by smtp.gmail.com with ESMTPSA id i63sm3021546wmf.24.2016.01.28.06.03.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jan 2016 06:03:02 -0800 (PST) From: Paolo Bonzini To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Andrey Smetanin , Roman Kagan , "Denis V. Lunev" Subject: [PATCH 1/2] KVM: x86: introduce do_shl32_div32 Date: Thu, 28 Jan 2016 15:02:56 +0100 Message-Id: <1453989777-30181-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1453989777-30181-1-git-send-email-pbonzini@redhat.com> References: <1453989777-30181-1-git-send-email-pbonzini@redhat.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham 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 This is similar to the existing div_frac function, but it returns the remainder too. Unlike div_frac, it can be used to implement long division, e.g. (a << 64) / b for 32-bit a and b. Signed-off-by: Paolo Bonzini --- arch/x86/kvm/x86.c | 10 ++-------- arch/x86/kvm/x86.h | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4244c2baf57d..5b937fdebc66 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1196,14 +1196,8 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock) static uint32_t div_frac(uint32_t dividend, uint32_t divisor) { - uint32_t quotient, remainder; - - /* Don't try to replace with do_div(), this one calculates - * "(dividend << 32) / divisor" */ - __asm__ ( "divl %4" - : "=a" (quotient), "=d" (remainder) - : "0" (0), "1" (dividend), "r" (divisor) ); - return quotient; + do_shl32_div32(dividend, divisor); + return dividend; } static void kvm_get_time_scale(uint32_t scaled_khz, uint32_t base_khz, diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index f2afa5fe48a6..34f416427143 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -192,4 +192,19 @@ extern unsigned int min_timer_period_us; extern unsigned int lapic_timer_advance_ns; extern struct static_key kvm_no_apic_vcpu; + +/* Same "calling convention" as do_div: + * - divide (n << 32) by base + * - put result in n + * - return remainder + */ +#define do_shl32_div32(n, base) \ + ({ \ + u32 __quot, __rem; \ + asm("divl %2" : "=a" (__quot), "=d" (__rem) \ + : "rm" (base), "0" (0), "1" ((u32) n)); \ + n = __quot; \ + __rem; \ + }) + #endif