From patchwork Wed Jun 1 16:51:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 12867066 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 A7D90C433EF for ; Wed, 1 Jun 2022 16:52:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348736AbiFAQwx (ORCPT ); Wed, 1 Jun 2022 12:52:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240328AbiFAQwv (ORCPT ); Wed, 1 Jun 2022 12:52:51 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 562843336E for ; Wed, 1 Jun 2022 09:52:46 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 220C61063; Wed, 1 Jun 2022 09:52:46 -0700 (PDT) Received: from donnerap.arm.com (donnerap.cambridge.arm.com [10.1.197.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7227D3F66F; Wed, 1 Jun 2022 09:52:45 -0700 (PDT) From: Andre Przywara To: Will Deacon , Julien Thierry Cc: Alexandru Elisei , kvm@vger.kernel.org Subject: [PATCH kvmtool 1/4] virtio/mmio: avoid unaligned accesses Date: Wed, 1 Jun 2022 17:51:35 +0100 Message-Id: <20220601165138.3135246-2-andre.przywara@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220601165138.3135246-1-andre.przywara@arm.com> References: <20220601165138.3135246-1-andre.przywara@arm.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The virtio-mmio code is using unaligned accesses, to its struct virtio_mmio, as revealed by -fsanitize=undefined. A closer inspection reveals that this is due to a misplaced u8 member in struct virtio_mmio, and it inheriting the "packed" attribute from struct virtio_mmio_hdr. The simplest fix for the issue is to just move the "u8 irq" member to the end, so that even with the "packed" attribute in effect, the other members stay all naturally aligned. Signed-off-by: Andre Przywara --- include/kvm/virtio-mmio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/kvm/virtio-mmio.h b/include/kvm/virtio-mmio.h index 6bc50bd1..13dcccb6 100644 --- a/include/kvm/virtio-mmio.h +++ b/include/kvm/virtio-mmio.h @@ -45,10 +45,10 @@ struct virtio_mmio { u32 addr; void *dev; struct kvm *kvm; - u8 irq; struct virtio_mmio_hdr hdr; struct device_header dev_hdr; struct virtio_mmio_ioevent_param ioeventfds[VIRTIO_MMIO_MAX_VQ]; + u8 irq; }; int virtio_mmio_signal_vq(struct kvm *kvm, struct virtio_device *vdev, u32 vq); From patchwork Wed Jun 1 16:51:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 12867067 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 E5ACBCCA477 for ; Wed, 1 Jun 2022 16:52:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349351AbiFAQwx (ORCPT ); Wed, 1 Jun 2022 12:52:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245136AbiFAQww (ORCPT ); Wed, 1 Jun 2022 12:52:52 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 3631F33EAB for ; Wed, 1 Jun 2022 09:52:47 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 047551480; Wed, 1 Jun 2022 09:52:47 -0700 (PDT) Received: from donnerap.arm.com (donnerap.cambridge.arm.com [10.1.197.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5428B3F66F; Wed, 1 Jun 2022 09:52:46 -0700 (PDT) From: Andre Przywara To: Will Deacon , Julien Thierry Cc: Alexandru Elisei , kvm@vger.kernel.org Subject: [PATCH kvmtool 2/4] virtio/mmio: access header members normally Date: Wed, 1 Jun 2022 17:51:36 +0100 Message-Id: <20220601165138.3135246-3-andre.przywara@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220601165138.3135246-1-andre.przywara@arm.com> References: <20220601165138.3135246-1-andre.przywara@arm.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The handlers for accessing the virtio-mmio header tried to be very clever, by modelling the internal data structure to look exactly like the protocol header, so that address offsets can "reused". This requires using a packed structure, which creates other problems, and seems to be totally unnecessary in this case. Replace the offset-based access hacks to the structure with proper compiler visible accesses, to avoid unaligned accesses and make the code more robust. This fixes UBSAN complaints about unaligned accesses. Signed-off-by: Andre Przywara --- include/kvm/virtio-mmio.h | 2 +- virtio/mmio.c | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/kvm/virtio-mmio.h b/include/kvm/virtio-mmio.h index 13dcccb6..aa4cab3c 100644 --- a/include/kvm/virtio-mmio.h +++ b/include/kvm/virtio-mmio.h @@ -39,7 +39,7 @@ struct virtio_mmio_hdr { u32 interrupt_ack; u32 reserved_5[2]; u32 status; -} __attribute__((packed)); +}; struct virtio_mmio { u32 addr; diff --git a/virtio/mmio.c b/virtio/mmio.c index 3782d55a..c9ad8ee7 100644 --- a/virtio/mmio.c +++ b/virtio/mmio.c @@ -135,12 +135,22 @@ static void virtio_mmio_config_in(struct kvm_cpu *vcpu, switch (addr) { case VIRTIO_MMIO_MAGIC_VALUE: + memcpy(data, &vmmio->hdr.magic, sizeof(vmmio->hdr.magic)); + break; case VIRTIO_MMIO_VERSION: + ioport__write32(data, vmmio->hdr.version); + break; case VIRTIO_MMIO_DEVICE_ID: + ioport__write32(data, vmmio->hdr.device_id); + break; case VIRTIO_MMIO_VENDOR_ID: + ioport__write32(data, vmmio->hdr.vendor_id); + break; case VIRTIO_MMIO_STATUS: + ioport__write32(data, vmmio->hdr.status); + break; case VIRTIO_MMIO_INTERRUPT_STATUS: - ioport__write32(data, *(u32 *)(((void *)&vmmio->hdr) + addr)); + ioport__write32(data, vmmio->hdr.interrupt_state); break; case VIRTIO_MMIO_DEVICE_FEATURES: if (vmmio->hdr.host_features_sel == 0) @@ -174,9 +184,10 @@ static void virtio_mmio_config_out(struct kvm_cpu *vcpu, switch (addr) { case VIRTIO_MMIO_DEVICE_FEATURES_SEL: + vmmio->hdr.host_features_sel = ioport__read32(data); + break; case VIRTIO_MMIO_DRIVER_FEATURES_SEL: - val = ioport__read32(data); - *(u32 *)(((void *)&vmmio->hdr) + addr) = val; + vmmio->hdr.guest_features_sel = ioport__read32(data); break; case VIRTIO_MMIO_QUEUE_SEL: val = ioport__read32(data); @@ -185,7 +196,7 @@ static void virtio_mmio_config_out(struct kvm_cpu *vcpu, val, vq_count); break; } - *(u32 *)(((void *)&vmmio->hdr) + addr) = val; + vmmio->hdr.queue_sel = val; break; case VIRTIO_MMIO_STATUS: vmmio->hdr.status = ioport__read32(data); From patchwork Wed Jun 1 16:51:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 12867069 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 12F67C433EF for ; Wed, 1 Jun 2022 16:52:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351847AbiFAQwz (ORCPT ); Wed, 1 Jun 2022 12:52:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48392 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343763AbiFAQww (ORCPT ); Wed, 1 Jun 2022 12:52:52 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 16D2D33EBF for ; Wed, 1 Jun 2022 09:52:48 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DA62D14BF; Wed, 1 Jun 2022 09:52:47 -0700 (PDT) Received: from donnerap.arm.com (donnerap.cambridge.arm.com [10.1.197.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 368E53F66F; Wed, 1 Jun 2022 09:52:47 -0700 (PDT) From: Andre Przywara To: Will Deacon , Julien Thierry Cc: Alexandru Elisei , kvm@vger.kernel.org Subject: [PATCH kvmtool 3/4] virtio/mmio: remove unneeded virtio_mmio_hdr members Date: Wed, 1 Jun 2022 17:51:37 +0100 Message-Id: <20220601165138.3135246-4-andre.przywara@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220601165138.3135246-1-andre.przywara@arm.com> References: <20220601165138.3135246-1-andre.przywara@arm.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org So far "struct virtio_mmio_hdr" was modelled exactly like the virtio MMIO protocol header, including reserved fields and members unused by kvmtool. Since we now no longer need to stay byte-for-byte compatible, drop those members to clean up the code. Signed-off-by: Andre Przywara --- include/kvm/virtio-mmio.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/include/kvm/virtio-mmio.h b/include/kvm/virtio-mmio.h index aa4cab3c..84848eee 100644 --- a/include/kvm/virtio-mmio.h +++ b/include/kvm/virtio-mmio.h @@ -22,22 +22,14 @@ struct virtio_mmio_hdr { u32 vendor_id; u32 host_features; u32 host_features_sel; - u32 reserved_1[2]; u32 guest_features; u32 guest_features_sel; u32 guest_page_size; - u32 reserved_2; u32 queue_sel; u32 queue_num_max; u32 queue_num; u32 queue_align; - u32 queue_pfn; - u32 reserved_3[3]; - u32 queue_notify; - u32 reserved_4[3]; u32 interrupt_state; - u32 interrupt_ack; - u32 reserved_5[2]; u32 status; }; From patchwork Wed Jun 1 16:51:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 12867068 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 839ACC43334 for ; Wed, 1 Jun 2022 16:52:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349558AbiFAQwy (ORCPT ); Wed, 1 Jun 2022 12:52:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48394 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344305AbiFAQww (ORCPT ); Wed, 1 Jun 2022 12:52:52 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id ED0A3340E2 for ; Wed, 1 Jun 2022 09:52:48 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BC6951515; Wed, 1 Jun 2022 09:52:48 -0700 (PDT) Received: from donnerap.arm.com (donnerap.cambridge.arm.com [10.1.197.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 188273F66F; Wed, 1 Jun 2022 09:52:47 -0700 (PDT) From: Andre Przywara To: Will Deacon , Julien Thierry Cc: Alexandru Elisei , kvm@vger.kernel.org Subject: [PATCH kvmtool 4/4] x86/cpuid: fix undefined behaviour Date: Wed, 1 Jun 2022 17:51:38 +0100 Message-Id: <20220601165138.3135246-5-andre.przywara@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220601165138.3135246-1-andre.przywara@arm.com> References: <20220601165138.3135246-1-andre.przywara@arm.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Shifting signed values is rarely a good idea, especially if the result ends up setting the most significant bit. UBSAN warns about two occasions in the CPUID filter code: =========================== x86/cpuid.c:23:25: runtime error: left shift of 255 by 24 places cannot be represented in type 'int' x86/cpuid.c:27:22: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' =========================== Fix those warnings by making sure we only deal with unsigned values. Signed-off-by: Andre Przywara --- x86/cpuid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x86/cpuid.c b/x86/cpuid.c index f4347a84..1ae681ce 100644 --- a/x86/cpuid.c +++ b/x86/cpuid.c @@ -8,7 +8,7 @@ #define MAX_KVM_CPUID_ENTRIES 100 -static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid, int cpu_id) +static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid, unsigned int cpu_id) { unsigned int i; @@ -20,11 +20,11 @@ static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid, int cpu_id) switch (entry->function) { case 1: - entry->ebx &= ~(0xff << 24); + entry->ebx &= ~(0xffU << 24); entry->ebx |= cpu_id << 24; /* Set X86_FEATURE_HYPERVISOR */ if (entry->index == 0) - entry->ecx |= (1 << 31); + entry->ecx |= (1U << 31); break; case 6: /* Clear X86_FEATURE_EPB */