From nobody Tue Apr  8 01:38:37 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=gmail.com
ARC-Seal: i=1; a=rsa-sha256; t=1742374315; cv=none;
	d=zohomail.com; s=zohoarc;
	b=bYgAIty2W79VvATxUdY0hML5A6nuHsy4igCw0/oxG4zyy9u6qFwVFWamqRkdFQvXwBwJHCDq1DwAOSF0KkP/hoxvbUFX362hhxyZ0bZYddEKuEP4tkmi+ZssdgqsSdowmwafS15gByuSEyPMyhzDOAsScK5uEi4rr+0of8YRcg8=
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;
 s=zohoarc;
	t=1742374315;
 h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To;
	bh=woS5shbhb+81BaLCop8v0D00aFw49LjawXYA3y+JHPY=;
	b=W+CzcrYhXNB0URYXtrkWQ+CEHQa+Pxl2vCyFUVwR5R8Qd+DqhnO7CBwFEwZaCAT+LsKIjkp1QbK2JeVTYyGW9lczAAeQ+qc4LlIBWV/Jv1tTnbkJA1ZrvIAhF5q+EAs61Y2KmtuWyuaMbwq9wX9xT8TyH0ryDRXUddVwkmM5eng=
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=<alistair23@gmail.com> (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 1742374315081363.6880195284724;
 Wed, 19 Mar 2025 01:51:55 -0700 (PDT)
Received: from localhost ([::1] helo=lists1p.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.90_1)
	(envelope-from <qemu-devel-bounces@nongnu.org>)
	id 1tuoPc-0000Ab-Bu; Wed, 19 Mar 2025 04:04:28 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <alistair23@gmail.com>)
 id 1tuoOf-0007zn-BD
 for qemu-devel@nongnu.org; Wed, 19 Mar 2025 04:03:30 -0400
Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <alistair23@gmail.com>)
 id 1tuoOb-0004Oo-7u
 for qemu-devel@nongnu.org; Wed, 19 Mar 2025 04:03:29 -0400
Received: by mail-pl1-x629.google.com with SMTP id
 d9443c01a7336-22622ddcc35so14259225ad.2
 for <qemu-devel@nongnu.org>; Wed, 19 Mar 2025 01:03:24 -0700 (PDT)
Received: from toolbox.alistair23.me
 (2403-580b-97e8-0-321-6fb2-58f1-a1b1.ip6.aussiebb.net.
 [2403:580b:97e8:0:321:6fb2:58f1:a1b1])
 by smtp.gmail.com with ESMTPSA id
 d9443c01a7336-225c6ba6c8dsm107725255ad.156.2025.03.19.01.03.20
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 19 Mar 2025 01:03:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1742371403; x=1742976203; darn=nongnu.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=woS5shbhb+81BaLCop8v0D00aFw49LjawXYA3y+JHPY=;
 b=UqkoN2B2qv35BCr25S1VDkmGA0OJO89y6PeixV840amIWQt7EsRMMSGR/+dLhSBQPi
 ko3G/WQW/mmqLKuhMg+KC/VWnWQdXXGoQxzekGdVsN0f22kDk78w1HoIb+t6I3r8hf0f
 r77/Fckux1oVAzoSfbgw5z28haZFMMhRJ15g3ysYzeIQw0AO20VJN09rORtaS8VGkw+b
 2Hp0Ue14t8z7Z2eXsEZUCREpsg1Q6wjzg5Z+Redj0hH0HNBxSshf7mJ2eNTsFDyhL/h5
 E09JUa6C6g/GPl29bDnHPfrMC5/Aq+d0Q9XXIZcb4X4jw0siNQt7wjevArsjTgFdbH3s
 KbOQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1742371403; x=1742976203;
 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=woS5shbhb+81BaLCop8v0D00aFw49LjawXYA3y+JHPY=;
 b=anC5PARaEROOsw9enHGiCSV1osp02CsIebMMyyppyaXa7EG1hlYpmaY59BDfICrd6l
 UguYY2WgRM9xUVHRDqWsubNOQJmfsQ+xCHcIGVlfkhhpzlTa7nkyb7WhwV7/4zYekyI8
 YZJGxki/gGEYqR0eoFWF1P+JsqQQ77LS3OxDPYLzC8h6cloMJT7ariCs2bcvOSCSX5wH
 xw4D0os7zisnBuZWq/Ka4oGleODII+maPKxmihQSZ9Cr3rwCvCujK46ouCiyPXzqtPxD
 cdAKxbzLicceC3VVFCxJJivb+7vRuAYVFeA9dkSMsMrZH/m+yxg0NPPkiU1dDR05f8MO
 tLqA==
X-Gm-Message-State: AOJu0YzAyyBYnavSrJr7hS7yrzGf9PYH+bxUPNAjFJn335wXnvwhZXal
 E7E+lnIYg/8ko62a2yOO8+0Q2/43xjLiih8UjdRmh3mGLzkCQf03jqeSHw==
X-Gm-Gg: ASbGncuif2vgrVLLjP0s0RbIbyAJD5H8O6ymWPLo1TG1dIPa5UZKTz48Wo03hP2wotY
 hFF5QlFwn99abhmeqqyHkfWaZ09wM1MN4Dc/mgvWsaaMRf7Uc7OAKq9IOwgQvyHkAZE3YxzAY67
 VcFLLbOD055N7Hvs8J2JM9ssAHxi7sasWcp9/XClWrSR+Yw90HorcUYnMUqFBcZqlxREnkj9YVS
 77SdYw5nZysPmqev3mx04PTUH9Oki6Ls3cg0s/bpFB4y4U7EdEGdrNlxGwjnV0mb0p/3LVugcC4
 M0o3SPj+Pn3Qc7LJPOHXr8n+rfRRLFlcFbgEn8GT0VoU4STJjsCThcnFY+u7qJQ9CXgm+FQqHFt
 Uyo+x/OFJfkCgCNtPG2+XCCjRqKa2LG3ERf8g1KFhc6W5VRdc
X-Google-Smtp-Source: 
 AGHT+IFWrlOzBsrKezCIgsKRr5rtUp42EBhYULlSvO1ntd0HyC8w8Xkasi7WEwqlog5NQrRZfnoKoA==
X-Received: by 2002:a17:902:da8c:b0:224:1074:63a0 with SMTP id
 d9443c01a7336-22649a80c34mr24066465ad.34.1742371403166;
 Wed, 19 Mar 2025 01:03:23 -0700 (PDT)
From: Alistair Francis <alistair23@gmail.com>
X-Google-Original-From: Alistair Francis <alistair.francis@wdc.com>
To: qemu-devel@nongnu.org
Cc: alistair23@gmail.com, Paolo Savini <paolo.savini@embecosm.com>,
 Daniel Henrique Barboza <dbarboza@ventanamicro.com>,
 Alistair Francis <alistair.francis@wdc.com>
Subject: [PULL 02/10] optimize the memory probing for vector fault-only-first
 loads.
Date: Wed, 19 Mar 2025 18:03:00 +1000
Message-ID: <20250319080308.609520-3-alistair.francis@wdc.com>
X-Mailer: git-send-email 2.48.1
In-Reply-To: <20250319080308.609520-1-alistair.francis@wdc.com>
References: <20250319080308.609520-1-alistair.francis@wdc.com>
MIME-Version: 1.0
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::629;
 envelope-from=alistair23@gmail.com; helo=mail-pl1-x629.google.com
X-Spam_score_int: -17
X-Spam_score: -1.8
X-Spam_bar: -
X-Spam_report: (-1.8 / 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,
 FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,
 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-bounces+importer=patchew.org@nongnu.org
X-ZohoMail-DKIM: pass (identity @gmail.com)
X-ZM-MESSAGEID: 1742374316414019100
Content-Type: text/plain; charset="utf-8"

From: Paolo Savini <paolo.savini@embecosm.com>

Fault-only-first loads in the RISC-V vector extension need to update
the vl with the element index that causes an exception.
In order to ensure this the emulation of this instruction used to probe the
memory covered by the load operation with a loop that iterated over each el=
ement
so that when a flag was raised it was possible to set the vl to the
corresponding element index.
This loop was executed every time whether an exception happened or not.

This commit removes the per element memory probing from the main execution =
path
and adds a broad memory probing first. If this probing raises any flag that=
 is
not a watchpoint flag (that per standard is allowed by this instruction) we
proceed with the per element probing to find the index of the element causi=
ng
the exception and set vl to such index.

Signed-off-by: Paolo Savini <paolo.savini@embecosm.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Message-ID: <20250221155320.59159-2-paolo.savini@embecosm.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
 target/riscv/vector_helper.c | 103 ++++++++++++++++++++---------------
 1 file changed, 58 insertions(+), 45 deletions(-)

diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index 7773df6a7c..71b823d5d4 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -633,47 +633,69 @@ vext_ldff(void *vd, void *v0, target_ulong base, CPUR=
ISCVState *env,
     uint32_t esz =3D 1 << log2_esz;
     uint32_t msize =3D nf * esz;
     uint32_t vma =3D vext_vma(desc);
-    target_ulong addr, offset, remain, page_split, elems;
+    target_ulong addr, addr_probe, addr_i, offset, remain, page_split, ele=
ms;
     int mmu_index =3D riscv_env_mmu_index(env, false);
+    int flags;
+    void *host;
=20
     VSTART_CHECK_EARLY_EXIT(env);
=20
-    /* probe every access */
-    for (i =3D env->vstart; i < env->vl; i++) {
-        if (!vm && !vext_elem_mask(v0, i)) {
-            continue;
-        }
-        addr =3D adjust_addr(env, base + i * (nf << log2_esz));
-        if (i =3D=3D 0) {
-            /* Allow fault on first element. */
-            probe_pages(env, addr, nf << log2_esz, ra, MMU_DATA_LOAD);
-        } else {
-            remain =3D nf << log2_esz;
-            while (remain > 0) {
-                void *host;
-                int flags;
-
-                offset =3D -(addr | TARGET_PAGE_MASK);
-
-                /* Probe nonfault on subsequent elements. */
-                flags =3D probe_access_flags(env, addr, offset, MMU_DATA_L=
OAD,
-                                           mmu_index, true, &host, 0);
-
-                /*
-                 * Stop if invalid (unmapped) or mmio (transaction may fai=
l).
-                 * Do not stop if watchpoint, as the spec says that
-                 * first-fault should continue to access the same
-                 * elements regardless of any watchpoint.
-                 */
-                if (flags & ~TLB_WATCHPOINT) {
-                    vl =3D i;
-                    goto ProbeSuccess;
-                }
-                if (remain <=3D offset) {
-                    break;
+    addr =3D base + ((env->vstart * nf) << log2_esz);
+    page_split =3D -(addr | TARGET_PAGE_MASK);
+    /* Get number of elements */
+    elems =3D page_split / msize;
+    if (unlikely(env->vstart + elems >=3D env->vl)) {
+        elems =3D env->vl - env->vstart;
+    }
+
+    /* Check page permission/pmp/watchpoint/etc. */
+    flags =3D probe_access_flags(env, adjust_addr(env, addr), elems * msiz=
e,
+                               MMU_DATA_LOAD, mmu_index, true, &host, ra);
+
+    /* If we are crossing a page check also the second page. */
+    if (env->vl > elems) {
+        addr_probe =3D addr + (elems << log2_esz);
+        flags |=3D probe_access_flags(env, adjust_addr(env, addr_probe),
+                                    elems * msize, MMU_DATA_LOAD, mmu_inde=
x,
+                                    true, &host, ra);
+    }
+
+    if (flags & ~TLB_WATCHPOINT) {
+        /* probe every access */
+        for (i =3D env->vstart; i < env->vl; i++) {
+            if (!vm && !vext_elem_mask(v0, i)) {
+                continue;
+            }
+            addr_i =3D adjust_addr(env, base + i * (nf << log2_esz));
+            if (i =3D=3D 0) {
+                /* Allow fault on first element. */
+                probe_pages(env, addr_i, nf << log2_esz, ra, MMU_DATA_LOAD=
);
+            } else {
+                remain =3D nf << log2_esz;
+                while (remain > 0) {
+                    offset =3D -(addr_i | TARGET_PAGE_MASK);
+
+                    /* Probe nonfault on subsequent elements. */
+                    flags =3D probe_access_flags(env, addr_i, offset,
+                                               MMU_DATA_LOAD, mmu_index, t=
rue,
+                                               &host, 0);
+
+                    /*
+                     * Stop if invalid (unmapped) or mmio (transaction may
+                     * fail). Do not stop if watchpoint, as the spec says =
that
+                     * first-fault should continue to access the same
+                     * elements regardless of any watchpoint.
+                     */
+                    if (flags & ~TLB_WATCHPOINT) {
+                        vl =3D i;
+                        goto ProbeSuccess;
+                    }
+                    if (remain <=3D offset) {
+                        break;
+                    }
+                    remain -=3D offset;
+                    addr_i =3D adjust_addr(env, addr_i + offset);
                 }
-                remain -=3D offset;
-                addr =3D adjust_addr(env, addr + offset);
             }
         }
     }
@@ -685,15 +707,6 @@ ProbeSuccess:
=20
     if (env->vstart < env->vl) {
         if (vm) {
-            /* Calculate the page range of first page */
-            addr =3D base + ((env->vstart * nf) << log2_esz);
-            page_split =3D -(addr | TARGET_PAGE_MASK);
-            /* Get number of elements */
-            elems =3D page_split / msize;
-            if (unlikely(env->vstart + elems >=3D env->vl)) {
-                elems =3D env->vl - env->vstart;
-            }
-
             /* Load/store elements in the first page */
             if (likely(elems)) {
                 vext_page_ldst_us(env, vd, addr, elems, nf, max_elems,
--=20
2.48.1