From patchwork Mon Mar 21 16:46:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kaya, Metin" X-Patchwork-Id: 12787571 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46854C433F5 for ; Mon, 21 Mar 2022 16:47:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351394AbiCUQsY (ORCPT ); Mon, 21 Mar 2022 12:48:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34718 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351385AbiCUQsW (ORCPT ); Mon, 21 Mar 2022 12:48:22 -0400 Received: from smtp-fw-80006.amazon.com (smtp-fw-80006.amazon.com [99.78.197.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3E7E51697AE; Mon, 21 Mar 2022 09:46:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1647881216; x=1679417216; h=from:to:cc:subject:date:message-id:mime-version; bh=11MtvQeckV9uTaf9kXjew1AzhoHaTDnjRXrFiqHtAhA=; b=GsLz068INP7SZizwqCIBwLZ9ZcHj3khI+u4m7NIuX08V4llusTZmH6Ko amQEBJsGq2KOB8Jfsc6fKNxpP2yWrwwRI3XQJlVKH343iFyzS9GQBCnFv tSemVtzumRs6H5sRz+PbO/xeNHBvec1Q6cw0iG1VuvV3WrafFkNmHOU4+ Q=; X-Amazon-filename: 0001-KVM-x86-xen-add-support-for-32-bit-guests-in-SCHEDOP.patch X-IronPort-AV: E=Sophos;i="5.90,199,1643673600"; d="scan'208,223";a="72785739" Received: from pdx4-co-svc-p1-lb2-vlan3.amazon.com (HELO email-inbound-relay-pdx-2b-31df91b1.us-west-2.amazon.com) ([10.25.36.214]) by smtp-border-fw-80006.pdx80.corp.amazon.com with ESMTP; 21 Mar 2022 16:46:33 +0000 Received: from EX13D32EUB002.ant.amazon.com (pdx1-ws-svc-p6-lb9-vlan2.pdx.amazon.com [10.236.137.194]) by email-inbound-relay-pdx-2b-31df91b1.us-west-2.amazon.com (Postfix) with ESMTPS id 3E18041D51; Mon, 21 Mar 2022 16:46:33 +0000 (UTC) Received: from EX13D43EUB002.ant.amazon.com (10.43.166.8) by EX13D32EUB002.ant.amazon.com (10.43.166.114) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 21 Mar 2022 16:46:32 +0000 Received: from EX13D43EUB002.ant.amazon.com ([10.43.166.8]) by EX13D43EUB002.ant.amazon.com ([10.43.166.8]) with mapi id 15.00.1497.033; Mon, 21 Mar 2022 16:46:31 +0000 From: "Kaya, Metin" To: Paolo Bonzini , "kvm@vger.kernel.org" CC: "Woodhouse, David" , "Durrant, Paul" , Boris Ostrovsky , "linux-kernel@vger.kernel.org" , "x86@kernel.org" Subject: [PATCH 1/1] KVM: x86/xen: add support for 32-bit guests in SCHEDOP_poll Thread-Topic: [PATCH 1/1] KVM: x86/xen: add support for 32-bit guests in SCHEDOP_poll Thread-Index: AQHYPUKXQJvuOGfU2UCQzahjrnQ1Og== Date: Mon, 21 Mar 2022 16:46:31 +0000 Message-ID: <1647881191688.60603@amazon.com> Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.43.161.153] MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Signed-off-by: Metin Kaya From 49113959550525be40c23e8bfc4addf69edeca47 Mon Sep 17 00:00:00 2001 From: Metin Kaya Date: Mon, 21 Mar 2022 11:05:32 +0000 Subject: [PATCH] KVM: x86/xen: add support for 32-bit guests in SCHEDOP_poll This patch introduces compat version of struct sched_poll for SCHEDOP_poll sub-operation of sched_op hypercall, reads correct amount of data (16 bytes in 32-bit case, 24 bytes otherwise) by using new compat_sched_poll struct, copies it to sched_poll properly, and lets rest of the code run as is. Signed-off-by: Metin Kaya Reviewed-by: David Woodhouse Reviewed-by: Paul Durrant --- arch/x86/kvm/xen.c | 30 ++++++++++++++++++++++++++---- arch/x86/kvm/xen.h | 7 +++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 7d01983d1087..c02163bf1a97 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -998,20 +998,42 @@ static bool kvm_xen_schedop_poll(struct kvm_vcpu *vcpu, bool longmode, evtchn_port_t port, *ports; gpa_t gpa; - if (!longmode || !lapic_in_kernel(vcpu) || + if (!lapic_in_kernel(vcpu) || !(vcpu->kvm->arch.xen_hvm_config.flags & KVM_XEN_HVM_CONFIG_EVTCHN_SEND)) return false; idx = srcu_read_lock(&vcpu->kvm->srcu); gpa = kvm_mmu_gva_to_gpa_system(vcpu, param, NULL); srcu_read_unlock(&vcpu->kvm->srcu, idx); - - if (!gpa || kvm_vcpu_read_guest(vcpu, gpa, &sched_poll, - sizeof(sched_poll))) { + if (!gpa) { *r = -EFAULT; return true; } + if (IS_ENABLED(CONFIG_64BIT) && longmode) { + if (kvm_vcpu_read_guest(vcpu, gpa, &sched_poll, + sizeof(sched_poll))) { + *r = -EFAULT; + return true; + } + } else { + struct compat_sched_poll sp; + + /* + * We assume size of compat_sched_poll is 16 bytes in 32-bit + * environment. Let's be honest. + */ + BUILD_BUG_ON(sizeof(struct compat_sched_poll) != 16); + + if (kvm_vcpu_read_guest(vcpu, gpa, &sp, sizeof(sp))) { + *r = -EFAULT; + return true; + } + sched_poll.ports = (evtchn_port_t *)(unsigned long)(sp.ports); + sched_poll.nr_ports = sp.nr_ports; + sched_poll.timeout = sp.timeout; + } + if (unlikely(sched_poll.nr_ports > 1)) { /* Xen (unofficially) limits number of pollers to 128 */ if (sched_poll.nr_ports > 128) { diff --git a/arch/x86/kvm/xen.h b/arch/x86/kvm/xen.h index ee5c4ae0755c..b5b208cd8c9f 100644 --- a/arch/x86/kvm/xen.h +++ b/arch/x86/kvm/xen.h @@ -196,6 +196,13 @@ struct compat_shared_info { struct compat_arch_shared_info arch; }; +struct compat_sched_poll { + /* This is actually a pointer which has to be 4 bytes in size. */ + uint32_t ports; + unsigned int nr_ports; + uint64_t timeout; +} __packed; + #define COMPAT_EVTCHN_2L_NR_CHANNELS (8 * \ sizeof_field(struct compat_shared_info, \ evtchn_pending)) -- 2.32.0