From nobody Wed May  7 13:53:23 2025
Delivered-To: importer@patchew.org
Authentication-Results: mx.zohomail.com;
	dkim=pass;
	spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as
 permitted sender)
  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org;
	dmarc=pass(p=none dis=none)  header.from=linaro.org
ARC-Seal: i=1; a=rsa-sha256; t=1664914123; cv=none;
	d=zohomail.com; s=zohoarc;
	b=NM975uJ6F/SNihCAxEioKZ9KX/c+tIh2LjmNA39qiZdzgb691oeU1QqgaVDaoCL/s0BY9CfA1YX750VSBFVXv76LIsLhyA0E9eRRyrHMAyF3Ye9nIqmSRAjeW7OMzbSOko7izCusnp8uYeEvZbkBP05jUoGTU8iONIcEIqynPTw=
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;
 s=zohoarc;
	t=1664914123;
 h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To;
	bh=wqv6omjESGpT0GzTsXvELEKQHyruXHoBEMwfSKPGC6w=;
	b=MkiPOBb7VoIswuPq8lCzfY+xjxjegIyaYsF4M5t9c8bNfyII2T6GlRagqCEFNZdvUc5a4j8a0zi3/P2fy4fjHwdwroG3EuVPFIpHCVUq2N/scOHenOKfsJVBtX9meeQMgZ6CJjpU1kWKEqmUqxawcgwptPF218zdCWFOlz3NOZY=
ARC-Authentication-Results: i=1; mx.zohomail.com;
	dkim=pass;
	spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as
 permitted sender)
  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org;
	dmarc=pass header.from=<richard.henderson@linaro.org> (p=none dis=none)
Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>
Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by
 mx.zohomail.com
	with SMTPS id 1664914123549267.5349629578392;
 Tue, 4 Oct 2022 13:08:43 -0700 (PDT)
Received: from localhost ([::1]:46764 helo=lists1p.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.90_1)
	(envelope-from <qemu-devel-bounces+importer=patchew.org@nongnu.org>)
	id 1ofoDa-00019b-BA
	for importer@patchew.org; Tue, 04 Oct 2022 16:08:42 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:41270)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)
 id 1ofnyI-0001j9-GM
 for qemu-devel@nongnu.org; Tue, 04 Oct 2022 15:52:54 -0400
Received: from mail-pl1-x632.google.com ([2607:f8b0:4864:20::632]:41872)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)
 id 1ofnyF-0000GO-Hy
 for qemu-devel@nongnu.org; Tue, 04 Oct 2022 15:52:53 -0400
Received: by mail-pl1-x632.google.com with SMTP id d11so13557763pll.8
 for <qemu-devel@nongnu.org>; Tue, 04 Oct 2022 12:52:50 -0700 (PDT)
Received: from stoup.. ([2602:47:d49d:ec01:526e:3326:a84e:e5e3])
 by smtp.gmail.com with ESMTPSA id
 u23-20020a1709026e1700b00172973d3cd9sm9293406plk.55.2022.10.04.12.52.48
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Tue, 04 Oct 2022 12:52:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;
 h=content-transfer-encoding:mime-version:references:in-reply-to
 :message-id:date:subject:cc:to:from:from:to:cc:subject:date;
 bh=wqv6omjESGpT0GzTsXvELEKQHyruXHoBEMwfSKPGC6w=;
 b=oj3gJprnxRJtajlnFS4jZNc3Ic36rYVtAcl2nivo3vlsk7XoNAbA8wYkJtB70QSCDA
 QPqmAWsez6EQPonCVT1fpG3jkzyDfCHWsFki9awTAmjEWwgMMK8GBjqPU3mvR03Pi76j
 wxgvg+oA3fsverhEGAJoHktphT6miYoOC6JKLnm4CaiSRg7iW/gjne37qE4XCNqI1fqQ
 +VNtBDyik0T/lkL9QqQvMcojKe7Vt2OJ7h+LR0BuHJxNOvOWRG3nWbNPm1hhQ8EVXd2W
 u+wgCGRsp3YdzBAqYCbYSWy6oHpmyLmJLS5rADbkBVaWJhsIjxAV1j9Pd4Z6fvk+8lNa
 E0MQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20210112;
 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;
 bh=wqv6omjESGpT0GzTsXvELEKQHyruXHoBEMwfSKPGC6w=;
 b=QoKnFGEAxCxxgsDqE+g755Z3cshgcnUR6zhQ8U8WkuS+T4uyG5awRRjcmLkMddbByc
 CJ669Tk6E4tohncFNE/LBzplKOw9JNkjMe8h0FXG+KOImZ57f2SzHWYucrwj8oiTV3c6
 oK46foHPImarbxGA+CRuJ4Qry8DERQY4/VfL5ifRDb5TS8dH5UTjnT1ZCN/FsdzaeXvP
 IlqIMjbLVf57jEvInfbKQbkjfjbNLdnIieiBCdA/3JY2SxOStm9hKLOa8DWeHv64H0F5
 QtBQR4HkpQ84CjTzudFmI1+fLf6MDgz2/OSZZWk7ozJqsl92iOJ8OUF/rOaUOzeFfGZ1
 Q6Pg==
X-Gm-Message-State: ACrzQf1uV/AqzF9RI6Y7xA1RCvAjhhoEup0g1MuK5Q1staPuxNwdKMnb
 XDu41IFuyL0/ed3Dw3u7DsGj7AbPELWWrQ==
X-Google-Smtp-Source: 
 AMsMyM4bLmNGA+tFRwNBykx6htrMDvb6k4P/6Acw9V5jCI4K24/xMvpqcnbr/7KSMT6RqW878Nfg/A==
X-Received: by 2002:a17:903:11c7:b0:178:afa2:43fd with SMTP id
 q7-20020a17090311c700b00178afa243fdmr28433507plh.126.1664913169758;
 Tue, 04 Oct 2022 12:52:49 -0700 (PDT)
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: stefanha@redhat.com,
 =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>,
 Peter Maydell <peter.maydell@linaro.org>,
 =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <f4bug@amsat.org>
Subject: [PULL 07/20] accel/tcg: Introduce probe_access_full
Date: Tue,  4 Oct 2022 12:52:28 -0700
Message-Id: <20221004195241.46491-8-richard.henderson@linaro.org>
X-Mailer: git-send-email 2.34.1
In-Reply-To: <20221004195241.46491-1-richard.henderson@linaro.org>
References: <20221004195241.46491-1-richard.henderson@linaro.org>
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17
 as permitted sender) client-ip=209.51.188.17;
 envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org;
 helo=lists.gnu.org;
Received-SPF: pass client-ip=2607:f8b0:4864:20::632;
 envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x632.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-BeenThere: qemu-devel@nongnu.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: <qemu-devel.nongnu.org>
List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>,
 <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>
List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel>
List-Post: <mailto:qemu-devel@nongnu.org>
List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help>
List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,
 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>
Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org
Sender: "Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>
X-ZohoMail-DKIM: pass (identity @linaro.org)
X-ZM-MESSAGEID: 1664914125061100001

Add an interface to return the CPUTLBEntryFull struct
that goes with the lookup.  The result is not intended
to be valid across multiple lookups, so the user must
use the results immediately.

Reviewed-by: Alex Benn=C3=A9e <alex.bennee@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daud=C3=A9 <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 include/exec/exec-all.h | 15 +++++++++++++
 include/qemu/typedefs.h |  1 +
 accel/tcg/cputlb.c      | 47 +++++++++++++++++++++++++----------------
 3 files changed, 45 insertions(+), 18 deletions(-)

diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index bcad607c4e..d255d69bc1 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -434,6 +434,21 @@ int probe_access_flags(CPUArchState *env, target_ulong=
 addr,
                        MMUAccessType access_type, int mmu_idx,
                        bool nonfault, void **phost, uintptr_t retaddr);
=20
+#ifndef CONFIG_USER_ONLY
+/**
+ * probe_access_full:
+ * Like probe_access_flags, except also return into @pfull.
+ *
+ * The CPUTLBEntryFull structure returned via @pfull is transient
+ * and must be consumed or copied immediately, before any further
+ * access or changes to TLB @mmu_idx.
+ */
+int probe_access_full(CPUArchState *env, target_ulong addr,
+                      MMUAccessType access_type, int mmu_idx,
+                      bool nonfault, void **phost,
+                      CPUTLBEntryFull **pfull, uintptr_t retaddr);
+#endif
+
 #define CODE_GEN_ALIGN           16 /* must be >=3D of the size of a icach=
e line */
=20
 /* Estimated block size for TB allocation.  */
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index 42f4ceb701..a4aee238c7 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -42,6 +42,7 @@ typedef struct ConfidentialGuestSupport ConfidentialGuest=
Support;
 typedef struct CPUAddressSpace CPUAddressSpace;
 typedef struct CPUArchState CPUArchState;
 typedef struct CPUState CPUState;
+typedef struct CPUTLBEntryFull CPUTLBEntryFull;
 typedef struct DeviceListener DeviceListener;
 typedef struct DeviceState DeviceState;
 typedef struct DirtyBitmapSnapshot DirtyBitmapSnapshot;
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
index 264f84a248..e3ee4260bd 100644
--- a/accel/tcg/cputlb.c
+++ b/accel/tcg/cputlb.c
@@ -1510,7 +1510,8 @@ static void notdirty_write(CPUState *cpu, vaddr mem_v=
addr, unsigned size,
 static int probe_access_internal(CPUArchState *env, target_ulong addr,
                                  int fault_size, MMUAccessType access_type,
                                  int mmu_idx, bool nonfault,
-                                 void **phost, uintptr_t retaddr)
+                                 void **phost, CPUTLBEntryFull **pfull,
+                                 uintptr_t retaddr)
 {
     uintptr_t index =3D tlb_index(env, mmu_idx, addr);
     CPUTLBEntry *entry =3D tlb_entry(env, mmu_idx, addr);
@@ -1543,10 +1544,12 @@ static int probe_access_internal(CPUArchState *env,=
 target_ulong addr,
                                            mmu_idx, nonfault, retaddr)) {
                 /* Non-faulting page table read failed.  */
                 *phost =3D NULL;
+                *pfull =3D NULL;
                 return TLB_INVALID_MASK;
             }
=20
             /* TLB resize via tlb_fill may have moved the entry.  */
+            index =3D tlb_index(env, mmu_idx, addr);
             entry =3D tlb_entry(env, mmu_idx, addr);
=20
             /*
@@ -1560,6 +1563,8 @@ static int probe_access_internal(CPUArchState *env, t=
arget_ulong addr,
     }
     flags &=3D tlb_addr;
=20
+    *pfull =3D &env_tlb(env)->d[mmu_idx].fulltlb[index];
+
     /* Fold all "mmio-like" bits into TLB_MMIO.  This is not RAM.  */
     if (unlikely(flags & ~(TLB_WATCHPOINT | TLB_NOTDIRTY))) {
         *phost =3D NULL;
@@ -1571,37 +1576,44 @@ static int probe_access_internal(CPUArchState *env,=
 target_ulong addr,
     return flags;
 }
=20
-int probe_access_flags(CPUArchState *env, target_ulong addr,
-                       MMUAccessType access_type, int mmu_idx,
-                       bool nonfault, void **phost, uintptr_t retaddr)
+int probe_access_full(CPUArchState *env, target_ulong addr,
+                      MMUAccessType access_type, int mmu_idx,
+                      bool nonfault, void **phost, CPUTLBEntryFull **pfull,
+                      uintptr_t retaddr)
 {
-    int flags;
-
-    flags =3D probe_access_internal(env, addr, 0, access_type, mmu_idx,
-                                  nonfault, phost, retaddr);
+    int flags =3D probe_access_internal(env, addr, 0, access_type, mmu_idx,
+                                      nonfault, phost, pfull, retaddr);
=20
     /* Handle clean RAM pages.  */
     if (unlikely(flags & TLB_NOTDIRTY)) {
-        uintptr_t index =3D tlb_index(env, mmu_idx, addr);
-        CPUTLBEntryFull *full =3D &env_tlb(env)->d[mmu_idx].fulltlb[index];
-
-        notdirty_write(env_cpu(env), addr, 1, full, retaddr);
+        notdirty_write(env_cpu(env), addr, 1, *pfull, retaddr);
         flags &=3D ~TLB_NOTDIRTY;
     }
=20
     return flags;
 }
=20
+int probe_access_flags(CPUArchState *env, target_ulong addr,
+                       MMUAccessType access_type, int mmu_idx,
+                       bool nonfault, void **phost, uintptr_t retaddr)
+{
+    CPUTLBEntryFull *full;
+
+    return probe_access_full(env, addr, access_type, mmu_idx,
+                             nonfault, phost, &full, retaddr);
+}
+
 void *probe_access(CPUArchState *env, target_ulong addr, int size,
                    MMUAccessType access_type, int mmu_idx, uintptr_t retad=
dr)
 {
+    CPUTLBEntryFull *full;
     void *host;
     int flags;
=20
     g_assert(-(addr | TARGET_PAGE_MASK) >=3D size);
=20
     flags =3D probe_access_internal(env, addr, size, access_type, mmu_idx,
-                                  false, &host, retaddr);
+                                  false, &host, &full, retaddr);
=20
     /* Per the interface, size =3D=3D 0 merely faults the access. */
     if (size =3D=3D 0) {
@@ -1609,9 +1621,6 @@ void *probe_access(CPUArchState *env, target_ulong ad=
dr, int size,
     }
=20
     if (unlikely(flags & (TLB_NOTDIRTY | TLB_WATCHPOINT))) {
-        uintptr_t index =3D tlb_index(env, mmu_idx, addr);
-        CPUTLBEntryFull *full =3D &env_tlb(env)->d[mmu_idx].fulltlb[index];
-
         /* Handle watchpoints.  */
         if (flags & TLB_WATCHPOINT) {
             int wp_access =3D (access_type =3D=3D MMU_DATA_STORE
@@ -1632,11 +1641,12 @@ void *probe_access(CPUArchState *env, target_ulong =
addr, int size,
 void *tlb_vaddr_to_host(CPUArchState *env, abi_ptr addr,
                         MMUAccessType access_type, int mmu_idx)
 {
+    CPUTLBEntryFull *full;
     void *host;
     int flags;
=20
     flags =3D probe_access_internal(env, addr, 0, access_type,
-                                  mmu_idx, true, &host, 0);
+                                  mmu_idx, true, &host, &full, 0);
=20
     /* No combination of flags are expected by the caller. */
     return flags ? NULL : host;
@@ -1655,10 +1665,11 @@ void *tlb_vaddr_to_host(CPUArchState *env, abi_ptr =
addr,
 tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong ad=
dr,
                                         void **hostp)
 {
+    CPUTLBEntryFull *full;
     void *p;
=20
     (void)probe_access_internal(env, addr, 1, MMU_INST_FETCH,
-                                cpu_mmu_index(env, true), false, &p, 0);
+                                cpu_mmu_index(env, true), false, &p, &full=
, 0);
     if (p =3D=3D NULL) {
         return -1;
     }
--=20
2.34.1