From nobody Fri Oct 31 23:30:12 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=citrix.com ARC-Seal: i=1; a=rsa-sha256; t=1744731276; cv=none; d=zohomail.com; s=zohoarc; b=Q2JRNMfCZ273BLftTqfLEQ5GBbKZIkzZ3CIXFwu0Y5cFA65j37rdtAV491apOsE1onLY7sNxGRWbwi4mi3nqsINLGu08yRE3t6/bTEPI+6G2XSw7JWooPEZyoXLdIMr9LLrQ1DDIp02XkaUXcRTmwAlQdywLKzQkv7XxYUS1hO4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1744731276; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qeT5t+7PLGgLUSY6R9I0jYmGVga2OLQ/Zvlwarpqm88=; b=ZQhHHYtGH3yZYLZYjGzdwcvOXa+2taJsnPoW2e2sGBoVSJW1PsJR9FhTa/Vc80JEotKwlPCrqrsgds7/zgZgR4cYAID/l8vmsMAe5PeRm343sV8/8bEAlkgE5OWoQ1362fvVrJ07ZFXC43E0OsqrqC/sHPeXYiZfrkGwuty796Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1744731276904175.7657747800821; Tue, 15 Apr 2025 08:34:36 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.954132.1348468 (Exim 4.92) (envelope-from ) id 1u4iIl-0004qG-M9; Tue, 15 Apr 2025 15:34:19 +0000 Received: by outflank-mailman (output) from mailman id 954132.1348468; Tue, 15 Apr 2025 15:34:19 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u4iIl-0004q9-I4; Tue, 15 Apr 2025 15:34:19 +0000 Received: by outflank-mailman (input) for mailman id 954132; Tue, 15 Apr 2025 15:34:18 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u4iIk-0004bx-A0 for xen-devel@lists.xenproject.org; Tue, 15 Apr 2025 15:34:18 +0000 Received: from mail-pf1-x433.google.com (mail-pf1-x433.google.com [2607:f8b0:4864:20::433]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 17866889-1a0f-11f0-9eae-5ba50f476ded; Tue, 15 Apr 2025 17:34:17 +0200 (CEST) Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-736a7e126c7so4972880b3a.3 for ; Tue, 15 Apr 2025 08:34:17 -0700 (PDT) Received: from localhost ([84.78.159.3]) by smtp.gmail.com with UTF8SMTPSA id 41be03b00d2f7-b02a2d3a2b8sm11127529a12.58.2025.04.15.08.34.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Apr 2025 08:34:14 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 17866889-1a0f-11f0-9eae-5ba50f476ded DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com; s=google; t=1744731255; x=1745336055; darn=lists.xenproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qeT5t+7PLGgLUSY6R9I0jYmGVga2OLQ/Zvlwarpqm88=; b=tnPUrM9ejR3LnKuwxDBe92fXkZAPkq4Trm4WFYxqn1gjIecVrEBDCpeO4sm5r0dH1P 0JH/eAyTjHla7AtkmUDvhQekrvGA2XST+i1WOUOYOus/q8Kf2oZodEjlJEy6FTOV7DwH zouSJlFoKyJK4urpszslE2XNi06OIJGZcRF4E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744731255; x=1745336055; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qeT5t+7PLGgLUSY6R9I0jYmGVga2OLQ/Zvlwarpqm88=; b=RSrTb45OSgG8TEtvWP6GB9sgrgV4ZISzX8+RksOcgl3sAHkTyiM68VAdwk5H+qj/2S 1DFEqMTO2ekWDg41AIp/Ca485GtOpZIHd1dLFparPLL49rJSNuigPr1OsjYhaPhVeiVh hw+h2sKvS2FZFUzbyVarpN5TktrFNP/IIMClZsQb6cjIo+4jdeJ+6O7ZWt8iQJGYfCqc wd6VIf3LY0Hs2nIcCxgvcNmVYyOdkhQn13GjStrR0lXobgH5FGKQYb/0vt8IVZ8Z/Km3 lJNQyvm7sXHH1id/63nDEKoKoc+HS+utQ1e4VXRdvNNLf5okasvJaImBqV3kWLgvrfkk 87ug== X-Gm-Message-State: AOJu0YxWlkebzB/QYKjLAVv3uckRcUmdZr7zQMzwGmA2nwPkbncOihOO 5FI61YVYfkmxhhQ3i0tIhNj2GkClQtkp5CeKfVphI7tqpI2wkwBMHAg3wi3iJEeHm0HIbvqr2KR 7 X-Gm-Gg: ASbGncsQh+wLqXfXB/t2BHeVPYLUxwlkkT75UBfko+p20BnBGUr/faHm0RnevGxYTv5 inXFAhHLmSmBw7PVs8ILPfpQcvTqC9am0N3hKgKIeT/mhAeIAWB0AtDYHeQucuWz9JF9ScG6h3k g9CZwtlVIb/J2ZEWXUkzMeESyNVFjwkQb9y4axaMdRh66orDUOFvMRgwyYMv1lZ6nN19PYSs2EO tTEOIBirGz8xMKwObT9Yj2gxX5lfG9E1QH3+M5JlNoC0OFGz2N2zuUJ3FnnOWcrWbuFrGEjs5tW U997r/8w9jsFLX29mYn4GJWfuI6/jzYKGAwlZona3LUV/Q== X-Google-Smtp-Source: AGHT+IFi+8H6UVpnUZrRJSN4ByTR3JG4By1EKozq/qxPY0SaQWQcDguT8MKM+uJa2BQR3YhWpSynaw== X-Received: by 2002:a05:6a21:1346:b0:1f5:63f9:9ea1 with SMTP id adf61e73a8af0-201797a2f99mr26786130637.13.1744731254961; Tue, 15 Apr 2025 08:34:14 -0700 (PDT) From: Roger Pau Monne To: xen-devel@lists.xenproject.org Cc: Roger Pau Monne , Jan Beulich , Andrew Cooper , Anthony PERARD , Michal Orzel , Julien Grall , Stefano Stabellini Subject: [PATCH v2 1/4] xen/io: provide helpers for multi size MMIO accesses Date: Tue, 15 Apr 2025 17:32:43 +0200 Message-ID: <20250415153246.81688-2-roger.pau@citrix.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250415153246.81688-1-roger.pau@citrix.com> References: <20250415153246.81688-1-roger.pau@citrix.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @citrix.com) X-ZM-MESSAGEID: 1744731277530019000 Several handlers have the same necessity of reading or writing from or to an MMIO region using 1, 2, 4 or 8 bytes accesses. So far this has been open-coded in the function itself. Instead provide a new set of handlers that encapsulate the accesses. Since the added helpers are not architecture specific, introduce a new generic io.h header. No functional change intended. Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Denis Mukhin --- Changes since v1: - Limit {read,write}q() to 64bit architectures. - Always have a default case in switch statement. --- xen/arch/x86/hvm/vmsi.c | 47 ++-------------------------- xen/arch/x86/mm.c | 32 +++++-------------- xen/drivers/vpci/msix.c | 47 ++-------------------------- xen/include/xen/io.h | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 113 deletions(-) create mode 100644 xen/include/xen/io.h diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index fd83abb929ec..61b89834d97d 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -24,6 +24,7 @@ * Will be merged it with virtual IOAPIC logic, since most is the same */ =20 +#include #include #include #include @@ -304,28 +305,7 @@ static void adjacent_read( =20 hwaddr =3D fix_to_virt(fixmap_idx) + PAGE_OFFSET(address); =20 - switch ( len ) - { - case 1: - *pval =3D readb(hwaddr); - break; - - case 2: - *pval =3D readw(hwaddr); - break; - - case 4: - *pval =3D readl(hwaddr); - break; - - case 8: - *pval =3D readq(hwaddr); - break; - - default: - ASSERT_UNREACHABLE(); - break; - } + *pval =3D read_mmio(hwaddr, len); } =20 static void adjacent_write( @@ -344,28 +324,7 @@ static void adjacent_write( =20 hwaddr =3D fix_to_virt(fixmap_idx) + PAGE_OFFSET(address); =20 - switch ( len ) - { - case 1: - writeb(val, hwaddr); - break; - - case 2: - writew(val, hwaddr); - break; - - case 4: - writel(val, hwaddr); - break; - - case 8: - writeq(val, hwaddr); - break; - - default: - ASSERT_UNREACHABLE(); - break; - } + write_mmio(hwaddr, val, len); } =20 static int cf_check msixtbl_read( diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 1cf236516789..989e62e7ce6f 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -95,6 +95,7 @@ #include #include #include +#include #include #include #include @@ -116,7 +117,6 @@ #include #include #include -#include #include #include #include @@ -5102,7 +5102,7 @@ static void __iomem *subpage_mmio_map_page( static void subpage_mmio_write_emulate( mfn_t mfn, unsigned int offset, - const void *data, + unsigned long data, unsigned int len) { struct subpage_ro_range *entry; @@ -5115,7 +5115,6 @@ static void subpage_mmio_write_emulate( =20 if ( test_bit(offset / MMIO_RO_SUBPAGE_GRAN, entry->ro_elems) ) { - write_ignored: gprintk(XENLOG_WARNING, "ignoring write to R/O MMIO 0x%"PRI_mfn"%03x len %u\n", mfn_x(mfn), offset, len); @@ -5131,26 +5130,7 @@ static void subpage_mmio_write_emulate( return; } =20 - addr +=3D offset; - switch ( len ) - { - case 1: - writeb(*(const uint8_t*)data, addr); - break; - case 2: - writew(*(const uint16_t*)data, addr); - break; - case 4: - writel(*(const uint32_t*)data, addr); - break; - case 8: - writeq(*(const uint64_t*)data, addr); - break; - default: - /* mmio_ro_emulated_write() already validated the size */ - ASSERT_UNREACHABLE(); - goto write_ignored; - } + write_mmio(addr + offset, data, len); } =20 #ifdef CONFIG_HVM @@ -5185,18 +5165,20 @@ int cf_check mmio_ro_emulated_write( struct x86_emulate_ctxt *ctxt) { struct mmio_ro_emulate_ctxt *mmio_ro_ctxt =3D ctxt->data; + unsigned long data =3D 0; =20 /* Only allow naturally-aligned stores at the original %cr2 address. */ if ( ((bytes | offset) & (bytes - 1)) || !bytes || - offset !=3D mmio_ro_ctxt->cr2 ) + offset !=3D mmio_ro_ctxt->cr2 || bytes > sizeof(data) ) { gdprintk(XENLOG_WARNING, "bad access (cr2=3D%lx, addr=3D%lx, bytes= =3D%u)\n", mmio_ro_ctxt->cr2, offset, bytes); return X86EMUL_UNHANDLEABLE; } =20 + memcpy(&data, p_data, bytes); subpage_mmio_write_emulate(mmio_ro_ctxt->mfn, PAGE_OFFSET(offset), - p_data, bytes); + data, bytes); =20 return X86EMUL_OKAY; } diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 6bd8c55bb48e..6455f2a03a01 100644 --- a/xen/drivers/vpci/msix.c +++ b/xen/drivers/vpci/msix.c @@ -17,6 +17,7 @@ * License along with this program; If not, see . */ =20 +#include #include #include =20 @@ -344,28 +345,7 @@ static int adjacent_read(const struct domain *d, const= struct vpci_msix *msix, return X86EMUL_OKAY; } =20 - switch ( len ) - { - case 1: - *data =3D readb(mem + PAGE_OFFSET(addr)); - break; - - case 2: - *data =3D readw(mem + PAGE_OFFSET(addr)); - break; - - case 4: - *data =3D readl(mem + PAGE_OFFSET(addr)); - break; - - case 8: - *data =3D readq(mem + PAGE_OFFSET(addr)); - break; - - default: - ASSERT_UNREACHABLE(); - break; - } + *data =3D read_mmio(mem + PAGE_OFFSET(addr), len); spin_unlock(&vpci->lock); =20 return X86EMUL_OKAY; @@ -493,28 +473,7 @@ static int adjacent_write(const struct domain *d, cons= t struct vpci_msix *msix, return X86EMUL_OKAY; } =20 - switch ( len ) - { - case 1: - writeb(data, mem + PAGE_OFFSET(addr)); - break; - - case 2: - writew(data, mem + PAGE_OFFSET(addr)); - break; - - case 4: - writel(data, mem + PAGE_OFFSET(addr)); - break; - - case 8: - writeq(data, mem + PAGE_OFFSET(addr)); - break; - - default: - ASSERT_UNREACHABLE(); - break; - } + write_mmio(mem + PAGE_OFFSET(addr), data, len); spin_unlock(&vpci->lock); =20 return X86EMUL_OKAY; diff --git a/xen/include/xen/io.h b/xen/include/xen/io.h new file mode 100644 index 000000000000..4495a04c403e --- /dev/null +++ b/xen/include/xen/io.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * IO related routines. + * + * Copyright (c) 2025 Cloud Software Group + */ +#ifndef XEN_IO_H +#define XEN_IO_H + +#include + +#include + +static inline unsigned long read_mmio(const volatile void __iomem *mem, + unsigned int size) +{ + switch ( size ) + { + case 1: + return readb(mem); + + case 2: + return readw(mem); + + case 4: + return readl(mem); + +#ifdef CONFIG_64BIT + case 8: + return readq(mem); +#endif + + default: + ASSERT_UNREACHABLE(); + return ~0UL; + } +} + +static inline void write_mmio(volatile void __iomem *mem, unsigned long da= ta, + unsigned int size) +{ + switch ( size ) + { + case 1: + writeb(data, mem); + break; + + case 2: + writew(data, mem); + break; + + case 4: + writel(data, mem); + break; + +#ifdef CONFIG_64BIT + case 8: + writeq(data, mem); + break; +#endif + + default: + ASSERT_UNREACHABLE(); + break; + } +} + +#endif /* XEN_IO_H */ --=20 2.48.1