From nobody Mon May 13 22:03:06 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1677245228; cv=none; d=zohomail.com; s=zohoarc; b=MwVpzFT6j4ZRB27gC8yz+2fVtHsLr70YsYTLfIGcvF9Q1gkH71aSlPeA8B2B7p6nGrcP0JJ5oxrk/s5eEqWNYE39+FnUKwURCukNM/4zo/6ZIN/fSz6b8XmDmUQlgqJq14reSvtN9NuWmpNZCx0XgOoT+yp5UzFBTDstlZg90lY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677245228; h=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=jR/gDGrKY2oOFb5rpnLo5gcR+ckh8I3+coh9b7Ltzc4=; b=niWx6ymsq7x1VyBFK8R+zxetnqqIh1s95sgzt5Mf5H4vrLwms+W9T9Zra8NXep1LGbE9nekk4U9E67ukS44CGfE42joxZq5Bh6bFB0YkTBBCg1Wt4TWDWKk+BgBA5DGhr8LxGCzHtLfcdTMoY8XyzHIs6ZtGkRAwVHhJpYafzis= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677245228896598.7542655259306; Fri, 24 Feb 2023 05:27:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pVY5O-0003m5-Gj; Fri, 24 Feb 2023 08:26:06 -0500 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 ) id 1pVY5D-0003j0-Hs for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:25:55 -0500 Received: from mail-oa1-x31.google.com ([2001:4860:4864:20::31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pVY58-0005UE-NX for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:25:52 -0500 Received: by mail-oa1-x31.google.com with SMTP id 586e51a60fabf-172afa7bee2so1010616fac.6 for ; Fri, 24 Feb 2023 05:25:50 -0800 (PST) Received: from grind.. ([2804:18:18bc:fbbd:3c90:eebc:7544:73fd]) by smtp.gmail.com with ESMTPSA id b5-20020a05687061c500b001435fe636f2sm3383763oah.53.2023.02.24.05.25.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 05:25:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; 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=jR/gDGrKY2oOFb5rpnLo5gcR+ckh8I3+coh9b7Ltzc4=; b=JBEG5LkqzfqA4nqrOW3hXkSlGDsZMGyKasy3vaGQfAD/9O52DV17LpUHHPlQ7dUBze qVIEdGNhdmG3riN8vDWEDRPUkDYh+1gqqfZEtiZXFPzbuMNqXjLyxH/QMEFm66t5gEAy 1TfX6QEGkUQwvjFq1WaSn8VLbMzF0SWyRkCRmbWdY1UrVooOR4VqxeCP1XkhbKCKpRaw FMVK58iBjqK5s6lLH/JaIOzctxt4kExTJdyqi2zJDxHQo8Oh885uaT0FAXDfl1ti8rS4 CX0LAfmjteXNMrwM34xu7DYRumMYExQ5hpY0DW8XSZVtrVs1Y0IerdmVLtkblrCqfUc7 FyFA== 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:message-id:reply-to; bh=jR/gDGrKY2oOFb5rpnLo5gcR+ckh8I3+coh9b7Ltzc4=; b=zgusH26mnIYfknohgj6EGdsD5FbXCGHj0P6sx/lYTTaZbrCQYamOoBoj4MSTgok861 RHaDSlGAIwQPrx4Qgx/iBrVuYQjIG+MxZZIh385LdTrYa/I6lGcfFgY4TlFG3YWSvITd FpV9Ccg6Ij+QcLs+0txwrVjp0weZAwaEmSwKhZ1o3v3yXqvV01d7ja1RiZjkqOsaQrC6 dSIhR4Ocw7jkrRp3S/OSl3ygZm3v2x/EL8oQ66hCkOrA0F2Be9Fb7QlIv7jhksuF219z L2spi+oC1UuVK88oolPVVAD7xvheaVvBuwZWsFWZ+Je9rCdPapm/84EQKpJNzpvRV10C Zxcw== X-Gm-Message-State: AO0yUKW5ytNO3mkNTwjC5uUA2OO5IDi6TCoTWKdzbZtetztUmdKKE58A Hw/D3mccS4Ocg2gfA6dKsJM2ZgeQ5a5Y4EMm X-Google-Smtp-Source: AK7set+l+2fnF8m12Vdr5xS5lFgFbO9MpK2+TyXs1YsMQ2siiK80nu5XzOxh9phP8H3v54dp1mJtkQ== X-Received: by 2002:a05:6870:ea97:b0:16d:ccf9:bb4d with SMTP id s23-20020a056870ea9700b0016dccf9bb4dmr11420494oap.39.1677245149143; Fri, 24 Feb 2023 05:25:49 -0800 (PST) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, bmeng@tinylab.org, liweiwei@iscas.ac.cn, zhiwei_liu@linux.alibaba.com, richard.henderson@linaro.org, Daniel Henrique Barboza Subject: [PATCH v8 1/4] tcg: add 'size' param to probe_access_flags() Date: Fri, 24 Feb 2023 10:25:33 -0300 Message-Id: <20230224132536.552293-2-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230224132536.552293-1-dbarboza@ventanamicro.com> References: <20230224132536.552293-1-dbarboza@ventanamicro.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=2001:4860:4864:20::31; envelope-from=dbarboza@ventanamicro.com; helo=mail-oa1-x31.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=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @ventanamicro.com) X-ZM-MESSAGEID: 1677245230483100003 Content-Type: text/plain; charset="utf-8" probe_access_flags() as it is today uses probe_access_full(), which in turn uses probe_access_internal() with size =3D 0. probe_access_internal() then uses the size to call the tlb_fill() callback for the given CPU. This size param ('fault_size' as probe_access_internal() calls it) is ignored by most existing .tlb_fill callback implementations, e.g. arm_cpu_tlb_fill(), ppc_cpu_tlb_fill(), x86_cpu_tlb_fill() and mips_cpu_tlb_fill() to name a few. But RISC-V riscv_cpu_tlb_fill() actually uses it. The 'size' parameter is used to check for PMP (Physical Memory Protection) access. This is necessary because PMP does not make any guarantees about all the bytes of the same page having the same permissions, i.e. the same page can have different PMP properties, so we're forced to make sub-page range checks. To allow RISC-V emulation to do a probe_acess_flags() that covers PMP, we need to either add a 'size' param to the existing probe_acess_flags() or create a new interface (e.g. probe_access_range_flags). There are quite a few probe_* APIs already, so let's add a 'size' param to probe_access_flags() and re-use this API. This is done by open coding what probe_access_full() does inside probe_acess_flags() and passing the 'size' param to probe_acess_internal(). Existing probe_access_flags() callers use size =3D 0 to not change their current API usage. 'size' is asserted to enforce single page access like probe_access() already does. No behavioral changes intended. Reviewed-by: Richard Henderson Signed-off-by: Daniel Henrique Barboza --- accel/stubs/tcg-stub.c | 2 +- accel/tcg/cputlb.c | 17 ++++++++++++++--- accel/tcg/user-exec.c | 5 +++-- include/exec/exec-all.h | 3 ++- semihosting/uaccess.c | 2 +- target/arm/ptw.c | 2 +- target/arm/sve_helper.c | 2 +- target/s390x/tcg/mem_helper.c | 6 +++--- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/accel/stubs/tcg-stub.c b/accel/stubs/tcg-stub.c index c1b05767c0..96af23dc5d 100644 --- a/accel/stubs/tcg-stub.c +++ b/accel/stubs/tcg-stub.c @@ -25,7 +25,7 @@ void tcg_flush_jmp_cache(CPUState *cpu) { } =20 -int probe_access_flags(CPUArchState *env, target_ulong addr, +int probe_access_flags(CPUArchState *env, target_ulong addr, int size, MMUAccessType access_type, int mmu_idx, bool nonfault, void **phost, uintptr_t retaddr) { diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c index 4812d83961..fc27e34457 100644 --- a/accel/tcg/cputlb.c +++ b/accel/tcg/cputlb.c @@ -1606,14 +1606,25 @@ int probe_access_full(CPUArchState *env, target_ulo= ng addr, return flags; } =20 -int probe_access_flags(CPUArchState *env, target_ulong addr, +int probe_access_flags(CPUArchState *env, target_ulong addr, int size, MMUAccessType access_type, int mmu_idx, bool nonfault, void **phost, uintptr_t retaddr) { CPUTLBEntryFull *full; + int flags; + + g_assert(-(addr | TARGET_PAGE_MASK) >=3D size); + + flags =3D probe_access_internal(env, addr, size, access_type, mmu_idx, + nonfault, phost, &full, retaddr); =20 - return probe_access_full(env, addr, access_type, mmu_idx, - nonfault, phost, &full, retaddr); + /* Handle clean RAM pages. */ + if (unlikely(flags & TLB_NOTDIRTY)) { + notdirty_write(env_cpu(env), addr, 1, full, retaddr); + flags &=3D ~TLB_NOTDIRTY; + } + + return flags; } =20 void *probe_access(CPUArchState *env, target_ulong addr, int size, diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c index ae67d84638..7b37fd229e 100644 --- a/accel/tcg/user-exec.c +++ b/accel/tcg/user-exec.c @@ -761,13 +761,14 @@ static int probe_access_internal(CPUArchState *env, t= arget_ulong addr, cpu_loop_exit_sigsegv(env_cpu(env), addr, access_type, maperr, ra); } =20 -int probe_access_flags(CPUArchState *env, target_ulong addr, +int probe_access_flags(CPUArchState *env, target_ulong addr, int size, MMUAccessType access_type, int mmu_idx, bool nonfault, void **phost, uintptr_t ra) { int flags; =20 - flags =3D probe_access_internal(env, addr, 0, access_type, nonfault, r= a); + g_assert(-(addr | TARGET_PAGE_MASK) >=3D size); + flags =3D probe_access_internal(env, addr, size, access_type, nonfault= , ra); *phost =3D flags ? NULL : g2h(env_cpu(env), addr); return flags; } diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 54585a9954..b0d4916573 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -446,6 +446,7 @@ static inline void *probe_read(CPUArchState *env, targe= t_ulong addr, int size, * probe_access_flags: * @env: CPUArchState * @addr: guest virtual address to look up + * @size: size of the access * @access_type: read, write or execute permission * @mmu_idx: MMU index to use for lookup * @nonfault: suppress the fault @@ -460,7 +461,7 @@ static inline void *probe_read(CPUArchState *env, targe= t_ulong addr, int size, * Do handle clean pages, so exclude TLB_NOTDIRY from the returned flags. * For simplicity, all "mmio-like" flags are folded to TLB_MMIO. */ -int probe_access_flags(CPUArchState *env, target_ulong addr, +int probe_access_flags(CPUArchState *env, target_ulong addr, int size, MMUAccessType access_type, int mmu_idx, bool nonfault, void **phost, uintptr_t retaddr); =20 diff --git a/semihosting/uaccess.c b/semihosting/uaccess.c index 8018828069..7505eb6d1b 100644 --- a/semihosting/uaccess.c +++ b/semihosting/uaccess.c @@ -37,7 +37,7 @@ ssize_t softmmu_strlen_user(CPUArchState *env, target_ulo= ng addr) /* Find the number of bytes remaining in the page. */ left_in_page =3D TARGET_PAGE_SIZE - (addr & ~TARGET_PAGE_MASK); =20 - flags =3D probe_access_flags(env, addr, MMU_DATA_LOAD, + flags =3D probe_access_flags(env, addr, 0, MMU_DATA_LOAD, mmu_idx, true, &h, 0); if (flags & TLB_INVALID_MASK) { return -1; diff --git a/target/arm/ptw.c b/target/arm/ptw.c index 2b125fff44..1ecefb2027 100644 --- a/target/arm/ptw.c +++ b/target/arm/ptw.c @@ -407,7 +407,7 @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t= old_val, void *discard; =20 env->tlb_fi =3D fi; - flags =3D probe_access_flags(env, ptw->out_virt, MMU_DATA_STORE, + flags =3D probe_access_flags(env, ptw->out_virt, 0, MMU_DATA_STORE, arm_to_core_mmu_idx(ptw->in_ptw_idx), true, &discard, 0); env->tlb_fi =3D NULL; diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c index 521fc9b969..51909c44ac 100644 --- a/target/arm/sve_helper.c +++ b/target/arm/sve_helper.c @@ -5352,7 +5352,7 @@ bool sve_probe_page(SVEHostPage *info, bool nofault, = CPUARMState *env, addr =3D useronly_clean_ptr(addr); =20 #ifdef CONFIG_USER_ONLY - flags =3D probe_access_flags(env, addr, access_type, mmu_idx, nofault, + flags =3D probe_access_flags(env, addr, 0, access_type, mmu_idx, nofau= lt, &info->host, retaddr); #else CPUTLBEntryFull *full; diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c index d6725fd18c..c9fd4142f1 100644 --- a/target/s390x/tcg/mem_helper.c +++ b/target/s390x/tcg/mem_helper.c @@ -143,14 +143,14 @@ static int s390_probe_access(CPUArchState *env, targe= t_ulong addr, int size, bool nonfault, void **phost, uintptr_t ra) { #if defined(CONFIG_USER_ONLY) - return probe_access_flags(env, addr, access_type, mmu_idx, + return probe_access_flags(env, addr, 0, access_type, mmu_idx, nonfault, phost, ra); #else int flags; =20 env->tlb_fill_exc =3D 0; - flags =3D probe_access_flags(env, addr, access_type, mmu_idx, nonfault= , phost, - ra); + flags =3D probe_access_flags(env, addr, 0, access_type, mmu_idx, + nonfault, phost, ra); if (env->tlb_fill_exc) { return env->tlb_fill_exc; } --=20 2.39.2 From nobody Mon May 13 22:03:06 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1677245252; cv=none; d=zohomail.com; s=zohoarc; b=ZK84PhN8aArsAK4e18Q9IlDPpFifJm9maaPqBhr/HzhX+8mKZHknRull+oE0C8asvcbkLvmj6sXdqtYXMYG3zdiW7lbH5K78Udh2jfR3Efb9EX5SkcXSOCys5Li6y5RchG9jOnK4QMpLzBgEZ5TPHqdy7Q6zPx/2ma2ehFBgOwY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677245252; h=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=CL4GPYzKFLWZQ/FFxXY4BBdu3KOs7b8oA1qVwK+TM10=; b=gTnp7FeJuSQZSdFTuJgvMXn2ExHBy/yZLUC1RRpkLR+LGb5qMW07Kw9laiy1eO/b2kJFpcRys11RmtOZKmAKbkYCzCjisw0kWqejlqrX9vXJzz5+l6WxBFyTj7AwGzpjEkHjw8GVgQ9hqcQ33rhQUvVXAUC4yS7WHV1Q+lNsP9E= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677245252334321.14165696772045; Fri, 24 Feb 2023 05:27:32 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pVY5O-0003mB-WE; Fri, 24 Feb 2023 08:26:07 -0500 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 ) id 1pVY5I-0003k9-36 for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:26:01 -0500 Received: from mail-oa1-x2f.google.com ([2001:4860:4864:20::2f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pVY5D-0005U9-A5 for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:25:57 -0500 Received: by mail-oa1-x2f.google.com with SMTP id 586e51a60fabf-1729bdcca99so2823842fac.12 for ; Fri, 24 Feb 2023 05:25:54 -0800 (PST) Received: from grind.. ([2804:18:18bc:fbbd:3c90:eebc:7544:73fd]) by smtp.gmail.com with ESMTPSA id b5-20020a05687061c500b001435fe636f2sm3383763oah.53.2023.02.24.05.25.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 05:25:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; 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=CL4GPYzKFLWZQ/FFxXY4BBdu3KOs7b8oA1qVwK+TM10=; b=bTx98EA587Cg7D8/7U/8ylJxrSio80qkvCluIneRuywa74dz93UIsS/yV95nTriGNd iyWYNtOwRQGtJjv45OSdPRWgNXfpPJuMngxNlGhlpAwf/iQ9xtckq/tbrGT2NyJAIKxD nnXjP97u38TdhkupmuQssdUETDNwqBYfT0qpwPOuX/2fCiCjmHlADL5b8WWpPb3DehH0 cVUFFFoAXE5LwtIyDqA9/o+POorj4LRGOtjfPGbGYq5Zv0kKtsSIIs0mEPTOfUs0RlQU MJIzsvho0pKNCkCLxCBOEi/TSAqeIh0CJ2WjClM6w6jmjcdp3F+AoWNNAubtS/603YNR 6I/g== 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:message-id:reply-to; bh=CL4GPYzKFLWZQ/FFxXY4BBdu3KOs7b8oA1qVwK+TM10=; b=ta7NK7RxcwcXw0EUv/EdscGIJ5AhM/t+nblib969tSmhpNLg7C5VA2lNnrRYU+YM/Z gR8lPqdt7W6S2yBMurHgBbvoIT30lwne4R/faJr63rYR6MzsV/oa4K6CbC6fZhsqhAbD r0BBosJUvO0HWaHh4l2ePkJU0sYd0gs0KM0uJv7pzLQHhXDrHKbcOPydamoLynOVaeoV bhAd7BW6iXqvbYTr8HHZn9wJPkgSf4OV0irooYNZfs4w6Qm/OGmXDXmLgrUkFQ7Y4dHC eFr9FT/kWRhXjg8vcTRYf/luE+vdKZvLj+x1CZBpDPD5mo+NtGTASeMmPqUFO+hrKOnl dciw== X-Gm-Message-State: AO0yUKWnco7T8FGBLR0yv7/SgnapdU153ngo22kaGTODNi4i7Bok4qy7 X+Ws9Vh0ZTcXG7vaTins0nRBMwRUz8AnODcQ X-Google-Smtp-Source: AK7set+Ha5UFcVcpYJ7cGOFpqJx6DI6Wmla321zYCNlIyNS3vhDkNgPjh90ALrKBLWxi2Ctixid/2Q== X-Received: by 2002:a05:6870:4713:b0:172:2c74:b99d with SMTP id b19-20020a056870471300b001722c74b99dmr7488543oaq.50.1677245153650; Fri, 24 Feb 2023 05:25:53 -0800 (PST) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, bmeng@tinylab.org, liweiwei@iscas.ac.cn, zhiwei_liu@linux.alibaba.com, richard.henderson@linaro.org, Christoph Muellner , Philipp Tomsich , Daniel Henrique Barboza Subject: [PATCH v8 2/4] target/riscv: implement Zicboz extension Date: Fri, 24 Feb 2023 10:25:34 -0300 Message-Id: <20230224132536.552293-3-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230224132536.552293-1-dbarboza@ventanamicro.com> References: <20230224132536.552293-1-dbarboza@ventanamicro.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=2001:4860:4864:20::2f; envelope-from=dbarboza@ventanamicro.com; helo=mail-oa1-x2f.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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @ventanamicro.com) X-ZM-MESSAGEID: 1677245252648100001 Content-Type: text/plain; charset="utf-8" From: Christoph Muellner The RISC-V base cache management operation (CBO) ISA extension has been ratified. It defines three extensions: Cache-Block Management, Cache-Block Prefetch and Cache-Block Zero. More information about the spec can be found at [1]. Let's start by implementing the Cache-Block Zero extension, Zicboz. It uses the cbo.zero instruction that, as with all CBO instructions that will be added later, needs to be implemented in an overlap group with the LQ instruction due to overlapping patterns. cbo.zero throws a Illegal Instruction/Virtual Instruction exception depending on CSR state. This is also the case for the remaining cbo instructions we're going to add next, so create a check_zicbo_envcfg() that will be used by all Zicbo[mz] instructions. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-= v1.0.1.pdf Reviewed-by: Richard Henderson Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Weiwei Li --- target/riscv/cpu.c | 4 ++ target/riscv/cpu.h | 2 + target/riscv/helper.h | 3 + target/riscv/insn32.decode | 10 ++- target/riscv/insn_trans/trans_rvzicbo.c.inc | 30 +++++++++ target/riscv/op_helper.c | 68 +++++++++++++++++++++ target/riscv/translate.c | 1 + 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 target/riscv/insn_trans/trans_rvzicbo.c.inc diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 93b52b826c..7dd37de7f9 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -74,6 +74,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] =3D { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), ISA_EXT_DATA_ENTRY(zifencei, true, PRIV_VERSION_1_10_0, ext_ifencei), ISA_EXT_DATA_ENTRY(zihintpause, true, PRIV_VERSION_1_10_0, ext_zihintp= ause), @@ -1126,6 +1127,9 @@ static Property riscv_cpu_extensions[] =3D { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), =20 + DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), + DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), + DEFINE_PROP_BOOL("zmmul", RISCVCPU, cfg.ext_zmmul, false), =20 /* Vendor-specific custom extensions */ diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 7128438d8e..6b4c714d3a 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -447,6 +447,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icboz; bool ext_zihintpause; bool ext_smstateen; bool ext_sstc; @@ -494,6 +495,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cboz_blocksize; bool mmu; bool pmp; bool epmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index 0497370afd..ce165821b8 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -97,6 +97,9 @@ DEF_HELPER_FLAGS_2(fcvt_h_l, TCG_CALL_NO_RWG, i64, env, t= l) DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) =20 +/* Cache-block operations */ +DEF_HELPER_2(cbo_zero, void, env, tl) + /* Special functions */ DEF_HELPER_2(csrr, tl, env, int) DEF_HELPER_3(csrw, void, env, int, tl) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index b7e7613ea2..3985bc703f 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -179,7 +179,15 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r =20 # *** RV128I Base Instruction Set (in addition to RV64I) *** ldu ............ ..... 111 ..... 0000011 @i -lq ............ ..... 010 ..... 0001111 @i +{ + [ + # *** RV32 Zicboz Standard Extension *** + cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm + ] + + # *** RVI128 lq *** + lq ............ ..... 010 ..... 0001111 @i +} sq ............ ..... 100 ..... 0100011 @s addid ............ ..... 000 ..... 1011011 @i sllid 000000 ...... ..... 001 ..... 1011011 @sh6 diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/ins= n_trans/trans_rvzicbo.c.inc new file mode 100644 index 0000000000..feabc28342 --- /dev/null +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -0,0 +1,30 @@ +/* + * RISC-V translation routines for the RISC-V CBO Extension. + * + * Copyright (c) 2021 Philipp Tomsich, philipp.tomsich@vrull.eu + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License f= or + * more details. + * + * You should have received a copy of the GNU General Public License along= with + * this program. If not, see . + */ + +#define REQUIRE_ZICBOZ(ctx) do { \ + if (!ctx->cfg_ptr->ext_icboz) { \ + return false; \ + } \ +} while (0) + +static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) +{ + REQUIRE_ZICBOZ(ctx); + gen_helper_cbo_zero(cpu_env, cpu_gpr[a->rs1]); + return true; +} diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index 48f918b71b..c43ecc19b5 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -3,6 +3,7 @@ * * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu * Copyright (c) 2017-2018 SiFive, Inc. + * Copyright (c) 2022 VRULL GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -123,6 +124,73 @@ target_ulong helper_csrrw_i128(CPURISCVState *env, int= csr, return int128_getlo(rv); } =20 + +/* + * check_zicbo_envcfg + * + * Raise virtual exceptions and illegal instruction exceptions for + * Zicbo[mz] instructions based on the settings of [mhs]envcfg as + * specified in section 2.5.1 of the CMO specification. + */ +static void check_zicbo_envcfg(CPURISCVState *env, target_ulong envbits, + uintptr_t ra) +{ +#ifndef CONFIG_USER_ONLY + if ((env->priv < PRV_M) && !get_field(env->menvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } + + if (riscv_cpu_virt_enabled(env) && + (((env->priv < PRV_H) && !get_field(env->henvcfg, envbits)) || + ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)))) { + riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, ra); + } + + if ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } +#endif +} + +void helper_cbo_zero(CPURISCVState *env, target_ulong address) +{ + RISCVCPU *cpu =3D env_archcpu(env); + uint16_t cbozlen =3D cpu->cfg.cboz_blocksize; + int mmu_idx =3D cpu_mmu_index(env, false); + uintptr_t ra =3D GETPC(); + void *mem; + + check_zicbo_envcfg(env, MENVCFG_CBZE, ra); + + /* Mask off low-bits to align-down to the cache-block. */ + address &=3D ~(cbozlen - 1); + + /* + * cbo.zero requires MMU_DATA_STORE access. Do a probe_write() + * to raise any exceptions, including PMP. + */ + mem =3D probe_write(env, address, cbozlen, mmu_idx, ra); + + if (likely(mem)) { + memset(mem, 0, cbozlen); + } else { + /* + * This means that we're dealing with an I/O page. Section 4.2 + * of cmobase v1.0.1 says: + * + * "Cache-block zero instructions store zeros independently + * of whether data from the underlying memory locations are + * cacheable." + * + * Write zeros in address + cbozlen regardless of not being + * a RAM page. + */ + for (int i =3D 0; i < cbozlen; i++) { + cpu_stb_mmuidx_ra(env, address + i, 0, mmu_idx, ra); + } + } +} + #ifndef CONFIG_USER_ONLY =20 target_ulong helper_sret(CPURISCVState *env) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 772f9d7973..7f687a7e37 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -1104,6 +1104,7 @@ static uint32_t opcode_at(DisasContextBase *dcbase, t= arget_ulong pc) #include "insn_trans/trans_rvv.c.inc" #include "insn_trans/trans_rvb.c.inc" #include "insn_trans/trans_rvzawrs.c.inc" +#include "insn_trans/trans_rvzicbo.c.inc" #include "insn_trans/trans_rvzfh.c.inc" #include "insn_trans/trans_rvk.c.inc" #include "insn_trans/trans_privileged.c.inc" --=20 2.39.2 From nobody Mon May 13 22:03:06 2024 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 ARC-Seal: i=1; a=rsa-sha256; t=1677245196; cv=none; d=zohomail.com; s=zohoarc; b=bXaajo6wqHGnps+6vcfbHeflhvTyT1rZWbIgOMxu/ioAAWzuni29XgFwentHZX8L2+ETW/wciKP2hEMqJ5iN9EhHcnyR8U5Dx8e+mBLQ6iLY/YV72D3P5mb4Rdg36jZRecO8MA0VbVmGtNXF6U4H7NplWv988VDbBkdZ6LpxHaI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677245196; h=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=cCSg630s63+Xe0IpvEI2yDQ6/gm6Z0A7GTyByBI3/Ok=; b=Wzqnp6F6EAMaL2m5WW+j3KLs1pJTSKE+QeAQz0sqo2E4KndzDI7qPJFVJ3l2Ox2zVT2k38qjZe0D0m7BpnILrVeSYS82/ttDd41HMmSUhiI3k8Zyajxt/NsGGPPkKB7W9fwTjOX5MgIzaCPZSM2j3XFkSSXbLjImaplHsTaifII= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677245196865434.8926016467285; Fri, 24 Feb 2023 05:26:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pVY5Q-0003mg-Dd; Fri, 24 Feb 2023 08:26:08 -0500 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 ) id 1pVY5L-0003kj-N0 for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:26:05 -0500 Received: from mail-oa1-x2b.google.com ([2001:4860:4864:20::2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pVY5I-0005VV-Cu for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:26:02 -0500 Received: by mail-oa1-x2b.google.com with SMTP id 586e51a60fabf-17264e9b575so10452514fac.9 for ; Fri, 24 Feb 2023 05:26:00 -0800 (PST) Received: from grind.. ([2804:18:18bc:fbbd:3c90:eebc:7544:73fd]) by smtp.gmail.com with ESMTPSA id b5-20020a05687061c500b001435fe636f2sm3383763oah.53.2023.02.24.05.25.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 05:25:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; 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=cCSg630s63+Xe0IpvEI2yDQ6/gm6Z0A7GTyByBI3/Ok=; b=EoluAB4UNXN87dCXIRU+1krMCywgnRnGpsruVFW4FmSbRgfjcsKwuQQXAjTe6FQQ69 QQY8zLYnf6EDLQyfObxmtb9VyM4LL0mCm8TkO/fWIVy1ztoGS6hrZPpay7Mfdf+jTXTj 2Bt8RsEI/UE5nkinopmPkduHkOXNz+paGi7XmvvuPrbbi3oHzh1LWGpyrK2W/dCpM6/R t68gqEK3cihhUBjb+qHFOPHYPJbyas01+YT++frPWcxzjGTO0rUQfnE1jel8MmKrx0qI 868k6fx69gc9a2L/65+xEp9kX+s2MUmkOXmwch87KVKdW9YjJFgusGChQ5MYwuKWpJg7 Qlhg== 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:message-id:reply-to; bh=cCSg630s63+Xe0IpvEI2yDQ6/gm6Z0A7GTyByBI3/Ok=; b=2b8hvA4DjcNm1Glfh6YZ8H6seosWnX4r+pLUagQ3TfgT8PGG2J+Oagzd0KuhA3R6Q3 maz2rd37A4upfz3P5NGuEoeQ4YQ0Ac7/2Pl6ueYOZ0vmPUZkvj7u6nHbu5MMIrNUfk16 1a4MaxT/2Ge2wwGvcEA0JwcoZ0BF60XliX0Hqd7+c+jYhhO6YNKSXUgd6uzM9skZRBKB T9jHjkWGlWYn4uM+0Y9qIRh6MU0+VJIFt29/YyVn4r6OSC9udl40Rv2zWgcYurhOEXlh zRbqiz9YGjJwrz6QlghJGbmz4KsWLCSVtxXO9Gfwdy0Z4p6PxgQdYkPDi830RY9XgpCi fRFw== X-Gm-Message-State: AO0yUKW/R8FeFMcxE5aGvYst6smRx7YhrDPNvpZHHfWgwh4Qgb1NDEjT /+sbHyi+3TeeUAaCX17H5QYn5405XFVCHY0d X-Google-Smtp-Source: AK7set8hjlq7Z+zGWF/1BXVwziqAu6UBhWN4g45MkOiR84TYMzbmmpj0/iquvo8IUzjHBp01CrQC4Q== X-Received: by 2002:a05:6870:32d4:b0:172:64e8:35e8 with SMTP id r20-20020a05687032d400b0017264e835e8mr5177650oac.53.1677245158328; Fri, 24 Feb 2023 05:25:58 -0800 (PST) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, bmeng@tinylab.org, liweiwei@iscas.ac.cn, zhiwei_liu@linux.alibaba.com, richard.henderson@linaro.org, Christoph Muellner , Philipp Tomsich , Daniel Henrique Barboza Subject: [PATCH v8 3/4] target/riscv: implement Zicbom extension Date: Fri, 24 Feb 2023 10:25:35 -0300 Message-Id: <20230224132536.552293-4-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230224132536.552293-1-dbarboza@ventanamicro.com> References: <20230224132536.552293-1-dbarboza@ventanamicro.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=2001:4860:4864:20::2b; envelope-from=dbarboza@ventanamicro.com; helo=mail-oa1-x2b.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=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 @ventanamicro.com) X-ZM-MESSAGEID: 1677245198868100007 Content-Type: text/plain; charset="utf-8" From: Christoph Muellner Zicbom is the Cache-Block Management extension defined in the already ratified RISC-V Base Cache Management Operation (CBO) ISA extension [1]. The extension contains three instructions: cbo.clean, cbo.flush and cbo.inval. All of them must be implemented in the same group as LQ and cbo.zero due to overlapping patterns. All these instructions can throw a Illegal Instruction/Virtual Instruction exception, similar to the existing cbo.zero. The same check_zicbo_envcfg() is used to handle these exceptions. Aside from that, these instructions also need to handle page faults and guest page faults. This is done in a new check_zicbom_access() helper. As with Zicboz, the cache block size for Zicbom is also configurable. Note that the spec determines that Zicbo[mp] and Zicboz can have different cache sizes (Section 2.7 of [1]), so we also include a 'cbom_blocksize' to go along with the existing 'cboz_blocksize'. They are set to the same size, so unless users want to play around with the settings both sizes will be the same. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-= v1.0.1.pdf Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza --- target/riscv/cpu.c | 3 + target/riscv/cpu.h | 2 + target/riscv/helper.h | 2 + target/riscv/insn32.decode | 5 ++ target/riscv/insn_trans/trans_rvzicbo.c.inc | 27 +++++++++ target/riscv/op_helper.c | 67 +++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 7dd37de7f9..4b779b1775 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -74,6 +74,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] =3D { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicbom, true, PRIV_VERSION_1_12_0, ext_icbom), ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), ISA_EXT_DATA_ENTRY(zifencei, true, PRIV_VERSION_1_10_0, ext_ifencei), @@ -1127,6 +1128,8 @@ static Property riscv_cpu_extensions[] =3D { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), =20 + DEFINE_PROP_BOOL("zicbom", RISCVCPU, cfg.ext_icbom, true), + DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64), DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), =20 diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 6b4c714d3a..a0673b4604 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -447,6 +447,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icbom; bool ext_icboz; bool ext_zihintpause; bool ext_smstateen; @@ -495,6 +496,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cbom_blocksize; uint16_t cboz_blocksize; bool mmu; bool pmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index ce165821b8..37b54e0991 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -98,6 +98,8 @@ DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, = tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) =20 /* Cache-block operations */ +DEF_HELPER_2(cbo_clean_flush, void, env, tl) +DEF_HELPER_2(cbo_inval, void, env, tl) DEF_HELPER_2(cbo_zero, void, env, tl) =20 /* Special functions */ diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 3985bc703f..3788f86528 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -181,6 +181,11 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r ldu ............ ..... 111 ..... 0000011 @i { [ + # *** RV32 Zicbom Standard Extension *** + cbo_clean 0000000 00001 ..... 010 00000 0001111 @sfence_vm + cbo_flush 0000000 00010 ..... 010 00000 0001111 @sfence_vm + cbo_inval 0000000 00000 ..... 010 00000 0001111 @sfence_vm + # *** RV32 Zicboz Standard Extension *** cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm ] diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/ins= n_trans/trans_rvzicbo.c.inc index feabc28342..7df9c30b58 100644 --- a/target/riscv/insn_trans/trans_rvzicbo.c.inc +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -16,12 +16,39 @@ * this program. If not, see . */ =20 +#define REQUIRE_ZICBOM(ctx) do { \ + if (!ctx->cfg_ptr->ext_icbom) { \ + return false; \ + } \ +} while (0) + #define REQUIRE_ZICBOZ(ctx) do { \ if (!ctx->cfg_ptr->ext_icboz) { \ return false; \ } \ } while (0) =20 +static bool trans_cbo_clean(DisasContext *ctx, arg_cbo_clean *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_flush(DisasContext *ctx, arg_cbo_flush *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_inval(DisasContext *ctx, arg_cbo_inval *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_inval(cpu_env, cpu_gpr[a->rs1]); + return true; +} + static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) { REQUIRE_ZICBOZ(ctx); diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index c43ecc19b5..9d339900bc 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -191,6 +191,73 @@ void helper_cbo_zero(CPURISCVState *env, target_ulong = address) } } =20 +/* + * check_zicbom_access + * + * Check access permissions (LOAD, STORE or FETCH as specified in + * section 2.5.2 of the CMO specification) for Zicbom, raising + * either store page-fault (non-virtualized) or store guest-page + * fault (virtualized). + */ +static void check_zicbom_access(CPURISCVState *env, + target_ulong address, + uintptr_t ra) +{ + RISCVCPU *cpu =3D env_archcpu(env); + int mmu_idx =3D cpu_mmu_index(env, false); + uint16_t cbomlen =3D cpu->cfg.cbom_blocksize; + void *phost; + int ret; + + /* Mask off low-bits to align-down to the cache-block. */ + address &=3D ~(cbomlen - 1); + + /* + * Section 2.5.2 of cmobase v1.0.1: + * + * "A cache-block management instruction is permitted to + * access the specified cache block whenever a load instruction + * or store instruction is permitted to access the corresponding + * physical addresses. If neither a load instruction nor store + * instruction is permitted to access the physical addresses, + * but an instruction fetch is permitted to access the physical + * addresses, whether a cache-block management instruction is + * permitted to access the cache block is UNSPECIFIED." + */ + ret =3D probe_access_flags(env, address, cbomlen, MMU_DATA_LOAD, + mmu_idx, true, &phost, ra); + if (ret !=3D TLB_INVALID_MASK) { + /* Success: readable */ + return; + } + + /* + * Since not readable, must be writable. On failure, store + * fault/store guest amo fault will be raised by + * riscv_cpu_tlb_fill(). PMP exceptions will be caught + * there as well. + */ + probe_write(env, address, cbomlen, mmu_idx, ra); +} + +void helper_cbo_clean_flush(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra =3D GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBCFE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + +void helper_cbo_inval(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra =3D GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBIE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + #ifndef CONFIG_USER_ONLY =20 target_ulong helper_sret(CPURISCVState *env) --=20 2.39.2 From nobody Mon May 13 22:03:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677245213198878.4721129068728; Fri, 24 Feb 2023 05:26:53 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pVY5S-0003oD-7o; Fri, 24 Feb 2023 08:26:10 -0500 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 ) id 1pVY5N-0003kr-7A for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:26:05 -0500 Received: from mail-oa1-x2b.google.com ([2001:4860:4864:20::2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pVY5L-0005WU-LI for qemu-devel@nongnu.org; Fri, 24 Feb 2023 08:26:04 -0500 Received: by mail-oa1-x2b.google.com with SMTP id 586e51a60fabf-17213c961dfso18892216fac.0 for ; Fri, 24 Feb 2023 05:26:03 -0800 (PST) Received: from grind.. ([2804:18:18bc:fbbd:3c90:eebc:7544:73fd]) by smtp.gmail.com with ESMTPSA id b5-20020a05687061c500b001435fe636f2sm3383763oah.53.2023.02.24.05.25.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 05:26:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; 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=nEs6ccjwVW0gg/wYcs41xs6oRr6SQ4L3Ar0gC/MnM4Q=; b=Au3e2lcew/ZB2ReAZVx3sbTbKbpxPtuggEK6XrowCWhs6LxhLw83QcVf2HSzabmWRh FrVLtfSLGQAbnsZAJYXNN7qhPnLKHI3mKNJJd+2DwJ76nun7RTvVT4KWCelfCmv5Bgsv hq6oSFD3NzClvbyXD2fG3a4a26dncjCc2GYcxMvwRCM3erSee3KaBzMcR5ikgIjnJEhP T28TGPO24Ut4yWmNWnwug+Fe4g2SPIKLFpvOlbExonPBLMS/qsBW9yZYB2K9msnsr8Zv Q0BFCo03kh0z1g33wd/fDawdQBCF8fqeix+noRvJj/tZplaZzwQu5X5EtR82PQVeC7j8 vWGA== 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:message-id:reply-to; bh=nEs6ccjwVW0gg/wYcs41xs6oRr6SQ4L3Ar0gC/MnM4Q=; b=M8B0vm2OMPLK1On031iFhxV8k4Qxe7eA/pXGf4UlMc8go4gZgwUcGetPhxLQF2BOXH ofVZd7cVpYfuJw9eoUJFuPCxqXKBVmniDnWol4yI7u1qUBMiYLiLDYSeahHj7gUEZSbp oGhuMMkK1yd+tfCxrn4/FMrm+Hw1alY1gqKmTKDjRvfsX2t/2+jYWg1t8svf2nk4Wz7K l3NciQMmkD2ZKflul1x980lweWan9tQ/Oekk6Wlu6aZdl2y/RRLtqBfxSlAzSFb3hg4j v5bB83vxDptzZOIgmCuoZ4ZgQEh2s8zbZditARtswYxQD9WtgBinFxmuxnwanG/rrt04 jyWA== X-Gm-Message-State: AO0yUKXF3Tf8Pta/D0A3H1Q4A/XMbPAvXDMnCk3KXv4CKuwLnPmu+Nzp 91V0AoEI4oKJYEQ1h83pIOsDho44G+ZhwDUV X-Google-Smtp-Source: AK7set/sndjkzRTgQQFiEVr6H8D+6ypyPYDZoV06EK2yhYbl9C8RogCr3eV0/m8/Mcj6l7oOHbSi+A== X-Received: by 2002:a05:6870:82a0:b0:172:36be:bc45 with SMTP id q32-20020a05687082a000b0017236bebc45mr6627202oae.8.1677245162272; Fri, 24 Feb 2023 05:26:02 -0800 (PST) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, bmeng@tinylab.org, liweiwei@iscas.ac.cn, zhiwei_liu@linux.alibaba.com, richard.henderson@linaro.org, Christoph Muellner , Philipp Tomsich , Daniel Henrique Barboza Subject: [PATCH v8 4/4] target/riscv: add Zicbop cbo.prefetch{i, r, m} placeholder Date: Fri, 24 Feb 2023 10:25:36 -0300 Message-Id: <20230224132536.552293-5-dbarboza@ventanamicro.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230224132536.552293-1-dbarboza@ventanamicro.com> References: <20230224132536.552293-1-dbarboza@ventanamicro.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=2001:4860:4864:20::2b; envelope-from=dbarboza@ventanamicro.com; helo=mail-oa1-x2b.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=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1677245214374100003 Content-Type: text/plain; charset="utf-8" From: Christoph Muellner The cmo.prefetch instructions are nops for QEMU (no emulation of the memory hierarchy, no illegal instructions, no permission faults, no traps). Add a comment noting where they would be decoded in case cbo.prefetch instructions become relevant in the future. Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li --- target/riscv/insn32.decode | 1 + 1 file changed, 1 insertion(+) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 3788f86528..1aebd37572 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -134,6 +134,7 @@ addi ............ ..... 000 ..... 0010011 @i slti ............ ..... 010 ..... 0010011 @i sltiu ............ ..... 011 ..... 0010011 @i xori ............ ..... 100 ..... 0010011 @i +# cbo.prefetch_{i,r,m} instructions are ori with rd=3Dx0 and not decoded. ori ............ ..... 110 ..... 0010011 @i andi ............ ..... 111 ..... 0010011 @i slli 00000. ...... ..... 001 ..... 0010011 @sh --=20 2.39.2