From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789745960; cv=none; d=zohomail.com; s=zohoarc; b=SPBnkkH7d5ciXZcRPj4GRKt7dpY25fjktpQif/vvcDgoJHdyN6lKhGfvarSO5EK9Jk7lNNQ43kC5SD174tN/74XwG/8c0DGIs93/j3sIunFGYVLzOUcqTwNYMZkCHCgBGBtnBuD1Kc2sibRGL50NMwjHFjmv5EQJ14GzFQxLyh0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789745960; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=FxhT0nhez3I36gywC46KR4KrhV2ZwbPVmTIAoxHV7H4=; b=grnYat0rswPN/RFoX/tejA3+weaxV6cYLX7ml1baJ6/2iqgvI+ueJxBh4zbbMiciN2XJVABGndtN7JPidA5e2DGLU/J+G4XwdTP+fxKpRTzuBgwpIhCY0ZcLgyceu33zkxeMm435Y4qoH+vjp45ys8QYFt6HCCLL3mGfvdYwub4= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789745960258439.144844973378; Fri, 18 Sep 2026 08:39:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7afZ-0006RN-R3; Fri, 18 Sep 2026 11:38:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afS-0006QF-0j for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:26 -0400 Received: from mail-lr2-x0f.google.com ([2a00:1450:4864:38::f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afQ-0003DJ-3p for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:25 -0400 Received: by mail-lr2-x0f.google.com with SMTP id 38308e7fff4ca-3a5e21a5408so7220591fa.0 for ; Fri, 18 Sep 2026 08:38:23 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-3a5fd8a84c0sm5649231fa.40.2026.09.18.08.38.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745902; x=1790350702; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FxhT0nhez3I36gywC46KR4KrhV2ZwbPVmTIAoxHV7H4=; b=QwFK0aIqA9W7vn/fd6QCWjWt5pnv6lX8tblCVQrbvGmfexGlEek/wHaVS5qHTrWLIi r4apYQ7XpZ9sdfiqsBYjobKadKscP6ZXHG0JIQteCEpL+ost20DrzuKKtvWRqNrg2n6g UiRQ+wrpX9udX1LsdqTqNKSlqgYi5SnIvlNBa9xuM7vz+ApuxCsalEgkhdEcOY+gL8RT 7jkzgaAY5PMnB4a5osjCedE9M8Pdvd6ZYIh2LUADfaeVJK5OxMhZiLb1U7gpZZzKMzm4 A7GoZ/cgF9xxDS5jGdSjaQBb2b3BsGrOfi6XbAxdXSQF7CmlqPDn53dzLy8dpYe8W0U/ 6R8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745902; x=1790350702; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=FxhT0nhez3I36gywC46KR4KrhV2ZwbPVmTIAoxHV7H4=; b=yiPrL40HzNnPuRyWcsINbeV//jQOYccoXzvuvd3VG4Kwc6EAi5heV3e/N/sxY+jllt EFHcfGbb2TgBccluxNabgxIrd0GA/Za+YgcmK9i9sHHO/nqHzQai+NHSnnEQVjgOvuhy COapIihB8fAfdmwNa/5Jlpx0+gauou5eRrVtjRq3TXEuIVd+i2MNkROYmNmewxz3hz7i qL+/FNVGmF/kksmC4RfUN63DE/vUEBV/OTDND2zK+f5uNGqpPpaqkTPjUX6hXprk9qLT OHWSQZBHYSV4Xl7ccCF26F6GfVj1F/yqL/8ZqZtf3KZ2aVmuzaRN6VwCw4s9ofdaHzQZ SUbQ== X-Gm-Message-State: AFuF++msyXjKEy/TiUmq6pnURUpHOoc7ZjFh1w0fPKXv66founN/HRuX wQfrmFGph4aLgkgUUlnzo0c6Cqq2FMhSV7dOt/aOQY8qLbWVnROhn9w2bgp4VjTE X-Gm-Gg: AYBFou1aAcwdPFToIR7fFgG3zrzYnvEpShZDx30YCve9q9riYwiCDr65HKW1r193tMg SNXt2ZJbFZ6zUsZATOHU9659RSqifHq8ayGCYZVqvHHb5OVty+3mkLEfIPuwzDEpNg6akMzHICT u7LjvPM5yXmc7liTTl2yFQMyTO7QsrWuqx4dQohoyJD1X9zhkwnypSk/PefgQ6trFtYTlflDyIK bD6RLb/AZSuiM9eKY9fFd2OGc+25/N5HPC8bXNXp1ufFGiN3s6stxGBYusBQpQPkMDcaEYcDJn2 U8+DauYPtT6mQ3hXhGrMvcJgbGpzLMgA9zdrHovyRFv4LHxFh0U7NovUvavxpYU5X7fVNK5y1bI gqzUfWHlzmHMINzO39DqGXW7SEeF74yp/llE0yegbj1JJ9TN+6QXAj5Cw/XgH3pZd9ogOZqDZRx yuQHsiUnn9LJG5bKtvDe1Pw92EJ/YiIeIDJy/jKjpUCW7Zl9zI9U/WAbs7GbtZIcmiqObBQ6Y3J ISyEjw= X-Received: by 2002:a2e:b889:0:b0:3a5:fe42:8c9 with SMTP id 38308e7fff4ca-3a5fe420e6emr5279681fa.24.1789745902105; Fri, 18 Sep 2026 08:38:22 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:37 +0300 Subject: [PATCH 1/6] hw/riscv/trace-encoder.c: support ACTIVE ENABLE EMPTY of trTeRamControl MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-1-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5390; i=antikostya2@gmail.com; h=from:subject:message-id; bh=uzEAaoZU/K6brHVw0Tn88cMwxEl+4Nljo09TqtCiixg=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoNh+8ZMwzHlSTLSZbNM9iEKO6YW71r6omQX PtOY4ZnBaKJAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dmJTD/9d+3GjehxcP0NI15RmdABrkvgKwMkjiV0Vv+Ai3b0uiZvTlttzfcJgQJ3z4CmSuY4sEhc OZ4VxFwVbzAq3ITOwIuSQEXCtGKOz5zPGQ8IKrwchIlaVQZrdmtcp0rC8mbX9ZneF+Cei6KW163 RMwlO56yV7+idQhWO3a5lMsmFb478S4NnkfDpn1+QxRucFAtMCZZDAKpBHtl+WIZPYL7SFrXK9a PmyAR7M05VIoPwb+a/g5X820VtCwJt74pVj3psK/EHAC/EfJ+8/20CORxsfUU/mmHXbA3hSnR8N uTxzKrhhgKfbROlJ5mTfs4b5s4fVNn12uRrak4GMXKbwPJgncs6AM1ShxYnH1mgioppBmvBzECU mLoVoTU6vPZudSSqcMr3mEP/42zSzKJ3d9RuFE2mSr72km5lxaJx9n4wCSb6OXmOSl0JoKmE7Xr 1uPxe/S5Ai9n6yM1xUVkOt+WEKAUeK8YPVredTz2byvsFxS5a5CCYGt0xzJHtX6q6GcWSvWyd0+ 1xAOzb+Y5rIaIotT6Lg7DV9wbnDV7ETpDO/kvdv++PSs5+VKq53A+Uv5PNX8HHXzQpTAhf7bFTE FvT49PrV5bWaPhNZ76JTPvVszM0JS6FOFqb9gfKnCaWCCzdqgcJ3LCa1hwaNpZysq8EK9wge+mi mpj0gv9FeijKGfA== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:38::f; envelope-from=antikostya2@gmail.com; helo=mail-lr2-x0f.google.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FORGED_GMAIL_RCVD=1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789745961986158500 Signed-off-by: Alexei Filippov --- hw/riscv/trace-encoder.c | 16 +++++++++++++++ hw/riscv/trace-ram-sink.c | 19 ++++++++++++++++-- tests/qtest/riscv-trace-test.c | 45 ++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 7fd5c3a578..41bb750043 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -159,6 +159,18 @@ static hwaddr trencoder_read_ramsink_ramlimit(TraceEnc= oder *te) return ret; } =20 +static uint32_t trencoder_read_ramsink_control(TraceEncoder *te) +{ + return trencoder_read_reg(te, A_TR_RAM_CONTROL); +} + +static bool trencoder_is_ramsink_enabled(TraceEncoder *te) +{ + uint32_t reg =3D trencoder_read_ramsink_control(te); + + return FIELD_EX32(reg, TR_RAM_CONTROL, ENABLE); +} + static uint64_t trencoder_te_ctrl_set_hardwire_vals(uint64_t input) { input =3D FIELD_DP32(input, TR_TE_CONTROL, EMPTY, 1); @@ -427,6 +439,10 @@ static void trencoder_send_message_smem(TraceEncoder *= trencoder, hwaddr dest =3D trencoder_read_ramsink_writep(trencoder); bool wrapped =3D false; =20 + if (!trencoder_is_ramsink_enabled(trencoder)) { + return; + } + if (trencoder->ntrace) { /* * RISC-V N-Trace 3.1. MSEO Sequences: diff --git a/hw/riscv/trace-ram-sink.c b/hw/riscv/trace-ram-sink.c index 03ffa9caae..daf3c67d57 100644 --- a/hw/riscv/trace-ram-sink.c +++ b/hw/riscv/trace-ram-sink.c @@ -44,8 +44,6 @@ =20 static uint64_t tr_ramsink_ctrl_set_hardwire_vals(uint64_t input) { - input =3D FIELD_DP32(input, TR_RAM_CONTROL, ACTIVE, 1); - input =3D FIELD_DP32(input, TR_RAM_CONTROL, ENABLE, 1); input =3D FIELD_DP32(input, TR_RAM_CONTROL, MODE, 1); input =3D FIELD_DP32(input, TR_RAM_CONTROL, STOP_ON_WRAP, 0); input =3D FIELD_DP32(input, TR_RAM_CONTROL, MEM_FORMAT, 0); @@ -56,8 +54,25 @@ static uint64_t tr_ramsink_ctrl_set_hardwire_vals(uint64= _t input) =20 static uint64_t tr_ramsink_ctrl_prew(RegisterInfo *reg, uint64_t val) { + TraceRamSink *rs =3D TRACE_RAM_SINK(reg->opaque); + uint32_t trRamActive =3D ARRAY_FIELD_EX32(rs->regs, TR_RAM_CONTROL, AC= TIVE); + val =3D tr_ramsink_ctrl_set_hardwire_vals(val); =20 + if (!trRamActive) { + + /* + * 11.3 Enabling and Disabling hints that the device must + * be activated first (trRamActive =3D 1), then enabled. + * Do not enable the device if it's not active + * beforehand. + */ + + if (FIELD_EX32(val, TR_RAM_CONTROL, ENABLE)) { + val =3D FIELD_DP32(val, TR_RAM_CONTROL, ENABLE, 0); + } + } + return val; } =20 diff --git a/tests/qtest/riscv-trace-test.c b/tests/qtest/riscv-trace-test.c index 66069f7a56..8f0a751fd8 100644 --- a/tests/qtest/riscv-trace-test.c +++ b/tests/qtest/riscv-trace-test.c @@ -39,6 +39,11 @@ REG32(TR_RAM_WP_LOW, 0x020) REG32(TR_RAM_WP_HIGH, 0x024) FIELD(TR_RAM_WP_HIGH, ADDR, 0, 32) =20 +REG32(TR_RAM_CONTROL, 0x0) + FIELD(TR_RAM_CONTROL, ACTIVE, 0, 1) + FIELD(TR_RAM_CONTROL, ENABLE, 1, 1) + FIELD(TR_RAM_CONTROL, EMPTY, 3, 1) + static uint32_t test_read_te_control(QTestState *qts) { return qtest_readl(qts, TE_BASE + A_TR_TE_CONTROL); @@ -67,6 +72,42 @@ static uint64_t test_read_tram_writep(QTestState *qts) return reg; } =20 +static uint32_t test_read_tram_control(QTestState *qts) +{ + return qtest_readl(qts, TRAM_BASE + A_TR_RAM_CONTROL); +} + +static void test_write_tram_control(QTestState *qts, uint32_t val) +{ + qtest_writel(qts, TRAM_BASE + A_TR_RAM_CONTROL, val); +} + +static void reset_and_enable_ram_sink(QTestState *qts) +{ + uint32_t reg =3D test_read_tram_control(qts); + reg =3D FIELD_DP32(reg, TR_RAM_CONTROL, ACTIVE, 0); + test_write_tram_control(qts, reg); + reg =3D test_read_tram_control(qts); + g_assert(0 =3D=3D FIELD_EX32(reg, TR_RAM_CONTROL, ACTIVE)); + + reg =3D test_read_tram_control(qts); + reg =3D FIELD_DP32(reg, TR_RAM_CONTROL, ACTIVE, 1); + test_write_tram_control(qts, reg); + reg =3D test_read_tram_control(qts); + g_assert(1 =3D=3D FIELD_EX32(reg, TR_RAM_CONTROL, ACTIVE)); + + reg =3D test_read_tram_control(qts); + reg =3D FIELD_DP32(reg, TR_RAM_CONTROL, ENABLE, 1); + test_write_tram_control(qts, reg); + reg =3D test_read_tram_control(qts); + g_assert(1 =3D=3D FIELD_EX32(reg, TR_RAM_CONTROL, ENABLE)); + + reg =3D test_read_tram_control(qts); + reg =3D FIELD_EX32(reg, TR_RAM_CONTROL, EMPTY); + /* EMPTY should be 1 */ + g_assert(reg); +} + static void test_trace_simple(void) { QTestState *qts =3D qtest_init("-machine virt -accel tcg"); @@ -74,6 +115,8 @@ static void test_trace_simple(void) uint64_t reg_tram_start, reg_tram_writep; uint32_t reg; =20 + reset_and_enable_ram_sink(qts); + reg =3D test_read_te_control(qts); reg =3D FIELD_DP32(reg, TR_TE_CONTROL, ACTIVE, 1); test_write_te_control(qts, reg); @@ -119,6 +162,8 @@ static void test_ntrace_simple(void) uint64_t reg_tram_start, reg_tram_writep; uint32_t reg; =20 + reset_and_enable_ram_sink(qts); + /* trTeActive :=3D 1 */ reg =3D test_read_te_control(qts); reg =3D FIELD_DP32(reg, TR_TE_CONTROL, ACTIVE, 1); --=20 2.43.0 From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789745987; cv=none; d=zohomail.com; s=zohoarc; b=CG+A5yNWXIAy0isVDQgc9FeDVsYXh1HGe3AWkqHRvDxibnzrSxrAvq6E40qQmUdv2GxqQZXvVHqgM3hAlhP8gqy3oA+XypSDbf40BXDMkJ0CDqPUcXrJ4aAaNtFl1N6dWoLp7V9LjxVi5+ldwM301ON7q87wWlsW7ANLnfWA27M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789745987; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YSjf2f/gOB65KFXRp3HsadUImFPA7gBnvrBCS70UBu8=; b=nKy6AD0dwT1kWum3Wc7DlwtVJ934rhD/MTuwwJCA+Bvf41o3yWli9m2UWe7TNLU6DvdCIDTO+iwdLWAGz2yP76qgqiRCfTsm6/K6fRFaIGndBosRO2LKPpqaIUwiSd4V3wSdH8KR4w0+CC4PSH7DFx/xq0Aqco0OufN9K/sS5/s= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789745987494756.7380138654893; Fri, 18 Sep 2026 08:39:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7afg-0006SQ-35; Fri, 18 Sep 2026 11:38:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afe-0006S9-CG for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:38 -0400 Received: from mail-lf2-x11.google.com ([2a00:1450:4864:36::11]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afb-0003Dq-8A for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:37 -0400 Received: by mail-lf2-x11.google.com with SMTP id 2adb3069b0e04-5b8c58fd069so402745e87.3 for ; Fri, 18 Sep 2026 08:38:32 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b8c274ed00sm578432e87.19.2026.09.18.08.38.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745911; x=1790350711; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=YSjf2f/gOB65KFXRp3HsadUImFPA7gBnvrBCS70UBu8=; b=MO/ocZnwUbhNqewGLPgJurIfx3zuUOXLjNiJS/l22kz2kndM1TteEVndlSvlxh0v46 aFZka/kmkzgiztxpTDMvuIlvqaQWiHFM2GqCChekXrzaSysmv5DPVuctiuZHOo2kD3vN MejQkI2x/NPzucYe1SAdPNxZhTmuZy9+CXbkcMCEyZ/ld4tYJNE6JwO//xxoGQDj9R1O y6W1lQ3F2TFsWqbgIZnSddUMq0/HYlelfXVw+lFhtVOhbw/3up4X1rvGT5UU47YMluLF AyS9WWa5p1bXTGurslPB4+UssvKreChBCb3x+9VDNaNWKsxduGNTKo5HrsnJ/I9VP4g3 9P1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745911; x=1790350711; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=YSjf2f/gOB65KFXRp3HsadUImFPA7gBnvrBCS70UBu8=; b=K6mOf6WJYHmLxX4mfE+fRtSiH3menVhoPeG+g86U580HwuWaO66bR7moeDjuWl7VzX 4/q4wLft9Fw+3Tmm7a+Y7xsG/hvkFzmQc9ZyWVzARNw+4W68NIAf2rG2cHLfv8S8jnul v4dRmw35oYSRe2wOP0c2mmlKi+WiEajSlxT5tnuDYtLJlQ91y95JXmRU4yVz+JxAGXXn /3J51QvTEO4bAIlVMRUSz3heWmY2EzwXYBumhtVDfUqi2l8N9+UkzGVjnFyWILOKGYUN j4Yr0UsY7gEHrrDHDrJZ5ZFbZMpKnJjRLp9Cp2lwEHy7yQyKobcqTS65rkwIpgn/AEdD 5AsQ== X-Gm-Message-State: AFuF++njtLZu1noU20qWHWKyE0aioVVDDj6V4X4iYTzAHK6cgX0B0FxZ lgFpXq6JhC+XYVqr3NmFuLx5Ib/Wc0zqqWYn4Ka0XsgThuGRKrdO5lxkwUQWl+Uu X-Gm-Gg: AYBFou22K/e9h3XVj2Btfobs0cVV/wy0ajyi8tFQIPEf3Zlo8De5JIi/7u7mj6CZst1 uoKS7NRIMXgvww+a3RviQLK30gYKFLKjUQ4FkSGjMLqNuqdInf+ltD11YwMdrv7FyUzy0u/rfhJ UmAbUlwKZ8qzeXpY2Cpx7S7y7YHXytZ2eC2b8i3wUBMhQTE2S/d1k6Q3Tnn/SqpPZKaFx6l8uA0 816CFJwwUtEd+8XGkN7WK66cjVk+p/aZwNYe/kdZCyP38yyKv1wvS1LBzqC6pqvT0Cui7MUkYeT Mt7KATsCd+XgihN5C3Eqi2RiTXao64GyxA386z1I4dZhjsddevNeoOTRCbLku6afXHTsR5smdDW 0Ts7506+REx3/tPKPEdqycBMqockETsyCumm5XcbyM6ridzzD5ue6RzFoZgrz6buakK1g09Lk3l 2jKuPty1ZDGQuh5KQ3p3iXqOKrfQrqlaHjVUImcUnT0S2AcjnJjm0swXFoYAV00h/NNxGE X-Received: by 2002:a05:6512:1384:b0:5b6:183b:d20d with SMTP id 2adb3069b0e04-5b8c194e06emr1091047e87.52.1789745910496; Fri, 18 Sep 2026 08:38:30 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:38 +0300 Subject: [PATCH 2/6] hw/riscv/trace-encoder.c: Support sync messages for N-trace MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-2-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=10698; i=antikostya2@gmail.com; h=from:subject:message-id; bh=VN2bbM0YE1ruvE0c02QgtVkI1IUhi2SCwlVI3u2+YQU=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoN5pi/CBm0iKgFwS4ja5hvJY6xx4k5iUfd8 Br8kNAy0ASJAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dnhtD/4zFxVVwmTD6s/jgL1V4aMgnwCuqXD5WC15CU6vq1iWyJzeTnT6ZHTIUU1KG2OJZNHKosF 3rRrvKGwM9guFm9WZhHDqH2kKs75YB5zZoZ0PQ1X7HOTp8cG3JbeCg+3fnyziuygXEsvQRNt8ze NMPJp9dTE2DWym0TFaoE4/oC0+5DyXYKJYHWedE4bJV43j+YjGwsWRU/xiY+cjs3piDrVR6GFDB 9SBY1BobYbq9i/Fx2qIEVrYPzURssLWbcwak5zgj7zYNEgngt4p/fZeLrYp+eLD3bJD3te/SuUC C4nXgZ1+c8OczS4++RruQ82FlNXREdyGYXXCXhzXIh8WtLtDO2fz4fMQ9RK3rC8fhcP9xTzOhbb foYS+f5JQOfqPbHUyLO+cgJrZiPr1eJlnlKCXm8/OWMPGrhgbBREkpR6arntlS72yhNbpH1JVna K9MteMphmSvxYxrDbc33WPwQZxt/SwHiyyUu2jnJJITAVFPNd8khw72jK4+XO+EMSno3zc8AsWB 4JdctZqBjWon4GqLOjtzvuWhAq4DAUEHsWIoPGQa+RVjL2D+ybOP+gAjdKa7s3YvsplPG+PYvNh t7ZRDw2AQHh/L13Vrez8JlqbgumSFrHR8iWt3q1vwKA8QpfaixPspfV2TFJ1UI+0X6uK32lqINe ZBbe5OJnFZouDOQ== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:36::11; envelope-from=antikostya2@gmail.com; helo=mail-lf2-x11.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789745990150158500 Add support of trTeInstSyncMode (with mods 0, 1 and 2) and trTeInstSyncMax Signed-off-by: Alexei Filippov --- hw/riscv/rv-trace-messages.c | 28 ++++++++++++++--- hw/riscv/rv-trace-messages.h | 3 ++ hw/riscv/trace-encoder.c | 75 ++++++++++++++++++++++++++++++++++++++++= ---- hw/riscv/trace-encoder.h | 9 ++++++ 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index 708e48bbed..507c5fb7bf 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -365,10 +365,11 @@ typedef enum { } NTraceFieldWidth; =20 typedef enum { - TCODE_PROG_TRACE_SYNC =3D 0x9, - TCODE_PROG_TRACE_CORRELATION =3D 0x21, - TCODE_RESOURCE_FULL =3D 0x1b, - TCODE_INDIRECT_BRANCH_HIST =3D 0x1c, + TCODE_PROG_TRACE_SYNC =3D 0x9, + TCODE_PROG_TRACE_CORRELATION =3D 0x21, + TCODE_RESOURCE_FULL =3D 0x1b, + TCODE_INDIRECT_BRANCH_HIST =3D 0x1c, + TCODE_INDIRECT_BRANCH_HIST_SYNC =3D 0x1d, } NTraceTcodeFieldValues; =20 typedef enum { @@ -586,6 +587,25 @@ size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t= *buf, uint32_t hist) return rv_ntrace_gen_encoded_msg(buf, msg_fields); } =20 +size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(uint8_t *buf, uint8_t b= type, + uint32_t icnt, uint64_t= faddr, + uint32_t hist) +{ + const NTraceFieldPayload msg_fields[] =3D { + PAYLOAD_TCODE(TCODE_INDIRECT_BRANCH_HIST_SYNC), + /* SRC field is not supported for now */ + PAYLOAD_SYNC(SYNC_PERIODIC), + PAYLOAD_BTYPE(btype), + PAYLOAD_ICNT(icnt), + PAYLOAD_FADDR(faddr), + PAYLOAD_HIST(hist), + /* TSTAMP field is not supported for now */ + PAYLOAD_END(), + }; + + return rv_ntrace_gen_encoded_msg(buf, msg_fields); +} + size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype, uint32_t icnt, uint64_t uadd= r, uint32_t hist) diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index a4d14de59a..c237e6b57c 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -43,6 +43,9 @@ size_t rv_ntrace_gen_encoded_prog_trace_correlation_msg(u= int8_t *buf, uint32_t icnt, uint32_t hist); size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist= ); +size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(uint8_t *buf, uint8_t b= type, + uint32_t icnt, uint64_t= faddr, + uint32_t hist); size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype, uint32_t icnt, uint64_t uadd= r, uint32_t hist); diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 41bb750043..dfe04781e2 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -34,9 +34,13 @@ #define TRACE_MAX_BRANCHES 31 =20 static uint64_t rv_ntrace_encode_uaddr(TraceEncoder *trencoder, uint64_t t= arget_pc); +static uint64_t rv_ntrace_encode_faddr(uint64_t target_pc); static uint32_t rv_ntrace_encode_and_reset_branch_map(TraceEncoder *trenco= der); +static uint64_t rv_ntrace_get_sync_max_cnt(TraceEncoder *trencoder); static uint32_t rv_ntrace_get_and_reset_icnt(TraceEncoder *trencoder, uint64_t pc, uint32_t inst_le= n); +static void rv_ntrace_update_sync_msg_cnt(TraceEncoder *trencoder); +static void rv_ntrace_update_sync_icnt(TraceEncoder *trencoder, uint64_t i= cnt); =20 static TracePrivLevel trencoder_get_curr_priv_level(TraceEncoder *te) { @@ -181,10 +185,6 @@ static uint64_t trencoder_te_ctrl_set_hardwire_vals(ui= nt64_t input) input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_ENA, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INHIBIT_SRC, 1); =20 - /* SYNC_MODE and SYNC_MAX will be revisited */ - input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_SYNC_MODE, 0); - input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_SYNC_MAX, 0); - return input; } =20 @@ -196,6 +196,10 @@ static uint64_t trencoder_te_ctrl_prew(RegisterInfo *r= eg, uint64_t val) uint32_t trTeInstTracing =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, INST_TRACING); uint32_t trTeFormat =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, FORM= AT); + uint32_t trTeInstSyncMode =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, + INST_SYNC_MODE); + uint32_t trTeInstSyncMax =3D ARRAY_FIELD_EX32(te->regs, TR_TE_CONTROL, + INST_SYNC_MAX); uint32_t temp; =20 val =3D trencoder_te_ctrl_set_hardwire_vals(val); @@ -245,6 +249,21 @@ static uint64_t trencoder_te_ctrl_prew(RegisterInfo *r= eg, uint64_t val) val =3D FIELD_DP32(val, TR_TE_CONTROL, INST_TRACING, 0); } =20 + temp =3D FIELD_EX32(val, TR_TE_CONTROL, INST_SYNC_MODE); + if (temp !=3D TR_TE_INST_SYNC_MODE_OFF && + temp !=3D TR_TE_INST_SYNC_MODE_MSG && + temp !=3D TR_TE_INST_SYNC_MODE_INST) { + /* Only sync mods 0, 1 and 3 are supported */ + val =3D FIELD_DP32(val, TR_TE_CONTROL, INST_SYNC_MODE, trTeInstSyn= cMode); + } else if (temp !=3D trTeInstSyncMode) { + te->sync_cnt =3D 0; + } + + temp =3D FIELD_EX32(val, TR_TE_CONTROL, INST_SYNC_MAX); + if (temp !=3D trTeInstSyncMax) { + te->sync_cnt =3D 0; + } + return val; } =20 @@ -389,6 +408,7 @@ static void trencoder_reset(DeviceState *dev) =20 te->branch_map =3D 0; te->branches =3D 0; + te->sync_cnt =3D 0; } =20 static void trencoder_realize(DeviceState *dev, Error **errp) @@ -480,6 +500,7 @@ static void trencoder_send_message_smem(TraceEncoder *t= rencoder, cpu_physical_memory_write(dest, msg, msg_size); dest +=3D msg_size; =20 + rv_ntrace_update_sync_msg_cnt(trencoder); trencoder_update_ramsink_writep(trencoder, dest, wrapped); } =20 @@ -532,11 +553,21 @@ void trencoder_send_indirect_branch_hist(TraceEncoder= *trencoder, =20 uint32_t icnt =3D rv_ntrace_get_and_reset_icnt(trencoder, curr_pc, cur= r_inst_len); uint64_t uaddr =3D rv_ntrace_encode_uaddr(trencoder, target_pc); + uint64_t faddr =3D rv_ntrace_encode_faddr(target_pc); uint32_t hist =3D rv_ntrace_encode_and_reset_branch_map(trencoder); + uint64_t sync_max =3D rv_ntrace_get_sync_max_cnt(trencoder); + uint32_t sync =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, INS= T_SYNC_MODE); =20 g_assert(trencoder->ntrace); =20 - msg_size =3D rv_ntrace_gen_indirect_branch_hist_msg(msg, btype, icnt, = uaddr, hist); + if (sync && trencoder->sync_cnt >=3D sync_max) { + msg_size =3D rv_ntrace_gen_indirect_branch_hist_sync_msg(msg, btyp= e, icnt, + faddr, hist= ); + trencoder->sync_cnt =3D 0; + } else { + msg_size =3D rv_ntrace_gen_indirect_branch_hist_msg(msg, btype, ic= nt, uaddr, + hist); + } trencoder->last_addr_reported =3D target_pc; trencoder->last_icnt_reset =3D target_pc; =20 @@ -621,6 +652,14 @@ static uint64_t rv_ntrace_encode_uaddr(TraceEncoder *t= rencoder, uint64_t target_ return trencoder->last_addr_reported ^ target_pc; } =20 +static uint64_t rv_ntrace_get_sync_max_cnt(TraceEncoder *trencoder) +{ + uint32_t sync_max_f =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTRO= L, + INST_SYNC_MAX); + + return 1 << (sync_max_f + 4); +} + static uint32_t rv_ntrace_encode_and_reset_branch_map(TraceEncoder *trenco= der) { const uint32_t stop_bit =3D 1; @@ -660,6 +699,26 @@ static uint32_t rv_ntrace_encode_and_reset_branch_map(= TraceEncoder *trencoder) return hist; } =20 +static void rv_ntrace_update_sync_msg_cnt(TraceEncoder *trencoder) +{ + uint64_t sync_mode =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, + INST_SYNC_MODE); + + if (sync_mode =3D=3D TR_TE_INST_SYNC_MODE_MSG) { + trencoder->sync_cnt++; + } +} + +static void rv_ntrace_update_sync_icnt(TraceEncoder *trencoder, uint64_t i= cnt) +{ + uint64_t sync_mode =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, + INST_SYNC_MODE); + + if (sync_mode =3D=3D TR_TE_INST_SYNC_MODE_INST) { + trencoder->sync_cnt +=3D icnt; + } +} + static uint32_t rv_ntrace_get_and_reset_icnt(TraceEncoder *trencoder, uint64_t pc, uint32_t inst_le= n) { @@ -674,6 +733,8 @@ static uint32_t rv_ntrace_get_and_reset_icnt(TraceEncod= er *trencoder, error_setg(&error_fatal, "N-Trace icnt overflowed"); } =20 + rv_ntrace_update_sync_icnt(trencoder, icnt); + return icnt; } =20 @@ -750,8 +811,10 @@ void trencoder_report_branch(Object *trencoder_obj, ui= nt64_t pc, TraceEncoder *te =3D TRACE_ENCODER(trencoder_obj); =20 if (te->ntrace && taken !=3D BRANCH_NOT_TAKEN) { - te->icnt_accumulated +=3D (pc + insn_len - te->last_icnt_reset= ) / 2; + uint64_t icnt =3D (pc + insn_len - te->last_icnt_reset) / 2; + te->icnt_accumulated +=3D icnt; te->last_icnt_reset =3D pc + offset; + rv_ntrace_update_sync_icnt(te, icnt); } =20 if (taken =3D=3D BRANCH_TAKEN_UNCONDITIONAL) { diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index b3cdbf9374..4cfdb47ecf 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -50,6 +50,8 @@ struct TraceEncoder { uint64_t last_addr_reported; uint64_t last_icnt_reset; uint64_t icnt_accumulated; + + uint64_t sync_cnt; }; =20 typedef enum { @@ -68,6 +70,13 @@ typedef enum { CORRELATION_TRACE_DISABLED =3D 4, } TraceStopReason; =20 +typedef enum { + TR_TE_INST_SYNC_MODE_OFF =3D 0, + TR_TE_INST_SYNC_MODE_MSG =3D 1, + /* Mode 2(Count hart clock cycles) is not supported. */ + TR_TE_INST_SYNC_MODE_INST =3D 3, +} TraceSyncMode; + #define TYPE_TRACE_ENCODER "trace-encoder" =20 OBJECT_DECLARE_SIMPLE_TYPE(TraceEncoder, TRACE_ENCODER) --=20 2.43.0 From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789745943; cv=none; d=zohomail.com; s=zohoarc; b=JpzGsEijtK/4Cz23qr5s1ZxEuPRRBxq5ayfiPyd8LrB6ogINrgMKfKFPzuJYMz3Kd/TmnNMDply5c0ISfuEy7ODhAxxJuWESOVrFHtpw/y1Gd6g3mPj4A/8iHt/qNf+YfQXzxz7DvHJQhRZP1w9eqbWgBxEDrw1uTQnPs6LGTds= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789745943; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tFHhCtGDf0La5i3ESE5+Rob9N9pOyy1dqxOtcNDbMX4=; b=EluyImVRXCRHSEvyACoDOFDGflJl8kWjAzFJFYoyPczopKre+13bf/V6Hv/IEtpeAGAJ23XcZEgWKL+qQ75MjsZg4lUUfo3/ad816hlRIVU+UN47ZY8qqtTiXEWCDMBnbbYLSy1XRhCL4yr8bE7/Giiv4oaedNUcKZQVN8LkZFo= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789745943315822.6450121702944; Fri, 18 Sep 2026 08:39:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7afk-0006TZ-RK; Fri, 18 Sep 2026 11:38:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afh-0006T4-Sf for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:41 -0400 Received: from mail-lf2-x10.google.com ([2a00:1450:4864:36::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afe-0003EG-Ve for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:41 -0400 Received: by mail-lf2-x10.google.com with SMTP id 2adb3069b0e04-5b5e4f1801fso961115e87.2 for ; Fri, 18 Sep 2026 08:38:38 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-3a5fd8673aasm5950351fa.34.2026.09.18.08.38.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745917; x=1790350717; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=tFHhCtGDf0La5i3ESE5+Rob9N9pOyy1dqxOtcNDbMX4=; b=mZYdFABUohAG7UZBQA5a2avG205bE3qFMCaKCNHGEVAju+VAIquPXS5sPWfUNm3AzD f14nYY7PH+oVvkot8MZy0DqOqXw9SZvQcQ7duZCv1M3PrzckQkt/TRxkM7s6KUlEZrjL Z7IaYldLluUwQ1j4x2jK6u1Lzf+Js2oFjRHpAJosDEKDX51svb5s4dwP4EHt8cajtNNT cNp2nRT3b+W402uXG1iC4z6DaHV5omXQloI4DpCDP+gmQP2p7Kdz73dtsCUACDoGY1EA eD5/rebGC05pU4WPUEONl+bIOhC8o1NZdA8Hp3o7jYKthzCCC5XQZ7lkyNDtlQbmDbLS QnOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745917; x=1790350717; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=tFHhCtGDf0La5i3ESE5+Rob9N9pOyy1dqxOtcNDbMX4=; b=ndHnKIX6fzGPT2NZnF1XLLRXtfrBRZLUbDoWjOrHmArJZuYVoE/R8buk2vmZLSdvPO Hfej1HAP8yL0AGbO6kmszBg5FkQz4oGqVh0cT97v1soBEJ1jt2nPMRHlehGXh9YG/3oO jKA/yUYRYDP08Ugaziv5dn1VxWQMTu991WCoOTZw6Z67fycpIMP8MGFpeXo3UEddihzx LFMN3X+wWIwKrt8edzHw0hcxocq1tHiHzsIkX264u8cBleKdB+tNdVtUfAguVB6HATGd y8lYK/yaJwGCvyb7cV071hsLbKU1jwQpjgcQfFsNYO70Wi6ojka4JRN9wAp2JIjqDgWh qoBQ== X-Gm-Message-State: AFuF++lh64+7dX2GMcivjK7KmTDaFj7xKIw4SmMc0AcHW/xQbaVWQLxA E0nzrVbxcypv1ggoRnCz4hrF6sKFeb6mOw/0T/L7/S2ZiA12iqeMxFKYM7Sf9FOo X-Gm-Gg: AYBFou0znWO4hg5vqTWSoZxYe4Pqv7/syaIfSYTpG1kzjdu391AaOIzd0kXrHYeT5s3 6V6hXKfMDaJFGfNKCT4fMIGo5z+xdkLN6EOZeUP21y2A4qlP84Vu/mY2dw91OLNNgwVtvcezKOE 4XekEFH9OOPFH5snIRIQWA2n5leR9ZpM9X5E/VB0DGqEaEpH7k+/eygZHObO3mmfJeI+y5NqAUh senJIYa28dgTGLx6uXLMNkOTNHKj+joz1gdxni+EcUb3rVQv+iJ8DUGh98oeQMY0vdNEnpEuMor G/uEao+fTyBzhzdstRq+ewVZwC92rIsIKDt9toarf5DzdYyeQ700+RhplZNTtpShXx7VVKcXGPd 2agkM6c4npJbEre4LG++4+FKP0zDZOAlAKWvoMlMZE28XgWDwPQrGa3mYnFy4KYm6rKijN5tuhF oCzRnp3FWLfohSPhvrdXGWIj0Dc1GA14TCkNxLnS38sfKoZTigFWdFNnpSXuS4dskXYDdlTwd4P i9m4Sg= X-Received: by 2002:a05:6512:a92:b0:5b6:183b:d207 with SMTP id 2adb3069b0e04-5b8c185410dmr922815e87.46.1789745917212; Fri, 18 Sep 2026 08:38:37 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:39 +0300 Subject: [PATCH 3/6] hw/riscv/trace-encoder.c: Implement Ownership messages for NTrace MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-3-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=12668; i=antikostya2@gmail.com; h=from:subject:message-id; bh=5olOmfExN3JwtgMLEwrbP9zM4esxUEWpE+x6PLSE3q8=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoN7UCM7FSiF4qUpD5R87Y0ZLVWZKiS/fLcP 1yotp4hXNqJAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dqRKD/9ZaK7NsirQ1g5K6d1HA8n+mdTCqb/QAN88gHCnvmfO0VU88ETUenOPHrM9XMQU+Wu9tGH v5Pau2/00eRvm3f67I0RMfHwghrDXTrS6S2Qm69nlB3OuF1ml6SyKq2T3/ytJFZ9f7B2HcBUrgR 4YOsgB/aLM3RtcVKW9IZ9/bSkibun1dXVCcqfvtBqkliel8GMYJxnxQxzlBpC8dxkaQk3ygt08P GehcNHE+QkdW0Obe/vONaIuiOPnasQN4j0hbZ7jtDL40jojL/IMbPLDJIGKR5Adc7H3TNeiyGFz kOuqA1iEqLP07ZZZfIOjsVDoxjq0IffHHKusuBGDOcivcLkI//4o03nNBlDQKqyjaj7Sq35i7PR wt75bpTiDO++jqBFjMLGsiwjuMnbmU+IB86KEWn7/y/5d5H3P6+Iw9cDl7AbnVId8w9sfJ7yZkw /XeuAlDAIXVHabOL0H6hNoUBwHCNci23frYWLBiuPKV3PZOxFjs21ux8wpXwjR7Lt9+EnEwD73F +l7TxG2W0eiK0rkOAHfkLM0MQyEYDpTh7F3qdKqFO0/dsF7kS6y/8t0+IoinMtSEWJ+bOO5Gjex morO/3NXFJWHh/tN4Rex5pW9Ich6Z62jaqNFjfywFEjNBsM8iT1qBtuE/USM1rwfa3XYNrS1sqC S2DStPRHcdiDJcg== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:36::10; envelope-from=antikostya2@gmail.com; helo=mail-lf2-x10.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789745946039158500 Note: generation of Ownership messages on writes to scontext and hcontext CSRs will be revisited later Signed-off-by: Alexei Filippov --- hw/riscv/rv-trace-messages.c | 52 +++++++++++++++++++++ hw/riscv/rv-trace-messages.h | 5 ++ hw/riscv/trace-encoder.c | 108 +++++++++++++++++++++++++++++++++++++++= +++- hw/riscv/trace-encoder.h | 13 +++++- target/riscv/cpu_helper.c | 2 +- 5 files changed, 175 insertions(+), 5 deletions(-) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index 507c5fb7bf..f3647e89dd 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -14,6 +14,7 @@ #include "qemu/module.h" #include "qapi/error.h" #include "trace.h" +#include "hw/register.h" =20 typedef enum { HEADER_SIZE =3D 1, @@ -366,6 +367,7 @@ typedef enum { =20 typedef enum { TCODE_PROG_TRACE_SYNC =3D 0x9, + TCODE_OWNERSHIP =3D 0x2, TCODE_PROG_TRACE_CORRELATION =3D 0x21, TCODE_RESOURCE_FULL =3D 0x1b, TCODE_INDIRECT_BRANCH_HIST =3D 0x1c, @@ -391,6 +393,20 @@ typedef struct NTraceFieldPayload { uint64_t value; } NTraceFieldPayload; =20 +#define REG_MXL64_32(reg, addr) \ + REG64(reg ## _MXL_RV64, addr) \ + REG32(reg ## _MXL_RV32, addr) + +#define REG_FIELD_BY_MXL(reg, field, shift, length, mxl) \ + FIELD(reg ## _ ## mxl, field, shift, length) + +REG64(NTRACE_PROCESS_PAYLOAD, 0x0) + FIELD(NTRACE_PROCESS_PAYLOAD, FORMAT, 0, 2) + FIELD(NTRACE_PROCESS_PAYLOAD, PRV, 2, 2) + FIELD(NTRACE_PROCESS_PAYLOAD, VIRT, 4, 1) + REG_FIELD_BY_MXL(NTRACE_PROCESS_PAYLOAD, CONTEXT, 5, 16, MXL_RV32) + REG_FIELD_BY_MXL(NTRACE_PROCESS_PAYLOAD, CONTEXT, 5, 32, MXL_RV64) + #define PAYLOAD_TCODE(val) \ { \ .type =3D FIELD_FIXED, \ @@ -461,6 +477,27 @@ typedef struct NTraceFieldPayload { .value =3D (val), \ } =20 +uint64_t rv_ntrace_gen_process_encode(uint8_t format, uint8_t newpriv, + uint8_t is_virt, uint64_t context) +{ + uint64_t out =3D 0; + + out =3D FIELD_DP64(out, NTRACE_PROCESS_PAYLOAD, FORMAT, format); + out =3D FIELD_DP64(out, NTRACE_PROCESS_PAYLOAD, PRV, newpriv); + out =3D FIELD_DP64(out, NTRACE_PROCESS_PAYLOAD, VIRT, is_virt); + /* format + priv + virt fields have 5 bit width by the spec */ + out =3D (out) | (context << 5); + + return out; +} + +#define PAYLOAD_PROCESS(process_msg, wdth) \ + { \ + .type =3D FIELD_VAR, \ + .width =3D (wdth), \ + .value =3D (process_msg), \ + } + #define PAYLOAD_END() \ { \ .type =3D FIELD_END, \ @@ -623,3 +660,18 @@ size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t = *buf, uint8_t btype, =20 return rv_ntrace_gen_encoded_msg(buf, msg_fields); } + +size_t rv_ntrace_gen_ownership_msg(uint8_t *buf, uint64_t process_msg, + uint32_t process_len) +{ + + const NTraceFieldPayload msg_fields[] =3D { + PAYLOAD_TCODE(TCODE_OWNERSHIP), + /* SRC field is not supported for now */ + PAYLOAD_PROCESS(process_msg, process_len), + /* TSTAMP field is not supported for now */ + PAYLOAD_END(), + }; + + return rv_ntrace_gen_encoded_msg(buf, msg_fields); +} diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index c237e6b57c..5b75dc0a7d 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -49,5 +49,10 @@ size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(uint8= _t *buf, uint8_t btype, size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype, uint32_t icnt, uint64_t uadd= r, uint32_t hist); +size_t rv_ntrace_gen_ownership_msg(uint8_t *buf, uint64_t process_msg, + uint32_t process_len); +uint64_t rv_ntrace_gen_process_encode(uint8_t format, uint8_t newpriv, + uint8_t is_virt, uint64_t context); + =20 #endif diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index dfe04781e2..1d04ab0668 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -179,7 +179,6 @@ static uint64_t trencoder_te_ctrl_set_hardwire_vals(uin= t64_t input) { input =3D FIELD_DP32(input, TR_TE_CONTROL, EMPTY, 1); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_MODE, 0x6); - input =3D FIELD_DP32(input, TR_TE_CONTROL, CONTEXT, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_TRIG_ENABLE, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_OR_OVERFLOW, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_ENA, 0); @@ -550,6 +549,7 @@ void trencoder_send_indirect_branch_hist(TraceEncoder *= trencoder, { g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; + bool send_ownership =3D false; =20 uint32_t icnt =3D rv_ntrace_get_and_reset_icnt(trencoder, curr_pc, cur= r_inst_len); uint64_t uaddr =3D rv_ntrace_encode_uaddr(trencoder, target_pc); @@ -564,6 +564,7 @@ void trencoder_send_indirect_branch_hist(TraceEncoder *= trencoder, msg_size =3D rv_ntrace_gen_indirect_branch_hist_sync_msg(msg, btyp= e, icnt, faddr, hist= ); trencoder->sync_cnt =3D 0; + send_ownership =3D true; } else { msg_size =3D rv_ntrace_gen_indirect_branch_hist_msg(msg, btype, ic= nt, uaddr, hist); @@ -572,6 +573,97 @@ void trencoder_send_indirect_branch_hist(TraceEncoder = *trencoder, trencoder->last_icnt_reset =3D target_pc; =20 trencoder_send_message_smem(trencoder, msg, msg_size); + + if (send_ownership && ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, + CONTEXT)) { + trencoder_send_ownership_msg(trencoder, FORMAT_SYNC_HCONTEXT, + trencoder->cpu->env.priv); + trencoder_send_ownership_msg(trencoder, FORMAT_SYNC_SCONTEXT, + trencoder->cpu->env.priv); + } +} + +static uint64_t rv_ntrace_context_encode(TraceEncoder *trencoder, + uint64_t *context_msg, + NTraceOwnershipFormat format) +{ + RISCVCPU *cpu =3D trencoder->cpu; + CPURISCVState *env =3D &cpu->env; + uint64_t context; + uint32_t len; + + switch (format) { + case FORMAT_PRIV_CHANGE: + break; + case FORMAT_SYNC_SCONTEXT: + /* Specification suggest 16 bits scontext for rv32 and 32 for rv64= */ + context =3D 0; + len =3D 16 * riscv_cpu_mxl(env); + break; + case FORMAT_SYNC_HCONTEXT: + /* Specification suggest 7 bits hcontext for rv32 and 14 for rv64 = */ + context =3D 0; + len =3D 7 * riscv_cpu_mxl(env); + break; + default: + g_assert_not_reached(); + } + + *context_msg =3D context; + + return len; +} + +static uint32_t rv_ntrace_process_encode(TraceEncoder *trencoder, + NTraceOwnershipFormat format, + uint8_t newpriv, uint8_t is_virt, + uint64_t context_msg, + uint32_t context_len, + uint64_t *process_msg) +{ + *process_msg =3D rv_ntrace_gen_process_encode(format, newpriv, is_virt= , context_msg); + + /* According to Ntrace spec fields V + PRV + FORMAT should always be 5= bits length */ + return context_len + 5; +} + +void trencoder_send_ownership_msg(TraceEncoder *trencoder, + NTraceOwnershipFormat format, uint8_t ne= wpriv) +{ + g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint64_t context_msg, process_msg; + uint8_t msg_size; + + g_assert(trencoder->ntrace); + + /* By the Ntrace specification process len is format + priv + virt, wh= ich + * is always 5 bit len plus context field. + */ + uint32_t context_len =3D rv_ntrace_context_encode(trencoder, &context_= msg, + format); + /* V mode is not supported(0) for now */ + uint32_t process_len =3D rv_ntrace_process_encode(trencoder, format, + newpriv, 0, context_ms= g, + context_len, &process_= msg); + + msg_size =3D rv_ntrace_gen_ownership_msg(msg, process_msg, process_len= ); + + trencoder_send_message_smem(trencoder, msg, msg_size); +} + +void trencoder_send_ownership_scontext_msg(Object *trencoder_obj) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + + if (!trencoder_obj) { + return; + } + + if (trencoder->ntrace && + ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, CONTEXT)) { + trencoder_send_ownership_msg(trencoder, FORMAT_SYNC_SCONTEXT, + trencoder->cpu->env.priv); + } } =20 static void trencoder_send_updiscon(TraceEncoder *trencoder, uint64_t pc) @@ -840,7 +932,7 @@ void trencoder_report_branch(Object *trencoder_obj, uin= t64_t pc, } } =20 -void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc) +static void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); =20 @@ -851,6 +943,18 @@ void trencoder_trace_ppccd(Object *trencoder_obj, uint= 64_t pc) trencoder_send_sync_msg(trencoder_obj, pc); } =20 +void trencoder_trace_priv_change(Object *trencoder_obj, uint64_t pc, + uint8_t newpiv) +{ + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + + if (trencoder->ntrace && ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTR= OL, CONTEXT)) { + trencoder_send_ownership_msg(trencoder, FORMAT_PRIV_CHANGE, newpiv= ); + } else if (!trencoder->ntrace) { + trencoder_trace_ppccd(trencoder_obj, pc); + } +} + void trencoder_report_updiscon(Object *trencoder_obj) { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 4cfdb47ecf..34177a64bd 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -77,6 +77,12 @@ typedef enum { TR_TE_INST_SYNC_MODE_INST =3D 3, } TraceSyncMode; =20 +typedef enum { + FORMAT_PRIV_CHANGE =3D 0, + FORMAT_SYNC_SCONTEXT =3D 0b10, + FORMAT_SYNC_HCONTEXT =3D 0b11, +} NTraceOwnershipFormat; + #define TYPE_TRACE_ENCODER "trace-encoder" =20 OBJECT_DECLARE_SIMPLE_TYPE(TraceEncoder, TRACE_ENCODER) @@ -95,10 +101,13 @@ void trencoder_send_indirect_branch_hist(TraceEncoder = *trencoder, void trencoder_trace_trap_insn(Object *trencoder_obj, uint64_t curr_pc, uint64_t target_pc, uint32_t ecause, bool is_interrupt, uint64_t tval); -void trencoder_trace_ppccd(Object *trencoder_obj, uint64_t pc); +void trencoder_trace_priv_change(Object *trencoder_obj, uint64_t pc, + uint8_t newpiv); void trencoder_report_updiscon(Object *trencoder_obj); void trencoder_report_branch(Object *trencoder_obj, uint64_t pc, uint64_t insn_len, uint64_t offset, TraceBranchRes taken); - +void trencoder_send_ownership_msg(TraceEncoder *trencoder, + NTraceOwnershipFormat value, uint8_t new= piv); +void trencoder_send_ownership_scontext_msg(Object *trencoder_obj); #endif diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 9b7df4d4fd..912aa24f54 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1048,7 +1048,7 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ul= ong newpriv, bool virt_en) =20 if (cpu->trencoder && TRACE_ENCODER(cpu->trencoder)->trace_running) { - trencoder_trace_ppccd(cpu->trencoder, env->pc); + trencoder_trace_priv_change(cpu->trencoder, env->pc, newpr= iv); } } =20 --=20 2.43.0 From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789746014; cv=none; d=zohomail.com; s=zohoarc; b=JhPgDla+H3DxmRDs39T9sl9dAD4B26hDbnJXb5IjSJFxj8S6Dmr1jtHwpgFn0HP3Br/J3v1VEGGkT6E+2j4XcNUl0MYGFCOCe7FsIZJqYvNvgtsoizWxVFvgFXNE9bdR6/1ljbbSgQvVHxBzCtEgX3I2D57ewlAj6XSwIkQkTZQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789746014; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xtk6b3LqF8Alhgz5DsecTwmL5JMHV3Z0f7W0hoiRnUs=; b=A921AurLNNzNJdkx64KTyzcAwl0oZjMpDZCEP3+bbsKKdEvvTH+1DHALe9Xo+IrhW8q5roZ93Iy07mao6za2YNkQysgsymvaGjYJNL9W5GP8qD0mn8J4lBXyZLr5JZet+K0vL029ZlBtNhY096fxLknVWq4WN2uU2pdDGXiq/QM= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789746014775201.61463866477186; Fri, 18 Sep 2026 08:40:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7afo-0006UW-8r; Fri, 18 Sep 2026 11:38:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afm-0006U7-QB for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:46 -0400 Received: from mail-lf1-x129.google.com ([2a00:1450:4864:20::129]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afk-0003Ez-W9 for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:46 -0400 Received: by mail-lf1-x129.google.com with SMTP id 2adb3069b0e04-5b8997bc6e6so603945e87.1 for ; Fri, 18 Sep 2026 08:38:44 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b8c274e53bsm554108e87.27.2026.09.18.08.38.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745923; x=1790350723; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xtk6b3LqF8Alhgz5DsecTwmL5JMHV3Z0f7W0hoiRnUs=; b=C+G7XhpaIpT6ENyPid4yMuBk5SA59efGREsKMBPtYW3KTtjSTiau8T0EHFNDBzPNc2 HCK0Nr+h1/ZlCFCfSSrFbyD5tdujSRyXV07/GZ8v2uVHx4Xwes9oMqfCbh8VH1uUHf4L 1bRHHrpxfl0sixD/+NNdGRD5uRneFMuCiesJBEZHkCKdiz3SGo0Egj2urcMNX415reMU +fu5lUJleC/J1iLQkhqCK5MrslN8Z9K4b/EbG+6DkDnI9GQatFGhxqaFjSJkoLIlIbi4 MrstBJ+mZIR7QuJ4OQ3+P+PcsCM7oLt/ckvN5BxIoVgrklh82CmLODnEyGSnP4sq1CUj ER2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745923; x=1790350723; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xtk6b3LqF8Alhgz5DsecTwmL5JMHV3Z0f7W0hoiRnUs=; b=wvTM6YMfrW8BBfUi2xFKt0yFuDfkx/ZmPbk06G4S+Pqf4SgYbVrqWkovI9SbneE4UF dR8IZunFTNDwPSQSW8dBz1I3Twn0BzpD6xe9BUlgEVqdjmFVD9jPcEpCIGhyerZfGD1i qD4CqWP4srA6xTtZdf0uGOjmyod+vR5HSCgLlDv0bAixTczEWFmBKrB+k31SF0cgtIfL TJzfRmlHapo1GfvgZjMhvjV0M3lHP+kczrHtI9xc2C/V0eXwx9N/hXD3M4+FXp1Ba43U V4EkktPOqlFxTXkZx7A4Fy+BO57/YzmgRcyYsrrYOyDbltbZwaxEOBqofmctBAAsF5DA NszA== X-Gm-Message-State: AFuF++mhgFRJNAUiQG20QjL9scUpyFlwGaweUFI753U6kO6ti+Klt0bF 9I6IMqgHeGRu62P3qyakFf98+bsp+4Z2F9nuM+5pfjRZFQkFMIBvXiYQRW37Bj3q X-Gm-Gg: AYBFou3HxSpWOQlTWAm1x3VRiJUieYfga/uVtEUQ+k+fwrNntCBx70U5sNeR0lDBJ6X Y3iJ1ubRjcL7Fz0pQ8Ljw9W9sleWVFMU8PBDpAgoMF5fSmxCy4zijIEYEcS1PcMoSxVsuGrc8SG I6VdpAusJ0XPNN7JwecZuY72PzBwp3P5FCX30Sd4V2kHO2my6lCrjZeqBlxcjpaMENcjDXR2wvS LnUJ+2BWSKkG/7PUR8Q4vSaCxYFOmjIWgCGAeYFIqjQybMvUP5vPloTJPBC09x23bFBDwBsQzrj QaR5yzN1sy15x4co0qPXeGy/OHTS8cgSoAek6UhdnCjNDFSjMT16IV7WuIkpO9pG/3T7YrGducS aI+/Dn4/Jmn1q7vU6P4C+oan1wPsWhNjP45xVFsimias6ahNwsAsMfZr0pzBqdtBT7XosoI1iEU EhlYN019au9lL70XV+LrYCNeD0ZUeXlPhnlv9MjCiExRJj8MyjOX80uYnLTZ1eW3zhgbBFwtZnh C3Mbw4= X-Received: by 2002:a05:6512:138d:b0:5b8:c64a:57d1 with SMTP id 2adb3069b0e04-5b8c64a5bfcmr93981e87.42.1789745923014; Fri, 18 Sep 2026 08:38:43 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:40 +0300 Subject: [PATCH 4/6] hw/riscv/ntrace: emit PPCCD and Ownership on priv change MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-4-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov , Konstantin Semichastnov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5455; i=antikostya2@gmail.com; h=from:subject:message-id; bh=Ql9XhGC59YQRAF2d1m24g1XJo9BhDV997HVghtOXinw=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoNJc0tLJLigSJK8+SDMzBXW68KS+TnV5rZe BPSOSzpD9OJAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dgxXD/93dUR0HjLbhmKyCBjxSQr+bhI/napVqz4Y/4UfeJapckbcd1oeVNGdPBXknetIkp+x7XY CphjQBXattn/SJcTFAUc3oCTzSf90AcGwEfuweGQPmIsg7wm3D04vnOiTbRGEDqNafge3skFB2h qEoemtsDQd59QkX6p5vbz+JClYbRcYwJ1x4MmM/IHPHm5Ly/llr6N26JZqi/L7lXaJxGd7n5i2Z ZjkOP4dePJl7twhKKJeAidEUENzFkHR2de2YGhlL4eaLYGKc84ooHUX8gW4UrjQYYaRx2UTtuo7 xt5ddtYcyhei2SnnRSke7NKz5i4qOKYVRSGGYYQm3lULfkIKvT6Bu7fbLrC8aXBv1Wacc9GkiOj 3Jx5kAWqYtD/czLze/KKs0risNR+lTKAiYj7sTX17g7D2bZBLer5WBgQaRv/sVL1Nhv6c3h6b3c GtrMqq7ySaNTbqk5t+9XZLnmbHWQRXSS/nnrDmaTqCN1xWPtsd7szO8n07GPMnS9zsYC0JIVGY9 PhZpQDyndz5me6J4Zl4h4rVcHuJVg4JQPIZF1qkm1XD3jfQIYQc6AMMkYIgHGL9sKQXulFLmUvf RrY6cCQW75JjUnUyO4PHRy0Wps4R+t3ilW3E0QmHf33JR42h+Q7WkjRxSxK4t7jwOSk4l3lk//b 2Lu1kxggEbsw/Gw== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::129; envelope-from=antikostya2@gmail.com; helo=mail-lf1-x129.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789746016347158500 According to "RISC-V N-Trace (Nexus-based Trace) Specification" 1.0 and "Efficient Trace for RISC-V Version 2.0" we should emit Ownership and ppccd messages, if it's change of privilege mode, on next instruction after mode change Signed-off-by: Alexei Filippov Signed-off-by: Konstantin Semichastnov --- hw/riscv/trace-encoder.c | 13 +++++++++++-- hw/riscv/trace-encoder.h | 2 +- target/riscv/cpu_helper.c | 11 ++--------- target/riscv/op_helper.c | 8 ++++++++ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 1d04ab0668..a2a030bb83 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -943,15 +943,24 @@ static void trencoder_trace_ppccd(Object *trencoder_o= bj, uint64_t pc) trencoder_send_sync_msg(trencoder_obj, pc); } =20 -void trencoder_trace_priv_change(Object *trencoder_obj, uint64_t pc, +void trencoder_trace_priv_change(Object *trencoder_obj, hwaddr curr_pc, uint8_t newpiv) { + if (!trencoder_obj) { + return; + } + TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); + uint8_t prev_priv =3D trencoder->cpu->env.priv; + + if (!trencoder->trace_running || newpiv =3D=3D prev_priv) { + return; + } =20 if (trencoder->ntrace && ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTR= OL, CONTEXT)) { trencoder_send_ownership_msg(trencoder, FORMAT_PRIV_CHANGE, newpiv= ); } else if (!trencoder->ntrace) { - trencoder_trace_ppccd(trencoder_obj, pc); + trencoder_trace_ppccd(trencoder_obj, curr_pc); } } =20 diff --git a/hw/riscv/trace-encoder.h b/hw/riscv/trace-encoder.h index 34177a64bd..9d2f1c162e 100644 --- a/hw/riscv/trace-encoder.h +++ b/hw/riscv/trace-encoder.h @@ -101,7 +101,7 @@ void trencoder_send_indirect_branch_hist(TraceEncoder *= trencoder, void trencoder_trace_trap_insn(Object *trencoder_obj, uint64_t curr_pc, uint64_t target_pc, uint32_t ecause, bool is_interrupt, uint64_t tval); -void trencoder_trace_priv_change(Object *trencoder_obj, uint64_t pc, +void trencoder_trace_priv_change(Object *trencoder_obj, hwaddr curr_pc, uint8_t newpiv); void trencoder_report_updiscon(Object *trencoder_obj); void trencoder_report_branch(Object *trencoder_obj, uint64_t pc, diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 912aa24f54..8aac23b400 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1043,15 +1043,6 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_u= long newpriv, bool virt_en) riscv_itrigger_update_priv(env); } =20 - if (newpriv !=3D env->priv) { - RISCVCPU *cpu =3D RISCV_CPU(cs); - - if (cpu->trencoder && - TRACE_ENCODER(cpu->trencoder)->trace_running) { - trencoder_trace_priv_change(cpu->trencoder, env->pc, newpr= iv); - } - } - riscv_pmu_update_fixed_ctrs(env, newpriv, virt_en); } =20 @@ -2388,6 +2379,7 @@ void riscv_cpu_do_interrupt(CPUState *cs) env->scause, async, env->stval); } =20 + trencoder_trace_priv_change(cpu->trencoder, env->sepc, PRV_S); riscv_cpu_set_mode(env, PRV_S, virt); =20 src =3D env->sepc; @@ -2480,6 +2472,7 @@ void riscv_cpu_do_interrupt(CPUState *cs) env->mcause, async, env->mtval); } =20 + trencoder_trace_priv_change(cpu->trencoder, env->mepc, PRV_M); riscv_cpu_set_mode(env, PRV_M, virt); src =3D env->mepc; } diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index 6ccc127c30..12fb0209f6 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -29,6 +29,8 @@ #include "trace.h" =20 #ifndef CONFIG_USER_ONLY +#include "hw/riscv/trace-encoder.h" + static inline MemOp mo_endian_env(CPURISCVState *env) { /* @@ -289,6 +291,8 @@ target_ulong helper_sret(CPURISCVState *env) target_ulong prev_priv, prev_virt =3D env->virt_enabled; const target_ulong src_priv =3D env->priv; const bool src_virt =3D env->virt_enabled; + CPUState *cs =3D env_cpu(env); + RISCVCPU *cpu =3D RISCV_CPU(cs); =20 if (!(env->priv >=3D PRV_S)) { riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, GETPC()); @@ -349,6 +353,7 @@ target_ulong helper_sret(CPURISCVState *env) } } =20 + trencoder_trace_priv_change(cpu->trencoder, env->pc, prev_priv); riscv_cpu_set_mode(env, prev_priv, prev_virt); =20 /* @@ -410,6 +415,8 @@ target_ulong helper_mret(CPURISCVState *env) uint64_t mstatus =3D env->mstatus; target_ulong prev_priv =3D get_field(mstatus, MSTATUS_MPP); uintptr_t ra =3D GETPC(); + CPUState *cs =3D env_cpu(env); + RISCVCPU *cpu =3D RISCV_CPU(cs); =20 check_ret_from_m_mode(env, retpc, prev_priv, ra); =20 @@ -436,6 +443,7 @@ target_ulong helper_mret(CPURISCVState *env) riscv_cpu_swap_hypervisor_regs(env); } =20 + trencoder_trace_priv_change(cpu->trencoder, env->pc, prev_priv); riscv_cpu_set_mode(env, prev_priv, prev_virt); /* * If forward cfi enabled for new priv, restore elp status --=20 2.43.0 From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789746030; cv=none; d=zohomail.com; s=zohoarc; b=jxb5GaIHb54v8GUNukcYCUK1piDWzdHg6W5amkWl036j5g3myKy7fPc4/uwpwXAqUGbqIJfzGMSHWVtwWPzdAUOZdeIWjc73VgKEnk8NRgRw+ZGdjV7vcYGwgGgsliwHqeAEziV5FOvf+npS1gK82RbBS0/CslUCFmMAkgDY9Bo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789746030; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xMoDu1QpByTuhtR85NT6ecGaH4mvJ93T6FOMbhh47lQ=; b=IdzKRQa45fxbdwStKsXJb+0t44YZ7scN/f7A9xueQBGAQiji671K4laEBtIS1OqDMQOCVVsD28hHUB3ZINTC8kLkHp9x5Hv6lUgsb+f3cVBpoXQXhI0z2h+E+/SxRrkDFv7F/E/mpt1GSoO8dYwXUbCZkfYv9m4JMoPc9UuXmmc= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789746030740664.2076293297774; Fri, 18 Sep 2026 08:40:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7afu-0006VT-RM; Fri, 18 Sep 2026 11:38:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afs-0006V8-JX for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:52 -0400 Received: from mail-lf2-x10.google.com ([2a00:1450:4864:36::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afr-0003Fi-5u for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:52 -0400 Received: by mail-lf2-x10.google.com with SMTP id 2adb3069b0e04-5b5e4f1e428so313000e87.1 for ; Fri, 18 Sep 2026 08:38:50 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b8c2764436sm557642e87.58.2026.09.18.08.38.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745930; x=1790350730; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xMoDu1QpByTuhtR85NT6ecGaH4mvJ93T6FOMbhh47lQ=; b=NjUlBbEly2qT7u4E/LhRxGEtUIAuaxmcKEuHLe4wdR2JBdQw1c/D2OZM761GfEOwGB 9EhjlTuzzr+Oi4FYOW+ggzCbkpwClsDp2bzo/ciYqYGkUhgv2XaOSW42/YB2ncpid9vG DlLUVyEMAbonKZ5GNoLFs88ZvR1CZCxytgvj+eb1M/4ZstZxbCRevEMZcOeNNQxgJvXL 3rnCqfVDF1b1+Nd0fmTFJ3A5fBBMPtFZfOBZW6oGJ4u1aNOJNSHXFLP1YKVEt/FGvtfK rNjx1MAbLGnLz4kPLAb2xPC0Ai9EG5XOgv72wqltvAG5XtD9WIZiDDc3Mh0bhXTPS5Pu 9X9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745930; x=1790350730; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xMoDu1QpByTuhtR85NT6ecGaH4mvJ93T6FOMbhh47lQ=; b=25TKosNGSafdl1Vq7w+WEqaaVtJSMVT6yLGphXKUgeeY3GBh0ARbe8LvRKUadAfO/2 03pxNwjd3iQOMiQV788H32ZQ86GrIN4Nlk3wBrOWbf3YOAzl2C2xxItYLF2dYDfHNoDJ 29oV5o3dyGZQWW2X2HrQkcPZUKpcr9SMBd7KLj0mKSrju1pGTgJbC2tbSlWG1AvduYwb bcQ2sD6JvZEGc3v+aAIi3jWEWnqMmDZnbUdXr3ZhJhkv/DrzTEkzuuYkcI/rqL1WIFeL jMVvZzDDSHZoP+Zp3L3QkQCeqFJHOaUevKybfhUOy4ImnKRcB7qCeZKZvqvNmDBVW18q XVQg== X-Gm-Message-State: AFuF++lvcXuZp9b0xxx6Q66dPHiaZFbJWFbwYwby75VXxm3CGACm5mj4 nvRvdzEYnvkoH4u0zs9PAx2Bill0WTZLgnxtrwgRlrMIq44HAa5fp2Y0q9MpC62O X-Gm-Gg: AYBFou25mQIKG7r4YOhxaRcB2/9i3xvLp0+B62o0rEg2BzvB2Ns/ZW6I6Bmwgbn+yZ7 4eM23ueKWKKtAiu1JTULRuv0S1oQlol8VsQp1iy6bg6Rj1LX0i3VbPfr/sP7ojdm/tQ4BwKrltr 3XKGUtMBiY9/yV0olz+zzW5zQxyBpCsHz9T+xqw4VCNbXv6VaSzaEiDTJrMwgh8n5bLw6fAge24 +zlFZnkNC3NBAjqOBDrZC3MKoqlEoZZ1hSaDlfRK05cjsZ7LOd/GQtEE6+5m2UyX8KLmO4SSd4K EGyGjk2oDqXcQUhfZoZlevKk5Y3r6rq/MBv1ivxTVz5Ii/fgQoml3gfhsi2LzUGwn64IoSQmamd 9XoZIxzHuBrTPcgLeQovq2VqY37EvspoYV03da2dySjU/FrwCQEuFB8H890Ot0NcBcDu4ySm2sf b4jn+cN2+EeXpF6mQvY2j6kq3aDSq/n+Eq85CZxoGPBG2x7y7C+DYbsn5LHHAOSfp/w4UM X-Received: by 2002:ac2:4c55:0:b0:5b7:5cbb:661a with SMTP id 2adb3069b0e04-5b8c13bf8aemr999985e87.0.1789745929438; Fri, 18 Sep 2026 08:38:49 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:41 +0300 Subject: [PATCH 5/6] hw/riscv/trace-encoder: emit Ownership after ProgTraceSync MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-5-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1116; i=antikostya2@gmail.com; h=from:subject:message-id; bh=5JAFVF/giib3mLt4b9gt4wJtuYMMVV92C3OMq/vyy3Y=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoN2SxrrR81DB1JB04q0+gAxuoEaom7S9eMn WFcvgmJncOJAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dsV3D/oCnp96819FhtWSaXX5rei7idGuR53pyslT7FhdSpC9v9tZazeZhiBk3lnL3Xer8FYDFbJ 0EutWFxjEAMicEjpl2dPaGJTJD05A456RihQ4cY4WtaZdfbFqTh0idIkDd2kxT1spmt4c/vhVAZ YJh83WunjECzkLCKaYrgos96fCQsQJrA2adr8A1EkOd4R76rFjHFoxKrU+3FF/ugBHrA4Hutozv Eiu+bZPg8YYPrIQCHjCqAGLh68gTXHKfS/S5FYqSgM0O8TqCbxiuB7r0BPWYE8QWod0h3FEAFuK qjWOzbLDK+Q1IV9rzdjwqqmKbJH+i3d3kA7w1ddjOdxS2ChnBOrL+fOei1Dnk12C2ovG+yvbFBr 4664iNidJlyOV3bvhoc+BEEh+BgSiL90pwNHttlYeMSRlS/D0S05DKy/HjCuKHlVsS32ovkTE/H Zw0TfqIfPgUYle5+CKSx0ymfvScZkvFba01qMs9JmGCwgGwgHLpwKk2zbLCdt9YVtGuCQ4irqez Swr/FPhPQG9+f4rg6pLZc8s6vbO64dNmhtx4OkvHI7ecaRFiPYhBj2aCbqr6X69DNx4mz5I3l43 oHRExr9m4bYgubJQ1svJyb0rE1PRepqQNcbhsqB6eiPlvkJkQSytPsi6UR2dlPOFaTXyue9jrqo 4Sqb9kbhp3DNokg== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:36::10; envelope-from=antikostya2@gmail.com; helo=mail-lf2-x10.google.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FORGED_GMAIL_RCVD=1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789746032082158500 According to RISC-V N-Trace specification Ownership messages should immediately follow ProgTraceSync messsages. Signed-off-by: Arseniy Semenov --- hw/riscv/trace-encoder.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index a2a030bb83..7d8b5d4fae 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -737,6 +737,13 @@ void trencoder_send_prog_trace_sync(Object *trencoder_= obj, uint64_t pc) msg_size =3D rv_ntrace_gen_encoded_prog_trace_sync_msg(msg, faddr); =20 trencoder_send_message_smem(trencoder, msg, msg_size); + + if (ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONTROL, CONTEXT)) { + trencoder_send_ownership_msg(trencoder, FORMAT_SYNC_HCONTEXT, + trencoder->cpu->env.priv); + trencoder_send_ownership_msg(trencoder, FORMAT_SYNC_SCONTEXT, + trencoder->cpu->env.priv); + } } =20 static uint64_t rv_ntrace_encode_uaddr(TraceEncoder *trencoder, uint64_t t= arget_pc) --=20 2.43.0 From nobody Sat Sep 26 20:01:44 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=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1789746024; cv=none; d=zohomail.com; s=zohoarc; b=CqIMoKrDSOiEv4sbyzrviCKQ0VnxWzGaosFaiPbFspaSxvCvKjd84bmdcQX+j6WnmXcqeIpUBuL0yuOh0d7rkTyYO1b9IrWkigdjhNCPmctSGIEBZhGhcMiyioqPyfxdmM8BxRwJUMZlTirWe4pc0JcAxj0IIYSU+yxcF2Qkafs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789746024; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Jwuu7aER9TfTIp7E9BxZvmKdyfieH7jGY+kASlRLGsU=; b=G0q1Vf/rFed/DcHRnX4LRSDwOO+AtkQZMmTZhkv6nvm60ktUJ2OnGRnAzJOAidFQDsGe2m9yfJj52GtMljI6y6ghYuKal13m+O/trQMtnCXG615aoG0ZuWlfN4JFjqxXEAnwNybGgsDSmxZtU4y8q3fkdcffSEB/r7N2mMxD7dI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1789746024356378.5963150552227; Fri, 18 Sep 2026 08:40:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x7ag6-0006bx-SJ; Fri, 18 Sep 2026 11:39:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1x7afz-0006Xn-Uw for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:39:00 -0400 Received: from mail-lf2-x10.google.com ([2a00:1450:4864:36::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x7afx-0003Gg-C3 for qemu-devel@nongnu.org; Fri, 18 Sep 2026 11:38:59 -0400 Received: by mail-lf2-x10.google.com with SMTP id 2adb3069b0e04-5b5e4f15b78so836106e87.2 for ; Fri, 18 Sep 2026 08:38:57 -0700 (PDT) Received: from localhost ([213.79.119.14]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b8c2753b20sm571984e87.33.2026.09.18.08.38.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 08:38:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789745936; x=1790350736; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Jwuu7aER9TfTIp7E9BxZvmKdyfieH7jGY+kASlRLGsU=; b=b/KrQMMdupOWA+cZeWj6N1fylsnx614reLfWy9n3YDs6tmUIK/O2lrwLXnaH4mC71H s1UlqaEL0/8wJTEmUotL4K3jlr3OYscI2k/7w66QRkO7Rt9RUpNDWC4y4hv7ipirW5rL uH2wuxQySHmeiu4UfIdxaB7WNrYKpeFvJ2NUXTTTNS+nNYS5a28OJuSnX/nfbXQt3V/E hJyMPQfuG31O41es/czXdOQt9TZWmTaqCMsZllICTosv540Zc5+VKZCSVxEvneNl7sBD zJtQe8mfdY0l3Zo6Kb8u2zaVI3vyDBdQaH4KyP4xVnm7z4469j6ct0X28YtAMoN47QMr lqpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745936; x=1790350736; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Jwuu7aER9TfTIp7E9BxZvmKdyfieH7jGY+kASlRLGsU=; b=EtwPyTVaF2+p737dbNOWPauiCx9iMV4LvuXfCdmCYWIO4AvRo766QpDERihbX6CFwp Z6asXzlQE9HjsoVQox/ZzSQw/aUGJ3d/e+q/QhUHTZR7lOtD5XyL4inikiniXyC7VgN9 hK1g3HF4pBmRtAY26AfFwWwI18eis4xYLIZlsO0Ar4ACRmvulYnge4OVmYRewxZy2V2J vTQrcX76uT2fi4OydS1+JzbU5D+sfaJ+aCA+DhMPrpMNSPHW52HT/Kcagr1SrzBRE0Ds xRxsXisLRY18kgF7GBg/CG/pMXvoyyVOSxlHScUOLb0/Qq6I3AKOJ07Pp1jVaoodSmep XzQA== X-Gm-Message-State: AFuF++nh4Ap7oC58q8+u3SgFp0WG3fUUfTQqr+70hgcpQ4nbizcRB3bV K35KO1qQRKa3rvDTTCAwVrxkxctQllFVAqtV+Ep9jeA8tagCEdRgEVr6HIKAPloz X-Gm-Gg: AYBFou0HNqOtgXixPru6kp/6xC+ANuzpUFidscZC3Fu8X4b9YGhddiU+0RoGn0KfpyB gkfwsKqY8lS8gKXz4BC8/In/3QHcdTwkjv51YE3ItTJywFJ9Q/KeEOm36SJ2QcSluJEGlE6gRIu yo43gLwMpEya4b3sRkeD62BBA9LNTraiudBJkP0b0X7pEIk3DHSvyPOk0AmjYwtZ6kQllbVk9VP Us82uULIpHly3tWE4Voz8kWJnJI71ZtqyyXh/yptkhUwbRRc4oMv+HhcWMu1lFs49UD9C3pWJ+e SHt5dT2OJQaUyfxqBvHPOyGoNN51QFSTXRFkLaMs5HVmIQQ+Cl5aHDl4xMFBM4vGS6w3p8n251K 9EgCta9lxmhq6QI/K8UzQtBxOp5gTptgT+GjRbBcoCT8h94sC+9ByxHVj788KNmmdqJUNNujlbl Do3Xw6PdI8cRhIUaxsVdG3Iko3F1RPm0AcYpneXcJb3gIA/pkpzjwYesWikqXKQwNkyEOosw== X-Received: by 2002:a05:6512:39c1:b0:5b0:1e16:e60c with SMTP id 2adb3069b0e04-5b8c180b536mr1070660e87.25.1789745935555; Fri, 18 Sep 2026 08:38:55 -0700 (PDT) From: Konstantin Semichastnov Date: Fri, 18 Sep 2026 18:34:42 +0300 Subject: [PATCH 6/6] hw/riscv/trace-encoder.c: implementated SRC field MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260918-upstream-ntrace_msg-v1-6-16a56ad8e0ef@gmail.com> References: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> In-Reply-To: <20260918-upstream-ntrace_msg-v1-0-16a56ad8e0ef@gmail.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , qemu-riscv@nongnu.org, Alexei Filippov , Arseniy Semenov , Konstantin Semichastnov X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=19037; i=antikostya2@gmail.com; h=from:subject:message-id; bh=gzM9vrAuBzAc7bhHHZaDet26/wtU7ADA3trdZ6HVnlo=; b=owEBbQKS/ZANAwAKAUiKpW6lUN52AcsmYgBqrVoNeoCQbG++sX+gPTmx5+uNkEfPSWfoDK7tH wkd0e7uAn6JAjMEAAEKAB0WIQRMBWLx2o+linEPEBhIiqVupVDedgUCaq1aDQAKCRBIiqVupVDe dlCGD/9csEX6jIhMkH9lFaTGSRg6/eKWL3/JZgcDgADSCv5e9+NfnpTVxHSrUI+MMq3wYNSKZFT hHa9eJQfBj4ttLjPpieIIOwaKarKJjq6DVWPbA5Ucl80WXWJS+H0f6kND0SRj9p0PwGoMktWCUs 4egppAfjzDx8azs8VPYuZDI5x3qa14WIqLW4Yy8GIxcyiSKD7wOrt1YwTEDNX1w81x1vNSiyQR5 cbfhblqRjvmosUm/kBLN724SLW3rMzqzujdBQNOQCH3zsb91IoU/+d71P8sTvkdMBBCtoUWALkG GCK5v4MpcWtToHSy6vtWlYqwfX0DNWRQn4a26zlbORpDCIZm5pI8PtrS9UxKalkeUXTx4Rs1Vy0 scYPTdeDVwEQm16W6tqyZCW55oVwNppvRremk3TRFc2I6SaVKTdHRGb8WE00HdhKOIrLpgBPbc8 WxxeoN3zLxChXDF9TrbDvPSEn7lB4xXTKlQyGX5qWgck76NvTUxfG72NS+/Q6+H16c8RAEcQ/WL WhDgXSig+MZPGqeq3ljKkIcrzuh/2k9WS6DlA0WdwoPojTgW9SMeVGKMczMU+cW2wgb6Xo++VGr aRcQIbk5iRqBgSxk5L72PEOG6ZeGQacYntd9mUrMEqG+aNGHe6EfqHnJSOGsCclmX/gE9cy8IYN zCwL9/reK0RsrZA== X-Developer-Key: i=antikostya2@gmail.com; a=openpgp; fpr=4C0562F1DA8FA58A710F1018488AA56EA550DE76 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:36::10; envelope-from=antikostya2@gmail.com; helo=mail-lf2-x10.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1789746026377158500 Signed-off-by: Alexei Filippov Signed-off-by: Konstantin Semichastnov --- hw/riscv/rv-trace-messages.c | 46 +++++++++++++++------- hw/riscv/rv-trace-messages.h | 19 ++++++--- hw/riscv/trace-encoder.c | 94 +++++++++++++++++++++++++++++++++++++++-= ---- 3 files changed, 130 insertions(+), 29 deletions(-) diff --git a/hw/riscv/rv-trace-messages.c b/hw/riscv/rv-trace-messages.c index f3647e89dd..354f33ff27 100644 --- a/hw/riscv/rv-trace-messages.c +++ b/hw/riscv/rv-trace-messages.c @@ -350,6 +350,7 @@ typedef enum { FIELD_END =3D 0, FIELD_FIXED, FIELD_VAR, + FIELD_CFG, } NTraceFieldType; =20 typedef enum { @@ -498,6 +499,13 @@ uint64_t rv_ntrace_gen_process_encode(uint8_t format, = uint8_t newpriv, .value =3D (process_msg), \ } =20 +#define PAYLOAD_SRC(val, wdth) \ + { \ + .type =3D FIELD_CFG, \ + .width =3D (wdth), \ + .value =3D (val), \ + } + #define PAYLOAD_END() \ { \ .type =3D FIELD_END, \ @@ -521,6 +529,10 @@ static size_t rv_ntrace_gen_encoded_msg(uint8_t *buf, */ =20 while (payload->type !=3D FIELD_END) { + if (!payload->width) { + payload++; + } + for (uint8_t offset =3D 0; offset < payload->width; offset +=3D nr= _move) { nr_move =3D MIN(MDO_BITS_NUM - packed_bit, payload->width - of= fset); uint8_t chunk =3D extract64(payload->value, offset, nr_move); @@ -575,11 +587,12 @@ static size_t rv_ntrace_gen_encoded_msg(uint8_t *buf, return buf_byte; } =20 -size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t fa= ddr) +size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t fa= ddr, + uint32_t src, uint32_t sr= c_width) { const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_PROG_TRACE_SYNC), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_SYNC(SYNC_TRACE_ENABLED), PAYLOAD_ICNT(0), PAYLOAD_FADDR(faddr), @@ -593,11 +606,13 @@ size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint= 8_t *buf, uint64_t faddr) size_t rv_ntrace_gen_encoded_prog_trace_correlation_msg(uint8_t *buf, uint32_t evcode, uint32_t icnt, - uint32_t hist) + uint32_t hist, + uint32_t src, + uint32_t src_width) { const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_PROG_TRACE_CORRELATION), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_EVCODE(evcode), PAYLOAD_CDF(CDF_ICNT_AND_HIST_PRESENT), PAYLOAD_ICNT(icnt), @@ -609,11 +624,12 @@ size_t rv_ntrace_gen_encoded_prog_trace_correlation_m= sg(uint8_t *buf, return rv_ntrace_gen_encoded_msg(buf, msg_fields); } =20 -size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist) +size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist, + uint32_t src, uint32_t src_= width) { const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_RESOURCE_FULL), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_RCODE(RCODE_HIST_PRESENT), /* I-CNT overflow is not supported for now */ PAYLOAD_HIST(hist), @@ -626,11 +642,12 @@ size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_= t *buf, uint32_t hist) =20 size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(uint8_t *buf, uint8_t b= type, uint32_t icnt, uint64_t= faddr, - uint32_t hist) + uint32_t hist, uint32_t= src, + uint32_t src_width) { - const NTraceFieldPayload msg_fields[] =3D { + const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_INDIRECT_BRANCH_HIST_SYNC), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_SYNC(SYNC_PERIODIC), PAYLOAD_BTYPE(btype), PAYLOAD_ICNT(icnt), @@ -645,11 +662,12 @@ size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(ui= nt8_t *buf, uint8_t btype, =20 size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype, uint32_t icnt, uint64_t uadd= r, - uint32_t hist) + uint32_t hist, uint32_t src, + uint32_t src_width) { const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_INDIRECT_BRANCH_HIST), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_BTYPE(btype), PAYLOAD_ICNT(icnt), PAYLOAD_UADDR(uaddr >> 1), @@ -662,12 +680,12 @@ size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t= *buf, uint8_t btype, } =20 size_t rv_ntrace_gen_ownership_msg(uint8_t *buf, uint64_t process_msg, - uint32_t process_len) + uint32_t process_len, uint32_t src, + uint32_t src_width) { - const NTraceFieldPayload msg_fields[] =3D { PAYLOAD_TCODE(TCODE_OWNERSHIP), - /* SRC field is not supported for now */ + PAYLOAD_SRC(src, src_width), PAYLOAD_PROCESS(process_msg, process_len), /* TSTAMP field is not supported for now */ PAYLOAD_END(), diff --git a/hw/riscv/rv-trace-messages.h b/hw/riscv/rv-trace-messages.h index 5b75dc0a7d..af6184f498 100644 --- a/hw/riscv/rv-trace-messages.h +++ b/hw/riscv/rv-trace-messages.h @@ -37,20 +37,27 @@ size_t rv_etrace_gen_encoded_format1(uint8_t *buf, uint64_t addr, bool notify, bool updiscon); =20 -size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t fa= ddr); +size_t rv_ntrace_gen_encoded_prog_trace_sync_msg(uint8_t *buf, uint64_t fa= ddr, + uint32_t src, uint32_t sr= c_width); size_t rv_ntrace_gen_encoded_prog_trace_correlation_msg(uint8_t *buf, uint32_t evcode, uint32_t icnt, - uint32_t hist); -size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist= ); + uint32_t hist, + uint32_t src, + uint32_t src_width= ); +size_t rv_ntrace_gen_encoded_resource_full_msg(uint8_t *buf, uint32_t hist, + uint32_t src, uint32_t src_= width); size_t rv_ntrace_gen_indirect_branch_hist_sync_msg(uint8_t *buf, uint8_t b= type, uint32_t icnt, uint64_t= faddr, - uint32_t hist); + uint32_t hist, uint32_t= src, + uint32_t src_width); size_t rv_ntrace_gen_indirect_branch_hist_msg(uint8_t *buf, uint8_t btype, uint32_t icnt, uint64_t uadd= r, - uint32_t hist); + uint32_t hist, uint32_t src, + uint32_t src_width); size_t rv_ntrace_gen_ownership_msg(uint8_t *buf, uint64_t process_msg, - uint32_t process_len); + uint32_t process_len, uint32_t src, + uint32_t src_width); uint64_t rv_ntrace_gen_process_encode(uint8_t format, uint8_t newpriv, uint8_t is_virt, uint64_t context); =20 diff --git a/hw/riscv/trace-encoder.c b/hw/riscv/trace-encoder.c index 7d8b5d4fae..d83bc95f35 100644 --- a/hw/riscv/trace-encoder.c +++ b/hw/riscv/trace-encoder.c @@ -41,6 +41,8 @@ static uint32_t rv_ntrace_get_and_reset_icnt(TraceEncoder= *trencoder, uint64_t pc, uint32_t inst_le= n); static void rv_ntrace_update_sync_msg_cnt(TraceEncoder *trencoder); static void rv_ntrace_update_sync_icnt(TraceEncoder *trencoder, uint64_t i= cnt); +static uint32_t rv_ntrace_get_source_transmission_msg(TraceEncoder *trenco= der, + uint32_t *src); =20 static TracePrivLevel trencoder_get_curr_priv_level(TraceEncoder *te) { @@ -94,7 +96,8 @@ REG32(TR_TE_CONTROL, 0x0) R_TR_TE_CONTROL_RSVP5_MASK) =20 /* trTeControlEmpty is the only RO field and reset value */ -#define R_TR_TE_CONTROL_RESET R_TR_TE_CONTROL_EMPTY_MASK +#define R_TR_TE_CONTROL_RESET (R_TR_TE_CONTROL_EMPTY_MASK | \ + R_TR_TE_CONTROL_INHIBIT_SRC_MASK) #define R_TR_TE_CONTROL_RO_BITS R_TR_TE_CONTROL_EMPTY_MASK =20 #define TR_TE_CONTROL_FORMAT_ETRACE 0 @@ -127,6 +130,22 @@ REG32(TR_TE_IMPL, 0x4) =20 REG32(TR_TE_INST_FEATURES, 0x8) FIELD(TR_TE_INST_FEATURES, NO_ADDR_DIFF, 0, 1) + FIELD(TR_TE_INST_FEATURES, NO_TRAP_ADDR, 1, 1) + FIELD(TR_TE_INST_FEATURES, EN_SEQUENTIAL_JUMP, 2, 1) + FIELD(TR_TE_INST_FEATURES, EN_IMPLICIT_RETURN, 3, 1) + FIELD(TR_TE_INST_FEATURES, EN_BRANCH_PREDICTION, 4, 1) + FIELD(TR_TE_INST_FEATURES, EN_JUMP_TARGET_CACHE, 5, 1) + FIELD(TR_TE_INST_FEATURES, IMPLICIT_RETURN_MODE, 6, 2) + FIELD(TR_TE_INST_FEATURES, EN_REPEATED_HISTORY, 8, 1) + FIELD(TR_TE_INST_FEATURES, EN_ALL_JUMPS, 9, 1) + FIELD(TR_TE_INST_FEATURES, EXTEND_ADDR_MSB, 10, 1) + FIELD(TR_TE_INST_FEATURES, SRC_ID, 16, 12) + FIELD(TR_TE_INST_FEATURES, SRC_BITS, 28, 4) + /* reserved bits */ + FIELD(TR_TE_INST_FEATURES, RSVP1, 11, 5) + +#define R_TR_TE_INST_FEATURES_RSVP_BITS (MAKE_64BIT_MASK(32, 32) | \ + R_TR_TE_INST_FEATURES_RSVP1_MASK) =20 static uint32_t trencoder_read_reg(TraceEncoder *te, uint32_t reg_addr) { @@ -182,7 +201,6 @@ static uint64_t trencoder_te_ctrl_set_hardwire_vals(uin= t64_t input) input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_TRIG_ENABLE, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_OR_OVERFLOW, 0); input =3D FIELD_DP32(input, TR_TE_CONTROL, INST_STALL_ENA, 0); - input =3D FIELD_DP32(input, TR_TE_CONTROL, INHIBIT_SRC, 1); =20 return input; } @@ -266,6 +284,32 @@ static uint64_t trencoder_te_ctrl_prew(RegisterInfo *r= eg, uint64_t val) return val; } =20 +static uint64_t trencoder_te_inst_feature_set_hardwire_vals(uint64_t input) +{ + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, NO_ADDR_DIFF, 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, NO_TRAP_ADDR, 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_SEQUENTIAL_JUMP, 0= ); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_IMPLICIT_RETURN, 0= ); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_BRANCH_PREDICTION,= 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_JUMP_TARGET_CACHE,= 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, IMPLICIT_RETURN_MODE,= 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_REPEATED_HISTORY, = 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EN_ALL_JUMPS, 0); + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, EXTEND_ADDR_MSB, 0); + + /* set SRC field to the max value for now */ + input =3D FIELD_DP32(input, TR_TE_INST_FEATURES, SRC_BITS, 12); + + return input; +} + +static uint64_t trencoder_te_inst_feature_prew(RegisterInfo *reg, uint64_t= val) +{ + val =3D trencoder_te_inst_feature_set_hardwire_vals(val); + + return val; +} + static uint32_t get_inst_len_at(uint64_t pc) { bfd_byte packet[2]; @@ -348,8 +392,9 @@ static RegisterAccessInfo trencoder_regs_info[] =3D { .ro =3D R_TR_TE_IMPL_RO_BITS, }, { .name =3D "TR_TE_INST_FEATURES", .addr =3D A_TR_TE_INST_FEATURES, + .rsvd =3D R_TR_TE_INST_FEATURES_RSVP_BITS, .reset =3D R_TR_TE_INST_FEATURES_NO_ADDR_DIFF_MASK, - .ro =3D ~0, + .pre_write =3D trencoder_te_inst_feature_prew, }, }; =20 @@ -550,7 +595,9 @@ void trencoder_send_indirect_branch_hist(TraceEncoder *= trencoder, g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; bool send_ownership =3D false; + uint32_t src_msg; =20 + uint32_t src_width =3D rv_ntrace_get_source_transmission_msg(trencoder= , &src_msg); uint32_t icnt =3D rv_ntrace_get_and_reset_icnt(trencoder, curr_pc, cur= r_inst_len); uint64_t uaddr =3D rv_ntrace_encode_uaddr(trencoder, target_pc); uint64_t faddr =3D rv_ntrace_encode_faddr(target_pc); @@ -562,12 +609,13 @@ void trencoder_send_indirect_branch_hist(TraceEncoder= *trencoder, =20 if (sync && trencoder->sync_cnt >=3D sync_max) { msg_size =3D rv_ntrace_gen_indirect_branch_hist_sync_msg(msg, btyp= e, icnt, - faddr, hist= ); + faddr, hist= , src_msg, + src_width); trencoder->sync_cnt =3D 0; send_ownership =3D true; } else { msg_size =3D rv_ntrace_gen_indirect_branch_hist_msg(msg, btype, ic= nt, uaddr, - hist); + hist, src_msg, s= rc_width); } trencoder->last_addr_reported =3D target_pc; trencoder->last_icnt_reset =3D target_pc; @@ -583,6 +631,22 @@ void trencoder_send_indirect_branch_hist(TraceEncoder = *trencoder, } } =20 +static uint32_t rv_ntrace_get_source_transmission_msg(TraceEncoder *trenco= der, + uint32_t *src) +{ + + uint32_t src_disabled =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_CONT= ROL, INHIBIT_SRC); + uint32_t src_width =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_INST_FE= ATURES, SRC_BITS); + + if (src_disabled || src_width =3D=3D 0) { + *src =3D 0; + return 0; + } + + *src =3D ARRAY_FIELD_EX32(trencoder->regs, TR_TE_INST_FEATURES, SRC_ID= ); + return src_width; +} + static uint64_t rv_ntrace_context_encode(TraceEncoder *trencoder, uint64_t *context_msg, NTraceOwnershipFormat format) @@ -633,9 +697,11 @@ void trencoder_send_ownership_msg(TraceEncoder *trenco= der, g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint64_t context_msg, process_msg; uint8_t msg_size; + uint32_t src_msg; =20 g_assert(trencoder->ntrace); =20 + uint32_t src_width =3D rv_ntrace_get_source_transmission_msg(trencoder= , &src_msg); /* By the Ntrace specification process len is format + priv + virt, wh= ich * is always 5 bit len plus context field. */ @@ -646,7 +712,8 @@ void trencoder_send_ownership_msg(TraceEncoder *trencod= er, newpriv, 0, context_ms= g, context_len, &process_= msg); =20 - msg_size =3D rv_ntrace_gen_ownership_msg(msg, process_msg, process_len= ); + msg_size =3D rv_ntrace_gen_ownership_msg(msg, process_msg, process_len, + src_msg, src_width); =20 trencoder_send_message_smem(trencoder, msg, msg_size); } @@ -728,13 +795,16 @@ void trencoder_send_prog_trace_sync(Object *trencoder= _obj, uint64_t pc) TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; + uint32_t src_msg; =20 uint64_t faddr =3D rv_ntrace_encode_faddr(pc); =20 g_assert(trencoder->ntrace); =20 + uint32_t src_width =3D rv_ntrace_get_source_transmission_msg(trencoder= , &src_msg); + trencoder->last_addr_reported =3D pc; - msg_size =3D rv_ntrace_gen_encoded_prog_trace_sync_msg(msg, faddr); + msg_size =3D rv_ntrace_gen_encoded_prog_trace_sync_msg(msg, faddr, src= _msg, src_width); =20 trencoder_send_message_smem(trencoder, msg, msg_size); =20 @@ -843,6 +913,8 @@ void trencoder_send_prog_trace_correlation(Object *tren= coder_obj, uint64_t pc, { TraceEncoder *trencoder =3D TRACE_ENCODER(trencoder_obj); g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); + uint32_t src_msg; + uint32_t src_width =3D rv_ntrace_get_source_transmission_msg(trencoder= , &src_msg); uint32_t icnt =3D rv_ntrace_get_and_reset_icnt(trencoder, pc, inst_len= ); uint32_t hist =3D rv_ntrace_encode_and_reset_branch_map(trencoder); uint8_t msg_size; @@ -850,7 +922,8 @@ void trencoder_send_prog_trace_correlation(Object *tren= coder_obj, uint64_t pc, g_assert(trencoder->ntrace); =20 msg_size =3D rv_ntrace_gen_encoded_prog_trace_correlation_msg(msg, evc= ode, - icnt, hist= ); + icnt, hist, + src_msg, s= rc_width); =20 trencoder_send_message_smem(trencoder, msg, msg_size); } @@ -889,11 +962,14 @@ static void trencoder_send_branch_map(Object *trencod= er_obj) TraceEncoder *te =3D TRACE_ENCODER(trencoder_obj); g_autofree uint8_t *msg =3D g_malloc0(TRACE_MSG_MAX_SIZE); uint8_t msg_size; + uint32_t src_msg; =20 if (te->ntrace) { + uint32_t src_width =3D rv_ntrace_get_source_transmission_msg(te, &= src_msg); uint32_t hist =3D rv_ntrace_encode_and_reset_branch_map(te); =20 - msg_size =3D rv_ntrace_gen_encoded_resource_full_msg(msg, hist); + msg_size =3D rv_ntrace_gen_encoded_resource_full_msg(msg, hist, sr= c_msg, + src_width); } else { msg_size =3D rv_etrace_gen_encoded_format1_noaddr(msg, te->branches, --=20 2.43.0