From nobody Tue Feb 10 12:40:48 2026 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=1687821758; cv=none; d=zohomail.com; s=zohoarc; b=WpP35Ddww51slP9V+6VlXZr7953Onv6ItWFA8wXTSt/LTTJbP2MMXQ0loNZKFBTr+17Qm26pCrPybUPVxYmD82Ch14ShsTckXBgXUT85mfcAP+AiGBJrpSFvwrPXqq8+HyNZeb528kYzJgJtwY/sipWtTy626LTZK9OKk+cAhWI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821758; 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=pRy1smRnPDEJWswv+qhjtEvNkpiteoMQEnPYOKlgw5s=; b=eOs0A5LY585WX+Vtkuvy7wKpNhFfBJC7y2qSnYjmZmR23F8zuAlHnNlALxgvCmcTGgN/snGelqnqWOXNfpO1f+3NJgh9g4EjB98WUG301GPAt7UFJiOimsf8yBgHkCyh/mavj/gvQZZJv5m1zMUjSzfTkcqkPHYEZuKqJQ83ytk= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821757993516.389217481011; Mon, 26 Jun 2023 16:22:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVV-0004aC-4S; Mon, 26 Jun 2023 19:20:29 -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 ) id 1qDvVM-0004Yy-3B for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:22 -0400 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVK-0008FS-JP for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:19 -0400 Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-51d7e8dd118so4075317a12.1 for ; Mon, 26 Jun 2023 16:20:18 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id rp25-20020a170906d97900b0098e17ea781csm3057144ejb.94.2023.06.26.16.20.15 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821617; x=1690413617; 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=pRy1smRnPDEJWswv+qhjtEvNkpiteoMQEnPYOKlgw5s=; b=Bm75F9DoAmITIp/rLy4Q4YNk//DodWSRZMFlViS+JNP1vQPyZtqXpsErSKH6vO9Lcy Gb2FfJ4D/Avufq/mHF9zOnfOg954iMJL5//BFVDuFDCl9ggpGq+8rXKiYxZuzXR/CNsF oAu545PQj+fFrZX192CVZW2T6VxPIuzpRABbsY3f79M/XYSxqaV11mJ0aXwVV/PNqmCT RvSGJOWb/BTOmjGg8IUxVz2IPIS+Xc3wNDOTuHeFmY4ruLKNYmYoTmLOMJ/za90GMbWy ufTlhnwMlSdha7UbUBOGFzXQKOLhBDBvBljeWPwGI3c1YGTGNxh4tf5j7Sb3ylLIqDAt RKUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821617; x=1690413617; 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=pRy1smRnPDEJWswv+qhjtEvNkpiteoMQEnPYOKlgw5s=; b=AdE37fPTumYwyePthPklrEHUpBKauHW3wMmrFyYsRrynmHqZo1xfdQqFa+QCvLepUk LJb5stgeMjREKOpOe6EerMWCet/6yi0u74u0hwk7sGVuVQ3T4N7WsCSDpLa1C8zlWQdp mHchSbBqGv40Hr1PpkPi80b3dcIB85/8gINvcRuGuvEEVLccCFGlxhwh4L8X6kCuXWNJ BkHFDly5p+THYr3kD4kes3RX6TAL8uWCFyNbV05qk+E3uWuoLav3+IdK9AuZQlMROmnE ws6gks/6tZSpgfREgBFQwCUh/p/8A2Iw+Ptt1MPNDZR+ZtULMgp76IIRii8sMIAQVlD+ M7tw== X-Gm-Message-State: AC+VfDy7peUsZYkdBynHW94MqwScH5GdIL5p6/6rYxVxLPfZVryQW5MJ vq313GHIhO1rrdkwqKyjWAw+49kChWwRYBwX6KY= X-Google-Smtp-Source: ACHHUZ6WgNvsIhiCSTxOr9Qv3jRK+vKujnm8cTxau+oX05bANew6dzUvg26t6lwJt61HQaLPSC62jg== X-Received: by 2002:a17:907:160c:b0:991:e849:e13b with SMTP id hb12-20020a170907160c00b00991e849e13bmr2141227ejc.10.1687821617099; Mon, 26 Jun 2023 16:20:17 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 01/16] target/riscv: Remove unused 'instmap.h' header in translate.c Date: Tue, 27 Jun 2023 01:19:52 +0200 Message-Id: <20230626232007.8933-2-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::52a; envelope-from=philmd@linaro.org; helo=mail-ed1-x52a.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821758221100005 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/translate.c | 1 - 1 file changed, 1 deletion(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 8a33da811e..bd33bc3f51 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -30,7 +30,6 @@ #include "exec/log.h" #include "semihosting/semihost.h" =20 -#include "instmap.h" #include "internals.h" =20 #define HELPER_H "helper.h" --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821646; cv=none; d=zohomail.com; s=zohoarc; b=YGq/w2G+f+EWvDBSBUMi39lUI4HBx1iVf+fGfpLDQUTPrRCM/bHYIg4pey79gNADEKMqFBWqfDm/vkwuILzjGLSdaVnweR/uMjH8/7XOncFOUUmnOuv4ugV8Oo4RYVSvYmX09BF6LWat5JC18r7dpYvVTo4iEVw3/XzGVhlCygs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821646; 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=D471PgeWyqak7jZe+2YA9NfSbgvi1QNeIRcTGaIHIiA=; b=BmQTQNZnxvFOA3d7yYwWVJpg81AQ2Bc+4B6CmxVrXYhTBFnoy12MTfrFbJ6XgKGYjQhInKZGSGnMKaEWDAQgarAFVqxRbLGhGRtO1BwG/tFgkpTkrzbZ7fTJnR69nDZ2x1pz7cLcE7bmMxEno24vyybtwJTe6tMkIuCU/bdx+Aw= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821646532703.6610591465504; Mon, 26 Jun 2023 16:20:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVX-0004bF-9y; Mon, 26 Jun 2023 19:20:31 -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 ) id 1qDvVV-0004aT-Dd for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:29 -0400 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVR-0008JA-NF for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:29 -0400 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-98df69cacd1so210807666b.1 for ; Mon, 26 Jun 2023 16:20:24 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id k19-20020a1709061c1300b00988b6d05f33sm3749382ejg.223.2023.06.26.16.20.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821623; x=1690413623; 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=D471PgeWyqak7jZe+2YA9NfSbgvi1QNeIRcTGaIHIiA=; b=FFQ+0bJRiM6EtllOnOWpubNIysujnBXbaUn8M4DJYLtY6Plx9e34XTXayY7SpvtHTX zXJTJ5fnqwYfGzagd34CnnoJv1z8c4QhMbMj0iYeOczvY2O23RHl5/OGxHuqBMGs0wO2 tzmFS+KenLMFeXUEGU9nolTy44T8Vyz0Z4RBdGrAgI9NKhzdaUMGpmh2O7u9vD9pRhOv E0/boCpyaq1zwgd5RITM38aMg2OoGHDMBUTmMYqC5+qTf+fbAdwIEJhYu0ZPrwUhTGpb 1HGOfPuHNi+WHnTTx8BaOtI7/agW4SvF0Ei+tMOa+uEY0z0PbWraGUAvxqQz7KaoDEaJ JM/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821623; x=1690413623; 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=D471PgeWyqak7jZe+2YA9NfSbgvi1QNeIRcTGaIHIiA=; b=DxPpVsaE24byq8BnRT2kGA24VX6l0Rm9bg+mjNvrmdvZCYvsqGDNB2ipE++wTnforC +GykkaGDsVh4jzGoBpAoBXqsGe9TEnja1QsFbOOMtjN75a6wXW7QaEFjj6mXzFhO6S8T Tdgm8G9zIEWlLs8uDxFXb3K2O//ZSYcsF6mbVNcYwSxon6nl2W0S5D+8qpfkw6/lkv9y +ZflwMSOX/ycHoU66wOaLQF8lltHGtXyfocfcQFPZR5czwc1q/1NdPDDUg9lIGdv6076 16iX+1kB+nCpzSxlFkI3IHHjSXG5hSVUAPQguHlCCTBHo7yDCEtLxgYWCm6PEWd814QT KRug== X-Gm-Message-State: AC+VfDxWK1tWuvwTNd3sG/ZemqhEV1NpCZ98oW7ypEbAFxJ8TnciCOmG hhtLH59Xf+loQFkVcVHOfreXwVV2O9+JUiuVwEg= X-Google-Smtp-Source: ACHHUZ7zAfOcbNWS/cWEujal4/ftdq3/Jh5Vs8pgcif9Da1R9qFX2z0rk7mgJ48Ju2red1wzx7UN5A== X-Received: by 2002:a17:906:b844:b0:991:b554:e64b with SMTP id ga4-20020a170906b84400b00991b554e64bmr3140320ejb.54.1687821623261; Mon, 26 Jun 2023 16:20:23 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 02/16] target/riscv: Restrict KVM-specific fields from ArchCPU Date: Tue, 27 Jun 2023 01:19:53 +0200 Message-Id: <20230626232007.8933-3-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62f; envelope-from=philmd@linaro.org; helo=mail-ej1-x62f.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821648092100003 These fields shouldn't be accessed when KVM is not available. Restrict the KVM timer migration state. Rename the KVM timer post_load() handler accordingly, because cpu_post_load() is too generic. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Daniel Henrique Barboza --- target/riscv/cpu.h | 2 ++ target/riscv/cpu.c | 2 +- target/riscv/machine.c | 8 ++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index e3e08d315f..b1b56aa29e 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -363,12 +363,14 @@ struct CPUArchState { hwaddr kernel_addr; hwaddr fdt_addr; =20 +#ifdef CONFIG_KVM /* kvm timer */ bool kvm_timer_dirty; uint64_t kvm_timer_time; uint64_t kvm_timer_compare; uint64_t kvm_timer_state; uint64_t kvm_timer_frequency; +#endif /* CONFIG_KVM */ }; =20 /* diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 881bddf393..4035fe0e62 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -584,7 +584,7 @@ static void riscv_host_cpu_init(Object *obj) #endif riscv_cpu_add_user_properties(obj); } -#endif +#endif /* CONFIG_KVM */ =20 static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model) { diff --git a/target/riscv/machine.c b/target/riscv/machine.c index 3ce2970785..c7c862cdd3 100644 --- a/target/riscv/machine.c +++ b/target/riscv/machine.c @@ -194,12 +194,13 @@ static const VMStateDescription vmstate_rv128 =3D { } }; =20 +#ifdef CONFIG_KVM static bool kvmtimer_needed(void *opaque) { return kvm_enabled(); } =20 -static int cpu_post_load(void *opaque, int version_id) +static int cpu_kvmtimer_post_load(void *opaque, int version_id) { RISCVCPU *cpu =3D opaque; CPURISCVState *env =3D &cpu->env; @@ -213,7 +214,7 @@ static const VMStateDescription vmstate_kvmtimer =3D { .version_id =3D 1, .minimum_version_id =3D 1, .needed =3D kvmtimer_needed, - .post_load =3D cpu_post_load, + .post_load =3D cpu_kvmtimer_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT64(env.kvm_timer_time, RISCVCPU), VMSTATE_UINT64(env.kvm_timer_compare, RISCVCPU), @@ -221,6 +222,7 @@ static const VMStateDescription vmstate_kvmtimer =3D { VMSTATE_END_OF_LIST() } }; +#endif =20 static bool debug_needed(void *opaque) { @@ -409,7 +411,9 @@ const VMStateDescription vmstate_riscv_cpu =3D { &vmstate_vector, &vmstate_pointermasking, &vmstate_rv128, +#ifdef CONFIG_KVM &vmstate_kvmtimer, +#endif &vmstate_envcfg, &vmstate_debug, &vmstate_smstateen, --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821692; cv=none; d=zohomail.com; s=zohoarc; b=FtoPC72zpMw+et1BANgoaTAZVIfn8uVtxS3Tsw12G94g+B6jZH/mfmp4mgRfvZnD130sNQmKijDlLsxw5509paEqSDxqE4znj+Y+46dYpHThlIdkQwmcgkttX0NHB114CZBqbWjxIGg79G3h0rEkjliCTTaU7HFWeJx50U4MtZQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821692; 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=W8NcuMKsIMVo8BKREArVzU5buwOf6lSqGWRgcZxHDMo=; b=jKFNNZnpjmq7BoGfRoDljPtpC6/MaQ9NwsKjRmWwEARrlJcHwcoPPWv9X7BQ7z9jiZ7P6Vx4O/uiIubfVJOi7nEEArlIN+IvOgVIwCMe6afnQ0dan90mf2gv9kMQ5tRHPP7X74cvNcVkfB/d68nCxrMmzdFFP9549xhTw+KA9GA= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821692442915.1406985322255; Mon, 26 Jun 2023 16:21:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVa-0004cT-TX; Mon, 26 Jun 2023 19:20:34 -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 ) id 1qDvVZ-0004br-2l for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:33 -0400 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVX-0008QC-G8 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:32 -0400 Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-991e69499d1so122028066b.2 for ; Mon, 26 Jun 2023 16:20:31 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id t23-20020a170906179700b00987f64b84afsm3757789eje.39.2023.06.26.16.20.27 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821629; x=1690413629; 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=W8NcuMKsIMVo8BKREArVzU5buwOf6lSqGWRgcZxHDMo=; b=fZ2pvKsGyFxNgeT02+WdLzkxKUwAjAzExJxd4w2IJztwMnPpGCFB10lidiEf/gbras AVKOILkyfsYXfQMGtjMABw0KZ9U71yOc3kinySzqFE/3nSgldUfCFM7zcz/qHWQbspjI pFr2ibiqKiz1lPMPmTCloL+mGy971cFwf3J1qcaMaUrnalInUVYV8we3A/W3v7aYl1Bj U4dOJOU7lW2+5MggUR5bAMwfXtrK1yy6nTHwPhicLb2nFSSd31s8vP/qd7LsHp3U1ecz KU7JF7PvcKEECU9u5aOABsISkf9psY22ZvGaHVP0EcGtEoPQ5vA2hfXb8mmh7uwnn+aA yvGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821629; x=1690413629; 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=W8NcuMKsIMVo8BKREArVzU5buwOf6lSqGWRgcZxHDMo=; b=A8hW2ise/HZdoyqA8RqXVOjQqHdMbKPxM+DJHIR/vIGxZAVGyJrpntQnfgBCCuQlHz wlUAPH15tACMWwRULggCALlSA7u3frghN8qc53yoPmeGQUEQJlEiZt0526RY0bYpo9AW hOKFQ6p/xYbEG8qVN5GINKsmPJAFCzJBjBSU9kdLF/chpMsfOoYViCqIqV6rUSN7eJ2D 7zwJ+3G5v8pZrLC0DX5imJFyibYsp0IfB/ieafXhPbPyVHvuXwkAXFYG1N1SIbGnGI6U hJcoKpD2YReZHFKYU8ZtKUxQnO8zliP8+dJ1P5PapbpzvTXX1gn7wB1u9HnY469zh/QV ICxw== X-Gm-Message-State: AC+VfDxdESG585NsNFkmrEluXVLkjFgfUcV/Umus2cmFvJgknJIiwrxp JLdBlgx/I0owZg4ZtI5p9uzGHGQHYuWLdEfrg6g= X-Google-Smtp-Source: ACHHUZ7N86Wzf4GnCcmKQeQgvU0I7+zXopmC3nN4Uq3/HwfDAarttg6GBxWLWSRWWvADJT3R5qot4A== X-Received: by 2002:a17:907:2ce2:b0:98a:ed3d:8917 with SMTP id hz2-20020a1709072ce200b0098aed3d8917mr16161605ejc.9.1687821629556; Mon, 26 Jun 2023 16:20:29 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 03/16] target/riscv: Restrict sysemu specific header to user emulation Date: Tue, 27 Jun 2023 01:19:54 +0200 Message-Id: <20230626232007.8933-4-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::631; envelope-from=philmd@linaro.org; helo=mail-ej1-x631.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821694162100001 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.c | 8 +++++--- target/riscv/cpu_helper.c | 2 ++ target/riscv/csr.c | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 4035fe0e62..175dbc9826 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -23,9 +23,13 @@ #include "qemu/log.h" #include "cpu.h" #include "cpu_vendorid.h" +#ifndef CONFIG_USER_ONLY #include "pmu.h" -#include "internals.h" #include "time_helper.h" +#include "sysemu/kvm.h" +#include "kvm_riscv.h" +#endif +#include "internals.h" #include "exec/exec-all.h" #include "qapi/error.h" #include "qapi/visitor.h" @@ -33,8 +37,6 @@ #include "hw/qdev-properties.h" #include "migration/vmstate.h" #include "fpu/softfloat-helpers.h" -#include "sysemu/kvm.h" -#include "kvm_riscv.h" #include "tcg/tcg.h" =20 /* RISC-V CPU definitions */ diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 90cef9856d..d871718e5d 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -28,7 +28,9 @@ #include "tcg/tcg-op.h" #include "trace.h" #include "semihosting/common-semi.h" +#ifndef CONFIG_USER_ONLY #include "sysemu/cpu-timers.h" +#endif #include "cpu_bits.h" #include "debug.h" #include "tcg/oversized-guest.h" diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 58499b5afc..936ba2be24 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -21,8 +21,10 @@ #include "qemu/log.h" #include "qemu/timer.h" #include "cpu.h" +#ifndef CONFIG_USER_ONLY #include "pmu.h" #include "time_helper.h" +#endif #include "qemu/main-loop.h" #include "exec/exec-all.h" #include "exec/tb-flush.h" --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821659; cv=none; d=zohomail.com; s=zohoarc; b=GNQ6EHg7SDMLLrrEhmCVv+4QkszPtGSgEbi3lvFKV1komFgLT356/grIrr+1SUad5oGQrFBbMX09tBCvqMARRwSeg1MI+8DRHMF3fXFZydH4rWC+Kj+VqO6FUrKtUb/KkT7kaahpTm52xZNsuh1V69ozr/uh/3oqG78iTO1XkMY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821659; 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=9n9ArHz60JzWE1yJqemnhDvR/HZJtedzb/UUiT/wvC8=; b=YHWEWZg/e4HRpnzHQrTDIR6vcUTdkjZbyvrRi9W2bqXP1Qaqg+Qridp5cSh5NHwXWx9JJT1lc9VQx1rp76Qs/8VHdfZ0+XoXNU6ReKCuEuT9wtlZ8gTOAs7wG5TwqqLN38MIHrwiOHlmmgby0iMLH0iiusr1vGSyM1Mvg1S1UQo= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821659001571.180573300781; Mon, 26 Jun 2023 16:20:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVg-0004dY-Io; Mon, 26 Jun 2023 19:20:40 -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 ) id 1qDvVf-0004dB-2H for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:39 -0400 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVd-0008Sv-E7 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:38 -0400 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-98e1d3be004so292560166b.1 for ; Mon, 26 Jun 2023 16:20:37 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id rn19-20020a170906d93300b0098822e05eddsm3753487ejb.100.2023.06.26.16.20.34 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821636; x=1690413636; 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=9n9ArHz60JzWE1yJqemnhDvR/HZJtedzb/UUiT/wvC8=; b=bxzSKNJ73QcO7iLvYeLyG0dnR9SiUgtOksbo/GmR2Ym9lThpIqrHxVbGGVKvbSA5GQ Xw5HbE3nOapG4+8j6SNoD/WZXLNoe13LvtFYkNHec0enGQahL2NilnahIfw0Nc0AkdD/ sMGLPM9JlT+LnKA2vURENJe0c82DuW/xiDz5dYA3CU/CExV0E7k3cM0vw9Fg1E8FeOhI kTfR21jy/Cw34CLeD0b91H1Hjux3QJ9bJDygJ88GhgPQPiKyyTAKa7+BTxSl3njPbVWv Axv/D5toJR1VO5+aT2vV6SjpHOB1ZrBhE9oW565pNSREEojW+3tNVzh9PhMEXCYER8EF KT5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821636; x=1690413636; 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=9n9ArHz60JzWE1yJqemnhDvR/HZJtedzb/UUiT/wvC8=; b=ba13NMgoMxnTBSql/xGkByUpxtywBO3hFINxdnlbaN7Eb8p4AsL9XDRLyYfXhB5AvU K7FTrQIJYeNmNXl0KF8nltQHtZCkBOmhusBsS/8/6lmjQp3Q07MRxn7QEe9KmbhqwWsO uO/yvTN6goq3wZnJsOnSzUjaghGbjKVeFdLHK10PcFrid5QVX2TCaywE0qBiggLBHgbQ lMTtihklNusYDzkwDsimnKkcz458NMzVYwS8qqwH1+OKBB1atnt9buzbmJk2puG+age2 Oe/vK3NS4Xkb9hJ4MQcGChPSwV6r4t0NDY5ptWljI7Jojd6VPkzqFuSS2RbWFuqyH2Ne kp+Q== X-Gm-Message-State: AC+VfDwrghkkMAa5TUNhRn01WWbVFrnIJnd/espjTl+/K646FkQIWs7C EvAEmhifgEfmgJ3NM3fZBtdOE/Qw0qKkJd+wYN8= X-Google-Smtp-Source: ACHHUZ4Z3DeaFCYasucsNa5YAKRmI776qMi5ID9ep5a+fWS9eld+Go6WRb9RUECWpdZcSvJjiOvRtA== X-Received: by 2002:a17:907:2e0b:b0:992:1308:f551 with SMTP id ig11-20020a1709072e0b00b009921308f551mr117254ejc.9.1687821635934; Mon, 26 Jun 2023 16:20:35 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 04/16] target/riscv: Restrict 'rv128' machine to TCG accelerator Date: Tue, 27 Jun 2023 01:19:55 +0200 Message-Id: <20230626232007.8933-5-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::630; envelope-from=philmd@linaro.org; helo=mail-ej1-x630.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821659883100001 We only build for 32/64-bit hosts, so TCG is required for 128-bit targets. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 175dbc9826..7f281cdcf6 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -473,6 +473,7 @@ static void rv64_veyron_v1_cpu_init(Object *obj) #endif } =20 +#ifdef CONFIG_TCG static void rv128_base_cpu_init(Object *obj) { if (qemu_tcg_mttcg_enabled()) { @@ -491,7 +492,10 @@ static void rv128_base_cpu_init(Object *obj) set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); #endif } -#else +#endif + +#else /* !TARGET_RISCV64 */ + static void rv32_base_cpu_init(Object *obj) { CPURISCVState *env =3D &RISCV_CPU(obj)->env; @@ -573,7 +577,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) cpu->cfg.ext_icsr =3D true; cpu->cfg.pmp =3D true; } -#endif +#endif /* !TARGET_RISCV64 */ =20 #if defined(CONFIG_KVM) static void riscv_host_cpu_init(Object *obj) @@ -1947,8 +1951,10 @@ static const TypeInfo riscv_cpu_type_infos[] =3D { DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init), DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init), DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init), +#ifdef CONFIG_TCG DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init), -#endif +#endif /* CONFIG_TCG */ +#endif /* TARGET_RISCV64 */ }; =20 DEFINE_TYPES(riscv_cpu_type_infos) --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821780; cv=none; d=zohomail.com; s=zohoarc; b=lZX24oJeapscZNG6jzicqsHPjmhbOj6SMW3RKMmZqBnlAbBBNjGGuCXjLd2v1J+czfkjbTRWYmtA7FnNm6qY40/IpckaZsWei/rQ2ZLEjRVCwxzxc/p3YxpjciTZzZ9a9uZteMERMLD+5Bc5D8xKec3TBm0DRFWZ7VrTjcHP5Xo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821780; 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=zgOYNNSnoVwlQK/r9wkyHNyY/Yl022DGjtE43qf1HB0=; b=K8Me83ytL6SeSLxJcNGR64+wTdPK2xuW1fuVcl6u2uFC062NcgNU+MR/B5vPMSqRS8ITXYyZgdAJSj7jNbXprx3zGz16tebYD49grS0tV3v4Avv6AO2o1qmuIuyq3qqytX//YCQQd1EANzrIzMxaOQduNxPKaKqGmbbjQEcscTo= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 168782178096284.65688248119307; Mon, 26 Jun 2023 16:23:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVp-0004iI-Gu; Mon, 26 Jun 2023 19:20:49 -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 ) id 1qDvVm-0004gt-Sq for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:46 -0400 Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVj-000054-Qa for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:46 -0400 Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-51d9123a8abso2699227a12.2 for ; Mon, 26 Jun 2023 16:20:43 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id gg18-20020a170906e29200b0098d2d219649sm3843858ejb.174.2023.06.26.16.20.40 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821642; x=1690413642; 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=zgOYNNSnoVwlQK/r9wkyHNyY/Yl022DGjtE43qf1HB0=; b=DMKuUklZ/aESEWoH5CgrsX3F4rcfgPe9IrSZaXQpG4FXUBKofvrH4/lsKzLPIfFfRs 7nbwF1DT5cAOKIYyBXdiUnCJakYNxQHosGP5Bbhwd4aByVwPZ9sOC8UJY2HefGetNAm/ yeGWG0L77JyAiqFZTdkpvgZmkI7JwvAbDuVWJof39mkoX31p4f/J6aSIsXmY5AGDMAlX nnTW273WVHCawSNloNfyia29CXFP52v9mvjvSzzVhy2TyQtkzhT2t/nzj0sEr7oRnWaT W1KnOzRrJH8O0ovcnpNA89i9IsTpssqTBlQrQAgqpeZYPpFkxxw/bvBVTIJuFuKNajXk ePeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821642; x=1690413642; 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=zgOYNNSnoVwlQK/r9wkyHNyY/Yl022DGjtE43qf1HB0=; b=SRjyAUyAblg0lR8TkJL5XUMfEuIDUGzwCQmoNyK1n9C+3dkiJb9rJ9yZtSI04uvovV P6xPUY38I0anLaLmI++0meRMggYvei56bsjseJvg5I7fvPDq/tXnd8HlD2/wy7azm7z9 ZD89wYygoUvT2+jspRTlqaQsqzePloMj7h4q0LupYiMQbVa4K59SUsJqLzNBIF85MS6F KIgLouk8B0+DbtDQN7Va7NY+CBkIfs4BIK1E8z1ck0imQVPlXB5JAHzvhG9SmayHsYCt mT9waCheexDtbGcUC6LUPHEYsIgI/6utqZD5ErAIXc78nKr6k0kqPHxsm/Gk27C+lJno tvJQ== X-Gm-Message-State: AC+VfDxn72ESmo+Fhf8wLwUV+0GCuPxPF/l/UBpmvL59nn2SnUvmG69y w2/bW7UL7HA8QomlmLAiT4duezJ3IP1ZP+AXD7w= X-Google-Smtp-Source: ACHHUZ7CCLSkPrh0C0sPMD+HAJJSGoX+OLIqD1OuKi9lCbnDlBTRL4w6eBQfPS8JQMQLhK+6LqaaIg== X-Received: by 2002:a17:906:fe03:b0:96f:b58e:7e21 with SMTP id wy3-20020a170906fe0300b0096fb58e7e21mr26173106ejb.52.1687821642178; Mon, 26 Jun 2023 16:20:42 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 05/16] target/riscv: Move sysemu-specific files to target/riscv/sysemu/ Date: Tue, 27 Jun 2023 01:19:56 +0200 Message-Id: <20230626232007.8933-6-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::52b; envelope-from=philmd@linaro.org; helo=mail-ed1-x52b.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821782097100006 Move sysemu-specific files to the a new 'sysemu' sub-directory, adapt meson rules. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.h | 2 +- target/riscv/{ =3D> sysemu}/instmap.h | 0 target/riscv/{ =3D> sysemu}/kvm_riscv.h | 0 target/riscv/{ =3D> sysemu}/pmp.h | 0 target/riscv/{ =3D> sysemu}/pmu.h | 0 target/riscv/{ =3D> sysemu}/time_helper.h | 0 hw/riscv/virt.c | 2 +- target/riscv/cpu.c | 6 +++--- target/riscv/cpu_helper.c | 4 ++-- target/riscv/csr.c | 4 ++-- target/riscv/{ =3D> sysemu}/arch_dump.c | 0 target/riscv/{ =3D> sysemu}/kvm-stub.c | 0 target/riscv/{ =3D> sysemu}/kvm.c | 0 target/riscv/{ =3D> sysemu}/machine.c | 0 target/riscv/{ =3D> sysemu}/monitor.c | 0 target/riscv/{ =3D> sysemu}/pmp.c | 0 target/riscv/{ =3D> sysemu}/pmu.c | 0 target/riscv/{ =3D> sysemu}/riscv-qmp-cmds.c | 0 target/riscv/{ =3D> sysemu}/time_helper.c | 0 target/riscv/meson.build | 13 ++++--------- target/riscv/sysemu/meson.build | 12 ++++++++++++ 21 files changed, 25 insertions(+), 18 deletions(-) rename target/riscv/{ =3D> sysemu}/instmap.h (100%) rename target/riscv/{ =3D> sysemu}/kvm_riscv.h (100%) rename target/riscv/{ =3D> sysemu}/pmp.h (100%) rename target/riscv/{ =3D> sysemu}/pmu.h (100%) rename target/riscv/{ =3D> sysemu}/time_helper.h (100%) rename target/riscv/{ =3D> sysemu}/arch_dump.c (100%) rename target/riscv/{ =3D> sysemu}/kvm-stub.c (100%) rename target/riscv/{ =3D> sysemu}/kvm.c (100%) rename target/riscv/{ =3D> sysemu}/machine.c (100%) rename target/riscv/{ =3D> sysemu}/monitor.c (100%) rename target/riscv/{ =3D> sysemu}/pmp.c (100%) rename target/riscv/{ =3D> sysemu}/pmu.c (100%) rename target/riscv/{ =3D> sysemu}/riscv-qmp-cmds.c (100%) rename target/riscv/{ =3D> sysemu}/time_helper.c (100%) create mode 100644 target/riscv/sysemu/meson.build diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index b1b56aa29e..83a9a965d1 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -88,7 +88,7 @@ typedef enum { #define MAX_RISCV_PMPS (16) =20 #if !defined(CONFIG_USER_ONLY) -#include "pmp.h" +#include "sysemu/pmp.h" #include "debug.h" #endif =20 diff --git a/target/riscv/instmap.h b/target/riscv/sysemu/instmap.h similarity index 100% rename from target/riscv/instmap.h rename to target/riscv/sysemu/instmap.h diff --git a/target/riscv/kvm_riscv.h b/target/riscv/sysemu/kvm_riscv.h similarity index 100% rename from target/riscv/kvm_riscv.h rename to target/riscv/sysemu/kvm_riscv.h diff --git a/target/riscv/pmp.h b/target/riscv/sysemu/pmp.h similarity index 100% rename from target/riscv/pmp.h rename to target/riscv/sysemu/pmp.h diff --git a/target/riscv/pmu.h b/target/riscv/sysemu/pmu.h similarity index 100% rename from target/riscv/pmu.h rename to target/riscv/sysemu/pmu.h diff --git a/target/riscv/time_helper.h b/target/riscv/sysemu/time_helper.h similarity index 100% rename from target/riscv/time_helper.h rename to target/riscv/sysemu/time_helper.h diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 95708d890e..11f9577004 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -30,7 +30,7 @@ #include "hw/char/serial.h" #include "target/riscv/cpu.h" #include "hw/core/sysbus-fdt.h" -#include "target/riscv/pmu.h" +#include "target/riscv/sysemu/pmu.h" #include "hw/riscv/riscv_hart.h" #include "hw/riscv/virt.h" #include "hw/riscv/boot.h" diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 7f281cdcf6..a1513bf5cc 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -24,10 +24,10 @@ #include "cpu.h" #include "cpu_vendorid.h" #ifndef CONFIG_USER_ONLY -#include "pmu.h" -#include "time_helper.h" +#include "sysemu/pmu.h" +#include "sysemu/time_helper.h" #include "sysemu/kvm.h" -#include "kvm_riscv.h" +#include "sysemu/kvm_riscv.h" #endif #include "internals.h" #include "exec/exec-all.h" diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index d871718e5d..5ff48be561 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -22,9 +22,9 @@ #include "qemu/main-loop.h" #include "cpu.h" #include "internals.h" -#include "pmu.h" +#include "sysemu/pmu.h" #include "exec/exec-all.h" -#include "instmap.h" +#include "sysemu/instmap.h" #include "tcg/tcg-op.h" #include "trace.h" #include "semihosting/common-semi.h" diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 936ba2be24..788d169502 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -22,8 +22,8 @@ #include "qemu/timer.h" #include "cpu.h" #ifndef CONFIG_USER_ONLY -#include "pmu.h" -#include "time_helper.h" +#include "sysemu/pmu.h" +#include "sysemu/time_helper.h" #endif #include "qemu/main-loop.h" #include "exec/exec-all.h" diff --git a/target/riscv/arch_dump.c b/target/riscv/sysemu/arch_dump.c similarity index 100% rename from target/riscv/arch_dump.c rename to target/riscv/sysemu/arch_dump.c diff --git a/target/riscv/kvm-stub.c b/target/riscv/sysemu/kvm-stub.c similarity index 100% rename from target/riscv/kvm-stub.c rename to target/riscv/sysemu/kvm-stub.c diff --git a/target/riscv/kvm.c b/target/riscv/sysemu/kvm.c similarity index 100% rename from target/riscv/kvm.c rename to target/riscv/sysemu/kvm.c diff --git a/target/riscv/machine.c b/target/riscv/sysemu/machine.c similarity index 100% rename from target/riscv/machine.c rename to target/riscv/sysemu/machine.c diff --git a/target/riscv/monitor.c b/target/riscv/sysemu/monitor.c similarity index 100% rename from target/riscv/monitor.c rename to target/riscv/sysemu/monitor.c diff --git a/target/riscv/pmp.c b/target/riscv/sysemu/pmp.c similarity index 100% rename from target/riscv/pmp.c rename to target/riscv/sysemu/pmp.c diff --git a/target/riscv/pmu.c b/target/riscv/sysemu/pmu.c similarity index 100% rename from target/riscv/pmu.c rename to target/riscv/sysemu/pmu.c diff --git a/target/riscv/riscv-qmp-cmds.c b/target/riscv/sysemu/riscv-qmp-= cmds.c similarity index 100% rename from target/riscv/riscv-qmp-cmds.c rename to target/riscv/sysemu/riscv-qmp-cmds.c diff --git a/target/riscv/time_helper.c b/target/riscv/sysemu/time_helper.c similarity index 100% rename from target/riscv/time_helper.c rename to target/riscv/sysemu/time_helper.c diff --git a/target/riscv/meson.build b/target/riscv/meson.build index 7f56c5f88d..8967dfaded 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -7,6 +7,8 @@ gen =3D [ ] =20 riscv_ss =3D ss.source_set() +riscv_system_ss =3D ss.source_set() + riscv_ss.add(gen) riscv_ss.add(files( 'cpu.c', @@ -22,19 +24,12 @@ riscv_ss.add(files( 'crypto_helper.c', 'zce_helper.c' )) -riscv_ss.add(when: 'CONFIG_KVM', if_true: files('kvm.c'), if_false: files(= 'kvm-stub.c')) =20 -riscv_system_ss =3D ss.source_set() riscv_system_ss.add(files( - 'arch_dump.c', - 'pmp.c', 'debug.c', - 'monitor.c', - 'machine.c', - 'pmu.c', - 'time_helper.c', - 'riscv-qmp-cmds.c', )) =20 +subdir('sysemu') + target_arch +=3D {'riscv': riscv_ss} target_softmmu_arch +=3D {'riscv': riscv_system_ss} diff --git a/target/riscv/sysemu/meson.build b/target/riscv/sysemu/meson.bu= ild new file mode 100644 index 0000000000..5f8e1edcf2 --- /dev/null +++ b/target/riscv/sysemu/meson.build @@ -0,0 +1,12 @@ +riscv_system_ss.add(files( + 'arch_dump.c', + 'machine.c', + 'monitor.c', + 'pmp.c', + 'pmu.c', + 'riscv-qmp-cmds.c', + 'time_helper.c', +)) + +riscv_ss.add(when: 'CONFIG_KVM', if_true: files('kvm.c'), + if_false: files('kvm-stub.c')) --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821788; cv=none; d=zohomail.com; s=zohoarc; b=RjXzGZ+Qpaqxvqc6PcX6iV86490llDcYnSb06RyftQ+en5B+F8d6UM8msNJsON2B8GJ/53h1lqciSvshvVTJvjK17MQTuvjK+8MXcVDjEyRQdNLuK4Vi2LHntnbCB8AH8qa4nwnNNixFcH0uOy2UAVXrm5B8atYrWzfol/FwzQI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821788; 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=eiJRm9dNflVLbzk1HDloTKSsjOOAeGYdt13uGLUOy3Q=; b=Dk3IuDFBuk2dCR+ZHr3UuWiLJNWa3Gg6w5YR2bqkDPgagbOP8a2qr4Vc+Fb086MO3ChFmySoxVAsTwtG5ejCpeV/9Ed0oNII9niE5APlZvXtbiWF82b2Dh8BiXW4/Yvzqt0igB9COxiZxvseDhA+Li2VmjRCNQ5Xr0oFFoEGgCk= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821788006845.0634945508552; Mon, 26 Jun 2023 16:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvVv-0004l4-JU; Mon, 26 Jun 2023 19:20:55 -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 ) id 1qDvVr-0004iX-VV for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:51 -0400 Received: from mail-lj1-x231.google.com ([2a00:1450:4864:20::231]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVq-0000Ap-6f for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:51 -0400 Received: by mail-lj1-x231.google.com with SMTP id 38308e7fff4ca-2b698dd515dso33673661fa.3 for ; Mon, 26 Jun 2023 16:20:49 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id k19-20020a05640212d300b0051d988bd64bsm1670037edx.97.2023.06.26.16.20.46 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821648; x=1690413648; 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=eiJRm9dNflVLbzk1HDloTKSsjOOAeGYdt13uGLUOy3Q=; b=TNbMGgUqpHFY7MHZV2HNUHTGA35ajJcS/qVxlzpC7BX/wWtSMFcQUH5VlTgPUsGwvv qA3ahx9+ziwpB1TE81UYqKW0lmHtfDB5a9s2MQ83ZYbP+laZoPsJQTrfqNwdnrgcUKPC wGmAfuZuZkwDUvhMxiqZlesjMkD20va9L/G1h2HfqaKjr85M0VagE1dYVd5S+WkbtxNt 9tloLnjN7R10pmW0GEHOLDVRsE8MKONGOx/HB7vRTMGUbnTlt+rmIykpIijcYm1hbekw 2iCP9T02pyjfXKRrklfobX3/IA4geb4x5V/beVHo29RzHOIsKCUBTH62WAfHUqnwmHDO RHyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821648; x=1690413648; 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=eiJRm9dNflVLbzk1HDloTKSsjOOAeGYdt13uGLUOy3Q=; b=JjHJOB8rYmQ5cv05M6vIySksc36QnWwbsYd8o+iJv8oEp2NB4C1e5kX1KH/aSfV3gt ywtb/TVw19ZMR+Qw2nFHeZvj+XDl9eaDs9YCm9uwIHlJBdYMUseoWPPDsGXccGwHVs7W nQsGnfmE3BMGPq1kwGPxnkzW95xqd+990r0/n1ciSMmubYIbT2Cypeo7++bHBdVptf89 0U9PTPRphPKLaPPk6T5P4ShChY/PGHA0CBjs2V2lSnrCROtBKLGoGO7Rdie00sNKe2+H CufKL7R4ETP7pazg/XFEs67uekgaWvGDPdFs/FoA8dPAYK2t7dvEnoSQH0chNvMzGopr SvjA== X-Gm-Message-State: AC+VfDwEvl7MFg4nscnjeaLIwQUoCFNkfWrVBRehiqRjBdv/nJnUQvb7 TG/x2VCLmVYkkQRQldjhr76AwsLwOz4YS0uHah8= X-Google-Smtp-Source: ACHHUZ4ODcuhn21yHg4IsYms5EUFs3C/rnI1Je8CTMHNd7gUThqeY5XlEDVtPWKuhvC9JChz5EcDYQ== X-Received: by 2002:a2e:9542:0:b0:2b1:a89a:5f2b with SMTP id t2-20020a2e9542000000b002b1a89a5f2bmr19184807ljh.2.1687821648287; Mon, 26 Jun 2023 16:20:48 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 06/16] target/riscv: Restrict riscv_cpu_do_interrupt() to sysemu Date: Tue, 27 Jun 2023 01:19:57 +0200 Message-Id: <20230626232007.8933-7-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::231; envelope-from=philmd@linaro.org; helo=mail-lj1-x231.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821788490100001 riscv_cpu_do_interrupt() is not reachable on user emulation. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.h | 5 +++-- target/riscv/cpu_helper.c | 7 ++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 83a9a965d1..288df4c2b1 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -411,7 +411,6 @@ extern const char * const riscv_int_regnamesh[]; extern const char * const riscv_fpr_regnames[]; =20 const char *riscv_cpu_get_trap_name(target_ulong cause, bool async); -void riscv_cpu_do_interrupt(CPUState *cpu); int riscv_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs, int cpuid, DumpState *s); int riscv_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs, @@ -444,6 +443,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, E= rror **errp); #define cpu_mmu_index riscv_cpu_mmu_index =20 #ifndef CONFIG_USER_ONLY +void riscv_cpu_do_interrupt(CPUState *cpu); void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr, unsigned size, MMUAccessType access_type, @@ -467,7 +467,8 @@ void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, = uint32_t priv, void *rmw_fn_arg); =20 RISCVException smstateen_acc_ok(CPURISCVState *env, int index, uint64_t bi= t); -#endif +#endif /* !CONFIG_USER_ONLY */ + void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv); =20 void riscv_translate_init(void); diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 5ff48be561..cc0050d110 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1575,7 +1575,6 @@ static target_ulong riscv_transformed_insn(CPURISCVSt= ate *env, =20 return xinsn; } -#endif /* !CONFIG_USER_ONLY */ =20 /* * Handle Traps @@ -1585,8 +1584,6 @@ static target_ulong riscv_transformed_insn(CPURISCVSt= ate *env, */ void riscv_cpu_do_interrupt(CPUState *cs) { -#if !defined(CONFIG_USER_ONLY) - RISCVCPU *cpu =3D RISCV_CPU(cs); CPURISCVState *env =3D &cpu->env; bool write_gva =3D false; @@ -1779,6 +1776,6 @@ void riscv_cpu_do_interrupt(CPUState *cs) =20 env->two_stage_lookup =3D false; env->two_stage_indirect_lookup =3D false; -#endif - cs->exception_index =3D RISCV_EXCP_NONE; /* mark handled to qemu */ } + +#endif /* !CONFIG_USER_ONLY */ --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821701; cv=none; d=zohomail.com; s=zohoarc; b=UEGlSkV2Kfi6i3SHIV4W/3uixl2TbcM+lJv6kjRU10wfxzN8BOIS2V/bY8JrRx+O0WviL8rPqiVa0Hkf+o59Ry1ODjqhX9pYMLVSLJzaGTtZ34hlPBMUAm2KnNTWik+ORk+e+qDgQWZ58qcfwIAVjItzyl7WIgBoGSzZGgVcn+c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821701; 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=a2jBqwLYTVPATDHfEQY0x1Pdqr8EcmmmZ1uz1yNnpOk=; b=iFbCqP/cyXneNlO4q3wD2vJdzbQDJG2o/fPylOkox6/uG3RMd1XYKk/nNhgd3iMPmordGo6WQpohDSG+lLAbdPhy2hz6cZNEXVlMYyhgofy3PLvSGEMCmOApYKZMRaWhSPbh9nono72izdSsAJwqlnyb6dadiBZMdx8bLIT4wVQ= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821701541877.0429899112121; Mon, 26 Jun 2023 16:21:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvW5-0004q2-1k; Mon, 26 Jun 2023 19:21:05 -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 ) id 1qDvVy-0004oC-P8 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:01 -0400 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvVw-0000D1-RT for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:20:58 -0400 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-991b7a4d2e8so196955366b.1 for ; Mon, 26 Jun 2023 16:20:55 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id c15-20020a170906528f00b00982a352f078sm3767560ejm.124.2023.06.26.16.20.52 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:20:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821655; x=1690413655; 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=a2jBqwLYTVPATDHfEQY0x1Pdqr8EcmmmZ1uz1yNnpOk=; b=aLotfzdICzBQ387oz8NSmz1yvjh4Ae+hmXmJSAf3Eim4D3ZJYxRez/M+9MQNDI8QYF aaW06adt5me5FQbtIcbTHKXZc2oSgVl79gWYTmZHAVJwP0e4y5sNTvZsZOTCh9lfownS evSYsZez/egr+6esN4TrAqBajg8VgTIeMHC9XrQjZCM5lnpqCRP0/agx90wzwa6c6t+d yVQsNw86ctS3TtFKbc9SV3I3bgvY/tEKJ++vcFfPz7HPCbw4nFVSfX5+4wN3w9HW8G70 4lZzyyfpFPm5lqw0P/i5RasVk5/8NIwn0BppOStH8nJZHM7PtWH/lejOn6/AVplbk310 XOiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821655; x=1690413655; 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=a2jBqwLYTVPATDHfEQY0x1Pdqr8EcmmmZ1uz1yNnpOk=; b=TYsfRSFq7YQ/XvU0HfMKftQYzCuJr/m1Njkac2qc26iYDlb/KALb7s+T9tGdQcPWmX zHPT+Q4uJyA9fHh/yVIxDhvhfLoV8RIkc7xJZMGWL0vjQRKSzpVRb5+OwZn75maFkHa1 B7rgMHqV6z+JE459GCBSnPF9zw9MHopPkGOqG4FF/SRGuRuS8p0pUFNU/g/ZL5wmdO9J /lYq0OUHekwPP+BX9XCiokPCcp7N770bn9oLx56uTMjSOx7SyfBORsYHzLjCQwKY5KmO hY82kRDrADti7QUNBKO+ZYrEnrYWsTeGuEaO2RgC8j64yioOrbRqVAnLZOl+S9fiL8BY yMkA== X-Gm-Message-State: AC+VfDwsJESTdHiMyL+0G6pap6xvEcAzj2UVMCcbTt+g+D5SzQZ/eaDI LotqAZjZyCuKaoTi7YEzL6RVTO8P1h4bS2ELWMg= X-Google-Smtp-Source: ACHHUZ4hgMZOq9IDjVB3MX/FhKOJMxs29F1HqXBJT899aJ/cc1QiOgXJVAEkg0BrbBEax58qLn/8WQ== X-Received: by 2002:a17:907:a01:b0:987:fe18:1c56 with SMTP id bb1-20020a1709070a0100b00987fe181c56mr22405581ejc.47.1687821654702; Mon, 26 Jun 2023 16:20:54 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 07/16] target/riscv: Move TCG-specific files to target/riscv/tcg/ Date: Tue, 27 Jun 2023 01:19:58 +0200 Message-Id: <20230626232007.8933-8-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62b; envelope-from=philmd@linaro.org; helo=mail-ej1-x62b.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821702034100001 Move TCG-specific files to the a new 'tcg' sub-directory. Add stubs for riscv_cpu_[get/set]_fflags and riscv_raise_exception(). Adapt meson rules. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/{ =3D> tcg}/XVentanaCondOps.decode | 0 target/riscv/{ =3D> tcg}/insn16.decode | 0 target/riscv/{ =3D> tcg}/insn32.decode | 0 target/riscv/{ =3D> tcg}/xthead.decode | 0 target/riscv/{ =3D> tcg}/bitmanip_helper.c | 0 target/riscv/{ =3D> tcg}/crypto_helper.c | 0 target/riscv/{ =3D> tcg}/fpu_helper.c | 0 target/riscv/{ =3D> tcg}/m128_helper.c | 0 target/riscv/{ =3D> tcg}/op_helper.c | 0 target/riscv/tcg/tcg-stub.c | 25 +++++++++++++++++++ target/riscv/{ =3D> tcg}/translate.c | 0 target/riscv/{ =3D> tcg}/vector_helper.c | 0 target/riscv/{ =3D> tcg}/zce_helper.c | 0 target/riscv/meson.build | 18 +------------ target/riscv/tcg/meson.build | 19 ++++++++++++++ 15 files changed, 45 insertions(+), 17 deletions(-) rename target/riscv/{ =3D> tcg}/XVentanaCondOps.decode (100%) rename target/riscv/{ =3D> tcg}/insn16.decode (100%) rename target/riscv/{ =3D> tcg}/insn32.decode (100%) rename target/riscv/{ =3D> tcg}/xthead.decode (100%) rename target/riscv/{ =3D> tcg}/bitmanip_helper.c (100%) rename target/riscv/{ =3D> tcg}/crypto_helper.c (100%) rename target/riscv/{ =3D> tcg}/fpu_helper.c (100%) rename target/riscv/{ =3D> tcg}/m128_helper.c (100%) rename target/riscv/{ =3D> tcg}/op_helper.c (100%) create mode 100644 target/riscv/tcg/tcg-stub.c rename target/riscv/{ =3D> tcg}/translate.c (100%) rename target/riscv/{ =3D> tcg}/vector_helper.c (100%) rename target/riscv/{ =3D> tcg}/zce_helper.c (100%) create mode 100644 target/riscv/tcg/meson.build diff --git a/target/riscv/XVentanaCondOps.decode b/target/riscv/tcg/XVentan= aCondOps.decode similarity index 100% rename from target/riscv/XVentanaCondOps.decode rename to target/riscv/tcg/XVentanaCondOps.decode diff --git a/target/riscv/insn16.decode b/target/riscv/tcg/insn16.decode similarity index 100% rename from target/riscv/insn16.decode rename to target/riscv/tcg/insn16.decode diff --git a/target/riscv/insn32.decode b/target/riscv/tcg/insn32.decode similarity index 100% rename from target/riscv/insn32.decode rename to target/riscv/tcg/insn32.decode diff --git a/target/riscv/xthead.decode b/target/riscv/tcg/xthead.decode similarity index 100% rename from target/riscv/xthead.decode rename to target/riscv/tcg/xthead.decode diff --git a/target/riscv/bitmanip_helper.c b/target/riscv/tcg/bitmanip_hel= per.c similarity index 100% rename from target/riscv/bitmanip_helper.c rename to target/riscv/tcg/bitmanip_helper.c diff --git a/target/riscv/crypto_helper.c b/target/riscv/tcg/crypto_helper.c similarity index 100% rename from target/riscv/crypto_helper.c rename to target/riscv/tcg/crypto_helper.c diff --git a/target/riscv/fpu_helper.c b/target/riscv/tcg/fpu_helper.c similarity index 100% rename from target/riscv/fpu_helper.c rename to target/riscv/tcg/fpu_helper.c diff --git a/target/riscv/m128_helper.c b/target/riscv/tcg/m128_helper.c similarity index 100% rename from target/riscv/m128_helper.c rename to target/riscv/tcg/m128_helper.c diff --git a/target/riscv/op_helper.c b/target/riscv/tcg/op_helper.c similarity index 100% rename from target/riscv/op_helper.c rename to target/riscv/tcg/op_helper.c diff --git a/target/riscv/tcg/tcg-stub.c b/target/riscv/tcg/tcg-stub.c new file mode 100644 index 0000000000..dfe42ae2ac --- /dev/null +++ b/target/riscv/tcg/tcg-stub.c @@ -0,0 +1,25 @@ +/* + * QEMU RISC-V TCG stubs + * + * Copyright (c) 2023 Linaro + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" +#include "cpu.h" + +target_ulong riscv_cpu_get_fflags(CPURISCVState *env) +{ + g_assert_not_reached(); +} + +void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong) +{ + g_assert_not_reached(); +} + +G_NORETURN void riscv_raise_exception(CPURISCVState *env, + uint32_t exception, uintptr_t pc) +{ + g_assert_not_reached(); +} diff --git a/target/riscv/translate.c b/target/riscv/tcg/translate.c similarity index 100% rename from target/riscv/translate.c rename to target/riscv/tcg/translate.c diff --git a/target/riscv/vector_helper.c b/target/riscv/tcg/vector_helper.c similarity index 100% rename from target/riscv/vector_helper.c rename to target/riscv/tcg/vector_helper.c diff --git a/target/riscv/zce_helper.c b/target/riscv/tcg/zce_helper.c similarity index 100% rename from target/riscv/zce_helper.c rename to target/riscv/tcg/zce_helper.c diff --git a/target/riscv/meson.build b/target/riscv/meson.build index 8967dfaded..8ef47f43f9 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -1,34 +1,18 @@ -# FIXME extra_args should accept files() -gen =3D [ - decodetree.process('insn16.decode', extra_args: ['--static-decode=3Ddeco= de_insn16', '--insnwidth=3D16']), - decodetree.process('insn32.decode', extra_args: '--static-decode=3Ddecod= e_insn32'), - decodetree.process('xthead.decode', extra_args: '--static-decode=3Ddecod= e_xthead'), - decodetree.process('XVentanaCondOps.decode', extra_args: '--static-decod= e=3Ddecode_XVentanaCodeOps'), -] - riscv_ss =3D ss.source_set() riscv_system_ss =3D ss.source_set() =20 -riscv_ss.add(gen) riscv_ss.add(files( 'cpu.c', 'cpu_helper.c', 'csr.c', - 'fpu_helper.c', 'gdbstub.c', - 'op_helper.c', - 'vector_helper.c', - 'bitmanip_helper.c', - 'translate.c', - 'm128_helper.c', - 'crypto_helper.c', - 'zce_helper.c' )) =20 riscv_system_ss.add(files( 'debug.c', )) =20 +subdir('tcg') subdir('sysemu') =20 target_arch +=3D {'riscv': riscv_ss} diff --git a/target/riscv/tcg/meson.build b/target/riscv/tcg/meson.build new file mode 100644 index 0000000000..65670493b1 --- /dev/null +++ b/target/riscv/tcg/meson.build @@ -0,0 +1,19 @@ +# FIXME extra_args should accept files() +gen =3D [ + decodetree.process('insn16.decode', extra_args: ['--static-decode=3Ddeco= de_insn16', '--insnwidth=3D16']), + decodetree.process('insn32.decode', extra_args: '--static-decode=3Ddecod= e_insn32'), + decodetree.process('xthead.decode', extra_args: '--static-decode=3Ddecod= e_xthead'), + decodetree.process('XVentanaCondOps.decode', extra_args: '--static-decod= e=3Ddecode_XVentanaCodeOps'), +] +riscv_ss.add(when: 'CONFIG_TCG', if_true: gen) + +riscv_ss.add(when: 'CONFIG_TCG', if_true: files( + 'fpu_helper.c', + 'op_helper.c', + 'vector_helper.c', + 'bitmanip_helper.c', + 'translate.c', + 'm128_helper.c', + 'crypto_helper.c', + 'zce_helper.c', +), if_false: files('tcg-stub.c')) --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821734; cv=none; d=zohomail.com; s=zohoarc; b=OylN2l0HEpFstmJdYIec28ZeVQCrTyA8wqXj8ouydTFiz+dBx+N/ULl2flDjVkH2OXbCnu9SNHORIDotMA4Tz/7crZ9b2M0B9ekftrvgCyFv7rcKIYscb836yWAAYxOpSfofs5cnTslgj577fX13KEcaLbemDS4oTlpnTEtJYD0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821734; 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=ej5Xh4tK5Znew3wbqsmSt33zNquywgTDjMkZ8SQXxw8=; b=aeLa95Yfo1pvogj+86Qxza7+H0JXUsAiqQ7TCP/nMzvVqqj5lKg6qh9IUzfvCoiMn60lILQMdGUh9sV5q6EsvxhgXB+kiQzOkX2/ShgZuzfkvM46e8wQ0aK89u5Ny49lq780+58il+6IfMdWZZYWGRFYtE4uJB1gc2EcTzy9UmY= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821734163435.2922962366282; Mon, 26 Jun 2023 16:22:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWB-0004uJ-KW; Mon, 26 Jun 2023 19:21:11 -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 ) id 1qDvW4-0004qH-Fk for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:05 -0400 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvW2-0000Di-Ek for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:04 -0400 Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-991c786369cso188694366b.1 for ; Mon, 26 Jun 2023 16:21:02 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id a18-20020a1709063a5200b00988f168811bsm3792372ejf.135.2023.06.26.16.20.59 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821661; x=1690413661; 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=ej5Xh4tK5Znew3wbqsmSt33zNquywgTDjMkZ8SQXxw8=; b=dTeDBtdqurZXkIBVdly07E7Qx5yBNOOOQX7+eP0pijvcaZ9A/J0ZiiA8XhdYr4zaf+ H6QBuSsT88Sy1EFZkiPP8ci2lMy5s1vZ3/zUKxzbufcXPtrYRF/5KcIhU9xUBJM1PcOE 31n24MXl/yfjrTT4iFsXB8WIP6spnlkuFxAbyZVTVVEEPuJbUXfHq9aPzKSMHBmrerlU zWP3Q5v418TPPyMIZr/BxN08X0DzN3dU7CM03ic7hLTHACdaevUXZyJXqp8N5Jzb6yyb uxF+MAna7Ye78uFkeLVZFq5ZxgplOABkOTDIIE1K9o2FqgE0I+5P/hFqaOPywfY7L3qb q8sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821661; x=1690413661; 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=ej5Xh4tK5Znew3wbqsmSt33zNquywgTDjMkZ8SQXxw8=; b=bgTIVwKmyn7gDQAWrfn6nG77IIqQKyJeFBbKjEBmTzLp0mH1YpdYaqqlp3xEtn+0TG 5haJKXfwxtMmgJeD37Dradd5WHQyt3ep1Ptr7G2O7vY5ENDgBnO+5tAQZFbMerJlT1dw Iz0LonUEMlcfU6LxGdKltlnyL2yxdZC2I7z1VQOBthZE/SLXWUOTbtteksB2YnK8tp1E JUBWJkMabTIEWAIfteeDYmlxHQIe6Wqvq08PYUd3spnJPSCaFVJftvo7VMVIQQFLZEjm e/HhLBebyWZRh7Pa1XvLiXXgooDsF6VQNv4nds86CGUbSGXP4UNmcAtYYVN/9rW6jcCZ lwSw== X-Gm-Message-State: AC+VfDwc7KifcHU6LqXm/0KO3LPmqHhXadUrifZjjga8QkmTCr1ivBIE zAYC8tCceXFP1iBuJ0mlYknsBusU3wHun2wtUWI= X-Google-Smtp-Source: ACHHUZ4P8rgAruWOEKj6qsYlIcmUwTNzwrVb+wwFBZkYDotDMpTwgypGL73c8Q/BblgU4cFHNVkb1A== X-Received: by 2002:a17:907:84d:b0:978:6be4:7efa with SMTP id ww13-20020a170907084d00b009786be47efamr25181345ejb.18.1687821660932; Mon, 26 Jun 2023 16:21:00 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 08/16] target/riscv: Move TCG-specific cpu_get_tb_cpu_state() to tcg/cpu.c Date: Tue, 27 Jun 2023 01:19:59 +0200 Message-Id: <20230626232007.8933-9-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62e; envelope-from=philmd@linaro.org; helo=mail-ej1-x62e.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821736156100003 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu_helper.c | 83 ------------------------------ target/riscv/tcg/cpu.c | 97 ++++++++++++++++++++++++++++++++++++ target/riscv/tcg/meson.build | 1 + 3 files changed, 98 insertions(+), 83 deletions(-) create mode 100644 target/riscv/tcg/cpu.c diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index cc0050d110..a1501fea76 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -63,89 +63,6 @@ int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch) #endif } =20 -void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc, - target_ulong *cs_base, uint32_t *pflags) -{ - CPUState *cs =3D env_cpu(env); - RISCVCPU *cpu =3D RISCV_CPU(cs); - RISCVExtStatus fs, vs; - uint32_t flags =3D 0; - - *pc =3D env->xl =3D=3D MXL_RV32 ? env->pc & UINT32_MAX : env->pc; - *cs_base =3D 0; - - if (cpu->cfg.ext_zve32f) { - /* - * If env->vl equals to VLMAX, we can use generic vector operation - * expanders (GVEC) to accerlate the vector operations. - * However, as LMUL could be a fractional number. The maximum - * vector size can be operated might be less than 8 bytes, - * which is not supported by GVEC. So we set vl_eq_vlmax flag to t= rue - * only when maxsz >=3D 8 bytes. - */ - uint32_t vlmax =3D vext_get_vlmax(cpu, env->vtype); - uint32_t sew =3D FIELD_EX64(env->vtype, VTYPE, VSEW); - uint32_t maxsz =3D vlmax << sew; - bool vl_eq_vlmax =3D (env->vstart =3D=3D 0) && (vlmax =3D=3D env->= vl) && - (maxsz >=3D 8); - flags =3D FIELD_DP32(flags, TB_FLAGS, VILL, env->vill); - flags =3D FIELD_DP32(flags, TB_FLAGS, SEW, sew); - flags =3D FIELD_DP32(flags, TB_FLAGS, LMUL, - FIELD_EX64(env->vtype, VTYPE, VLMUL)); - flags =3D FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax); - flags =3D FIELD_DP32(flags, TB_FLAGS, VTA, - FIELD_EX64(env->vtype, VTYPE, VTA)); - flags =3D FIELD_DP32(flags, TB_FLAGS, VMA, - FIELD_EX64(env->vtype, VTYPE, VMA)); - flags =3D FIELD_DP32(flags, TB_FLAGS, VSTART_EQ_ZERO, env->vstart = =3D=3D 0); - } else { - flags =3D FIELD_DP32(flags, TB_FLAGS, VILL, 1); - } - -#ifdef CONFIG_USER_ONLY - fs =3D EXT_STATUS_DIRTY; - vs =3D EXT_STATUS_DIRTY; -#else - flags =3D FIELD_DP32(flags, TB_FLAGS, PRIV, env->priv); - - flags |=3D cpu_mmu_index(env, 0); - fs =3D get_field(env->mstatus, MSTATUS_FS); - vs =3D get_field(env->mstatus, MSTATUS_VS); - - if (env->virt_enabled) { - flags =3D FIELD_DP32(flags, TB_FLAGS, VIRT_ENABLED, 1); - /* - * Merge DISABLED and !DIRTY states using MIN. - * We will set both fields when dirtying. - */ - fs =3D MIN(fs, get_field(env->mstatus_hs, MSTATUS_FS)); - vs =3D MIN(vs, get_field(env->mstatus_hs, MSTATUS_VS)); - } - - /* With Zfinx, floating point is enabled/disabled by Smstateen. */ - if (!riscv_has_ext(env, RVF)) { - fs =3D (smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR) =3D=3D RISCV_EXC= P_NONE) - ? EXT_STATUS_DIRTY : EXT_STATUS_DISABLED; - } - - if (cpu->cfg.debug && !icount_enabled()) { - flags =3D FIELD_DP32(flags, TB_FLAGS, ITRIGGER, env->itrigger_enab= led); - } -#endif - - flags =3D FIELD_DP32(flags, TB_FLAGS, FS, fs); - flags =3D FIELD_DP32(flags, TB_FLAGS, VS, vs); - flags =3D FIELD_DP32(flags, TB_FLAGS, XL, env->xl); - if (env->cur_pmmask !=3D 0) { - flags =3D FIELD_DP32(flags, TB_FLAGS, PM_MASK_ENABLED, 1); - } - if (env->cur_pmbase !=3D 0) { - flags =3D FIELD_DP32(flags, TB_FLAGS, PM_BASE_ENABLED, 1); - } - - *pflags =3D flags; -} - void riscv_cpu_update_mask(CPURISCVState *env) { target_ulong mask =3D 0, base =3D 0; diff --git a/target/riscv/tcg/cpu.c b/target/riscv/tcg/cpu.c new file mode 100644 index 0000000000..b5d32729f2 --- /dev/null +++ b/target/riscv/tcg/cpu.c @@ -0,0 +1,97 @@ +/* + * RISC-V CPU helpers (TCG specific) + * + * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu + * Copyright (c) 2017-2018 SiFive, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#ifndef CONFIG_USER_ONLY +#include "sysemu/cpu-timers.h" +#endif + +void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc, + target_ulong *cs_base, uint32_t *pflags) +{ + CPUState *cs =3D env_cpu(env); + RISCVCPU *cpu =3D RISCV_CPU(cs); + RISCVExtStatus fs, vs; + uint32_t flags =3D 0; + + *pc =3D env->xl =3D=3D MXL_RV32 ? env->pc & UINT32_MAX : env->pc; + *cs_base =3D 0; + + if (cpu->cfg.ext_zve32f) { + /* + * If env->vl equals to VLMAX, we can use generic vector operation + * expanders (GVEC) to accerlate the vector operations. + * However, as LMUL could be a fractional number. The maximum + * vector size can be operated might be less than 8 bytes, + * which is not supported by GVEC. So we set vl_eq_vlmax flag to t= rue + * only when maxsz >=3D 8 bytes. + */ + uint32_t vlmax =3D vext_get_vlmax(cpu, env->vtype); + uint32_t sew =3D FIELD_EX64(env->vtype, VTYPE, VSEW); + uint32_t maxsz =3D vlmax << sew; + bool vl_eq_vlmax =3D (env->vstart =3D=3D 0) && (vlmax =3D=3D env->= vl) && + (maxsz >=3D 8); + flags =3D FIELD_DP32(flags, TB_FLAGS, VILL, env->vill); + flags =3D FIELD_DP32(flags, TB_FLAGS, SEW, sew); + flags =3D FIELD_DP32(flags, TB_FLAGS, LMUL, + FIELD_EX64(env->vtype, VTYPE, VLMUL)); + flags =3D FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax); + flags =3D FIELD_DP32(flags, TB_FLAGS, VTA, + FIELD_EX64(env->vtype, VTYPE, VTA)); + flags =3D FIELD_DP32(flags, TB_FLAGS, VMA, + FIELD_EX64(env->vtype, VTYPE, VMA)); + flags =3D FIELD_DP32(flags, TB_FLAGS, VSTART_EQ_ZERO, env->vstart = =3D=3D 0); + } else { + flags =3D FIELD_DP32(flags, TB_FLAGS, VILL, 1); + } + +#ifdef CONFIG_USER_ONLY + fs =3D EXT_STATUS_DIRTY; + vs =3D EXT_STATUS_DIRTY; +#else + flags =3D FIELD_DP32(flags, TB_FLAGS, PRIV, env->priv); + + flags |=3D cpu_mmu_index(env, 0); + fs =3D get_field(env->mstatus, MSTATUS_FS); + vs =3D get_field(env->mstatus, MSTATUS_VS); + + if (env->virt_enabled) { + flags =3D FIELD_DP32(flags, TB_FLAGS, VIRT_ENABLED, 1); + /* + * Merge DISABLED and !DIRTY states using MIN. + * We will set both fields when dirtying. + */ + fs =3D MIN(fs, get_field(env->mstatus_hs, MSTATUS_FS)); + vs =3D MIN(vs, get_field(env->mstatus_hs, MSTATUS_VS)); + } + + /* With Zfinx, floating point is enabled/disabled by Smstateen. */ + if (!riscv_has_ext(env, RVF)) { + fs =3D (smstateen_acc_ok(env, 0, SMSTATEEN0_FCSR) =3D=3D RISCV_EXC= P_NONE) + ? EXT_STATUS_DIRTY : EXT_STATUS_DISABLED; + } + + if (cpu->cfg.debug && !icount_enabled()) { + flags =3D FIELD_DP32(flags, TB_FLAGS, ITRIGGER, env->itrigger_enab= led); + } +#endif + + flags =3D FIELD_DP32(flags, TB_FLAGS, FS, fs); + flags =3D FIELD_DP32(flags, TB_FLAGS, VS, vs); + flags =3D FIELD_DP32(flags, TB_FLAGS, XL, env->xl); + if (env->cur_pmmask !=3D 0) { + flags =3D FIELD_DP32(flags, TB_FLAGS, PM_MASK_ENABLED, 1); + } + if (env->cur_pmbase !=3D 0) { + flags =3D FIELD_DP32(flags, TB_FLAGS, PM_BASE_ENABLED, 1); + } + + *pflags =3D flags; +} diff --git a/target/riscv/tcg/meson.build b/target/riscv/tcg/meson.build index 65670493b1..a615aafd9a 100644 --- a/target/riscv/tcg/meson.build +++ b/target/riscv/tcg/meson.build @@ -8,6 +8,7 @@ gen =3D [ riscv_ss.add(when: 'CONFIG_TCG', if_true: gen) =20 riscv_ss.add(when: 'CONFIG_TCG', if_true: files( + 'cpu.c', 'fpu_helper.c', 'op_helper.c', 'vector_helper.c', --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821760; cv=none; d=zohomail.com; s=zohoarc; b=JbK1ocSEOb+6bhUomA4FquIw/WgR9ITpYrzOXfwdkna7W6+WO1bbdHxbJN9nmqg4inTFl3/wuCpDGMvNlSNB5cFr9UKPlurNa7NCBKsdMwV4K6wC4yTSllAA+UgaWz58d/hyuj+y9rlwtx9P5GWvfQnusGktOLIzn5plMXvej/c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821760; 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=Y5G3GZnisObOugerwvl7UVGEu2t0avWriP2R6IveebM=; b=CraN3HV3fbBzNUoLkjQQY39nuZgoamrCHX76LMG4qk5/cpqoOY0AXAW5AnLb+Y14dmSyGWq2Z+cdQyzXNyL2YqLWHZzM0nqtoRJOEf1nN5LdkGIXYdofq56sIKC+BvhAxmRdS0QKMy75OT3mGm5U4Dhevl1WBrIczgLR8FVDffk= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821760971687.5242982029635; Mon, 26 Jun 2023 16:22:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWF-0004ym-4l; Mon, 26 Jun 2023 19:21:15 -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 ) id 1qDvWC-0004wR-OX for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:12 -0400 Received: from mail-ed1-x530.google.com ([2a00:1450:4864:20::530]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWA-0000EV-Rq for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:12 -0400 Received: by mail-ed1-x530.google.com with SMTP id 4fb4d7f45d1cf-51d894b9b6cso2313298a12.3 for ; Mon, 26 Jun 2023 16:21:09 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id k19-20020a1709061c1300b00988b32160dfsm3739150ejg.222.2023.06.26.16.21.05 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821667; x=1690413667; 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=Y5G3GZnisObOugerwvl7UVGEu2t0avWriP2R6IveebM=; b=WoLMAr+CiJgH4B1qgk83JpNhJB6Anw1PEQbSOH75xrkn4K9fOj93grM/N+PxivWbrU xO/K6z230taLvqq3Mh7TpjyC5FyePvSLv5GsoEFSNwyjZIV2Qacc/l17KP/qkWq6C1re +HJpvwUSkpoQDan70CBkQxNhOAqE/eJLeSev4hMughTYeMUfPV1vCB93eD2K5FyFLtzp pUjDu1CIf9TrQSPxigQFI1zfth9fw17R10Hfrs512BzTu9zA9DuqNf6CHOe5MIov7JGZ 82boGt6vwPSObe6ow5UKccJOB820mbia4TFQisPAClK8T5dn4QYWv3IBjW+cE3ghAoKF q6hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821667; x=1690413667; 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=Y5G3GZnisObOugerwvl7UVGEu2t0avWriP2R6IveebM=; b=VcaEpgynrP4M3uWrAR9j71Kg2uYK8HpIks0QVFPIjNi6jvJ1FLsS7oGXu2iBAHC1Yh XGN8A/TsDr+p+drcm/jGcPXeB/qUeO+CAlZDetCqjZUMPAbEowCjJGr1t/hTAXN/+HSk FSa/j/a+K1DjaQRLdOEEHyDSLh8HMMDy5LNjhJryjk2Wns+Jjr1U1Dr0ychFTfdgsjIB 7n18Hh57i+hmOALW+I03teNnqOrY7fk6YcilBeFcGdZRkLQDbMjkA7tPhUaShs2IQ5/M iLirfVvkJYUsP+a79wR9Z0AEj6fjjUroVRPx4f171TOv9XHFOr046Z92ppEQQmAaY5T5 EJBQ== X-Gm-Message-State: AC+VfDyrp7LmrLFRz38YTuSmhinDTXPLB8ILEHXPDaMwyoso/tqk5AwX VfT3EDI8sLE1EfMzECYmQUWk7lIT40B9yptHbM8= X-Google-Smtp-Source: ACHHUZ58GdSTaP+DLnF9cLEnkuzjvcgNgocGoqCWJKkZH3weS5u2v8um5FaknaOsz9DJsOwGg9i5qg== X-Received: by 2002:a17:907:8a05:b0:992:13c7:563 with SMTP id sc5-20020a1709078a0500b0099213c70563mr116433ejc.75.1687821667596; Mon, 26 Jun 2023 16:21:07 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 09/16] target/riscv: Expose some 'trigger' prototypes from debug.c Date: Tue, 27 Jun 2023 01:20:00 +0200 Message-Id: <20230626232007.8933-10-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::530; envelope-from=philmd@linaro.org; helo=mail-ed1-x530.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821762220100003 We want to extract TCG-specific code from debug.c, but some functions call get_trigger_type() / do_trigger_action(). Expose these prototypes in "debug.h". Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/debug.h | 4 ++++ target/riscv/debug.c | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/target/riscv/debug.h b/target/riscv/debug.h index c471748d5a..65cd45b8f3 100644 --- a/target/riscv/debug.h +++ b/target/riscv/debug.h @@ -147,4 +147,8 @@ void riscv_trigger_init(CPURISCVState *env); =20 bool riscv_itrigger_enabled(CPURISCVState *env); void riscv_itrigger_update_priv(CPURISCVState *env); + +target_ulong get_trigger_type(CPURISCVState *env, target_ulong trigger_ind= ex); +void do_trigger_action(CPURISCVState *env, target_ulong trigger_index); + #endif /* RISCV_DEBUG_H */ diff --git a/target/riscv/debug.c b/target/riscv/debug.c index 75ee1c4971..5676f2c57e 100644 --- a/target/riscv/debug.c +++ b/target/riscv/debug.c @@ -88,8 +88,7 @@ static inline target_ulong extract_trigger_type(CPURISCVS= tate *env, } } =20 -static inline target_ulong get_trigger_type(CPURISCVState *env, - target_ulong trigger_index) +target_ulong get_trigger_type(CPURISCVState *env, target_ulong trigger_ind= ex) { return extract_trigger_type(env, env->tdata1[trigger_index]); } @@ -217,7 +216,7 @@ static inline void warn_always_zero_bit(target_ulong va= l, target_ulong mask, } } =20 -static void do_trigger_action(CPURISCVState *env, target_ulong trigger_ind= ex) +void do_trigger_action(CPURISCVState *env, target_ulong trigger_index) { trigger_action_t action =3D get_trigger_action(env, trigger_index); =20 --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821712; cv=none; d=zohomail.com; s=zohoarc; b=BtgnlYJdLIeppdR3gDB2WqwxPisf7f4RsNUr6/ufj7AC5P1iwtrmSmUzUJEnmDRPvEkUkLJo4v5eeuFetTz5USkjRRZ0BSRs0dCgqAea6kwhpGFSFIGnDwTGP/C59qVvweS764HZHqV2pilAjOeCIOgH87yqifvjybWU1db9Kwg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821712; 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=x3TqE5kJsVR1lgzR4aebR2RY8xDEAlzqCmabyV4irzM=; b=XlihTHHqC2vTv3dDTezQ8bHw5+UfCLZeuEfXKojAfQPWbm4GeCGHjkzEpDZgjMTzn4F2odovGGA11G9yi8JPE2DMNqJjMBVg5qwLOKMpxeFfL1NF7ya4B+6ZLBCD0VSdEXXI0B6tuN0qF4Oi6lD52MKmmKJgKDScAH/rVBYKTQY= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821712590322.37439045697715; Mon, 26 Jun 2023 16:21:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWJ-0005Dw-Ib; Mon, 26 Jun 2023 19:21:19 -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 ) id 1qDvWH-00054Q-LU for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:17 -0400 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWF-0000FO-B3 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:17 -0400 Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-98bcc533490so465673366b.0 for ; Mon, 26 Jun 2023 16:21:14 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id bm4-20020a170906c04400b0094f07545d40sm3760870ejb.220.2023.06.26.16.21.11 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821674; x=1690413674; 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=x3TqE5kJsVR1lgzR4aebR2RY8xDEAlzqCmabyV4irzM=; b=b8Q+yfgoQZn9wiLu95G45KIb7LObQ7C+3s3zPBIfSWat6IHO6xTJFC7j9k5KygKOsJ JFEc1Gq/3pSeVat0GsAz0dZod8slMYPxvZmkmmLoJDidWsqYzZ8uI1DpgCujJpPg8PGh StTWUXSHy8uSGwgYx5v9bDeb9TIrWAUcHCIHSmJZtJv4hn+Sji3jNVL7GnQqHQVahPYQ 48Mac0yvRgyLZD4Sqt/kPYv69Vq4OA6YAKDYA7oKg5wOp4kJM9HMHlqoa6AjUnySxk44 CFf/khCHHSPrkJKx7eF2prVCAzStLIwwzrq6BEL0eEnMbWqC+FFyn0J/Ev28VxY1Ztcd vgzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821674; x=1690413674; 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=x3TqE5kJsVR1lgzR4aebR2RY8xDEAlzqCmabyV4irzM=; b=JB0loT4Qh6ET5M+pTF6NO1JSGIkPqX5CRoUZdqfqfNIDQPWe4+L/fSxtt/ysGQvVLW m0GXV15wc0+9UDggEtomrtWMia3Cjq0LNhlOGwVe4BSrKMaZxijCFHNoDK4JB5frLmno cYzdn28YlWs1VofKY+bqx0Nzo8OERH+kj0PgLrtOgZqhe9TxESDqhlctGW8wuszMr+b/ ryqmlAfJpszikR9jsaIcKU0WdmKqRiJYj0oZiwJSOxMHN96vlPa01FqxWsVVDfYstcHb 2RB4+hwKwK11Bgj4nTjmLV5Pq1dCJGIs3OTMdTDGmw2VysuaTu586rQXAlYxm+FNMxUS ra4A== X-Gm-Message-State: AC+VfDxz671oBsnphuezdBs3IgaHcSmndNaQJ7DWxtGiTu22+Shr9/hF VCCJ1HsTqf4+vl29pts0bVrqR9h/o0gFU2Ue2qY= X-Google-Smtp-Source: ACHHUZ4yKYVjNLOW8ZV1LA8nWDtRUy/Xu9hnPeArK3mZgZ0dOYB5KFqy2tgLz6IStA2s3xVSJxmThA== X-Received: by 2002:a17:907:c1b:b0:991:fd87:c6fd with SMTP id ga27-20020a1709070c1b00b00991fd87c6fdmr1097407ejc.23.1687821673722; Mon, 26 Jun 2023 16:21:13 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 10/16] target/riscv: Extract TCG-specific code from debug.c Date: Tue, 27 Jun 2023 01:20:01 +0200 Message-Id: <20230626232007.8933-11-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::631; envelope-from=philmd@linaro.org; helo=mail-ej1-x631.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821713627100003 Extract TCG-specific code from debug.c to tcg/sysemu/debug.c, restrict the prototypes to TCG, adapt meson rules. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/debug.h | 2 + target/riscv/debug.c | 148 ------------------------- target/riscv/tcg/sysemu/debug.c | 165 ++++++++++++++++++++++++++++ target/riscv/tcg/meson.build | 2 + target/riscv/tcg/sysemu/meson.build | 3 + 5 files changed, 172 insertions(+), 148 deletions(-) create mode 100644 target/riscv/tcg/sysemu/debug.c create mode 100644 target/riscv/tcg/sysemu/meson.build diff --git a/target/riscv/debug.h b/target/riscv/debug.h index 65cd45b8f3..0b3bdd5be1 100644 --- a/target/riscv/debug.h +++ b/target/riscv/debug.h @@ -139,9 +139,11 @@ void tdata_csr_write(CPURISCVState *env, int tdata_ind= ex, target_ulong val); =20 target_ulong tinfo_csr_read(CPURISCVState *env); =20 +#ifdef CONFIG_TCG void riscv_cpu_debug_excp_handler(CPUState *cs); bool riscv_cpu_debug_check_breakpoint(CPUState *cs); bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp); +#endif =20 void riscv_trigger_init(CPURISCVState *env); =20 diff --git a/target/riscv/debug.c b/target/riscv/debug.c index 5676f2c57e..45a2605d8a 100644 --- a/target/riscv/debug.c +++ b/target/riscv/debug.c @@ -754,154 +754,6 @@ target_ulong tinfo_csr_read(CPURISCVState *env) BIT(TRIGGER_TYPE_AD_MATCH6); } =20 -void riscv_cpu_debug_excp_handler(CPUState *cs) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - - if (cs->watchpoint_hit) { - if (cs->watchpoint_hit->flags & BP_CPU) { - do_trigger_action(env, DBG_ACTION_BP); - } - } else { - if (cpu_breakpoint_test(cs, env->pc, BP_CPU)) { - do_trigger_action(env, DBG_ACTION_BP); - } - } -} - -bool riscv_cpu_debug_check_breakpoint(CPUState *cs) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - CPUBreakpoint *bp; - target_ulong ctrl; - target_ulong pc; - int trigger_type; - int i; - - QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { - for (i =3D 0; i < RV_MAX_TRIGGERS; i++) { - trigger_type =3D get_trigger_type(env, i); - - switch (trigger_type) { - case TRIGGER_TYPE_AD_MATCH: - /* type 2 trigger cannot be fired in VU/VS mode */ - if (env->virt_enabled) { - return false; - } - - ctrl =3D env->tdata1[i]; - pc =3D env->tdata2[i]; - - if ((ctrl & TYPE2_EXEC) && (bp->pc =3D=3D pc)) { - /* check U/S/M bit against current privilege level */ - if ((ctrl >> 3) & BIT(env->priv)) { - return true; - } - } - break; - case TRIGGER_TYPE_AD_MATCH6: - ctrl =3D env->tdata1[i]; - pc =3D env->tdata2[i]; - - if ((ctrl & TYPE6_EXEC) && (bp->pc =3D=3D pc)) { - if (env->virt_enabled) { - /* check VU/VS bit against current privilege level= */ - if ((ctrl >> 23) & BIT(env->priv)) { - return true; - } - } else { - /* check U/S/M bit against current privilege level= */ - if ((ctrl >> 3) & BIT(env->priv)) { - return true; - } - } - } - break; - default: - /* other trigger types are not supported or irrelevant */ - break; - } - } - } - - return false; -} - -bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - target_ulong ctrl; - target_ulong addr; - int trigger_type; - int flags; - int i; - - for (i =3D 0; i < RV_MAX_TRIGGERS; i++) { - trigger_type =3D get_trigger_type(env, i); - - switch (trigger_type) { - case TRIGGER_TYPE_AD_MATCH: - /* type 2 trigger cannot be fired in VU/VS mode */ - if (env->virt_enabled) { - return false; - } - - ctrl =3D env->tdata1[i]; - addr =3D env->tdata2[i]; - flags =3D 0; - - if (ctrl & TYPE2_LOAD) { - flags |=3D BP_MEM_READ; - } - if (ctrl & TYPE2_STORE) { - flags |=3D BP_MEM_WRITE; - } - - if ((wp->flags & flags) && (wp->vaddr =3D=3D addr)) { - /* check U/S/M bit against current privilege level */ - if ((ctrl >> 3) & BIT(env->priv)) { - return true; - } - } - break; - case TRIGGER_TYPE_AD_MATCH6: - ctrl =3D env->tdata1[i]; - addr =3D env->tdata2[i]; - flags =3D 0; - - if (ctrl & TYPE6_LOAD) { - flags |=3D BP_MEM_READ; - } - if (ctrl & TYPE6_STORE) { - flags |=3D BP_MEM_WRITE; - } - - if ((wp->flags & flags) && (wp->vaddr =3D=3D addr)) { - if (env->virt_enabled) { - /* check VU/VS bit against current privilege level */ - if ((ctrl >> 23) & BIT(env->priv)) { - return true; - } - } else { - /* check U/S/M bit against current privilege level */ - if ((ctrl >> 3) & BIT(env->priv)) { - return true; - } - } - } - break; - default: - /* other trigger types are not supported */ - break; - } - } - - return false; -} - void riscv_trigger_init(CPURISCVState *env) { target_ulong tdata1 =3D build_tdata1(env, TRIGGER_TYPE_AD_MATCH, 0, 0); diff --git a/target/riscv/tcg/sysemu/debug.c b/target/riscv/tcg/sysemu/debu= g.c new file mode 100644 index 0000000000..cdd6744b3a --- /dev/null +++ b/target/riscv/tcg/sysemu/debug.c @@ -0,0 +1,165 @@ +/* + * QEMU RISC-V Native Debug Support (TCG specific) + * + * Copyright (c) 2022 Wind River Systems, Inc. + * + * Author: + * Bin Meng + * + * This provides the native debug support via the Trigger Module, as defin= ed + * in the RISC-V Debug Specification: + * https://github.com/riscv/riscv-debug-spec/raw/master/riscv-debug-stable= .pdf + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "cpu.h" + +void riscv_cpu_debug_excp_handler(CPUState *cs) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + + if (cs->watchpoint_hit) { + if (cs->watchpoint_hit->flags & BP_CPU) { + do_trigger_action(env, DBG_ACTION_BP); + } + } else { + if (cpu_breakpoint_test(cs, env->pc, BP_CPU)) { + do_trigger_action(env, DBG_ACTION_BP); + } + } +} + +bool riscv_cpu_debug_check_breakpoint(CPUState *cs) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + CPUBreakpoint *bp; + target_ulong ctrl; + target_ulong pc; + int trigger_type; + int i; + + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + for (i =3D 0; i < RV_MAX_TRIGGERS; i++) { + trigger_type =3D get_trigger_type(env, i); + + switch (trigger_type) { + case TRIGGER_TYPE_AD_MATCH: + /* type 2 trigger cannot be fired in VU/VS mode */ + if (env->virt_enabled) { + return false; + } + + ctrl =3D env->tdata1[i]; + pc =3D env->tdata2[i]; + + if ((ctrl & TYPE2_EXEC) && (bp->pc =3D=3D pc)) { + /* check U/S/M bit against current privilege level */ + if ((ctrl >> 3) & BIT(env->priv)) { + return true; + } + } + break; + case TRIGGER_TYPE_AD_MATCH6: + ctrl =3D env->tdata1[i]; + pc =3D env->tdata2[i]; + + if ((ctrl & TYPE6_EXEC) && (bp->pc =3D=3D pc)) { + if (env->virt_enabled) { + /* check VU/VS bit against current privilege level= */ + if ((ctrl >> 23) & BIT(env->priv)) { + return true; + } + } else { + /* check U/S/M bit against current privilege level= */ + if ((ctrl >> 3) & BIT(env->priv)) { + return true; + } + } + } + break; + default: + /* other trigger types are not supported or irrelevant */ + break; + } + } + } + + return false; +} + +bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + target_ulong ctrl; + target_ulong addr; + int trigger_type; + int flags; + int i; + + for (i =3D 0; i < RV_MAX_TRIGGERS; i++) { + trigger_type =3D get_trigger_type(env, i); + + switch (trigger_type) { + case TRIGGER_TYPE_AD_MATCH: + /* type 2 trigger cannot be fired in VU/VS mode */ + if (env->virt_enabled) { + return false; + } + + ctrl =3D env->tdata1[i]; + addr =3D env->tdata2[i]; + flags =3D 0; + + if (ctrl & TYPE2_LOAD) { + flags |=3D BP_MEM_READ; + } + if (ctrl & TYPE2_STORE) { + flags |=3D BP_MEM_WRITE; + } + + if ((wp->flags & flags) && (wp->vaddr =3D=3D addr)) { + /* check U/S/M bit against current privilege level */ + if ((ctrl >> 3) & BIT(env->priv)) { + return true; + } + } + break; + case TRIGGER_TYPE_AD_MATCH6: + ctrl =3D env->tdata1[i]; + addr =3D env->tdata2[i]; + flags =3D 0; + + if (ctrl & TYPE6_LOAD) { + flags |=3D BP_MEM_READ; + } + if (ctrl & TYPE6_STORE) { + flags |=3D BP_MEM_WRITE; + } + + if ((wp->flags & flags) && (wp->vaddr =3D=3D addr)) { + if (env->virt_enabled) { + /* check VU/VS bit against current privilege level */ + if ((ctrl >> 23) & BIT(env->priv)) { + return true; + } + } else { + /* check U/S/M bit against current privilege level */ + if ((ctrl >> 3) & BIT(env->priv)) { + return true; + } + } + } + break; + default: + /* other trigger types are not supported */ + break; + } + } + + return false; +} diff --git a/target/riscv/tcg/meson.build b/target/riscv/tcg/meson.build index a615aafd9a..933d340799 100644 --- a/target/riscv/tcg/meson.build +++ b/target/riscv/tcg/meson.build @@ -18,3 +18,5 @@ riscv_ss.add(when: 'CONFIG_TCG', if_true: files( 'crypto_helper.c', 'zce_helper.c', ), if_false: files('tcg-stub.c')) + +subdir('sysemu') diff --git a/target/riscv/tcg/sysemu/meson.build b/target/riscv/tcg/sysemu/= meson.build new file mode 100644 index 0000000000..e8e61e5784 --- /dev/null +++ b/target/riscv/tcg/sysemu/meson.build @@ -0,0 +1,3 @@ +riscv_system_ss.add(when: 'CONFIG_TCG', if_true: files( + 'debug.c', +)) --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821778; cv=none; d=zohomail.com; s=zohoarc; b=fUPpW/JMa5FwS8l0FBD8vU0o+gksrhVaWODmAc0ruxO5ouFdge8SXBlS70j+RvM4KxR5l53DayPNz+5Hh7srY0P0E+ElDNAGebqCuN1OuuYQyh4qaqz/RpxEKGANH5+RuL7FgX+vRmIJn+APfLyYsUaSrM2fcP+B3t3rhwRguUI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821778; 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=umqULTLx7y1vximp4pWvumHBDvz4vkd4kJDrOMbD9Wk=; b=gJ3v/mwwgAlbY44SbpGbUKl839r8WrLYyQAiQjPUgKDFOWwwz6VmI0b3LoJEDXPfnBMzEo0TdSVVxifG9at3udqBO5JR9t6sElDg52lPMZ46E66iGG0e2gnrY9Paoign86XdlX9sV4dKrK/swYhYucf9hULRQ/1PNSaD4e2hcH0= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821778904452.2279438989823; Mon, 26 Jun 2023 16:22:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWQ-0005dx-EH; Mon, 26 Jun 2023 19:21:26 -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 ) id 1qDvWO-0005Ze-65 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:24 -0400 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWL-0000HU-CT for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:23 -0400 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-991c786369cso188727366b.1 for ; Mon, 26 Jun 2023 16:21:20 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id o10-20020a17090637ca00b00992025654c2sm393546ejc.150.2023.06.26.16.21.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821680; x=1690413680; 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=umqULTLx7y1vximp4pWvumHBDvz4vkd4kJDrOMbD9Wk=; b=yEcu+IfU0alH0+8hkzstPE+C+cuVpwD7s3T/uXezMF7Rf6PR2T/hYdL2e0o1VfLnCF 3UJuafXWXccI0g6ZauwVfF5b0JrUtkUOZjqEtpwz+NHbm+OnIYZmv069IPgz6M8D5DGO kP3a4OD7189IBFZHFYtBvO004id4+7HTgaaNmJAloe/z42hi+P1WgY251zsmVgVqOwYT 2h+Kj3s+0ZWBJkjfO3vW4YxXaF/gYwSd4ccvwAq5uAXdsSrdfuggoZjbjw2HNXxrS0h5 LcypWegrCS6y3qLf9r9IcgG8fexqB2cqSgHk43RaqlLJej6A7lvbl13m1p+9lAVxqSaD lqyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821680; x=1690413680; 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=umqULTLx7y1vximp4pWvumHBDvz4vkd4kJDrOMbD9Wk=; b=HirgJH4I1AZ+5kwnw6BSvAcS68ZeV9JmBnZfEkdCaWLJdgx9LM6BTDYB80K5N+hhRM B1zRfYT89k9L8SIcLK+xEUwkW2RX+bMG1wqPTSP667J8gA316jjuMVfBV9dTzhi5qXNM bq60Z5A97AgFMy9BxDwZWOrmzj2iCjXMdG19dJ8M2DUZn64j4hwzY5URL0zb38IYzeMv UkqpniH7RiD504UNyfevLouhP/EIIBLaBRChosE+oFVeMhL/5us4ojpbquC/ZBgcls6U cDaxdxHT6VpWvAHvRUM+zCo/TAnK9zXTcVtnDDkSROX/U0W0uWQBCNui14uVuI7ZYZWL k7UA== X-Gm-Message-State: AC+VfDyMxzKvYdKh9noIdhLXwgO+lj1tb6BBzhXL65X53YzY0x+HSGyc m0VylFG5FysifqPOkjuUUsNhzduri/6Mtx93J24= X-Google-Smtp-Source: ACHHUZ6bwSx30VCAYO4LjunmM912mg5E/tapZ9zXCKAGD0Vyklv9x+o0cOVj6I5yzDH6sTodzk9JxQ== X-Received: by 2002:a17:907:160d:b0:989:4776:11a1 with SMTP id hb13-20020a170907160d00b00989477611a1mr16111532ejc.47.1687821679888; Mon, 26 Jun 2023 16:21:19 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 11/16] target/riscv: Move sysemu-specific debug files to target/riscv/sysemu/ Date: Tue, 27 Jun 2023 01:20:02 +0200 Message-Id: <20230626232007.8933-12-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62b; envelope-from=philmd@linaro.org; helo=mail-ej1-x62b.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821780275100003 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.h | 2 +- target/riscv/{ =3D> sysemu}/debug.h | 0 target/riscv/cpu_helper.c | 2 +- target/riscv/{ =3D> sysemu}/debug.c | 0 target/riscv/meson.build | 4 ---- target/riscv/sysemu/meson.build | 1 + 6 files changed, 3 insertions(+), 6 deletions(-) rename target/riscv/{ =3D> sysemu}/debug.h (100%) rename target/riscv/{ =3D> sysemu}/debug.c (100%) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 288df4c2b1..6908dc395c 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -89,7 +89,7 @@ typedef enum { =20 #if !defined(CONFIG_USER_ONLY) #include "sysemu/pmp.h" -#include "debug.h" +#include "sysemu/debug.h" #endif =20 #define RV_VLEN_MAX 1024 diff --git a/target/riscv/debug.h b/target/riscv/sysemu/debug.h similarity index 100% rename from target/riscv/debug.h rename to target/riscv/sysemu/debug.h diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index a1501fea76..88760248c0 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -32,7 +32,7 @@ #include "sysemu/cpu-timers.h" #endif #include "cpu_bits.h" -#include "debug.h" +#include "sysemu/debug.h" #include "tcg/oversized-guest.h" =20 int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch) diff --git a/target/riscv/debug.c b/target/riscv/sysemu/debug.c similarity index 100% rename from target/riscv/debug.c rename to target/riscv/sysemu/debug.c diff --git a/target/riscv/meson.build b/target/riscv/meson.build index 8ef47f43f9..49cdcde679 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -8,10 +8,6 @@ riscv_ss.add(files( 'gdbstub.c', )) =20 -riscv_system_ss.add(files( - 'debug.c', -)) - subdir('tcg') subdir('sysemu') =20 diff --git a/target/riscv/sysemu/meson.build b/target/riscv/sysemu/meson.bu= ild index 5f8e1edcf2..33fec8f11e 100644 --- a/target/riscv/sysemu/meson.build +++ b/target/riscv/sysemu/meson.build @@ -1,5 +1,6 @@ riscv_system_ss.add(files( 'arch_dump.c', + 'debug.c', 'machine.c', 'monitor.c', 'pmp.c', --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821788; cv=none; d=zohomail.com; s=zohoarc; b=cqbEaSGJVwikCGXfht7WDZTiYJGiAxoYd/K7zhxGVA7KmtZbVpeCqcP5YJ9+FU6/TUSYT+hlttb1grGcDqRatgsO+2KLhb1ahsu/ReumuD/J00P6kgwUp6ZCjjmeCe9hBOB+/alIvZaY204WzJfl3W/8aWWkEExs3tquOO5Yi8s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821788; 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=MXYhaIZBHUVBklzxiy2U6yni3nv37QkQ/GRKywmL6dk=; b=hhgZ7hgUjieARk8MhcbJ5XDZpBWomJgxZET0Hyb1Td0zynA5eHzqUFgSR3Y9ZfeQjIxICBh+BrbzTZs1bbAKgvqrJP0lYcFPyiPhLPknQ2XaYNW0SooaTu8/kvslOuSRzZ4uGXdFUn909oM11OZE8rE0Ezt61VoWKp03UhzGiZo= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 168782178816469.52431454327962; Mon, 26 Jun 2023 16:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWV-000652-H1; Mon, 26 Jun 2023 19:21:31 -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 ) id 1qDvWT-0005wd-6D for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:29 -0400 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWR-0000Ie-BP for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:28 -0400 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-991fe70f21bso63955266b.3 for ; Mon, 26 Jun 2023 16:21:26 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id ci8-20020a170906c34800b00982d0563b11sm3806526ejb.197.2023.06.26.16.21.24 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821686; x=1690413686; 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=MXYhaIZBHUVBklzxiy2U6yni3nv37QkQ/GRKywmL6dk=; b=gijdK+asWeJ/04igZsyMwWoIHZoS5DY99sJ8BnYk73mT+/gJJRP7ZhW1BbW6T2uPIw U0vtjNHt7W/ogdrifnNYiV561i+VsGs1BJY5XXrmJru/xzUaBdXu2exOGIEa3mk7rZy1 CUSbmccTka1nFZGAYXnbgVGt8maE81p7IwbKkanpbwDZcUDutd4VP1L+akaq+lC9To5l gvgRrGbKh84K69zFqM8wzzIdl8oz7p21hCPU9SnlwV7qdrWk21MZ9YHbu0X9D0jqrfSv ickXaQge8yTHBTHeY9t2WFsOO6Jx3BPaEplpY0kFX06FkxAmm8/vCzEt2W+cGAJYrRZA em7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821686; x=1690413686; 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=MXYhaIZBHUVBklzxiy2U6yni3nv37QkQ/GRKywmL6dk=; b=U7lCJ+LSxIdklZ4VcpQjWSwxk46KP7xAy7CFt8YTUD+XMFo0CsOg4rWO+7c5YME2Iu lAPlNXBZBddghYgrG95XOrm4ONCuTKzTj/1xG43O1eTJqE9RbgA+RqKt76eqcu47ZWvK 3UWUqxiASJ5issYOcOhElz8pqpx1eDVw5j53QAAMXpvvuzZVWhiOhB/NRyvhoo8XzPCW sajXpV1+aChVwaGokdEeYmFOXseFwgOPfHfoeatpjQ87VKd0w+/HvXhByy81jejSSzy1 9ETDTvmhtkULjKu3b0ePKuA5c92msa9insYPAa0XONEYxLyDj9M1ZheeQ+ELr3re4V9p iFoQ== X-Gm-Message-State: AC+VfDwVIpvmExBaeQDnwW9xia0FiYjc3rs2JkUdAlKXcE1gEKNGGzww HSv1ONfG4OvZRSaFxjGYcYJX6GFEh6WAqPO69aY= X-Google-Smtp-Source: ACHHUZ5ffD8jlGpKLFdWgjODqMGScJyqy4DCWH/6dE5+cRnzn63KCDVNQDHnjYDZWeGbfgug2II0NQ== X-Received: by 2002:a17:907:3f87:b0:982:84c9:96c4 with SMTP id hr7-20020a1709073f8700b0098284c996c4mr26100247ejc.10.1687821685837; Mon, 26 Jun 2023 16:21:25 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 12/16] target/riscv: Expose riscv_cpu_pending_to_irq() from cpu_helper.c Date: Tue, 27 Jun 2023 01:20:03 +0200 Message-Id: <20230626232007.8933-13-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62f; envelope-from=philmd@linaro.org; helo=mail-ej1-x62f.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821790339100008 We want to extract TCG/sysemu-specific code from cpu_helper.c, but some functions call riscv_cpu_pending_to_irq(). Expose the prototype in "internals.h". Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/internals.h | 4 ++++ target/riscv/cpu_helper.c | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/target/riscv/internals.h b/target/riscv/internals.h index b5f823c7ec..b6881b4815 100644 --- a/target/riscv/internals.h +++ b/target/riscv/internals.h @@ -72,6 +72,10 @@ target_ulong fclass_d(uint64_t frs1); =20 #ifndef CONFIG_USER_ONLY extern const VMStateDescription vmstate_riscv_cpu; + +int riscv_cpu_pending_to_irq(CPURISCVState *env, + int extirq, unsigned int extirq_def_prio, + uint64_t pending, uint8_t *iprio); #endif =20 enum { diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 88760248c0..5620e5d7ba 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -252,9 +252,9 @@ uint8_t riscv_cpu_default_priority(int irq) return default_iprio[irq] ? default_iprio[irq] : IPRIO_MMAXIPRIO; }; =20 -static int riscv_cpu_pending_to_irq(CPURISCVState *env, - int extirq, unsigned int extirq_def_pr= io, - uint64_t pending, uint8_t *iprio) +int riscv_cpu_pending_to_irq(CPURISCVState *env, + int extirq, unsigned int extirq_def_prio, + uint64_t pending, uint8_t *iprio) { int irq, best_irq =3D RISCV_EXCP_NONE; unsigned int prio, best_prio =3D UINT_MAX; --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821768; cv=none; d=zohomail.com; s=zohoarc; b=m3YZaCFUbDqhDDR/SXsreHwYYVz3k0AIalGyygvwEflOHMi4WQwhbglRImxOiOK6OkmPyCQQC65fkdO+M5INJNkbz0wKnRD6OL2/Qq7OWPdjYk70hM/RwBSlhPlg60tpSrv+a9A4T/SieiT/h/DM/UYS30N2aDyOne/QtNjEl+0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821768; 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=BNk7OWPwp5iCpc7+4KlxBO6s3X3EDd/rhUPqnumE3D8=; b=BUnarA/Hr9ZPQid1KdEcT8apB9cz2OTErXTCHb3IkGJJ76DVG5eeBs9QZ3kEIrReyQsFrQfM4GIisOXoqu3kl3yUCaJg/vJOmf26VOiCOa+SJhfa7Kf4ssZXqQcoTrGFEwOeqZcS7RgXl4kQvqCXmMI65zSNcrXFwr0Ero5VKJY= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821768971697.7488649753371; Mon, 26 Jun 2023 16:22:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWl-0006Uy-5J; Mon, 26 Jun 2023 19:21:47 -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 ) id 1qDvWc-0006Dx-Ov for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:39 -0400 Received: from mail-ed1-x52f.google.com ([2a00:1450:4864:20::52f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWY-0000Jl-J9 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:38 -0400 Received: by mail-ed1-x52f.google.com with SMTP id 4fb4d7f45d1cf-51d805cb33aso3913700a12.3 for ; Mon, 26 Jun 2023 16:21:34 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id z18-20020a1709067e5200b00989257be620sm3753623ejr.200.2023.06.26.16.21.30 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821693; x=1690413693; 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=BNk7OWPwp5iCpc7+4KlxBO6s3X3EDd/rhUPqnumE3D8=; b=Zbd4FU2StXATiUp/BXNzCDuEQglA5F/6bvueRElHjeluGNsi2+mjeAOcb70UWwo+VB /OiSDCKgCnv7MMu8sGG5lzoMJgGXE16xDdfAIztybw9qUoC64JWjXfhl/+XxR9PA3AcR P+yq7rO5/Hr28E0MpSVg7VwZuj9W5JLkbir+PVnJyHIpQxTIrr7W7AQfUF8oy84+al1y NRPxq17NHjmpB6dBt9Ptu1O3eIyWQYipjIcfhDn+9bKAO3Y+y9/M8e7vaa+hboYM9F7k 9SU1CgeFJYW8PaGahKaYOcvJP1zTOzO+b64ZFtSCWf4N0QbD+l1OICUHp56zBWMKh6f9 afFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821693; x=1690413693; 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=BNk7OWPwp5iCpc7+4KlxBO6s3X3EDd/rhUPqnumE3D8=; b=At8mIa01+LbTVwCSn7/YwnYcwGsTLEwTOkUBV4Bxu2frjcmViLiHmV3T7iAnvHDuBX jN1v0OH3ahICAGiAz4agdLjl2J6c2SWX3siSlacqF8qjSIKY7qKZW0JMN+xFzcXoHp/E q9ivs5uA9D4kzucf32pzaJbOQ3a2vDlmZFL7OXkv6eDejDeRNrMdD8hMsSiw9pHylOBS DcDG16qbPyZsD6ks/nSsjTpyhd6XLBNlszTkEXg6oEMNd5elPTtxuOQT9rUb6oDbL8Bl A1yawhD5l8nyglYS2TvuhBCJiF7I05GbAlFO8JGxIKd/BqwfcppwMgPFcrwqiV28NyP7 2a8w== X-Gm-Message-State: AC+VfDyPZjukqeUUa2Qc4WMa60SEfHvP+2Oms0EiEgz8DBuoeStgI/I6 pEwb3pyqngPuF54mPPo8aNn4UMvTntOKlMWfxxI= X-Google-Smtp-Source: ACHHUZ6nIqDV7cg6ZwwHhTYFWvjDADQJHmCoJHU7jS4byD1uLbB2pTFl9bLnMjtB/3gXNjvxvnClXg== X-Received: by 2002:a17:907:a41e:b0:989:2368:20d9 with SMTP id sg30-20020a170907a41e00b00989236820d9mr19504518ejc.75.1687821692034; Mon, 26 Jun 2023 16:21:32 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [RFC PATCH 13/16] target/riscv: Move TCG/sysemu-specific code to tcg/sysemu/cpu_helper.c Date: Tue, 27 Jun 2023 01:20:04 +0200 Message-Id: <20230626232007.8933-14-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::52f; envelope-from=philmd@linaro.org; helo=mail-ed1-x52f.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821770309100003 Move TCG/sysemu-specific code and restrict the corresponding prototypes to TCG, adapting meson rules. Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- RFC due to riscv_cpu_get_phys_page_debug() target/riscv/cpu.h | 15 +- target/riscv/cpu_helper.c | 745 -------------------------- target/riscv/tcg/sysemu/cpu_helper.c | 766 +++++++++++++++++++++++++++ target/riscv/tcg/tcg-stub.c | 6 + target/riscv/tcg/sysemu/meson.build | 1 + 5 files changed, 782 insertions(+), 751 deletions(-) create mode 100644 target/riscv/tcg/sysemu/cpu_helper.c diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 6908dc395c..5945e13fe0 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -429,12 +429,6 @@ void riscv_cpu_set_geilen(CPURISCVState *env, target_u= long geilen); bool riscv_cpu_vector_enabled(CPURISCVState *env); void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable); int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch); -G_NORETURN void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, - MMUAccessType access_type, - int mmu_idx, uintptr_t reta= ddr); -bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, - MMUAccessType access_type, int mmu_idx, - bool probe, uintptr_t retaddr); char *riscv_isa_string(RISCVCPU *cpu); void riscv_cpu_list(void); void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp); @@ -444,11 +438,20 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu,= Error **errp); =20 #ifndef CONFIG_USER_ONLY void riscv_cpu_do_interrupt(CPUState *cpu); +#ifdef CONFIG_TCG +bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, + MMUAccessType access_type, int mmu_idx, + bool probe, uintptr_t retaddr); void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr, unsigned size, MMUAccessType access_type, int mmu_idx, MemTxAttrs attrs, MemTxResult response, uintptr_t retad= dr); +G_NORETURN void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + MMUAccessType access_type, + int mmu_idx, uintptr_t reta= ddr); +#endif /* CONFIG_TCG */ + hwaddr riscv_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request); void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env); diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 5620e5d7ba..ded1fee489 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -327,69 +327,6 @@ int riscv_cpu_vsirq_pending(CPURISCVState *env) irqs >> 1, env->hviprio); } =20 -static int riscv_cpu_local_irq_pending(CPURISCVState *env) -{ - int virq; - uint64_t irqs, pending, mie, hsie, vsie; - - /* Determine interrupt enable state of all privilege modes */ - if (env->virt_enabled) { - mie =3D 1; - hsie =3D 1; - vsie =3D (env->priv < PRV_S) || - (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_= SIE)); - } else { - mie =3D (env->priv < PRV_M) || - (env->priv =3D=3D PRV_M && get_field(env->mstatus, MSTATUS_M= IE)); - hsie =3D (env->priv < PRV_S) || - (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_= SIE)); - vsie =3D 0; - } - - /* Determine all pending interrupts */ - pending =3D riscv_cpu_all_pending(env); - - /* Check M-mode interrupts */ - irqs =3D pending & ~env->mideleg & -mie; - if (irqs) { - return riscv_cpu_pending_to_irq(env, IRQ_M_EXT, IPRIO_DEFAULT_M, - irqs, env->miprio); - } - - /* Check HS-mode interrupts */ - irqs =3D pending & env->mideleg & ~env->hideleg & -hsie; - if (irqs) { - return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, - irqs, env->siprio); - } - - /* Check VS-mode interrupts */ - irqs =3D pending & env->mideleg & env->hideleg & -vsie; - if (irqs) { - virq =3D riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, - irqs >> 1, env->hviprio); - return (virq <=3D 0) ? virq : virq + 1; - } - - /* Indicate no pending interrupt */ - return RISCV_EXCP_NONE; -} - -bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request) -{ - if (interrupt_request & CPU_INTERRUPT_HARD) { - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - int interruptno =3D riscv_cpu_local_irq_pending(env); - if (interruptno >=3D 0) { - cs->exception_index =3D RISCV_EXCP_INT_FLAG | interruptno; - riscv_cpu_do_interrupt(cs); - return true; - } - } - return false; -} - /* Return true is floating point support is currently enabled */ bool riscv_cpu_fp_enabled(CPURISCVState *env) { @@ -605,688 +542,6 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ul= ong newpriv) env->load_res =3D -1; } =20 -/* - * get_physical_address_pmp - check PMP permission for this physical addre= ss - * - * Match the PMP region and check permission for this physical address and= it's - * TLB page. Returns 0 if the permission checking was successful - * - * @env: CPURISCVState - * @prot: The returned protection attributes - * @addr: The physical address to be checked permission - * @access_type: The type of MMU access - * @mode: Indicates current privilege level. - */ -static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr = addr, - int size, MMUAccessType access_type, - int mode) -{ - pmp_priv_t pmp_priv; - bool pmp_has_privs; - - if (!riscv_cpu_cfg(env)->pmp) { - *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; - return TRANSLATE_SUCCESS; - } - - pmp_has_privs =3D pmp_hart_has_privs(env, addr, size, 1 << access_type, - &pmp_priv, mode); - if (!pmp_has_privs) { - *prot =3D 0; - return TRANSLATE_PMP_FAIL; - } - - *prot =3D pmp_priv_to_page_prot(pmp_priv); - - return TRANSLATE_SUCCESS; -} - -/* - * get_physical_address - get the physical address for this virtual address - * - * Do a page table walk to obtain the physical address corresponding to a - * virtual address. Returns 0 if the translation was successful - * - * Adapted from Spike's mmu_t::translate and mmu_t::walk - * - * @env: CPURISCVState - * @physical: This will be set to the calculated physical address - * @prot: The returned protection attributes - * @addr: The virtual address or guest physical address to be translated - * @fault_pte_addr: If not NULL, this will be set to fault pte address - * when a error occurs on pte address translation. - * This will already be shifted to match htval. - * @access_type: The type of MMU access - * @mmu_idx: Indicates current privilege level - * @first_stage: Are we in first stage translation? - * Second stage is used for hypervisor guest translation - * @two_stage: Are we going to perform two stage translation - * @is_debug: Is this access from a debugger or the monitor? - */ -static int get_physical_address(CPURISCVState *env, hwaddr *physical, - int *ret_prot, vaddr addr, - target_ulong *fault_pte_addr, - int access_type, int mmu_idx, - bool first_stage, bool two_stage, - bool is_debug) -{ - /* - * NOTE: the env->pc value visible here will not be - * correct, but the value visible to the exception handler - * (riscv_cpu_do_interrupt) is correct - */ - MemTxResult res; - MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; - int mode =3D mmuidx_priv(mmu_idx); - bool use_background =3D false; - hwaddr ppn; - int napot_bits =3D 0; - target_ulong napot_mask; - - /* - * Check if we should use the background registers for the two - * stage translation. We don't need to check if we actually need - * two stage translation as that happened before this function - * was called. Background registers will be used if the guest has - * forced a two stage translation to be on (in HS or M mode). - */ - if (!env->virt_enabled && two_stage) { - use_background =3D true; - } - - if (mode =3D=3D PRV_M || !riscv_cpu_cfg(env)->mmu) { - *physical =3D addr; - *ret_prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; - return TRANSLATE_SUCCESS; - } - - *ret_prot =3D 0; - - hwaddr base; - int levels, ptidxbits, ptesize, vm, widened; - - if (first_stage =3D=3D true) { - if (use_background) { - if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { - base =3D (hwaddr)get_field(env->vsatp, SATP32_PPN) << PGSH= IFT; - vm =3D get_field(env->vsatp, SATP32_MODE); - } else { - base =3D (hwaddr)get_field(env->vsatp, SATP64_PPN) << PGSH= IFT; - vm =3D get_field(env->vsatp, SATP64_MODE); - } - } else { - if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { - base =3D (hwaddr)get_field(env->satp, SATP32_PPN) << PGSHI= FT; - vm =3D get_field(env->satp, SATP32_MODE); - } else { - base =3D (hwaddr)get_field(env->satp, SATP64_PPN) << PGSHI= FT; - vm =3D get_field(env->satp, SATP64_MODE); - } - } - widened =3D 0; - } else { - if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { - base =3D (hwaddr)get_field(env->hgatp, SATP32_PPN) << PGSHIFT; - vm =3D get_field(env->hgatp, SATP32_MODE); - } else { - base =3D (hwaddr)get_field(env->hgatp, SATP64_PPN) << PGSHIFT; - vm =3D get_field(env->hgatp, SATP64_MODE); - } - widened =3D 2; - } - - switch (vm) { - case VM_1_10_SV32: - levels =3D 2; ptidxbits =3D 10; ptesize =3D 4; break; - case VM_1_10_SV39: - levels =3D 3; ptidxbits =3D 9; ptesize =3D 8; break; - case VM_1_10_SV48: - levels =3D 4; ptidxbits =3D 9; ptesize =3D 8; break; - case VM_1_10_SV57: - levels =3D 5; ptidxbits =3D 9; ptesize =3D 8; break; - case VM_1_10_MBARE: - *physical =3D addr; - *ret_prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; - return TRANSLATE_SUCCESS; - default: - g_assert_not_reached(); - } - - CPUState *cs =3D env_cpu(env); - int va_bits =3D PGSHIFT + levels * ptidxbits + widened; - - if (first_stage =3D=3D true) { - target_ulong mask, masked_msbs; - - if (TARGET_LONG_BITS > (va_bits - 1)) { - mask =3D (1L << (TARGET_LONG_BITS - (va_bits - 1))) - 1; - } else { - mask =3D 0; - } - masked_msbs =3D (addr >> (va_bits - 1)) & mask; - - if (masked_msbs !=3D 0 && masked_msbs !=3D mask) { - return TRANSLATE_FAIL; - } - } else { - if (vm !=3D VM_1_10_SV32 && addr >> va_bits !=3D 0) { - return TRANSLATE_FAIL; - } - } - - bool pbmte =3D env->menvcfg & MENVCFG_PBMTE; - bool hade =3D env->menvcfg & MENVCFG_HADE; - - if (first_stage && two_stage && env->virt_enabled) { - pbmte =3D pbmte && (env->henvcfg & HENVCFG_PBMTE); - hade =3D hade && (env->henvcfg & HENVCFG_HADE); - } - - int ptshift =3D (levels - 1) * ptidxbits; - target_ulong pte; - hwaddr pte_addr; - int i; - -#if !TCG_OVERSIZED_GUEST -restart: -#endif - for (i =3D 0; i < levels; i++, ptshift -=3D ptidxbits) { - target_ulong idx; - if (i =3D=3D 0) { - idx =3D (addr >> (PGSHIFT + ptshift)) & - ((1 << (ptidxbits + widened)) - 1); - } else { - idx =3D (addr >> (PGSHIFT + ptshift)) & - ((1 << ptidxbits) - 1); - } - - /* check that physical address of PTE is legal */ - - if (two_stage && first_stage) { - int vbase_prot; - hwaddr vbase; - - /* Do the second stage translation on the base PTE address. */ - int vbase_ret =3D get_physical_address(env, &vbase, &vbase_pro= t, - base, NULL, MMU_DATA_LOAD, - MMUIdx_U, false, true, - is_debug); - - if (vbase_ret !=3D TRANSLATE_SUCCESS) { - if (fault_pte_addr) { - *fault_pte_addr =3D (base + idx * ptesize) >> 2; - } - return TRANSLATE_G_STAGE_FAIL; - } - - pte_addr =3D vbase + idx * ptesize; - } else { - pte_addr =3D base + idx * ptesize; - } - - int pmp_prot; - int pmp_ret =3D get_physical_address_pmp(env, &pmp_prot, pte_addr, - sizeof(target_ulong), - MMU_DATA_LOAD, PRV_S); - if (pmp_ret !=3D TRANSLATE_SUCCESS) { - return TRANSLATE_PMP_FAIL; - } - - if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { - pte =3D address_space_ldl(cs->as, pte_addr, attrs, &res); - } else { - pte =3D address_space_ldq(cs->as, pte_addr, attrs, &res); - } - - if (res !=3D MEMTX_OK) { - return TRANSLATE_FAIL; - } - - if (riscv_cpu_sxl(env) =3D=3D MXL_RV32) { - ppn =3D pte >> PTE_PPN_SHIFT; - } else { - if (pte & PTE_RESERVED) { - return TRANSLATE_FAIL; - } - - if (!pbmte && (pte & PTE_PBMT)) { - return TRANSLATE_FAIL; - } - - if (!riscv_cpu_cfg(env)->ext_svnapot && (pte & PTE_N)) { - return TRANSLATE_FAIL; - } - - ppn =3D (pte & (target_ulong)PTE_PPN_MASK) >> PTE_PPN_SHIFT; - } - - if (!(pte & PTE_V)) { - /* Invalid PTE */ - return TRANSLATE_FAIL; - } - if (pte & (PTE_R | PTE_W | PTE_X)) { - goto leaf; - } - - /* Inner PTE, continue walking */ - if (pte & (PTE_D | PTE_A | PTE_U | PTE_ATTR)) { - return TRANSLATE_FAIL; - } - base =3D ppn << PGSHIFT; - } - - /* No leaf pte at any translation level. */ - return TRANSLATE_FAIL; - - leaf: - if (ppn & ((1ULL << ptshift) - 1)) { - /* Misaligned PPN */ - return TRANSLATE_FAIL; - } - if (!pbmte && (pte & PTE_PBMT)) { - /* Reserved without Svpbmt. */ - return TRANSLATE_FAIL; - } - - /* Check for reserved combinations of RWX flags. */ - switch (pte & (PTE_R | PTE_W | PTE_X)) { - case PTE_W: - case PTE_W | PTE_X: - return TRANSLATE_FAIL; - } - - int prot =3D 0; - if (pte & PTE_R) { - prot |=3D PAGE_READ; - } - if (pte & PTE_W) { - prot |=3D PAGE_WRITE; - } - if (pte & PTE_X) { - bool mxr; - - if (first_stage =3D=3D true) { - mxr =3D get_field(env->mstatus, MSTATUS_MXR); - } else { - mxr =3D get_field(env->vsstatus, MSTATUS_MXR); - } - if (mxr) { - prot |=3D PAGE_READ; - } - prot |=3D PAGE_EXEC; - } - - if (pte & PTE_U) { - if (mode !=3D PRV_U) { - if (!mmuidx_sum(mmu_idx)) { - return TRANSLATE_FAIL; - } - /* SUM allows only read+write, not execute. */ - prot &=3D PAGE_READ | PAGE_WRITE; - } - } else if (mode !=3D PRV_S) { - /* Supervisor PTE flags when not S mode */ - return TRANSLATE_FAIL; - } - - if (!((prot >> access_type) & 1)) { - /* Access check failed */ - return TRANSLATE_FAIL; - } - - /* If necessary, set accessed and dirty bits. */ - target_ulong updated_pte =3D pte | PTE_A | - (access_type =3D=3D MMU_DATA_STORE ? PTE_D : 0); - - /* Page table updates need to be atomic with MTTCG enabled */ - if (updated_pte !=3D pte && !is_debug) { - if (!hade) { - return TRANSLATE_FAIL; - } - - /* - * - if accessed or dirty bits need updating, and the PTE is - * in RAM, then we do so atomically with a compare and swap. - * - if the PTE is in IO space or ROM, then it can't be updated - * and we return TRANSLATE_FAIL. - * - if the PTE changed by the time we went to update it, then - * it is no longer valid and we must re-walk the page table. - */ - MemoryRegion *mr; - hwaddr l =3D sizeof(target_ulong), addr1; - mr =3D address_space_translate(cs->as, pte_addr, &addr1, &l, - false, MEMTXATTRS_UNSPECIFIED); - if (memory_region_is_ram(mr)) { - target_ulong *pte_pa =3D qemu_map_ram_ptr(mr->ram_block, addr1= ); -#if TCG_OVERSIZED_GUEST - /* - * MTTCG is not enabled on oversized TCG guests so - * page table updates do not need to be atomic - */ - *pte_pa =3D pte =3D updated_pte; -#else - target_ulong old_pte =3D qatomic_cmpxchg(pte_pa, pte, updated_= pte); - if (old_pte !=3D pte) { - goto restart; - } - pte =3D updated_pte; -#endif - } else { - /* - * Misconfigured PTE in ROM (AD bits are not preset) or - * PTE is in IO space and can't be updated atomically. - */ - return TRANSLATE_FAIL; - } - } - - /* For superpage mappings, make a fake leaf PTE for the TLB's benefit.= */ - target_ulong vpn =3D addr >> PGSHIFT; - - if (riscv_cpu_cfg(env)->ext_svnapot && (pte & PTE_N)) { - napot_bits =3D ctzl(ppn) + 1; - if ((i !=3D (levels - 1)) || (napot_bits !=3D 4)) { - return TRANSLATE_FAIL; - } - } - - napot_mask =3D (1 << napot_bits) - 1; - *physical =3D (((ppn & ~napot_mask) | (vpn & napot_mask) | - (vpn & (((target_ulong)1 << ptshift) - 1)) - ) << PGSHIFT) | (addr & ~TARGET_PAGE_MASK); - - /* - * Remove write permission unless this is a store, or the page is - * already dirty, so that we TLB miss on later writes to update - * the dirty bit. - */ - if (access_type !=3D MMU_DATA_STORE && !(pte & PTE_D)) { - prot &=3D ~PAGE_WRITE; - } - *ret_prot =3D prot; - - return TRANSLATE_SUCCESS; -} - -static void raise_mmu_exception(CPURISCVState *env, target_ulong address, - MMUAccessType access_type, bool pmp_violat= ion, - bool first_stage, bool two_stage, - bool two_stage_indirect) -{ - CPUState *cs =3D env_cpu(env); - int page_fault_exceptions, vm; - uint64_t stap_mode; - - if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { - stap_mode =3D SATP32_MODE; - } else { - stap_mode =3D SATP64_MODE; - } - - if (first_stage) { - vm =3D get_field(env->satp, stap_mode); - } else { - vm =3D get_field(env->hgatp, stap_mode); - } - - page_fault_exceptions =3D vm !=3D VM_1_10_MBARE && !pmp_violation; - - switch (access_type) { - case MMU_INST_FETCH: - if (env->virt_enabled && !first_stage) { - cs->exception_index =3D RISCV_EXCP_INST_GUEST_PAGE_FAULT; - } else { - cs->exception_index =3D page_fault_exceptions ? - RISCV_EXCP_INST_PAGE_FAULT : RISCV_EXCP_INST_ACCESS_FAULT; - } - break; - case MMU_DATA_LOAD: - if (two_stage && !first_stage) { - cs->exception_index =3D RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT; - } else { - cs->exception_index =3D page_fault_exceptions ? - RISCV_EXCP_LOAD_PAGE_FAULT : RISCV_EXCP_LOAD_ACCESS_FAULT; - } - break; - case MMU_DATA_STORE: - if (two_stage && !first_stage) { - cs->exception_index =3D RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAUL= T; - } else { - cs->exception_index =3D page_fault_exceptions ? - RISCV_EXCP_STORE_PAGE_FAULT : - RISCV_EXCP_STORE_AMO_ACCESS_FAULT; - } - break; - default: - g_assert_not_reached(); - } - env->badaddr =3D address; - env->two_stage_lookup =3D two_stage; - env->two_stage_indirect_lookup =3D two_stage_indirect; -} - -hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - hwaddr phys_addr; - int prot; - int mmu_idx =3D cpu_mmu_index(&cpu->env, false); - - if (get_physical_address(env, &phys_addr, &prot, addr, NULL, 0, mmu_id= x, - true, env->virt_enabled, true)) { - return -1; - } - - if (env->virt_enabled) { - if (get_physical_address(env, &phys_addr, &prot, phys_addr, NULL, - 0, mmu_idx, false, true, true)) { - return -1; - } - } - - return phys_addr & TARGET_PAGE_MASK; -} - -void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, - vaddr addr, unsigned size, - MMUAccessType access_type, - int mmu_idx, MemTxAttrs attrs, - MemTxResult response, uintptr_t retad= dr) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - - if (access_type =3D=3D MMU_DATA_STORE) { - cs->exception_index =3D RISCV_EXCP_STORE_AMO_ACCESS_FAULT; - } else if (access_type =3D=3D MMU_DATA_LOAD) { - cs->exception_index =3D RISCV_EXCP_LOAD_ACCESS_FAULT; - } else { - cs->exception_index =3D RISCV_EXCP_INST_ACCESS_FAULT; - } - - env->badaddr =3D addr; - env->two_stage_lookup =3D mmuidx_2stage(mmu_idx); - env->two_stage_indirect_lookup =3D false; - cpu_loop_exit_restore(cs, retaddr); -} - -void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, - MMUAccessType access_type, int mmu_idx, - uintptr_t retaddr) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - switch (access_type) { - case MMU_INST_FETCH: - cs->exception_index =3D RISCV_EXCP_INST_ADDR_MIS; - break; - case MMU_DATA_LOAD: - cs->exception_index =3D RISCV_EXCP_LOAD_ADDR_MIS; - break; - case MMU_DATA_STORE: - cs->exception_index =3D RISCV_EXCP_STORE_AMO_ADDR_MIS; - break; - default: - g_assert_not_reached(); - } - env->badaddr =3D addr; - env->two_stage_lookup =3D mmuidx_2stage(mmu_idx); - env->two_stage_indirect_lookup =3D false; - cpu_loop_exit_restore(cs, retaddr); -} - - -static void pmu_tlb_fill_incr_ctr(RISCVCPU *cpu, MMUAccessType access_type) -{ - enum riscv_pmu_event_idx pmu_event_type; - - switch (access_type) { - case MMU_INST_FETCH: - pmu_event_type =3D RISCV_PMU_EVENT_CACHE_ITLB_PREFETCH_MISS; - break; - case MMU_DATA_LOAD: - pmu_event_type =3D RISCV_PMU_EVENT_CACHE_DTLB_READ_MISS; - break; - case MMU_DATA_STORE: - pmu_event_type =3D RISCV_PMU_EVENT_CACHE_DTLB_WRITE_MISS; - break; - default: - return; - } - - riscv_pmu_incr_ctr(cpu, pmu_event_type); -} - -bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, - MMUAccessType access_type, int mmu_idx, - bool probe, uintptr_t retaddr) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - vaddr im_address; - hwaddr pa =3D 0; - int prot, prot2, prot_pmp; - bool pmp_violation =3D false; - bool first_stage_error =3D true; - bool two_stage_lookup =3D mmuidx_2stage(mmu_idx); - bool two_stage_indirect_error =3D false; - int ret =3D TRANSLATE_FAIL; - int mode =3D mmu_idx; - /* default TLB page size */ - target_ulong tlb_size =3D TARGET_PAGE_SIZE; - - env->guest_phys_fault_addr =3D 0; - - qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n", - __func__, address, access_type, mmu_idx); - - pmu_tlb_fill_incr_ctr(cpu, access_type); - if (two_stage_lookup) { - /* Two stage lookup */ - ret =3D get_physical_address(env, &pa, &prot, address, - &env->guest_phys_fault_addr, access_typ= e, - mmu_idx, true, true, false); - - /* - * A G-stage exception may be triggered during two state lookup. - * And the env->guest_phys_fault_addr has already been set in - * get_physical_address(). - */ - if (ret =3D=3D TRANSLATE_G_STAGE_FAIL) { - first_stage_error =3D false; - two_stage_indirect_error =3D true; - access_type =3D MMU_DATA_LOAD; - } - - qemu_log_mask(CPU_LOG_MMU, - "%s 1st-stage address=3D%" VADDR_PRIx " ret %d physi= cal " - HWADDR_FMT_plx " prot %d\n", - __func__, address, ret, pa, prot); - - if (ret =3D=3D TRANSLATE_SUCCESS) { - /* Second stage lookup */ - im_address =3D pa; - - ret =3D get_physical_address(env, &pa, &prot2, im_address, NUL= L, - access_type, MMUIdx_U, false, true, - false); - - qemu_log_mask(CPU_LOG_MMU, - "%s 2nd-stage address=3D%" VADDR_PRIx - " ret %d physical " - HWADDR_FMT_plx " prot %d\n", - __func__, im_address, ret, pa, prot2); - - prot &=3D prot2; - - if (ret =3D=3D TRANSLATE_SUCCESS) { - ret =3D get_physical_address_pmp(env, &prot_pmp, pa, - size, access_type, mode); - tlb_size =3D pmp_get_tlb_size(env, pa); - - qemu_log_mask(CPU_LOG_MMU, - "%s PMP address=3D" HWADDR_FMT_plx " ret %d = prot" - " %d tlb_size " TARGET_FMT_lu "\n", - __func__, pa, ret, prot_pmp, tlb_size); - - prot &=3D prot_pmp; - } - - if (ret !=3D TRANSLATE_SUCCESS) { - /* - * Guest physical address translation failed, this is a HS - * level exception - */ - first_stage_error =3D false; - env->guest_phys_fault_addr =3D (im_address | - (address & - (TARGET_PAGE_SIZE - 1))) >>= 2; - } - } - } else { - /* Single stage lookup */ - ret =3D get_physical_address(env, &pa, &prot, address, NULL, - access_type, mmu_idx, true, false, fals= e); - - qemu_log_mask(CPU_LOG_MMU, - "%s address=3D%" VADDR_PRIx " ret %d physical " - HWADDR_FMT_plx " prot %d\n", - __func__, address, ret, pa, prot); - - if (ret =3D=3D TRANSLATE_SUCCESS) { - ret =3D get_physical_address_pmp(env, &prot_pmp, pa, - size, access_type, mode); - tlb_size =3D pmp_get_tlb_size(env, pa); - - qemu_log_mask(CPU_LOG_MMU, - "%s PMP address=3D" HWADDR_FMT_plx " ret %d prot" - " %d tlb_size " TARGET_FMT_lu "\n", - __func__, pa, ret, prot_pmp, tlb_size); - - prot &=3D prot_pmp; - } - } - - if (ret =3D=3D TRANSLATE_PMP_FAIL) { - pmp_violation =3D true; - } - - if (ret =3D=3D TRANSLATE_SUCCESS) { - tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1), - prot, mmu_idx, tlb_size); - return true; - } else if (probe) { - return false; - } else { - raise_mmu_exception(env, address, access_type, pmp_violation, - first_stage_error, two_stage_lookup, - two_stage_indirect_error); - cpu_loop_exit_restore(cs, retaddr); - } - - return true; -} =20 static target_ulong riscv_transformed_insn(CPURISCVState *env, target_ulong insn, diff --git a/target/riscv/tcg/sysemu/cpu_helper.c b/target/riscv/tcg/sysemu= /cpu_helper.c new file mode 100644 index 0000000000..57b04eb2ce --- /dev/null +++ b/target/riscv/tcg/sysemu/cpu_helper.c @@ -0,0 +1,766 @@ +/* + * RISC-V CPU system helpers (TCG specific) + * + * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu + * Copyright (c) 2017-2018 SiFive, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qemu/main-loop.h" +#include "exec/exec-all.h" +#include "cpu.h" +#include "internals.h" +#include "sysemu/cpu-timers.h" +#include "sysemu/pmu.h" +#include "sysemu/instmap.h" +#include "semihosting/common-semi.h" +#include "trace.h" + + +static int riscv_cpu_local_irq_pending(CPURISCVState *env) +{ + int virq; + uint64_t irqs, pending, mie, hsie, vsie; + + /* Determine interrupt enable state of all privilege modes */ + if (env->virt_enabled) { + mie =3D 1; + hsie =3D 1; + vsie =3D (env->priv < PRV_S) || + (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_= SIE)); + } else { + mie =3D (env->priv < PRV_M) || + (env->priv =3D=3D PRV_M && get_field(env->mstatus, MSTATUS_M= IE)); + hsie =3D (env->priv < PRV_S) || + (env->priv =3D=3D PRV_S && get_field(env->mstatus, MSTATUS_= SIE)); + vsie =3D 0; + } + + /* Determine all pending interrupts */ + pending =3D riscv_cpu_all_pending(env); + + /* Check M-mode interrupts */ + irqs =3D pending & ~env->mideleg & -mie; + if (irqs) { + return riscv_cpu_pending_to_irq(env, IRQ_M_EXT, IPRIO_DEFAULT_M, + irqs, env->miprio); + } + + /* Check HS-mode interrupts */ + irqs =3D pending & env->mideleg & ~env->hideleg & -hsie; + if (irqs) { + return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, + irqs, env->siprio); + } + + /* Check VS-mode interrupts */ + irqs =3D pending & env->mideleg & env->hideleg & -vsie; + if (irqs) { + virq =3D riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, + irqs >> 1, env->hviprio); + return (virq <=3D 0) ? virq : virq + 1; + } + + /* Indicate no pending interrupt */ + return RISCV_EXCP_NONE; +} + +bool riscv_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + if (interrupt_request & CPU_INTERRUPT_HARD) { + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + int interruptno =3D riscv_cpu_local_irq_pending(env); + if (interruptno >=3D 0) { + cs->exception_index =3D RISCV_EXCP_INT_FLAG | interruptno; + riscv_cpu_do_interrupt(cs); + return true; + } + } + return false; +} + +/* + * get_physical_address_pmp - check PMP permission for this physical addre= ss + * + * Match the PMP region and check permission for this physical address and= it's + * TLB page. Returns 0 if the permission checking was successful + * + * @env: CPURISCVState + * @prot: The returned protection attributes + * @addr: The physical address to be checked permission + * @access_type: The type of MMU access + * @mode: Indicates current privilege level. + */ +static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr = addr, + int size, MMUAccessType access_type, + int mode) +{ + pmp_priv_t pmp_priv; + bool pmp_has_privs; + + if (!riscv_cpu_cfg(env)->pmp) { + *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return TRANSLATE_SUCCESS; + } + + pmp_has_privs =3D pmp_hart_has_privs(env, addr, size, 1 << access_type, + &pmp_priv, mode); + if (!pmp_has_privs) { + *prot =3D 0; + return TRANSLATE_PMP_FAIL; + } + + *prot =3D pmp_priv_to_page_prot(pmp_priv); + + return TRANSLATE_SUCCESS; +} + +/* + * get_physical_address - get the physical address for this virtual address + * + * Do a page table walk to obtain the physical address corresponding to a + * virtual address. Returns 0 if the translation was successful + * + * Adapted from Spike's mmu_t::translate and mmu_t::walk + * + * @env: CPURISCVState + * @physical: This will be set to the calculated physical address + * @prot: The returned protection attributes + * @addr: The virtual address or guest physical address to be translated + * @fault_pte_addr: If not NULL, this will be set to fault pte address + * when a error occurs on pte address translation. + * This will already be shifted to match htval. + * @access_type: The type of MMU access + * @mmu_idx: Indicates current privilege level + * @first_stage: Are we in first stage translation? + * Second stage is used for hypervisor guest translation + * @two_stage: Are we going to perform two stage translation + * @is_debug: Is this access from a debugger or the monitor? + */ +static int get_physical_address(CPURISCVState *env, hwaddr *physical, + int *ret_prot, vaddr addr, + target_ulong *fault_pte_addr, + int access_type, int mmu_idx, + bool first_stage, bool two_stage, + bool is_debug) +{ + /* + * NOTE: the env->pc value visible here will not be + * correct, but the value visible to the exception handler + * (riscv_cpu_do_interrupt) is correct + */ + MemTxResult res; + MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; + int mode =3D mmuidx_priv(mmu_idx); + bool use_background =3D false; + hwaddr ppn; + int napot_bits =3D 0; + target_ulong napot_mask; + + /* + * Check if we should use the background registers for the two + * stage translation. We don't need to check if we actually need + * two stage translation as that happened before this function + * was called. Background registers will be used if the guest has + * forced a two stage translation to be on (in HS or M mode). + */ + if (!env->virt_enabled && two_stage) { + use_background =3D true; + } + + if (mode =3D=3D PRV_M || !riscv_cpu_cfg(env)->mmu) { + *physical =3D addr; + *ret_prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return TRANSLATE_SUCCESS; + } + + *ret_prot =3D 0; + + hwaddr base; + int levels, ptidxbits, ptesize, vm, widened; + + if (first_stage =3D=3D true) { + if (use_background) { + if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { + base =3D (hwaddr)get_field(env->vsatp, SATP32_PPN) << PGSH= IFT; + vm =3D get_field(env->vsatp, SATP32_MODE); + } else { + base =3D (hwaddr)get_field(env->vsatp, SATP64_PPN) << PGSH= IFT; + vm =3D get_field(env->vsatp, SATP64_MODE); + } + } else { + if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { + base =3D (hwaddr)get_field(env->satp, SATP32_PPN) << PGSHI= FT; + vm =3D get_field(env->satp, SATP32_MODE); + } else { + base =3D (hwaddr)get_field(env->satp, SATP64_PPN) << PGSHI= FT; + vm =3D get_field(env->satp, SATP64_MODE); + } + } + widened =3D 0; + } else { + if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { + base =3D (hwaddr)get_field(env->hgatp, SATP32_PPN) << PGSHIFT; + vm =3D get_field(env->hgatp, SATP32_MODE); + } else { + base =3D (hwaddr)get_field(env->hgatp, SATP64_PPN) << PGSHIFT; + vm =3D get_field(env->hgatp, SATP64_MODE); + } + widened =3D 2; + } + + switch (vm) { + case VM_1_10_SV32: + levels =3D 2; ptidxbits =3D 10; ptesize =3D 4; break; + case VM_1_10_SV39: + levels =3D 3; ptidxbits =3D 9; ptesize =3D 8; break; + case VM_1_10_SV48: + levels =3D 4; ptidxbits =3D 9; ptesize =3D 8; break; + case VM_1_10_SV57: + levels =3D 5; ptidxbits =3D 9; ptesize =3D 8; break; + case VM_1_10_MBARE: + *physical =3D addr; + *ret_prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return TRANSLATE_SUCCESS; + default: + g_assert_not_reached(); + } + + CPUState *cs =3D env_cpu(env); + int va_bits =3D PGSHIFT + levels * ptidxbits + widened; + + if (first_stage =3D=3D true) { + target_ulong mask, masked_msbs; + + if (TARGET_LONG_BITS > (va_bits - 1)) { + mask =3D (1L << (TARGET_LONG_BITS - (va_bits - 1))) - 1; + } else { + mask =3D 0; + } + masked_msbs =3D (addr >> (va_bits - 1)) & mask; + + if (masked_msbs !=3D 0 && masked_msbs !=3D mask) { + return TRANSLATE_FAIL; + } + } else { + if (vm !=3D VM_1_10_SV32 && addr >> va_bits !=3D 0) { + return TRANSLATE_FAIL; + } + } + + bool pbmte =3D env->menvcfg & MENVCFG_PBMTE; + bool hade =3D env->menvcfg & MENVCFG_HADE; + + if (first_stage && two_stage && env->virt_enabled) { + pbmte =3D pbmte && (env->henvcfg & HENVCFG_PBMTE); + hade =3D hade && (env->henvcfg & HENVCFG_HADE); + } + + int ptshift =3D (levels - 1) * ptidxbits; + target_ulong pte; + hwaddr pte_addr; + int i; + +#if !TCG_OVERSIZED_GUEST +restart: +#endif + for (i =3D 0; i < levels; i++, ptshift -=3D ptidxbits) { + target_ulong idx; + if (i =3D=3D 0) { + idx =3D (addr >> (PGSHIFT + ptshift)) & + ((1 << (ptidxbits + widened)) - 1); + } else { + idx =3D (addr >> (PGSHIFT + ptshift)) & + ((1 << ptidxbits) - 1); + } + + /* check that physical address of PTE is legal */ + + if (two_stage && first_stage) { + int vbase_prot; + hwaddr vbase; + + /* Do the second stage translation on the base PTE address. */ + int vbase_ret =3D get_physical_address(env, &vbase, &vbase_pro= t, + base, NULL, MMU_DATA_LOAD, + MMUIdx_U, false, true, + is_debug); + + if (vbase_ret !=3D TRANSLATE_SUCCESS) { + if (fault_pte_addr) { + *fault_pte_addr =3D (base + idx * ptesize) >> 2; + } + return TRANSLATE_G_STAGE_FAIL; + } + + pte_addr =3D vbase + idx * ptesize; + } else { + pte_addr =3D base + idx * ptesize; + } + + int pmp_prot; + int pmp_ret =3D get_physical_address_pmp(env, &pmp_prot, pte_addr, + sizeof(target_ulong), + MMU_DATA_LOAD, PRV_S); + if (pmp_ret !=3D TRANSLATE_SUCCESS) { + return TRANSLATE_PMP_FAIL; + } + + if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { + pte =3D address_space_ldl(cs->as, pte_addr, attrs, &res); + } else { + pte =3D address_space_ldq(cs->as, pte_addr, attrs, &res); + } + + if (res !=3D MEMTX_OK) { + return TRANSLATE_FAIL; + } + + if (riscv_cpu_sxl(env) =3D=3D MXL_RV32) { + ppn =3D pte >> PTE_PPN_SHIFT; + } else { + if (pte & PTE_RESERVED) { + return TRANSLATE_FAIL; + } + + if (!pbmte && (pte & PTE_PBMT)) { + return TRANSLATE_FAIL; + } + + if (!riscv_cpu_cfg(env)->ext_svnapot && (pte & PTE_N)) { + return TRANSLATE_FAIL; + } + + ppn =3D (pte & (target_ulong)PTE_PPN_MASK) >> PTE_PPN_SHIFT; + } + + if (!(pte & PTE_V)) { + /* Invalid PTE */ + return TRANSLATE_FAIL; + } + if (pte & (PTE_R | PTE_W | PTE_X)) { + goto leaf; + } + + /* Inner PTE, continue walking */ + if (pte & (PTE_D | PTE_A | PTE_U | PTE_ATTR)) { + return TRANSLATE_FAIL; + } + base =3D ppn << PGSHIFT; + } + + /* No leaf pte at any translation level. */ + return TRANSLATE_FAIL; + + leaf: + if (ppn & ((1ULL << ptshift) - 1)) { + /* Misaligned PPN */ + return TRANSLATE_FAIL; + } + if (!pbmte && (pte & PTE_PBMT)) { + /* Reserved without Svpbmt. */ + return TRANSLATE_FAIL; + } + + /* Check for reserved combinations of RWX flags. */ + switch (pte & (PTE_R | PTE_W | PTE_X)) { + case PTE_W: + case PTE_W | PTE_X: + return TRANSLATE_FAIL; + } + + int prot =3D 0; + if (pte & PTE_R) { + prot |=3D PAGE_READ; + } + if (pte & PTE_W) { + prot |=3D PAGE_WRITE; + } + if (pte & PTE_X) { + bool mxr; + + if (first_stage =3D=3D true) { + mxr =3D get_field(env->mstatus, MSTATUS_MXR); + } else { + mxr =3D get_field(env->vsstatus, MSTATUS_MXR); + } + if (mxr) { + prot |=3D PAGE_READ; + } + prot |=3D PAGE_EXEC; + } + + if (pte & PTE_U) { + if (mode !=3D PRV_U) { + if (!mmuidx_sum(mmu_idx)) { + return TRANSLATE_FAIL; + } + /* SUM allows only read+write, not execute. */ + prot &=3D PAGE_READ | PAGE_WRITE; + } + } else if (mode !=3D PRV_S) { + /* Supervisor PTE flags when not S mode */ + return TRANSLATE_FAIL; + } + + if (!((prot >> access_type) & 1)) { + /* Access check failed */ + return TRANSLATE_FAIL; + } + + /* If necessary, set accessed and dirty bits. */ + target_ulong updated_pte =3D pte | PTE_A | + (access_type =3D=3D MMU_DATA_STORE ? PTE_D : 0); + + /* Page table updates need to be atomic with MTTCG enabled */ + if (updated_pte !=3D pte && !is_debug) { + if (!hade) { + return TRANSLATE_FAIL; + } + + /* + * - if accessed or dirty bits need updating, and the PTE is + * in RAM, then we do so atomically with a compare and swap. + * - if the PTE is in IO space or ROM, then it can't be updated + * and we return TRANSLATE_FAIL. + * - if the PTE changed by the time we went to update it, then + * it is no longer valid and we must re-walk the page table. + */ + MemoryRegion *mr; + hwaddr l =3D sizeof(target_ulong), addr1; + mr =3D address_space_translate(cs->as, pte_addr, &addr1, &l, + false, MEMTXATTRS_UNSPECIFIED); + if (memory_region_is_ram(mr)) { + target_ulong *pte_pa =3D qemu_map_ram_ptr(mr->ram_block, addr1= ); +#if TCG_OVERSIZED_GUEST + /* + * MTTCG is not enabled on oversized TCG guests so + * page table updates do not need to be atomic + */ + *pte_pa =3D pte =3D updated_pte; +#else + target_ulong old_pte =3D qatomic_cmpxchg(pte_pa, pte, updated_= pte); + if (old_pte !=3D pte) { + goto restart; + } + pte =3D updated_pte; +#endif + } else { + /* + * Misconfigured PTE in ROM (AD bits are not preset) or + * PTE is in IO space and can't be updated atomically. + */ + return TRANSLATE_FAIL; + } + } + + /* For superpage mappings, make a fake leaf PTE for the TLB's benefit.= */ + target_ulong vpn =3D addr >> PGSHIFT; + + if (riscv_cpu_cfg(env)->ext_svnapot && (pte & PTE_N)) { + napot_bits =3D ctzl(ppn) + 1; + if ((i !=3D (levels - 1)) || (napot_bits !=3D 4)) { + return TRANSLATE_FAIL; + } + } + + napot_mask =3D (1 << napot_bits) - 1; + *physical =3D (((ppn & ~napot_mask) | (vpn & napot_mask) | + (vpn & (((target_ulong)1 << ptshift) - 1)) + ) << PGSHIFT) | (addr & ~TARGET_PAGE_MASK); + + /* + * Remove write permission unless this is a store, or the page is + * already dirty, so that we TLB miss on later writes to update + * the dirty bit. + */ + if (access_type !=3D MMU_DATA_STORE && !(pte & PTE_D)) { + prot &=3D ~PAGE_WRITE; + } + *ret_prot =3D prot; + + return TRANSLATE_SUCCESS; +} + +static void raise_mmu_exception(CPURISCVState *env, target_ulong address, + MMUAccessType access_type, bool pmp_violat= ion, + bool first_stage, bool two_stage, + bool two_stage_indirect) +{ + CPUState *cs =3D env_cpu(env); + int page_fault_exceptions, vm; + uint64_t stap_mode; + + if (riscv_cpu_mxl(env) =3D=3D MXL_RV32) { + stap_mode =3D SATP32_MODE; + } else { + stap_mode =3D SATP64_MODE; + } + + if (first_stage) { + vm =3D get_field(env->satp, stap_mode); + } else { + vm =3D get_field(env->hgatp, stap_mode); + } + + page_fault_exceptions =3D vm !=3D VM_1_10_MBARE && !pmp_violation; + + switch (access_type) { + case MMU_INST_FETCH: + if (env->virt_enabled && !first_stage) { + cs->exception_index =3D RISCV_EXCP_INST_GUEST_PAGE_FAULT; + } else { + cs->exception_index =3D page_fault_exceptions ? + RISCV_EXCP_INST_PAGE_FAULT : RISCV_EXCP_INST_ACCESS_FAULT; + } + break; + case MMU_DATA_LOAD: + if (two_stage && !first_stage) { + cs->exception_index =3D RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT; + } else { + cs->exception_index =3D page_fault_exceptions ? + RISCV_EXCP_LOAD_PAGE_FAULT : RISCV_EXCP_LOAD_ACCESS_FAULT; + } + break; + case MMU_DATA_STORE: + if (two_stage && !first_stage) { + cs->exception_index =3D RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAUL= T; + } else { + cs->exception_index =3D page_fault_exceptions ? + RISCV_EXCP_STORE_PAGE_FAULT : + RISCV_EXCP_STORE_AMO_ACCESS_FAULT; + } + break; + default: + g_assert_not_reached(); + } + env->badaddr =3D address; + env->two_stage_lookup =3D two_stage; + env->two_stage_indirect_lookup =3D two_stage_indirect; +} + +hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + hwaddr phys_addr; + int prot; + int mmu_idx =3D cpu_mmu_index(&cpu->env, false); + + if (get_physical_address(env, &phys_addr, &prot, addr, NULL, 0, mmu_id= x, + true, env->virt_enabled, true)) { + return -1; + } + + if (env->virt_enabled) { + if (get_physical_address(env, &phys_addr, &prot, phys_addr, NULL, + 0, mmu_idx, false, true, true)) { + return -1; + } + } + + return phys_addr & TARGET_PAGE_MASK; +} + +void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, + vaddr addr, unsigned size, + MMUAccessType access_type, + int mmu_idx, MemTxAttrs attrs, + MemTxResult response, uintptr_t retad= dr) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + + if (access_type =3D=3D MMU_DATA_STORE) { + cs->exception_index =3D RISCV_EXCP_STORE_AMO_ACCESS_FAULT; + } else if (access_type =3D=3D MMU_DATA_LOAD) { + cs->exception_index =3D RISCV_EXCP_LOAD_ACCESS_FAULT; + } else { + cs->exception_index =3D RISCV_EXCP_INST_ACCESS_FAULT; + } + + env->badaddr =3D addr; + env->two_stage_lookup =3D mmuidx_2stage(mmu_idx); + env->two_stage_indirect_lookup =3D false; + cpu_loop_exit_restore(cs, retaddr); +} + +void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + MMUAccessType access_type, int mmu_idx, + uintptr_t retaddr) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + switch (access_type) { + case MMU_INST_FETCH: + cs->exception_index =3D RISCV_EXCP_INST_ADDR_MIS; + break; + case MMU_DATA_LOAD: + cs->exception_index =3D RISCV_EXCP_LOAD_ADDR_MIS; + break; + case MMU_DATA_STORE: + cs->exception_index =3D RISCV_EXCP_STORE_AMO_ADDR_MIS; + break; + default: + g_assert_not_reached(); + } + env->badaddr =3D addr; + env->two_stage_lookup =3D mmuidx_2stage(mmu_idx); + env->two_stage_indirect_lookup =3D false; + cpu_loop_exit_restore(cs, retaddr); +} + +static void pmu_tlb_fill_incr_ctr(RISCVCPU *cpu, MMUAccessType access_type) +{ + enum riscv_pmu_event_idx pmu_event_type; + + switch (access_type) { + case MMU_INST_FETCH: + pmu_event_type =3D RISCV_PMU_EVENT_CACHE_ITLB_PREFETCH_MISS; + break; + case MMU_DATA_LOAD: + pmu_event_type =3D RISCV_PMU_EVENT_CACHE_DTLB_READ_MISS; + break; + case MMU_DATA_STORE: + pmu_event_type =3D RISCV_PMU_EVENT_CACHE_DTLB_WRITE_MISS; + break; + default: + return; + } + + riscv_pmu_incr_ctr(cpu, pmu_event_type); +} + +bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, + MMUAccessType access_type, int mmu_idx, + bool probe, uintptr_t retaddr) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + vaddr im_address; + hwaddr pa =3D 0; + int prot, prot2, prot_pmp; + bool pmp_violation =3D false; + bool first_stage_error =3D true; + bool two_stage_lookup =3D mmuidx_2stage(mmu_idx); + bool two_stage_indirect_error =3D false; + int ret =3D TRANSLATE_FAIL; + int mode =3D mmu_idx; + /* default TLB page size */ + target_ulong tlb_size =3D TARGET_PAGE_SIZE; + + env->guest_phys_fault_addr =3D 0; + + qemu_log_mask(CPU_LOG_MMU, "%s ad %" VADDR_PRIx " rw %d mmu_idx %d\n", + __func__, address, access_type, mmu_idx); + + pmu_tlb_fill_incr_ctr(cpu, access_type); + if (two_stage_lookup) { + /* Two stage lookup */ + ret =3D get_physical_address(env, &pa, &prot, address, + &env->guest_phys_fault_addr, access_typ= e, + mmu_idx, true, true, false); + + /* + * A G-stage exception may be triggered during two state lookup. + * And the env->guest_phys_fault_addr has already been set in + * get_physical_address(). + */ + if (ret =3D=3D TRANSLATE_G_STAGE_FAIL) { + first_stage_error =3D false; + two_stage_indirect_error =3D true; + access_type =3D MMU_DATA_LOAD; + } + + qemu_log_mask(CPU_LOG_MMU, + "%s 1st-stage address=3D%" VADDR_PRIx " ret %d physi= cal " + HWADDR_FMT_plx " prot %d\n", + __func__, address, ret, pa, prot); + + if (ret =3D=3D TRANSLATE_SUCCESS) { + /* Second stage lookup */ + im_address =3D pa; + + ret =3D get_physical_address(env, &pa, &prot2, im_address, NUL= L, + access_type, MMUIdx_U, false, true, + false); + + qemu_log_mask(CPU_LOG_MMU, + "%s 2nd-stage address=3D%" VADDR_PRIx + " ret %d physical " + HWADDR_FMT_plx " prot %d\n", + __func__, im_address, ret, pa, prot2); + + prot &=3D prot2; + + if (ret =3D=3D TRANSLATE_SUCCESS) { + ret =3D get_physical_address_pmp(env, &prot_pmp, pa, + size, access_type, mode); + tlb_size =3D pmp_get_tlb_size(env, pa); + + qemu_log_mask(CPU_LOG_MMU, + "%s PMP address=3D" HWADDR_FMT_plx " ret %d = prot" + " %d tlb_size " TARGET_FMT_lu "\n", + __func__, pa, ret, prot_pmp, tlb_size); + + prot &=3D prot_pmp; + } + + if (ret !=3D TRANSLATE_SUCCESS) { + /* + * Guest physical address translation failed, this is a HS + * level exception + */ + first_stage_error =3D false; + env->guest_phys_fault_addr =3D (im_address | + (address & + (TARGET_PAGE_SIZE - 1))) >>= 2; + } + } + } else { + /* Single stage lookup */ + ret =3D get_physical_address(env, &pa, &prot, address, NULL, + access_type, mmu_idx, true, false, fals= e); + + qemu_log_mask(CPU_LOG_MMU, + "%s address=3D%" VADDR_PRIx " ret %d physical " + HWADDR_FMT_plx " prot %d\n", + __func__, address, ret, pa, prot); + + if (ret =3D=3D TRANSLATE_SUCCESS) { + ret =3D get_physical_address_pmp(env, &prot_pmp, pa, + size, access_type, mode); + tlb_size =3D pmp_get_tlb_size(env, pa); + + qemu_log_mask(CPU_LOG_MMU, + "%s PMP address=3D" HWADDR_FMT_plx " ret %d prot" + " %d tlb_size " TARGET_FMT_lu "\n", + __func__, pa, ret, prot_pmp, tlb_size); + + prot &=3D prot_pmp; + } + } + + if (ret =3D=3D TRANSLATE_PMP_FAIL) { + pmp_violation =3D true; + } + + if (ret =3D=3D TRANSLATE_SUCCESS) { + tlb_set_page(cs, address & ~(tlb_size - 1), pa & ~(tlb_size - 1), + prot, mmu_idx, tlb_size); + return true; + } else if (probe) { + return false; + } else { + raise_mmu_exception(env, address, access_type, pmp_violation, + first_stage_error, two_stage_lookup, + two_stage_indirect_error); + cpu_loop_exit_restore(cs, retaddr); + } + + return true; +} diff --git a/target/riscv/tcg/tcg-stub.c b/target/riscv/tcg/tcg-stub.c index dfe42ae2ac..e329d25355 100644 --- a/target/riscv/tcg/tcg-stub.c +++ b/target/riscv/tcg/tcg-stub.c @@ -23,3 +23,9 @@ G_NORETURN void riscv_raise_exception(CPURISCVState *env, { g_assert_not_reached(); } + +hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + /* XXX too many TCG code in the real riscv_cpu_get_phys_page_debug() */ + return -1; +} diff --git a/target/riscv/tcg/sysemu/meson.build b/target/riscv/tcg/sysemu/= meson.build index e8e61e5784..a549e497ce 100644 --- a/target/riscv/tcg/sysemu/meson.build +++ b/target/riscv/tcg/sysemu/meson.build @@ -1,3 +1,4 @@ riscv_system_ss.add(when: 'CONFIG_TCG', if_true: files( + 'cpu_helper.c', 'debug.c', )) --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821761; cv=none; d=zohomail.com; s=zohoarc; b=L5BXMXpZ6Ltp0pjL3m68P4izN5yN22ygwqFeTYY4jPUrSS4st6tm6yLO00LklKZ8MtWbBc5a1Qfe9b+JMOKn6050HbV90/WHgcZv3BKPXY/ibm3ePURCO1OfzYZ6DlCgeCWSY33jVUKtPQSDMIPTESGqc6g0R7o0mrli7MNcI7k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821761; 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=YU13su2z+qmCb5X0HjHMFAIusdV2jg9rpudf82qXwe4=; b=I69X0YYUcyMtnXom2pckfX9ggyCLqFAfNnFP6IH9NEOOYkoLiqFJquS7UJYTgrm5yCG9t5e2MT3Uv5PIQzJjD8F7HRdIlTo/fIqBiGm+rj6lqwRirCKDv9JtAbfzH3r4UymxaozHyGui/SpTV8LaSmB8kJnDcRY2C2w4AiZ3TwY= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821761355197.12406029908277; Mon, 26 Jun 2023 16:22:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWo-0006rT-8d; Mon, 26 Jun 2023 19:21:50 -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 ) id 1qDvWj-0006Uf-K3 for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:46 -0400 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWf-0000KT-9S for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:45 -0400 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-51d810010deso2410781a12.0 for ; Mon, 26 Jun 2023 16:21:40 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id e2-20020a170906080200b009534211cc97sm3817875ejd.159.2023.06.26.16.21.36 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821699; x=1690413699; 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=YU13su2z+qmCb5X0HjHMFAIusdV2jg9rpudf82qXwe4=; b=nnGNvKUrn9UCLtlcjeBNf4HApMCPVabMu2JBTs0xeZdtu1gabmZTXAWQOg+qfyPqTd tbWc2WqlGGio+PsOOJs20bgFo3SQ514TGXOOfqprpF/U8xGgQLyGgqCii1TTog9H3A4O n4ANv3hnUCQil2z4saQVKOzElOdnvtUOZAztIPBXjx+7Cil6F7QmZ7CPW4WqUBSOzM4o kajj/AfV6uLrvh5zuDcnn6V8CU2qcJX2tYGZtiKLe2JGrmL4OQ7I2QZNR1kWA82ummfu O6bBfWpqq572N6SFtMo1eILPrdAuk7z23jEr7+n1HGnatjRBk+ty7vm9acXW+DH6XPHW aRqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821699; x=1690413699; 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=YU13su2z+qmCb5X0HjHMFAIusdV2jg9rpudf82qXwe4=; b=kySgegr++DWQdccFBunWOUGdgRq/6xOQXZR/qCRuNxmt382uN0xC1HbeQVvMFFIlaX 6W2VPc4CAwd+X0iixBG/kPS1gERNemDeAoibV2nmW/Rup16m4UWNQ6veyqVkMMaRmlEF /cT27OsZ+PFMPFgNvLUi+6DAaXGN/QKcExHNtNJtBe0xFYm+7sM0gXYA8wxSjanWj5/1 jo8DJuLO7SI1+zrnwxNfBvE/UVFNqjDxemNvuUS4VWIH9DBQwZ4aCrT1m4ffkOP70Je9 k1MbCbS2osoXz/dRRc+iFui/AQ5hhiS1RdMvXMIwuC+r4milQQ9Itvi+Yb4vR0n2bfvH FWZA== X-Gm-Message-State: AC+VfDx9Ysk+IWMi6fxj0Fwt8xfYiMyy09Sm7zWBbL1Ideohc6sFAjzR bdgZUsuwGzFSfoZFkWeJtYCDWT0meEE6Mewotj8= X-Google-Smtp-Source: ACHHUZ4QkuhAsaXssyeKqFbXVRzW9az1OsmP72kz+DhZ16PhNKSbklTIdWRVgvtFVlZUi3dmvTlggg== X-Received: by 2002:a17:907:807:b0:970:71c:df58 with SMTP id wv7-20020a170907080700b00970071cdf58mr21443597ejb.42.1687821698824; Mon, 26 Jun 2023 16:21:38 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 14/16] target/riscv: Move sysemu-specific code to sysemu/cpu_helper.c Date: Tue, 27 Jun 2023 01:20:05 +0200 Message-Id: <20230626232007.8933-15-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::534; envelope-from=philmd@linaro.org; helo=mail-ed1-x534.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821762258100005 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu_helper.c | 859 +----------------------------- target/riscv/sysemu/cpu_helper.c | 863 +++++++++++++++++++++++++++++++ target/riscv/sysemu/meson.build | 1 + 3 files changed, 865 insertions(+), 858 deletions(-) create mode 100644 target/riscv/sysemu/cpu_helper.c diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index ded1fee489..075b1ae068 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -18,22 +18,12 @@ */ =20 #include "qemu/osdep.h" -#include "qemu/log.h" -#include "qemu/main-loop.h" #include "cpu.h" #include "internals.h" -#include "sysemu/pmu.h" -#include "exec/exec-all.h" -#include "sysemu/instmap.h" -#include "tcg/tcg-op.h" -#include "trace.h" -#include "semihosting/common-semi.h" #ifndef CONFIG_USER_ONLY #include "sysemu/cpu-timers.h" #endif -#include "cpu_bits.h" -#include "sysemu/debug.h" -#include "tcg/oversized-guest.h" + =20 int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch) { @@ -104,850 +94,3 @@ void riscv_cpu_update_mask(CPURISCVState *env) env->cur_pmbase =3D base; } } - -#ifndef CONFIG_USER_ONLY - -/* - * The HS-mode is allowed to configure priority only for the - * following VS-mode local interrupts: - * - * 0 (Reserved interrupt, reads as zero) - * 1 Supervisor software interrupt - * 4 (Reserved interrupt, reads as zero) - * 5 Supervisor timer interrupt - * 8 (Reserved interrupt, reads as zero) - * 13 (Reserved interrupt) - * 14 " - * 15 " - * 16 " - * 17 " - * 18 " - * 19 " - * 20 " - * 21 " - * 22 " - * 23 " - */ - -static const int hviprio_index2irq[] =3D { - 0, 1, 4, 5, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; -static const int hviprio_index2rdzero[] =3D { - 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - -int riscv_cpu_hviprio_index2irq(int index, int *out_irq, int *out_rdzero) -{ - if (index < 0 || ARRAY_SIZE(hviprio_index2irq) <=3D index) { - return -EINVAL; - } - - if (out_irq) { - *out_irq =3D hviprio_index2irq[index]; - } - - if (out_rdzero) { - *out_rdzero =3D hviprio_index2rdzero[index]; - } - - return 0; -} - -/* - * Default priorities of local interrupts are defined in the - * RISC-V Advanced Interrupt Architecture specification. - * - * ---------------------------------------------------------------- - * Default | - * Priority | Major Interrupt Numbers - * ---------------------------------------------------------------- - * Highest | 47, 23, 46, 45, 22, 44, - * | 43, 21, 42, 41, 20, 40 - * | - * | 11 (0b), 3 (03), 7 (07) - * | 9 (09), 1 (01), 5 (05) - * | 12 (0c) - * | 10 (0a), 2 (02), 6 (06) - * | - * | 39, 19, 38, 37, 18, 36, - * Lowest | 35, 17, 34, 33, 16, 32 - * ---------------------------------------------------------------- - */ -static const uint8_t default_iprio[64] =3D { - /* Custom interrupts 48 to 63 */ - [63] =3D IPRIO_MMAXIPRIO, - [62] =3D IPRIO_MMAXIPRIO, - [61] =3D IPRIO_MMAXIPRIO, - [60] =3D IPRIO_MMAXIPRIO, - [59] =3D IPRIO_MMAXIPRIO, - [58] =3D IPRIO_MMAXIPRIO, - [57] =3D IPRIO_MMAXIPRIO, - [56] =3D IPRIO_MMAXIPRIO, - [55] =3D IPRIO_MMAXIPRIO, - [54] =3D IPRIO_MMAXIPRIO, - [53] =3D IPRIO_MMAXIPRIO, - [52] =3D IPRIO_MMAXIPRIO, - [51] =3D IPRIO_MMAXIPRIO, - [50] =3D IPRIO_MMAXIPRIO, - [49] =3D IPRIO_MMAXIPRIO, - [48] =3D IPRIO_MMAXIPRIO, - - /* Custom interrupts 24 to 31 */ - [31] =3D IPRIO_MMAXIPRIO, - [30] =3D IPRIO_MMAXIPRIO, - [29] =3D IPRIO_MMAXIPRIO, - [28] =3D IPRIO_MMAXIPRIO, - [27] =3D IPRIO_MMAXIPRIO, - [26] =3D IPRIO_MMAXIPRIO, - [25] =3D IPRIO_MMAXIPRIO, - [24] =3D IPRIO_MMAXIPRIO, - - [47] =3D IPRIO_DEFAULT_UPPER, - [23] =3D IPRIO_DEFAULT_UPPER + 1, - [46] =3D IPRIO_DEFAULT_UPPER + 2, - [45] =3D IPRIO_DEFAULT_UPPER + 3, - [22] =3D IPRIO_DEFAULT_UPPER + 4, - [44] =3D IPRIO_DEFAULT_UPPER + 5, - - [43] =3D IPRIO_DEFAULT_UPPER + 6, - [21] =3D IPRIO_DEFAULT_UPPER + 7, - [42] =3D IPRIO_DEFAULT_UPPER + 8, - [41] =3D IPRIO_DEFAULT_UPPER + 9, - [20] =3D IPRIO_DEFAULT_UPPER + 10, - [40] =3D IPRIO_DEFAULT_UPPER + 11, - - [11] =3D IPRIO_DEFAULT_M, - [3] =3D IPRIO_DEFAULT_M + 1, - [7] =3D IPRIO_DEFAULT_M + 2, - - [9] =3D IPRIO_DEFAULT_S, - [1] =3D IPRIO_DEFAULT_S + 1, - [5] =3D IPRIO_DEFAULT_S + 2, - - [12] =3D IPRIO_DEFAULT_SGEXT, - - [10] =3D IPRIO_DEFAULT_VS, - [2] =3D IPRIO_DEFAULT_VS + 1, - [6] =3D IPRIO_DEFAULT_VS + 2, - - [39] =3D IPRIO_DEFAULT_LOWER, - [19] =3D IPRIO_DEFAULT_LOWER + 1, - [38] =3D IPRIO_DEFAULT_LOWER + 2, - [37] =3D IPRIO_DEFAULT_LOWER + 3, - [18] =3D IPRIO_DEFAULT_LOWER + 4, - [36] =3D IPRIO_DEFAULT_LOWER + 5, - - [35] =3D IPRIO_DEFAULT_LOWER + 6, - [17] =3D IPRIO_DEFAULT_LOWER + 7, - [34] =3D IPRIO_DEFAULT_LOWER + 8, - [33] =3D IPRIO_DEFAULT_LOWER + 9, - [16] =3D IPRIO_DEFAULT_LOWER + 10, - [32] =3D IPRIO_DEFAULT_LOWER + 11, -}; - -uint8_t riscv_cpu_default_priority(int irq) -{ - if (irq < 0 || irq > 63) { - return IPRIO_MMAXIPRIO; - } - - return default_iprio[irq] ? default_iprio[irq] : IPRIO_MMAXIPRIO; -}; - -int riscv_cpu_pending_to_irq(CPURISCVState *env, - int extirq, unsigned int extirq_def_prio, - uint64_t pending, uint8_t *iprio) -{ - int irq, best_irq =3D RISCV_EXCP_NONE; - unsigned int prio, best_prio =3D UINT_MAX; - - if (!pending) { - return RISCV_EXCP_NONE; - } - - irq =3D ctz64(pending); - if (!((extirq =3D=3D IRQ_M_EXT) ? riscv_cpu_cfg(env)->ext_smaia : - riscv_cpu_cfg(env)->ext_ssaia)) { - return irq; - } - - pending =3D pending >> irq; - while (pending) { - prio =3D iprio[irq]; - if (!prio) { - if (irq =3D=3D extirq) { - prio =3D extirq_def_prio; - } else { - prio =3D (riscv_cpu_default_priority(irq) < extirq_def_pri= o) ? - 1 : IPRIO_MMAXIPRIO; - } - } - if ((pending & 0x1) && (prio <=3D best_prio)) { - best_irq =3D irq; - best_prio =3D prio; - } - irq++; - pending =3D pending >> 1; - } - - return best_irq; -} - -uint64_t riscv_cpu_all_pending(CPURISCVState *env) -{ - uint32_t gein =3D get_field(env->hstatus, HSTATUS_VGEIN); - uint64_t vsgein =3D (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0; - uint64_t vstip =3D (env->vstime_irq) ? MIP_VSTIP : 0; - - return (env->mip | vsgein | vstip) & env->mie; -} - -int riscv_cpu_mirq_pending(CPURISCVState *env) -{ - uint64_t irqs =3D riscv_cpu_all_pending(env) & ~env->mideleg & - ~(MIP_SGEIP | MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); - - return riscv_cpu_pending_to_irq(env, IRQ_M_EXT, IPRIO_DEFAULT_M, - irqs, env->miprio); -} - -int riscv_cpu_sirq_pending(CPURISCVState *env) -{ - uint64_t irqs =3D riscv_cpu_all_pending(env) & env->mideleg & - ~(MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); - - return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, - irqs, env->siprio); -} - -int riscv_cpu_vsirq_pending(CPURISCVState *env) -{ - uint64_t irqs =3D riscv_cpu_all_pending(env) & env->mideleg & - (MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); - - return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, - irqs >> 1, env->hviprio); -} - -/* Return true is floating point support is currently enabled */ -bool riscv_cpu_fp_enabled(CPURISCVState *env) -{ - if (env->mstatus & MSTATUS_FS) { - if (env->virt_enabled && !(env->mstatus_hs & MSTATUS_FS)) { - return false; - } - return true; - } - - return false; -} - -/* Return true is vector support is currently enabled */ -bool riscv_cpu_vector_enabled(CPURISCVState *env) -{ - if (env->mstatus & MSTATUS_VS) { - if (env->virt_enabled && !(env->mstatus_hs & MSTATUS_VS)) { - return false; - } - return true; - } - - return false; -} - -void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env) -{ - uint64_t mstatus_mask =3D MSTATUS_MXR | MSTATUS_SUM | - MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_SIE | - MSTATUS64_UXL | MSTATUS_VS; - - if (riscv_has_ext(env, RVF)) { - mstatus_mask |=3D MSTATUS_FS; - } - bool current_virt =3D env->virt_enabled; - - g_assert(riscv_has_ext(env, RVH)); - - if (current_virt) { - /* Current V=3D1 and we are about to change to V=3D0 */ - env->vsstatus =3D env->mstatus & mstatus_mask; - env->mstatus &=3D ~mstatus_mask; - env->mstatus |=3D env->mstatus_hs; - - env->vstvec =3D env->stvec; - env->stvec =3D env->stvec_hs; - - env->vsscratch =3D env->sscratch; - env->sscratch =3D env->sscratch_hs; - - env->vsepc =3D env->sepc; - env->sepc =3D env->sepc_hs; - - env->vscause =3D env->scause; - env->scause =3D env->scause_hs; - - env->vstval =3D env->stval; - env->stval =3D env->stval_hs; - - env->vsatp =3D env->satp; - env->satp =3D env->satp_hs; - } else { - /* Current V=3D0 and we are about to change to V=3D1 */ - env->mstatus_hs =3D env->mstatus & mstatus_mask; - env->mstatus &=3D ~mstatus_mask; - env->mstatus |=3D env->vsstatus; - - env->stvec_hs =3D env->stvec; - env->stvec =3D env->vstvec; - - env->sscratch_hs =3D env->sscratch; - env->sscratch =3D env->vsscratch; - - env->sepc_hs =3D env->sepc; - env->sepc =3D env->vsepc; - - env->scause_hs =3D env->scause; - env->scause =3D env->vscause; - - env->stval_hs =3D env->stval; - env->stval =3D env->vstval; - - env->satp_hs =3D env->satp; - env->satp =3D env->vsatp; - } -} - -target_ulong riscv_cpu_get_geilen(CPURISCVState *env) -{ - if (!riscv_has_ext(env, RVH)) { - return 0; - } - - return env->geilen; -} - -void riscv_cpu_set_geilen(CPURISCVState *env, target_ulong geilen) -{ - if (!riscv_has_ext(env, RVH)) { - return; - } - - if (geilen > (TARGET_LONG_BITS - 1)) { - return; - } - - env->geilen =3D geilen; -} - -/* This function can only be called to set virt when RVH is enabled */ -void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable) -{ - /* Flush the TLB on all virt mode changes. */ - if (env->virt_enabled !=3D enable) { - tlb_flush(env_cpu(env)); - } - - env->virt_enabled =3D enable; - - if (enable) { - /* - * The guest external interrupts from an interrupt controller are - * delivered only when the Guest/VM is running (i.e. V=3D1). This = means - * any guest external interrupt which is triggered while the Guest= /VM - * is not running (i.e. V=3D0) will be missed on QEMU resulting in= guest - * with sluggish response to serial console input and other I/O ev= ents. - * - * To solve this, we check and inject interrupt after setting V=3D= 1. - */ - riscv_cpu_update_mip(env, 0, 0); - } -} - -int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint64_t interrupts) -{ - CPURISCVState *env =3D &cpu->env; - if (env->miclaim & interrupts) { - return -1; - } else { - env->miclaim |=3D interrupts; - return 0; - } -} - -uint64_t riscv_cpu_update_mip(CPURISCVState *env, uint64_t mask, - uint64_t value) -{ - CPUState *cs =3D env_cpu(env); - uint64_t gein, vsgein =3D 0, vstip =3D 0, old =3D env->mip; - - if (env->virt_enabled) { - gein =3D get_field(env->hstatus, HSTATUS_VGEIN); - vsgein =3D (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0; - } - - vstip =3D env->vstime_irq ? MIP_VSTIP : 0; - - QEMU_IOTHREAD_LOCK_GUARD(); - - env->mip =3D (env->mip & ~mask) | (value & mask); - - if (env->mip | vsgein | vstip) { - cpu_interrupt(cs, CPU_INTERRUPT_HARD); - } else { - cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); - } - - return old; -} - -void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(void *), - void *arg) -{ - env->rdtime_fn =3D fn; - env->rdtime_fn_arg =3D arg; -} - -void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, uint32_t priv, - int (*rmw_fn)(void *arg, - target_ulong reg, - target_ulong *val, - target_ulong new_val, - target_ulong write_mask), - void *rmw_fn_arg) -{ - if (priv <=3D PRV_M) { - env->aia_ireg_rmw_fn[priv] =3D rmw_fn; - env->aia_ireg_rmw_fn_arg[priv] =3D rmw_fn_arg; - } -} - -void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv) -{ - g_assert(newpriv <=3D PRV_M && newpriv !=3D PRV_RESERVED); - - if (icount_enabled() && newpriv !=3D env->priv) { - riscv_itrigger_update_priv(env); - } - /* tlb_flush is unnecessary as mode is contained in mmu_idx */ - env->priv =3D newpriv; - env->xl =3D cpu_recompute_xl(env); - riscv_cpu_update_mask(env); - - /* - * Clear the load reservation - otherwise a reservation placed in one - * context/process can be used by another, resulting in an SC succeedi= ng - * incorrectly. Version 2.2 of the ISA specification explicitly requir= es - * this behaviour, while later revisions say that the kernel "should" = use - * an SC instruction to force the yielding of a load reservation on a - * preemptive context switch. As a result, do both. - */ - env->load_res =3D -1; -} - - -static target_ulong riscv_transformed_insn(CPURISCVState *env, - target_ulong insn, - target_ulong taddr) -{ - target_ulong xinsn =3D 0; - target_ulong access_rs1 =3D 0, access_imm =3D 0, access_size =3D 0; - - /* - * Only Quadrant 0 and Quadrant 2 of RVC instruction space need to - * be uncompressed. The Quadrant 1 of RVC instruction space need - * not be transformed because these instructions won't generate - * any load/store trap. - */ - - if ((insn & 0x3) !=3D 0x3) { - /* Transform 16bit instruction into 32bit instruction */ - switch (GET_C_OP(insn)) { - case OPC_RISC_C_OP_QUAD0: /* Quadrant 0 */ - switch (GET_C_FUNC(insn)) { - case OPC_RISC_C_FUNC_FLD_LQ: - if (riscv_cpu_xlen(env) !=3D 128) { /* C.FLD (RV32/64) */ - xinsn =3D OPC_RISC_FLD; - xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_LD_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_LW: /* C.LW */ - xinsn =3D OPC_RISC_LW; - xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_LW_IMM(insn); - access_size =3D 4; - break; - case OPC_RISC_C_FUNC_FLW_LD: - if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FLW (RV32) */ - xinsn =3D OPC_RISC_FLW; - xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_LW_IMM(insn); - access_size =3D 4; - } else { /* C.LD (RV64/RV128) */ - xinsn =3D OPC_RISC_LD; - xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_LD_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_FSD_SQ: - if (riscv_cpu_xlen(env) !=3D 128) { /* C.FSD (RV32/64) */ - xinsn =3D OPC_RISC_FSD; - xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_SD_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_SW: /* C.SW */ - xinsn =3D OPC_RISC_SW; - xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_SW_IMM(insn); - access_size =3D 4; - break; - case OPC_RISC_C_FUNC_FSW_SD: - if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FSW (RV32) */ - xinsn =3D OPC_RISC_FSW; - xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_SW_IMM(insn); - access_size =3D 4; - } else { /* C.SD (RV64/RV128) */ - xinsn =3D OPC_RISC_SD; - xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); - access_rs1 =3D GET_C_RS1S(insn); - access_imm =3D GET_C_SD_IMM(insn); - access_size =3D 8; - } - break; - default: - break; - } - break; - case OPC_RISC_C_OP_QUAD2: /* Quadrant 2 */ - switch (GET_C_FUNC(insn)) { - case OPC_RISC_C_FUNC_FLDSP_LQSP: - if (riscv_cpu_xlen(env) !=3D 128) { /* C.FLDSP (RV32/64) */ - xinsn =3D OPC_RISC_FLD; - xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_LDSP_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_LWSP: /* C.LWSP */ - xinsn =3D OPC_RISC_LW; - xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_LWSP_IMM(insn); - access_size =3D 4; - break; - case OPC_RISC_C_FUNC_FLWSP_LDSP: - if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FLWSP (RV32) */ - xinsn =3D OPC_RISC_FLW; - xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_LWSP_IMM(insn); - access_size =3D 4; - } else { /* C.LDSP (RV64/RV128) */ - xinsn =3D OPC_RISC_LD; - xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_LDSP_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_FSDSP_SQSP: - if (riscv_cpu_xlen(env) !=3D 128) { /* C.FSDSP (RV32/64) */ - xinsn =3D OPC_RISC_FSD; - xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_SDSP_IMM(insn); - access_size =3D 8; - } - break; - case OPC_RISC_C_FUNC_SWSP: /* C.SWSP */ - xinsn =3D OPC_RISC_SW; - xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_SWSP_IMM(insn); - access_size =3D 4; - break; - case 7: - if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FSWSP (RV32) */ - xinsn =3D OPC_RISC_FSW; - xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_SWSP_IMM(insn); - access_size =3D 4; - } else { /* C.SDSP (RV64/RV128) */ - xinsn =3D OPC_RISC_SD; - xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); - access_rs1 =3D 2; - access_imm =3D GET_C_SDSP_IMM(insn); - access_size =3D 8; - } - break; - default: - break; - } - break; - default: - break; - } - - /* - * Clear Bit1 of transformed instruction to indicate that - * original insruction was a 16bit instruction - */ - xinsn &=3D ~((target_ulong)0x2); - } else { - /* Transform 32bit (or wider) instructions */ - switch (MASK_OP_MAJOR(insn)) { - case OPC_RISC_ATOMIC: - xinsn =3D insn; - access_rs1 =3D GET_RS1(insn); - access_size =3D 1 << GET_FUNCT3(insn); - break; - case OPC_RISC_LOAD: - case OPC_RISC_FP_LOAD: - xinsn =3D SET_I_IMM(insn, 0); - access_rs1 =3D GET_RS1(insn); - access_imm =3D GET_IMM(insn); - access_size =3D 1 << GET_FUNCT3(insn); - break; - case OPC_RISC_STORE: - case OPC_RISC_FP_STORE: - xinsn =3D SET_S_IMM(insn, 0); - access_rs1 =3D GET_RS1(insn); - access_imm =3D GET_STORE_IMM(insn); - access_size =3D 1 << GET_FUNCT3(insn); - break; - case OPC_RISC_SYSTEM: - if (MASK_OP_SYSTEM(insn) =3D=3D OPC_RISC_HLVHSV) { - xinsn =3D insn; - access_rs1 =3D GET_RS1(insn); - access_size =3D 1 << ((GET_FUNCT7(insn) >> 1) & 0x3); - access_size =3D 1 << access_size; - } - break; - default: - break; - } - } - - if (access_size) { - xinsn =3D SET_RS1(xinsn, (taddr - (env->gpr[access_rs1] + access_i= mm)) & - (access_size - 1)); - } - - return xinsn; -} - -/* - * Handle Traps - * - * Adapted from Spike's processor_t::take_trap. - * - */ -void riscv_cpu_do_interrupt(CPUState *cs) -{ - RISCVCPU *cpu =3D RISCV_CPU(cs); - CPURISCVState *env =3D &cpu->env; - bool write_gva =3D false; - uint64_t s; - - /* - * cs->exception is 32-bits wide unlike mcause which is XLEN-bits wide - * so we mask off the MSB and separate into trap type and cause. - */ - bool async =3D !!(cs->exception_index & RISCV_EXCP_INT_FLAG); - target_ulong cause =3D cs->exception_index & RISCV_EXCP_INT_MASK; - uint64_t deleg =3D async ? env->mideleg : env->medeleg; - target_ulong tval =3D 0; - target_ulong tinst =3D 0; - target_ulong htval =3D 0; - target_ulong mtval2 =3D 0; - - if (cause =3D=3D RISCV_EXCP_SEMIHOST) { - do_common_semihosting(cs); - env->pc +=3D 4; - return; - } - - if (!async) { - /* set tval to badaddr for traps with address information */ - switch (cause) { - case RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT: - case RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT: - case RISCV_EXCP_LOAD_ADDR_MIS: - case RISCV_EXCP_STORE_AMO_ADDR_MIS: - case RISCV_EXCP_LOAD_ACCESS_FAULT: - case RISCV_EXCP_STORE_AMO_ACCESS_FAULT: - case RISCV_EXCP_LOAD_PAGE_FAULT: - case RISCV_EXCP_STORE_PAGE_FAULT: - write_gva =3D env->two_stage_lookup; - tval =3D env->badaddr; - if (env->two_stage_indirect_lookup) { - /* - * special pseudoinstruction for G-stage fault taken while - * doing VS-stage page table walk. - */ - tinst =3D (riscv_cpu_xlen(env) =3D=3D 32) ? 0x00002000 : 0= x00003000; - } else { - /* - * The "Addr. Offset" field in transformed instruction is - * non-zero only for misaligned access. - */ - tinst =3D riscv_transformed_insn(env, env->bins, tval); - } - break; - case RISCV_EXCP_INST_GUEST_PAGE_FAULT: - case RISCV_EXCP_INST_ADDR_MIS: - case RISCV_EXCP_INST_ACCESS_FAULT: - case RISCV_EXCP_INST_PAGE_FAULT: - write_gva =3D env->two_stage_lookup; - tval =3D env->badaddr; - if (env->two_stage_indirect_lookup) { - /* - * special pseudoinstruction for G-stage fault taken while - * doing VS-stage page table walk. - */ - tinst =3D (riscv_cpu_xlen(env) =3D=3D 32) ? 0x00002000 : 0= x00003000; - } - break; - case RISCV_EXCP_ILLEGAL_INST: - case RISCV_EXCP_VIRT_INSTRUCTION_FAULT: - tval =3D env->bins; - break; - case RISCV_EXCP_BREAKPOINT: - if (cs->watchpoint_hit) { - tval =3D cs->watchpoint_hit->hitaddr; - cs->watchpoint_hit =3D NULL; - } - break; - default: - break; - } - /* ecall is dispatched as one cause so translate based on mode */ - if (cause =3D=3D RISCV_EXCP_U_ECALL) { - assert(env->priv <=3D 3); - - if (env->priv =3D=3D PRV_M) { - cause =3D RISCV_EXCP_M_ECALL; - } else if (env->priv =3D=3D PRV_S && env->virt_enabled) { - cause =3D RISCV_EXCP_VS_ECALL; - } else if (env->priv =3D=3D PRV_S && !env->virt_enabled) { - cause =3D RISCV_EXCP_S_ECALL; - } else if (env->priv =3D=3D PRV_U) { - cause =3D RISCV_EXCP_U_ECALL; - } - } - } - - trace_riscv_trap(env->mhartid, async, cause, env->pc, tval, - riscv_cpu_get_trap_name(cause, async)); - - qemu_log_mask(CPU_LOG_INT, - "%s: hart:"TARGET_FMT_ld", async:%d, cause:"TARGET_FMT_l= x", " - "epc:0x"TARGET_FMT_lx", tval:0x"TARGET_FMT_lx", desc=3D%= s\n", - __func__, env->mhartid, async, cause, env->pc, tval, - riscv_cpu_get_trap_name(cause, async)); - - if (env->priv <=3D PRV_S && - cause < TARGET_LONG_BITS && ((deleg >> cause) & 1)) { - /* handle the trap in S-mode */ - if (riscv_has_ext(env, RVH)) { - uint64_t hdeleg =3D async ? env->hideleg : env->hedeleg; - - if (env->virt_enabled && ((hdeleg >> cause) & 1)) { - /* Trap to VS mode */ - /* - * See if we need to adjust cause. Yes if its VS mode inte= rrupt - * no if hypervisor has delegated one of hs mode's interru= pt - */ - if (cause =3D=3D IRQ_VS_TIMER || cause =3D=3D IRQ_VS_SOFT = || - cause =3D=3D IRQ_VS_EXT) { - cause =3D cause - 1; - } - write_gva =3D false; - } else if (env->virt_enabled) { - /* Trap into HS mode, from virt */ - riscv_cpu_swap_hypervisor_regs(env); - env->hstatus =3D set_field(env->hstatus, HSTATUS_SPVP, - env->priv); - env->hstatus =3D set_field(env->hstatus, HSTATUS_SPV, true= ); - - htval =3D env->guest_phys_fault_addr; - - riscv_cpu_set_virt_enabled(env, 0); - } else { - /* Trap into HS mode */ - env->hstatus =3D set_field(env->hstatus, HSTATUS_SPV, fals= e); - htval =3D env->guest_phys_fault_addr; - } - env->hstatus =3D set_field(env->hstatus, HSTATUS_GVA, write_gv= a); - } - - s =3D env->mstatus; - s =3D set_field(s, MSTATUS_SPIE, get_field(s, MSTATUS_SIE)); - s =3D set_field(s, MSTATUS_SPP, env->priv); - s =3D set_field(s, MSTATUS_SIE, 0); - env->mstatus =3D s; - env->scause =3D cause | ((target_ulong)async << (TARGET_LONG_BITS = - 1)); - env->sepc =3D env->pc; - env->stval =3D tval; - env->htval =3D htval; - env->htinst =3D tinst; - env->pc =3D (env->stvec >> 2 << 2) + - ((async && (env->stvec & 3) =3D=3D 1) ? cause * 4 : 0); - riscv_cpu_set_mode(env, PRV_S); - } else { - /* handle the trap in M-mode */ - if (riscv_has_ext(env, RVH)) { - if (env->virt_enabled) { - riscv_cpu_swap_hypervisor_regs(env); - } - env->mstatus =3D set_field(env->mstatus, MSTATUS_MPV, - env->virt_enabled); - if (env->virt_enabled && tval) { - env->mstatus =3D set_field(env->mstatus, MSTATUS_GVA, 1); - } - - mtval2 =3D env->guest_phys_fault_addr; - - /* Trapping to M mode, virt is disabled */ - riscv_cpu_set_virt_enabled(env, 0); - } - - s =3D env->mstatus; - s =3D set_field(s, MSTATUS_MPIE, get_field(s, MSTATUS_MIE)); - s =3D set_field(s, MSTATUS_MPP, env->priv); - s =3D set_field(s, MSTATUS_MIE, 0); - env->mstatus =3D s; - env->mcause =3D cause | ~(((target_ulong)-1) >> async); - env->mepc =3D env->pc; - env->mtval =3D tval; - env->mtval2 =3D mtval2; - env->mtinst =3D tinst; - env->pc =3D (env->mtvec >> 2 << 2) + - ((async && (env->mtvec & 3) =3D=3D 1) ? cause * 4 : 0); - riscv_cpu_set_mode(env, PRV_M); - } - - /* - * NOTE: it is not necessary to yield load reservations here. It is on= ly - * necessary for an SC from "another hart" to cause a load reservation - * to be yielded. Refer to the memory consistency model section of the - * RISC-V ISA Specification. - */ - - env->two_stage_lookup =3D false; - env->two_stage_indirect_lookup =3D false; -} - -#endif /* !CONFIG_USER_ONLY */ diff --git a/target/riscv/sysemu/cpu_helper.c b/target/riscv/sysemu/cpu_hel= per.c new file mode 100644 index 0000000000..05a6b834fa --- /dev/null +++ b/target/riscv/sysemu/cpu_helper.c @@ -0,0 +1,863 @@ +/* + * RISC-V CPU system helpers for QEMU. + * + * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu + * Copyright (c) 2017-2018 SiFive, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qemu/main-loop.h" +#include "exec/exec-all.h" +#include "cpu.h" +#include "internals.h" +#include "sysemu/cpu-timers.h" +#include "sysemu/pmu.h" +#include "sysemu/instmap.h" +#include "semihosting/common-semi.h" +#include "trace.h" + + +/* + * The HS-mode is allowed to configure priority only for the + * following VS-mode local interrupts: + * + * 0 (Reserved interrupt, reads as zero) + * 1 Supervisor software interrupt + * 4 (Reserved interrupt, reads as zero) + * 5 Supervisor timer interrupt + * 8 (Reserved interrupt, reads as zero) + * 13 (Reserved interrupt) + * 14 " + * 15 " + * 16 " + * 17 " + * 18 " + * 19 " + * 20 " + * 21 " + * 22 " + * 23 " + */ + +static const int hviprio_index2irq[] =3D { + 0, 1, 4, 5, 8, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; +static const int hviprio_index2rdzero[] =3D { + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +int riscv_cpu_hviprio_index2irq(int index, int *out_irq, int *out_rdzero) +{ + if (index < 0 || ARRAY_SIZE(hviprio_index2irq) <=3D index) { + return -EINVAL; + } + + if (out_irq) { + *out_irq =3D hviprio_index2irq[index]; + } + + if (out_rdzero) { + *out_rdzero =3D hviprio_index2rdzero[index]; + } + + return 0; +} + +/* + * Default priorities of local interrupts are defined in the + * RISC-V Advanced Interrupt Architecture specification. + * + * ---------------------------------------------------------------- + * Default | + * Priority | Major Interrupt Numbers + * ---------------------------------------------------------------- + * Highest | 47, 23, 46, 45, 22, 44, + * | 43, 21, 42, 41, 20, 40 + * | + * | 11 (0b), 3 (03), 7 (07) + * | 9 (09), 1 (01), 5 (05) + * | 12 (0c) + * | 10 (0a), 2 (02), 6 (06) + * | + * | 39, 19, 38, 37, 18, 36, + * Lowest | 35, 17, 34, 33, 16, 32 + * ---------------------------------------------------------------- + */ +static const uint8_t default_iprio[64] =3D { + /* Custom interrupts 48 to 63 */ + [63] =3D IPRIO_MMAXIPRIO, + [62] =3D IPRIO_MMAXIPRIO, + [61] =3D IPRIO_MMAXIPRIO, + [60] =3D IPRIO_MMAXIPRIO, + [59] =3D IPRIO_MMAXIPRIO, + [58] =3D IPRIO_MMAXIPRIO, + [57] =3D IPRIO_MMAXIPRIO, + [56] =3D IPRIO_MMAXIPRIO, + [55] =3D IPRIO_MMAXIPRIO, + [54] =3D IPRIO_MMAXIPRIO, + [53] =3D IPRIO_MMAXIPRIO, + [52] =3D IPRIO_MMAXIPRIO, + [51] =3D IPRIO_MMAXIPRIO, + [50] =3D IPRIO_MMAXIPRIO, + [49] =3D IPRIO_MMAXIPRIO, + [48] =3D IPRIO_MMAXIPRIO, + + /* Custom interrupts 24 to 31 */ + [31] =3D IPRIO_MMAXIPRIO, + [30] =3D IPRIO_MMAXIPRIO, + [29] =3D IPRIO_MMAXIPRIO, + [28] =3D IPRIO_MMAXIPRIO, + [27] =3D IPRIO_MMAXIPRIO, + [26] =3D IPRIO_MMAXIPRIO, + [25] =3D IPRIO_MMAXIPRIO, + [24] =3D IPRIO_MMAXIPRIO, + + [47] =3D IPRIO_DEFAULT_UPPER, + [23] =3D IPRIO_DEFAULT_UPPER + 1, + [46] =3D IPRIO_DEFAULT_UPPER + 2, + [45] =3D IPRIO_DEFAULT_UPPER + 3, + [22] =3D IPRIO_DEFAULT_UPPER + 4, + [44] =3D IPRIO_DEFAULT_UPPER + 5, + + [43] =3D IPRIO_DEFAULT_UPPER + 6, + [21] =3D IPRIO_DEFAULT_UPPER + 7, + [42] =3D IPRIO_DEFAULT_UPPER + 8, + [41] =3D IPRIO_DEFAULT_UPPER + 9, + [20] =3D IPRIO_DEFAULT_UPPER + 10, + [40] =3D IPRIO_DEFAULT_UPPER + 11, + + [11] =3D IPRIO_DEFAULT_M, + [3] =3D IPRIO_DEFAULT_M + 1, + [7] =3D IPRIO_DEFAULT_M + 2, + + [9] =3D IPRIO_DEFAULT_S, + [1] =3D IPRIO_DEFAULT_S + 1, + [5] =3D IPRIO_DEFAULT_S + 2, + + [12] =3D IPRIO_DEFAULT_SGEXT, + + [10] =3D IPRIO_DEFAULT_VS, + [2] =3D IPRIO_DEFAULT_VS + 1, + [6] =3D IPRIO_DEFAULT_VS + 2, + + [39] =3D IPRIO_DEFAULT_LOWER, + [19] =3D IPRIO_DEFAULT_LOWER + 1, + [38] =3D IPRIO_DEFAULT_LOWER + 2, + [37] =3D IPRIO_DEFAULT_LOWER + 3, + [18] =3D IPRIO_DEFAULT_LOWER + 4, + [36] =3D IPRIO_DEFAULT_LOWER + 5, + + [35] =3D IPRIO_DEFAULT_LOWER + 6, + [17] =3D IPRIO_DEFAULT_LOWER + 7, + [34] =3D IPRIO_DEFAULT_LOWER + 8, + [33] =3D IPRIO_DEFAULT_LOWER + 9, + [16] =3D IPRIO_DEFAULT_LOWER + 10, + [32] =3D IPRIO_DEFAULT_LOWER + 11, +}; + +uint8_t riscv_cpu_default_priority(int irq) +{ + if (irq < 0 || irq > 63) { + return IPRIO_MMAXIPRIO; + } + + return default_iprio[irq] ? default_iprio[irq] : IPRIO_MMAXIPRIO; +}; + +int riscv_cpu_pending_to_irq(CPURISCVState *env, + int extirq, unsigned int extirq_def_prio, + uint64_t pending, uint8_t *iprio) +{ + int irq, best_irq =3D RISCV_EXCP_NONE; + unsigned int prio, best_prio =3D UINT_MAX; + + if (!pending) { + return RISCV_EXCP_NONE; + } + + irq =3D ctz64(pending); + if (!((extirq =3D=3D IRQ_M_EXT) ? riscv_cpu_cfg(env)->ext_smaia : + riscv_cpu_cfg(env)->ext_ssaia)) { + return irq; + } + + pending =3D pending >> irq; + while (pending) { + prio =3D iprio[irq]; + if (!prio) { + if (irq =3D=3D extirq) { + prio =3D extirq_def_prio; + } else { + prio =3D (riscv_cpu_default_priority(irq) < extirq_def_pri= o) ? + 1 : IPRIO_MMAXIPRIO; + } + } + if ((pending & 0x1) && (prio <=3D best_prio)) { + best_irq =3D irq; + best_prio =3D prio; + } + irq++; + pending =3D pending >> 1; + } + + return best_irq; +} + +uint64_t riscv_cpu_all_pending(CPURISCVState *env) +{ + uint32_t gein =3D get_field(env->hstatus, HSTATUS_VGEIN); + uint64_t vsgein =3D (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0; + uint64_t vstip =3D (env->vstime_irq) ? MIP_VSTIP : 0; + + return (env->mip | vsgein | vstip) & env->mie; +} + +int riscv_cpu_mirq_pending(CPURISCVState *env) +{ + uint64_t irqs =3D riscv_cpu_all_pending(env) & ~env->mideleg & + ~(MIP_SGEIP | MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); + + return riscv_cpu_pending_to_irq(env, IRQ_M_EXT, IPRIO_DEFAULT_M, + irqs, env->miprio); +} + +int riscv_cpu_sirq_pending(CPURISCVState *env) +{ + uint64_t irqs =3D riscv_cpu_all_pending(env) & env->mideleg & + ~(MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); + + return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, + irqs, env->siprio); +} + +int riscv_cpu_vsirq_pending(CPURISCVState *env) +{ + uint64_t irqs =3D riscv_cpu_all_pending(env) & env->mideleg & + (MIP_VSSIP | MIP_VSTIP | MIP_VSEIP); + + return riscv_cpu_pending_to_irq(env, IRQ_S_EXT, IPRIO_DEFAULT_S, + irqs >> 1, env->hviprio); +} + +/* Return true is floating point support is currently enabled */ +bool riscv_cpu_fp_enabled(CPURISCVState *env) +{ + if (env->mstatus & MSTATUS_FS) { + if (env->virt_enabled && !(env->mstatus_hs & MSTATUS_FS)) { + return false; + } + return true; + } + + return false; +} + +/* Return true is vector support is currently enabled */ +bool riscv_cpu_vector_enabled(CPURISCVState *env) +{ + if (env->mstatus & MSTATUS_VS) { + if (env->virt_enabled && !(env->mstatus_hs & MSTATUS_VS)) { + return false; + } + return true; + } + + return false; +} + +void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env) +{ + uint64_t mstatus_mask =3D MSTATUS_MXR | MSTATUS_SUM | + MSTATUS_SPP | MSTATUS_SPIE | MSTATUS_SIE | + MSTATUS64_UXL | MSTATUS_VS; + + if (riscv_has_ext(env, RVF)) { + mstatus_mask |=3D MSTATUS_FS; + } + bool current_virt =3D env->virt_enabled; + + g_assert(riscv_has_ext(env, RVH)); + + if (current_virt) { + /* Current V=3D1 and we are about to change to V=3D0 */ + env->vsstatus =3D env->mstatus & mstatus_mask; + env->mstatus &=3D ~mstatus_mask; + env->mstatus |=3D env->mstatus_hs; + + env->vstvec =3D env->stvec; + env->stvec =3D env->stvec_hs; + + env->vsscratch =3D env->sscratch; + env->sscratch =3D env->sscratch_hs; + + env->vsepc =3D env->sepc; + env->sepc =3D env->sepc_hs; + + env->vscause =3D env->scause; + env->scause =3D env->scause_hs; + + env->vstval =3D env->stval; + env->stval =3D env->stval_hs; + + env->vsatp =3D env->satp; + env->satp =3D env->satp_hs; + } else { + /* Current V=3D0 and we are about to change to V=3D1 */ + env->mstatus_hs =3D env->mstatus & mstatus_mask; + env->mstatus &=3D ~mstatus_mask; + env->mstatus |=3D env->vsstatus; + + env->stvec_hs =3D env->stvec; + env->stvec =3D env->vstvec; + + env->sscratch_hs =3D env->sscratch; + env->sscratch =3D env->vsscratch; + + env->sepc_hs =3D env->sepc; + env->sepc =3D env->vsepc; + + env->scause_hs =3D env->scause; + env->scause =3D env->vscause; + + env->stval_hs =3D env->stval; + env->stval =3D env->vstval; + + env->satp_hs =3D env->satp; + env->satp =3D env->vsatp; + } +} + +target_ulong riscv_cpu_get_geilen(CPURISCVState *env) +{ + if (!riscv_has_ext(env, RVH)) { + return 0; + } + + return env->geilen; +} + +void riscv_cpu_set_geilen(CPURISCVState *env, target_ulong geilen) +{ + if (!riscv_has_ext(env, RVH)) { + return; + } + + if (geilen > (TARGET_LONG_BITS - 1)) { + return; + } + + env->geilen =3D geilen; +} + +/* This function can only be called to set virt when RVH is enabled */ +void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable) +{ + /* Flush the TLB on all virt mode changes. */ + if (env->virt_enabled !=3D enable) { + tlb_flush(env_cpu(env)); + } + + env->virt_enabled =3D enable; + + if (enable) { + /* + * The guest external interrupts from an interrupt controller are + * delivered only when the Guest/VM is running (i.e. V=3D1). This = means + * any guest external interrupt which is triggered while the Guest= /VM + * is not running (i.e. V=3D0) will be missed on QEMU resulting in= guest + * with sluggish response to serial console input and other I/O ev= ents. + * + * To solve this, we check and inject interrupt after setting V=3D= 1. + */ + riscv_cpu_update_mip(env, 0, 0); + } +} + +int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint64_t interrupts) +{ + CPURISCVState *env =3D &cpu->env; + if (env->miclaim & interrupts) { + return -1; + } else { + env->miclaim |=3D interrupts; + return 0; + } +} + +uint64_t riscv_cpu_update_mip(CPURISCVState *env, uint64_t mask, + uint64_t value) +{ + CPUState *cs =3D env_cpu(env); + uint64_t gein, vsgein =3D 0, vstip =3D 0, old =3D env->mip; + + if (env->virt_enabled) { + gein =3D get_field(env->hstatus, HSTATUS_VGEIN); + vsgein =3D (env->hgeip & (1ULL << gein)) ? MIP_VSEIP : 0; + } + + vstip =3D env->vstime_irq ? MIP_VSTIP : 0; + + QEMU_IOTHREAD_LOCK_GUARD(); + + env->mip =3D (env->mip & ~mask) | (value & mask); + + if (env->mip | vsgein | vstip) { + cpu_interrupt(cs, CPU_INTERRUPT_HARD); + } else { + cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); + } + + return old; +} + +void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(void *), + void *arg) +{ + env->rdtime_fn =3D fn; + env->rdtime_fn_arg =3D arg; +} + +void riscv_cpu_set_aia_ireg_rmw_fn(CPURISCVState *env, uint32_t priv, + int (*rmw_fn)(void *arg, + target_ulong reg, + target_ulong *val, + target_ulong new_val, + target_ulong write_mask), + void *rmw_fn_arg) +{ + if (priv <=3D PRV_M) { + env->aia_ireg_rmw_fn[priv] =3D rmw_fn; + env->aia_ireg_rmw_fn_arg[priv] =3D rmw_fn_arg; + } +} + +void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv) +{ + g_assert(newpriv <=3D PRV_M && newpriv !=3D PRV_RESERVED); + + if (icount_enabled() && newpriv !=3D env->priv) { + riscv_itrigger_update_priv(env); + } + /* tlb_flush is unnecessary as mode is contained in mmu_idx */ + env->priv =3D newpriv; + env->xl =3D cpu_recompute_xl(env); + riscv_cpu_update_mask(env); + + /* + * Clear the load reservation - otherwise a reservation placed in one + * context/process can be used by another, resulting in an SC succeedi= ng + * incorrectly. Version 2.2 of the ISA specification explicitly requir= es + * this behaviour, while later revisions say that the kernel "should" = use + * an SC instruction to force the yielding of a load reservation on a + * preemptive context switch. As a result, do both. + */ + env->load_res =3D -1; +} + +static target_ulong riscv_transformed_insn(CPURISCVState *env, + target_ulong insn, + target_ulong taddr) +{ + target_ulong xinsn =3D 0; + target_ulong access_rs1 =3D 0, access_imm =3D 0, access_size =3D 0; + + /* + * Only Quadrant 0 and Quadrant 2 of RVC instruction space need to + * be uncompressed. The Quadrant 1 of RVC instruction space need + * not be transformed because these instructions won't generate + * any load/store trap. + */ + + if ((insn & 0x3) !=3D 0x3) { + /* Transform 16bit instruction into 32bit instruction */ + switch (GET_C_OP(insn)) { + case OPC_RISC_C_OP_QUAD0: /* Quadrant 0 */ + switch (GET_C_FUNC(insn)) { + case OPC_RISC_C_FUNC_FLD_LQ: + if (riscv_cpu_xlen(env) !=3D 128) { /* C.FLD (RV32/64) */ + xinsn =3D OPC_RISC_FLD; + xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_LD_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_LW: /* C.LW */ + xinsn =3D OPC_RISC_LW; + xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_LW_IMM(insn); + access_size =3D 4; + break; + case OPC_RISC_C_FUNC_FLW_LD: + if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FLW (RV32) */ + xinsn =3D OPC_RISC_FLW; + xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_LW_IMM(insn); + access_size =3D 4; + } else { /* C.LD (RV64/RV128) */ + xinsn =3D OPC_RISC_LD; + xinsn =3D SET_RD(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_LD_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_FSD_SQ: + if (riscv_cpu_xlen(env) !=3D 128) { /* C.FSD (RV32/64) */ + xinsn =3D OPC_RISC_FSD; + xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_SD_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_SW: /* C.SW */ + xinsn =3D OPC_RISC_SW; + xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_SW_IMM(insn); + access_size =3D 4; + break; + case OPC_RISC_C_FUNC_FSW_SD: + if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FSW (RV32) */ + xinsn =3D OPC_RISC_FSW; + xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_SW_IMM(insn); + access_size =3D 4; + } else { /* C.SD (RV64/RV128) */ + xinsn =3D OPC_RISC_SD; + xinsn =3D SET_RS2(xinsn, GET_C_RS2S(insn)); + access_rs1 =3D GET_C_RS1S(insn); + access_imm =3D GET_C_SD_IMM(insn); + access_size =3D 8; + } + break; + default: + break; + } + break; + case OPC_RISC_C_OP_QUAD2: /* Quadrant 2 */ + switch (GET_C_FUNC(insn)) { + case OPC_RISC_C_FUNC_FLDSP_LQSP: + if (riscv_cpu_xlen(env) !=3D 128) { /* C.FLDSP (RV32/64) */ + xinsn =3D OPC_RISC_FLD; + xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_LDSP_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_LWSP: /* C.LWSP */ + xinsn =3D OPC_RISC_LW; + xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_LWSP_IMM(insn); + access_size =3D 4; + break; + case OPC_RISC_C_FUNC_FLWSP_LDSP: + if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FLWSP (RV32) */ + xinsn =3D OPC_RISC_FLW; + xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_LWSP_IMM(insn); + access_size =3D 4; + } else { /* C.LDSP (RV64/RV128) */ + xinsn =3D OPC_RISC_LD; + xinsn =3D SET_RD(xinsn, GET_C_RD(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_LDSP_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_FSDSP_SQSP: + if (riscv_cpu_xlen(env) !=3D 128) { /* C.FSDSP (RV32/64) */ + xinsn =3D OPC_RISC_FSD; + xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_SDSP_IMM(insn); + access_size =3D 8; + } + break; + case OPC_RISC_C_FUNC_SWSP: /* C.SWSP */ + xinsn =3D OPC_RISC_SW; + xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_SWSP_IMM(insn); + access_size =3D 4; + break; + case 7: + if (riscv_cpu_xlen(env) =3D=3D 32) { /* C.FSWSP (RV32) */ + xinsn =3D OPC_RISC_FSW; + xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_SWSP_IMM(insn); + access_size =3D 4; + } else { /* C.SDSP (RV64/RV128) */ + xinsn =3D OPC_RISC_SD; + xinsn =3D SET_RS2(xinsn, GET_C_RS2(insn)); + access_rs1 =3D 2; + access_imm =3D GET_C_SDSP_IMM(insn); + access_size =3D 8; + } + break; + default: + break; + } + break; + default: + break; + } + + /* + * Clear Bit1 of transformed instruction to indicate that + * original insruction was a 16bit instruction + */ + xinsn &=3D ~((target_ulong)0x2); + } else { + /* Transform 32bit (or wider) instructions */ + switch (MASK_OP_MAJOR(insn)) { + case OPC_RISC_ATOMIC: + xinsn =3D insn; + access_rs1 =3D GET_RS1(insn); + access_size =3D 1 << GET_FUNCT3(insn); + break; + case OPC_RISC_LOAD: + case OPC_RISC_FP_LOAD: + xinsn =3D SET_I_IMM(insn, 0); + access_rs1 =3D GET_RS1(insn); + access_imm =3D GET_IMM(insn); + access_size =3D 1 << GET_FUNCT3(insn); + break; + case OPC_RISC_STORE: + case OPC_RISC_FP_STORE: + xinsn =3D SET_S_IMM(insn, 0); + access_rs1 =3D GET_RS1(insn); + access_imm =3D GET_STORE_IMM(insn); + access_size =3D 1 << GET_FUNCT3(insn); + break; + case OPC_RISC_SYSTEM: + if (MASK_OP_SYSTEM(insn) =3D=3D OPC_RISC_HLVHSV) { + xinsn =3D insn; + access_rs1 =3D GET_RS1(insn); + access_size =3D 1 << ((GET_FUNCT7(insn) >> 1) & 0x3); + access_size =3D 1 << access_size; + } + break; + default: + break; + } + } + + if (access_size) { + xinsn =3D SET_RS1(xinsn, (taddr - (env->gpr[access_rs1] + access_i= mm)) & + (access_size - 1)); + } + + return xinsn; +} + +/* + * Handle Traps + * + * Adapted from Spike's processor_t::take_trap. + * + */ +void riscv_cpu_do_interrupt(CPUState *cs) +{ + RISCVCPU *cpu =3D RISCV_CPU(cs); + CPURISCVState *env =3D &cpu->env; + bool write_gva =3D false; + uint64_t s; + + /* + * cs->exception is 32-bits wide unlike mcause which is XLEN-bits wide + * so we mask off the MSB and separate into trap type and cause. + */ + bool async =3D !!(cs->exception_index & RISCV_EXCP_INT_FLAG); + target_ulong cause =3D cs->exception_index & RISCV_EXCP_INT_MASK; + uint64_t deleg =3D async ? env->mideleg : env->medeleg; + target_ulong tval =3D 0; + target_ulong tinst =3D 0; + target_ulong htval =3D 0; + target_ulong mtval2 =3D 0; + + if (cause =3D=3D RISCV_EXCP_SEMIHOST) { + do_common_semihosting(cs); + env->pc +=3D 4; + return; + } + + if (!async) { + /* set tval to badaddr for traps with address information */ + switch (cause) { + case RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT: + case RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT: + case RISCV_EXCP_LOAD_ADDR_MIS: + case RISCV_EXCP_STORE_AMO_ADDR_MIS: + case RISCV_EXCP_LOAD_ACCESS_FAULT: + case RISCV_EXCP_STORE_AMO_ACCESS_FAULT: + case RISCV_EXCP_LOAD_PAGE_FAULT: + case RISCV_EXCP_STORE_PAGE_FAULT: + write_gva =3D env->two_stage_lookup; + tval =3D env->badaddr; + if (env->two_stage_indirect_lookup) { + /* + * special pseudoinstruction for G-stage fault taken while + * doing VS-stage page table walk. + */ + tinst =3D (riscv_cpu_xlen(env) =3D=3D 32) ? 0x00002000 : 0= x00003000; + } else { + /* + * The "Addr. Offset" field in transformed instruction is + * non-zero only for misaligned access. + */ + tinst =3D riscv_transformed_insn(env, env->bins, tval); + } + break; + case RISCV_EXCP_INST_GUEST_PAGE_FAULT: + case RISCV_EXCP_INST_ADDR_MIS: + case RISCV_EXCP_INST_ACCESS_FAULT: + case RISCV_EXCP_INST_PAGE_FAULT: + write_gva =3D env->two_stage_lookup; + tval =3D env->badaddr; + if (env->two_stage_indirect_lookup) { + /* + * special pseudoinstruction for G-stage fault taken while + * doing VS-stage page table walk. + */ + tinst =3D (riscv_cpu_xlen(env) =3D=3D 32) ? 0x00002000 : 0= x00003000; + } + break; + case RISCV_EXCP_ILLEGAL_INST: + case RISCV_EXCP_VIRT_INSTRUCTION_FAULT: + tval =3D env->bins; + break; + case RISCV_EXCP_BREAKPOINT: + if (cs->watchpoint_hit) { + tval =3D cs->watchpoint_hit->hitaddr; + cs->watchpoint_hit =3D NULL; + } + break; + default: + break; + } + /* ecall is dispatched as one cause so translate based on mode */ + if (cause =3D=3D RISCV_EXCP_U_ECALL) { + assert(env->priv <=3D 3); + + if (env->priv =3D=3D PRV_M) { + cause =3D RISCV_EXCP_M_ECALL; + } else if (env->priv =3D=3D PRV_S && env->virt_enabled) { + cause =3D RISCV_EXCP_VS_ECALL; + } else if (env->priv =3D=3D PRV_S && !env->virt_enabled) { + cause =3D RISCV_EXCP_S_ECALL; + } else if (env->priv =3D=3D PRV_U) { + cause =3D RISCV_EXCP_U_ECALL; + } + } + } + + trace_riscv_trap(env->mhartid, async, cause, env->pc, tval, + riscv_cpu_get_trap_name(cause, async)); + + qemu_log_mask(CPU_LOG_INT, + "%s: hart:"TARGET_FMT_ld", async:%d, cause:"TARGET_FMT_l= x", " + "epc:0x"TARGET_FMT_lx", tval:0x"TARGET_FMT_lx", desc=3D%= s\n", + __func__, env->mhartid, async, cause, env->pc, tval, + riscv_cpu_get_trap_name(cause, async)); + + if (env->priv <=3D PRV_S && + cause < TARGET_LONG_BITS && ((deleg >> cause) & 1)) { + /* handle the trap in S-mode */ + if (riscv_has_ext(env, RVH)) { + uint64_t hdeleg =3D async ? env->hideleg : env->hedeleg; + + if (env->virt_enabled && ((hdeleg >> cause) & 1)) { + /* Trap to VS mode */ + /* + * See if we need to adjust cause. Yes if its VS mode inte= rrupt + * no if hypervisor has delegated one of hs mode's interru= pt + */ + if (cause =3D=3D IRQ_VS_TIMER || cause =3D=3D IRQ_VS_SOFT = || + cause =3D=3D IRQ_VS_EXT) { + cause =3D cause - 1; + } + write_gva =3D false; + } else if (env->virt_enabled) { + /* Trap into HS mode, from virt */ + riscv_cpu_swap_hypervisor_regs(env); + env->hstatus =3D set_field(env->hstatus, HSTATUS_SPVP, + env->priv); + env->hstatus =3D set_field(env->hstatus, HSTATUS_SPV, true= ); + + htval =3D env->guest_phys_fault_addr; + + riscv_cpu_set_virt_enabled(env, 0); + } else { + /* Trap into HS mode */ + env->hstatus =3D set_field(env->hstatus, HSTATUS_SPV, fals= e); + htval =3D env->guest_phys_fault_addr; + } + env->hstatus =3D set_field(env->hstatus, HSTATUS_GVA, write_gv= a); + } + + s =3D env->mstatus; + s =3D set_field(s, MSTATUS_SPIE, get_field(s, MSTATUS_SIE)); + s =3D set_field(s, MSTATUS_SPP, env->priv); + s =3D set_field(s, MSTATUS_SIE, 0); + env->mstatus =3D s; + env->scause =3D cause | ((target_ulong)async << (TARGET_LONG_BITS = - 1)); + env->sepc =3D env->pc; + env->stval =3D tval; + env->htval =3D htval; + env->htinst =3D tinst; + env->pc =3D (env->stvec >> 2 << 2) + + ((async && (env->stvec & 3) =3D=3D 1) ? cause * 4 : 0); + riscv_cpu_set_mode(env, PRV_S); + } else { + /* handle the trap in M-mode */ + if (riscv_has_ext(env, RVH)) { + if (env->virt_enabled) { + riscv_cpu_swap_hypervisor_regs(env); + } + env->mstatus =3D set_field(env->mstatus, MSTATUS_MPV, + env->virt_enabled); + if (env->virt_enabled && tval) { + env->mstatus =3D set_field(env->mstatus, MSTATUS_GVA, 1); + } + + mtval2 =3D env->guest_phys_fault_addr; + + /* Trapping to M mode, virt is disabled */ + riscv_cpu_set_virt_enabled(env, 0); + } + + s =3D env->mstatus; + s =3D set_field(s, MSTATUS_MPIE, get_field(s, MSTATUS_MIE)); + s =3D set_field(s, MSTATUS_MPP, env->priv); + s =3D set_field(s, MSTATUS_MIE, 0); + env->mstatus =3D s; + env->mcause =3D cause | ~(((target_ulong)-1) >> async); + env->mepc =3D env->pc; + env->mtval =3D tval; + env->mtval2 =3D mtval2; + env->mtinst =3D tinst; + env->pc =3D (env->mtvec >> 2 << 2) + + ((async && (env->mtvec & 3) =3D=3D 1) ? cause * 4 : 0); + riscv_cpu_set_mode(env, PRV_M); + } + + /* + * NOTE: it is not necessary to yield load reservations here. It is on= ly + * necessary for an SC from "another hart" to cause a load reservation + * to be yielded. Refer to the memory consistency model section of the + * RISC-V ISA Specification. + */ + + env->two_stage_lookup =3D false; + env->two_stage_indirect_lookup =3D false; +} diff --git a/target/riscv/sysemu/meson.build b/target/riscv/sysemu/meson.bu= ild index 33fec8f11e..d5d8ad17a0 100644 --- a/target/riscv/sysemu/meson.build +++ b/target/riscv/sysemu/meson.build @@ -1,5 +1,6 @@ riscv_system_ss.add(files( 'arch_dump.c', + 'cpu_helper.c', 'debug.c', 'machine.c', 'monitor.c', --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821757; cv=none; d=zohomail.com; s=zohoarc; b=Qb0UyoCJWsuRBV8a9NSVSdrw9G2lLOc1TsKSOyZCkDuX90ujAiiSs821nim05Okzx8J+if3Z9bYUidRvhUbJX+r1i21NNzZvwvXSp/qI/BrU1rcvl81l9AinlvHAAp0s7ksF7HuK+zxbS9MZthJ9YcV6nENbRkckVhNbivgpu5M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821757; 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=4zj8kiNSf4zOVBRmaIbE7s7TNCE9jUZ9Fb7cv7kKoN8=; b=Rz6raQJ/Kseex4+Dpl4X2rxd2c6oMGYYLMZ0O+LXRJ+okPWjSbCcv1IGOv8zeQRKjZw3w642bLZzwBtP5b3xrHMyS8/1DjdTUiXy3U59Tyh8agN8vKI4OKlRlJXZtNzEdPVjfAmdLkkG5vbdGAaUajQmCF0M9QMPGE8iw3MHSLo= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821757024697.2887580464248; Mon, 26 Jun 2023 16:22:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWp-0006tx-27; Mon, 26 Jun 2023 19:21:51 -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 ) id 1qDvWn-0006lt-6n for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:49 -0400 Received: from mail-lj1-x232.google.com ([2a00:1450:4864:20::232]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWk-0000L2-VQ for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:48 -0400 Received: by mail-lj1-x232.google.com with SMTP id 38308e7fff4ca-2b698937f85so36526831fa.2 for ; Mon, 26 Jun 2023 16:21:46 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id y3-20020aa7c243000000b0051bdf152295sm3247783edo.76.2023.06.26.16.21.43 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821705; x=1690413705; 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=4zj8kiNSf4zOVBRmaIbE7s7TNCE9jUZ9Fb7cv7kKoN8=; b=mUMyMdkpXZlZOkwqKRhDSRrKPzHZ4mi6GF2+P+1pEQJQLxqN9wRchyQs6vVdtXpdqj ezqPYqhn21ZRcOyyTlrqZylQYvFCQ88ZqNW4hgyUtmJwIdNw6TAB3CUZgr2emn4TZQrn t522ERmBSlqzhexXRX+9kv67BNyBywN8LBbwJmLLpdYB5BFKRO3oVcCmZxDDksX9dF6i yWHyplE7v/qGbJ8eB9RPK6NQfQ3Z2nY4jZBIT7F7A6qqojgktLQEu9GBoxYKAxrI1R5M b6/7skHVsbDgRsr9CaV3yIijIoxPLRmHf7yC/MhTCui7qCPyPjVYbuviV0q1RWOLnHLe ON8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821705; x=1690413705; 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=4zj8kiNSf4zOVBRmaIbE7s7TNCE9jUZ9Fb7cv7kKoN8=; b=afZN1uxP9fWFS2Os/jL4jDlDR90cQ0L4G0DkTCkB7KLwG00Guy0TicUOGGI4gOSonk MPXjmtIE1LuMLr7lj6klnshHKcGU8ppYzbuBo55u+0TVQDo48NBtYffET+x/KMYWTiIK WeT6PwQXRl3gba30Lx4pbVHeB13RQTH7zeBLwdP7WmvrjqA5LzDnSZAJrKb80ouKu87y OGXx291FUQzWA8bimr07ACQ9UlbHGspn8IE9cSINKIVgaUAuj9zucx2mqVPkBIHgFIRv aIR2ocjc7j0HGQ364fo7NXN8Zlk4yMEeix+H4lsW7AdW+jDu63zeVB7KLNwbSorhklID /E+Q== X-Gm-Message-State: AC+VfDyZmlETSizc3mMnMlqksAb7St2cSoibPNUPVHpw8s9VsICsmXNh nZ5n9ejDhW7K2xkCoG2VY164syWvBfwxZDZUap4= X-Google-Smtp-Source: ACHHUZ567FMfIYKiiz2M9olBgqdphBexRaZ9/LIUXgA+0/kuM38ER+J0hMg5gU/XkRJjXxSmK9e7zw== X-Received: by 2002:a05:651c:102a:b0:2b6:a23c:580 with SMTP id w10-20020a05651c102a00b002b6a23c0580mr2169142ljm.5.1687821705062; Mon, 26 Jun 2023 16:21:45 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 15/16] target/riscv: Restrict TCG-specific prototype declarations Date: Tue, 27 Jun 2023 01:20:06 +0200 Message-Id: <20230626232007.8933-16-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::232; envelope-from=philmd@linaro.org; helo=mail-lj1-x232.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821757918100002 Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- target/riscv/cpu.h | 3 +++ target/riscv/cpu.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 5945e13fe0..8f16655041 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -474,7 +474,10 @@ RISCVException smstateen_acc_ok(CPURISCVState *env, in= t index, uint64_t bit); =20 void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv); =20 +#ifdef CONFIG_TCG void riscv_translate_init(void); +#endif + G_NORETURN void riscv_raise_exception(CPURISCVState *env, uint32_t exception, uintptr_t pc); =20 diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index a1513bf5cc..2371bdd68a 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -37,7 +37,9 @@ #include "hw/qdev-properties.h" #include "migration/vmstate.h" #include "fpu/softfloat-helpers.h" +#ifdef CONFIG_TCG #include "tcg/tcg.h" +#endif =20 /* RISC-V CPU definitions */ =20 @@ -724,6 +726,7 @@ static vaddr riscv_cpu_get_pc(CPUState *cs) return env->pc; } =20 +#ifdef CONFIG_TCG static void riscv_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb) { @@ -741,6 +744,7 @@ static void riscv_cpu_synchronize_from_tb(CPUState *cs, } } } +#endif =20 static bool riscv_cpu_has_work(CPUState *cs) { @@ -757,6 +761,7 @@ static bool riscv_cpu_has_work(CPUState *cs) #endif } =20 +#ifdef CONFIG_TCG static void riscv_restore_state_to_opc(CPUState *cs, const TranslationBlock *tb, const uint64_t *data) @@ -779,6 +784,7 @@ static void riscv_restore_state_to_opc(CPUState *cs, } env->bins =3D data[1]; } +#endif =20 static void riscv_cpu_reset_hold(Object *obj) { @@ -1785,6 +1791,8 @@ static const struct SysemuCPUOps riscv_sysemu_ops =3D= { }; #endif =20 +#ifdef CONFIG_TCG + #include "hw/core/tcg-cpu-ops.h" =20 static const struct TCGCPUOps riscv_tcg_ops =3D { @@ -1803,6 +1811,7 @@ static const struct TCGCPUOps riscv_tcg_ops =3D { .debug_check_watchpoint =3D riscv_cpu_debug_check_watchpoint, #endif /* !CONFIG_USER_ONLY */ }; +#endif /* CONFIG_TCG */ =20 static void riscv_cpu_class_init(ObjectClass *c, void *data) { @@ -1833,7 +1842,9 @@ static void riscv_cpu_class_init(ObjectClass *c, void= *data) #endif cc->gdb_arch_name =3D riscv_gdb_arch_name; cc->gdb_get_dynamic_xml =3D riscv_gdb_get_dynamic_xml; +#ifdef CONFIG_TCG cc->tcg_ops =3D &riscv_tcg_ops; +#endif /* CONFIG_TCG */ =20 device_class_set_props(dc, riscv_cpu_properties); } --=20 2.38.1 From nobody Tue Feb 10 12:40:48 2026 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=1687821773; cv=none; d=zohomail.com; s=zohoarc; b=g26iMNLzCiTvQUnYeJNiQlfBJshWzvwk3nc25yK8BYauMR2SuD6A7Jwi+A4SLwMoBB9t65NWkbrQN2R43PjJubFOj2Pxbi+TOR4nVGEbe+wV/OqKxfC9REnXChplpUh7cD6/88lSNjeJar5DkNgR6F+4LrUbi7fuSYDvoiHSE/c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1687821773; 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=VxVrz8p5o31xt6Yxv58riTEL3xKqDEOgIygHH7bVYSY=; b=D8DUMcCeCxGsOTYuL4mcqq4r1JVhrADWqghZRL5Xi54/8hP0ACC0Mg72BtrKCrFmkKl+y1IvrPsbrS/zqkoxLtJVWPzda6jk2qeV8rE1S0J87PJToAGCHrmvFaeOiv3frq7oviI+daYfZgCldadnkxSCjBlw7NoZCWu6lRyBNkk= 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= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1687821773697905.8087310589725; Mon, 26 Jun 2023 16:22:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qDvWu-0007Y0-9D; Mon, 26 Jun 2023 19:21:56 -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 ) id 1qDvWs-0007Nb-PA for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:54 -0400 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qDvWq-0000Lz-VU for qemu-devel@nongnu.org; Mon, 26 Jun 2023 19:21:54 -0400 Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-98de21518fbso360417566b.0 for ; Mon, 26 Jun 2023 16:21:52 -0700 (PDT) Received: from m1x-phil.lan ([176.187.199.226]) by smtp.gmail.com with ESMTPSA id pg9-20020a170907204900b00988aff89806sm3889316ejb.14.2023.06.26.16.21.49 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 26 Jun 2023 16:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687821711; x=1690413711; 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=VxVrz8p5o31xt6Yxv58riTEL3xKqDEOgIygHH7bVYSY=; b=m7PMxgOsmssfOK7t8kTnNDai/QpDt3NdPap7WcqMRJOLBldpBSsrE6FP7vv0xYvg6+ xcrPAtgLwPRFj00skvqgJfTqcC6dUn5mccnsXSO/pRvRNwRMgoe10OqhqOpCCx2jTjx/ l4bcEFq39b0Hw7DP+iGG22iKbIksJc8XptHxAjuU5LIFtWjhw3UuFoVEaNFvYvizqhZb tq0SzfBqbYUaSfurJF9zdLYKdoV8Vskr6FQe+tc+vzOxk8V+/O7NmqEY2N8qxqEBobMV PqGSDnufyYChdcdfpQisASxq2iciqxzvZg+vNYmxNySnGlsh7fKQ9ZLuzXqvn+DLsLcs pFgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687821711; x=1690413711; 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=VxVrz8p5o31xt6Yxv58riTEL3xKqDEOgIygHH7bVYSY=; b=gUnk9lDkDx/gA0zNynmCbYt+5WZXPD6k+1PziXsqQAWGVLxTFnCIFfa5ELw8ma2VeU W6v7eDU51uJOIy8aq3urBVQi/sJmQYhyrDA0xlkPUbpDj/GTX0/UoZPpTBE8tRrfzquG vRfDvHBr1jTuP9AmhxmQPskn9gE2z3nlhG6blsWInhnVxpSnFehYqYmK6ReLy30pPQV3 2PHZ3gR8+H+l7UXb23241Q9lhJYCGjbj6/GNsWG2SCnfOY91LbIuaxn1XvF++04xQ3rI Ka09iEVK06AS9EIPdtCRtbPwt9IIj/WTqjk65uGNz41CtriqXsZPOsYhNPWIuRk/emgj NJDg== X-Gm-Message-State: AC+VfDxf0FhMNwrF78S3I4THr3/DihWiBgQXryMJLBrVes1LXdZabePi dfuvhpOznqw49j6yrV9rxTwr/kr86G4xase9B7I= X-Google-Smtp-Source: ACHHUZ4EaElgZML1hLHKYA8CswyRRmQJwYRoHGyWpgDYyy9aiFgM/jZSaH202xLJm0T04dBh/7CnwQ== X-Received: by 2002:a17:906:6a07:b0:989:a806:d197 with SMTP id qw7-20020a1709066a0700b00989a806d197mr15375737ejc.3.1687821711418; Mon, 26 Jun 2023 16:21:51 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Bin Meng , Liu Zhiwei , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Thomas Huth , Beraldo Leal , Alistair Francis , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Palmer Dabbelt , Wainer dos Santos Moschetta , Daniel Henrique Barboza , Weiwei Li , qemu-riscv@nongnu.org Subject: [PATCH 16/16] gitlab-ci.d/crossbuilds: Add KVM riscv64 cross-build jobs Date: Tue, 27 Jun 2023 01:20:07 +0200 Message-Id: <20230626232007.8933-17-philmd@linaro.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230626232007.8933-1-philmd@linaro.org> References: <20230626232007.8933-1-philmd@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=2a00:1450:4864:20::62b; envelope-from=philmd@linaro.org; helo=mail-ej1-x62b.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, T_SCC_BODY_TEXT_LINE=-0.01 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 @linaro.org) X-ZM-MESSAGEID: 1687821774240100001 Add a new job to cross-build the riscv64 target without the TCG accelerator (IOW: only KVM accelerator enabled). Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- .gitlab-ci.d/crossbuilds.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.d/crossbuilds.yml b/.gitlab-ci.d/crossbuilds.yml index 1e0e6c7f2c..5b72df4090 100644 --- a/.gitlab-ci.d/crossbuilds.yml +++ b/.gitlab-ci.d/crossbuilds.yml @@ -129,6 +129,14 @@ cross-riscv64-user: variables: IMAGE: debian-riscv64-cross =20 +cross-riscv64-kvm-only: + extends: .cross_accel_build_job + needs: + job: riscv64-debian-cross-container + variables: + IMAGE: debian-riscv64-cross + EXTRA_CONFIGURE_OPTS: --disable-tcg --without-default-features + cross-s390x-system: extends: .cross_system_build_job needs: --=20 2.38.1