From nobody Fri Oct 31 16:00:09 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=1745921595; cv=none; d=zohomail.com; s=zohoarc; b=MhZR77AY9wcBuK7SpcbvBsFUn62/BeHkkXL6XG8i+HaKcFF5coOiwhGYk7ohrftg8VrPn4JgUqp91N387JkEI2rPtDRNov6jwI/4iHLt3zKrNNdxRwVJ5FgfHkpI+1azD9IZYjSMy8NIwpzr8WAW0e/1QuM0mIZGU1CrbwD4/No= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745921595; 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=Ri4wmQ14jFAaQdVruW8LmHQFglkscs4x372ajXNwYuk=; b=bFhOSUh9117Y6tirnKbRWai4U4ZdrD7q985HAfxDs7gXjI/R8EdJj2jnx0SU5wqQ1ffn40rFiCYIOIdN9nRzeLcQJPvc9C1Nj1A2DufDgza3kZhajIy/4KtrCuOZ5nuOYi+sCSk9YxTZJ9pB+o83exgHU6u4fc6ywFRJ6tjOqyA= 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 1745921595876667.6023479176228; Tue, 29 Apr 2025 03:13:15 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.971782.1360180 (Exim 4.92) (envelope-from ) id 1u9hxW-0002zw-Ph; Tue, 29 Apr 2025 10:13:02 +0000 Received: by outflank-mailman (output) from mailman id 971782.1360180; Tue, 29 Apr 2025 10:13:02 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u9hxW-0002zo-Mi; Tue, 29 Apr 2025 10:13:02 +0000 Received: by outflank-mailman (input) for mailman id 971782; Tue, 29 Apr 2025 10:13:02 +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 1u9hxW-0002lF-01 for xen-devel@lists.xenproject.org; Tue, 29 Apr 2025 10:13:02 +0000 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [2a00:1450:4864:20::333]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 883c51b5-24e2-11f0-9eb4-5ba50f476ded; Tue, 29 Apr 2025 12:13:01 +0200 (CEST) Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-43edecbfb94so54300835e9.1 for ; Tue, 29 Apr 2025 03:13:01 -0700 (PDT) Received: from localhost ([84.78.159.3]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-441ad81c19fsm11819825e9.0.2025.04.29.03.12.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 03:12:59 -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: 883c51b5-24e2-11f0-9eb4-5ba50f476ded DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com; s=google; t=1745921580; x=1746526380; 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=Ri4wmQ14jFAaQdVruW8LmHQFglkscs4x372ajXNwYuk=; b=kjOvnWNmVROXeImcp2cztIiTVgWUn3Uk5h+wkckU2L4fxEMiIv8FrGsEtoYFN1d5yD P239A8P1GrJN8ZhkyOJ9yNFGZPH8ldevSO6GWMlRayaIgWtKfW5rqNzSHCQzu/xTcJxy X0ogxdyIBv3lSIS/2oIm9AsasOJLh51qh9R3k= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745921580; x=1746526380; 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=Ri4wmQ14jFAaQdVruW8LmHQFglkscs4x372ajXNwYuk=; b=Pul3xI7d7Igo9GblNC7kK8EeNr53jNiPOQGz86mdCfbM4vMQVnUTdFLjBPddBylUbR X4x/M+t4OO/jJ8x7MyGAhw+P0AiXH7FVe+dgQUjkwwBaZ4yErUZ8FCMqxeDdXG6SpSHp 43dEcwiJmChrENQplwcyciVTI9Ro6IlIVX5Q2paQxiK1hPmqcm7dgASf44sVdKhQrsMT IVQ0wcxLhq+sOL25TGXtwjq/FT+h0aC2OUWMJO3SLSKb0q6BZl9ZhWi4Mc2yWPcbTN+G /zAfZO9Jh7x2vPUVZiJ19lG1NYZqG9Jzji4V62KahUubZ502bvaW2SDz9+LG8iASRfft d5pw== X-Gm-Message-State: AOJu0Ywh95CzOPOoCh5XaZ3fFbO+ZOyApt7dDJkA9hNdJDWaK6WlPWl3 AC2kQ9DvsC0dvWLxt9rYE5uuKshgt5WF6B0GSIPcR4u3Y7XkgKVzuswhtCpEmIbTffJcNh1F9FP e X-Gm-Gg: ASbGncsg+WXzKNPPBkbz1KwaWpTjjz/H+uPtNUku2LlQlCXSUUrxoANrlZVtSHzNTer 0GKo0l70ys4CouB8iDhBZU3zjyCi4W+T6vRsE1N1Te+1KI8LR6arSKF26KB5N58nluHDNbn6FNi rEdRHxSDp29oB/6NQk1XN/Zjt45c/0XJ9S+m+ReE6cMP3H4IV5aVh5d5EkbRWlqQl5FrLozgO1w vVVjY4ygIRljp8Ju1sEieha1PcQA8LOrPEKJZKRJ1c0tGqWU6CmU0l+V6Y1BtHRdGS0+UOqlJ01 FYwGh6l4rTH7dRwzoF8ayN34bTBOUeNEJfLzSFAy3pGNUA== X-Google-Smtp-Source: AGHT+IHgXp+/R0LpuIdMsyNrEQcDMzkWjxDQlbrc35ABQreyke2WHfj270jhEweqbBy9adnfizgq9w== X-Received: by 2002:a05:600c:1912:b0:43d:7588:6688 with SMTP id 5b1f17b1804b1-441ac857271mr29144405e9.12.1745921580280; Tue, 29 Apr 2025 03:13:00 -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 v4 1/4] xen/io: provide helpers for multi size MMIO accesses Date: Tue, 29 Apr 2025 12:12:49 +0200 Message-ID: <20250429101252.50071-2-roger.pau@citrix.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250429101252.50071-1-roger.pau@citrix.com> References: <20250429101252.50071-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: 1745921598329019100 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: Jan Beulich --- Changes since v3: - Rebase on top of Jan's fix to mmio_ro_emulated_write(). --- xen/arch/x86/hvm/vmsi.c | 47 ++------------------------- xen/arch/x86/mm.c | 32 ++++++------------- xen/drivers/vpci/msix.c | 47 ++------------------------- xen/include/xen/io.h | 70 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 111 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 ac5b51d17aca..732ca1366f33 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; @@ -5131,26 +5131,8 @@ 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(); + if ( !write_mmio(addr + offset, data, len) ) goto write_ignored; - } } =20 #ifdef CONFIG_HVM @@ -5185,6 +5167,7 @@ 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 || @@ -5195,9 +5178,12 @@ int cf_check mmio_ro_emulated_write( return X86EMUL_UNHANDLEABLE; } =20 - if ( bytes <=3D 8 ) + if ( bytes <=3D sizeof(data) ) + { + memcpy(&data, p_data, bytes); subpage_mmio_write_emulate(mmio_ro_ctxt->mfn, PAGE_OFFSET(offset), - p_data, bytes); + data, bytes); + } else if ( subpage_mmio_find_page(mmio_ro_ctxt->mfn) ) gprintk(XENLOG_WARNING, "unsupported %u-byte write to R/O MMIO 0x%"PRI_mfn"%03lx\n= ", diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c index 3568f2a65183..74211301ba10 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 @@ -338,28 +339,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; @@ -487,28 +467,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..164a20c5d7b5 --- /dev/null +++ b/xen/include/xen/io.h @@ -0,0 +1,70 @@ +/* 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 bool 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(); + return false; + } + + return true; +} + +#endif /* XEN_IO_H */ --=20 2.48.1 From nobody Fri Oct 31 16:00:09 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=1745921599; cv=none; d=zohomail.com; s=zohoarc; b=hx7iVmlWfOMvfEIIK6iDnaZaUMUTZGi8yTyBuHF2YieZgcHgf0g4i0cl7fdorRa8/t/EuqiXiRvjXIxoMt8kmMktD6t1BtRdCr/loP0LtqGw4gvytbRyaDb6T6I8uHpK/lD+xbiYLRq+05g1UH3TUUmIBiR+0xNmZ/i60h+XljM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745921599; 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=3qDnZhkRYsd1U3ruM3uE3iPm911quTZ0Y+raFmRmVYE=; b=COCjSDGdJHlaNiboaqTaDcN1zCIBDqkIqUOq1TzUyaVHkn+uo7QcMQ3tEqSKCrOCXZM2maXQTl2KBetR1qjmrrSQZqwsrcTOlsJVzBbeNjBRzz8JCItsAzlhkddDnnC6UnAPK26vwySg/8JZPobPRdttPOOYBZTLyYs6i22Ix+E= 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 1745921599143439.8115749929967; Tue, 29 Apr 2025 03:13:19 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.971783.1360189 (Exim 4.92) (envelope-from ) id 1u9hxZ-0003Fe-0R; Tue, 29 Apr 2025 10:13:05 +0000 Received: by outflank-mailman (output) from mailman id 971783.1360189; Tue, 29 Apr 2025 10:13:04 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u9hxY-0003FS-TZ; Tue, 29 Apr 2025 10:13:04 +0000 Received: by outflank-mailman (input) for mailman id 971783; Tue, 29 Apr 2025 10:13:03 +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 1u9hxX-0002lF-8Z for xen-devel@lists.xenproject.org; Tue, 29 Apr 2025 10:13:03 +0000 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [2a00:1450:4864:20::330]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 88ed6266-24e2-11f0-9eb4-5ba50f476ded; Tue, 29 Apr 2025 12:13:02 +0200 (CEST) Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-43cec5cd73bso28446945e9.3 for ; Tue, 29 Apr 2025 03:13:02 -0700 (PDT) Received: from localhost ([84.78.159.3]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-3a073e5d52bsm13894300f8f.90.2025.04.29.03.13.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 03:13:01 -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: 88ed6266-24e2-11f0-9eb4-5ba50f476ded DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com; s=google; t=1745921582; x=1746526382; 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=3qDnZhkRYsd1U3ruM3uE3iPm911quTZ0Y+raFmRmVYE=; b=Bp8+EC38jzQ/4RdQJMDGyx1VLYUHS+QM0SnwJ2QoA6pmvsDCF564kSHYxa/anbgMoR pSXOlu0YXrT6JHLwppenJT/dEA6EYbS4+lXzpMFxpuNLzYn5TTHtXV04lBWO+cV6x69i LOdoCVYowoMtaHrUGYkb7bOHihdtZw3U4jM5U= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745921582; x=1746526382; 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=3qDnZhkRYsd1U3ruM3uE3iPm911quTZ0Y+raFmRmVYE=; b=Z2YPh/djuaRZvTa7QBhkKym8OI5sEPChkEyesMVvxBeVAFUURTgV0Jleps0b1EqZM1 8GFrTMjZUdWwMgZjlUwS8lT1x6RdQwMBdPb3Z65RaClgHYdMwKIn0D8V0pzazkucidpv e5Ku8FHF7FsqqwhkAw0F0sXwDMp6HjYMpf64f6HHTaX3YQkMvyTo96AyShSFMeIh17Hn 3XwRIOlyjjFUp96hNA8A/Jih0hbxWEkZDkRk8TtLCOXlnRY6Eyatz5YvLSlCmBpQ3i1P ii8fzA8XBZyzcZhspadnBDhHxxYEWj+d2jOY5n6oQWjxB4Z/DjcIxeLQ6yeqqODnCSk6 gOHw== X-Gm-Message-State: AOJu0YwF/5ApiVkHXQCcH0h7gCx1L6G7zR3yV7FuSUYzN5voQJydWzmB dGWpi7wxC75pbTt9ASaDtfIEVcZ1h04m9D3GXynTMjyLhTeoXpuk0czbyipwImp2VDIJvHLcAzg s X-Gm-Gg: ASbGncuqME0IkX8jSEVX2AGwRRuOxCYVNIZO+YtNQMad/f2lIc7sHQY0TYa7wfDrJuo yKKzb6ooUwSC+zrwg4qbDPI7J79a20j3f76vyaBkP/MEItfZITsg/bNzpFRmR9P/RYLYd8pBDSu CrRH5mqS177GdwrlEFo5U5AHC+xuTeMB+FvwVMsXdAJ2WqZix4E0DEwjaWops1jXPTAPLCXZDi0 Nt1R8UxvpVWhLU/xXcxd+bd5fUDlkcdU3WiVaPSOqFfvkkqGiUmD22RaZ7dFkYvbMD1HPMF5ZWE Ceh1jKCSlnCbwWJOUE1ioPwt23tv4VwDEzUMLE1xmCzGpcg508Ns0LOG X-Google-Smtp-Source: AGHT+IGFy1rbgvQrefp2JREBWfAhk9rbMlRPVXbpV5Xb1x8PJwNWWUNxwZh9BGNQuUKMyL+AwR4qdw== X-Received: by 2002:a05:6000:310d:b0:391:2f2f:818 with SMTP id ffacd0b85a97d-3a08ad282e0mr1675319f8f.9.1745921581806; Tue, 29 Apr 2025 03:13:01 -0700 (PDT) From: Roger Pau Monne To: xen-devel@lists.xenproject.org Cc: Roger Pau Monne , Jan Beulich , Andrew Cooper Subject: [PATCH v4 2/4] x86/hvm: fix handling of accesses to partial r/o MMIO pages Date: Tue, 29 Apr 2025 12:12:50 +0200 Message-ID: <20250429101252.50071-3-roger.pau@citrix.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250429101252.50071-1-roger.pau@citrix.com> References: <20250429101252.50071-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: 1745921600730019000 The current logic to handle accesses to MMIO pages partially read-only is based on the (now removed) logic used to handle accesses to the r/o MMCFG region(s) for PVH v1 dom0. However that has issues when running on AMD hardware, as in that case the guest linear address that triggered the fault is not provided as part of the VM exit. This caused mmio_ro_emulated_write() to always fail before calling subpage_mmio_write_emulate() when running on AMD and called from an HVM context. Take a different approach and convert the handling of partial read-only MMIO page accesses into an HVM MMIO ops handler, as that's the more natural way to handle this kind of emulation for HVM domains. This allows getting rid of hvm_emulate_one_mmio() and it's single call site in hvm_hap_nested_page_fault(). As part of the fix r/o MMIO accesses are now handled by handle_mmio_with_translation(), re-using the same logic that was used for other read-only types part of p2m_is_discard_write(). The usage of emulation for faulting p2m_mmio_direct types is limited to addresses in the r/o MMIO range. The page present check is dropped as type p2m_mmio_direct must have the present bit set in the PTE. Note a small adjustment is needed to the `pf-fixup` dom0 PVH logic: avoid attempting to fixup faults resulting from write accesses to read-only MMIO regions, as handling of those accesses is now done by handle_mmio(). Fixes: 33c19df9a5a0 ('x86/PCI: intercept accesses to RO MMIO from dom0s in = HVM containers') Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Jan Beulich --- Changes since v3: - Fix usage of addr vs gfn. - Fix order of checks in hvmemul_do_io(). Changes since v2: - Attempt to fixup read access to r/o MMIO regions for dom0 PVH. - Use PFN_DOWN() with get_gfn_query(). - Reject unaligned accesses. - Add comment about the need to handle reads. Changes since v1: - Introduce hvm/mmio.c to place the r/o MMIO handlers. - Add comment about pf-fixup and r/o MMIO range checking. - Expand commit message about dropping the PTE present check and usage of the emulator. - Return X86EMUL_OKAY in the read handler if the MMIO region is not found. - Check the faulting address is in the mmio_ro_ranges before sending for emulation. --- xen/arch/x86/hvm/Makefile | 1 + xen/arch/x86/hvm/emulate.c | 54 ++--------- xen/arch/x86/hvm/hvm.c | 17 ++-- xen/arch/x86/hvm/mmio.c | 125 +++++++++++++++++++++++++ xen/arch/x86/include/asm/hvm/emulate.h | 1 - xen/arch/x86/include/asm/hvm/io.h | 3 + xen/arch/x86/include/asm/mm.h | 12 +++ xen/arch/x86/mm.c | 37 +------- 8 files changed, 160 insertions(+), 90 deletions(-) create mode 100644 xen/arch/x86/hvm/mmio.c diff --git a/xen/arch/x86/hvm/Makefile b/xen/arch/x86/hvm/Makefile index 4c1fa5c6c2bf..6ec2c8f2db56 100644 --- a/xen/arch/x86/hvm/Makefile +++ b/xen/arch/x86/hvm/Makefile @@ -15,6 +15,7 @@ obj-y +=3D intercept.o obj-y +=3D io.o obj-y +=3D ioreq.o obj-y +=3D irq.o +obj-y +=3D mmio.o obj-y +=3D monitor.o obj-y +=3D mtrr.o obj-y +=3D nestedhvm.o diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 79c180b408ac..91f004d23394 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -370,7 +370,15 @@ static int hvmemul_do_io( /* If there is no suitable backing DM, just ignore accesses */ if ( !s ) { - if ( is_mmio && is_hardware_domain(currd) ) + if ( is_mmio && is_hardware_domain(currd) && + /* + * Do not attempt to fixup write accesses to r/o MMIO reg= ions, + * they are expected to be terminated by the null handler + * below. + */ + (dir =3D=3D IOREQ_READ || + !rangeset_contains_singleton(mmio_ro_ranges, + PFN_DOWN(addr))) ) { /* * PVH dom0 is likely missing MMIO mappings on the p2m, du= e to @@ -2859,50 +2867,6 @@ int hvm_emulate_one( return _hvm_emulate_one(hvmemul_ctxt, &hvm_emulate_ops, completion); } =20 -int hvm_emulate_one_mmio(unsigned long mfn, unsigned long gla) -{ - static const struct x86_emulate_ops hvm_ro_emulate_ops_mmio =3D { - .read =3D x86emul_unhandleable_rw, - .insn_fetch =3D hvmemul_insn_fetch, - .write =3D mmio_ro_emulated_write, - .validate =3D hvmemul_validate, - }; - struct mmio_ro_emulate_ctxt mmio_ro_ctxt =3D { .cr2 =3D gla, .mfn =3D = _mfn(mfn) }; - struct hvm_emulate_ctxt ctxt; - unsigned int seg, bdf; - int rc; - - if ( pci_ro_mmcfg_decode(mfn, &seg, &bdf) ) - { - /* Should be always handled by vPCI for PVH dom0. */ - gdprintk(XENLOG_ERR, "unhandled MMCFG access for %pp\n", - &PCI_SBDF(seg, bdf)); - ASSERT_UNREACHABLE(); - return X86EMUL_UNHANDLEABLE; - } - - hvm_emulate_init_once(&ctxt, x86_insn_is_mem_write, - guest_cpu_user_regs()); - ctxt.ctxt.data =3D &mmio_ro_ctxt; - - switch ( rc =3D _hvm_emulate_one(&ctxt, &hvm_ro_emulate_ops_mmio, - VIO_no_completion) ) - { - case X86EMUL_UNHANDLEABLE: - case X86EMUL_UNIMPLEMENTED: - hvm_dump_emulation_state(XENLOG_G_WARNING, "r/o MMIO", &ctxt, rc); - break; - case X86EMUL_EXCEPTION: - hvm_inject_event(&ctxt.ctxt.event); - /* fallthrough */ - default: - hvm_emulate_writeback(&ctxt); - break; - } - - return rc; -} - void hvm_emulate_one_vm_event(enum emul_kind kind, unsigned int trapnr, unsigned int errcode) { diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 6f1174c5127e..6b998387e3d8 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -8,6 +8,7 @@ */ =20 #include +#include #include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -692,6 +692,8 @@ int hvm_domain_initialise(struct domain *d, =20 register_portio_handler(d, XEN_HVM_DEBUGCONS_IOPORT, 1, hvm_print_line= ); =20 + register_subpage_ro_handler(d); + if ( hvm_tsc_scaling_supported ) d->arch.hvm.tsc_scaling_ratio =3D hvm_default_tsc_scaling_ratio; =20 @@ -1981,7 +1983,10 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned = long gla, */ if ( (p2mt =3D=3D p2m_mmio_dm) || (npfec.write_access && - (p2m_is_discard_write(p2mt) || (p2mt =3D=3D p2m_ioreq_server))) ) + (p2m_is_discard_write(p2mt) || (p2mt =3D=3D p2m_ioreq_server) || + /* MMIO entries can be r/o if the target mfn is in mmio_ro_rang= es. */ + (p2mt =3D=3D p2m_mmio_direct && + rangeset_contains_singleton(mmio_ro_ranges, mfn_x(mfn))))) ) { if ( !handle_mmio_with_translation(gla, gfn, npfec) ) hvm_inject_hw_exception(X86_EXC_GP, 0); @@ -2033,14 +2038,6 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned = long gla, goto out_put_gfn; } =20 - if ( (p2mt =3D=3D p2m_mmio_direct) && npfec.write_access && npfec.pres= ent && - (is_hardware_domain(currd) || subpage_mmio_write_accept(mfn, gla)= ) && - (hvm_emulate_one_mmio(mfn_x(mfn), gla) =3D=3D X86EMUL_OKAY) ) - { - rc =3D 1; - goto out_put_gfn; - } - /* If we fell through, the vcpu will retry now that access restriction= s have * been removed. It may fault again if the p2m entry type still requir= es so. * Otherwise, this is an error condition. */ diff --git a/xen/arch/x86/hvm/mmio.c b/xen/arch/x86/hvm/mmio.c new file mode 100644 index 000000000000..32a520caac12 --- /dev/null +++ b/xen/arch/x86/hvm/mmio.c @@ -0,0 +1,125 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * MMIO related routines. + * + * Copyright (c) 2025 Cloud Software Group + */ + +#include +#include + +#include + +static int cf_check subpage_mmio_accept(struct vcpu *v, unsigned long addr) +{ + p2m_type_t t; + mfn_t mfn =3D get_gfn_query_unlocked(v->domain, PFN_DOWN(addr), &t); + + return !mfn_eq(mfn, INVALID_MFN) && t =3D=3D p2m_mmio_direct && + subpage_mmio_find_page(mfn); +} + +/* + * The guest has read access to those regions, and consequently read acces= ses + * shouldn't fault. However read-modify-write operations may take this pa= th, + * so handling of reads is necessary. + */ +static int cf_check subpage_mmio_read( + struct vcpu *v, unsigned long addr, unsigned int len, unsigned long *d= ata) +{ + struct domain *d =3D v->domain; + unsigned long gfn =3D PFN_DOWN(addr); + p2m_type_t t; + mfn_t mfn; + struct subpage_ro_range *entry; + volatile void __iomem *mem; + + *data =3D ~0UL; + + if ( !len || len > 8 || len & (len - 1) || !IS_ALIGNED(addr, len) ) + { + gprintk(XENLOG_ERR, + "ignoring unaligned read to r/o MMIO subpage %#lx size %u\= n", + addr, len); + return X86EMUL_OKAY; + } + + mfn =3D get_gfn_query(d, gfn, &t); + if ( mfn_eq(mfn, INVALID_MFN) || t !=3D p2m_mmio_direct ) + { + put_gfn(d, gfn); + return X86EMUL_RETRY; + } + + entry =3D subpage_mmio_find_page(mfn); + if ( !entry ) + { + put_gfn(d, gfn); + return X86EMUL_OKAY; + } + + mem =3D subpage_mmio_map_page(entry); + if ( !mem ) + { + put_gfn(d, gfn); + gprintk(XENLOG_ERR, + "Failed to map page for MMIO read at %#lx -> %#lx\n", + addr, mfn_to_maddr(mfn) + PAGE_OFFSET(addr)); + return X86EMUL_OKAY; + } + + *data =3D read_mmio(mem + PAGE_OFFSET(addr), len); + + put_gfn(d, gfn); + return X86EMUL_OKAY; +} + +static int cf_check subpage_mmio_write( + struct vcpu *v, unsigned long addr, unsigned int len, unsigned long da= ta) +{ + struct domain *d =3D v->domain; + unsigned long gfn =3D PFN_DOWN(addr); + p2m_type_t t; + mfn_t mfn; + + if ( !len || len > 8 || len & (len - 1) || !IS_ALIGNED(addr, len) ) + { + gprintk(XENLOG_ERR, + "ignoring unaligned write to r/o MMIO subpage %#lx size %u= \n", + addr, len); + return X86EMUL_OKAY; + } + + mfn =3D get_gfn_query(d, gfn, &t); + if ( mfn_eq(mfn, INVALID_MFN) || t !=3D p2m_mmio_direct ) + { + put_gfn(d, gfn); + return X86EMUL_RETRY; + } + + subpage_mmio_write_emulate(mfn, PAGE_OFFSET(addr), data, len); + + put_gfn(d, gfn); + return X86EMUL_OKAY; +} + +void register_subpage_ro_handler(struct domain *d) +{ + static const struct hvm_mmio_ops subpage_mmio_ops =3D { + .check =3D subpage_mmio_accept, + .read =3D subpage_mmio_read, + .write =3D subpage_mmio_write, + }; + + register_mmio_handler(d, &subpage_mmio_ops); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/x86/include/asm/hvm/emulate.h b/xen/arch/x86/include/= asm/hvm/emulate.h index c7a2d2a5be4e..178ac32e151f 100644 --- a/xen/arch/x86/include/asm/hvm/emulate.h +++ b/xen/arch/x86/include/asm/hvm/emulate.h @@ -86,7 +86,6 @@ void hvmemul_cancel(struct vcpu *v); struct segment_register *hvmemul_get_seg_reg( enum x86_segment seg, struct hvm_emulate_ctxt *hvmemul_ctxt); -int hvm_emulate_one_mmio(unsigned long mfn, unsigned long gla); =20 static inline bool handle_mmio(void) { diff --git a/xen/arch/x86/include/asm/hvm/io.h b/xen/arch/x86/include/asm/h= vm/io.h index 565bad300d20..c12f099a037c 100644 --- a/xen/arch/x86/include/asm/hvm/io.h +++ b/xen/arch/x86/include/asm/hvm/io.h @@ -135,6 +135,9 @@ void destroy_vpci_mmcfg(struct domain *d); /* Remove MMCFG regions from a domain ->iomem_caps. */ int vpci_mmcfg_deny_access(struct domain *d); =20 +/* r/o MMIO subpage access handler. */ +void register_subpage_ro_handler(struct domain *d); + #endif /* __ASM_X86_HVM_IO_H__ */ =20 =20 diff --git a/xen/arch/x86/include/asm/mm.h b/xen/arch/x86/include/asm/mm.h index a1bc8cc27451..c2e9ef6e5023 100644 --- a/xen/arch/x86/include/asm/mm.h +++ b/xen/arch/x86/include/asm/mm.h @@ -554,6 +554,18 @@ int cf_check mmio_ro_emulated_write( enum x86_segment seg, unsigned long offset, void *p_data, unsigned int bytes, struct x86_emulate_ctxt *ctxt); =20 +/* r/o MMIO subpage access handlers. */ +struct subpage_ro_range { + struct list_head list; + mfn_t mfn; + void __iomem *mapped; + DECLARE_BITMAP(ro_elems, PAGE_SIZE / MMIO_RO_SUBPAGE_GRAN); +}; +struct subpage_ro_range *subpage_mmio_find_page(mfn_t mfn); +void __iomem *subpage_mmio_map_page(struct subpage_ro_range *entry); +void subpage_mmio_write_emulate( + mfn_t mfn, unsigned int offset, unsigned long data, unsigned int len); + int audit_adjust_pgtables(struct domain *d, int dir, int noisy); =20 extern int pagefault_by_memadd(unsigned long addr, struct cpu_user_regs *r= egs); diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 732ca1366f33..7ead2db3cb72 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -157,13 +157,6 @@ struct rangeset *__read_mostly mmio_ro_ranges; static uint32_t __ro_after_init base_disallow_mask; =20 /* Handling sub-page read-only MMIO regions */ -struct subpage_ro_range { - struct list_head list; - mfn_t mfn; - void __iomem *mapped; - DECLARE_BITMAP(ro_elems, PAGE_SIZE / MMIO_RO_SUBPAGE_GRAN); -}; - static LIST_HEAD_RO_AFTER_INIT(subpage_ro_ranges); static DEFINE_SPINLOCK(subpage_ro_lock); =20 @@ -4929,7 +4922,7 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HAND= LE_PARAM(void) arg) return rc; } =20 -static struct subpage_ro_range *subpage_mmio_find_page(mfn_t mfn) +struct subpage_ro_range *subpage_mmio_find_page(mfn_t mfn) { struct subpage_ro_range *entry; =20 @@ -5074,7 +5067,7 @@ int __init subpage_mmio_ro_add( return rc; } =20 -static void __iomem *subpage_mmio_map_page( +void __iomem *subpage_mmio_map_page( struct subpage_ro_range *entry) { void __iomem *mapped_page; @@ -5099,7 +5092,7 @@ static void __iomem *subpage_mmio_map_page( return entry->mapped; } =20 -static void subpage_mmio_write_emulate( +void subpage_mmio_write_emulate( mfn_t mfn, unsigned int offset, unsigned long data, @@ -5135,30 +5128,6 @@ static void subpage_mmio_write_emulate( goto write_ignored; } =20 -#ifdef CONFIG_HVM -bool subpage_mmio_write_accept(mfn_t mfn, unsigned long gla) -{ - unsigned int offset =3D PAGE_OFFSET(gla); - const struct subpage_ro_range *entry; - - entry =3D subpage_mmio_find_page(mfn); - if ( !entry ) - return false; - - if ( !test_bit(offset / MMIO_RO_SUBPAGE_GRAN, entry->ro_elems) ) - { - /* - * We don't know the write size at this point yet, so it could be - * an unaligned write, but accept it here anyway and deal with it - * later. - */ - return true; - } - - return false; -} -#endif - int cf_check mmio_ro_emulated_write( enum x86_segment seg, unsigned long offset, --=20 2.48.1 From nobody Fri Oct 31 16:00:09 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=1745921603; cv=none; d=zohomail.com; s=zohoarc; b=mPFxRQSAoetcwhoeVCHn5o7apRqP4Ke1ZGCQwEm2v2hfBYm7xA51x1Qz7yogFw/1XpD10ciWpiMt8lL2Rmz+9Cni1if+FdMZLv+sYxaRBXYjbXMby+HYSQgJHxSjY16A4tIWefv2GeWPsk1/97hc/saTd+6gAUdC+D+UEcHiydU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745921603; 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=7CJ1GLjFyCNm9vFKPLq5u51w/wTBpAsdbN9G66Tv51c=; b=YyoqUUvvyRL74q1eErN84toZsZ28SUNTxxYeVgDC2vSlpvMUoROKY+TRMx8Ykxz0qt9PutNXHBZ78G1bO/G1XM6fGztLIVbt9BN+TrRXp8GS1/Qb/0+7Qk83rOUucnTxZ3D8wURnkKV7wDeQGV2mQoo7i5xQuYLdBuYJpzgk57k= 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 1745921603835474.47339050074845; Tue, 29 Apr 2025 03:13:23 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.971785.1360205 (Exim 4.92) (envelope-from ) id 1u9hxa-0003Vr-JD; Tue, 29 Apr 2025 10:13:06 +0000 Received: by outflank-mailman (output) from mailman id 971785.1360205; Tue, 29 Apr 2025 10:13:06 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u9hxa-0003VX-As; Tue, 29 Apr 2025 10:13:06 +0000 Received: by outflank-mailman (input) for mailman id 971785; Tue, 29 Apr 2025 10:13:04 +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 1u9hxY-0002lF-Fc for xen-devel@lists.xenproject.org; Tue, 29 Apr 2025 10:13:04 +0000 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [2a00:1450:4864:20::334]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 89953c43-24e2-11f0-9eb4-5ba50f476ded; Tue, 29 Apr 2025 12:13:04 +0200 (CEST) Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-43ede096d73so39259445e9.2 for ; Tue, 29 Apr 2025 03:13:04 -0700 (PDT) Received: from localhost ([84.78.159.3]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-440a53108f2sm150572995e9.19.2025.04.29.03.13.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 03:13:02 -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: 89953c43-24e2-11f0-9eb4-5ba50f476ded DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com; s=google; t=1745921583; x=1746526383; 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=7CJ1GLjFyCNm9vFKPLq5u51w/wTBpAsdbN9G66Tv51c=; b=SQyP7R89jWcMAVcIkv/JqhTjjRpjrbgbhUYoBvOsdwdD3Wh6OiQaMu/Hm8eLpjtkWk N6rMt7bwv0Wkftn2YPZ/B3IClRYJZX6F78PAKwo8I4DHkWGxhC4GxRJfaOKGJIfkb3bQ qErjOZOGksI7wlijJjyBpuwrJzQJXR3JIi/TI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745921583; x=1746526383; 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=7CJ1GLjFyCNm9vFKPLq5u51w/wTBpAsdbN9G66Tv51c=; b=B7pukYyTtyCrjEKRab7UwYziQW/ynzCd8vrPP4UtTO0G0juqCXjUuieJSR7L+ywie2 9oVEbpOiGJW+JCAsZ4F4mGuf3w4faE0f6zx36DZT22U1jtcTNNJ/HIuFJCxubQJTOaeG SnLq+ZeDX1ar3Q5xAxzs29DWUmU7tCazTwyXzsYreOz8KXnsYXERvt72jPjC+H2WcogP h28yiyvWlkJ2BeegOnJfzjda7xG+mVKDQTslLz6qgSNv4GK60vyTN7nYUxijQRZa3q98 CaNJqnk1PkY18J7lJfkIiSM3hBRdtP9yJdv7EwTP6eBC9v6vcMqIy9XMhbvopxfU2/yI f/Og== X-Gm-Message-State: AOJu0YwCq66bQFvgfRdHVRrFI+e2QeJXgSpSuc9ElBXNyTU9taE7qp4p Bg6iKVp5I76y3818kVeZhIs7oGmVge5wLFbxhcfyS0KSwu1kkf+aN4qxuyplD0+FesNH/sm8Z3V N X-Gm-Gg: ASbGncsuTXC/Fa7srhN60k7Ezxk/0WNZzFMtXh98cpZ2zWK5nTKPO4Q8Ntcs+xQbWEv Njsmzn3FSI9WOO2tqGWXz5M8qQbXBzekn7VedDNBV5FSQGbyqXKvY4D4vxqD/kL6/8sBqM72PgU RQVYw7RNwAJpHv5HxOpVCuw4moPzeI02JKCUsCPWhV1ADfbB7/PtefXyVtZhbyqftiNly2rgrPK QpxMiZnmTEbMR2BhQQn4Eqf0BRLzA4CPRq/kT6gAVHEhOlGyESnfJPl+kh56NhyIcv208bRoOwC 2W5WzNuF2vzfS52iDwe/JT6BndwOdj/7RDn+gNQKeNb9YQ== X-Google-Smtp-Source: AGHT+IEOJ/wfcryri+UbOqfRiNzGC0pauT7wSOakZOHefUanQmRnJPgvW2y8PUSCV9XJ1ox1hpvLqg== X-Received: by 2002:a05:600c:4ec8:b0:43d:36c:f24 with SMTP id 5b1f17b1804b1-441ac858518mr27540835e9.13.1745921582977; Tue, 29 Apr 2025 03:13:02 -0700 (PDT) From: Roger Pau Monne To: xen-devel@lists.xenproject.org Cc: Roger Pau Monne , Jan Beulich , Andrew Cooper Subject: [PATCH v4 3/4] x86/hvm: only register the r/o subpage ops when needed Date: Tue, 29 Apr 2025 12:12:51 +0200 Message-ID: <20250429101252.50071-4-roger.pau@citrix.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250429101252.50071-1-roger.pau@citrix.com> References: <20250429101252.50071-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: 1745921604621019000 MMIO operation handlers can be expensive to process, hence attempt to register only those that will be needed by the domain. Subpage r/o MMIO regions are added exclusively at boot, further limit their addition to strictly before the initial domain gets created, so by the time initial domain creation happens Xen knows whether subpage is required or not. This allows only registering the MMIO handler when there are subpage regions to handle. Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Jan Beulich --- Could possibly be part of the previous patch, but strictly speaking is an improvement, as even before the previous patch subpage r/o was always called even when no subpage regions are registered. --- xen/arch/x86/hvm/hvm.c | 3 ++- xen/arch/x86/include/asm/mm.h | 1 + xen/arch/x86/mm.c | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 6b998387e3d8..4cb2e13046d1 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -692,7 +692,8 @@ int hvm_domain_initialise(struct domain *d, =20 register_portio_handler(d, XEN_HVM_DEBUGCONS_IOPORT, 1, hvm_print_line= ); =20 - register_subpage_ro_handler(d); + if ( subpage_ro_active() ) + register_subpage_ro_handler(d); =20 if ( hvm_tsc_scaling_supported ) d->arch.hvm.tsc_scaling_ratio =3D hvm_default_tsc_scaling_ratio; diff --git a/xen/arch/x86/include/asm/mm.h b/xen/arch/x86/include/asm/mm.h index c2e9ef6e5023..aeb8ebcf2d56 100644 --- a/xen/arch/x86/include/asm/mm.h +++ b/xen/arch/x86/include/asm/mm.h @@ -561,6 +561,7 @@ struct subpage_ro_range { void __iomem *mapped; DECLARE_BITMAP(ro_elems, PAGE_SIZE / MMIO_RO_SUBPAGE_GRAN); }; +bool subpage_ro_active(void); struct subpage_ro_range *subpage_mmio_find_page(mfn_t mfn); void __iomem *subpage_mmio_map_page(struct subpage_ro_range *entry); void subpage_mmio_write_emulate( diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 7ead2db3cb72..6697984507bf 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4922,6 +4922,11 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HAN= DLE_PARAM(void) arg) return rc; } =20 +bool subpage_ro_active(void) +{ + return !list_empty(&subpage_ro_ranges); +} + struct subpage_ro_range *subpage_mmio_find_page(mfn_t mfn) { struct subpage_ro_range *entry; @@ -5011,6 +5016,17 @@ int __init subpage_mmio_ro_add( !IS_ALIGNED(size, MMIO_RO_SUBPAGE_GRAN) ) return -EINVAL; =20 + /* + * Force all r/o subregions to be registered before initial domain + * creation, so that the emulation handlers can be added only when the= re + * are pages registered. + */ + if ( system_state >=3D SYS_STATE_smp_boot ) + { + ASSERT_UNREACHABLE(); + return -EILSEQ; + } + if ( !size ) return 0; =20 --=20 2.48.1 From nobody Fri Oct 31 16:00:09 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=1745921599; cv=none; d=zohomail.com; s=zohoarc; b=DKbStfOV/ZM23+a/QPqHDM76/rCuuZh+Cb9YsxR2SET+Yi1bmFXAJfKqU+qFVe4gCC+1QnCu4KVLShjkH+nx3mnbx2gmTXbR6TljU6dUpWHSxQvqxxExHWp8UCerHr0xR7oYt3bW9hGVul7yBsZ5FE8ikx4rcZ6Oi8lXxyUYAPE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1745921599; 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=4j1Fs93O6tjqerfgJEMn6A5AQPD2o+Vigwy9v3Ww7I8=; b=Cuorkv9ZEjt6tXlhjcvFGKU1p+YW6dZcVFR6JEhA96Y/C77hdizg9VuG36brc0DwZ8XSBZuesPg21Hx0cyIHHFbpr1GORQO0aBp8HVyo23lfiWzEl1Xl/2/9Be67FlSxzVEO9OPoWX24nKSGnXjbGTrI95OgBBMNMlsnLMGDbeE= 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 1745921599439792.6075503436308; Tue, 29 Apr 2025 03:13:19 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.971786.1360209 (Exim 4.92) (envelope-from ) id 1u9hxa-0003dH-W5; Tue, 29 Apr 2025 10:13:06 +0000 Received: by outflank-mailman (output) from mailman id 971786.1360209; Tue, 29 Apr 2025 10:13:06 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1u9hxa-0003b9-R9; Tue, 29 Apr 2025 10:13:06 +0000 Received: by outflank-mailman (input) for mailman id 971786; Tue, 29 Apr 2025 10:13:05 +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 1u9hxZ-0002lF-Gm for xen-devel@lists.xenproject.org; Tue, 29 Apr 2025 10:13:05 +0000 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [2a00:1450:4864:20::331]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 8a5280d6-24e2-11f0-9eb4-5ba50f476ded; Tue, 29 Apr 2025 12:13:05 +0200 (CEST) Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-43d04dc73b7so51827965e9.3 for ; Tue, 29 Apr 2025 03:13:05 -0700 (PDT) Received: from localhost ([84.78.159.3]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-440a5369cc1sm149831235e9.32.2025.04.29.03.13.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 03:13:03 -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: 8a5280d6-24e2-11f0-9eb4-5ba50f476ded DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=citrix.com; s=google; t=1745921584; x=1746526384; 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=4j1Fs93O6tjqerfgJEMn6A5AQPD2o+Vigwy9v3Ww7I8=; b=gJEmhmKeLLhGMa+0s45tCYde3oHenqR2jSFAOuxOem26R6EH8Wi0Ldl7qlJwh7WmqT zsc8QagnSXDhzMT5+f3NeuYGPQltnnleflLprWtoPxpCAo7mM0klfPakeMBfvcgqIW2g EEDnkUtfQdJ3w2pWqFfGs7OspQOCHjWzTiKq4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745921584; x=1746526384; 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=4j1Fs93O6tjqerfgJEMn6A5AQPD2o+Vigwy9v3Ww7I8=; b=wHfpUtw/pGcBJQF6UhJPKFDGVWyvN3OCcDg0YTpIJno+ZgM2sOeU2psJsla9HwtNSf 4kjpne+Mz36BOiYa3kXrbXCigm8+7GUkR9IfaYOoJB0vrfrPUZF/BCTGSD3Fu+S3qU9Y Plq/4cx+Ut0V2+DERLALNUXdXW/UEG4q9ycUEwiYQEd0RkooVkCn0u9Kt85csQex5RYD uyb3M8WYW6+NNEhBU27M6Rab/BTUMH/952Dg8mzpqADq9cBGCvPnBC43ZPhKne5jDL2F AouYmiZHKffO7vLga2DlT4IVe38aRcp67TlARHlVa44UQSGvN+B219akUiWfchndSQ1J nCwg== X-Gm-Message-State: AOJu0YwomaHhTPbPZxM2GjLyMO7EmUD6YT/PWlLsgKRIZc94HcK1bm/b L86m5w9BjY8fbYH4ArzJ3QmxDGYYmACeIv39WIPO0NVGyFhgIjWPFpYKZzllWc7Knjm39n+DYkJ E X-Gm-Gg: ASbGncuKXoAEyFu5C5OFyRI2zGbQVV8qGUA9a2vasLtfApTcdhZgjpP6Du93b5lXTxe k+0sa7tV1DFwih6dsH4hTTbn6wbGBVJo6tQMuTdSbqhVm9nz6FgLu4D6IQnt4QVifPZAejywubY kPJVL2mkIESlREnkSqQvR/pjVqJrPj3HZmmwoaoPcgvDmuTUxYhoML5QuoVal5C748NjVMn8uDG uQV8yJVbyW6U/0SycOGAttVBoPINsPKGQWaRrFk1tkD8S1kORClowGg+rYjRdekSx9FFXK6kNIf 3qSCqMJiM8ZPjutxly4FDeasonn6ZI3ip86WhY8rl8kOYnoBHkViXAaJ X-Google-Smtp-Source: AGHT+IH9EpLHSMnxzvfs7gUApSUQ4BoJHuVuCGeqO6Q3MSGTP5KFGG3OIRWOMVxoCBH7u9boNgFPLg== X-Received: by 2002:a05:600c:1d1d:b0:43b:ce3c:19d0 with SMTP id 5b1f17b1804b1-441ac892162mr23054155e9.29.1745921584208; Tue, 29 Apr 2025 03:13:04 -0700 (PDT) From: Roger Pau Monne To: xen-devel@lists.xenproject.org Cc: Roger Pau Monne , Jan Beulich , Andrew Cooper Subject: [PATCH v4 4/4] x86/mm: move mmio_ro_emulated_write() to PV only file Date: Tue, 29 Apr 2025 12:12:52 +0200 Message-ID: <20250429101252.50071-5-roger.pau@citrix.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250429101252.50071-1-roger.pau@citrix.com> References: <20250429101252.50071-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: 1745921600870019000 mmio_ro_emulated_write() is only used in pv/ro-page-fault.c, move the function to that file and make it static. No functional change intended. Signed-off-by: Roger Pau Monn=C3=A9 Reviewed-by: Jan Beulich --- xen/arch/x86/include/asm/mm.h | 12 ---------- xen/arch/x86/mm.c | 33 -------------------------- xen/arch/x86/pv/ro-page-fault.c | 41 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/xen/arch/x86/include/asm/mm.h b/xen/arch/x86/include/asm/mm.h index aeb8ebcf2d56..2665daa6f74f 100644 --- a/xen/arch/x86/include/asm/mm.h +++ b/xen/arch/x86/include/asm/mm.h @@ -542,18 +542,6 @@ void memguard_unguard_stack(void *p); int subpage_mmio_ro_add(paddr_t start, size_t size); bool subpage_mmio_write_accept(mfn_t mfn, unsigned long gla); =20 -struct mmio_ro_emulate_ctxt { - unsigned long cr2; - /* Used only for mmcfg case */ - unsigned int seg, bdf; - /* Used only for non-mmcfg case */ - mfn_t mfn; -}; - -int cf_check mmio_ro_emulated_write( - enum x86_segment seg, unsigned long offset, void *p_data, - unsigned int bytes, struct x86_emulate_ctxt *ctxt); - /* r/o MMIO subpage access handlers. */ struct subpage_ro_range { struct list_head list; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 6697984507bf..9ac855f998dc 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5144,39 +5144,6 @@ void subpage_mmio_write_emulate( goto write_ignored; } =20 -int cf_check mmio_ro_emulated_write( - enum x86_segment seg, - unsigned long offset, - void *p_data, - unsigned int bytes, - struct x86_emulate_ctxt *ctxt) -{ - struct mmio_ro_emulate_ctxt *mmio_ro_ctxt =3D ctxt->data; - unsigned long data =3D 0; - - /* Only allow naturally-aligned stores at the original %cr2 address. */ - if ( ((bytes | offset) & (bytes - 1)) || !bytes || - offset !=3D mmio_ro_ctxt->cr2 ) - { - gdprintk(XENLOG_WARNING, "bad access (cr2=3D%lx, addr=3D%lx, bytes= =3D%u)\n", - mmio_ro_ctxt->cr2, offset, bytes); - return X86EMUL_UNHANDLEABLE; - } - - if ( bytes <=3D sizeof(data) ) - { - memcpy(&data, p_data, bytes); - subpage_mmio_write_emulate(mmio_ro_ctxt->mfn, PAGE_OFFSET(offset), - data, bytes); - } - else if ( subpage_mmio_find_page(mmio_ro_ctxt->mfn) ) - gprintk(XENLOG_WARNING, - "unsupported %u-byte write to R/O MMIO 0x%"PRI_mfn"%03lx\n= ", - bytes, mfn_x(mmio_ro_ctxt->mfn), PAGE_OFFSET(offset)); - - return X86EMUL_OKAY; -} - /* * For these PTE APIs, the caller must follow the alloc-map-unmap-free * lifecycle, which means explicitly mapping the PTE pages before accessing diff --git a/xen/arch/x86/pv/ro-page-fault.c b/xen/arch/x86/pv/ro-page-faul= t.c index 11b01c479e43..5ae77080772d 100644 --- a/xen/arch/x86/pv/ro-page-fault.c +++ b/xen/arch/x86/pv/ro-page-fault.c @@ -298,6 +298,14 @@ static int ptwr_do_page_fault(struct x86_emulate_ctxt = *ctxt, * fault handling for read-only MMIO pages */ =20 +struct mmio_ro_emulate_ctxt { + unsigned long cr2; + /* Used only for mmcfg case */ + unsigned int seg, bdf; + /* Used only for non-mmcfg case */ + mfn_t mfn; +}; + static int cf_check mmcfg_intercept_write( enum x86_segment seg, unsigned long offset, @@ -329,6 +337,39 @@ static int cf_check mmcfg_intercept_write( return X86EMUL_OKAY; } =20 +int cf_check mmio_ro_emulated_write( + enum x86_segment seg, + unsigned long offset, + void *p_data, + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) +{ + struct mmio_ro_emulate_ctxt *mmio_ro_ctxt =3D ctxt->data; + unsigned long data =3D 0; + + /* Only allow naturally-aligned stores at the original %cr2 address. */ + if ( ((bytes | offset) & (bytes - 1)) || !bytes || + offset !=3D mmio_ro_ctxt->cr2 ) + { + gdprintk(XENLOG_WARNING, "bad access (cr2=3D%lx, addr=3D%lx, bytes= =3D%u)\n", + mmio_ro_ctxt->cr2, offset, bytes); + return X86EMUL_UNHANDLEABLE; + } + + if ( bytes <=3D sizeof(data) ) + { + memcpy(&data, p_data, bytes); + subpage_mmio_write_emulate(mmio_ro_ctxt->mfn, PAGE_OFFSET(offset), + data, bytes); + } + else if ( subpage_mmio_find_page(mmio_ro_ctxt->mfn) ) + gprintk(XENLOG_WARNING, + "unsupported %u-byte write to R/O MMIO 0x%"PRI_mfn"%03lx\n= ", + bytes, mfn_x(mmio_ro_ctxt->mfn), PAGE_OFFSET(offset)); + + return X86EMUL_OKAY; +} + static const struct x86_emulate_ops mmio_ro_emulate_ops =3D { .read =3D x86emul_unhandleable_rw, .insn_fetch =3D ptwr_emulated_insn_fetch, --=20 2.48.1