From nobody Fri Oct 31 09:40:03 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1749560773; cv=none; d=zohomail.com; s=zohoarc; b=aZX2TxE9LZJiAIBEe8kXDlNLKxqHHetuoEXuJ3iQZt+m+ow0qzmJjd/26UEkyzQW6s19roiDGzxpWqWanAiL2HjCs8o/BXEXmfV0uRwXu/OmIIwiXH0l3f1wbiaxK/zV9FxTNNnLXagi4DHbfmC2XPDqltlLBJulUTX+iA9svU0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1749560773; h=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=tkn+ztvbcliHnyvY4DdG5JO4oKukWMaE/1eHKVZZcwQ=; b=d2OD7ClHhH5GlBglMoD29hgkZnaWqgdIRwb2QnqOEtMbebzFxNlnR49WSvx8hjn4owDXFyM0ja6c1nWQk29m/W21Q9LX8W2P2C/H5SqLAQhXyVf60O24Kc5sQyN9Fgp+H7DXCpOhg6d0Eg1CQ9wiZU96cn1Gw6S+ZyTZZdEW3rU= 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=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1749560773595257.7424315116184; Tue, 10 Jun 2025 06:06:13 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1010797.1389101 (Exim 4.92) (envelope-from ) id 1uOyfw-0008Da-Ig; Tue, 10 Jun 2025 13:06:00 +0000 Received: by outflank-mailman (output) from mailman id 1010797.1389101; Tue, 10 Jun 2025 13:06:00 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uOyfv-0008CX-WA; Tue, 10 Jun 2025 13:05:59 +0000 Received: by outflank-mailman (input) for mailman id 1010797; Tue, 10 Jun 2025 13:05:57 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uOyft-0004Sm-Qc for xen-devel@lists.xenproject.org; Tue, 10 Jun 2025 13:05:57 +0000 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [2a00:1450:4864:20::629]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id a4ee2047-45fb-11f0-b894-0df219b8e170; Tue, 10 Jun 2025 15:05:55 +0200 (CEST) Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-ade4679fba7so484721166b.2 for ; Tue, 10 Jun 2025 06:05:55 -0700 (PDT) Received: from fedora.. (user-109-243-64-38.play-internet.pl. [109.243.64.38]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ade32c42770sm626465466b.41.2025.06.10.06.05.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Jun 2025 06:05:54 -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: a4ee2047-45fb-11f0-b894-0df219b8e170 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749560755; x=1750165555; 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=tkn+ztvbcliHnyvY4DdG5JO4oKukWMaE/1eHKVZZcwQ=; b=OEBIKFzvPJhORclc8ZoqwHQENJQ/lL5gZVFXsCrdCtxIYA329GGRHT1p7nGbKkBy7E EZ4w+QTGjLF+Es5WD1wrJpQ2WsFwMeFKhr2j5Om/NAJKW+ZInkgciIioVa154z2zzu51 fd+7DKcZo1QaYXDsBRH6Uus0GZw/bXTbrdlS/dxlGJI4WiuswpHdXPDCtm8nRp0cHPdH xUqrNnt0pq2H/f7GE9Ph/eSehOmGI9CaELTijdsQy/FHeDbaSnXMbNxuGEAah4ZaPgRE jRUrSVZQjl42PmTQK025Y/hG8/plIZb8yDmSGfTv7JFISiEMbArcyBioJo1s3medrdG5 J4aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749560755; x=1750165555; 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=tkn+ztvbcliHnyvY4DdG5JO4oKukWMaE/1eHKVZZcwQ=; b=Hv9uuiYjPFh+576Cl9e6xOFE555iJfLged3SUOAnYpwd/nF5p3JD6GfY0UqywbZ/nt S04jf0eADKUaDsP4F4qknGHZBosHk52dOLQG6zKwkDxPuGK6AWgKl+JXlD+UsYniY7Md EFfMzmWXFdCZDu488hq2M1jLJSo7VG4mKpoWs8M7q5PovlpriWi4cVz5oLqDxExQuu7b 74MFvWOogfQOFQNW0d6er4Ab64TD1p+ECYhOsrd/FQaltPXFNH2S+oQ+RQGxnn8t7b28 3j9pMFvSS921tGfMyg/r+kWPkZ+4d0ui9N2MrPW4uFYsb1a3dYqkyzCg2a8LsC9GPi4N 3uVQ== X-Gm-Message-State: AOJu0YzrlqA7Odzr5pXhZXzoPf5XoeIO1LtK1KtxcZ2AZWJNCJx0tTr+ tnFaS/UWoEbNYhLi9DAskmY3gWzHK1vqqWsYRc00J/86u3AB3Ge7H9uHADjdBQ== X-Gm-Gg: ASbGncuHf9KhMwg0TRJb8w2Gn0U+jZyS8KbuHtTiiu7ARSnVGIHRvEkhmPLJS96pfr4 5w2fErqdjJ+nYXYRDmOjSz+OCFdksW3EZacmP3aKdgPNwYn89A8qNdwnEk8O5ZxN8B40CpwQ7TA 4t6bsKuGYqZ8jPP2cwcS1nOvqR0S8KGQjksQu0PgJRph7Ru4jNwZS3KugG6Uqb1js6gY3OPWB53 2Qoi4iQgZ533aIxkCBnuDD1V30rzVCHCmpW7On1FEByjZ8EzXpZgpNFyUMBFWttfsFf02YvPzSi rp06hkY2H9c4DSDlG1CORi3YwiSe+0/whhiJvQTxSUcKM5deKpAKgEV5rS3y6Qzm3QBBplr2nPJ VU4nfW3aXBt9L4uX7W4wwiWLW9n0f X-Google-Smtp-Source: AGHT+IFOKSIAXyNkA2Zfv91wJ8RYYuzvX7isb+GzFl8frSbbvBaTOWNsZDjJc4chk24vwzsmEl4ICg== X-Received: by 2002:a17:907:9721:b0:ad8:af1f:938d with SMTP id a640c23a62f3a-ade1ab1fa84mr1436480066b.37.1749560754641; Tue, 10 Jun 2025 06:05:54 -0700 (PDT) From: Oleksii Kurochko To: xen-devel@lists.xenproject.org Cc: Oleksii Kurochko , Alistair Francis , Bob Eshleman , Connor Davis , Andrew Cooper , Anthony PERARD , Michal Orzel , Jan Beulich , Julien Grall , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= , Stefano Stabellini Subject: [PATCH v2 13/17] xen/riscv: Implement p2m_entry_from_mfn() and support PBMT configuration Date: Tue, 10 Jun 2025 15:05:28 +0200 Message-ID: <994ab3dd6822c4cd02a6a576041da115abeff6ed.1749555949.git.oleksii.kurochko@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1749560774836124100 Content-Type: text/plain; charset="utf-8" This patch adds the initial logic for constructing PTEs from MFNs in the RI= SC-V p2m subsystem. It includes: - Implementation of p2m_entry_from_mfn(): Generates a valid PTE using the given MFN, p2m_type_t, and p2m_access_t, including permission encoding and PBMT attribute setup. - New helper p2m_set_permission(): Encodes access rights (r, w, x) into the PTE based on both p2m type and access permissions. - p2m_type_radix_set(): Stores the p2m type in a radix tree keyed by the PTE for later retrieval. PBMT type encoding support: - Introduces an enum pbmt_type_t to represent the PBMT field values. - Maps types like p2m_mmio_direct_dev to pbmt_io, others default to pbmt_pm= a. Signed-off-by: Oleksii Kurochko --- Changes in V2: - New patch. It was a part of a big patch "xen/riscv: implement p2m mapping functionality" which was splitted to smaller. --- xen/arch/riscv/include/asm/page.h | 8 +++ xen/arch/riscv/p2m.c | 103 ++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 4 deletions(-) diff --git a/xen/arch/riscv/include/asm/page.h b/xen/arch/riscv/include/asm= /page.h index c67b9578c9..1d1054fa5c 100644 --- a/xen/arch/riscv/include/asm/page.h +++ b/xen/arch/riscv/include/asm/page.h @@ -76,6 +76,14 @@ #define PTE_SMALL BIT(10, UL) #define PTE_POPULATE BIT(11, UL) =20 +enum pbmt_type_t { + pbmt_pma, + pbmt_nc, + pbmt_io, + pbmt_rsvd, + pbmt_max, +}; + #define PTE_ACCESS_MASK (PTE_READABLE | PTE_WRITABLE | PTE_EXECUTABLE) =20 #define PTE_PBMT_MASK (PTE_PBMT_NOCACHE | PTE_PBMT_IO) diff --git a/xen/arch/riscv/p2m.c b/xen/arch/riscv/p2m.c index 6b11e87b22..cba04acf38 100644 --- a/xen/arch/riscv/p2m.c +++ b/xen/arch/riscv/p2m.c @@ -345,6 +345,26 @@ static pte_t *p2m_get_root_pointer(struct p2m_domain *= p2m, gfn_t gfn) return __map_domain_page(p2m->root + root_table_indx); } =20 +static int p2m_type_radix_set(struct p2m_domain *p2m, pte_t pte, p2m_type_= t t) +{ + int rc; + gfn_t gfn =3D mfn_to_gfn(p2m->domain, mfn_from_pte(pte)); + + rc =3D radix_tree_insert(&p2m->p2m_type, gfn_x(gfn), + radix_tree_int_to_ptr(t)); + if ( rc =3D=3D -EEXIST ) + { + /* If a setting already exists, change it to the new one */ + radix_tree_replace_slot( + radix_tree_lookup_slot( + &p2m->p2m_type, gfn_x(gfn)), + radix_tree_int_to_ptr(t)); + rc =3D 0; + } + + return rc; +} + static p2m_type_t p2m_type_radix_get(struct p2m_domain *p2m, pte_t pte) { void *ptr; @@ -389,12 +409,87 @@ static inline void p2m_remove_pte(pte_t *p, bool clea= n_pte) p2m_write_pte(p, pte, clean_pte); } =20 -static pte_t p2m_entry_from_mfn(struct p2m_domain *p2m, mfn_t mfn, - p2m_type_t t, p2m_access_t a) +static void p2m_set_permission(pte_t *e, p2m_type_t t, p2m_access_t a) { - panic("%s: hasn't been implemented yet\n", __func__); + /* First apply type permissions */ + switch ( t ) + { + case p2m_ram_rw: + e->pte |=3D PTE_ACCESS_MASK; + break; + + case p2m_mmio_direct_dev: + e->pte |=3D (PTE_READABLE | PTE_WRITABLE); + e->pte &=3D ~PTE_EXECUTABLE; + break; + + case p2m_invalid: + e->pte &=3D ~PTE_ACCESS_MASK; + break; + + default: + BUG(); + break; + } + + /* Then restrict with access permissions */ + switch ( a ) + { + case p2m_access_rwx: + break; + case p2m_access_wx: + e->pte &=3D ~PTE_READABLE; + break; + case p2m_access_rw: + e->pte &=3D ~PTE_EXECUTABLE; + break; + case p2m_access_w: + e->pte &=3D ~(PTE_READABLE | PTE_EXECUTABLE); + e->pte &=3D ~PTE_EXECUTABLE; + break; + case p2m_access_rx: + case p2m_access_rx2rw: + e->pte &=3D ~PTE_WRITABLE; + break; + case p2m_access_x: + e->pte &=3D ~(PTE_READABLE | PTE_WRITABLE); + break; + case p2m_access_r: + e->pte &=3D ~(PTE_WRITABLE | PTE_EXECUTABLE); + break; + case p2m_access_n: + case p2m_access_n2rwx: + e->pte &=3D ~PTE_ACCESS_MASK; + break; + default: + BUG(); + break; + } +} + +static pte_t p2m_entry_from_mfn(struct p2m_domain *p2m, mfn_t mfn, p2m_typ= e_t t, p2m_access_t a) +{ + pte_t e =3D (pte_t) { 1 }; + + switch ( t ) + { + case p2m_mmio_direct_dev: + e.pte |=3D PTE_PBMT_IO; + break; + + default: + break; + } + + p2m_set_permission(&e, t, a); + + ASSERT(!(mfn_to_maddr(mfn) & ~PADDR_MASK)); + + pte_set_mfn(&e, mfn); + + BUG_ON(p2m_type_radix_set(p2m, e, t)); =20 - return (pte_t) { .pte =3D 0 }; + return e; } =20 #define GUEST_TABLE_MAP_NONE 0 --=20 2.49.0